• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 // Copyright 2017 The PDFium Authors
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 <stdint.h>
11 
12 #include <memory>
13 #include <vector>
14 
15 #include "core/fpdfapi/page/cpdf_colorspace.h"
16 #include "core/fxcrt/data_vector.h"
17 #include "core/fxcrt/retain_ptr.h"
18 #include "core/fxcrt/span.h"
19 #include "core/fxcrt/unowned_ptr.h"
20 #include "core/fxge/dib/cfx_dibbase.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   CONSTRUCT_VIA_MAKE_RETAIN;
46 
47   // CFX_DIBBase:
48   pdfium::span<const uint8_t> GetScanline(int line) const override;
49   bool SkipToScanline(int line, PauseIndicatorIface* pPause) const override;
50   size_t GetEstimatedImageMemoryBurden() const override;
51 
GetColorSpace()52   RetainPtr<CPDF_ColorSpace> GetColorSpace() const { return m_pColorSpace; }
GetMatteColor()53   uint32_t GetMatteColor() const { return m_MatteColor; }
54   bool IsJBigImage() const;
55 
56   bool Load();
57   LoadState StartLoadDIBBase(bool bHasMask,
58                              const CPDF_Dictionary* pFormResources,
59                              const CPDF_Dictionary* pPageResources,
60                              bool bStdCS,
61                              CPDF_ColorSpace::Family GroupFamily,
62                              bool bLoadMask,
63                              const CFX_Size& max_size_required);
64   LoadState ContinueLoadDIBBase(PauseIndicatorIface* pPause);
65   RetainPtr<CPDF_DIB> DetachMask();
66 
67  private:
68   CPDF_DIB(CPDF_Document* pDoc, RetainPtr<const CPDF_Stream> pStream);
69   ~CPDF_DIB() override;
70 
71   struct JpxSMaskInlineData {
72     JpxSMaskInlineData();
73     ~JpxSMaskInlineData();
74 
75     int width = 0;
76     int height = 0;
77     DataVector<uint8_t> data;
78   };
79 
80   bool LoadInternal(const CPDF_Dictionary* pFormResources,
81                     const CPDF_Dictionary* pPageResources);
82   bool ContinueInternal();
83   LoadState StartLoadMask();
84   LoadState StartLoadMaskDIB(RetainPtr<const CPDF_Stream> mask_stream);
85   bool ContinueToLoadMask();
86   LoadState ContinueLoadMaskDIB(PauseIndicatorIface* pPause);
87   bool LoadColorInfo(const CPDF_Dictionary* pFormResources,
88                      const CPDF_Dictionary* pPageResources);
89   bool GetDecodeAndMaskArray();
90   RetainPtr<CFX_DIBitmap> LoadJpxBitmap(uint8_t resolution_levels_to_skip);
91   void LoadPalette();
92   LoadState CreateDecoder(uint8_t resolution_levels_to_skip);
93   bool CreateDCTDecoder(pdfium::span<const uint8_t> src_span,
94                         const CPDF_Dictionary* pParams);
95   void TranslateScanline24bpp(pdfium::span<uint8_t> dest_scan,
96                               pdfium::span<const uint8_t> src_scan) const;
97   bool TranslateScanline24bppDefaultDecode(
98       pdfium::span<uint8_t> dest_scan,
99       pdfium::span<const uint8_t> src_scan) const;
100   bool ValidateDictParam(const ByteString& filter);
101   bool TransMask() const;
102   void SetMaskProperties();
103 
104   uint32_t Get1BitSetValue() const;
105   uint32_t Get1BitResetValue() const;
106 
107   UnownedPtr<CPDF_Document> const m_pDocument;
108   RetainPtr<const CPDF_Stream> const m_pStream;
109   RetainPtr<const CPDF_Dictionary> m_pDict;
110   RetainPtr<CPDF_StreamAcc> m_pStreamAcc;
111   RetainPtr<CPDF_ColorSpace> m_pColorSpace;
112   uint32_t m_bpc = 0;
113   uint32_t m_bpc_orig = 0;
114   uint32_t m_nComponents = 0;
115   CPDF_ColorSpace::Family m_Family = CPDF_ColorSpace::Family::kUnknown;
116   CPDF_ColorSpace::Family m_GroupFamily = CPDF_ColorSpace::Family::kUnknown;
117   uint32_t m_MatteColor = 0;
118   LoadState m_Status = LoadState::kFail;
119   bool m_bLoadMask = false;
120   bool m_bDefaultDecode = true;
121   bool m_bImageMask = false;
122   bool m_bDoBpcCheck = true;
123   bool m_bColorKey = false;
124   bool m_bHasMask = false;
125   bool m_bStdCS = false;
126   std::vector<DIB_COMP_DATA> m_CompData;
127   mutable DataVector<uint8_t> m_LineBuf;
128   mutable DataVector<uint8_t> m_MaskBuf;
129   RetainPtr<CFX_DIBitmap> m_pCachedBitmap;
130   // Note: Must not create a cycle between CPDF_DIB instances.
131   RetainPtr<CPDF_DIB> m_pMask;
132   RetainPtr<CPDF_StreamAcc> m_pGlobalAcc;
133   std::unique_ptr<fxcodec::ScanlineDecoder> m_pDecoder;
134   JpxSMaskInlineData m_JpxInlineData;
135 
136   // Must come after |m_pCachedBitmap|.
137   std::unique_ptr<fxcodec::Jbig2Context> m_pJbig2Context;
138 };
139 
140 #endif  // CORE_FPDFAPI_PAGE_CPDF_DIB_H_
141