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_PAGE_CPDF_DIB_H_
8 #define CORE_FPDFAPI_PAGE_CPDF_DIB_H_
9 
10 #include <memory>
11 #include <vector>
12 
13 #include "core/fpdfapi/page/cpdf_clippath.h"
14 #include "core/fpdfapi/page/cpdf_colorspace.h"
15 #include "core/fpdfapi/page/cpdf_graphicstates.h"
16 #include "core/fxcrt/fx_memory_wrappers.h"
17 #include "core/fxcrt/retain_ptr.h"
18 #include "core/fxcrt/unowned_ptr.h"
19 #include "core/fxge/dib/cfx_dibbase.h"
20 #include "third_party/base/span.h"
21 
22 class CPDF_Dictionary;
23 class CPDF_Document;
24 class CPDF_Stream;
25 class CPDF_StreamAcc;
26 
27 struct DIB_COMP_DATA {
28   float m_DecodeMin;
29   float m_DecodeStep;
30   int m_ColorKeyMin;
31   int m_ColorKeyMax;
32 };
33 
34 namespace fxcodec {
35 class Jbig2Context;
36 class ScanlineDecoder;
37 }  // namespace fxcodec
38 
39 constexpr size_t kHugeImageSize = 60000000;
40 
41 class CPDF_DIB final : public CFX_DIBBase {
42  public:
43   enum class LoadState : uint8_t { kFail, kSuccess, kContinue };
44 
45   template <typename T, typename... Args>
46   friend RetainPtr<T> pdfium::MakeRetain(Args&&... args);
47 
48   bool Load(CPDF_Document* pDoc, const CPDF_Stream* pStream);
49 
50   // CFX_DIBBase:
51   bool SkipToScanline(int line, PauseIndicatorIface* pPause) const override;
52   uint8_t* GetBuffer() const override;
53   const uint8_t* GetScanline(int line) const override;
54   void DownSampleScanline(int line,
55                           uint8_t* dest_scan,
56                           int dest_bpp,
57                           int dest_width,
58                           bool bFlipX,
59                           int clip_left,
60                           int clip_width) const override;
61 
GetColorSpace()62   RetainPtr<CPDF_ColorSpace> GetColorSpace() const { return m_pColorSpace; }
GetMatteColor()63   uint32_t GetMatteColor() const { return m_MatteColor; }
64 
65   LoadState StartLoadDIBBase(CPDF_Document* pDoc,
66                              const CPDF_Stream* pStream,
67                              bool bHasMask,
68                              const CPDF_Dictionary* pFormResources,
69                              CPDF_Dictionary* pPageResources,
70                              bool bStdCS,
71                              uint32_t GroupFamily,
72                              bool bLoadMask);
73   LoadState ContinueLoadDIBBase(PauseIndicatorIface* pPause);
74   RetainPtr<CPDF_DIB> DetachMask();
75 
76   bool IsJBigImage() const;
77 
78  private:
79   CPDF_DIB();
80   ~CPDF_DIB() override;
81 
82   LoadState StartLoadMask();
83   LoadState StartLoadMaskDIB(RetainPtr<const CPDF_Stream> mask);
84   bool ContinueToLoadMask();
85   LoadState ContinueLoadMaskDIB(PauseIndicatorIface* pPause);
86   bool LoadColorInfo(const CPDF_Dictionary* pFormResources,
87                      const CPDF_Dictionary* pPageResources);
88   bool GetDecodeAndMaskArray(bool* bDefaultDecode, bool* bColorKey);
89   RetainPtr<CFX_DIBitmap> LoadJpxBitmap();
90   void LoadPalette();
91   LoadState CreateDecoder();
92   bool CreateDCTDecoder(pdfium::span<const uint8_t> src_span,
93                         const CPDF_Dictionary* pParams);
94   void TranslateScanline24bpp(uint8_t* dest_scan,
95                               const uint8_t* src_scan) const;
96   bool TranslateScanline24bppDefaultDecode(uint8_t* dest_scan,
97                                            const uint8_t* src_scan) const;
98   void ValidateDictParam();
99   void DownSampleScanline1Bit(int orig_Bpp,
100                               int dest_Bpp,
101                               uint32_t src_width,
102                               const uint8_t* pSrcLine,
103                               uint8_t* dest_scan,
104                               int dest_width,
105                               bool bFlipX,
106                               int clip_left,
107                               int clip_width) const;
108   void DownSampleScanline8Bit(int orig_Bpp,
109                               int dest_Bpp,
110                               uint32_t src_width,
111                               const uint8_t* pSrcLine,
112                               uint8_t* dest_scan,
113                               int dest_width,
114                               bool bFlipX,
115                               int clip_left,
116                               int clip_width) const;
117   void DownSampleScanline32Bit(int orig_Bpp,
118                                int dest_Bpp,
119                                uint32_t src_width,
120                                const uint8_t* pSrcLine,
121                                uint8_t* dest_scan,
122                                int dest_width,
123                                bool bFlipX,
124                                int clip_left,
125                                int clip_width) const;
126   bool TransMask() const;
127   void SetMaskProperties();
128 
129   UnownedPtr<CPDF_Document> m_pDocument;
130   RetainPtr<const CPDF_Stream> m_pStream;
131   RetainPtr<const CPDF_Dictionary> m_pDict;
132   RetainPtr<CPDF_StreamAcc> m_pStreamAcc;
133   RetainPtr<CPDF_ColorSpace> m_pColorSpace;
134   uint32_t m_Family = 0;
135   uint32_t m_bpc = 0;
136   uint32_t m_bpc_orig = 0;
137   uint32_t m_nComponents = 0;
138   uint32_t m_GroupFamily = 0;
139   uint32_t m_MatteColor = 0;
140   LoadState m_Status = LoadState::kFail;
141   bool m_bLoadMask = false;
142   bool m_bDefaultDecode = true;
143   bool m_bImageMask = false;
144   bool m_bDoBpcCheck = true;
145   bool m_bColorKey = false;
146   bool m_bHasMask = false;
147   bool m_bStdCS = false;
148   std::vector<DIB_COMP_DATA> m_CompData;
149   std::unique_ptr<uint8_t, FxFreeDeleter> m_pLineBuf;
150   std::unique_ptr<uint8_t, FxFreeDeleter> m_pMaskedLine;
151   RetainPtr<CFX_DIBitmap> m_pCachedBitmap;
152   // Note: Must not create a cycle between CPDF_DIB instances.
153   RetainPtr<CPDF_DIB> m_pMask;
154   RetainPtr<CPDF_StreamAcc> m_pGlobalAcc;
155   std::unique_ptr<fxcodec::ScanlineDecoder> m_pDecoder;
156 
157   // Must come after |m_pCachedBitmap|.
158   std::unique_ptr<fxcodec::Jbig2Context> m_pJbig2Context;
159 };
160 
161 #endif  // CORE_FPDFAPI_PAGE_CPDF_DIB_H_
162