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