Clean up CCodec_JpegDecoder.
- Give member variables "m_" prefixes.
- Put the pitch calculation code in its own method.
- Fix nits.
Change-Id: I6a37a23cedc7df0badbd5c15eca73aac0745d5cb
Reviewed-on: https://pdfium-review.googlesource.com/c/pdfium/+/55570
Commit-Queue: Lei Zhang <thestig@chromium.org>
Reviewed-by: Tom Sepez <tsepez@chromium.org>
diff --git a/core/fxcodec/codec/ccodec_jpegmodule.cpp b/core/fxcodec/codec/ccodec_jpegmodule.cpp
index 4d5838b..495676d 100644
--- a/core/fxcodec/codec/ccodec_jpegmodule.cpp
+++ b/core/fxcodec/codec/ccodec_jpegmodule.cpp
@@ -178,9 +178,9 @@
bool InitDecode();
jmp_buf m_JmpBuf;
- jpeg_decompress_struct cinfo;
- jpeg_error_mgr jerr;
- jpeg_source_mgr src;
+ jpeg_decompress_struct m_Cinfo;
+ jpeg_error_mgr m_Jerr;
+ jpeg_source_mgr m_Src;
pdfium::span<const uint8_t> m_SrcSpan;
std::unique_ptr<uint8_t, FxFreeDeleter> m_pScanlineBuf;
bool m_bInited = false;
@@ -188,53 +188,55 @@
bool m_bJpegTransform = false;
private:
+ void CalcPitch();
+
uint32_t m_nDefaultScaleDenom = 1;
};
CCodec_JpegDecoder::CCodec_JpegDecoder() {
- memset(&cinfo, 0, sizeof(cinfo));
- memset(&jerr, 0, sizeof(jerr));
- memset(&src, 0, sizeof(src));
+ memset(&m_Cinfo, 0, sizeof(m_Cinfo));
+ memset(&m_Jerr, 0, sizeof(m_Jerr));
+ memset(&m_Src, 0, sizeof(m_Src));
}
CCodec_JpegDecoder::~CCodec_JpegDecoder() {
if (m_bInited)
- jpeg_destroy_decompress(&cinfo);
+ jpeg_destroy_decompress(&m_Cinfo);
}
bool CCodec_JpegDecoder::InitDecode() {
- cinfo.err = &jerr;
- cinfo.client_data = &m_JmpBuf;
+ m_Cinfo.err = &m_Jerr;
+ m_Cinfo.client_data = &m_JmpBuf;
if (setjmp(m_JmpBuf) == -1)
return false;
- jpeg_create_decompress(&cinfo);
+ jpeg_create_decompress(&m_Cinfo);
m_bInited = true;
- cinfo.src = &src;
- src.bytes_in_buffer = m_SrcSpan.size();
- src.next_input_byte = m_SrcSpan.data();
+ m_Cinfo.src = &m_Src;
+ m_Src.bytes_in_buffer = m_SrcSpan.size();
+ m_Src.next_input_byte = m_SrcSpan.data();
if (setjmp(m_JmpBuf) == -1) {
- jpeg_destroy_decompress(&cinfo);
+ jpeg_destroy_decompress(&m_Cinfo);
m_bInited = false;
return false;
}
- cinfo.image_width = m_OrigWidth;
- cinfo.image_height = m_OrigHeight;
- int ret = jpeg_read_header(&cinfo, TRUE);
+ m_Cinfo.image_width = m_OrigWidth;
+ m_Cinfo.image_height = m_OrigHeight;
+ int ret = jpeg_read_header(&m_Cinfo, TRUE);
if (ret != JPEG_HEADER_OK)
return false;
- if (cinfo.saw_Adobe_marker)
+ if (m_Cinfo.saw_Adobe_marker)
m_bJpegTransform = true;
- if (cinfo.num_components == 3 && !m_bJpegTransform)
- cinfo.out_color_space = cinfo.jpeg_color_space;
+ if (m_Cinfo.num_components == 3 && !m_bJpegTransform)
+ m_Cinfo.out_color_space = m_Cinfo.jpeg_color_space;
- m_OrigWidth = cinfo.image_width;
- m_OrigHeight = cinfo.image_height;
+ m_OrigWidth = m_Cinfo.image_width;
+ m_OrigHeight = m_Cinfo.image_height;
m_OutputWidth = m_OrigWidth;
m_OutputHeight = m_OrigHeight;
- m_nDefaultScaleDenom = cinfo.scale_denom;
+ m_nDefaultScaleDenom = m_Cinfo.scale_denom;
return true;
}
@@ -244,16 +246,16 @@
int nComps,
bool ColorTransform) {
m_SrcSpan = JpegScanSOI(src_span);
- jerr.error_exit = error_fatal;
- jerr.emit_message = error_do_nothing1;
- jerr.output_message = error_do_nothing;
- jerr.format_message = error_do_nothing2;
- jerr.reset_error_mgr = error_do_nothing;
- src.init_source = src_do_nothing;
- src.term_source = src_do_nothing;
- src.skip_input_data = src_skip_data;
- src.fill_input_buffer = src_fill_buffer;
- src.resync_to_restart = src_resync;
+ m_Jerr.error_exit = error_fatal;
+ m_Jerr.emit_message = error_do_nothing1;
+ m_Jerr.output_message = error_do_nothing;
+ m_Jerr.format_message = error_do_nothing2;
+ m_Jerr.reset_error_mgr = error_do_nothing;
+ m_Src.init_source = src_do_nothing;
+ m_Src.term_source = src_do_nothing;
+ m_Src.skip_input_data = src_skip_data;
+ m_Src.fill_input_buffer = src_fill_buffer;
+ m_Src.resync_to_restart = src_resync;
m_bJpegTransform = ColorTransform;
if (m_SrcSpan.size() >= 2) {
const_cast<uint8_t*>(m_SrcSpan.data())[m_SrcSpan.size() - 2] = 0xFF;
@@ -264,17 +266,15 @@
if (!InitDecode())
return false;
- if (cinfo.num_components < nComps)
+ if (m_Cinfo.num_components < nComps)
return false;
- if ((int)cinfo.image_width < width)
+ if (static_cast<int>(m_Cinfo.image_width) < width)
return false;
- m_Pitch =
- (static_cast<uint32_t>(cinfo.image_width) * cinfo.num_components + 3) /
- 4 * 4;
+ CalcPitch();
m_pScanlineBuf.reset(FX_Alloc(uint8_t, m_Pitch));
- m_nComps = cinfo.num_components;
+ m_nComps = m_Cinfo.num_components;
m_bpc = 8;
m_bStarted = false;
return true;
@@ -282,7 +282,7 @@
bool CCodec_JpegDecoder::v_Rewind() {
if (m_bStarted) {
- jpeg_destroy_decompress(&cinfo);
+ jpeg_destroy_decompress(&m_Cinfo);
if (!InitDecode()) {
return false;
}
@@ -290,14 +290,14 @@
if (setjmp(m_JmpBuf) == -1) {
return false;
}
- cinfo.scale_denom = m_nDefaultScaleDenom;
+ m_Cinfo.scale_denom = m_nDefaultScaleDenom;
m_OutputWidth = m_OrigWidth;
m_OutputHeight = m_OrigHeight;
- if (!jpeg_start_decompress(&cinfo)) {
- jpeg_destroy_decompress(&cinfo);
+ if (!jpeg_start_decompress(&m_Cinfo)) {
+ jpeg_destroy_decompress(&m_Cinfo);
return false;
}
- if ((int)cinfo.output_width > m_OrigWidth) {
+ if (static_cast<int>(m_Cinfo.output_width) > m_OrigWidth) {
NOTREACHED();
return false;
}
@@ -310,12 +310,19 @@
return nullptr;
uint8_t* row_array[] = {m_pScanlineBuf.get()};
- int nlines = jpeg_read_scanlines(&cinfo, row_array, 1);
+ int nlines = jpeg_read_scanlines(&m_Cinfo, row_array, 1);
return nlines > 0 ? m_pScanlineBuf.get() : nullptr;
}
uint32_t CCodec_JpegDecoder::GetSrcOffset() {
- return static_cast<uint32_t>(m_SrcSpan.size() - src.bytes_in_buffer);
+ return static_cast<uint32_t>(m_SrcSpan.size() - m_Src.bytes_in_buffer);
+}
+
+void CCodec_JpegDecoder::CalcPitch() {
+ m_Pitch = static_cast<uint32_t>(m_Cinfo.image_width) * m_Cinfo.num_components;
+ m_Pitch += 3;
+ m_Pitch /= 4;
+ m_Pitch *= 4;
}
std::unique_ptr<CCodec_ScanlineDecoder> CCodec_JpegModule::CreateDecoder(
@@ -476,7 +483,6 @@
}
#if defined(OS_WIN)
-#define JPEG_BLOCK_SIZE 1048576
bool CCodec_JpegModule::JpegEncode(const RetainPtr<CFX_DIBBase>& pSource,
uint8_t** dest_buf,
size_t* dest_size) {
@@ -557,16 +563,17 @@
}
row_pointer[0] = line_buf;
} else {
- row_pointer[0] = (uint8_t*)src_scan;
+ row_pointer[0] = const_cast<uint8_t*>(src_scan);
}
row = cinfo.next_scanline;
jpeg_write_scanlines(&cinfo, row_pointer, 1);
if (cinfo.next_scanline == row) {
+ constexpr size_t kJpegBlockSize = 1048576;
*dest_buf =
- FX_Realloc(uint8_t, *dest_buf, dest_buf_length + JPEG_BLOCK_SIZE);
+ FX_Realloc(uint8_t, *dest_buf, dest_buf_length + kJpegBlockSize);
dest.next_output_byte = *dest_buf + dest_buf_length - dest.free_in_buffer;
- dest_buf_length += JPEG_BLOCK_SIZE;
- dest.free_in_buffer += JPEG_BLOCK_SIZE;
+ dest_buf_length += kJpegBlockSize;
+ dest.free_in_buffer += kJpegBlockSize;
}
}
jpeg_finish_compress(&cinfo);