1 // Copyright 2014 PDFium Authors. All rights reserved.
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_INCLUDE_FPDFAPI_FPDF_PAGE_H_
8 #define CORE_INCLUDE_FPDFAPI_FPDF_PAGE_H_
9 
10 #include "core/include/fxge/fx_dib.h"
11 #include "fpdf_parser.h"
12 #include "fpdf_resource.h"
13 
14 class CPDF_PageObjects;
15 class CPDF_Page;
16 class CPDF_Form;
17 class CPDF_ParseOptions;
18 class CPDF_PageObject;
19 class CPDF_PageRenderCache;
20 class CPDF_StreamFilter;
21 class CPDF_AllStates;
22 class CPDF_ContentParser;
23 class CPDF_StreamContentParser;
24 #define PDFTRANS_GROUP 0x0100
25 #define PDFTRANS_ISOLATED 0x0200
26 #define PDFTRANS_KNOCKOUT 0x0400
27 
28 class CPDF_PageObjects {
29  public:
30   CPDF_PageObjects(FX_BOOL bReleaseMembers = TRUE);
31   ~CPDF_PageObjects();
32 
33   void ContinueParse(IFX_Pause* pPause);
34 
IsParsed()35   FX_BOOL IsParsed() const { return m_ParseState == CONTENT_PARSED; }
36 
GetFirstObjectPosition()37   FX_POSITION GetFirstObjectPosition() const {
38     return m_ObjectList.GetHeadPosition();
39   }
40 
GetLastObjectPosition()41   FX_POSITION GetLastObjectPosition() const {
42     return m_ObjectList.GetTailPosition();
43   }
44 
GetNextObject(FX_POSITION & pos)45   CPDF_PageObject* GetNextObject(FX_POSITION& pos) const {
46     return (CPDF_PageObject*)m_ObjectList.GetNext(pos);
47   }
48 
GetPrevObject(FX_POSITION & pos)49   CPDF_PageObject* GetPrevObject(FX_POSITION& pos) const {
50     return (CPDF_PageObject*)m_ObjectList.GetPrev(pos);
51   }
52 
GetObjectAt(FX_POSITION pos)53   CPDF_PageObject* GetObjectAt(FX_POSITION pos) const {
54     return (CPDF_PageObject*)m_ObjectList.GetAt(pos);
55   }
56 
CountObjects()57   FX_DWORD CountObjects() const { return m_ObjectList.GetCount(); }
58 
59   int GetObjectIndex(CPDF_PageObject* pObj) const;
60 
61   CPDF_PageObject* GetObjectByIndex(int index) const;
62 
63   FX_POSITION InsertObject(FX_POSITION posInsertAfter,
64                            CPDF_PageObject* pNewObject);
65 
66   void Transform(const CFX_Matrix& matrix);
67 
BackgroundAlphaNeeded()68   FX_BOOL BackgroundAlphaNeeded() const { return m_bBackgroundAlphaNeeded; }
69 
HasImageMask()70   FX_BOOL HasImageMask() const { return m_bHasImageMask; }
71 
72   CFX_FloatRect CalcBoundingBox() const;
73 
74   CPDF_Dictionary* m_pFormDict;
75   CPDF_Stream* m_pFormStream;
76   CPDF_Document* m_pDocument;
77   CPDF_Dictionary* m_pPageResources;
78   CPDF_Dictionary* m_pResources;
79   CFX_FloatRect m_BBox;
80   int m_Transparency;
81 
82  protected:
83   friend class CPDF_ContentParser;
84   friend class CPDF_StreamContentParser;
85   friend class CPDF_AllStates;
86 
87   enum ParseState { CONTENT_NOT_PARSED, CONTENT_PARSING, CONTENT_PARSED };
88 
89   void LoadTransInfo();
90   void ClearCacheObjects();
91 
92   CFX_PtrList m_ObjectList;
93   FX_BOOL m_bBackgroundAlphaNeeded;
94   FX_BOOL m_bHasImageMask;
95   FX_BOOL m_bReleaseMembers;
96   CPDF_ContentParser* m_pParser;
97   ParseState m_ParseState;
98 };
99 
100 class CPDF_Page : public CPDF_PageObjects, public CFX_PrivateData {
101  public:
102   CPDF_Page();
103   ~CPDF_Page();
104 
105   void Load(CPDF_Document* pDocument,
106             CPDF_Dictionary* pPageDict,
107             FX_BOOL bPageCache = TRUE);
108 
109   void StartParse(CPDF_ParseOptions* pOptions = NULL, FX_BOOL bReParse = FALSE);
110   void ParseContent(CPDF_ParseOptions* pOptions = NULL,
111                     FX_BOOL bReParse = FALSE);
112 
113   void GetDisplayMatrix(CFX_Matrix& matrix,
114                         int xPos,
115                         int yPos,
116                         int xSize,
117                         int ySize,
118                         int iRotate) const;
119 
GetPageWidth()120   FX_FLOAT GetPageWidth() const { return m_PageWidth; }
GetPageHeight()121   FX_FLOAT GetPageHeight() const { return m_PageHeight; }
GetPageBBox()122   CFX_FloatRect GetPageBBox() const { return m_BBox; }
GetPageMatrix()123   const CFX_Matrix& GetPageMatrix() const { return m_PageMatrix; }
124   CPDF_Object* GetPageAttr(const CFX_ByteStringC& name) const;
GetRenderCache()125   CPDF_PageRenderCache* GetRenderCache() const { return m_pPageRender; }
126 
127  protected:
128   friend class CPDF_ContentParser;
129   FX_FLOAT m_PageWidth;
130   FX_FLOAT m_PageHeight;
131   CFX_Matrix m_PageMatrix;
132   CPDF_PageRenderCache* m_pPageRender;
133 };
134 class CPDF_ParseOptions {
135  public:
136   CPDF_ParseOptions();
137 
138   FX_BOOL m_bTextOnly;
139 
140   FX_BOOL m_bMarkedContent;
141 
142   FX_BOOL m_bSeparateForm;
143 
144   FX_BOOL m_bDecodeInlineImage;
145 };
146 class CPDF_Form : public CPDF_PageObjects {
147  public:
148   CPDF_Form(CPDF_Document* pDocument,
149             CPDF_Dictionary* pPageResources,
150             CPDF_Stream* pFormStream,
151             CPDF_Dictionary* pParentResources = NULL);
152 
153   ~CPDF_Form();
154 
155   void StartParse(CPDF_AllStates* pGraphicStates,
156                   CFX_Matrix* pParentMatrix,
157                   CPDF_Type3Char* pType3Char,
158                   CPDF_ParseOptions* pOptions,
159                   int level = 0);
160 
161   void ParseContent(CPDF_AllStates* pGraphicStates,
162                     CFX_Matrix* pParentMatrix,
163                     CPDF_Type3Char* pType3Char,
164                     CPDF_ParseOptions* pOptions,
165                     int level = 0);
166 
167   CPDF_Form* Clone() const;
168 };
169 class CPDF_PageContentGenerate {
170  public:
171   CPDF_PageContentGenerate(CPDF_Page* pPage);
172   ~CPDF_PageContentGenerate();
173   FX_BOOL InsertPageObject(CPDF_PageObject* pPageObject);
174   void GenerateContent();
175   void TransformContent(CFX_Matrix& matrix);
176 
177  protected:
178   void ProcessImage(CFX_ByteTextBuf& buf, CPDF_ImageObject* pImageObj);
179   void ProcessForm(CFX_ByteTextBuf& buf,
180                    const uint8_t* data,
181                    FX_DWORD size,
182                    CFX_Matrix& matrix);
183   CFX_ByteString RealizeResource(CPDF_Object* pResourceObj,
184                                  const FX_CHAR* szType);
185 
186  private:
187   CPDF_Page* m_pPage;
188   CPDF_Document* m_pDocument;
189   CFX_ArrayTemplate<CPDF_PageObject*> m_pageObjects;
190 };
191 
192 #endif  // CORE_INCLUDE_FPDFAPI_FPDF_PAGE_H_
193