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
7ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov#ifndef _AUTOREFLOW_H
8ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov#define _AUTOREFLOW_H
9ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov#include "../../include/reflow/reflowengine.h"
10ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov#include "reflowedpage.h"
11ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganovclass CPDF_AutoReflowElement;
12ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganovclass CPDF_AutoReflowLayoutProvider;
13ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganovtypedef CFX_ArrayTemplate<CPDF_AutoReflowElement*> CAR_ElmPtrArray;
14ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganovtypedef CFX_ArrayTemplate<CPDF_PageObject*> CAR_ObjPtrArray;
15ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganovclass CRF_CELL : public CFX_Object
16ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{
17ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganovpublic:
18ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    CRF_CELL() { };
19ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    ~CRF_CELL() { };
20ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    CFX_PtrList		m_ObjList;
21ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    int			m_CellWritingMode;
22ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    FX_RECT		m_BBox;
23ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov};
24ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganovclass CPDF_AutoReflowElement : public IPDF_LayoutElement, public CFX_Object
25ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{
26ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganovpublic:
27ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    CPDF_AutoReflowElement(LayoutType layoutType = LayoutUnknown , CPDF_AutoReflowElement* pParent = NULL) ;
28ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    ~CPDF_AutoReflowElement();
29ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    LayoutType GetType()
30ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    {
31ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        return m_ElmType;
32ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    }
33ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    void	GetRect(CFX_FloatRect& rcRect) {};
34ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
35ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    int  CountAttrValues(LayoutAttr attr_type);
36ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    LayoutEnum  GetEnumAttr(LayoutAttr attr_type, int index);
37ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    FX_FLOAT GetNumberAttr(LayoutAttr attr_type, int index);
38ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    FX_COLORREF GetColorAttr(LayoutAttr attr_type, int index);
39ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
40ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    int  CountChildren()
41ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    {
42ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        return m_ChildArray.GetSize();
43ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    }
44ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    IPDF_LayoutElement* GetChild(int index)
45ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    {
46ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        return m_ChildArray.GetAt(index);
47ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    }
48ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
49ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    IPDF_LayoutElement* GetParent()
50ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    {
51ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        return m_pParentElm;
52ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    }
53ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    int		CountObjects()
54ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    {
55ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        return m_ObjArray.GetSize();
56ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    }
57ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    CPDF_PageObject*	GetObject(int index)
58ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    {
59ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        return m_ObjArray.GetAt(index);
60ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    }
61ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    CPDF_AutoReflowElement* m_pParentElm;
62ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    LayoutType		m_ElmType;
63ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    CAR_ElmPtrArray m_ChildArray;
64ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    CAR_ObjPtrArray m_ObjArray;
65ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    FX_FLOAT		m_SpaceBefore;
66ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov};
67ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov#define AUTOREFLOW_STEP_GENERATELINE		1
68ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov#define AUTOREFLOW_STEP_GENERATEParagraph	2
69ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov#define AUTOREFLOW_STEP_CREATEELEMENT		3
70ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov#define AUTOREFLOW_STEP_REMOVEDATA			4
71ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganovclass CPDF_AutoReflowLayoutProvider : public IPDF_LayoutProvider, public CFX_Object
72ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{
73ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganovpublic:
74ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    CPDF_AutoReflowLayoutProvider(CPDF_PageObjects* pPage, FX_BOOL bReadOrder);
75ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    ~CPDF_AutoReflowLayoutProvider();
76ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    void	SetLayoutProviderStyle(LAYOUTPROVIDER_STYLE Style)
77ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    {
78ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        m_Style = Style;
79ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    }
80ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    LayoutStatus StartLoad(IFX_Pause* pPause = NULL);
81ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    LayoutStatus Continue();
82ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    int	 		GetPosition();
83ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    IPDF_LayoutElement* GetRoot()
84ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    {
85ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        return m_pRoot;
86ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    }
87ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    FX_FLOAT GetObjMinCell(CPDF_PageObject* pObj);
88ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    void Conver2AppreceOrder(const CPDF_PageObjects* pStreamOrderObjs, CPDF_PageObjects* pAppraceOrderObjs);
89ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    void	ReleaseElm(CPDF_AutoReflowElement*& pElm, FX_BOOL bReleaseChildren = TRUE);
90ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    void GenerateCell();
91ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    void GenerateStructTree();
92ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    void GenerateLine(CFX_PtrArray& cellArray);
93ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    void GenerateParagraph(CFX_PtrArray& cellArray);
94ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    void CreateElement();
95ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    void AddObjectArray(CPDF_AutoReflowElement* pElm, CFX_PtrList& ObjList);
96ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    FX_FLOAT GetLayoutOrderHeight(CPDF_PageObject* pCurObj);
97ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    FX_FLOAT GetLayoutOrderWidth(CPDF_PageObject* pCurObj);
98ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    int GetWritingMode(CPDF_PageObject* pPreObj, CPDF_PageObject* pCurObj);
99ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    int GetRectStart(FX_RECT rect);
100ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    int GetRectEnd(FX_RECT rect);
101ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    int GetRectTop(FX_RECT rect);
102ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    int GetRectBottom(FX_RECT rect);
103ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    int GetRectHeight(FX_RECT rect);
104ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    int GetRectWidth(FX_RECT rect);
105ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    void ProcessObj(CFX_PtrArray& cellArray, CPDF_PageObject* pObj, CFX_AffineMatrix matrix);
106ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    FX_INT32 LogicPreObj(CPDF_PageObject* pObj);
107ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
108ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    CPDF_AutoReflowElement* m_pRoot;
109ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    CPDF_AutoReflowElement* m_pCurrElm;
110ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    CPDF_Page*	m_pPDFPage;
111ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    IFX_Pause*	m_pPause;
112ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    CFX_AffineMatrix m_PDFDisplayMatrix;
113ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    CPDF_PageObject* m_pPreObj;
114ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    LayoutStatus m_Status;
115ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    int m_WritingMode;
116ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    CFX_PtrArray m_CellArray;
117ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    FX_BOOL		 m_bReadOrder;
118ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    LAYOUTPROVIDER_STYLE m_Style;
119ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    CFX_PtrArray m_cellArray;
120ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    int			m_Step;
121ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov};
122ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov#endif
123