summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--core/fxcodec/codec/fx_codec_flate.cpp168
1 files changed, 82 insertions, 86 deletions
diff --git a/core/fxcodec/codec/fx_codec_flate.cpp b/core/fxcodec/codec/fx_codec_flate.cpp
index 7b446f6445..b46410e26d 100644
--- a/core/fxcodec/codec/fx_codec_flate.cpp
+++ b/core/fxcodec/codec/fx_codec_flate.cpp
@@ -554,51 +554,91 @@ void FlateUncompress(const uint8_t* src_buf,
FlateEnd(context);
}
-} // namespace
-
class CCodec_FlateScanlineDecoder : public CCodec_ScanlineDecoder {
public:
- CCodec_FlateScanlineDecoder();
+ CCodec_FlateScanlineDecoder(const uint8_t* src_buf,
+ uint32_t src_size,
+ int width,
+ int height,
+ int nComps,
+ int bpc,
+ int predictor,
+ int Colors,
+ int BitsPerComponent,
+ int Columns);
~CCodec_FlateScanlineDecoder() override;
- void Create(const uint8_t* src_buf,
- uint32_t src_size,
- int width,
- int height,
- int nComps,
- int bpc,
- int predictor,
- int Colors,
- int BitsPerComponent,
- int Columns);
-
// CCodec_ScanlineDecoder
bool v_Rewind() override;
uint8_t* v_GetNextLine() override;
uint32_t GetSrcOffset() override;
- void* m_pFlate;
- const uint8_t* m_SrcBuf;
- uint32_t m_SrcSize;
- uint8_t* m_pScanline;
- uint8_t* m_pLastLine;
- uint8_t* m_pPredictBuffer;
- uint8_t* m_pPredictRaw;
- int m_Predictor;
- int m_Colors;
- int m_BitsPerComponent;
- int m_Columns;
- uint32_t m_PredictPitch;
- size_t m_LeftOver;
+ private:
+ enum class PredictorType : uint8_t { kNone, kFlate, kPng };
+ static PredictorType GetPredictor(int predictor) {
+ if (predictor >= 10)
+ return PredictorType::kPng;
+ if (predictor == 2)
+ return PredictorType::kFlate;
+ return PredictorType::kNone;
+ }
+
+ void* m_pFlate = nullptr;
+ const uint8_t* const m_SrcBuf;
+ const uint32_t m_SrcSize;
+ uint8_t* const m_pScanline;
+ uint8_t* m_pLastLine = nullptr;
+ uint8_t* m_pPredictBuffer = nullptr;
+ uint8_t* m_pPredictRaw = nullptr;
+
+ const PredictorType m_Predictor;
+
+ // These are only used if |m_Predictor| != |kNone|.
+ int m_Colors = 0;
+ int m_BitsPerComponent = 0;
+ int m_Columns = 0;
+ uint32_t m_PredictPitch = 0;
+ size_t m_LeftOver = 0;
};
-CCodec_FlateScanlineDecoder::CCodec_FlateScanlineDecoder() {
- m_pFlate = nullptr;
- m_pScanline = nullptr;
- m_pLastLine = nullptr;
- m_pPredictBuffer = nullptr;
- m_pPredictRaw = nullptr;
- m_LeftOver = 0;
+CCodec_FlateScanlineDecoder::CCodec_FlateScanlineDecoder(const uint8_t* src_buf,
+ uint32_t src_size,
+ int width,
+ int height,
+ int nComps,
+ int bpc,
+ int predictor,
+ int Colors,
+ int BitsPerComponent,
+ int Columns)
+ : CCodec_ScanlineDecoder(
+ width,
+ height,
+ width,
+ height,
+ nComps,
+ bpc,
+ (static_cast<uint32_t>(width) * nComps * bpc + 7) / 8),
+ m_SrcBuf(src_buf),
+ m_SrcSize(src_size),
+ m_pScanline(FX_Alloc(uint8_t, m_Pitch)),
+ m_Predictor(GetPredictor(predictor)) {
+ if (m_Predictor != PredictorType::kNone) {
+ if (BitsPerComponent * Colors * Columns == 0) {
+ BitsPerComponent = m_bpc;
+ Colors = m_nComps;
+ Columns = m_OrigWidth;
+ }
+ m_Colors = Colors;
+ m_BitsPerComponent = BitsPerComponent;
+ m_Columns = Columns;
+ m_PredictPitch =
+ (static_cast<uint32_t>(m_BitsPerComponent) * m_Colors * m_Columns + 7) /
+ 8;
+ m_pLastLine = FX_Alloc(uint8_t, m_PredictPitch);
+ m_pPredictRaw = FX_Alloc(uint8_t, m_PredictPitch + 1);
+ m_pPredictBuffer = FX_Alloc(uint8_t, m_PredictPitch);
+ }
}
CCodec_FlateScanlineDecoder::~CCodec_FlateScanlineDecoder() {
@@ -610,51 +650,6 @@ CCodec_FlateScanlineDecoder::~CCodec_FlateScanlineDecoder() {
FlateEnd(m_pFlate);
}
-void CCodec_FlateScanlineDecoder::Create(const uint8_t* src_buf,
- uint32_t src_size,
- int width,
- int height,
- int nComps,
- int bpc,
- int predictor,
- int Colors,
- int BitsPerComponent,
- int Columns) {
- m_SrcBuf = src_buf;
- m_SrcSize = src_size;
- m_OutputWidth = m_OrigWidth = width;
- m_OutputHeight = m_OrigHeight = height;
- m_nComps = nComps;
- m_bpc = bpc;
- m_Pitch = (static_cast<uint32_t>(width) * nComps * bpc + 7) / 8;
- m_pScanline = FX_Alloc(uint8_t, m_Pitch);
- m_Predictor = 0;
- if (predictor) {
- if (predictor >= 10) {
- m_Predictor = 2;
- } else if (predictor == 2) {
- m_Predictor = 1;
- }
- if (m_Predictor) {
- if (BitsPerComponent * Colors * Columns == 0) {
- BitsPerComponent = m_bpc;
- Colors = m_nComps;
- Columns = m_OrigWidth;
- }
- m_Colors = Colors;
- m_BitsPerComponent = BitsPerComponent;
- m_Columns = Columns;
- m_PredictPitch =
- (static_cast<uint32_t>(m_BitsPerComponent) * m_Colors * m_Columns +
- 7) /
- 8;
- m_pLastLine = FX_Alloc(uint8_t, m_PredictPitch);
- m_pPredictRaw = FX_Alloc(uint8_t, m_PredictPitch + 1);
- m_pPredictBuffer = FX_Alloc(uint8_t, m_PredictPitch);
- }
- }
-}
-
bool CCodec_FlateScanlineDecoder::v_Rewind() {
if (m_pFlate)
FlateEnd(m_pFlate);
@@ -669,9 +664,9 @@ bool CCodec_FlateScanlineDecoder::v_Rewind() {
}
uint8_t* CCodec_FlateScanlineDecoder::v_GetNextLine() {
- if (m_Predictor) {
+ if (m_Predictor != PredictorType::kNone) {
if (m_Pitch == m_PredictPitch) {
- if (m_Predictor == 2) {
+ if (m_Predictor == PredictorType::kPng) {
FlateOutput(m_pFlate, m_pPredictRaw, m_PredictPitch + 1);
PNG_PredictLine(m_pScanline, m_pPredictRaw, m_pLastLine,
m_BitsPerComponent, m_Colors, m_Columns);
@@ -692,7 +687,7 @@ uint8_t* CCodec_FlateScanlineDecoder::v_GetNextLine() {
bytes_to_go -= read_leftover;
}
while (bytes_to_go) {
- if (m_Predictor == 2) {
+ if (m_Predictor == PredictorType::kPng) {
FlateOutput(m_pFlate, m_pPredictRaw, m_PredictPitch + 1);
PNG_PredictLine(m_pPredictBuffer, m_pPredictRaw, m_pLastLine,
m_BitsPerComponent, m_Colors, m_Columns);
@@ -720,6 +715,8 @@ uint32_t CCodec_FlateScanlineDecoder::GetSrcOffset() {
return FlateGetPossiblyTruncatedTotalIn(m_pFlate);
}
+} // namespace
+
std::unique_ptr<CCodec_ScanlineDecoder> CCodec_FlateModule::CreateDecoder(
const uint8_t* src_buf,
uint32_t src_size,
@@ -731,10 +728,9 @@ std::unique_ptr<CCodec_ScanlineDecoder> CCodec_FlateModule::CreateDecoder(
int Colors,
int BitsPerComponent,
int Columns) {
- auto pDecoder = pdfium::MakeUnique<CCodec_FlateScanlineDecoder>();
- pDecoder->Create(src_buf, src_size, width, height, nComps, bpc, predictor,
- Colors, BitsPerComponent, Columns);
- return std::move(pDecoder);
+ return pdfium::MakeUnique<CCodec_FlateScanlineDecoder>(
+ src_buf, src_size, width, height, nComps, bpc, predictor, Colors,
+ BitsPerComponent, Columns);
}
uint32_t CCodec_FlateModule::FlateOrLZWDecode(bool bLZW,