1 // Copyright 2017 PDFium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file.
4 
5 // Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
6 
7 #ifndef CORE_FPDFAPI_RENDER_CPDF_DIBSOURCE_H_
8 #define CORE_FPDFAPI_RENDER_CPDF_DIBSOURCE_H_
9 
10 #include <map>
11 #include <memory>
12 #include <vector>
13 
14 #include "core/fpdfapi/page/cpdf_clippath.h"
15 #include "core/fpdfapi/page/cpdf_countedobject.h"
16 #include "core/fpdfapi/page/cpdf_graphicstates.h"
17 #include "core/fpdfapi/parser/cpdf_stream_acc.h"
18 #include "core/fpdfapi/render/cpdf_imageloader.h"
19 #include "core/fpdfapi/render/cpdf_rendercontext.h"
20 #include "core/fpdfapi/render/cpdf_renderoptions.h"
21 #include "core/fxge/cfx_fxgedevice.h"
22 #include "core/fxge/cfx_renderdevice.h"
23 
24 class CCodec_Jbig2Context;
25 class CCodec_ScanlineDecoder;
26 class CPDF_Color;
27 class CPDF_Dictionary;
28 class CPDF_Document;
29 class CPDF_Stream;
30 
31 typedef struct {
32   FX_FLOAT m_DecodeMin;
33   FX_FLOAT m_DecodeStep;
34   int m_ColorKeyMin;
35   int m_ColorKeyMax;
36 } DIB_COMP_DATA;
37 
38 #define FPDF_HUGE_IMAGE_SIZE 60000000
39 
40 class CPDF_DIBSource : public CFX_DIBSource {
41  public:
42   CPDF_DIBSource();
43   ~CPDF_DIBSource() override;
44 
45   bool Load(CPDF_Document* pDoc, const CPDF_Stream* pStream);
46 
47   // CFX_DIBSource
48   bool SkipToScanline(int line, IFX_Pause* pPause) const override;
49   uint8_t* GetBuffer() const override;
50   const uint8_t* GetScanline(int line) const override;
51   void DownSampleScanline(int line,
52                           uint8_t* dest_scan,
53                           int dest_bpp,
54                           int dest_width,
55                           bool bFlipX,
56                           int clip_left,
57                           int clip_width) const override;
58 
GetMatteColor()59   uint32_t GetMatteColor() const { return m_MatteColor; }
60 
61   int StartLoadDIBSource(CPDF_Document* pDoc,
62                          const CPDF_Stream* pStream,
63                          bool bHasMask,
64                          CPDF_Dictionary* pFormResources,
65                          CPDF_Dictionary* pPageResources,
66                          bool bStdCS = false,
67                          uint32_t GroupFamily = 0,
68                          bool bLoadMask = false);
69   int ContinueLoadDIBSource(IFX_Pause* pPause);
70   int StratLoadMask();
71   int StartLoadMaskDIB();
72   int ContinueLoadMaskDIB(IFX_Pause* pPause);
73   int ContinueToLoadMask();
74   CPDF_DIBSource* DetachMask();
75 
76  private:
77   bool LoadColorInfo(const CPDF_Dictionary* pFormResources,
78                      const CPDF_Dictionary* pPageResources);
79   DIB_COMP_DATA* GetDecodeAndMaskArray(bool& bDefaultDecode, bool& bColorKey);
80   void LoadJpxBitmap();
81   void LoadPalette();
82   int CreateDecoder();
83   void TranslateScanline24bpp(uint8_t* dest_scan,
84                               const uint8_t* src_scan) const;
85   void ValidateDictParam();
86   void DownSampleScanline1Bit(int orig_Bpp,
87                               int dest_Bpp,
88                               uint32_t src_width,
89                               const uint8_t* pSrcLine,
90                               uint8_t* dest_scan,
91                               int dest_width,
92                               bool bFlipX,
93                               int clip_left,
94                               int clip_width) const;
95   void DownSampleScanline8Bit(int orig_Bpp,
96                               int dest_Bpp,
97                               uint32_t src_width,
98                               const uint8_t* pSrcLine,
99                               uint8_t* dest_scan,
100                               int dest_width,
101                               bool bFlipX,
102                               int clip_left,
103                               int clip_width) const;
104   void DownSampleScanline32Bit(int orig_Bpp,
105                                int dest_Bpp,
106                                uint32_t src_width,
107                                const uint8_t* pSrcLine,
108                                uint8_t* dest_scan,
109                                int dest_width,
110                                bool bFlipX,
111                                int clip_left,
112                                int clip_width) const;
113   bool TransMask() const;
114 
115   CPDF_Document* m_pDocument;
116   const CPDF_Stream* m_pStream;
117   std::unique_ptr<CPDF_StreamAcc> m_pStreamAcc;
118   const CPDF_Dictionary* m_pDict;
119   CPDF_ColorSpace* m_pColorSpace;
120   uint32_t m_Family;
121   uint32_t m_bpc;
122   uint32_t m_bpc_orig;
123   uint32_t m_nComponents;
124   uint32_t m_GroupFamily;
125   uint32_t m_MatteColor;
126   bool m_bLoadMask;
127   bool m_bDefaultDecode;
128   bool m_bImageMask;
129   bool m_bDoBpcCheck;
130   bool m_bColorKey;
131   bool m_bHasMask;
132   bool m_bStdCS;
133   DIB_COMP_DATA* m_pCompData;
134   uint8_t* m_pLineBuf;
135   uint8_t* m_pMaskedLine;
136   std::unique_ptr<CFX_DIBitmap> m_pCachedBitmap;
137   std::unique_ptr<CCodec_ScanlineDecoder> m_pDecoder;
138   CPDF_DIBSource* m_pMask;
139   std::unique_ptr<CPDF_StreamAcc> m_pGlobalStream;
140   std::unique_ptr<CCodec_Jbig2Context> m_pJbig2Context;
141   CPDF_Stream* m_pMaskStream;
142   int m_Status;
143 };
144 
145 #endif  // CORE_FPDFAPI_RENDER_CPDF_DIBSOURCE_H_
146