Home | History | Annotate | Download | only in fpdfapi
      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 class 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
     31 class CPDF_PageObjects
     32 {
     33 public:
     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 
    122 protected:
    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 };
    139 class CPDF_Page : public CPDF_PageObjects, public CFX_PrivateData
    140 {
    141 public:
    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 
    187 protected:
    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 };
    198 class CPDF_ParseOptions
    199 {
    200 public:
    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 };
    212 class CPDF_Form : public CPDF_PageObjects
    213 {
    214 public:
    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 };
    228 class CPDF_PageContentGenerate
    229 {
    230 public:
    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);
    236 protected:
    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);
    240 private:
    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