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
10 #include "fpdf_parser.h"
12 #ifndef _FPDF_RESOURCE_
13 #include "fpdf_resource.h"
16 #include "../fxge/fx_dib.h"
18 class CPDF_PageObjects;
21 class CPDF_ParseOptions;
22 class CPDF_PageObject;
23 class CPDF_PageRenderCache;
24 class CPDF_StreamFilter;
26 class CPDF_ContentParser;
27 class CPDF_StreamContentParser;
28 class CPDF_ResourceNaming;
29 #define PDFTRANS_GROUP 0x0100
30 #define PDFTRANS_ISOLATED 0x0200
31 #define PDFTRANS_KNOCKOUT 0x0400
32 #define PDF_CONTENT_NOT_PARSED 0
33 #define PDF_CONTENT_PARSING 1
34 #define PDF_CONTENT_PARSED 2
35 class CPDF_PageObjects : public CFX_Object
39 CPDF_PageObjects(FX_BOOL bReleaseMembers = TRUE);
46 void ContinueParse(IFX_Pause* pPause);
48 int GetParseState() const
53 FX_BOOL IsParsed() const
55 return m_ParseState == PDF_CONTENT_PARSED;
58 int EstimateParseProgress() const;
63 FX_POSITION GetFirstObjectPosition() const
65 return m_ObjectList.GetHeadPosition();
68 FX_POSITION GetLastObjectPosition() const
70 return m_ObjectList.GetTailPosition();
73 CPDF_PageObject* GetNextObject(FX_POSITION& pos) const
75 return (CPDF_PageObject*)m_ObjectList.GetNext(pos);
78 CPDF_PageObject* GetPrevObject(FX_POSITION& pos) const
80 return (CPDF_PageObject*)m_ObjectList.GetPrev(pos);
83 CPDF_PageObject* GetObjectAt(FX_POSITION pos) const
85 return (CPDF_PageObject*)m_ObjectList.GetAt(pos);
88 FX_DWORD CountObjects() const
90 return m_ObjectList.GetCount();
93 int GetObjectIndex(CPDF_PageObject* pObj) const;
95 CPDF_PageObject* GetObjectByIndex(int index) const;
101 FX_POSITION InsertObject(FX_POSITION posInsertAfter, CPDF_PageObject* pNewObject);
103 void Transform(const CFX_AffineMatrix& matrix);
105 FX_BOOL BackgroundAlphaNeeded() const
107 return m_bBackgroundAlphaNeeded;
110 CFX_FloatRect CalcBoundingBox() const;
112 CPDF_Dictionary* m_pFormDict;
114 CPDF_Stream* m_pFormStream;
116 CPDF_Document* m_pDocument;
118 CPDF_Dictionary* m_pPageResources;
120 CPDF_Dictionary* m_pResources;
122 CFX_FloatRect m_BBox;
127 friend class CPDF_ContentParser;
128 friend class CPDF_StreamContentParser;
129 friend class CPDF_AllStates;
131 CFX_PtrList m_ObjectList;
133 FX_BOOL m_bBackgroundAlphaNeeded;
135 FX_BOOL m_bReleaseMembers;
136 void LoadTransInfo();
137 void ClearCacheObjects();
139 CPDF_ContentParser* m_pParser;
141 FX_BOOL m_ParseState;
143 class CPDF_Page : public CPDF_PageObjects, public CFX_PrivateData
151 void Load(CPDF_Document* pDocument, CPDF_Dictionary* pPageDict, FX_BOOL bPageCache = TRUE);
153 void StartParse(CPDF_ParseOptions* pOptions = NULL, FX_BOOL bReParse = FALSE);
155 void ParseContent(CPDF_ParseOptions* pOptions = NULL, FX_BOOL bReParse = FALSE);
157 void GetDisplayMatrix(CFX_AffineMatrix& matrix, int xPos, int yPos,
158 int xSize, int ySize, int iRotate) const;
160 FX_FLOAT GetPageWidth() const
165 FX_FLOAT GetPageHeight() const
170 CFX_FloatRect GetPageBBox() const
175 const CFX_AffineMatrix& GetPageMatrix() const
180 CPDF_Object* GetPageAttr(FX_BSTR name) const;
184 CPDF_PageRenderCache* GetRenderCache() const
186 return m_pPageRender;
189 void ClearRenderCache();
192 friend class CPDF_ContentParser;
194 FX_FLOAT m_PageWidth;
196 FX_FLOAT m_PageHeight;
198 CFX_AffineMatrix m_PageMatrix;
200 CPDF_PageRenderCache* m_pPageRender;
202 class CPDF_ParseOptions : public CFX_Object
210 FX_BOOL m_bMarkedContent;
212 FX_BOOL m_bSeparateForm;
214 FX_BOOL m_bDecodeInlineImage;
216 class CPDF_Form : public CPDF_PageObjects
220 CPDF_Form(CPDF_Document* pDocument, CPDF_Dictionary* pPageResources, CPDF_Stream* pFormStream, CPDF_Dictionary* pParentResources = NULL);
224 void StartParse(CPDF_AllStates* pGraphicStates, CFX_AffineMatrix* pParentMatrix,
225 CPDF_Type3Char* pType3Char, CPDF_ParseOptions* pOptions, int level = 0);
227 void ParseContent(CPDF_AllStates* pGraphicStates, CFX_AffineMatrix* pParentMatrix,
228 CPDF_Type3Char* pType3Char, CPDF_ParseOptions* pOptions, int level = 0);
230 CPDF_Form* Clone() const;
232 class CPDF_PageContentGenerate : public CFX_Object
235 CPDF_PageContentGenerate(CPDF_Page* pPage);
236 ~CPDF_PageContentGenerate();
237 FX_BOOL InsertPageObject(CPDF_PageObject* pPageObject);
238 void GenerateContent();
239 void TransformContent(CFX_Matrix& matrix);
241 void ProcessImage(CFX_ByteTextBuf& buf, CPDF_ImageObject* pImageObj);
242 void ProcessForm(CFX_ByteTextBuf& buf, FX_LPCBYTE data, FX_DWORD size, CFX_Matrix& matrix);
243 CFX_ByteString RealizeResource(CPDF_Object* pResourceObj, const FX_CHAR* szType);
246 CPDF_Document* m_pDocument;
247 CFX_PtrArray m_pageObjects;