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 "reflowedtextpage.h"
8ee451cb395940862dad63c85adfe8f2fd55e864cSvet GanovIPDF_TextPage*	IPDF_TextPage::CreateReflowTextPage(IPDF_ReflowedPage* pRefPage)
9ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{
10ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    return FX_NEW CRF_TextPage(pRefPage);
11ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov}
12ee451cb395940862dad63c85adfe8f2fd55e864cSvet GanovCRF_TextPage::CRF_TextPage(IPDF_ReflowedPage* pRefPage)
13ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{
14ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    m_pRefPage = (CPDF_ReflowedPage*)(pRefPage);
15ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    m_pDataList = NULL;
16ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    m_CountBSArray = NULL;
17ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov}
18ee451cb395940862dad63c85adfe8f2fd55e864cSvet GanovCRF_TextPage::~CRF_TextPage()
19ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{
20ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    if(m_pDataList) {
21ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        delete m_pDataList;
22ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        m_pDataList = NULL;
23ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    }
24ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    if(m_CountBSArray) {
25ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        delete m_CountBSArray;
26ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        m_CountBSArray = NULL;
27ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    }
28ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov}
29ee451cb395940862dad63c85adfe8f2fd55e864cSvet GanovFX_BOOL CRF_TextPage::ParseTextPage()
30ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{
31ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    if(!m_pRefPage) {
32ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        return FALSE;
33ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    }
34ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    int count = m_pRefPage->m_pReflowed->GetSize();
35ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    if(count < 500) {
36ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        m_pDataList = FX_NEW CRF_CharDataPtrArray(count);
37ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    } else {
38ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        m_pDataList = FX_NEW CRF_CharDataPtrArray(500);
39ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    }
40ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    if (NULL == m_pDataList) {
41ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        return FALSE;
42ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    }
43ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    for(int i = 0; i < count; i++) {
44ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        CRF_Data* pData = (*(m_pRefPage->m_pReflowed))[i];
45ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        if(pData->GetType() == CRF_Data::Text) {
46ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov            m_pDataList->Add((CRF_CharData*)pData);
47ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        }
48ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    }
49ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    m_CountBSArray = FX_NEW CFX_CountBSINT32Array(20);
50ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    if(NULL == m_CountBSArray) {
51ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        return FALSE;
52ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    }
53ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    return TRUE;
54ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov}
55ee451cb395940862dad63c85adfe8f2fd55e864cSvet GanovFX_BOOL	CRF_TextPage::IsParsered() const
56ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{
57ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    if(m_pDataList) {
58ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        return TRUE;
59ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    }
60ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    return FALSE;
61ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov}
62ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganovint CRF_TextPage::CharIndexFromTextIndex(int TextIndex) const
63ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{
64ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    return TextIndex;
65ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov}
66ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganovint CRF_TextPage::TextIndexFromCharIndex(int CharIndex) const
67ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{
68ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    return CharIndex;
69ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov}
70ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
71ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganovint	CRF_TextPage::CountChars() const
72ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{
73ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    if (NULL == m_pDataList) {
74ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        return -1;
75ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    }
76ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    return m_pDataList->GetSize();
77ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov}
78ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganovvoid CRF_TextPage::GetCharInfo(int index, FPDF_CHAR_INFO & info) const
79ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{
80ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    if(index >= CountChars() || index < 0 || !m_pDataList) {
81ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        return;
82ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    }
83ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    CRF_CharData* pData = (*m_pDataList)[index];
84ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    FX_FLOAT ReltiveCorddDs = pData->m_pCharState->m_fDescent;
85ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    FX_FLOAT ReltiveCorddAs = pData->m_pCharState->m_fAscent;
86ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    info.m_Flag		= CHAR_NORMAL;
87ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    info.m_pTextObj	= pData->m_pCharState->m_pTextObj;
88ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    info.m_OriginX	= pData->m_PosX;
89ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    info.m_OriginY	= pData->m_PosY - ReltiveCorddDs;
90ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    info.m_FontSize	= pData->m_pCharState->m_fFontSize;
91ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    CFX_FloatRect FloatRectTmp(pData->m_PosX, pData->m_PosY, pData->m_PosX + pData->m_Width, pData->m_PosY + ReltiveCorddAs - ReltiveCorddDs);
92ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    info.m_CharBox	= FloatRectTmp;
93ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    CFX_WideString str = pData->m_pCharState->m_pFont->UnicodeFromCharCode(pData->m_CharCode);
94ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    if(!str.IsEmpty()) {
95ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        info.m_Unicode	= str.GetAt(0);
96ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    } else {
97ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        info.m_Unicode = -1;
98ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    }
99ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    info.m_Charcode = (FX_WCHAR)pData->m_CharCode;
100ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    info.m_Matrix = CFX_Matrix(1, 0, 0, 1, 0, 0);
101ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov}
102ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganovextern FX_BOOL GetIntersection(FX_FLOAT low1, FX_FLOAT high1, FX_FLOAT low2, FX_FLOAT high2, FX_FLOAT& interlow, FX_FLOAT& interhigh);
103ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganovinline FX_BOOL _IsInsameline(const CFX_FloatRect& rectA, const CFX_FloatRect& rectB)
104ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{
105ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    if((rectA.top >= rectB.bottom && rectB.top >= rectA.bottom)) {
106ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        return TRUE;
107ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    } else {
108ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        return FALSE;
109ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    }
110ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov}
111ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganovinline FX_BOOL _IsIntersect(const CFX_FloatRect& rectA, const CFX_FloatRect& rectB)
112ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{
113ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    FX_FLOAT interlow = .0f, interhigh = .0f;
114ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    if(GetIntersection(rectA.bottom, rectA.top, rectB.bottom, rectB.top, interlow, interhigh)) {
115ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        if(GetIntersection(rectA.left, rectA.right, rectB.left, rectB.right, interlow, interhigh)) {
116ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov            return TRUE;
117ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        } else {
118ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov            return FALSE;
119ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        }
120ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    }
121ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    return FALSE;
122ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov}
123ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganovvoid CRF_TextPage::GetRectArray(int start, int nCount, CFX_RectArray& rectArray) const
124ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{
125ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    int indexlen = start + nCount;
126ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    FPDF_CHAR_INFO info;
127ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    FX_BOOL bstart = TRUE;
128ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    CFX_FloatRect recttmp;
129ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    int i;
130ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    for(i = start; i < indexlen; i++) {
131ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        GetCharInfo(i, info);
132ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        if(bstart) {
133ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov            recttmp = info.m_CharBox;
134ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov            bstart = FALSE;
135ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        } else if(_IsInsameline(recttmp, info.m_CharBox)) {
136ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov            recttmp.right = info.m_CharBox.right;
137ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov            if(info.m_CharBox.top > recttmp.top) {
138ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                recttmp.top = info.m_CharBox.top;
139ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov            }
140ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov            if(info.m_CharBox.bottom < recttmp.bottom) {
141ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                recttmp.bottom = info.m_CharBox.bottom;
142ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov            }
143ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        } else {
144ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov            rectArray.Add(recttmp);
145ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov            recttmp = info.m_CharBox;
146ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        }
147ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    }
148ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    rectArray.Add(recttmp);
149ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov}
150ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganovinline FX_FLOAT _GetDistance(CFX_FloatRect floatRect, CPDF_Point point)
151ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{
152ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    if(floatRect.right < point.x && floatRect.bottom > point.y) {
153ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        return FXSYS_sqrt(FXSYS_pow(point.x - floatRect.right, 2) + FXSYS_pow(floatRect.bottom - point.y, 2));
154ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    }
155ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    if (floatRect.right < point.x && floatRect.top < point.y) {
156ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        return FXSYS_sqrt(FXSYS_pow(point.x - floatRect.right, 2) + FXSYS_pow(point.y - floatRect.top, 2));
157ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    }
158ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    if(floatRect.left > point.x && floatRect.bottom > point.y) {
159ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        return FXSYS_sqrt(FXSYS_pow(floatRect.bottom - point.y, 2) + FXSYS_pow(floatRect.left - point.x, 2));
160ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    }
161ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    if((floatRect.right > point.x || FXSYS_fabs(floatRect.right - point.x) <= 0.0001f) &&
162ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov            (floatRect.left < point.x || FXSYS_fabs(floatRect.left - point.x) <= 0.0001f) && floatRect.bottom > point.y) {
163ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        return FXSYS_fabs(floatRect.bottom - point.y);
164ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    }
165ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    if(floatRect.left > point.x && (floatRect.bottom < point.y || FXSYS_fabs(floatRect.bottom - point.y) <= 0.0001f) &&
166ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov            (floatRect.top > point.y || FXSYS_fabs(floatRect.top - point.y) <= 0.0001f)) {
167ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        return FXSYS_fabs(floatRect.left - point.x);
168ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    }
169ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    if(floatRect.left > point.x && floatRect.top < point.y) {
170ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        return FXSYS_sqrt(FXSYS_pow(floatRect.left - point.x, 2) + FXSYS_pow(point.y - floatRect.top, 2));
171ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    }
172ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    if ((floatRect.left < point.x || FXSYS_fabs(floatRect.left - point.x) <= 0.0001f) &&
173ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov            (floatRect.right > point.x || FXSYS_fabs(floatRect.right - point.x) <= 0.0001f) && floatRect.top < point.y) {
174ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        return FXSYS_fabs(point.y - floatRect.top);
175ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    }
176ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    if(floatRect.right < point.x && (floatRect.top > point.y || FXSYS_fabs(floatRect.top - point.y) <= 0.0001f) &&
177ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov            (floatRect.bottom < point.y || FXSYS_fabs(floatRect.bottom - point.y) <= 0.0001f)) {
178ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        return point.x - floatRect.right;
179ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    }
180ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    return .0f;
181ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov}
182ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganovint CRF_TextPage::GetIndexAtPos(CPDF_Point point, FX_FLOAT xTorelance, FX_FLOAT yTorelance) const
183ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{
184ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    int index = -1, i = 0, j = 0;
185ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    FPDF_CHAR_INFO info;
186ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    CFX_FloatRect rectTmp;
187ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    FX_FLOAT MinDistance = 1000, DistanceTmp = 0;
188ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    FX_FLOAT rect_bottom = point.x - xTorelance;
189ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    CFX_FloatRect TorelanceRect(rect_bottom <= 0 ? 0 : rect_bottom, point.y - yTorelance, point.x + xTorelance, point.y + yTorelance);
190ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    int count = CountChars();
191ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    for(i = 0; i < count; i++) {
192ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        GetCharInfo(i, info);
193ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        rectTmp = info.m_CharBox;
194ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        if(rectTmp.Contains(point.x, point.y)) {
195ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov            index = i;
196ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov            break;
197ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        } else if(_IsIntersect(rectTmp, TorelanceRect)) {
198ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov            DistanceTmp = _GetDistance(rectTmp, point);
199ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov            if(DistanceTmp < MinDistance) {
200ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                MinDistance = DistanceTmp;
201ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                index = i;
202ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov            }
203ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        }
204ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    }
205ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    return index;
206ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov}
207ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganovint CRF_TextPage::GetIndexAtPos(FX_FLOAT x, FX_FLOAT y, FX_FLOAT xTorelance, FX_FLOAT yTorelance) const
208ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{
209ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    int index = 0;
210ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    CPDF_Point point(x, y);
211ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    if((index = GetIndexAtPos(point, xTorelance, yTorelance)) < 0) {
212ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        return -1;
213ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    } else {
214ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        return index;
215ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    }
216ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov}
217ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganovint CRF_TextPage::GetOrderByDirection(int index, int direction) const
218ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{
219ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    return -1;
220ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov}
221ee451cb395940862dad63c85adfe8f2fd55e864cSvet GanovCFX_WideString CRF_TextPage::GetTextByRect(CFX_FloatRect rect) const
222ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{
223ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    int count;
224ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    FPDF_CHAR_INFO info;
225ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    CFX_WideString str;
226ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    CFX_FloatRect  Recttmp;
227ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    FX_BOOL bstart = TRUE;
228ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    count = CountChars();
229ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    if(rect.IsEmpty()) {
230ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        return L"";
231ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    }
232ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    for(int i = 0; i < count; i++) {
233ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        GetCharInfo(i, info);
234ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        if(_IsIntersect(rect, info.m_CharBox)) {
235ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov            if(bstart) {
236ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                Recttmp = info.m_CharBox;
237ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                str += info.m_Unicode;
238ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                bstart = FALSE;
239ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov            } else if(_IsInsameline(Recttmp, info.m_CharBox)) {
240ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                str += info.m_Unicode;
241ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov            } else {
242ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                str += L"\r\n";
243ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                Recttmp = info.m_CharBox;
244ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                str += info.m_Unicode;
245ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov            }
246ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        }
247ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    }
248ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    if(str.IsEmpty()) {
249ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        return L"";
250ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    } else {
251ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        return str;
252ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    }
253ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov}
254ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganovvoid CRF_TextPage::GetRectsArrayByRect(CFX_FloatRect rect, CFX_RectArray& resRectArray) const
255ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{
256ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    int count, i;
257ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    FX_BOOL bstart = TRUE;
258ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    FPDF_CHAR_INFO info;
259ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    CFX_FloatRect recttmp;
260ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    count = CountChars();
261ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    for(i = 0; i < count; i++) {
262ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        GetCharInfo(i, info);
263ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        if(_IsIntersect(rect, info.m_CharBox)) {
264ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov            if(bstart) {
265ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                recttmp = info.m_CharBox;
266ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                bstart = FALSE;
267ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov            } else if(_IsInsameline(recttmp, info.m_CharBox)) {
268ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                recttmp.right = info.m_CharBox.right;
269ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                if(info.m_CharBox.top > recttmp.top) {
270ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                    recttmp.top = info.m_CharBox.top;
271ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                }
272ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                if(info.m_CharBox.bottom < recttmp.bottom) {
273ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                    recttmp.bottom = info.m_CharBox.bottom;
274ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                }
275ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov            } else {
276ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                resRectArray.Add(recttmp);
277ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                recttmp = info.m_CharBox;
278ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov            }
279ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        }
280ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    }
281ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    resRectArray.Add(recttmp);
282ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov}
283ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganovint CRF_TextPage::CountRects(int start, int nCount)
284ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{
285ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    m_rectArray.RemoveAll();
286ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    GetRectArray(start, nCount, m_rectArray);
287ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    return m_rectArray.GetSize();
288ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov}
289ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganovvoid CRF_TextPage::GetRect(int rectIndex, FX_FLOAT& left, FX_FLOAT& top, FX_FLOAT& right, FX_FLOAT &bottom) const
290ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{
291ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    if(m_rectArray.GetSize() <= rectIndex) {
292ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        return;
293ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    }
294ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    left   = m_rectArray[rectIndex].left;
295ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    top    = m_rectArray[rectIndex].top;
296ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    right  = m_rectArray[rectIndex].right;
297ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    bottom = m_rectArray[rectIndex].bottom;
298ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov}
299ee451cb395940862dad63c85adfe8f2fd55e864cSvet GanovFX_BOOL CRF_TextPage::GetBaselineRotate(int rectIndex, int& Rotate)
300ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{
301ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    Rotate = 0;
302ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    return TRUE;
303ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov}
304ee451cb395940862dad63c85adfe8f2fd55e864cSvet GanovFX_BOOL CRF_TextPage::GetBaselineRotate(CFX_FloatRect rect, int& Rotate)
305ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{
306ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    Rotate = 0;
307ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    return TRUE;
308ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov}
309ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganovint CRF_TextPage::CountBoundedSegments(FX_FLOAT left, FX_FLOAT top, FX_FLOAT right, FX_FLOAT bottom, FX_BOOL bContains)
310ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{
311ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    if (!m_CountBSArray) {
312ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        return -1;
313ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    }
314ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    m_CountBSArray->RemoveAll();
315ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    CFX_FloatRect floatrect(left, bottom, right, top);
316ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    int totalcount, i, j = 0, counttmp = 0;
317ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    FX_BOOL bstart = TRUE;
318ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    FPDF_CHAR_INFO info;
319ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    CFX_FloatRect recttmp;
320ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    totalcount = CountChars();
321ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    for(i = 0; i < totalcount; i++) {
322ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        GetCharInfo(i, info);
323ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        if(_IsIntersect(floatrect, info.m_CharBox)) {
324ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov            if(bstart) {
325ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                m_CountBSArray->Add(i);
326ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                counttmp = 1;
327ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                recttmp = info.m_CharBox;
328ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                bstart = FALSE;
329ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov            } else if(_IsInsameline(recttmp, info.m_CharBox)) {
330ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                recttmp.right = info.m_CharBox.right;
331ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                if(info.m_CharBox.top > recttmp.top) {
332ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                    recttmp.top = info.m_CharBox.top;
333ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                }
334ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                if(info.m_CharBox.bottom < recttmp.bottom) {
335ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                    recttmp.bottom = info.m_CharBox.bottom;
336ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                }
337ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                counttmp ++;
338ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov            } else {
339ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                m_CountBSArray->Add(counttmp);
340ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                m_CountBSArray->Add(i);
341ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                counttmp = 1;
342ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                j++;
343ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                recttmp = info.m_CharBox;
344ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov            }
345ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        }
346ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    }
347ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    m_CountBSArray->Add(counttmp);
348ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    j++;
349ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    return j;
350ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov}
351ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganovvoid CRF_TextPage::GetBoundedSegment(int index, int& start, int& count) const
352ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{
353ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    if (!m_CountBSArray) {
354ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        return;
355ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    }
356ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    if(m_CountBSArray->GetSize() <= index * 2) {
357ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        start = 0;
358ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        count = 0;
359ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        return;
360ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    }
361ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    start = *(int *)m_CountBSArray->GetAt(index * 2);
362ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    count = *(int *)m_CountBSArray->GetAt(index * 2 + 1);
363ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov}
364ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
365ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganovint CRF_TextPage::GetWordBreak(int index, int direction) const
366ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{
367ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    return -1;
368ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov}
369ee451cb395940862dad63c85adfe8f2fd55e864cSvet GanovCFX_WideString CRF_TextPage::GetPageText(int start, int nCount ) const
370ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{
371ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    if(nCount == -1) {
372ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        nCount = CountChars();
373ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        start = 0;
374ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    } else if(nCount < 1) {
375ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        return L"";
376ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    } else if(start >= CountChars()) {
377ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        return L"";
378ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    }
379ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    int i, index = start + nCount;
380ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    FPDF_CHAR_INFO info;
381ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    CFX_WideString str;
382ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    CFX_FloatRect recttmp;
383ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    FX_BOOL bstart = TRUE;
384ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    for(i = start; i < index; i++) {
385ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        GetCharInfo(i, info);
386ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        if(bstart) {
387ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov            recttmp = info.m_CharBox;
388ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov            str += info.m_Unicode;
389ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov            bstart = FALSE;
390ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        } else if (_IsInsameline(recttmp, info.m_CharBox)) {
391ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov            str += info.m_Unicode;
392ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        } else {
393ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov            str += L"\r\n";
394ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov            recttmp = info.m_CharBox;
395ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov            str += info.m_Unicode;
396ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        }
397ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    }
398ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    if(str.IsEmpty()) {
399ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        return L"";
400ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    }
401ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    return str;
402ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov}
403