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