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
18class CPDF_PageObjects;
19class CPDF_Page;
20class CPDF_Form;
21class CPDF_ParseOptions;
22class CPDF_PageObject;
23class CPDF_PageRenderCache;
24class CPDF_StreamFilter;
25class CPDF_AllStates;
26class CPDF_ContentParser;
27class CPDF_StreamContentParser;
28class 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
35class CPDF_PageObjects : public CFX_Object
36{
37public:
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
126protected:
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};
143class CPDF_Page : public CPDF_PageObjects, public CFX_PrivateData
144{
145public:
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
191protected:
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};
202class CPDF_ParseOptions : public CFX_Object
203{
204public:
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};
216class CPDF_Form : public CPDF_PageObjects
217{
218public:
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};
232class CPDF_PageContentGenerate : public CFX_Object
233{
234public:
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);
240protected:
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);
244private:
245    CPDF_Page*      m_pPage;
246    CPDF_Document*  m_pDocument;
247    CFX_PtrArray    m_pageObjects;
248};
249#endif
250