Fix infinite recursion in CPDF_Parser::ParseIndirectObjectAt().
[pdfium.git] / core / include / fpdfapi / fpdf_page.h
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 _FPDF_PAGE_
8 #define _FPDF_PAGE_
9 #ifndef _FPDF_PARSER_
10 #include "fpdf_parser.h"
11 #endif
12 #ifndef _FPDF_RESOURCE_
13 #include "fpdf_resource.h"
14 #endif
15 #ifndef _FX_DIB_H_
16 #include "../fxge/fx_dib.h"
17 #endif
18 class CPDF_PageObjects;
19 class CPDF_Page;
20 class CPDF_Form;
21 class CPDF_ParseOptions;
22 class CPDF_PageObject;
23 class CPDF_PageRenderCache;
24 class CPDF_StreamFilter;
25 class CPDF_AllStates;
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
36 {
37 public:
38
39     CPDF_PageObjects(FX_BOOL bReleaseMembers = TRUE);
40
41     ~CPDF_PageObjects();
42
43
44
45
46     void                                ContinueParse(IFX_Pause* pPause);
47
48     int                                 GetParseState() const
49     {
50         return m_ParseState;
51     }
52
53     FX_BOOL                             IsParsed() const
54     {
55         return m_ParseState == PDF_CONTENT_PARSED;
56     }
57
58     int                                 EstimateParseProgress() const;
59
60
61
62
63     FX_POSITION                 GetFirstObjectPosition() const
64     {
65         return m_ObjectList.GetHeadPosition();
66     }
67
68     FX_POSITION                 GetLastObjectPosition() const
69     {
70         return m_ObjectList.GetTailPosition();
71     }
72
73     CPDF_PageObject*    GetNextObject(FX_POSITION& pos) const
74     {
75         return (CPDF_PageObject*)m_ObjectList.GetNext(pos);
76     }
77
78     CPDF_PageObject*    GetPrevObject(FX_POSITION& pos) const
79     {
80         return (CPDF_PageObject*)m_ObjectList.GetPrev(pos);
81     }
82
83     CPDF_PageObject*    GetObjectAt(FX_POSITION pos) const
84     {
85         return (CPDF_PageObject*)m_ObjectList.GetAt(pos);
86     }
87
88     FX_DWORD                    CountObjects() const
89     {
90         return m_ObjectList.GetCount();
91     }
92
93     int                                 GetObjectIndex(CPDF_PageObject* pObj) const;
94
95     CPDF_PageObject*    GetObjectByIndex(int index) const;
96
97
98
99
100
101     FX_POSITION                 InsertObject(FX_POSITION posInsertAfter, CPDF_PageObject* pNewObject);
102
103     void                                Transform(const CFX_AffineMatrix& matrix);
104
105     FX_BOOL                             BackgroundAlphaNeeded() const
106     {
107         return m_bBackgroundAlphaNeeded;
108     }
109
110     CFX_FloatRect               CalcBoundingBox() const;
111
112     CPDF_Dictionary*    m_pFormDict;
113
114     CPDF_Stream*                m_pFormStream;
115
116     CPDF_Document*              m_pDocument;
117
118     CPDF_Dictionary*    m_pPageResources;
119
120     CPDF_Dictionary*    m_pResources;
121
122     CFX_FloatRect               m_BBox;
123
124     int                                 m_Transparency;
125
126 protected:
127     friend class                CPDF_ContentParser;
128     friend class                CPDF_StreamContentParser;
129     friend class                CPDF_AllStates;
130
131     CFX_PtrList                 m_ObjectList;
132
133     FX_BOOL                             m_bBackgroundAlphaNeeded;
134
135     FX_BOOL                             m_bReleaseMembers;
136     void                                LoadTransInfo();
137     void                ClearCacheObjects();
138
139     CPDF_ContentParser* m_pParser;
140
141     FX_BOOL                             m_ParseState;
142 };
143 class CPDF_Page : public CPDF_PageObjects, public CFX_PrivateData
144 {
145 public:
146
147     CPDF_Page();
148
149     ~CPDF_Page();
150
151     void                                Load(CPDF_Document* pDocument, CPDF_Dictionary* pPageDict, FX_BOOL bPageCache = TRUE);
152
153     void                                StartParse(CPDF_ParseOptions* pOptions = NULL, FX_BOOL bReParse = FALSE);
154
155     void                                ParseContent(CPDF_ParseOptions* pOptions = NULL, FX_BOOL bReParse = FALSE);
156
157     void                                GetDisplayMatrix(CFX_AffineMatrix& matrix, int xPos, int yPos,
158                                          int xSize, int ySize, int iRotate) const;
159
160     FX_FLOAT                    GetPageWidth() const
161     {
162         return m_PageWidth;
163     }
164
165     FX_FLOAT                    GetPageHeight() const
166     {
167         return m_PageHeight;
168     }
169
170     CFX_FloatRect               GetPageBBox() const
171     {
172         return m_BBox;
173     }
174
175     const CFX_AffineMatrix&     GetPageMatrix() const
176     {
177         return m_PageMatrix;
178     }
179
180     CPDF_Object*                GetPageAttr(FX_BSTR name) const;
181
182
183
184     CPDF_PageRenderCache*       GetRenderCache() const
185     {
186         return m_pPageRender;
187     }
188
189     void                                ClearRenderCache();
190
191 protected:
192     friend class                CPDF_ContentParser;
193
194     FX_FLOAT                    m_PageWidth;
195
196     FX_FLOAT                    m_PageHeight;
197
198     CFX_AffineMatrix    m_PageMatrix;
199
200     CPDF_PageRenderCache*       m_pPageRender;
201 };
202 class CPDF_ParseOptions : public CFX_Object
203 {
204 public:
205
206     CPDF_ParseOptions();
207
208     FX_BOOL                             m_bTextOnly;
209
210     FX_BOOL                             m_bMarkedContent;
211
212     FX_BOOL                             m_bSeparateForm;
213
214     FX_BOOL                             m_bDecodeInlineImage;
215 };
216 class CPDF_Form : public CPDF_PageObjects
217 {
218 public:
219
220     CPDF_Form(CPDF_Document* pDocument, CPDF_Dictionary* pPageResources, CPDF_Stream* pFormStream, CPDF_Dictionary* pParentResources = NULL);
221
222     ~CPDF_Form();
223
224     void                                StartParse(CPDF_AllStates* pGraphicStates,  CFX_AffineMatrix* pParentMatrix,
225                                    CPDF_Type3Char* pType3Char, CPDF_ParseOptions* pOptions, int level = 0);
226
227     void                                ParseContent(CPDF_AllStates* pGraphicStates, CFX_AffineMatrix* pParentMatrix,
228                                      CPDF_Type3Char* pType3Char, CPDF_ParseOptions* pOptions, int level = 0);
229
230     CPDF_Form*                  Clone() const;
231 };
232 class CPDF_PageContentGenerate : public CFX_Object
233 {
234 public:
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);
240 protected:
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);
244 private:
245     CPDF_Page*      m_pPage;
246     CPDF_Document*  m_pDocument;
247     CFX_PtrArray    m_pageObjects;
248 };
249 #endif