1ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov// Copyright 2014 PDFium Authors. All rights reserved. 2ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov// Use of this source code is governed by a BSD-style license that can be 3ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov// found in the LICENSE file. 4ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 5ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com 6ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 7e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov#ifndef CORE_SRC_REFLOW_REFLOWEDPAGE_H_ 8e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov#define CORE_SRC_REFLOW_REFLOWEDPAGE_H_ 9e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov 10ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov#include "../../include/reflow/reflowengine.h" 11e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov 12ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov#define GET_SIGNED(a) ( (a)>0 ? a/a : (a==0 ? 0 : -a/a) ) 13ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganovclass CRF_Data; 14ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganovclass CRF_LineData; 15ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganovclass CRF_CharData; 16ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganovclass CRF_PathData; 17ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganovclass CRF_ImageData; 18ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganovclass CRF_Table; 19ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganovclass CRF_AttrOperation; 20ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganovclass CRF_OperationDate; 21ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganovclass CPDF_ReflowedPage; 22ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganovclass CPDF_Rect; 23ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganovtypedef CFX_SegmentedArray<CRF_Data*> CRF_DataPtrArray; 24ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganovclass CRF_CharState; 25ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganovtypedef CFX_SegmentedArray<CRF_CharState> CRF_CharStateArray; 26ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov#define SST_GE 1 27ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov#define SST_BLSE 2 28ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov#define SST_ILSE 3 29ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov#define SST_IE 4 30e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganovclass CPDF_LayoutProcessor_Reflow : public IPDF_LayoutProcessor 31ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{ 32ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganovpublic: 33ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov CPDF_LayoutProcessor_Reflow(); 34ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov ~CPDF_LayoutProcessor_Reflow(); 35ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov void Init(FX_FLOAT TopIndent, FX_FLOAT fWidth, FX_FLOAT fHeight, CPDF_ReflowedPage* pReflowedPage, int flags, FX_FLOAT lineSpace); 36ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 37ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov LayoutStatus StartProcess(IPDF_LayoutElement* pElement, IFX_Pause* pPause, const CFX_AffineMatrix* pPDFMatrix = NULL); 38ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov LayoutStatus Continue(); 39ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov int GetPosition(); 40ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganovprotected: 41ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov void FitPageMode(); 42ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov void ProcessElement(IPDF_LayoutElement* pElement, FX_FLOAT reflowWidth); 43ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FX_FLOAT GetElmWidth(IPDF_LayoutElement* pElement); 44ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov CFX_FloatRect GetElmBBox(IPDF_LayoutElement* pElement); 45ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov void ProcessTable(FX_FLOAT dx); 46ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov void ProcessObjs(IPDF_LayoutElement* pElement, FX_FLOAT reflowWidth); 47ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov void ProcessObject(CPDF_PageObject* pObj, FX_FLOAT reflowWidth, CFX_AffineMatrix objMatrix); 48ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov void ProcessTextObject(CPDF_TextObject *pObj, FX_FLOAT reflowWidth, CFX_AffineMatrix objMatrix); 49ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov void ProcessPathObject(CPDF_PathObject *pObj, FX_FLOAT reflowWidth); 50ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov void ProcessUnitaryObjs(CPDF_PageObjects *pObjs, FX_FLOAT reflowWidth, CFX_AffineMatrix objMatrix); 51ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FX_INT32 LogicPreObj(CPDF_TextObject* pObj); 52ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov int ProcessInsertObject(CPDF_TextObject* pObj, CFX_AffineMatrix formMatrix); 53ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FX_WCHAR GetPreChar(); 54ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FX_BOOL IsSameTextObject(CPDF_TextObject* pTextObj1, CPDF_TextObject* pTextObj2); 55ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov int GetCharWidth(FX_DWORD charCode, CPDF_Font* pFont) const; 56ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FX_BOOL IsCanBreakAfter(FX_DWORD unicode); 57ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FX_BOOL IsCanBreakBefore(FX_DWORD unicode); 58ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FX_INT32 GetElementTypes(LayoutType layoutType); 59ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov void CreateRFData(CPDF_PageObject* pObj, CFX_AffineMatrix* pMatrix = NULL); 60ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov CRF_CharState* GetCharState(CPDF_TextObject* pObj, CPDF_Font* pFont, FX_FLOAT fHeight, FX_ARGB color); 61ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FX_FLOAT ConverWidth(FX_FLOAT width); 62ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov void AddData2CurrLine(CRF_Data* pData); 63ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov void AddTemp2CurrLine(int begin, int count ); 64ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov void Transform(const CFX_AffineMatrix* pMatrix, CRF_Data* pData); 65ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov void Transform(const CFX_AffineMatrix* pMatrix, CRF_DataPtrArray* pDataArray, int beginPos, int count = 0); 66ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FX_FLOAT GetDatasWidth( int beginPos, int endpos); 67ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov void UpdateCurrLine(); 68ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FX_BOOL FinishedCurrLine(); 69ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov int m_flags; 70ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov CFX_AffineMatrix m_PDFMatrix; 71ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov LayoutStatus m_Status; 72ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov CPDF_TextObject* m_pPreObj; 73ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov CFX_AffineMatrix m_perMatrix; 74ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov IPDF_LayoutElement* m_pLayoutElement; 75ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov IPDF_LayoutElement* m_pRootElement; 76ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FX_FLOAT m_CurrRefWidth; 77ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov IFX_Pause* m_pPause; 78ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov LayoutEnum m_CurrWritingMode; 79ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov CPDF_ReflowedPage* m_pReflowedPage; 80ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FX_FLOAT m_fRefWidth; 81ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FX_FLOAT m_TopIndent; 82ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FX_FLOAT m_fLineSpace; 83ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FX_FLOAT m_fScreenHeight; 84ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FX_FLOAT m_fCurrMaxWidth; 85ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FX_FLOAT m_fCurrLineWidth; 86ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FX_FLOAT m_fCurrLineHeight; 87ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov CRF_DataPtrArray* m_pCurrLine; 88ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov CRF_DataPtrArray* m_pTempLine; 89ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FX_BOOL m_bIllustration; 90ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FX_FLOAT m_fLineHeight; 91ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov LayoutEnum m_TextAlign; 92ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FX_FLOAT m_StartIndent; 93ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov CFX_ArrayTemplate<CRF_Table*> m_TableArray; 94ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov int m_PausePosition; 95ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov}; 96ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganovstruct RF_TableCell { 97ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov int m_BeginPos; 98ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov int m_EndPos; 99ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FX_FLOAT m_MaxWidth; 100ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FX_FLOAT m_PosX; 101ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FX_FLOAT m_PosY; 102ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FX_FLOAT m_CellWidth; 103ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FX_FLOAT m_CellHeight; 104ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov int m_RowSpan; 105ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov int m_ColSpan; 106ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov LayoutEnum m_BlockAlign; 107ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov LayoutEnum m_InlineAlign; 108ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov}; 109ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganovtypedef CFX_ArrayTemplate<RF_TableCell*> CRF_TableCellArray; 110e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganovclass CRF_Table 111ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{ 112ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganovpublic: 113ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov CRF_Table() 114ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov { 115ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov m_TableWidth = 0; 116ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov m_nCol = 0; 117ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 118ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov CRF_TableCellArray m_pCellArray; 119ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov CFX_WordArray m_nCell; 120ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov int m_nCol; 121ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FX_FLOAT m_TableWidth; 122ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FX_FLOAT m_ReflowPageHeight; 123ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov}; 124e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganovclass CRF_CharState 125ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{ 126ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganovpublic: 127ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov CPDF_Font* m_pFont; 128ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FX_ARGB m_Color; 129ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FX_BOOL m_bVert; 130ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FX_FLOAT m_fFontSize; 131ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FX_FLOAT m_fAscent; 132ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FX_FLOAT m_fDescent; 133ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 134ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov CPDF_TextObject* m_pTextObj; 135ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov}; 136e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganovclass CRF_PageInfo 137ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{ 138ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganovpublic: 139ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov CRF_PageInfo(CPDF_PageObject* pPageObj, CRF_PageInfo* pParent = NULL) 140ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov : m_pPageObj(pPageObj) , m_pParent(pParent) 141ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov { 142ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 143ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov CPDF_PageObject* GetPageObj() 144ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov { 145ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return m_pPageObj; 146ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 147ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov CPDF_Dictionary* GetFormDict() 148ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov { 149ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (NULL == m_pParent) { 150ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return NULL; 151ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 152ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov CPDF_PageObject* pParentObj = m_pParent->GetPageObj(); 153ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (NULL == pParentObj || PDFPAGE_FORM != pParentObj->m_Type) { 154ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return NULL; 155ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 156ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return ((CPDF_FormObject*)pParentObj)->m_pForm->m_pResources; 157ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 158ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganovprotected: 159ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov CPDF_PageObject* m_pPageObj; 160ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov CRF_PageInfo* m_pParent; 161ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov}; 162e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganovclass CPDF_ReflowedPage : public IPDF_ReflowedPage, public CFX_PrivateData 163ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{ 164ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganovpublic: 165ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 166ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov CPDF_ReflowedPage(CFX_GrowOnlyPool* pMemoryPool); 167ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov ~CPDF_ReflowedPage(); 168ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov CFX_PrivateData* GetPrivateDataCtrl() 169ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov { 170ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return this; 171ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov }; 172ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov void GetDisplayMatrix(CFX_AffineMatrix& matrix, FX_INT32 xPos, FX_INT32 yPos, FX_INT32 xSize, FX_INT32 ySize, FX_INT32 iRotate, const CFX_AffineMatrix* pPageMatrix); 173ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 174ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FX_FLOAT GetPageHeight() ; 175ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FX_FLOAT GetPageWidth() 176ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov { 177ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return m_PageWidth; 178ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov }; 179ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov void FocusGetData(const CFX_AffineMatrix matrix, FX_INT32 x, FX_INT32 y, CFX_ByteString& str); 180ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FX_BOOL FocusGetPosition(const CFX_AffineMatrix matrix, CFX_ByteString str, FX_INT32& x, FX_INT32& y); 181ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov CRF_DataPtrArray* m_pReflowed; 182ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FX_FLOAT m_PageWidth; 183ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FX_FLOAT m_PageHeight; 184ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FX_BOOL m_bWaiting; 185ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov CRF_CharStateArray* m_pCharState; 186ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov CFX_GrowOnlyPool* m_pMemoryPool; 187ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FX_BOOL m_bCreateMemoryPool; 188ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov CPDF_Page* m_pPDFPage; 189ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FX_BOOL RetainPageObjsMemberShip(); 190ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov void MarkPageObjMemberShip(CPDF_PageObject* pObj, CRF_PageInfo* pParent); 191ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov void ReleasePageObjsMemberShip(); 192ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov CPDF_Dictionary* GetFormResDict(CPDF_PageObject* pObj); 193ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 194ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov CFX_MapPtrToPtr* m_pPageInfos; 195ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov}; 196e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganovclass CPDF_ProgressiveReflowPageParser : public IPDF_ProgressiveReflowPageParser 197ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{ 198ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganovpublic: 199ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov CPDF_ProgressiveReflowPageParser(); 200ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov ~CPDF_ProgressiveReflowPageParser() ; 201ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov void Init(); 202ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 203ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov ParseStatus GetStatus() 204ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov { 205ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return m_Status; 206ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov }; 207ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 208ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov void SetParserStyle(RF_ParseStyle style) 209ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov { 210ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov m_ParseStyle = style; 211ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov }; 212ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov void Start(IPDF_ReflowedPage* pReflowPage, CPDF_Page* pPage, FX_FLOAT TopIndent, FX_FLOAT fWidth, FX_FLOAT fHeight, IFX_Pause* pPause, int flags); 213ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov void Continue(IFX_Pause* pPause); 214ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov int GetPosition() ; 215ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 216ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov void Clear(); 217ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov ParseStatus m_Status; 218ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganovprotected: 219ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov RF_ParseStyle m_ParseStyle; 220ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov CPDF_Page* m_pPDFPage; 221ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov IFX_Pause* m_pPause; 222ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov CPDF_ReflowedPage* m_pReflowPage; 223ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FX_FLOAT m_TopIndent; 224ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FX_FLOAT m_ReflowedWidth; 225ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FX_FLOAT m_fScreenHeight; 226ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov IPDF_LayoutProvider* m_pProvider; 227ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov IPDF_LayoutProcessor* m_pReflowEngine; 228ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov int m_nObjProcessed; 229ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov int m_flags; 230ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov}; 231e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganovclass CPDF_ProgressiveReflowPageRender : public IPDF_ProgressiveReflowPageRender 232ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{ 233ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganovpublic: 234ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov CPDF_ProgressiveReflowPageRender(); 235ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov ~CPDF_ProgressiveReflowPageRender() ; 236ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 237ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov RenderStatus GetStatus() 238ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov { 239ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return m_Status; 240ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov }; 241ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 242ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 243ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov void SetDisplayColor(FX_COLORREF color); 244ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov void Start(IPDF_ReflowedPage* pReflowPage, CFX_RenderDevice* pDevice, const CFX_AffineMatrix* pMatrix, IFX_Pause* pPause, int DitherBits); 245ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov void Continue(IFX_Pause* pPause); 246ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov int GetPosition(); 247ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 248ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 249ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov void Clear(); 250ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganovprotected: 251ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov void Display(IFX_Pause* pPause); 252ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov RenderStatus m_Status; 253ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov CPDF_ReflowedPage* m_pReflowPage; 254ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov CFX_AffineMatrix* m_pDisplayMatrix; 255ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov int m_CurrNum; 256ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov IFX_FontEncoding* m_pFontEncoding; 257ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov CFX_RenderDevice* m_pFXDevice; 258ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov int m_DitherBits; 259ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FX_COLORREF m_DisplayColor; 260ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov typedef struct CRF_TextDataAtt { 261ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov CRF_TextDataAtt() 262ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov { 263ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov pFont = NULL; 264ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov fFontSize = 0.0f; 265ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov Color = 0; 266ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 267ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov CRF_TextDataAtt(CPDF_Font* font, FX_FLOAT fontSize, FX_ARGB color) 268ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov { 269ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov pFont = font; 270ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov fFontSize = fontSize; 271ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov Color = color; 272ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 273ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov CPDF_Font* pFont; 274ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FX_FLOAT fFontSize; 275ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FX_ARGB Color; 276ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } CRF_TEXTDATAATT; 277ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov inline bool isTextDataAttSame(CRF_TEXTDATAATT data1, CRF_TEXTDATAATT data2) 278ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov { 279ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (data1.pFont != data2.pFont) { 280ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return false; 281ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 282ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (data1.Color != data2.Color) { 283ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return false; 284ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 285ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (fabs(data1.fFontSize - data2.fFontSize) > 0.0f) { 286ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return false; 287ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 288ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return true; 289ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov }; 290ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov}; 291ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov#define TYPE_UNKNOW 0 292ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov#define TYPE_TEXT 1 293ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov#define TYPE_PATH 2 294ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov#define TYPE_IMAGE 3 295ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov#define TYPE_LINE 4 296e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganovclass CRF_Data 297ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{ 298ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganovpublic: 299ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov typedef enum {Unknow, Text, Image, Path, Line, paragraph} RF_DataType; 300ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov CRF_Data() 301ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov { 302ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov m_Type = Unknow; 303ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov m_Width = 0; 304ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov m_PosY = 0; 305ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov m_PosX = 0; 306ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov m_Height = 0; 307ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 308ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov RF_DataType GetType() 309ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov { 310ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return m_Type; 311ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 312ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov virtual ~CRF_Data() {} 313ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov RF_DataType m_Type; 314ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FX_FLOAT m_PosX; 315ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FX_FLOAT m_PosY; 316ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FX_FLOAT m_Width; 317ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FX_FLOAT m_Height; 318ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov}; 319ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganovclass CRF_LineData : public CRF_Data 320ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{ 321ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganovpublic: 322ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov CRF_LineData() 323ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov { 324ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov m_Type = Line; 325ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 326ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov}; 327ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganovclass CRF_CharData : public CRF_Data 328ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{ 329ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganovpublic: 330ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov CRF_CharData() 331ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov { 332ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov m_Type = Text; 333ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov m_CharCode = -1; 334ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 335ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov CRF_CharState* m_pCharState; 336ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FX_DWORD m_CharCode; 337ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov}; 338ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganovclass CRF_ImageData : public CRF_Data 339ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{ 340ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganovpublic: 341ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov CRF_ImageData() 342ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov { 343ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov m_Type = Image; 344ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov m_pBitmap = NULL; 345ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 346ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov ~CRF_ImageData() 347ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov { 348ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if(m_pBitmap) { 349ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov delete m_pBitmap; 350ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 351ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov m_pBitmap = NULL; 352ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 353ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov CFX_AffineMatrix m_Matrix; 354ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov CFX_DIBitmap* m_pBitmap; 355ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov}; 356ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganovclass CRF_PathData : public CRF_Data 357ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{ 358ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganovpublic: 359ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov CRF_PathData() 360ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov { 361ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov m_Type = Path; 362ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov m_bDecoration = FALSE; 363ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 364ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov ~CRF_PathData() {}; 365ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FX_BOOL m_bDecoration; 366ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov CPDF_Path m_pPathData; 367ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov CFX_AffineMatrix m_pPath2Device; 368ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov CPDF_GraphState m_pGraphState; 369ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FX_ARGB m_fill_argb; 370ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FX_ARGB m_stroke_argb; 371ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov int m_fill_mode; 372ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov}; 373e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov 374e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov#endif // CORE_SRC_REFLOW_REFLOWEDPAGE_H_ 375