summaryrefslogtreecommitdiff
path: root/core/fpdfapi
diff options
context:
space:
mode:
Diffstat (limited to 'core/fpdfapi')
-rw-r--r--core/fpdfapi/page/cpdf_streamparser.cpp26
-rw-r--r--core/fpdfapi/parser/fpdf_parser_decode.cpp7
-rw-r--r--core/fpdfapi/parser/fpdf_parser_decode.h19
-rw-r--r--core/fpdfapi/render/fpdf_render_loadimage.cpp44
-rw-r--r--core/fpdfapi/render/render_int.h9
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_