From 022da0014faa103901ec107ed6a33e5ab00c7931 Mon Sep 17 00:00:00 2001 From: Lei Zhang Date: Thu, 1 Oct 2015 13:49:28 -0700 Subject: Clean up some image decoder classes: - Use std::vector instead of raw uint8_t* - Make ICodec_ScanlineDecoder::GetScanline() return const uint8_t* - Add FxFreeDeleter, use it in CCodec_ImageDataCache. - Make CCodec_ImageDataCache encapsulate its data members. R=tsepez@chromium.org Review URL: https://codereview.chromium.org/1361053002 . --- .../src/fpdfapi/fpdf_page/fpdf_page_parser_old.cpp | 6 ++--- .../fpdfapi/fpdf_render/fpdf_render_loadimage.cpp | 31 ++++++++-------------- 2 files changed, 14 insertions(+), 23 deletions(-) (limited to 'core/src/fpdfapi') diff --git a/core/src/fpdfapi/fpdf_page/fpdf_page_parser_old.cpp b/core/src/fpdfapi/fpdf_page/fpdf_page_parser_old.cpp index c9bcff6db6..ace7bf925b 100644 --- a/core/src/fpdfapi/fpdf_page/fpdf_page_parser_old.cpp +++ b/core/src/fpdfapi/fpdf_page/fpdf_page_parser_old.cpp @@ -247,10 +247,10 @@ FX_DWORD _DecodeAllScanlines(ICodec_ScanlineDecoder* pDecoder, dest_buf = FX_Alloc2D(uint8_t, pitch, height); dest_size = pitch * height; // Safe since checked alloc returned. for (int row = 0; row < height; row++) { - uint8_t* pLine = pDecoder->GetScanline(row); - if (pLine == NULL) { + const uint8_t* pLine = pDecoder->GetScanline(row); + if (!pLine) break; - } + FXSYS_memcpy(dest_buf + row * pitch, pLine, pitch); } FX_DWORD srcoff = pDecoder->GetSrcOffset(); diff --git a/core/src/fpdfapi/fpdf_render/fpdf_render_loadimage.cpp b/core/src/fpdfapi/fpdf_render/fpdf_render_loadimage.cpp index 9497943fbd..f1fbf41d6d 100644 --- a/core/src/fpdfapi/fpdf_render/fpdf_render_loadimage.cpp +++ b/core/src/fpdfapi/fpdf_render/fpdf_render_loadimage.cpp @@ -4,6 +4,8 @@ // Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com +#include + #include "../../../../third_party/base/nonstd_unique_ptr.h" #include "../../../include/fpdfapi/fpdf_module.h" #include "../../../include/fpdfapi/fpdf_pageobj.h" @@ -57,15 +59,13 @@ FX_SAFE_DWORD CalculatePitch32(int bpp, int width) { return pitch; } -// Wrapper class to hold objects allocated in CPDF_DIBSource::LoadJpxBitmap(), -// because nonstd::unique_ptr does not support custom deleters yet. +// Wrapper class to use with nonstd::unique_ptr for CJPX_Decoder. class JpxBitMapContext { public: explicit JpxBitMapContext(ICodec_JpxModule* jpx_module) - : jpx_module_(jpx_module), decoder_(nullptr), output_offsets_(nullptr) {} + : jpx_module_(jpx_module), decoder_(nullptr) {} ~JpxBitMapContext() { - FX_Free(output_offsets_); jpx_module_->DestroyDecoder(decoder_); } @@ -74,17 +74,9 @@ class JpxBitMapContext { CJPX_Decoder* decoder() { return decoder_; } - // Takes ownership of |output_offsets|. - void set_output_offsets(unsigned char* output_offsets) { - output_offsets_ = output_offsets; - } - - unsigned char* output_offsets() { return output_offsets_; } - private: - ICodec_JpxModule* jpx_module_; // Weak pointer. - CJPX_Decoder* decoder_; // Decoder, owned. - unsigned char* output_offsets_; // Output offsets for decoding, owned. + ICodec_JpxModule* const jpx_module_; // Weak pointer. + CJPX_Decoder* decoder_; // Decoder, owned. // Disallow evil constructors JpxBitMapContext(const JpxBitMapContext&); @@ -747,16 +739,15 @@ void CPDF_DIBSource::LoadJpxBitmap() { return; } m_pCachedBitmap->Clear(0xFFFFFFFF); - context->set_output_offsets(FX_Alloc(uint8_t, components)); + std::vector output_offsets(components); for (int i = 0; i < components; ++i) - context->output_offsets()[i] = i; + output_offsets[i] = i; if (bSwapRGB) { - context->output_offsets()[0] = 2; - context->output_offsets()[2] = 0; + output_offsets[0] = 2; + output_offsets[2] = 0; } if (!pJpxModule->Decode(context->decoder(), m_pCachedBitmap->GetBuffer(), - m_pCachedBitmap->GetPitch(), - context->output_offsets())) { + m_pCachedBitmap->GetPitch(), output_offsets)) { m_pCachedBitmap.reset(); return; } -- cgit v1.2.3