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