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