47class ProgressiveDecoder
final :
48#ifdef PDF_ENABLE_XFA_BMP
49 public BmpDecoder::Delegate,
51#ifdef PDF_ENABLE_XFA_GIF
52 public GifDecoder::Delegate,
54#ifdef PDF_ENABLE_XFA_PNG
55 public PngDecoder::Delegate,
73 FXCODEC_IMAGE_TYPE imageType,
74 CFX_DIBAttribute* pAttribute,
75 bool bSkipImageTypeCheck);
77 int32_t
GetWidth()
const {
return m_SrcWidth; }
87#ifdef PDF_ENABLE_XFA_PNG
89 bool PngReadHeader(
int width,
94 double* gamma) override;
95 uint8_t* PngAskScanlineBuf(
int line) override;
96 void PngFillScanlineBufCompleted(
int pass,
int line) override;
99#ifdef PDF_ENABLE_XFA_GIF
101 uint32_t GifCurrentPosition()
const override;
102 bool GifInputRecordPositionBuf(uint32_t rcd_pos,
103 const FX_RECT& img_rc,
104 pdfium::span<CFX_GifPalette> pal_span,
106 bool interlace) override;
107 void GifReadScanline(int32_t row_num, pdfium::span<uint8_t> row_buf) override;
110#ifdef PDF_ENABLE_XFA_BMP
112 bool BmpInputImagePositionBuf(uint32_t rcd_pos) override;
113 void BmpReadScanline(uint32_t row_num,
114 pdfium::span<
const uint8_t> row_buf) override;
120 enum class TransformMethod : uint8_t {
122 k8BppGrayToRgbMaybeAlpha,
123 k8BppRgbToRgbNoAlpha,
125 kRgbMaybeAlphaToRgbMaybeAlpha,
126 kCmykToRgbMaybeAlpha,
130#ifdef PDF_ENABLE_XFA_BMP
131 bool BmpReadMoreData(ProgressiveDecoderIface::Context* pBmpContext,
132 FXCODEC_STATUS* err_status);
133 bool BmpDetectImageTypeInBuffer(CFX_DIBAttribute* pAttribute);
134 FXCODEC_STATUS BmpStartDecode();
135 FXCODEC_STATUS BmpContinueDecode();
138#ifdef PDF_ENABLE_XFA_GIF
139 bool GifReadMoreData(FXCODEC_STATUS* err_status);
140 bool GifDetectImageTypeInBuffer();
141 FXCODEC_STATUS GifStartDecode();
142 FXCODEC_STATUS GifContinueDecode();
145#ifdef PDF_ENABLE_XFA_PNG
146 bool PngDetectImageTypeInBuffer(CFX_DIBAttribute* pAttribute);
147 FXCODEC_STATUS PngStartDecode();
148 FXCODEC_STATUS PngContinueDecode();
151#ifdef PDF_ENABLE_XFA_TIFF
152 bool TiffDetectImageTypeFromFile(CFX_DIBAttribute* pAttribute);
153 FXCODEC_STATUS TiffContinueDecode();
157 bool JpegDetectImageTypeInBuffer(CFX_DIBAttribute* pAttribute);
161 int32_t GetBitsPerPixel()
const {
return m_SrcComponents * m_SrcBPC; }
163 bool DetectImageType(FXCODEC_IMAGE_TYPE imageType,
164 CFX_DIBAttribute* pAttribute);
169 void SetTransMethod();
171 void ResampleScanline(
const RetainPtr<CFX_DIBitmap>& pDeviceBitmap,
173 pdfium::span<uint8_t> src_span,
175 void Resample(
const RetainPtr<CFX_DIBitmap>& pDeviceBitmap,
181 FXCODEC_IMAGE_TYPE m_imageType = FXCODEC_IMAGE_UNKNOWN;
184 RetainPtr<CFX_CodecMemory> m_pCodecMemory;
185 DataVector<uint8_t> m_DecodeBuf;
186 DataVector<FX_ARGB> m_SrcPalette;
187 std::unique_ptr<ProgressiveDecoderIface::Context> m_pJpegContext;
188#ifdef PDF_ENABLE_XFA_BMP
189 std::unique_ptr<ProgressiveDecoderIface::Context> m_pBmpContext;
191#ifdef PDF_ENABLE_XFA_GIF
192 std::unique_ptr<ProgressiveDecoderIface::Context> m_pGifContext;
194#ifdef PDF_ENABLE_XFA_PNG
195 std::unique_ptr<ProgressiveDecoderIface::Context> m_pPngContext;
197#ifdef PDF_ENABLE_XFA_TIFF
198 std::unique_ptr<ProgressiveDecoderIface::Context> m_pTiffContext;
200 uint32_t m_offSet = 0;
201 int m_ScanlineSize = 0;
202 WeightTable m_WeightHorz;
205 int m_SrcComponents = 0;
207 TransformMethod m_TransMethod;
210 int m_SrcPassNumber = 0;
211 size_t m_FrameNumber = 0;
212 size_t m_FrameCur = 0;
213#ifdef PDF_ENABLE_XFA_GIF
214 int m_GifBgIndex = 0;
215 pdfium::span<CFX_GifPalette> m_GifPalette;
216 int m_GifTransIndex = -1;
217 FX_RECT m_GifFrameRect;
219#ifdef PDF_ENABLE_XFA_BMP
220 bool m_BmpIsTopBottom =
false;