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#include "autoreflow.h"
8ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov#define approachto(a,b,c) (FXSYS_fabs((float)((a)-(b)))>(c) ? 0 : 1)
9ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganovint FPDF_ProcessInterObj(const CPDF_PageObject* pPrevObj, const CPDF_PageObject* pObj)
10ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{
11ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    CFX_AffineMatrix matrix;
12ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    FX_RECT PreRect = pPrevObj->GetBBox(&matrix);
13ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    FX_RECT rect = pObj->GetBBox(&matrix);
14ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    int flag = 0;
15ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    if(PreRect.top > rect.bottom) {
16ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        flag = 0;
17ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    } else if(rect.top > PreRect.bottom) {
18ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        flag = 1;
19ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    } else if(PreRect.right < rect.left) {
20ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        flag = 0;
21ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    } else if(PreRect.left > rect.right) {
22ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        flag = 1;
23ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    } else if(pObj->m_Type != PDFPAGE_TEXT) {
24ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        flag = 1;
25ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    } else if(pPrevObj->m_Type != PDFPAGE_TEXT) {
26ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        flag = 0;
27ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    } else {
28ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        if((PreRect.top < rect.top && PreRect.bottom > rect.bottom) ||
29ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                (PreRect.top > rect.top && PreRect.bottom < rect.bottom)) {
30ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov            if(PreRect.left > rect.left) {
31ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                flag = 1;
32ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov            } else {
33ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                flag = 0;
34ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov            }
35ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        } else {
36ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov            CPDF_TextObject* pPrevTextObj = (CPDF_TextObject* )pPrevObj;
37ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov            CPDF_TextObject* pTextObj = (CPDF_TextObject* )pObj;
38ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov            CPDF_TextObjectItem item, prevItem;
39ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov            pPrevTextObj->GetItemInfo(0, &prevItem);
40ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov            pTextObj->GetItemInfo(0, &item);
41ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov            CFX_AffineMatrix TextMatrix;
42ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov            pTextObj->GetTextMatrix(&TextMatrix);
43ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov            FX_FLOAT originX, originY, prevOriginX, preOriginY;
44ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov            TextMatrix.Transform(item.m_OriginX, item.m_OriginY, originX, originY);
45ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov            pPrevTextObj->GetTextMatrix(&TextMatrix);
46ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov            TextMatrix.Transform(prevItem.m_OriginX, prevItem.m_OriginY, prevOriginX, preOriginY);
47ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov            if(preOriginY > originY) {
48ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                flag = 0;
49ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov            } else {
50ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                flag = 1;
51ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov            }
52ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        }
53ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    }
54ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    return flag;
55ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov}
56ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganovvoid CPDF_AutoReflowLayoutProvider::Conver2AppreceOrder(const CPDF_PageObjects* pStreamOrderObjs, CPDF_PageObjects* pAppraceOrderObjs)
57ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{
58ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    FX_POSITION pos = pStreamOrderObjs->GetFirstObjectPosition();
59ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    CFX_AffineMatrix matrix;
60ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    while(pos) {
61ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        CPDF_PageObject* pObj = pStreamOrderObjs->GetNextObject(pos);
62ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        CFX_AffineMatrix matrix;
63ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        if(pObj->m_Type != PDFPAGE_TEXT) {
64ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov            continue;
65ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        }
66ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        FX_POSITION pos1 = pAppraceOrderObjs->GetLastObjectPosition();
67ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        while(pos1) {
68ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov            CPDF_PageObject* pTempObj = pAppraceOrderObjs->GetPrevObject(pos1);
69ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov            if(FPDF_ProcessInterObj(pObj, pTempObj) == 1) {
70ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                if(!pos1) {
71ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                    pos1 = pAppraceOrderObjs->GetFirstObjectPosition();
72ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                } else {
73ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                    pAppraceOrderObjs->GetNextObject(pos1);
74ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                }
75ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                break;
76ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov            }
77ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        }
78ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        pAppraceOrderObjs->InsertObject(pos1, pObj);
79ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    }
80ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    pos = pStreamOrderObjs->GetFirstObjectPosition();
81ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    while(pos) {
82ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        CPDF_PageObject* pObj = pStreamOrderObjs->GetNextObject(pos);
83ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        if(pObj->m_Type != PDFPAGE_IMAGE) {
84ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov            continue;
85ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        }
86ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        FX_POSITION pos1 = pAppraceOrderObjs->GetLastObjectPosition();
87ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        while(pos1) {
88ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov            CPDF_PageObject* pTempObj = pAppraceOrderObjs->GetPrevObject(pos1);
89ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov            if(FPDF_ProcessInterObj(pObj, pTempObj) == 1) {
90ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                if(!pos1) {
91ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                    pos1 = pAppraceOrderObjs->GetFirstObjectPosition();
92ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                } else {
93ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                    pAppraceOrderObjs->GetNextObject(pos1);
94ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                }
95ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                break;
96ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov            }
97ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        }
98ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        pAppraceOrderObjs->InsertObject(pos1, pObj);
99ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    }
100ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov}
101ee451cb395940862dad63c85adfe8f2fd55e864cSvet GanovIPDF_LayoutProvider* IPDF_LayoutProvider::Create_LayoutProvider_AutoReflow(CPDF_PageObjects* pPage, FX_BOOL bReadOrder)
102ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{
103ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    return FX_NEW CPDF_AutoReflowLayoutProvider(pPage, bReadOrder);
104ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov}
105ee451cb395940862dad63c85adfe8f2fd55e864cSvet GanovCPDF_AutoReflowElement::CPDF_AutoReflowElement(LayoutType layoutType , CPDF_AutoReflowElement* pParent)
106ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{
107ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    m_ElmType = layoutType;
108ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    m_pParentElm = pParent;
109ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    if(pParent) {
110ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        pParent->m_ChildArray.Add(this);
111ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    }
112ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    m_SpaceBefore = 0;
113ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov}
114ee451cb395940862dad63c85adfe8f2fd55e864cSvet GanovCPDF_AutoReflowElement::~CPDF_AutoReflowElement()
115ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{
116ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    m_ChildArray.RemoveAll();
117ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    m_ObjArray.RemoveAll();
118ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov}
119ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganovint	CPDF_AutoReflowElement::CountAttrValues(LayoutAttr attr_type)
120ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{
121ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    return 1;
122ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov}
123ee451cb395940862dad63c85adfe8f2fd55e864cSvet GanovLayoutEnum CPDF_AutoReflowElement::GetEnumAttr(LayoutAttr attr_type, int index )
124ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{
125ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    return LayoutInvalid;
126ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov}
127ee451cb395940862dad63c85adfe8f2fd55e864cSvet GanovFX_FLOAT	CPDF_AutoReflowElement::GetNumberAttr(LayoutAttr attr_type, int index )
128ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{
129ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    switch (attr_type) {
130ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        case LayoutSpaceBefore:
131ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov            return m_SpaceBefore;
132ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        default:
133ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov            return 0;
134ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    }
135ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov}
136ee451cb395940862dad63c85adfe8f2fd55e864cSvet GanovFX_COLORREF	CPDF_AutoReflowElement::GetColorAttr(LayoutAttr attr_type, int index )
137ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{
138ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    return 0;
139ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov}
140ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov#define WritingMode_UNKNOW	0
141ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov#define WritingMode_LRTB	1
142ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov#define WritingMode_RLTB	2
143ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov#define WritingMode_TBRL	3
144ee451cb395940862dad63c85adfe8f2fd55e864cSvet GanovCPDF_AutoReflowLayoutProvider::CPDF_AutoReflowLayoutProvider(CPDF_PageObjects* pPage, FX_BOOL bReadOrder)
145ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{
146ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    m_pPDFPage = (CPDF_Page*)pPage;
147ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    FX_FLOAT width = m_pPDFPage->GetPageWidth();
148ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    FX_FLOAT height = m_pPDFPage->GetPageHeight();
149ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    m_pPDFPage->GetDisplayMatrix(m_PDFDisplayMatrix, 0, 0, (int)(m_pPDFPage->GetPageWidth()), (int)(m_pPDFPage->GetPageHeight()), 0);
150ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    m_bReadOrder = bReadOrder;
151ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    m_Status = LayoutReady;
152ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    m_pRoot = NULL;
153ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    m_pCurrElm = NULL;
154ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    m_pPreObj = NULL;
155ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    m_Step = 0;
156ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    m_WritingMode = WritingMode_UNKNOW;
157ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov}
158ee451cb395940862dad63c85adfe8f2fd55e864cSvet GanovCPDF_AutoReflowLayoutProvider::~CPDF_AutoReflowLayoutProvider()
159ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{
160ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    m_pPDFPage = NULL;
161ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    ReleaseElm(m_pRoot);
162ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov}
163ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganovvoid CPDF_AutoReflowLayoutProvider::ReleaseElm(CPDF_AutoReflowElement*& pElm, FX_BOOL bReleaseChildren)
164ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{
165ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    if(bReleaseChildren) {
166ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        int count = pElm->CountChildren();
167ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        for(int i = 0; i < count; i++) {
168ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov            CPDF_AutoReflowElement* pChild = (CPDF_AutoReflowElement*)pElm->GetChild(i);
169ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov            ReleaseElm(pChild);
170ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        }
171ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    }
172ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    delete pElm;
173ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    pElm = NULL;
174ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov}
175ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganovvoid CPDF_AutoReflowLayoutProvider::AddObjectArray(CPDF_AutoReflowElement* pElm, CFX_PtrList& ObjList)
176ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{
177ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    if(!pElm) {
178ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        return;
179ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    }
180ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    FX_POSITION pos = ObjList.GetHeadPosition();
181ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    while (pos) {
182ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        pElm->m_ObjArray.Add((CPDF_PageObject*)ObjList.GetNext(pos));
183ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    }
184ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov}
185ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganovvoid CPDF_AutoReflowLayoutProvider::GenerateStructTree()
186ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{
187ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    if (m_Step < AUTOREFLOW_STEP_GENERATELINE) {
188ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        GenerateLine(m_cellArray);
189ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        if(m_cellArray.GetSize() == 0) {
190ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov            m_Status = LayoutError;
191ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov            return;
192ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        }
193ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        if(m_pPause && m_pPause->NeedToPauseNow()) {
194ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov            m_Step = AUTOREFLOW_STEP_GENERATELINE;
195ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov            m_Status = LayoutToBeContinued;
196ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov            return;
197ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        }
198ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    }
199ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    if (m_Step < AUTOREFLOW_STEP_GENERATEParagraph) {
200ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        GenerateParagraph(m_cellArray);
201ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        if(m_pPause && m_pPause->NeedToPauseNow()) {
202ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov            m_Step = AUTOREFLOW_STEP_GENERATEParagraph;
203ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov            m_Status = LayoutToBeContinued;
204ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov            return;
205ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        }
206ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    }
207ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    if (m_Step < AUTOREFLOW_STEP_CREATEELEMENT) {
208ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        CreateElement();
209ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        if(m_pPause && m_pPause->NeedToPauseNow()) {
210ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov            m_Step = AUTOREFLOW_STEP_CREATEELEMENT;
211ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov            m_Status = LayoutToBeContinued;
212ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov            return;
213ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        }
214ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    }
215ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    if (m_Step < AUTOREFLOW_STEP_REMOVEDATA) {
216ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        int count = m_cellArray.GetSize();
217ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        for(int i = 0; i < count; i++) {
218ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov            CRF_CELL* pCell = (CRF_CELL*)m_cellArray.GetAt(i);
219ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov            if(pCell) {
220ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                pCell->m_ObjList.RemoveAll();
221ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                delete pCell;
222ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov            }
223ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        }
224ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        m_cellArray.RemoveAll();
225ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        if(m_pPause && m_pPause->NeedToPauseNow()) {
226ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov            m_Step = AUTOREFLOW_STEP_REMOVEDATA;
227ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov            m_Status = LayoutToBeContinued;
228ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov            return;
229ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        }
230ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    }
231ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    m_Step = AUTOREFLOW_STEP_REMOVEDATA;
232ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    m_Status = LayoutFinished;
233ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    return;
234ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov}
235ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganovvoid CPDF_AutoReflowLayoutProvider::CreateElement()
236ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{
237ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    int count = m_cellArray.GetSize();
238ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    CRF_CELL* plastCell = NULL;
239ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    CRF_CELL* pCell = NULL;
240ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    CRF_CELL* pNextCell = NULL;
241ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    CPDF_AutoReflowElement* pParent = m_pRoot;
242ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    CPDF_AutoReflowElement* pCurrElm = NULL;
243ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    int i;
244ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    for(i = 0; i < count; i++) {
245ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        pCell = (CRF_CELL*)m_cellArray.GetAt(i);
246ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        if(!pCell) {
247ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov            continue;
248ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        }
249ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        if(i < count - 1) {
250ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov            pNextCell = (CRF_CELL*)m_cellArray.GetAt(i + 1);
251ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        } else {
252ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov            pNextCell = NULL;
253ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        }
254ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        pCurrElm = NULL;
255ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        pCurrElm = FX_NEW CPDF_AutoReflowElement(LayoutParagraph, pParent);
256ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        if(pCurrElm->GetType() == LayoutParagraph && plastCell) {
257ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov            int SpaceBefore = 0;
258ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov            if(pCell->m_CellWritingMode != plastCell->m_CellWritingMode ) {
259ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                SpaceBefore = 20;
260ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov            } else if(pCell->m_CellWritingMode == WritingMode_LRTB) {
261ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                SpaceBefore = plastCell->m_BBox.bottom - pCell->m_BBox.top;
262ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov            } else if(pCell->m_CellWritingMode == WritingMode_TBRL) {
263ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                SpaceBefore = plastCell->m_BBox.left - pCell->m_BBox.right;
264ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov            }
265ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov            if(SpaceBefore > 0) {
266ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                pCurrElm->m_SpaceBefore = SpaceBefore > 50 ? 50.0f : SpaceBefore;
267ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov            }
268ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        }
269ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        AddObjectArray(pCurrElm, pCell->m_ObjList);
270ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        plastCell = pCell;
271ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    }
272ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov}
273ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganovvoid CPDF_AutoReflowLayoutProvider::GenerateParagraph(CFX_PtrArray& cellArray)
274ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{
275ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    int count = cellArray.GetSize();
276ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    if(count <= 1) {
277ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        return;
278ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    }
279ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    CRF_CELL* plastCell = (CRF_CELL*)cellArray.GetAt(0);
280ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    if(plastCell->m_BBox.Height() > plastCell->m_BBox.Width()) {
281ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        m_WritingMode = WritingMode_TBRL;
282ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    } else {
283ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        m_WritingMode = WritingMode_LRTB;
284ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    }
285ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    FX_BOOL bEnforce = FALSE;
286ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    int i = 0;
287ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    for(i = 1; i < count; i++) {
288ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        CRF_CELL* pCell = (CRF_CELL*)cellArray.GetAt(i);
289ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        if(!pCell) {
290ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov            continue;
291ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        }
292ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        int c = pCell->m_ObjList.GetCount();
293ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        FX_BOOL bMerge = FALSE;
294ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        FX_POSITION pos1 = plastCell->m_ObjList.GetTailPosition();
295ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        CPDF_PageObject* pLastObj = (CPDF_PageObject*)plastCell->m_ObjList.GetPrev(pos1);
296ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        pos1 = pCell->m_ObjList.GetHeadPosition();
297ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        CPDF_PageObject* pCurObj = (CPDF_PageObject*)pCell->m_ObjList.GetNext(pos1);
298ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        int WritingMode = GetRectEnd(pCell->m_BBox);
299ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        if(pCell->m_CellWritingMode == WritingMode_UNKNOW) {
300ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov            if(pCell->m_BBox.Height() > pCell->m_BBox.Width()) {
301ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                pCell->m_CellWritingMode = WritingMode_TBRL;
302ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov            } else {
303ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                pCell->m_CellWritingMode = WritingMode_LRTB;
304ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov            }
305ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        }
306ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        WritingMode = pCell->m_CellWritingMode;
307ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        if(WritingMode == WritingMode_LRTB && (m_Style.m_Language & LP_Lang_ChinesePRC || m_Style.m_Language & LP_Lang_ChineseTaiwan
308ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                                               || m_Style.m_Language & LP_Lang_Japanese || m_Style.m_Language & LP_Lang_Korean)) {
309ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov            if(pCurObj->m_Type == PDFPAGE_TEXT) {
310ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                CPDF_TextObject* pText;
311ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                pText = (CPDF_TextObject*)pCurObj;
312ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                if(pText->CountItems()) {
313ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                    CPDF_TextObjectItem item;
314ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                    pText->GetItemInfo(0, &item);
315ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                    CFX_WideString str = pText->GetFont()->UnicodeFromCharCode(item.m_CharCode);
316ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                    FX_WCHAR unicode = str.GetAt(0);
317ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                    if(unicode == 32) {
318ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                        plastCell = pCell;
319ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                        bMerge = FALSE;
320ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                        bEnforce = FALSE;
321ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                        continue;
322ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                    }
323ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                }
324ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov            }
325ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        }
326ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        if(m_WritingMode == WritingMode) {
327ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov            if(bEnforce) {
328ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                bMerge = FALSE;
329ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                bEnforce = FALSE;
330ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                if(pCurObj->m_Type == PDFPAGE_TEXT) {
331ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                    CPDF_TextObject* pText;
332ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                    pText = (CPDF_TextObject*)pCurObj;
333ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                    if(pText->CountItems()) {
334ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                        CPDF_TextObjectItem item;
335ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                        pText->GetItemInfo(0, &item);
336ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                        CFX_WideString str = pText->GetFont()->UnicodeFromCharCode(item.m_CharCode);
337ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                        FX_WCHAR unicode = str.GetAt(0);
338ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                        if(unicode > 96 && unicode < 123) {
339ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                            bMerge = TRUE;
340ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                        }
341ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                    }
342ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                } else {
343ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                    CPDF_ImageObject* pImage = (CPDF_ImageObject*)pCurObj;
344ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                    FX_RECT imageBBox = pImage->GetBBox(&m_PDFDisplayMatrix);
345ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                    if(GetRectEnd(plastCell->m_BBox) - GetRectEnd(pCell->m_BBox) < GetRectWidth(imageBBox)) {
346ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                        bMerge = TRUE;
347ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                    }
348ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                }
349ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov            } else {
350ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                if(!approachto(GetRectStart(pCell->m_BBox), GetRectStart(plastCell->m_BBox), GetRectHeight(pCell->m_BBox) / 4)) {
351ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                    if(approachto(GetRectStart(plastCell->m_BBox), GetRectStart(pCell->m_BBox), GetRectHeight(pCell->m_BBox) * 2.3) &&
352ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                            GetRectStart(plastCell->m_BBox) - GetRectStart(pCell->m_BBox) > 0) {
353ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                        if(pCurObj->m_Type == PDFPAGE_TEXT || pLastObj->m_Type == PDFPAGE_TEXT) {
354ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                            CPDF_TextObject* pText;
355ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                            if(pCurObj->m_Type == PDFPAGE_TEXT) {
356ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                                pText = (CPDF_TextObject*)pCurObj;
357ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                            } else {
358ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                                pText = (CPDF_TextObject*)pLastObj;
359ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                            }
360ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                            CPDF_TextObjectItem item;
361ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                            pText->GetItemInfo(0, &item);
362ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                            CFX_WideString str = pText->GetFont()->UnicodeFromCharCode(item.m_CharCode);
363ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                            FX_WCHAR unicode = str.GetAt(0);
364ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                            if(unicode > 255) {
365ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                                bMerge = TRUE;
366ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                            }
367ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                        }
368ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                    }
369ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                } else if(!approachto(GetRectEnd(pCell->m_BBox), GetRectEnd(plastCell->m_BBox), GetRectHeight(pCell->m_BBox) * 3)) {
370ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                    FX_RECT rect = pLastObj->GetBBox(&m_PDFDisplayMatrix);
371ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                    if(approachto(GetRectStart(pCell->m_BBox), GetRectStart(plastCell->m_BBox), GetRectHeight(pCell->m_BBox) / 4)) {
372ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                        if(GetRectEnd(rect) - GetRectEnd(pCell->m_BBox) > 0) {
373ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                            bMerge = TRUE;
374ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                            bEnforce = TRUE;
375ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                        } else if(GetRectEnd(rect) - GetRectEnd(pCell->m_BBox) <= 0 &&
376ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                                  GetRectEnd(rect) - GetRectEnd(pCell->m_BBox) > GetRectHeight(pCell->m_BBox) * -3) {
377ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                            if(pCurObj->m_Type == PDFPAGE_TEXT) {
378ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                                CPDF_TextObject* pText = (CPDF_TextObject*)pCurObj;
379ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                                CPDF_TextObjectItem item;
380ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                                pText->GetItemInfo(0, &item);
381ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                                CFX_WideString str = pText->GetFont()->UnicodeFromCharCode(item.m_CharCode);
382ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                                FX_WCHAR unicode = str.GetAt(0);
383ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                                if(unicode > 96 && unicode < 123) {
384ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                                    bMerge = TRUE;
385ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                                }
386ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                            }
387ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                        }
388ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                    }
389ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                } else {
390ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                    bMerge = TRUE;
391ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                }
392ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov            }
393ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        } else {
394ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov            m_WritingMode = WritingMode;
395ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov            bEnforce = FALSE;
396ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        }
397ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        if(bMerge) {
398ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov            if(GetRectEnd(plastCell->m_BBox) - GetRectEnd(pCell->m_BBox) > 30) {
399ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                bEnforce = TRUE;
400ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov            }
401ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov            FX_POSITION pos = pCell->m_ObjList.GetHeadPosition();
402ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov            while(pos) {
403ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                plastCell->m_ObjList.AddTail(pCell->m_ObjList.GetNext(pos));
404ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov            }
405ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov            plastCell->m_BBox.Union(pCell->m_BBox);
406ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov            pCell->m_ObjList.RemoveAll();
407ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov            delete pCell;
408ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov            cellArray.RemoveAt(i);
409ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov            i--;
410ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov            count--;
411ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        } else {
412ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov            plastCell = pCell;
413ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        }
414ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    }
415ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov}
416ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganovvoid CPDF_AutoReflowLayoutProvider::ProcessObj(CFX_PtrArray& cellArray, CPDF_PageObject* pObj, CFX_AffineMatrix matrix)
417ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{
418ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov}
419ee451cb395940862dad63c85adfe8f2fd55e864cSvet GanovFX_INT32 CPDF_AutoReflowLayoutProvider::LogicPreObj(CPDF_PageObject* pObj)
420ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{
421ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    CPDF_PageObject* pPreObj = m_pPreObj;
422ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    m_pPreObj = pObj;
423ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    if(!pPreObj) {
424ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        return 0;
425ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    }
426ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    if(pPreObj->m_Type != pObj->m_Type) {
427ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        return 0;
428ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    }
429ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    CFX_FloatRect rcCurObj(pObj->m_Left, pObj->m_Bottom, pObj->m_Right, pObj->m_Top);
430ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    CFX_FloatRect rcPreObj(pPreObj->m_Left, pPreObj->m_Bottom, pPreObj->m_Right, pPreObj->m_Top);
431ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    if(pObj->m_Type == PDFPAGE_IMAGE) {
432ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        if(rcPreObj.Contains(rcCurObj)) {
433ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov            return 2;
434ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        }
435ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        if(rcCurObj.Contains(rcPreObj)) {
436ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov            return 2;
437ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        }
438ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        return 0;
439ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    }
440ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    if(pObj->m_Type == PDFPAGE_TEXT) {
441ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        if(!((rcPreObj.bottom > rcCurObj.top) || (rcPreObj.top < rcCurObj.bottom))) {
442ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov            FX_FLOAT height = FX_MIN(rcPreObj.Height(), rcCurObj.Height());
443ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov            if((rcCurObj.left - rcPreObj.right) > height / 3) {
444ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                return 3;
445ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov            }
446ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        }
447ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        if(FXSYS_fabs(rcPreObj.Width() - rcCurObj.Width()) >= 2 || FXSYS_fabs(rcPreObj.Height() - rcCurObj.Height()) >= 2 ) {
448ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov            return 0;
449ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        }
450ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        CPDF_TextObject* pPreTextObj = (CPDF_TextObject*)pPreObj;
451ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        CPDF_TextObject* pCurTextObj = (CPDF_TextObject*)pObj;
452ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        int nPreCount = pPreTextObj->CountItems();
453ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        int nCurCount = pCurTextObj->CountItems();
454ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        if (nPreCount != nCurCount) {
455ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov            return 0;
456ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        }
457ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        FX_BOOL bSame = TRUE;
458ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        for (int i = 0; i < nPreCount; i++) {
459ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov            CPDF_TextObjectItem itemPer, itemCur;
460ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov            pPreTextObj->GetItemInfo(i, &itemPer);
461ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov            pCurTextObj->GetItemInfo(i, &itemCur);
462ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov            if (itemCur.m_CharCode != itemPer.m_CharCode) {
463ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                return 0;
464ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov            }
465ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov            if (itemCur.m_OriginX != itemPer.m_OriginX) {
466ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                bSame = FALSE;
467ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov            }
468ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov            if (itemCur.m_OriginY != itemPer.m_OriginY) {
469ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                bSame = FALSE;
470ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov            }
471ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        }
472ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        if(rcPreObj.left == rcCurObj.left && rcPreObj.top == rcCurObj.top) {
473ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov            return 1;
474ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        }
475ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        if(FXSYS_fabs(rcPreObj.left - rcCurObj.left) < rcPreObj.Width() / 3
476ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                && FXSYS_fabs(rcPreObj.top - rcCurObj.top) < rcPreObj.Height() / 3) {
477ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov            return 2;
478ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        }
479ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    }
480ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    return 0;
481ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov}
482ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganovvoid CPDF_AutoReflowLayoutProvider::GenerateLine(CFX_PtrArray& cellArray)
483ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{
484ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    CRF_CELL* pCell = NULL;
485ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    CFX_AffineMatrix matrix;
486ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    FX_POSITION pos = m_pPDFPage->GetFirstObjectPosition();
487ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    if(!pos) {
488ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        return;
489ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    }
490ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    FX_FLOAT PDFWidth = m_pPDFPage->GetPageWidth();
491ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    FX_FLOAT PDFHeight = m_pPDFPage->GetPageHeight();
492ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    m_pPDFPage->GetDisplayMatrix(m_PDFDisplayMatrix, 0, 0, (int)PDFWidth, (int)PDFHeight, 0);
493ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    CPDF_PageObject* pPerObj = NULL;
494ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    int a = 0;
495ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    CFX_FloatRect pageBBox = m_pPDFPage->m_BBox;
496ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    FX_FLOAT PrevX = 0 , PrevY = 0, PosX, PosY;
497ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    while(pos) {
498ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        CPDF_PageObject* pObj = m_pPDFPage->GetNextObject(pos);
499ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        if(!pObj || pObj->m_Type == PDFPAGE_PATH) {
500ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov            continue;
501ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        }
502ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        int logic = LogicPreObj(pObj);
503ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        if(logic == 2) {
504ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov            if(pCell) {
505ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                pCell->m_ObjList.SetAt(pCell->m_ObjList.GetTailPosition(), pObj);
506ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov            }
507ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov            continue;
508ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        }
509ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        if (pObj->m_Type == PDFPAGE_TEXT) {
510ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov            CPDF_TextObject* pTextObj = (CPDF_TextObject*)pObj;
511ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov            int textmode = pTextObj->m_TextState.GetObject()->m_TextMode;
512ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov            if(m_Style.m_bIgnoreInvisibleText && pTextObj->m_TextState.GetObject()->m_TextMode == 3) {
513ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                continue;
514ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov            }
515ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov            PosX = pTextObj->GetPosX();
516ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov            PosY = pTextObj->GetPosY();
517ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov            m_PDFDisplayMatrix.Transform(PosX, PosY);
518ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        } else {
519ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov            PosX = 0;
520ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov            PosY = 0;
521ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        }
522ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        FX_BOOL bNewLine = TRUE;
523ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        FX_RECT ObjBBox = pObj->GetBBox(&m_PDFDisplayMatrix);
524ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        if(ObjBBox.left > PDFWidth || ObjBBox.right < 0 ||
525ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                ObjBBox.bottom < 0 || ObjBBox.top > PDFHeight) {
526ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov            continue;
527ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        }
528ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        if(ObjBBox.IsEmpty()) {
529ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov            continue;
530ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        }
531ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        a++;
532ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        if(!pCell) {
533ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov            bNewLine = TRUE;
534ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov            m_WritingMode = GetWritingMode(NULL, pObj);
535ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        } else {
536ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov            int WritingMode = GetWritingMode(pPerObj, pObj);
537ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov            if(m_WritingMode == WritingMode || m_WritingMode == WritingMode_UNKNOW || WritingMode == WritingMode_UNKNOW) {
538ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                if(WritingMode != WritingMode_UNKNOW) {
539ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                    m_WritingMode = WritingMode;
540ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                }
541ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                if(m_WritingMode == WritingMode_TBRL) {
542ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                    if(!(GetRectBottom(ObjBBox) > GetRectTop(pCell->m_BBox) ||
543ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                            GetRectTop(ObjBBox) < GetRectBottom(pCell->m_BBox))) {
544ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                        bNewLine = FALSE;
545ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                    }
546ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                } else {
547ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                    if(!(GetRectBottom(ObjBBox) < GetRectTop(pCell->m_BBox) ||
548ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                            GetRectTop(ObjBBox) > GetRectBottom(pCell->m_BBox))) {
549ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                        bNewLine = FALSE;
550ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                    }
551ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                    if (pObj->m_Type == PDFPAGE_TEXT) {
552ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                        if(FXSYS_fabs(PrevY - PosY) < 1 ) {
553ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                            bNewLine = FALSE;
554ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                        }
555ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                    }
556ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                }
557ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov            } else {
558ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                m_WritingMode = WritingMode;
559ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov            }
560ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        }
561ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        pPerObj = pObj;
562ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        if(bNewLine) {
563ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov            int c = pCell ? pCell->m_ObjList.GetCount() : 0;
564ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov            pCell = FX_NEW CRF_CELL;
565ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov            pCell->m_CellWritingMode = m_WritingMode;
566ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov            pCell->m_BBox = ObjBBox;
567ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov            if(pObj->m_Type == PDFPAGE_TEXT) {
568ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                FX_FLOAT x = ((CPDF_TextObject*)pObj)->GetPosX(), y = ((CPDF_TextObject*)pObj)->GetPosY();
569ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                m_PDFDisplayMatrix.Transform(x, y);
570ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                if(x < ObjBBox.left) {
571ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                    pCell->m_BBox.left = (int)x;
572ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                }
573ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov            }
574ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov            pCell->m_ObjList.AddTail(pObj);
575ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov            cellArray.Add(pCell);
576ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        } else {
577ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov            pCell->m_ObjList.AddTail(pObj);
578ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov            pCell->m_BBox.Union(ObjBBox);
579ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        }
580ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        PrevX = PosX;
581ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        PrevY = PosY;
582ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    }
583ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov}
584ee451cb395940862dad63c85adfe8f2fd55e864cSvet GanovFX_FLOAT CPDF_AutoReflowLayoutProvider::GetLayoutOrderHeight(CPDF_PageObject* pCurObj)
585ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{
586ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    CFX_FloatRect rcCurObj(pCurObj->m_Left, pCurObj->m_Bottom, pCurObj->m_Right, pCurObj->m_Top);
587ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    if (m_WritingMode == WritingMode_TBRL) {
588ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        return rcCurObj.Width();
589ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    }
590ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    return rcCurObj.Height();
591ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov}
592ee451cb395940862dad63c85adfe8f2fd55e864cSvet GanovFX_FLOAT CPDF_AutoReflowLayoutProvider::GetLayoutOrderWidth(CPDF_PageObject* pCurObj)
593ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{
594ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    CFX_FloatRect rcCurObj(pCurObj->m_Left, pCurObj->m_Bottom, pCurObj->m_Right, pCurObj->m_Top);
595ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    if (m_WritingMode == WritingMode_TBRL) {
596ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        return rcCurObj.Height();
597ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    }
598ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    return rcCurObj.Width();
599ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov}
600ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganovint CPDF_AutoReflowLayoutProvider:: GetRectWidth(FX_RECT rect)
601ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{
602ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    if(m_WritingMode == WritingMode_TBRL) {
603ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        return rect.Height();
604ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    }
605ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    return rect.Width();
606ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov}
607ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganovint CPDF_AutoReflowLayoutProvider:: GetRectHeight(FX_RECT rect)
608ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{
609ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    if(m_WritingMode == WritingMode_TBRL) {
610ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        return rect.Width();
611ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    }
612ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    return rect.Height();
613ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov}
614ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganovint CPDF_AutoReflowLayoutProvider:: GetRectStart(FX_RECT rect)
615ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{
616ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    if(m_WritingMode == WritingMode_TBRL) {
617ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        return rect.top;
618ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    }
619ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    return rect.left;
620ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov}
621ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganovint CPDF_AutoReflowLayoutProvider:: GetRectEnd(FX_RECT rect)
622ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{
623ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    if(m_WritingMode == WritingMode_TBRL) {
624ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        return rect.bottom;
625ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    }
626ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    return rect.right;
627ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov}
628ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganovint CPDF_AutoReflowLayoutProvider:: GetRectTop(FX_RECT rect)
629ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{
630ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    if(m_WritingMode == WritingMode_TBRL) {
631ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        return rect.right;
632ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    }
633ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    return rect.top;
634ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov}
635ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganovint CPDF_AutoReflowLayoutProvider:: GetRectBottom(FX_RECT rect)
636ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{
637ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    if(m_WritingMode == WritingMode_TBRL) {
638ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        return rect.left;
639ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    }
640ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    return rect.bottom;
641ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov}
642ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganovint CPDF_AutoReflowLayoutProvider::GetWritingMode(CPDF_PageObject* pPreObj, CPDF_PageObject* pCurObj)
643ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{
644ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    CFX_FloatRect rcCurObj(pCurObj->m_Left, pCurObj->m_Bottom, pCurObj->m_Right, pCurObj->m_Top);
645ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    if(pCurObj->m_Type == PDFPAGE_TEXT) {
646ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        CPDF_TextObject* ptextObj = (CPDF_TextObject* )pCurObj;
647ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        int count = ptextObj->CountItems();
648ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        if(count > 1) {
649ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov            CPDF_TextObjectItem Item1, Item2;
650ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov            ptextObj->GetItemInfo(0, &Item1);
651ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov            ptextObj->GetItemInfo(count - 1, &Item2);
652ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov            if(Item2.m_CharCode == -1 && count > 2) {
653ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                ptextObj->GetItemInfo(2, &Item2);
654ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov            }
655ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov            CFX_AffineMatrix textMatrix;
656ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov            ptextObj->GetTextMatrix(&textMatrix);
657ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov            textMatrix.Transform(Item1.m_OriginX, Item1.m_OriginY);
658ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov            textMatrix.Transform(Item2.m_OriginX, Item2.m_OriginY);
659ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov            FX_FLOAT dx = FXSYS_fabs(Item1.m_OriginX - Item2.m_OriginX);
660ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov            FX_FLOAT dy = FXSYS_fabs(Item1.m_OriginY - Item2.m_OriginY);
661ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov            return dx >= dy ? WritingMode_LRTB : WritingMode_TBRL;
662ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        } else {
663ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov            if(m_WritingMode != WritingMode_UNKNOW) {
664ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                return m_WritingMode;
665ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov            }
666ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        }
667ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    }
668ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    if(pPreObj) {
669ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        FX_FLOAT threshold = rcCurObj.Width() / 4;
670ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        if(m_WritingMode == WritingMode_LRTB) {
671ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov            if(FXSYS_fabs(pPreObj->m_Bottom - pCurObj->m_Bottom) < threshold * 2
672ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                    && FXSYS_fabs(pPreObj->m_Top - pCurObj->m_Top) < threshold * 2) {
673ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                return m_WritingMode;
674ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov            }
675ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov            FX_FLOAT mid = (pCurObj->m_Bottom + pCurObj->m_Top) / 2;
676ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov            if(mid > pPreObj->m_Bottom && mid < pPreObj->m_Top && pCurObj->m_Right > pPreObj->m_Right) {
677ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                return m_WritingMode;
678ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov            }
679ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        } else if(m_WritingMode == WritingMode_TBRL) {
680ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov            if(FXSYS_fabs(pPreObj->m_Left - pCurObj->m_Left) < threshold * 2
681ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                    && FXSYS_fabs(pPreObj->m_Right - pCurObj->m_Right) < threshold * 2) {
682ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                return m_WritingMode;
683ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov            }
684ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov            FX_FLOAT mid = (pCurObj->m_Right + pCurObj->m_Left) / 2;
685ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov            if(mid > pPreObj->m_Left && mid < pPreObj->m_Right && pCurObj->m_Bottom < pPreObj->m_Bottom) {
686ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                return m_WritingMode;
687ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov            }
688ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        }
689ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        if(FXSYS_fabs(pPreObj->m_Left - pCurObj->m_Left) < threshold &&
690ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                FXSYS_fabs(pPreObj->m_Bottom - pCurObj->m_Bottom) > threshold * 2) {
691ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov            return WritingMode_TBRL;
692ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        }
693ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        if(FXSYS_fabs(pPreObj->m_Left - pCurObj->m_Left) > threshold &&
694ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                FXSYS_fabs(pPreObj->m_Bottom - pCurObj->m_Bottom) < threshold * 2) {
695ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov            return WritingMode_LRTB;
696ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        }
697ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        int count = 0;
698ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        if(pPreObj->m_Type == PDFPAGE_TEXT) {
699ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov            CPDF_TextObject* ptextObj = (CPDF_TextObject* )pCurObj;
700ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov            count = ptextObj->CountItems();
701ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        }
702ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        if(pPreObj->m_Type != PDFPAGE_TEXT || count == 1) {
703ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov            if(pCurObj->m_Left > pPreObj->m_Right) {
704ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                FX_FLOAT mid = (pCurObj->m_Top + pCurObj->m_Bottom) / 2;
705ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                if(mid < pPreObj->m_Top && mid > pPreObj->m_Bottom) {
706ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                    return WritingMode_LRTB;
707ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                }
708ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov            }
709ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov            if(pCurObj->m_Top < pPreObj->m_Bottom) {
710ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                FX_FLOAT mid = (pCurObj->m_Left + pCurObj->m_Right) / 2;
711ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                if(mid < pPreObj->m_Right && mid > pPreObj->m_Left) {
712ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                    return WritingMode_TBRL;
713ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                }
714ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov            }
715ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        }
716ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    }
717ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    return WritingMode_UNKNOW;
718ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov}
719ee451cb395940862dad63c85adfe8f2fd55e864cSvet GanovLayoutStatus CPDF_AutoReflowLayoutProvider::StartLoad(IFX_Pause* pPause)
720ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{
721ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    m_pPause = pPause;
722ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    m_pRoot = FX_NEW CPDF_AutoReflowElement(LayoutDocument);
723ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    if(!m_pRoot) {
724ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        return LayoutError;
725ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    }
726ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    m_Step = 0;
727ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    return Continue();
728ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov}
729ee451cb395940862dad63c85adfe8f2fd55e864cSvet GanovLayoutStatus CPDF_AutoReflowLayoutProvider::Continue()
730ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{
731ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    GenerateStructTree();
732ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    return m_Status;
733ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov}
734ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganovint	CPDF_AutoReflowLayoutProvider::GetPosition()
735ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{
736ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    if(m_Step == 0) {
737ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        return 0;
738ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    } else {
739ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        return m_Step * 100 / AUTOREFLOW_STEP_REMOVEDATA;
740ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    }
741ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov}
742ee451cb395940862dad63c85adfe8f2fd55e864cSvet GanovFX_FLOAT CPDF_AutoReflowLayoutProvider::GetObjMinCell(CPDF_PageObject* pObj)
743ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{
744ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    if(!pObj) {
745ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        return 0;
746ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    }
747ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    if(pObj->m_Type != PDFPAGE_TEXT) {
748ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        CFX_AffineMatrix matrix;
749ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        FX_RECT rect = pObj->GetBBox(&matrix);
750ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        return (FX_FLOAT)(rect.Width());
751ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    }
752ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    CPDF_TextObject* pTextObj = (CPDF_TextObject* )pObj;
753ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    int count = pTextObj->CountItems();
754ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    for(int i = 0; i < count; i++) {
755ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        CPDF_TextObjectItem Item;
756ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        pTextObj->GetItemInfo(i, &Item);
757ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        if(Item.m_CharCode == -1) {
758ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov            continue;
759ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        }
760ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        if((Item.m_CharCode > 47 && Item.m_CharCode < 58) || (Item.m_CharCode > 64 && Item.m_CharCode < 91)
761ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                || (Item.m_CharCode > 96 && Item.m_CharCode < 123)) {
762ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov            continue;
763ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        }
764ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        if(Item.m_CharCode > 127 || (Item.m_CharCode > 32 && Item.m_CharCode < 35) || Item.m_CharCode == 37 ||
765ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                (Item.m_CharCode > 38 && Item.m_CharCode < 42) || Item.m_CharCode == 44 || Item.m_CharCode == 46 ||
766ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                Item.m_CharCode == 58 || Item.m_CharCode == 59 || Item.m_CharCode == 63 || Item.m_CharCode == 93) {
767ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov            if(i == count - 1) {
768ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                CFX_AffineMatrix matrix;
769ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                FX_RECT rect = pObj->GetBBox(&matrix);
770ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                return (FX_FLOAT)(rect.Width());
771ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov            } else {
772ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                pTextObj->GetItemInfo(i + 1, &Item);
773ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                return Item.m_OriginX;
774ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov            }
775ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        }
776ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        return Item.m_OriginX;
777ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    }
778ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    CFX_AffineMatrix matrix;
779ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    FX_RECT rect = pObj->GetBBox(&matrix);
780ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    return (FX_FLOAT)(rect.Width());
781ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov}
782