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.
5 // Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
7 #ifndef CORE_INCLUDE_FPDFAPI_FPDF_PAGE_H_
8 #define CORE_INCLUDE_FPDFAPI_FPDF_PAGE_H_
10 #include "../fxge/fx_dib.h"
11 #include "fpdf_parser.h"
12 #include "fpdf_resource.h"
14 class CPDF_PageObjects;
17 class CPDF_ParseOptions;
18 class CPDF_PageObject;
19 class CPDF_PageRenderCache;
20 class CPDF_StreamFilter;
22 class CPDF_ContentParser;
23 class CPDF_StreamContentParser;
24 #define PDFTRANS_GROUP 0x0100
25 #define PDFTRANS_ISOLATED 0x0200
26 #define PDFTRANS_KNOCKOUT 0x0400
28 class CPDF_PageObjects {
30 CPDF_PageObjects(FX_BOOL bReleaseMembers = TRUE);
33 void ContinueParse(IFX_Pause* pPause);
35 FX_BOOL IsParsed() const { return m_ParseState == CONTENT_PARSED; }
37 FX_POSITION GetFirstObjectPosition() const {
38 return m_ObjectList.GetHeadPosition();
41 FX_POSITION GetLastObjectPosition() const {
42 return m_ObjectList.GetTailPosition();
45 CPDF_PageObject* GetNextObject(FX_POSITION& pos) const {
46 return (CPDF_PageObject*)m_ObjectList.GetNext(pos);
49 CPDF_PageObject* GetPrevObject(FX_POSITION& pos) const {
50 return (CPDF_PageObject*)m_ObjectList.GetPrev(pos);
53 CPDF_PageObject* GetObjectAt(FX_POSITION pos) const {
54 return (CPDF_PageObject*)m_ObjectList.GetAt(pos);
57 FX_DWORD CountObjects() const { return m_ObjectList.GetCount(); }
59 int GetObjectIndex(CPDF_PageObject* pObj) const;
61 CPDF_PageObject* GetObjectByIndex(int index) const;
63 FX_POSITION InsertObject(FX_POSITION posInsertAfter,
64 CPDF_PageObject* pNewObject);
66 void Transform(const CFX_AffineMatrix& matrix);
68 FX_BOOL BackgroundAlphaNeeded() const { return m_bBackgroundAlphaNeeded; }
70 CFX_FloatRect CalcBoundingBox() const;
72 CPDF_Dictionary* m_pFormDict;
73 CPDF_Stream* m_pFormStream;
74 CPDF_Document* m_pDocument;
75 CPDF_Dictionary* m_pPageResources;
76 CPDF_Dictionary* m_pResources;
81 friend class CPDF_ContentParser;
82 friend class CPDF_StreamContentParser;
83 friend class CPDF_AllStates;
85 enum ParseState { CONTENT_NOT_PARSED, CONTENT_PARSING, CONTENT_PARSED };
88 void ClearCacheObjects();
90 CFX_PtrList m_ObjectList;
91 FX_BOOL m_bBackgroundAlphaNeeded;
92 FX_BOOL m_bReleaseMembers;
93 CPDF_ContentParser* m_pParser;
94 ParseState m_ParseState;
97 class CPDF_Page : public CPDF_PageObjects, public CFX_PrivateData {
103 void Load(CPDF_Document* pDocument,
104 CPDF_Dictionary* pPageDict,
105 FX_BOOL bPageCache = TRUE);
107 void StartParse(CPDF_ParseOptions* pOptions = NULL, FX_BOOL bReParse = FALSE);
109 void ParseContent(CPDF_ParseOptions* pOptions = NULL,
110 FX_BOOL bReParse = FALSE);
112 void GetDisplayMatrix(CFX_AffineMatrix& matrix,
119 FX_FLOAT GetPageWidth() const { return m_PageWidth; }
121 FX_FLOAT GetPageHeight() const { return m_PageHeight; }
123 CFX_FloatRect GetPageBBox() const { return m_BBox; }
125 const CFX_AffineMatrix& GetPageMatrix() const { return m_PageMatrix; }
127 CPDF_Object* GetPageAttr(const CFX_ByteStringC& name) const;
129 CPDF_PageRenderCache* GetRenderCache() const { return m_pPageRender; }
131 void ClearRenderCache();
134 friend class CPDF_ContentParser;
136 FX_FLOAT m_PageWidth;
138 FX_FLOAT m_PageHeight;
140 CFX_AffineMatrix m_PageMatrix;
142 CPDF_PageRenderCache* m_pPageRender;
144 class CPDF_ParseOptions {
150 FX_BOOL m_bMarkedContent;
152 FX_BOOL m_bSeparateForm;
154 FX_BOOL m_bDecodeInlineImage;
156 class CPDF_Form : public CPDF_PageObjects {
158 CPDF_Form(CPDF_Document* pDocument,
159 CPDF_Dictionary* pPageResources,
160 CPDF_Stream* pFormStream,
161 CPDF_Dictionary* pParentResources = NULL);
165 void StartParse(CPDF_AllStates* pGraphicStates,
166 CFX_AffineMatrix* pParentMatrix,
167 CPDF_Type3Char* pType3Char,
168 CPDF_ParseOptions* pOptions,
171 void ParseContent(CPDF_AllStates* pGraphicStates,
172 CFX_AffineMatrix* pParentMatrix,
173 CPDF_Type3Char* pType3Char,
174 CPDF_ParseOptions* pOptions,
177 CPDF_Form* Clone() const;
179 class CPDF_PageContentGenerate {
181 CPDF_PageContentGenerate(CPDF_Page* pPage);
182 ~CPDF_PageContentGenerate();
183 FX_BOOL InsertPageObject(CPDF_PageObject* pPageObject);
184 void GenerateContent();
185 void TransformContent(CFX_Matrix& matrix);
188 void ProcessImage(CFX_ByteTextBuf& buf, CPDF_ImageObject* pImageObj);
189 void ProcessForm(CFX_ByteTextBuf& buf,
193 CFX_ByteString RealizeResource(CPDF_Object* pResourceObj,
194 const FX_CHAR* szType);
198 CPDF_Document* m_pDocument;
199 CFX_PtrArray m_pageObjects;
202 #endif // CORE_INCLUDE_FPDFAPI_FPDF_PAGE_H_