Revert "Revert "Fix the issue that pdfium swallows 'fi' or 'ff' in some pdf files""
[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 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
14 class CPDF_PageObjects;
15 class CPDF_Page;
16 class CPDF_Form;
17 class CPDF_ParseOptions;
18 class CPDF_PageObject;
19 class CPDF_PageRenderCache;
20 class CPDF_StreamFilter;
21 class CPDF_AllStates;
22 class CPDF_ContentParser;
23 class CPDF_StreamContentParser;
24 #define PDFTRANS_GROUP 0x0100
25 #define PDFTRANS_ISOLATED 0x0200
26 #define PDFTRANS_KNOCKOUT 0x0400
27
28 class CPDF_PageObjects {
29  public:
30   CPDF_PageObjects(FX_BOOL bReleaseMembers = TRUE);
31   ~CPDF_PageObjects();
32
33   void ContinueParse(IFX_Pause* pPause);
34
35   FX_BOOL IsParsed() const { return m_ParseState == CONTENT_PARSED; }
36
37   FX_POSITION GetFirstObjectPosition() const {
38     return m_ObjectList.GetHeadPosition();
39   }
40
41   FX_POSITION GetLastObjectPosition() const {
42     return m_ObjectList.GetTailPosition();
43   }
44
45   CPDF_PageObject* GetNextObject(FX_POSITION& pos) const {
46     return (CPDF_PageObject*)m_ObjectList.GetNext(pos);
47   }
48
49   CPDF_PageObject* GetPrevObject(FX_POSITION& pos) const {
50     return (CPDF_PageObject*)m_ObjectList.GetPrev(pos);
51   }
52
53   CPDF_PageObject* GetObjectAt(FX_POSITION pos) const {
54     return (CPDF_PageObject*)m_ObjectList.GetAt(pos);
55   }
56
57   FX_DWORD CountObjects() const { return m_ObjectList.GetCount(); }
58
59   int GetObjectIndex(CPDF_PageObject* pObj) const;
60
61   CPDF_PageObject* GetObjectByIndex(int index) const;
62
63   FX_POSITION InsertObject(FX_POSITION posInsertAfter,
64                            CPDF_PageObject* pNewObject);
65
66   void Transform(const CFX_AffineMatrix& matrix);
67
68   FX_BOOL BackgroundAlphaNeeded() const { return m_bBackgroundAlphaNeeded; }
69
70   CFX_FloatRect CalcBoundingBox() const;
71
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;
77   CFX_FloatRect m_BBox;
78   int m_Transparency;
79
80  protected:
81   friend class CPDF_ContentParser;
82   friend class CPDF_StreamContentParser;
83   friend class CPDF_AllStates;
84
85   enum ParseState { CONTENT_NOT_PARSED, CONTENT_PARSING, CONTENT_PARSED };
86
87   void LoadTransInfo();
88   void ClearCacheObjects();
89
90   CFX_PtrList m_ObjectList;
91   FX_BOOL m_bBackgroundAlphaNeeded;
92   FX_BOOL m_bReleaseMembers;
93   CPDF_ContentParser* m_pParser;
94   ParseState m_ParseState;
95 };
96
97 class CPDF_Page : public CPDF_PageObjects, public CFX_PrivateData {
98  public:
99   CPDF_Page();
100
101   ~CPDF_Page();
102
103   void Load(CPDF_Document* pDocument,
104             CPDF_Dictionary* pPageDict,
105             FX_BOOL bPageCache = TRUE);
106
107   void StartParse(CPDF_ParseOptions* pOptions = NULL, FX_BOOL bReParse = FALSE);
108
109   void ParseContent(CPDF_ParseOptions* pOptions = NULL,
110                     FX_BOOL bReParse = FALSE);
111
112   void GetDisplayMatrix(CFX_AffineMatrix& matrix,
113                         int xPos,
114                         int yPos,
115                         int xSize,
116                         int ySize,
117                         int iRotate) const;
118
119   FX_FLOAT GetPageWidth() const { return m_PageWidth; }
120
121   FX_FLOAT GetPageHeight() const { return m_PageHeight; }
122
123   CFX_FloatRect GetPageBBox() const { return m_BBox; }
124
125   const CFX_AffineMatrix& GetPageMatrix() const { return m_PageMatrix; }
126
127   CPDF_Object* GetPageAttr(const CFX_ByteStringC& name) const;
128
129   CPDF_PageRenderCache* GetRenderCache() const { return m_pPageRender; }
130
131   void ClearRenderCache();
132
133  protected:
134   friend class CPDF_ContentParser;
135
136   FX_FLOAT m_PageWidth;
137
138   FX_FLOAT m_PageHeight;
139
140   CFX_AffineMatrix m_PageMatrix;
141
142   CPDF_PageRenderCache* m_pPageRender;
143 };
144 class CPDF_ParseOptions {
145  public:
146   CPDF_ParseOptions();
147
148   FX_BOOL m_bTextOnly;
149
150   FX_BOOL m_bMarkedContent;
151
152   FX_BOOL m_bSeparateForm;
153
154   FX_BOOL m_bDecodeInlineImage;
155 };
156 class CPDF_Form : public CPDF_PageObjects {
157  public:
158   CPDF_Form(CPDF_Document* pDocument,
159             CPDF_Dictionary* pPageResources,
160             CPDF_Stream* pFormStream,
161             CPDF_Dictionary* pParentResources = NULL);
162
163   ~CPDF_Form();
164
165   void StartParse(CPDF_AllStates* pGraphicStates,
166                   CFX_AffineMatrix* pParentMatrix,
167                   CPDF_Type3Char* pType3Char,
168                   CPDF_ParseOptions* pOptions,
169                   int level = 0);
170
171   void ParseContent(CPDF_AllStates* pGraphicStates,
172                     CFX_AffineMatrix* pParentMatrix,
173                     CPDF_Type3Char* pType3Char,
174                     CPDF_ParseOptions* pOptions,
175                     int level = 0);
176
177   CPDF_Form* Clone() const;
178 };
179 class CPDF_PageContentGenerate {
180  public:
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);
186
187  protected:
188   void ProcessImage(CFX_ByteTextBuf& buf, CPDF_ImageObject* pImageObj);
189   void ProcessForm(CFX_ByteTextBuf& buf,
190                    const uint8_t* data,
191                    FX_DWORD size,
192                    CFX_Matrix& matrix);
193   CFX_ByteString RealizeResource(CPDF_Object* pResourceObj,
194                                  const FX_CHAR* szType);
195
196  private:
197   CPDF_Page* m_pPage;
198   CPDF_Document* m_pDocument;
199   CFX_PtrArray m_pageObjects;
200 };
201
202 #endif  // CORE_INCLUDE_FPDFAPI_FPDF_PAGE_H_