diff options
Diffstat (limited to 'core/fxcodec')
-rw-r--r-- | core/fxcodec/codec/ccodec_jpegmodule.cpp (renamed from core/fxcodec/codec/fx_codec_jpeg.cpp) | 103 | ||||
-rw-r--r-- | core/fxcodec/codec/ccodec_jpegmodule.h | 17 |
2 files changed, 53 insertions, 67 deletions
diff --git a/core/fxcodec/codec/fx_codec_jpeg.cpp b/core/fxcodec/codec/ccodec_jpegmodule.cpp index d8e94b0285..e6aef3c05b 100644 --- a/core/fxcodec/codec/fx_codec_jpeg.cpp +++ b/core/fxcodec/codec/ccodec_jpegmodule.cpp @@ -4,14 +4,16 @@ // Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com +#include "core/fxcodec/codec/ccodec_jpegmodule.h" + #include <setjmp.h> #include <memory> #include <utility> -#include "core/fxcodec/codec/ccodec_jpegmodule.h" #include "core/fxcodec/codec/ccodec_scanlinedecoder.h" #include "core/fxcodec/fx_codec.h" +#include "core/fxcrt/fx_memory.h" #include "core/fxcrt/fx_safe_types.h" #include "core/fxge/dib/cfx_dibbase.h" #include "core/fxge/fx_dib.h" @@ -45,23 +47,20 @@ class CJpegContext final : public CCodec_JpegModule::Context { void (*m_FreeFunc)(void*); }; -extern "C" { - -static void JpegScanSOI(const uint8_t** src_buf, uint32_t* src_size) { - if (*src_size == 0) - return; +static pdfium::span<const uint8_t> JpegScanSOI( + pdfium::span<const uint8_t> src_span) { + if (src_span.empty()) + return {}; - uint32_t offset = 0; - while (offset < *src_size - 1) { - if ((*src_buf)[offset] == 0xff && (*src_buf)[offset + 1] == 0xd8) { - *src_buf += offset; - *src_size -= offset; - return; - } - offset++; + for (size_t offset = 0; offset < src_span.size() - 1; ++offset) { + if (src_span[offset] == 0xff && src_span[offset + 1] == 0xd8) + return src_span.subspan(offset); } + return src_span; } +extern "C" { + static void _src_do_nothing(struct jpeg_decompress_struct* cinfo) {} static void _error_fatal(j_common_ptr cinfo) { @@ -111,14 +110,13 @@ static void JpegLoadAttribute(struct jpeg_decompress_struct* pInfo, } #endif // PDF_ENABLE_XFA -static bool JpegLoadInfo(const uint8_t* src_buf, - uint32_t src_size, +static bool JpegLoadInfo(pdfium::span<const uint8_t> src_span, int* width, int* height, int* num_components, int* bits_per_components, bool* color_transform) { - JpegScanSOI(&src_buf, &src_size); + src_span = JpegScanSOI(src_span); struct jpeg_decompress_struct cinfo; struct jpeg_error_mgr jerr; jerr.error_exit = _error_fatal; @@ -140,8 +138,8 @@ static bool JpegLoadInfo(const uint8_t* src_buf, src.skip_input_data = _src_skip_data; src.fill_input_buffer = _src_fill_buffer; src.resync_to_restart = _src_resync; - src.bytes_in_buffer = src_size; - src.next_input_byte = src_buf; + src.bytes_in_buffer = src_span.size(); + src.next_input_byte = src_span.data(); cinfo.src = &src; if (setjmp(mark) == -1) { jpeg_destroy_decompress(&cinfo); @@ -167,8 +165,7 @@ class CCodec_JpegDecoder final : public CCodec_ScanlineDecoder { CCodec_JpegDecoder(); ~CCodec_JpegDecoder() override; - bool Create(const uint8_t* src_buf, - uint32_t src_size, + bool Create(pdfium::span<const uint8_t> src_buf, int width, int height, int nComps, @@ -185,30 +182,23 @@ class CCodec_JpegDecoder final : public CCodec_ScanlineDecoder { struct jpeg_decompress_struct cinfo; struct jpeg_error_mgr jerr; struct jpeg_source_mgr src; - const uint8_t* m_SrcBuf; - uint32_t m_SrcSize; - uint8_t* m_pScanlineBuf; - - bool m_bInited; - bool m_bStarted; - bool m_bJpegTransform; - - protected: - uint32_t m_nDefaultScaleDenom; + pdfium::span<const uint8_t> m_SrcSpan; + std::unique_ptr<uint8_t, FxFreeDeleter> m_pScanlineBuf; + bool m_bInited = false; + bool m_bStarted = false; + bool m_bJpegTransform = false; + + private: + uint32_t m_nDefaultScaleDenom = 1; }; CCodec_JpegDecoder::CCodec_JpegDecoder() { - m_pScanlineBuf = nullptr; - m_bStarted = false; - m_bInited = false; memset(&cinfo, 0, sizeof(cinfo)); memset(&jerr, 0, sizeof(jerr)); memset(&src, 0, sizeof(src)); - m_nDefaultScaleDenom = 1; } CCodec_JpegDecoder::~CCodec_JpegDecoder() { - FX_Free(m_pScanlineBuf); if (m_bInited) jpeg_destroy_decompress(&cinfo); } @@ -222,8 +212,8 @@ bool CCodec_JpegDecoder::InitDecode() { jpeg_create_decompress(&cinfo); m_bInited = true; cinfo.src = &src; - src.bytes_in_buffer = m_SrcSize; - src.next_input_byte = m_SrcBuf; + src.bytes_in_buffer = m_SrcSpan.size(); + src.next_input_byte = m_SrcSpan.data(); if (setjmp(m_JmpBuf) == -1) { jpeg_destroy_decompress(&cinfo); m_bInited = false; @@ -249,15 +239,12 @@ bool CCodec_JpegDecoder::InitDecode() { return true; } -bool CCodec_JpegDecoder::Create(const uint8_t* src_buf, - uint32_t src_size, +bool CCodec_JpegDecoder::Create(pdfium::span<const uint8_t> src_span, int width, int height, int nComps, bool ColorTransform) { - JpegScanSOI(&src_buf, &src_size); - m_SrcBuf = src_buf; - m_SrcSize = src_size; + m_SrcSpan = JpegScanSOI(src_span); jerr.error_exit = _error_fatal; jerr.emit_message = _error_do_nothing1; jerr.output_message = _error_do_nothing; @@ -269,9 +256,9 @@ bool CCodec_JpegDecoder::Create(const uint8_t* src_buf, src.fill_input_buffer = _src_fill_buffer; src.resync_to_restart = _src_resync; m_bJpegTransform = ColorTransform; - if (src_size > 1 && memcmp(src_buf + src_size - 2, "\xFF\xD9", 2) != 0) { - ((uint8_t*)src_buf)[src_size - 2] = 0xFF; - ((uint8_t*)src_buf)[src_size - 1] = 0xD9; + if (m_SrcSpan.size() >= 2) { + const_cast<uint8_t*>(m_SrcSpan.data())[m_SrcSpan.size() - 2] = 0xFF; + const_cast<uint8_t*>(m_SrcSpan.data())[m_SrcSpan.size() - 1] = 0xD9; } m_OutputWidth = m_OrigWidth = width; m_OutputHeight = m_OrigHeight = height; @@ -287,7 +274,7 @@ bool CCodec_JpegDecoder::Create(const uint8_t* src_buf, m_Pitch = (static_cast<uint32_t>(cinfo.image_width) * cinfo.num_components + 3) / 4 * 4; - m_pScanlineBuf = FX_Alloc(uint8_t, m_Pitch); + m_pScanlineBuf.reset(FX_Alloc(uint8_t, m_Pitch)); m_nComps = cinfo.num_components; m_bpc = 8; m_bStarted = false; @@ -323,40 +310,38 @@ uint8_t* CCodec_JpegDecoder::v_GetNextLine() { if (setjmp(m_JmpBuf) == -1) return nullptr; - int nlines = jpeg_read_scanlines(&cinfo, &m_pScanlineBuf, 1); - return nlines > 0 ? m_pScanlineBuf : nullptr; + uint8_t* row_array[] = {m_pScanlineBuf.get()}; + int nlines = jpeg_read_scanlines(&cinfo, row_array, 1); + return nlines > 0 ? m_pScanlineBuf.get() : nullptr; } uint32_t CCodec_JpegDecoder::GetSrcOffset() { - return (uint32_t)(m_SrcSize - src.bytes_in_buffer); + return static_cast<uint32_t>(m_SrcSpan.size() - src.bytes_in_buffer); } std::unique_ptr<CCodec_ScanlineDecoder> CCodec_JpegModule::CreateDecoder( - const uint8_t* src_buf, - uint32_t src_size, + pdfium::span<const uint8_t> src_span, int width, int height, int nComps, bool ColorTransform) { - if (!src_buf || src_size == 0) + if (src_span.empty()) return nullptr; auto pDecoder = pdfium::MakeUnique<CCodec_JpegDecoder>(); - if (!pDecoder->Create(src_buf, src_size, width, height, nComps, - ColorTransform)) { + if (!pDecoder->Create(src_span, width, height, nComps, ColorTransform)) return nullptr; - } + return std::move(pDecoder); } -bool CCodec_JpegModule::LoadInfo(const uint8_t* src_buf, - uint32_t src_size, +bool CCodec_JpegModule::LoadInfo(pdfium::span<const uint8_t> src_span, int* width, int* height, int* num_components, int* bits_per_components, bool* color_transform) { - return JpegLoadInfo(src_buf, src_size, width, height, num_components, + return JpegLoadInfo(src_span, width, height, num_components, bits_per_components, color_transform); } diff --git a/core/fxcodec/codec/ccodec_jpegmodule.h b/core/fxcodec/codec/ccodec_jpegmodule.h index d990ee938f..fb116f5d88 100644 --- a/core/fxcodec/codec/ccodec_jpegmodule.h +++ b/core/fxcodec/codec/ccodec_jpegmodule.h @@ -12,6 +12,7 @@ #include "core/fxcrt/fx_system.h" #include "core/fxcrt/retain_ptr.h" +#include "third_party/base/span.h" class CCodec_ScanlineDecoder; class CFX_DIBBase; @@ -28,14 +29,14 @@ class CCodec_JpegModule { virtual jmp_buf* GetJumpMark() = 0; }; - std::unique_ptr<CCodec_ScanlineDecoder> CreateDecoder(const uint8_t* src_buf, - uint32_t src_size, - int width, - int height, - int nComps, - bool ColorTransform); - bool LoadInfo(const uint8_t* src_buf, - uint32_t src_size, + std::unique_ptr<CCodec_ScanlineDecoder> CreateDecoder( + pdfium::span<const uint8_t> src_buf, + int width, + int height, + int nComps, + bool ColorTransform); + + bool LoadInfo(pdfium::span<const uint8_t> src_span, int* width, int* height, int* num_components, |