• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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