1 // Copyright 2016 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_IMAGE_H_ 8 #define CORE_FPDFAPI_PAGE_CPDF_IMAGE_H_ 9 10 #include <stdint.h> 11 12 #include "core/fpdfapi/page/cpdf_colorspace.h" 13 #include "core/fxcrt/retain_ptr.h" 14 #include "core/fxcrt/span.h" 15 #include "core/fxcrt/unowned_ptr.h" 16 17 class CFX_DIBBase; 18 class CFX_DIBitmap; 19 class CPDF_DIB; 20 class CPDF_Dictionary; 21 class CPDF_Document; 22 class CPDF_Page; 23 class CPDF_Stream; 24 class PauseIndicatorIface; 25 class IFX_SeekableReadStream; 26 27 class CPDF_Image final : public Retainable { 28 public: 29 CONSTRUCT_VIA_MAKE_RETAIN; 30 31 static bool IsValidJpegComponent(int32_t comps); 32 static bool IsValidJpegBitsPerComponent(int32_t bpc); 33 34 // Can only be called when `IsInline()` returns true. 35 void ConvertStreamToIndirectObject(); 36 37 RetainPtr<const CPDF_Dictionary> GetDict() const; 38 RetainPtr<const CPDF_Stream> GetStream() const; 39 RetainPtr<const CPDF_Dictionary> GetOC() const; 40 41 // Never returns nullptr. GetDocument()42 CPDF_Document* GetDocument() const { return m_pDocument; } 43 GetPixelHeight()44 int32_t GetPixelHeight() const { return m_Height; } GetPixelWidth()45 int32_t GetPixelWidth() const { return m_Width; } GetMatteColor()46 uint32_t GetMatteColor() const { return m_MatteColor; } IsInline()47 bool IsInline() const { return m_bIsInline; } IsMask()48 bool IsMask() const { return m_bIsMask; } IsInterpol()49 bool IsInterpol() const { return m_bInterpolate; } 50 51 RetainPtr<CPDF_DIB> CreateNewDIB() const; 52 RetainPtr<CFX_DIBBase> LoadDIBBase() const; 53 54 void SetImage(const RetainPtr<CFX_DIBitmap>& pBitmap); 55 void SetJpegImage(RetainPtr<IFX_SeekableReadStream> pFile); 56 void SetJpegImageInline(RetainPtr<IFX_SeekableReadStream> pFile); 57 58 void ResetCache(CPDF_Page* pPage); 59 60 void WillBeDestroyed(); IsGoingToBeDestroyed()61 bool IsGoingToBeDestroyed() const { return m_bWillBeDestroyed; } 62 63 // Returns whether to Continue() or not. 64 bool StartLoadDIBBase(const CPDF_Dictionary* pFormResource, 65 const CPDF_Dictionary* pPageResource, 66 bool bStdCS, 67 CPDF_ColorSpace::Family GroupFamily, 68 bool bLoadMask, 69 const CFX_Size& max_size_required); 70 71 // Returns whether to Continue() or not. 72 bool Continue(PauseIndicatorIface* pPause); 73 74 RetainPtr<CFX_DIBBase> DetachBitmap(); 75 RetainPtr<CFX_DIBBase> DetachMask(); 76 77 private: 78 explicit CPDF_Image(CPDF_Document* pDoc); 79 CPDF_Image(CPDF_Document* pDoc, RetainPtr<CPDF_Stream> pStream); 80 CPDF_Image(CPDF_Document* pDoc, uint32_t dwStreamObjNum); 81 ~CPDF_Image() override; 82 83 void FinishInitialization(); 84 RetainPtr<CPDF_Dictionary> InitJPEG(pdfium::span<uint8_t> src_span); 85 RetainPtr<CPDF_Dictionary> CreateXObjectImageDict(int width, int height); 86 87 int32_t m_Height = 0; 88 int32_t m_Width = 0; 89 uint32_t m_MatteColor = 0; 90 bool m_bIsInline = false; 91 bool m_bIsMask = false; 92 bool m_bInterpolate = false; 93 bool m_bWillBeDestroyed = false; 94 UnownedPtr<CPDF_Document> const m_pDocument; 95 RetainPtr<CFX_DIBBase> m_pDIBBase; 96 RetainPtr<CFX_DIBBase> m_pMask; 97 RetainPtr<CPDF_Stream> m_pStream; 98 RetainPtr<const CPDF_Dictionary> m_pOC; 99 }; 100 101 #endif // CORE_FPDFAPI_PAGE_CPDF_IMAGE_H_ 102