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