diff options
Diffstat (limited to 'core/fpdfapi')
-rw-r--r-- | core/fpdfapi/page/cpdf_streamparser.cpp | 26 | ||||
-rw-r--r-- | core/fpdfapi/parser/fpdf_parser_decode.cpp | 7 | ||||
-rw-r--r-- | core/fpdfapi/parser/fpdf_parser_decode.h | 19 | ||||
-rw-r--r-- | core/fpdfapi/render/fpdf_render_loadimage.cpp | 44 | ||||
-rw-r--r-- | core/fpdfapi/render/render_int.h | 9 |
5 files changed, 44 insertions, 61 deletions
diff --git a/core/fpdfapi/page/cpdf_streamparser.cpp b/core/fpdfapi/page/cpdf_streamparser.cpp index cabf3d3cb3..fd5267b111 100644 --- a/core/fpdfapi/page/cpdf_streamparser.cpp +++ b/core/fpdfapi/page/cpdf_streamparser.cpp @@ -27,20 +27,13 @@ #include "core/fxcodec/fx_codec.h" #include "core/fxcrt/fx_ext.h" -CCodec_ScanlineDecoder* FPDFAPI_CreateFaxDecoder( - const uint8_t* src_buf, - uint32_t src_size, - int width, - int height, - const CPDF_Dictionary* pParams); - namespace { const uint32_t kMaxNestedArrayLevel = 512; const uint32_t kMaxWordBuffer = 256; const FX_STRSIZE kMaxStringLength = 32767; -uint32_t DecodeAllScanlines(CCodec_ScanlineDecoder* pDecoder, +uint32_t DecodeAllScanlines(std::unique_ptr<CCodec_ScanlineDecoder> pDecoder, uint8_t*& dest_buf, uint32_t& dest_size) { if (!pDecoder) @@ -50,10 +43,9 @@ uint32_t DecodeAllScanlines(CCodec_ScanlineDecoder* pDecoder, int width = pDecoder->GetWidth(); int height = pDecoder->GetHeight(); int pitch = (width * ncomps * bpc + 7) / 8; - if (height == 0 || pitch > (1 << 30) / height) { - delete pDecoder; + if (height == 0 || pitch > (1 << 30) / height) return FX_INVALID_OFFSET; - } + dest_buf = FX_Alloc2D(uint8_t, pitch, height); dest_size = pitch * height; // Safe since checked alloc returned. for (int row = 0; row < height; row++) { @@ -63,9 +55,7 @@ uint32_t DecodeAllScanlines(CCodec_ScanlineDecoder* pDecoder, FXSYS_memcpy(dest_buf + row * pitch, pLine, pitch); } - uint32_t srcoff = pDecoder->GetSrcOffset(); - delete pDecoder; - return srcoff; + return pDecoder->GetSrcOffset(); } uint32_t PDF_DecodeInlineStream(const uint8_t* src_buf, @@ -77,9 +67,9 @@ uint32_t PDF_DecodeInlineStream(const uint8_t* src_buf, uint8_t*& dest_buf, uint32_t& dest_size) { if (decoder == "CCITTFaxDecode" || decoder == "CCF") { - CCodec_ScanlineDecoder* pDecoder = + std::unique_ptr<CCodec_ScanlineDecoder> pDecoder = FPDFAPI_CreateFaxDecoder(src_buf, limit, width, height, pParam); - return DecodeAllScanlines(pDecoder, dest_buf, dest_size); + return DecodeAllScanlines(std::move(pDecoder), dest_buf, dest_size); } if (decoder == "ASCII85Decode" || decoder == "A85") return A85Decode(src_buf, limit, dest_buf, dest_size); @@ -94,11 +84,11 @@ uint32_t PDF_DecodeInlineStream(const uint8_t* src_buf, dest_size); } if (decoder == "DCTDecode" || decoder == "DCT") { - CCodec_ScanlineDecoder* pDecoder = + std::unique_ptr<CCodec_ScanlineDecoder> pDecoder = CPDF_ModuleMgr::Get()->GetJpegModule()->CreateDecoder( src_buf, limit, width, height, 0, !pParam || pParam->GetIntegerFor("ColorTransform", 1)); - return DecodeAllScanlines(pDecoder, dest_buf, dest_size); + return DecodeAllScanlines(std::move(pDecoder), dest_buf, dest_size); } if (decoder == "RunLengthDecode" || decoder == "RL") return RunLengthDecode(src_buf, limit, dest_buf, dest_size); diff --git a/core/fpdfapi/parser/fpdf_parser_decode.cpp b/core/fpdfapi/parser/fpdf_parser_decode.cpp index 6398c71835..884b5c50d1 100644 --- a/core/fpdfapi/parser/fpdf_parser_decode.cpp +++ b/core/fpdfapi/parser/fpdf_parser_decode.cpp @@ -245,7 +245,7 @@ uint32_t RunLengthDecode(const uint8_t* src_buf, return std::min(i + 1, src_size); } -CCodec_ScanlineDecoder* FPDFAPI_CreateFaxDecoder( +std::unique_ptr<CCodec_ScanlineDecoder> FPDFAPI_CreateFaxDecoder( const uint8_t* src_buf, uint32_t src_size, int width, @@ -273,7 +273,7 @@ CCodec_ScanlineDecoder* FPDFAPI_CreateFaxDecoder( Columns, Rows); } -CCodec_ScanlineDecoder* FPDFAPI_CreateFlateDecoder( +std::unique_ptr<CCodec_ScanlineDecoder> FPDFAPI_CreateFlateDecoder( const uint8_t* src_buf, uint32_t src_size, int width, @@ -288,9 +288,8 @@ CCodec_ScanlineDecoder* FPDFAPI_CreateFlateDecoder( Colors = pParams->GetIntegerFor("Colors", 1); BitsPerComponent = pParams->GetIntegerFor("BitsPerComponent", 8); Columns = pParams->GetIntegerFor("Columns", 1); - if (!CheckFlateDecodeParams(Colors, BitsPerComponent, Columns)) { + if (!CheckFlateDecodeParams(Colors, BitsPerComponent, Columns)) return nullptr; - } } return CPDF_ModuleMgr::Get()->GetFlateModule()->CreateDecoder( src_buf, src_size, width, height, nComps, bpc, predictor, Colors, diff --git a/core/fpdfapi/parser/fpdf_parser_decode.h b/core/fpdfapi/parser/fpdf_parser_decode.h index 4d99f1559d..dc8ecf0c9b 100644 --- a/core/fpdfapi/parser/fpdf_parser_decode.h +++ b/core/fpdfapi/parser/fpdf_parser_decode.h @@ -7,8 +7,11 @@ #ifndef CORE_FPDFAPI_PARSER_FPDF_PARSER_DECODE_H_ #define CORE_FPDFAPI_PARSER_FPDF_PARSER_DECODE_H_ +#include <memory> + #include "core/fxcrt/fx_basic.h" +class CCodec_ScanlineDecoder; class CPDF_Dictionary; // Indexed by 8-bit char code, contains unicode code points. @@ -45,6 +48,22 @@ uint32_t RunLengthDecode(const uint8_t* src_buf, uint8_t*& dest_buf, uint32_t& dest_size); +std::unique_ptr<CCodec_ScanlineDecoder> FPDFAPI_CreateFaxDecoder( + const uint8_t* src_buf, + uint32_t src_size, + int width, + int height, + const CPDF_Dictionary* pParams); + +std::unique_ptr<CCodec_ScanlineDecoder> FPDFAPI_CreateFlateDecoder( + const uint8_t* src_buf, + uint32_t src_size, + int width, + int height, + int nComps, + int bpc, + const CPDF_Dictionary* pParams); + // Public for testing. uint32_t A85Decode(const uint8_t* src_buf, uint32_t src_size, diff --git a/core/fpdfapi/render/fpdf_render_loadimage.cpp b/core/fpdfapi/render/fpdf_render_loadimage.cpp index f690f688b1..085077f2e9 100644 --- a/core/fpdfapi/render/fpdf_render_loadimage.cpp +++ b/core/fpdfapi/render/fpdf_render_loadimage.cpp @@ -17,6 +17,7 @@ #include "core/fpdfapi/parser/cpdf_array.h" #include "core/fpdfapi/parser/cpdf_dictionary.h" #include "core/fpdfapi/parser/cpdf_document.h" +#include "core/fpdfapi/parser/fpdf_parser_decode.h" #include "core/fpdfapi/render/cpdf_pagerendercache.h" #include "core/fpdfapi/render/cpdf_renderstatus.h" #include "core/fxcodec/fx_codec.h" @@ -513,22 +514,6 @@ DIB_COMP_DATA* CPDF_DIBSource::GetDecodeAndMaskArray(bool& bDefaultDecode, return pCompData; } -CCodec_ScanlineDecoder* FPDFAPI_CreateFaxDecoder( - const uint8_t* src_buf, - uint32_t src_size, - int width, - int height, - const CPDF_Dictionary* pParams); - -CCodec_ScanlineDecoder* FPDFAPI_CreateFlateDecoder( - const uint8_t* src_buf, - uint32_t src_size, - int width, - int height, - int nComps, - int bpc, - const CPDF_Dictionary* pParams); - int CPDF_DIBSource::CreateDecoder() { const CFX_ByteString& decoder = m_pStreamAcc->GetImageDecoder(); if (decoder.IsEmpty()) @@ -556,22 +541,21 @@ int CPDF_DIBSource::CreateDecoder() { uint32_t src_size = m_pStreamAcc->GetSize(); const CPDF_Dictionary* pParams = m_pStreamAcc->GetImageParam(); if (decoder == "CCITTFaxDecode") { - m_pDecoder.reset(FPDFAPI_CreateFaxDecoder(src_data, src_size, m_Width, - m_Height, pParams)); + m_pDecoder = FPDFAPI_CreateFaxDecoder(src_data, src_size, m_Width, m_Height, + pParams); } else if (decoder == "FlateDecode") { - m_pDecoder.reset(FPDFAPI_CreateFlateDecoder( - src_data, src_size, m_Width, m_Height, m_nComponents, m_bpc, pParams)); + m_pDecoder = FPDFAPI_CreateFlateDecoder( + src_data, src_size, m_Width, m_Height, m_nComponents, m_bpc, pParams); } else if (decoder == "RunLengthDecode") { - m_pDecoder.reset(CPDF_ModuleMgr::Get() - ->GetCodecModule() - ->GetBasicModule() - ->CreateRunLengthDecoder(src_data, src_size, m_Width, - m_Height, m_nComponents, - m_bpc)); + m_pDecoder = CPDF_ModuleMgr::Get() + ->GetCodecModule() + ->GetBasicModule() + ->CreateRunLengthDecoder(src_data, src_size, m_Width, + m_Height, m_nComponents, m_bpc); } else if (decoder == "DCTDecode") { - m_pDecoder.reset(CPDF_ModuleMgr::Get()->GetJpegModule()->CreateDecoder( + m_pDecoder = CPDF_ModuleMgr::Get()->GetJpegModule()->CreateDecoder( src_data, src_size, m_Width, m_Height, m_nComponents, - !pParams || pParams->GetIntegerFor("ColorTransform", 1))); + !pParams || pParams->GetIntegerFor("ColorTransform", 1)); if (!m_pDecoder) { bool bTransform = false; int comps; @@ -623,8 +607,8 @@ int CPDF_DIBSource::CreateDecoder() { return 0; } m_bpc = bpc; - m_pDecoder.reset(CPDF_ModuleMgr::Get()->GetJpegModule()->CreateDecoder( - src_data, src_size, m_Width, m_Height, m_nComponents, bTransform)); + m_pDecoder = CPDF_ModuleMgr::Get()->GetJpegModule()->CreateDecoder( + src_data, src_size, m_Width, m_Height, m_nComponents, bTransform); } } } diff --git a/core/fpdfapi/render/render_int.h b/core/fpdfapi/render/render_int.h index 276370d386..311ba8aa52 100644 --- a/core/fpdfapi/render/render_int.h +++ b/core/fpdfapi/render/render_int.h @@ -173,13 +173,4 @@ class CPDF_DIBSource : public CFX_DIBSource { int m_Status; }; -CCodec_ScanlineDecoder* FPDFAPI_CreateFlateDecoder( - const uint8_t* src_buf, - uint32_t src_size, - int width, - int height, - int nComps, - int bpc, - const CPDF_Dictionary* pParams); - #endif // CORE_FPDFAPI_RENDER_RENDER_INT_H_ |