1e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov// Copyright 2014 PDFium Authors. All rights reserved.
2e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov// Use of this source code is governed by a BSD-style license that can be
3e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov// found in the LICENSE file.
4e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov
5e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
6e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov
7e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov#include "../../include/fpdfdoc/fpdf_doc.h"
8e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov#include "../../include/fpdfdoc/fpdf_vt.h"
9e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov#include "pdf_vt.h"
10e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganovconst FX_BYTE gFontSizeSteps[] = {	4, 6, 8, 9, 10,	12, 14, 18, 20, 25,	30, 35, 40, 45, 50,	55, 60, 70, 80, 90,	100, 110, 120, 130, 144};
11e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov#define PVT_RETURN_LENGTH					1
12e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov#define PVT_DEFAULT_FONTSIZE				18.0f
13e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov#define PVTWORD_SCRIPT_NORMAL				0
14e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov#define PVTWORD_SCRIPT_SUPER				1
15e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov#define PVTWORD_SCRIPT_SUB					2
16e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov#define	PVT_FONTSCALE						0.001f
17e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov#define PVT_PERCENT							0.01f
18e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov#define PVT_HALF							0.5f
19e6986e1e8d4a57987f47c215490cb080a65ee29aSvet GanovCLine::CLine()
20e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov{
21e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov}
22e6986e1e8d4a57987f47c215490cb080a65ee29aSvet GanovCLine::~CLine()
23e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov{
24e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov}
25e6986e1e8d4a57987f47c215490cb080a65ee29aSvet GanovCPVT_WordPlace CLine::GetBeginWordPlace() const
26e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov{
27e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov    return CPVT_WordPlace(LinePlace.nSecIndex, LinePlace.nLineIndex, -1);
28e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov}
29e6986e1e8d4a57987f47c215490cb080a65ee29aSvet GanovCPVT_WordPlace CLine::GetEndWordPlace() const
30e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov{
31e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov    return CPVT_WordPlace(LinePlace.nSecIndex, LinePlace.nLineIndex, m_LineInfo.nEndWordIndex);
32e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov}
33e6986e1e8d4a57987f47c215490cb080a65ee29aSvet GanovCPVT_WordPlace CLine::GetPrevWordPlace(const CPVT_WordPlace & place) const
34e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov{
35e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov    if (place.nWordIndex > m_LineInfo.nEndWordIndex) {
36e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov        return CPVT_WordPlace(place.nSecIndex, place.nLineIndex, m_LineInfo.nEndWordIndex);
37e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov    }
38e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov    return CPVT_WordPlace(place.nSecIndex, place.nLineIndex, place.nWordIndex - 1);
39e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov}
40e6986e1e8d4a57987f47c215490cb080a65ee29aSvet GanovCPVT_WordPlace CLine::GetNextWordPlace(const CPVT_WordPlace & place) const
41e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov{
42e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov    if (place.nWordIndex < m_LineInfo.nBeginWordIndex) {
43e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov        return CPVT_WordPlace(place.nSecIndex, place.nLineIndex, m_LineInfo.nBeginWordIndex);
44e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov    }
45e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov    return CPVT_WordPlace(place.nSecIndex, place.nLineIndex, place.nWordIndex + 1);
46e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov}
47e6986e1e8d4a57987f47c215490cb080a65ee29aSvet GanovCSection::CSection(CPDF_VariableText * pVT) : m_pVT(pVT)
48e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov{
49e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov}
50e6986e1e8d4a57987f47c215490cb080a65ee29aSvet GanovCSection::~CSection()
51e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov{
52e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov    ResetAll();
53e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov}
54e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganovvoid CSection::ResetAll()
55e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov{
56e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov    ResetWordArray();
57e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov    ResetLineArray();
58e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov}
59e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganovvoid CSection::ResetLineArray()
60e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov{
61e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov    m_LineArray.RemoveAll();
62e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov}
63e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganovvoid CSection::ResetWordArray()
64e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov{
65e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov    for (FX_INT32 i = 0, sz = m_WordArray.GetSize(); i < sz; i++) {
66e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov        delete m_WordArray.GetAt(i);
67e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov    }
68e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov    m_WordArray.RemoveAll();
69e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov}
70e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganovvoid CSection::ResetLinePlace()
71e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov{
72e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov    for (FX_INT32 i = 0, sz = m_LineArray.GetSize(); i < sz; i++) {
73e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov        if (CLine * pLine = m_LineArray.GetAt(i)) {
74e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov            pLine->LinePlace = CPVT_WordPlace(SecPlace.nSecIndex, i, -1);
75e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov        }
76e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov    }
77e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov}
78e6986e1e8d4a57987f47c215490cb080a65ee29aSvet GanovCPVT_WordPlace CSection::AddWord(const CPVT_WordPlace & place, const CPVT_WordInfo & wordinfo)
79e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov{
80e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov    CPVT_WordInfo * pWord = new CPVT_WordInfo(wordinfo);
81e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov    FX_INT32 nWordIndex = FPDF_MAX(FPDF_MIN(place.nWordIndex, this->m_WordArray.GetSize()), 0);
82e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov    if (nWordIndex == m_WordArray.GetSize()) {
83e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov        m_WordArray.Add(pWord);
84e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov    } else {
85e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov        m_WordArray.InsertAt(nWordIndex, pWord);
86e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov    }
87e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov    return place;
88e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov}
89e6986e1e8d4a57987f47c215490cb080a65ee29aSvet GanovCPVT_WordPlace CSection::AddLine(const CPVT_LineInfo & lineinfo)
90e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov{
91e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov    return CPVT_WordPlace(SecPlace.nSecIndex, m_LineArray.Add(lineinfo), -1);
92e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov}
93e6986e1e8d4a57987f47c215490cb080a65ee29aSvet GanovCPVT_FloatRect CSection::Rearrange()
94e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov{
95e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov    ASSERT(m_pVT != NULL);
96e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov    if (m_pVT->m_nCharArray > 0) {
97e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov        return CTypeset(this).CharArray();
98e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov    } else {
99e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov        return CTypeset(this).Typeset();
100e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov    }
101e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov}
102e6986e1e8d4a57987f47c215490cb080a65ee29aSvet GanovCPVT_Size CSection::GetSectionSize(FX_FLOAT fFontSize)
103e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov{
104e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov    return CTypeset(this).GetEditSize(fFontSize);
105e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov}
106e6986e1e8d4a57987f47c215490cb080a65ee29aSvet GanovCPVT_WordPlace CSection::GetBeginWordPlace() const
107e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov{
108e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov    if (CLine * pLine = m_LineArray.GetAt(0)) {
109e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov        return pLine->GetBeginWordPlace();
110e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov    } else {
111e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov        return SecPlace;
112e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov    }
113e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov}
114e6986e1e8d4a57987f47c215490cb080a65ee29aSvet GanovCPVT_WordPlace CSection::GetEndWordPlace() const
115e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov{
116e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov    if (CLine * pLine = m_LineArray.GetAt(m_LineArray.GetSize() - 1)) {
117e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov        return pLine->GetEndWordPlace();
118e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov    } else {
119e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov        return this->SecPlace;
120e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov    }
121e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov}
122e6986e1e8d4a57987f47c215490cb080a65ee29aSvet GanovCPVT_WordPlace CSection::GetPrevWordPlace(const CPVT_WordPlace & place) const
123e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov{
124e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov    if (place.nLineIndex < 0) {
125e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov        return GetBeginWordPlace();
126e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov    }
127e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov    if (place.nLineIndex >= m_LineArray.GetSize()) {
128e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov        return GetEndWordPlace();
129e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov    }
130e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov    if (CLine * pLine = m_LineArray.GetAt(place.nLineIndex)) {
131e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov        if (place.nWordIndex == pLine->m_LineInfo.nBeginWordIndex) {
132e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov            return CPVT_WordPlace(place.nSecIndex, place.nLineIndex, -1);
133e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov        } else if (place.nWordIndex < pLine->m_LineInfo.nBeginWordIndex) {
134e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov            if (CLine * pPrevLine = m_LineArray.GetAt(place.nLineIndex - 1)) {
135e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov                return pPrevLine->GetEndWordPlace();
136e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov            }
137e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov        } else {
138e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov            return pLine->GetPrevWordPlace(place);
139e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov        }
140e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov    }
141e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov    return place;
142e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov}
143e6986e1e8d4a57987f47c215490cb080a65ee29aSvet GanovCPVT_WordPlace CSection::GetNextWordPlace(const CPVT_WordPlace & place) const
144e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov{
145e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov    if (place.nLineIndex < 0) {
146e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov        return GetBeginWordPlace();
147e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov    }
148e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov    if (place.nLineIndex >= m_LineArray.GetSize()) {
149e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov        return GetEndWordPlace();
150e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov    }
151e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov    if (CLine * pLine = m_LineArray.GetAt(place.nLineIndex)) {
152e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov        if (place.nWordIndex >= pLine->m_LineInfo.nEndWordIndex) {
153e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov            if (CLine * pNextLine = m_LineArray.GetAt(place.nLineIndex + 1)) {
154e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov                return pNextLine->GetBeginWordPlace();
155e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov            }
156e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov        } else {
157e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov            return pLine->GetNextWordPlace(place);
158e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov        }
159e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov    }
160e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov    return place;
161e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov}
162e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganovvoid CSection::UpdateWordPlace(CPVT_WordPlace & place) const
163e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov{
164e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov    FX_INT32 nLeft = 0;
165e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov    FX_INT32 nRight = m_LineArray.GetSize() - 1;
166e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov    FX_INT32 nMid = (nLeft + nRight) / 2;
167e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov    while (nLeft <= nRight) {
168e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov        if (CLine * pLine = m_LineArray.GetAt(nMid)) {
169e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov            if (place.nWordIndex < pLine->m_LineInfo.nBeginWordIndex) {
170e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov                nRight = nMid - 1;
171e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov                nMid = (nLeft + nRight) / 2;
172e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov            } else if (place.nWordIndex > pLine->m_LineInfo.nEndWordIndex) {
173e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov                nLeft = nMid + 1;
174e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov                nMid = (nLeft + nRight) / 2;
175e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov            } else {
176e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov                place.nLineIndex = nMid;
177e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov                return;
178e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov            }
179e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov        } else {
180e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov            break;
181e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov        }
182e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov    }
183e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov}
184e6986e1e8d4a57987f47c215490cb080a65ee29aSvet GanovCPVT_WordPlace CSection::SearchWordPlace(const CPDF_Point & point) const
185e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov{
186e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov    ASSERT(m_pVT != NULL);
187e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov    CPVT_WordPlace place = GetBeginWordPlace();
188e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov    FX_BOOL bUp = TRUE;
189e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov    FX_BOOL bDown = TRUE;
190e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov    FX_INT32 nLeft = 0;
191e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov    FX_INT32 nRight = m_LineArray.GetSize() - 1;
192e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov    FX_INT32 nMid = m_LineArray.GetSize() / 2;
193e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov    FX_FLOAT fTop = 0;
194e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov    FX_FLOAT fBottom = 0;
195e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov    while (nLeft <= nRight) {
196e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov        if (CLine * pLine = m_LineArray.GetAt(nMid)) {
197e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov            fTop = pLine->m_LineInfo.fLineY - pLine->m_LineInfo.fLineAscent - m_pVT->GetLineLeading(m_SecInfo);
198e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov            fBottom = pLine->m_LineInfo.fLineY - pLine->m_LineInfo.fLineDescent;
199e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov            if (IsFloatBigger(point.y, fTop)) {
200e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov                bUp = FALSE;
201e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov            }
202e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov            if (IsFloatSmaller(point.y, fBottom)) {
203e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov                bDown = FALSE;
204e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov            }
205e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov            if (IsFloatSmaller(point.y, fTop)) {
206e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov                nRight = nMid - 1;
207e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov                nMid = (nLeft + nRight) / 2;
208e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov                continue;
209e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov            } else if (IsFloatBigger(point.y, fBottom)) {
210e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov                nLeft = nMid + 1;
211e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov                nMid = (nLeft + nRight) / 2;
212e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov                continue;
213e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov            } else {
214e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov                place = SearchWordPlace(point.x,
215e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov                                        CPVT_WordRange(pLine->GetNextWordPlace(pLine->GetBeginWordPlace()), pLine->GetEndWordPlace())
216e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov                                       );
217e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov                place.nLineIndex = nMid;
218e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov                return place;
219e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov            }
220e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov        }
221e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov    }
222e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov    if (bUp) {
223e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov        place = GetBeginWordPlace();
224e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov    }
225e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov    if (bDown) {
226e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov        place = GetEndWordPlace();
227e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov    }
228e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov    return place;
229e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov}
230e6986e1e8d4a57987f47c215490cb080a65ee29aSvet GanovCPVT_WordPlace CSection::SearchWordPlace(FX_FLOAT fx, const CPVT_WordPlace & lineplace) const
231e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov{
232e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov    if (CLine * pLine = m_LineArray.GetAt(lineplace.nLineIndex)) {
233e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov        return SearchWordPlace(fx - m_SecInfo.rcSection.left,
234e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov                               CPVT_WordRange(pLine->GetNextWordPlace(pLine->GetBeginWordPlace()), pLine->GetEndWordPlace()));
235e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov    }
236e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov    return GetBeginWordPlace();
237e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov}
238e6986e1e8d4a57987f47c215490cb080a65ee29aSvet GanovCPVT_WordPlace CSection::SearchWordPlace(FX_FLOAT fx, const CPVT_WordRange & range) const
239e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov{
240e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov    CPVT_WordPlace wordplace = range.BeginPos;
241e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov    wordplace.nWordIndex = -1;
242e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov    if (!m_pVT)	{
243e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov        return wordplace;
244e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov    }
245e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov    FX_INT32 nLeft = range.BeginPos.nWordIndex;
246e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov    FX_INT32 nRight = range.EndPos.nWordIndex + 1;
247e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov    FX_INT32 nMid = (nLeft + nRight) / 2;
248e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov    while (nLeft < nRight) {
249e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov        if (nMid == nLeft) {
250e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov            break;
251e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov        }
252e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov        if (nMid == nRight) {
253e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov            nMid--;
254e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov            break;
255e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov        }
256e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov        if (CPVT_WordInfo * pWord = m_WordArray.GetAt(nMid)) {
257e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov            if (fx > pWord->fWordX + m_pVT->GetWordWidth(*pWord) * PVT_HALF) {
258e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov                nLeft = nMid;
259e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov                nMid = (nLeft + nRight) / 2;
260e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov                continue;
261e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov            } else {
262e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov                nRight = nMid;
263e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov                nMid = (nLeft + nRight) / 2;
264e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov                continue;
265e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov            }
266e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov        } else {
267e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov            break;
268e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov        }
269e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov    }
270e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov    if (CPVT_WordInfo * pWord = m_WordArray.GetAt(nMid)) {
271e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov        if (fx > pWord->fWordX + m_pVT->GetWordWidth(*pWord) * PVT_HALF) {
272e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov            wordplace.nWordIndex = nMid;
273e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov        }
274e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov    }
275e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov    return wordplace;
276e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov}
277e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganovvoid CSection::ClearLeftWords(FX_INT32 nWordIndex)
278e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov{
279e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov    for (FX_INT32 i = nWordIndex; i >= 0; i--) {
280e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov        delete m_WordArray.GetAt(i);
281e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov        m_WordArray.RemoveAt(i);
282e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov    }
283e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov}
284e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganovvoid CSection::ClearRightWords(FX_INT32 nWordIndex)
285e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov{
286e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov    for (FX_INT32 i = m_WordArray.GetSize() - 1; i > nWordIndex; i--) {
287e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov        delete m_WordArray.GetAt(i);
288e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov        m_WordArray.RemoveAt(i);
289e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov    }
290e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov}
291e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganovvoid CSection::ClearMidWords(FX_INT32 nBeginIndex, FX_INT32 nEndIndex)
292e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov{
293e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov    for (FX_INT32 i = nEndIndex; i > nBeginIndex; i--) {
294e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov        delete m_WordArray.GetAt(i);
295e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov        m_WordArray.RemoveAt(i);
296e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov    }
297e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov}
298e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganovvoid CSection::ClearWords(const CPVT_WordRange & PlaceRange)
299e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov{
300e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov    CPVT_WordPlace SecBeginPos = GetBeginWordPlace();
301e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov    CPVT_WordPlace SecEndPos = GetEndWordPlace();
302e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov    if (PlaceRange.BeginPos.WordCmp(SecBeginPos) >= 0) {
303e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov        if (PlaceRange.EndPos.WordCmp(SecEndPos) <= 0) {
304e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov            ClearMidWords(PlaceRange.BeginPos.nWordIndex, PlaceRange.EndPos.nWordIndex);
305e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov        } else {
306e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov            ClearRightWords(PlaceRange.BeginPos.nWordIndex);
307e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov        }
308e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov    } else if (PlaceRange.EndPos.WordCmp(SecEndPos) <= 0) {
309e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov        ClearLeftWords(PlaceRange.EndPos.nWordIndex);
310e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov    } else {
311e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov        ResetWordArray();
312e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov    }
313e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov}
314e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganovvoid CSection::ClearWord(const CPVT_WordPlace & place)
315e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov{
316e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov    delete m_WordArray.GetAt(place.nWordIndex);
317e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov    m_WordArray.RemoveAt(place.nWordIndex);
318e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov}
319e6986e1e8d4a57987f47c215490cb080a65ee29aSvet GanovCTypeset::CTypeset(CSection * pSection) : m_rcRet(0.0f, 0.0f, 0.0f, 0.0f), m_pVT(pSection->m_pVT), m_pSection(pSection)
320e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov{
321e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov}
322e6986e1e8d4a57987f47c215490cb080a65ee29aSvet GanovCTypeset::~CTypeset()
323e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov{
324e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov}
325e6986e1e8d4a57987f47c215490cb080a65ee29aSvet GanovCPVT_FloatRect CTypeset::CharArray()
326e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov{
327e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov    ASSERT(m_pSection != NULL);
328e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov    ASSERT(m_pVT != NULL);
329e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov    FX_FLOAT fLineAscent = m_pVT->GetFontAscent(m_pVT->GetDefaultFontIndex(), m_pVT->GetFontSize());
330e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov    FX_FLOAT fLineDescent = m_pVT->GetFontDescent(m_pVT->GetDefaultFontIndex(), m_pVT->GetFontSize());
331e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov    m_rcRet.Default();
332e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov    FX_FLOAT x = 0.0f, y = 0.0f;
333e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov    FX_FLOAT fNextWidth;
334e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov    FX_INT32 nStart = 0;
335e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov    FX_FLOAT fNodeWidth = m_pVT->GetPlateWidth() / (m_pVT->m_nCharArray <= 0 ? 1 : m_pVT->m_nCharArray);
336e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov    if (CLine * pLine = m_pSection->m_LineArray.GetAt(0)) {
337e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov        x = 0.0f;
338e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov        y +=  m_pVT->GetLineLeading(m_pSection->m_SecInfo);
339e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov        y += fLineAscent;
340e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov        nStart = 0;
341e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov        switch (m_pVT->GetAlignment(m_pSection->m_SecInfo)) {
342e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov            case 0:
343e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov                pLine->m_LineInfo.fLineX = fNodeWidth * PVT_HALF;
344e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov                break;
345e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov            case 1:
346e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov                nStart = (m_pVT->m_nCharArray - m_pSection->m_WordArray.GetSize()) / 2;
347e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov                pLine->m_LineInfo.fLineX = fNodeWidth * nStart - fNodeWidth * PVT_HALF;
348e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov                break;
349e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov            case 2:
350e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov                nStart = m_pVT->m_nCharArray - m_pSection->m_WordArray.GetSize();
351e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov                pLine->m_LineInfo.fLineX = fNodeWidth * nStart - fNodeWidth * PVT_HALF;
352e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov                break;
353e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov        }
354e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov        for (FX_INT32 w = 0, sz = m_pSection->m_WordArray.GetSize(); w < sz; w++) {
355e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov            if (w >= m_pVT->m_nCharArray) {
356e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov                break;
357e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov            }
358e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov            fNextWidth = 0;
359e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov            if (CPVT_WordInfo * pNextWord = (CPVT_WordInfo *)m_pSection->m_WordArray.GetAt(w + 1)) {
360e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov                pNextWord->fWordTail = 0;
361e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov                fNextWidth = m_pVT->GetWordWidth(*pNextWord);
362e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov            }
363e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov            if (CPVT_WordInfo * pWord = (CPVT_WordInfo *)m_pSection->m_WordArray.GetAt(w)) {
364e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov                pWord->fWordTail = 0;
365e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov                FX_FLOAT fWordWidth = m_pVT->GetWordWidth(*pWord);
366e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov                FX_FLOAT fWordAscent = m_pVT->GetWordAscent(*pWord);
367e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov                FX_FLOAT fWordDescent = m_pVT->GetWordDescent(*pWord);
368e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov                x = (FX_FLOAT)(fNodeWidth * (w + nStart + 0.5) - fWordWidth * PVT_HALF);
369e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov                pWord->fWordX = x;
370e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov                pWord->fWordY = y;
371e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov                if (w == 0) {
372e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov                    pLine->m_LineInfo.fLineX = x;
373e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov                }
374e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov                if (w != m_pSection->m_WordArray.GetSize() - 1)
375e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov                    pWord->fWordTail = (fNodeWidth - (fWordWidth + fNextWidth) * PVT_HALF > 0 ?
376e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov                                        fNodeWidth - (fWordWidth + fNextWidth) * PVT_HALF : 0);
377e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov                else {
378e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov                    pWord->fWordTail = 0;
379e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov                }
380e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov                x += fWordWidth;
381e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov                fLineAscent = FPDF_MAX(fLineAscent, fWordAscent);
382e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov                fLineDescent = FPDF_MIN(fLineDescent, fWordDescent);
383e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov            }
384e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov        }
385e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov        pLine->m_LineInfo.nBeginWordIndex = 0;
386e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov        pLine->m_LineInfo.nEndWordIndex = m_pSection->m_WordArray.GetSize() - 1;
387e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov        pLine->m_LineInfo.fLineY = y;
388e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov        pLine->m_LineInfo.fLineWidth = 	x - pLine->m_LineInfo.fLineX;
389e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov        pLine->m_LineInfo.fLineAscent = fLineAscent;
390e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov        pLine->m_LineInfo.fLineDescent = fLineDescent;
391e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov        y += (-fLineDescent);
392e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov    }
393e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov    return m_rcRet = CPVT_FloatRect(0, 0, x, y);
394e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov}
395e6986e1e8d4a57987f47c215490cb080a65ee29aSvet GanovCPVT_Size CTypeset::GetEditSize(FX_FLOAT fFontSize)
396e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov{
397e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov    ASSERT(m_pSection != NULL);
398e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov    ASSERT(m_pVT != NULL);
399e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov    SplitLines(FALSE, fFontSize);
400e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov    return CPVT_Size(m_rcRet.Width(), m_rcRet.Height());
401e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov}
402e6986e1e8d4a57987f47c215490cb080a65ee29aSvet GanovCPVT_FloatRect CTypeset::Typeset()
403e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov{
404e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov    ASSERT(m_pSection != NULL);
405e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov    ASSERT(m_pVT != NULL);
406e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov    m_pSection->m_LineArray.Empty();
407e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov    SplitLines(TRUE, 0.0f);
408e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov    m_pSection->m_LineArray.Clear();
409e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov    OutputLines();
410e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov    return m_rcRet;
411e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov}
412e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganovstatic int special_chars[128] = {
413e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov    0x0000, 0x000C, 0x0008, 0x000C, 0x0008, 0x0000, 0x0020, 0x0000,
414e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
415e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
416e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
417e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov    0x0000, 0x0008, 0x0008, 0x0000, 0x0010, 0x0000, 0x0000, 0x0028,
418e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov    0x000C, 0x0008, 0x0000, 0x0000, 0x0028, 0x0028, 0x0028, 0x0028,
419e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov    0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002,
420e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov    0x0002, 0x0002, 0x0008, 0x0008, 0x0000, 0x0000, 0x0000, 0x0008,
421e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov    0x0000, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001,
422e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov    0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001,
423e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov    0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001,
424e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov    0x0001, 0x0001, 0x0001, 0x000C, 0x0000, 0x0008, 0x0000, 0x0000,
425e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov    0x0000, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001,
426e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov    0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001,
427e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov    0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001,
428e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov    0x0001, 0x0001, 0x0001, 0x000C, 0x0000, 0x0008, 0x0000, 0x0000,
429e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov};
430e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganovstatic FX_BOOL IsLatin(FX_WORD word)
431e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov{
432e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov    if (word <= 0x007F) {
433e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov        if (special_chars[word] & 0x0001) {
434e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov            return TRUE;
435e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov        }
436e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov    }
437e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov    if ((word >= 0x00C0 && word <= 0x00FF) ||
438e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov            (word >= 0x0100 && word <= 0x024F) ||
439e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov            (word >= 0x1E00 && word <= 0x1EFF) ||
440e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov            (word >= 0x2C60 && word <= 0x2C7F) ||
441e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov            (word >= 0xA720 && word <= 0xA7FF) ||
442e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov            (word >= 0xFF21 && word <= 0xFF3A) ||
443e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov            (word >= 0xFF41 && word <= 0xFF5A)) {
444e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov        return TRUE;
445e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov    }
446e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov    return FALSE;
447e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov}
448e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganovstatic FX_BOOL IsDigit(FX_DWORD word)
449e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov{
450e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov    return (word >= 0x0030 && word <= 0x0039) ? TRUE : FALSE;
451e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov}
452e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganovstatic FX_BOOL IsCJK(FX_DWORD word)
453e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov{
454e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov    if ((word >= 0x1100 && word <= 0x11FF) ||
455e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov            (word >= 0x2E80 && word <= 0x2FFF) ||
456e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov            (word >= 0x3040 && word <= 0x9FBF) ||
457e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov            (word >= 0xAC00 && word <= 0xD7AF) ||
458e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov            (word >= 0xF900 && word <= 0xFAFF) ||
459e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov            (word >= 0xFE30 && word <= 0xFE4F) ||
460e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov            (word >= 0x20000 && word <= 0x2A6DF) ||
461e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov            (word >= 0x2F800 && word <= 0x2FA1F)) {
462e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov        return TRUE;
463e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov    }
464e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov    if (word >= 0x3000 && word <= 0x303F) {
465e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov        if (word == 0x3005 || word == 0x3006 || word == 0x3021 || word == 0x3022 ||
466e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov                word == 0x3023 || word == 0x3024 || word == 0x3025 || word == 0x3026 ||
467e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov                word == 0x3027 || word == 0x3028 || word == 0x3029 || word == 0x3031 ||
468e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov                word == 0x3032 || word == 0x3033 || word == 0x3034 || word == 0x3035) {
469e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov            return TRUE;
470e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov        }
471e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov        return FALSE;
472e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov    }
473e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov    if (word >= 0xFF66 && word <= 0xFF9D) {
474e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov        return TRUE;
475e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov    }
476e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov    return FALSE;
477e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov}
478e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganovstatic FX_BOOL IsPunctuation(FX_DWORD word)
479e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov{
480e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov    if (word <= 0x007F) {
481e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov        if ((special_chars[word] >> 3) & 1) {
482e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov            return TRUE;
483e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov        }
484e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov    } else if (word >= 0x0080 && word <= 0x00FF) {
485e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov        if (word == 0x0082 || word == 0x0084 || word == 0x0085 || word == 0x0091 ||
486e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov                word == 0x0092 || word == 0x0093 || word <= 0x0094 || word == 0x0096 ||
487e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov                word == 0x00B4 || word == 0x00B8) {
488e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov            return TRUE;
489e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov        }
490e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov    } else if (word >= 0x2000 && word <= 0x206F) {
491e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov        if (word == 0x2010 || word == 0x2011 || word == 0x2012 || word == 0x2013 ||
492e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov                word == 0x2018 || word == 0x2019 || word == 0x201A || word == 0x201B ||
493e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov                word == 0x201C || word == 0x201D || word == 0x201E || word == 0x201F ||
494e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov                word == 0x2032 || word == 0x2033 || word == 0x2034 || word == 0x2035 ||
495e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov                word == 0x2036 || word == 0x2037 || word == 0x203C || word == 0x203D ||
496e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov                word == 0x203E || word == 0x2044) {
497e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov            return TRUE;
498e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov        }
499e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov    } else if (word >= 0x3000 && word <= 0x303F) {
500e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov        if (word == 0x3001 || word == 0x3002 || word == 0x3003 || word == 0x3005 ||
501e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov                word == 0x3009 || word == 0x300A || word == 0x300B || word == 0x300C ||
502e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov                word == 0x300D || word == 0x300F || word == 0x300E || word == 0x3010 ||
503e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov                word == 0x3011 || word == 0x3014 || word == 0x3015 || word == 0x3016 ||
504e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov                word == 0x3017 || word == 0x3018 || word == 0x3019 || word == 0x301A ||
505e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov                word == 0x301B || word == 0x301D || word == 0x301E || word == 0x301F) {
506e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov            return TRUE;
507e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov        }
508e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov    } else if (word >= 0xFE50 && word <= 0xFE6F) {
509e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov        if ((word >= 0xFE50 && word <= 0xFE5E) || word == 0xFE63) {
510e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov            return TRUE;
511e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov        }
512e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov    } else if (word >= 0xFF00 && word <= 0xFFEF) {
513e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov        if (word == 0xFF01 || word == 0xFF02 || word == 0xFF07 || word == 0xFF08 ||
514e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov                word == 0xFF09 || word == 0xFF0C || word == 0xFF0E || word == 0xFF0F ||
515e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov                word == 0xFF1A || word == 0xFF1B || word == 0xFF1F || word == 0xFF3B ||
516e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov                word == 0xFF3D || word == 0xFF40 || word == 0xFF5B || word == 0xFF5C ||
517e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov                word == 0xFF5D || word == 0xFF61 || word == 0xFF62 || word == 0xFF63 ||
518e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov                word == 0xFF64 || word == 0xFF65 || word == 0xFF9E || word == 0xFF9F) {
519e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov            return TRUE;
520e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov        }
521e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov    }
522e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov    return FALSE;
523e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov}
524e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganovstatic FX_BOOL IsConnectiveSymbol(FX_DWORD word)
525e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov{
526e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov    if (word <= 0x007F) {
527e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov        if ((special_chars[word] >> 5) & 1) {
528e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov            return TRUE;
529e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov        }
530e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov    }
531e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov    return FALSE;
532e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov}
533e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganovstatic FX_BOOL IsOpenStylePunctuation(FX_DWORD word)
534e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov{
535e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov    if (word <= 0x007F) {
536e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov        if ((special_chars[word] >> 2) & 1) {
537e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov            return TRUE;
538e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov        }
539e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov    } else if (word == 0x300A || word == 0x300C || word == 0x300E || word == 0x3010 ||
540e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov               word == 0x3014 || word == 0x3016 || word == 0x3018 || word == 0x301A ||
541e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov               word == 0xFF08 || word == 0xFF3B || word == 0xFF5B || word == 0xFF62) {
542e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov        return TRUE;
543e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov    }
544e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov    return FALSE;
545e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov}
546e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganovstatic FX_BOOL IsCurrencySymbol(FX_WORD word)
547e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov{
548e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov    if (word == 0x0024 || word == 0x0080 || word == 0x00A2 || word == 0x00A3 ||
549e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov            word == 0x00A4 || word == 0x00A5 || (word >= 0x20A0 && word <= 0x20CF) ||
550e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov            word == 0xFE69 || word == 0xFF04 || word == 0xFFE0 || word == 0xFFE1 ||
551e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov            word == 0xFFE5 || word == 0xFFE6) {
552e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov        return TRUE;
553e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov    }
554e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov    return FALSE;
555e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov}
556e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganovstatic FX_BOOL IsPrefixSymbol(FX_WORD word)
557e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov{
558e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov    if (IsCurrencySymbol(word)) {
559e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov        return TRUE;
560e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov    }
561e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov    if (word == 0x2116) {
562e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov        return TRUE;
563e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov    }
564e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov    return FALSE;
565e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov}
566e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganovstatic FX_BOOL IsSpace(FX_WORD word)
567e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov{
568e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov    return (word == 0x0020 || word == 0x3000) ? TRUE : FALSE;
569e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov}
570e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganovstatic FX_BOOL NeedDivision(FX_WORD prevWord, FX_WORD curWord)
571e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov{
572e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov    if ((IsLatin(prevWord) || IsDigit(prevWord)) && (IsLatin(curWord) || IsDigit(curWord))) {
573e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov        return FALSE;
574e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov    } else if (IsSpace(curWord) || IsPunctuation(curWord)) {
575e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov        return FALSE;
576e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov    } else if (IsConnectiveSymbol(prevWord) || IsConnectiveSymbol(curWord)) {
577e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov        return FALSE;
578e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov    } else if (IsSpace(prevWord) || IsPunctuation(prevWord)) {
579e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov        return TRUE;
580e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov    } else if (IsPrefixSymbol(prevWord)) {
581e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov        return FALSE;
582e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov    } else if (IsPrefixSymbol(curWord) || IsCJK(curWord)) {
583e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov        return TRUE;
584e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov    } else if (IsCJK(prevWord)) {
585e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov        return TRUE;
586e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov    }
587e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov    return FALSE;
588e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov}
589e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganovvoid CTypeset::SplitLines(FX_BOOL bTypeset, FX_FLOAT fFontSize)
590e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov{
591e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov    ASSERT(m_pVT != NULL);
592e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov    ASSERT(m_pSection != NULL);
593e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov    FX_INT32 nLineHead = 0;
594e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov    FX_INT32 nLineTail = 0;
595e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov    FX_FLOAT fMaxX = 0.0f, fMaxY = 0.0f;
596e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov    FX_FLOAT fLineWidth = 0.0f, fBackupLineWidth = 0.0f;
597e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov    FX_FLOAT fLineAscent = 0.0f, fBackupLineAscent = 0.0f;
598e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov    FX_FLOAT fLineDescent = 0.0f, fBackupLineDescent = 0.0f;
599e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov    FX_INT32 nWordStartPos = 0;
600e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov    FX_BOOL bFullWord = FALSE;
601e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov    FX_INT32 nLineFullWordIndex = 0;
602e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov    FX_INT32 nCharIndex = 0;
603e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov    CPVT_LineInfo line;
604e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov    FX_FLOAT fWordWidth = 0;
605e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov    FX_FLOAT fTypesetWidth = FPDF_MAX(m_pVT->GetPlateWidth() - m_pVT->GetLineIndent(m_pSection->m_SecInfo), 0.0f);
606e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov    FX_INT32 nTotalWords = m_pSection->m_WordArray.GetSize();
607e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov    FX_BOOL bOpened = FALSE;
608e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov    if (nTotalWords > 0) {
609e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov        FX_INT32 i = 0;
610e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov        while (i < nTotalWords) {
611e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov            CPVT_WordInfo * pWord = m_pSection->m_WordArray.GetAt(i);
612e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov            CPVT_WordInfo* pOldWord = pWord;
613e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov            if (i > 0) {
614e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov                pOldWord = m_pSection->m_WordArray.GetAt(i - 1);
615e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov            }
616e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov            if (pWord) {
617e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov                if (bTypeset) {
618e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov                    fLineAscent = FPDF_MAX(fLineAscent, m_pVT->GetWordAscent(*pWord, TRUE));
619e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov                    fLineDescent = FPDF_MIN(fLineDescent, m_pVT->GetWordDescent(*pWord, TRUE));
620e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov                    fWordWidth = m_pVT->GetWordWidth(*pWord);
621e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov                } else {
622e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov                    fLineAscent = FPDF_MAX(fLineAscent, m_pVT->GetWordAscent(*pWord, fFontSize));
623e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov                    fLineDescent = FPDF_MIN(fLineDescent, m_pVT->GetWordDescent(*pWord, fFontSize));
624e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov                    fWordWidth = m_pVT->GetWordWidth(pWord->nFontIndex,
625e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov                                                     pWord->Word,
626e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov                                                     m_pVT->m_wSubWord,
627e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov                                                     m_pVT->m_fCharSpace,
628e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov                                                     m_pVT->m_nHorzScale,
629e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov                                                     fFontSize,
630e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov                                                     pWord->fWordTail,
631e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov                                                     0);
632e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov                }
633e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov                if (!bOpened) {
634e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov                    if (IsOpenStylePunctuation(pWord->Word)) {
635e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov                        bOpened = TRUE;
636e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov                        bFullWord = TRUE;
637e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov                    } else if (pOldWord != NULL) {
638e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov                        if (NeedDivision(pOldWord->Word, pWord->Word)) {
639e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov                            bFullWord = TRUE;
640e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov                        }
641e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov                    }
642e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov                } else {
643e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov                    if (!IsSpace(pWord->Word) && !IsOpenStylePunctuation(pWord->Word)) {
644e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov                        bOpened = FALSE;
645e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov                    }
646e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov                }
647e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov                if (bFullWord) {
648e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov                    bFullWord = FALSE;
649e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov                    if (nCharIndex > 0) {
650e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov                        nLineFullWordIndex ++;
651e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov                    }
652e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov                    nWordStartPos = i;
653e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov                    fBackupLineWidth = fLineWidth;
654e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov                    fBackupLineAscent = fLineAscent;
655e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov                    fBackupLineDescent = fLineDescent;
656e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov                }
657e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov                nCharIndex++;
658e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov            }
659e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov            if (m_pVT->m_bLimitWidth && fTypesetWidth > 0 &&
660e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov                    fLineWidth + fWordWidth > fTypesetWidth) {
661e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov                if (nLineFullWordIndex > 0) {
662e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov                    i = nWordStartPos;
663e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov                    fLineWidth = fBackupLineWidth;
664e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov                    fLineAscent = fBackupLineAscent;
665e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov                    fLineDescent = fBackupLineDescent;
666e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov                }
667e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov                if (nCharIndex == 1) {
668e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov                    fLineWidth =  fWordWidth;
669e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov                    i++;
670e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov                }
671e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov                nLineTail = i - 1;
672e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov                if (bTypeset) {
673e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov                    line.nBeginWordIndex = nLineHead;
674e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov                    line.nEndWordIndex = nLineTail;
675e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov                    line.nTotalWord = nLineTail - nLineHead + 1;
676e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov                    line.fLineWidth = fLineWidth;
677e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov                    line.fLineAscent = fLineAscent;
678e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov                    line.fLineDescent = fLineDescent;
679e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov                    m_pSection->AddLine(line);
680e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov                }
681e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov                fMaxY += (fLineAscent + m_pVT->GetLineLeading(m_pSection->m_SecInfo));
682e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov                fMaxY += (-fLineDescent);
683e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov                fMaxX = FPDF_MAX(fLineWidth, fMaxX);
684e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov                nLineHead = i;
685e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov                fLineWidth = 0.0f;
686e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov                fLineAscent = 0.0f;
687e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov                fLineDescent = 0.0f;
688e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov                nCharIndex = 0;
689e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov                nLineFullWordIndex = 0;
690e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov                bFullWord = FALSE;
691e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov            } else {
692e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov                fLineWidth += fWordWidth;
693e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov                i++;
694e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov            }
695e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov        }
696e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov        if (nLineHead <= nTotalWords - 1) {
697e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov            nLineTail = nTotalWords - 1;
698e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov            if (bTypeset) {
699e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov                line.nBeginWordIndex = nLineHead;
700e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov                line.nEndWordIndex = nLineTail;
701e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov                line.nTotalWord = nLineTail - nLineHead + 1;
702e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov                line.fLineWidth = fLineWidth;
703e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov                line.fLineAscent = fLineAscent;
704e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov                line.fLineDescent = fLineDescent;
705e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov                m_pSection->AddLine(line);
706e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov            }
707e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov            fMaxY += (fLineAscent + m_pVT->GetLineLeading(m_pSection->m_SecInfo));
708e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov            fMaxY += (-fLineDescent);
709e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov            fMaxX = FPDF_MAX(fLineWidth, fMaxX);
710e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov        }
711e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov    } else {
712e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov        if (bTypeset) {
713e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov            fLineAscent = m_pVT->GetLineAscent(m_pSection->m_SecInfo);
714e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov            fLineDescent = m_pVT->GetLineDescent(m_pSection->m_SecInfo);
715e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov        } else {
716e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov            fLineAscent = m_pVT->GetFontAscent(m_pVT->GetDefaultFontIndex(), fFontSize);
717e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov            fLineDescent = m_pVT->GetFontDescent(m_pVT->GetDefaultFontIndex(), fFontSize);
718e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov        }
719e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov        if (bTypeset) {
720e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov            line.nBeginWordIndex = -1;
721e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov            line.nEndWordIndex = -1;
722e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov            line.nTotalWord = 0;
723e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov            line.fLineWidth = 0;
724e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov            line.fLineAscent = fLineAscent;
725e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov            line.fLineDescent = fLineDescent;
726e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov            m_pSection->AddLine(line);
727e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov        }
728e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov        fMaxY += (m_pVT->GetLineLeading(m_pSection->m_SecInfo) + fLineAscent + (-fLineDescent));
729e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov    }
730e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov    m_rcRet = CPVT_FloatRect(0, 0, fMaxX, fMaxY);
731e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov}
732e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganovvoid CTypeset::OutputLines()
733e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov{
734e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov    ASSERT(m_pVT != NULL);
735e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov    ASSERT(m_pSection != NULL);
736e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov    FX_FLOAT fMinX = 0.0f, fMinY = 0.0f, fMaxX = 0.0f, fMaxY = 0.0f;
737e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov    FX_FLOAT fPosX = 0.0f, fPosY = 0.0f;
738e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov    FX_FLOAT fLineIndent = m_pVT->GetLineIndent(m_pSection->m_SecInfo);
739e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov    FX_FLOAT fTypesetWidth = FPDF_MAX(m_pVT->GetPlateWidth() - fLineIndent, 0.0f);
740e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov    switch (m_pVT->GetAlignment(m_pSection->m_SecInfo)) {
741e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov        default:
742e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov        case 0:
743e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov            fMinX = 0.0f;
744e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov            break;
745e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov        case 1:
746e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov            fMinX = (fTypesetWidth - m_rcRet.Width())  * PVT_HALF;
747e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov            break;
748e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov        case 2:
749e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov            fMinX = fTypesetWidth - m_rcRet.Width();
750e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov            break;
751e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov    }
752e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov    fMaxX = fMinX + m_rcRet.Width();
753e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov    fMinY = 0.0f;
754e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov    fMaxY = m_rcRet.Height();
755e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov    FX_INT32 nTotalLines = m_pSection->m_LineArray.GetSize();
756e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov    if (nTotalLines > 0) {
757e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov        m_pSection->m_SecInfo.nTotalLine = nTotalLines;
758e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov        for (FX_INT32 l = 0; l < nTotalLines; l++) {
759e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov            if (CLine * pLine = m_pSection->m_LineArray.GetAt(l)) {
760e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov                switch (m_pVT->GetAlignment(m_pSection->m_SecInfo)) {
761e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov                    default:
762e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov                    case 0:
763e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov                        fPosX = 0;
764e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov                        break;
765e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov                    case 1:
766e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov                        fPosX = (fTypesetWidth - pLine->m_LineInfo.fLineWidth) * PVT_HALF;
767e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov                        break;
768e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov                    case 2:
769e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov                        fPosX = fTypesetWidth - pLine->m_LineInfo.fLineWidth;
770e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov                        break;
771e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov                }
772e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov                fPosX += fLineIndent;
773e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov                fPosY += m_pVT->GetLineLeading(m_pSection->m_SecInfo);
774e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov                fPosY += pLine->m_LineInfo.fLineAscent;
775e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov                pLine->m_LineInfo.fLineX = fPosX - fMinX;
776e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov                pLine->m_LineInfo.fLineY = fPosY - fMinY;
777e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov                for (FX_INT32 w = pLine->m_LineInfo.nBeginWordIndex; w <= pLine->m_LineInfo.nEndWordIndex; w++) {
778e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov                    if (CPVT_WordInfo * pWord = m_pSection->m_WordArray.GetAt(w)) {
779e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov                        pWord->fWordX = fPosX - fMinX;
780e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov                        if (pWord->pWordProps) {
781e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov                            switch (pWord->pWordProps->nScriptType) {
782e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov                                default:
783e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov                                case PVTWORD_SCRIPT_NORMAL:
784e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov                                    pWord->fWordY = fPosY - fMinY;
785e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov                                    break;
786e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov                                case PVTWORD_SCRIPT_SUPER:
787e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov                                    pWord->fWordY = fPosY - m_pVT->GetWordAscent(*pWord) - fMinY;
788e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov                                    break;
789e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov                                case PVTWORD_SCRIPT_SUB:
790e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov                                    pWord->fWordY = fPosY - m_pVT->GetWordDescent(*pWord) - fMinY;
791e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov                                    break;
792e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov                            }
793e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov                        } else {
794e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov                            pWord->fWordY = fPosY - fMinY;
795e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov                        }
796e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov                        fPosX += m_pVT->GetWordWidth(*pWord);
797e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov                    }
798e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov                }
799e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov                fPosY += (-pLine->m_LineInfo.fLineDescent);
800e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov            }
801e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov        }
802e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov    }
803e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov    m_rcRet = CPVT_FloatRect(fMinX, fMinY, fMaxX, fMaxY);
804e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov}
805e6986e1e8d4a57987f47c215490cb080a65ee29aSvet GanovCPDF_VariableText::CPDF_VariableText() :
806e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov    m_nLimitChar(0),
807e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov    m_nCharArray(0),
808e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov    m_bMultiLine(FALSE),
809e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov    m_bLimitWidth(FALSE),
810e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov    m_bAutoFontSize(FALSE),
811e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov    m_nAlignment(0),
812e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov    m_fLineLeading(0.0f),
813e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov    m_fCharSpace(0.0f),
814e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov    m_nHorzScale(100),
815e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov    m_wSubWord(0),
816e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov    m_fFontSize(0.0f),
817e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov    m_bInitial(FALSE),
818e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov    m_bRichText(FALSE),
819e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov    m_pVTProvider(NULL),
820e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov    m_pVTIterator(NULL)
821e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov{
822e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov}
823e6986e1e8d4a57987f47c215490cb080a65ee29aSvet GanovCPDF_VariableText::~CPDF_VariableText()
824e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov{
825e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov    if (m_pVTIterator) {
826e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov        delete m_pVTIterator;
827e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov        m_pVTIterator = NULL;
828e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov    }
829e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov    ResetAll();
830e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov}
831e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganovvoid CPDF_VariableText::Initialize()
832e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov{
833e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov    if (!m_bInitial) {
834e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov        CPVT_SectionInfo secinfo;
835e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov        if (m_bRichText) {
836e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov            secinfo.pSecProps = new CPVT_SecProps(0.0f, 0.0f, 0);
837e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov            secinfo.pWordProps = new CPVT_WordProps(GetDefaultFontIndex(), PVT_DEFAULT_FONTSIZE, 0, 0, 0);
838e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov        }
839e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov        CPVT_WordPlace place;
840e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov        place.nSecIndex = 0;
841e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov        AddSection(place, secinfo);
842e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov        CPVT_LineInfo lineinfo;
843e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov        lineinfo.fLineAscent = GetFontAscent(GetDefaultFontIndex(), GetFontSize());
844e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov        lineinfo.fLineDescent = GetFontDescent(GetDefaultFontIndex(), GetFontSize());
845e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov        AddLine(place, lineinfo);
846e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov        if (CSection * pSection = m_SectionArray.GetAt(0)) {
847e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov            pSection->ResetLinePlace();
848e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov        }
849e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov        m_bInitial = TRUE;
850e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov    }
851e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov}
852e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganovvoid CPDF_VariableText::ResetAll()
853e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov{
854e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov    m_bInitial = FALSE;
855e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov    ResetSectionArray();
856e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov}
857e6986e1e8d4a57987f47c215490cb080a65ee29aSvet GanovCPVT_WordPlace CPDF_VariableText::InsertWord(const CPVT_WordPlace & place, FX_WORD word, FX_INT32 charset,
858e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov        const CPVT_WordProps * pWordProps)
859e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov{
860e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov    FX_INT32 nTotlaWords = this->GetTotalWords();
861e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov    if (m_nLimitChar > 0 && nTotlaWords >= m_nLimitChar) {
862e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov        return place;
863e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov    }
864e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov    if (m_nCharArray > 0 && nTotlaWords >= m_nCharArray) {
865e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov        return place;
866e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov    }
867e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov    CPVT_WordPlace newplace = place;
868e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov    newplace.nWordIndex ++;
869e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov    if (m_bRichText) {
870e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov        CPVT_WordProps * pNewProps = pWordProps ? new CPVT_WordProps(*pWordProps) : new CPVT_WordProps();
871e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov        pNewProps->nFontIndex = GetWordFontIndex(word, charset, pWordProps->nFontIndex);
872e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov        return AddWord(newplace, CPVT_WordInfo(word, charset, -1, pNewProps));
873e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov    } else {
874e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov        FX_INT32 nFontIndex = GetSubWord() > 0 ? GetDefaultFontIndex() : GetWordFontIndex(word, charset, GetDefaultFontIndex());
875e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov        return AddWord(newplace, CPVT_WordInfo(word, charset, nFontIndex, NULL));
876e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov    }
877e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov    return place;
878e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov}
879e6986e1e8d4a57987f47c215490cb080a65ee29aSvet GanovCPVT_WordPlace CPDF_VariableText::InsertSection(const CPVT_WordPlace & place, const CPVT_SecProps * pSecProps,
880e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov        const CPVT_WordProps * pWordProps)
881e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov{
882e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov    FX_INT32 nTotlaWords = this->GetTotalWords();
883e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov    if (m_nLimitChar > 0 && nTotlaWords >= m_nLimitChar) {
884e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov        return place;
885e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov    }
886e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov    if (m_nCharArray > 0 && nTotlaWords >= m_nCharArray) {
887e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov        return place;
888e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov    }
889e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov    if (!m_bMultiLine) {
890e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov        return place;
891e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov    }
892e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov    CPVT_WordPlace wordplace = place;
893e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov    UpdateWordPlace(wordplace);
894e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov    CPVT_WordPlace newplace = place;
895e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov    if (CSection * pSection = m_SectionArray.GetAt(wordplace.nSecIndex)) {
896e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov        CPVT_WordPlace NewPlace(wordplace.nSecIndex + 1, 0, -1);
897e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov        CPVT_SectionInfo secinfo;
898e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov        if (m_bRichText) {
899e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov            if (pSecProps) {
900e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov                secinfo.pSecProps = new CPVT_SecProps(*pSecProps);
901e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov            }
902e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov            if (pWordProps) {
903e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov                secinfo.pWordProps = new CPVT_WordProps(*pWordProps);
904e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov            }
905e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov        }
906e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov        AddSection(NewPlace, secinfo);
907e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov        newplace = NewPlace;
908e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov        if (CSection * pNewSection = m_SectionArray.GetAt(NewPlace.nSecIndex)) {
909e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov            for (FX_INT32 w = wordplace.nWordIndex + 1, sz = pSection->m_WordArray.GetSize(); w < sz; w++) {
910e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov                if (CPVT_WordInfo * pWord = pSection->m_WordArray.GetAt(w)) {
911e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov                    NewPlace.nWordIndex++;
912e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov                    pNewSection->AddWord(NewPlace, *pWord);
913e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov                }
914e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov            }
915e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov        }
916e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov        ClearSectionRightWords(wordplace);
917e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov    }
918e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov    return newplace;
919e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov}
920e6986e1e8d4a57987f47c215490cb080a65ee29aSvet GanovCPVT_WordPlace CPDF_VariableText::InsertText(const CPVT_WordPlace & place, FX_LPCWSTR text, FX_INT32 charset,
921e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov        const CPVT_SecProps * pSecProps, const CPVT_WordProps * pProps)
922e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov{
923e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov    CFX_WideString swText = text;
924e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov    CPVT_WordPlace wp = place;
925e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov    for (FX_INT32 i = 0, sz = swText.GetLength(); i < sz; i++) {
926e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov        CPVT_WordPlace oldwp = wp;
927e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov        FX_WORD word = swText.GetAt(i);
928e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov        switch (word) {
929e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov            case 0x0D:
930e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov                if (m_bMultiLine) {
931e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov                    if (swText.GetAt(i + 1) == 0x0A) {
932e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov                        i += 1;
933e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov                    }
934e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov                    wp = InsertSection(wp, pSecProps, pProps);
935e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov                }
936e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov                break;
937e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov            case 0x0A:
938e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov                if (m_bMultiLine) {
939e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov                    if (swText.GetAt(i + 1) == 0x0D) {
940e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov                        i += 1;
941e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov                    }
942e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov                    wp = InsertSection(wp, pSecProps, pProps);
943e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov                }
944e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov                break;
945e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov            case 0x09:
946e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov                word = 0x20;
947e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov            default:
948e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov                wp = InsertWord(wp, word, charset, pProps);
949e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov                break;
950e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov        }
951e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov        if (wp == oldwp) {
952e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov            break;
953e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov        }
954e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov    }
955e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov    return wp;
956e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov}
957e6986e1e8d4a57987f47c215490cb080a65ee29aSvet GanovCPVT_WordPlace CPDF_VariableText::DeleteWords(const CPVT_WordRange & PlaceRange)
958e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov{
959e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov    FX_BOOL bLastSecPos = FALSE;
960e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov    if (CSection * pSection = m_SectionArray.GetAt(PlaceRange.EndPos.nSecIndex)) {
961e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov        bLastSecPos = (PlaceRange.EndPos == pSection->GetEndWordPlace());
962e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov    }
963e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov    ClearWords(PlaceRange);
964e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov    if (PlaceRange.BeginPos.nSecIndex != PlaceRange.EndPos.nSecIndex) {
965e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov        ClearEmptySections(PlaceRange);
966e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov        if (!bLastSecPos) {
967e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov            LinkLatterSection(PlaceRange.BeginPos);
968e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov        }
969e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov    }
970e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov    return PlaceRange.BeginPos;
971e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov}
972e6986e1e8d4a57987f47c215490cb080a65ee29aSvet GanovCPVT_WordPlace CPDF_VariableText::DeleteWord(const CPVT_WordPlace & place)
973e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov{
974e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov    return ClearRightWord(AjustLineHeader(place, TRUE));
975e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov}
976e6986e1e8d4a57987f47c215490cb080a65ee29aSvet GanovCPVT_WordPlace CPDF_VariableText::BackSpaceWord(const CPVT_WordPlace & place)
977e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov{
978e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov    return ClearLeftWord(AjustLineHeader(place, TRUE));
979e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov}
980e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganovvoid CPDF_VariableText::SetText(FX_LPCWSTR text, FX_INT32 charset, const CPVT_SecProps * pSecProps,
981e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov                                const CPVT_WordProps * pWordProps)
982e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov{
983e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov    DeleteWords(CPVT_WordRange(GetBeginWordPlace(), GetEndWordPlace()));
984e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov    CFX_WideString swText = text;
985e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov    CPVT_WordPlace	wp(0, 0, -1);
986e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov    CPVT_SectionInfo secinfo;
987e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov    if (m_bRichText) {
988e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov        if (pSecProps) {
989e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov            secinfo.pSecProps = new CPVT_SecProps(*pSecProps);
990e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov        }
991e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov        if (pWordProps) {
992e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov            secinfo.pWordProps = new CPVT_WordProps(*pWordProps);
993e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov        }
994e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov    }
995e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov    if (CSection * pSection = m_SectionArray.GetAt(0)) {
996e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov        pSection->m_SecInfo = secinfo;
997e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov    }
998e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov    FX_INT32 nCharCount = 0;
999e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov    for (FX_INT32 i = 0, sz = swText.GetLength(); i < sz; i++) {
1000e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov        if (m_nLimitChar > 0 && nCharCount >= m_nLimitChar) {
1001e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov            break;
1002e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov        }
1003e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov        if (m_nCharArray > 0 && nCharCount >= m_nCharArray) {
1004e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov            break;
1005e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov        }
1006e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov        FX_WORD word = swText.GetAt(i);
1007e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov        switch (word) {
1008e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov            case 0x0D:
1009e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov                if (m_bMultiLine) {
1010e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov                    if (swText.GetAt(i + 1) == 0x0A) {
1011e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov                        i += 1;
1012e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov                    }
1013e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov                    wp.nSecIndex ++;
1014e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov                    wp.nLineIndex = 0;
1015e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov                    wp.nWordIndex = -1;
1016e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov                    AddSection(wp, secinfo);
1017e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov                }
1018e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov                break;
1019e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov            case 0x0A:
1020e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov                if (m_bMultiLine) {
1021e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov                    if (swText.GetAt(i + 1) == 0x0D) {
1022e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov                        i += 1;
1023e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov                    }
1024e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov                    wp.nSecIndex ++;
1025e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov                    wp.nLineIndex = 0;
1026e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov                    wp.nWordIndex = -1;
1027e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov                    AddSection(wp, secinfo);
1028e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov                }
1029e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov                break;
1030e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov            case 0x09:
1031e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov                word = 0x20;
1032e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov            default:
1033e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov                wp = InsertWord(wp, word, charset, pWordProps);
1034e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov                break;
1035e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov        }
1036e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov        nCharCount++;
1037e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov    }
1038e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov}
1039e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganovvoid CPDF_VariableText::UpdateWordPlace(CPVT_WordPlace & place) const
1040e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov{
1041e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov    if (place.nSecIndex < 0) {
1042e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov        place = GetBeginWordPlace();
1043e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov    }
1044e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov    if (place.nSecIndex >= m_SectionArray.GetSize()) {
1045e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov        place = GetEndWordPlace();
1046e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov    }
1047e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov    place = AjustLineHeader(place, TRUE);
1048e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov    if (CSection * pSection = m_SectionArray.GetAt(place.nSecIndex)) {
1049e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov        pSection->UpdateWordPlace(place);
1050e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov    }
1051e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov}
1052e6986e1e8d4a57987f47c215490cb080a65ee29aSvet GanovFX_INT32 CPDF_VariableText::WordPlaceToWordIndex(const CPVT_WordPlace & place) const
1053e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov{
1054e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov    CPVT_WordPlace newplace = place;
1055e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov    UpdateWordPlace(newplace);
1056e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov    FX_INT32 nIndex = 0;
1057e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov    FX_INT32 i = 0;
1058e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov    FX_INT32 sz = 0;
1059e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov    for (i = 0, sz = m_SectionArray.GetSize(); i < sz && i < newplace.nSecIndex; i++) {
1060e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov        if (CSection * pSection = m_SectionArray.GetAt(i)) {
1061e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov            nIndex += pSection->m_WordArray.GetSize();
1062e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov            if (i != m_SectionArray.GetSize() - 1) {
1063e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov                nIndex += PVT_RETURN_LENGTH;
1064e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov            }
1065e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov        }
1066e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov    }
1067e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov    if (i >= 0 && i < m_SectionArray.GetSize()) {
1068e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov        nIndex += newplace.nWordIndex + PVT_RETURN_LENGTH;
1069e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov    }
1070e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov    return nIndex;
1071e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov}
1072e6986e1e8d4a57987f47c215490cb080a65ee29aSvet GanovCPVT_WordPlace CPDF_VariableText::WordIndexToWordPlace(FX_INT32 index) const
1073e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov{
1074e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov    CPVT_WordPlace place = GetBeginWordPlace();
1075e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov    FX_INT32 nOldIndex = 0 , nIndex = 0;
1076e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov    FX_BOOL bFind = FALSE;
1077e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov    for (FX_INT32 i = 0, sz = m_SectionArray.GetSize(); i < sz; i++) {
1078e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov        if (CSection * pSection = m_SectionArray.GetAt(i)) {
1079e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov            nIndex += pSection->m_WordArray.GetSize();
1080e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov            if (nIndex == index) {
1081e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov                place = pSection->GetEndWordPlace();
1082e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov                bFind = TRUE;
1083e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov                break;
1084e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov            } else if (nIndex > index) {
1085e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov                place.nSecIndex = i;
1086e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov                place.nWordIndex = index - nOldIndex - 1;
1087e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov                pSection->UpdateWordPlace(place);
1088e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov                bFind = TRUE;
1089e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov                break;
1090e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov            }
1091e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov            if (i != m_SectionArray.GetSize() - 1) {
1092e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov                nIndex += PVT_RETURN_LENGTH;
1093e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov            }
1094e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov            nOldIndex = nIndex;
1095e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov        }
1096e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov    }
1097e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov    if (!bFind) {
1098e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov        place = GetEndWordPlace();
1099e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov    }
1100e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov    return place;
1101e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov}
1102e6986e1e8d4a57987f47c215490cb080a65ee29aSvet GanovCPVT_WordPlace CPDF_VariableText::GetBeginWordPlace() const
1103e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov{
1104e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov    return m_bInitial ? CPVT_WordPlace(0, 0, -1) : CPVT_WordPlace();
1105e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov}
1106e6986e1e8d4a57987f47c215490cb080a65ee29aSvet GanovCPVT_WordPlace CPDF_VariableText::GetEndWordPlace() const
1107e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov{
1108e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov    if (CSection * pSection = m_SectionArray.GetAt(m_SectionArray.GetSize() - 1)) {
1109e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov        return pSection->GetEndWordPlace();
1110e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov    }
1111e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov    return CPVT_WordPlace();
1112e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov}
1113e6986e1e8d4a57987f47c215490cb080a65ee29aSvet GanovCPVT_WordPlace CPDF_VariableText::GetPrevWordPlace(const CPVT_WordPlace & place) const
1114e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov{
1115e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov    if( place.nSecIndex < 0) {
1116e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov        return GetBeginWordPlace();
1117e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov    }
1118e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov    if (place.nSecIndex >= m_SectionArray.GetSize()) {
1119e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov        return GetEndWordPlace();
1120e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov    }
1121e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov    if (CSection * pSection = m_SectionArray.GetAt(place.nSecIndex)) {
1122e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov        if (place.WordCmp(pSection->GetBeginWordPlace()) <= 0) {
1123e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov            if (CSection * pPrevSection = m_SectionArray.GetAt(place.nSecIndex - 1)) {
1124e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov                return pPrevSection->GetEndWordPlace();
1125e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov            } else {
1126e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov                return GetBeginWordPlace();
1127e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov            }
1128e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov        } else {
1129e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov            return pSection->GetPrevWordPlace(place);
1130e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov        }
1131e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov    }
1132e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov    return place;
1133e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov}
1134e6986e1e8d4a57987f47c215490cb080a65ee29aSvet GanovCPVT_WordPlace CPDF_VariableText::GetNextWordPlace(const CPVT_WordPlace & place) const
1135e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov{
1136e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov    if (place.nSecIndex < 0) {
1137e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov        return GetBeginWordPlace();
1138e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov    }
1139e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov    if (place.nSecIndex >= m_SectionArray.GetSize()) {
1140e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov        return GetEndWordPlace();
1141e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov    }
1142e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov    if (CSection * pSection = m_SectionArray.GetAt(place.nSecIndex)) {
1143e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov        if (place.WordCmp(pSection->GetEndWordPlace()) >= 0) {
1144e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov            if (CSection * pNextSection = m_SectionArray.GetAt(place.nSecIndex + 1)) {
1145e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov                return pNextSection->GetBeginWordPlace();
1146e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov            } else {
1147e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov                return GetEndWordPlace();
1148e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov            }
1149e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov        } else {
1150e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov            return pSection->GetNextWordPlace(place);
1151e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov        }
1152e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov    }
1153e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov    return place;
1154e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov}
1155e6986e1e8d4a57987f47c215490cb080a65ee29aSvet GanovCPVT_WordPlace CPDF_VariableText::SearchWordPlace(const CPDF_Point & point) const
1156e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov{
1157e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov    CPDF_Point pt = OutToIn(point);
1158e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov    CPVT_WordPlace place = GetBeginWordPlace();
1159e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov    FX_INT32 nLeft = 0;
1160e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov    FX_INT32 nRight = m_SectionArray.GetSize() - 1;
1161e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov    FX_INT32 nMid = m_SectionArray.GetSize() / 2;
1162e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov    FX_BOOL bUp = TRUE;
1163e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov    FX_BOOL bDown = TRUE;
1164e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov    while (nLeft <= nRight) {
1165e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov        if (CSection * pSection = m_SectionArray.GetAt(nMid)) {
1166e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov            if (IsFloatBigger(pt.y, pSection->m_SecInfo.rcSection.top)) {
1167e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov                bUp = FALSE;
1168e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov            }
1169e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov            if (IsFloatBigger(pSection->m_SecInfo.rcSection.bottom, pt.y)) {
1170e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov                bDown = FALSE;
1171e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov            }
1172e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov            if (IsFloatSmaller(pt.y, pSection->m_SecInfo.rcSection.top)) {
1173e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov                nRight = nMid - 1;
1174e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov                nMid = (nLeft + nRight) / 2;
1175e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov                continue;
1176e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov            } else if (IsFloatBigger(pt.y, pSection->m_SecInfo.rcSection.bottom)) {
1177e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov                nLeft = nMid + 1;
1178e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov                nMid = (nLeft + nRight) / 2;
1179e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov                continue;
1180e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov            } else {
1181e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov                place = pSection->SearchWordPlace(
1182e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov                            CPDF_Point(pt.x - pSection->m_SecInfo.rcSection.left, pt.y - pSection->m_SecInfo.rcSection.top)
1183e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov                        );
1184e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov                place.nSecIndex = nMid;
1185e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov                return place;
1186e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov            }
1187e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov        } else {
1188e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov            break;
1189e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov        }
1190e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov    }
1191e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov    if (bUp) {
1192e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov        place = GetBeginWordPlace();
1193e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov    }
1194e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov    if (bDown) {
1195e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov        place = GetEndWordPlace();
1196e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov    }
1197e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov    return place;
1198e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov}
1199e6986e1e8d4a57987f47c215490cb080a65ee29aSvet GanovCPVT_WordPlace CPDF_VariableText::GetUpWordPlace(const CPVT_WordPlace & place, const CPDF_Point & point) const
1200e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov{
1201e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov    if (CSection * pSection = m_SectionArray.GetAt(place.nSecIndex)) {
1202e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov        CPVT_WordPlace temp =  place;
1203e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov        CPDF_Point pt = OutToIn(point);
1204e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov        if (temp.nLineIndex-- > 0) {
1205e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov            return pSection->SearchWordPlace(pt.x - pSection->m_SecInfo.rcSection.left, temp);
1206e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov        } else {
1207e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov            if (temp.nSecIndex-- > 0) {
1208e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov                if (CSection * pLastSection = m_SectionArray.GetAt(temp.nSecIndex)) {
1209e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov                    temp.nLineIndex = pLastSection->m_LineArray.GetSize() - 1;
1210e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov                    return pLastSection->SearchWordPlace(pt.x - pLastSection->m_SecInfo.rcSection.left, temp);
1211e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov                }
1212e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov            }
1213e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov        }
1214e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov    }
1215e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov    return place;
1216e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov}
1217e6986e1e8d4a57987f47c215490cb080a65ee29aSvet GanovCPVT_WordPlace CPDF_VariableText::GetDownWordPlace(const CPVT_WordPlace & place, const CPDF_Point & point) const
1218e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov{
1219e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov    if (CSection * pSection = m_SectionArray.GetAt(place.nSecIndex)) {
1220e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov        CPVT_WordPlace temp =  place;
1221e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov        CPDF_Point pt = OutToIn(point);
1222e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov        if (temp.nLineIndex++ < pSection->m_LineArray.GetSize() - 1) {
1223e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov            return pSection->SearchWordPlace(pt.x - pSection->m_SecInfo.rcSection.left, temp);
1224e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov        } else {
1225e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov            if (temp.nSecIndex++ < m_SectionArray.GetSize() - 1) {
1226e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov                if (CSection * pNextSection = m_SectionArray.GetAt(temp.nSecIndex)) {
1227e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov                    temp.nLineIndex = 0;
1228e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov                    return pNextSection->SearchWordPlace(pt.x - pSection->m_SecInfo.rcSection.left, temp);
1229e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov                }
1230e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov            }
1231e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov        }
1232e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov    }
1233e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov    return place;
1234e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov}
1235e6986e1e8d4a57987f47c215490cb080a65ee29aSvet GanovCPVT_WordPlace CPDF_VariableText::GetLineBeginPlace(const CPVT_WordPlace & place) const
1236e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov{
1237e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov    return CPVT_WordPlace(place.nSecIndex, place.nLineIndex, -1);
1238e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov}
1239e6986e1e8d4a57987f47c215490cb080a65ee29aSvet GanovCPVT_WordPlace CPDF_VariableText::GetLineEndPlace(const CPVT_WordPlace & place) const
1240e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov{
1241e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov    if (CSection * pSection = m_SectionArray.GetAt(place.nSecIndex))
1242e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov        if (CLine * pLine = pSection->m_LineArray.GetAt(place.nLineIndex)) {
1243e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov            return pLine->GetEndWordPlace();
1244e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov        }
1245e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov    return place;
1246e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov}
1247e6986e1e8d4a57987f47c215490cb080a65ee29aSvet GanovCPVT_WordPlace CPDF_VariableText::GetSectionBeginPlace(const CPVT_WordPlace & place) const
1248e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov{
1249e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov    return CPVT_WordPlace(place.nSecIndex, 0, -1);
1250e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov}
1251e6986e1e8d4a57987f47c215490cb080a65ee29aSvet GanovCPVT_WordPlace CPDF_VariableText::GetSectionEndPlace(const CPVT_WordPlace & place) const
1252e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov{
1253e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov    if (CSection * pSection = m_SectionArray.GetAt(place.nSecIndex)) {
1254e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov        return pSection->GetEndWordPlace();
1255e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov    }
1256e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov    return place;
1257e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov}
1258e6986e1e8d4a57987f47c215490cb080a65ee29aSvet GanovFX_INT32 CPDF_VariableText::GetTotalWords() const
1259e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov{
1260e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov    FX_INT32 nTotal = 0;
1261e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov    for (FX_INT32 i = 0, sz = m_SectionArray.GetSize(); i < sz; i++)
1262e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov        if (CSection * pSection = m_SectionArray.GetAt(i)) {
1263e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov            nTotal += (pSection->m_WordArray.GetSize() + PVT_RETURN_LENGTH);
1264e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov        }
1265e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov    return nTotal - PVT_RETURN_LENGTH;
1266e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov}
1267e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganovvoid CPDF_VariableText::ResetSectionArray()
1268e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov{
1269e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov    for (FX_INT32 s = 0, sz = m_SectionArray.GetSize(); s < sz; s++) {
1270e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov        delete m_SectionArray.GetAt(s);
1271e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov    }
1272e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov    m_SectionArray.RemoveAll();
1273e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov}
1274e6986e1e8d4a57987f47c215490cb080a65ee29aSvet GanovCPVT_WordPlace CPDF_VariableText::AddSection(const CPVT_WordPlace & place, const CPVT_SectionInfo & secinfo)
1275e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov{
1276e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov    if (IsValid() && !m_bMultiLine) {
1277e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov        return place;
1278e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov    }
1279e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov    FX_INT32 nSecIndex = FPDF_MAX(FPDF_MIN(place.nSecIndex, m_SectionArray.GetSize()), 0);
1280e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov    CSection * pSection = new CSection(this);
1281e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov    pSection->m_SecInfo = secinfo;
1282e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov    pSection->SecPlace.nSecIndex = nSecIndex;
1283e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov    if (nSecIndex == m_SectionArray.GetSize()) {
1284e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov        m_SectionArray.Add(pSection);
1285e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov    } else {
1286e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov        m_SectionArray.InsertAt(nSecIndex, pSection);
1287e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov    }
1288e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov    return place;
1289e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov}
1290e6986e1e8d4a57987f47c215490cb080a65ee29aSvet GanovCPVT_WordPlace CPDF_VariableText::AddLine(const CPVT_WordPlace & place, const CPVT_LineInfo & lineinfo)
1291e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov{
1292e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov    if (m_SectionArray.IsEmpty()) {
1293e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov        return place;
1294e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov    }
1295e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov    if (CSection * pSection = m_SectionArray.GetAt(place.nSecIndex)) {
1296e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov        return pSection->AddLine(lineinfo);
1297e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov    }
1298e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov    return place;
1299e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov}
1300e6986e1e8d4a57987f47c215490cb080a65ee29aSvet GanovCPVT_WordPlace CPDF_VariableText::AddWord(const CPVT_WordPlace & place, const CPVT_WordInfo & wordinfo)
1301e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov{
1302e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov    if (m_SectionArray.GetSize() <= 0) {
1303e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov        return place;
1304e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov    }
1305e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov    CPVT_WordPlace newplace = place;
1306e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov    newplace.nSecIndex = FPDF_MAX(FPDF_MIN(newplace.nSecIndex, m_SectionArray.GetSize() - 1), 0);
1307e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov    if (CSection * pSection = m_SectionArray.GetAt(newplace.nSecIndex)) {
1308e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov        return pSection->AddWord(newplace, wordinfo);
1309e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov    }
1310e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov    return place;
1311e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov}
1312e6986e1e8d4a57987f47c215490cb080a65ee29aSvet GanovFX_BOOL CPDF_VariableText::GetWordInfo(const CPVT_WordPlace & place, CPVT_WordInfo & wordinfo)
1313e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov{
1314e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov    if (CSection * pSection = m_SectionArray.GetAt(place.nSecIndex)) {
1315e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov        if (CPVT_WordInfo * pWord = pSection->m_WordArray.GetAt(place.nWordIndex)) {
1316e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov            wordinfo = *pWord;
1317e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov            return TRUE;
1318e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov        }
1319e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov    }
1320e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov    return FALSE;
1321e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov}
1322e6986e1e8d4a57987f47c215490cb080a65ee29aSvet GanovFX_BOOL CPDF_VariableText::SetWordInfo(const CPVT_WordPlace & place, const CPVT_WordInfo & wordinfo)
1323e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov{
1324e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov    if (CSection * pSection = m_SectionArray.GetAt(place.nSecIndex)) {
1325e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov        if (CPVT_WordInfo * pWord = pSection->m_WordArray.GetAt(place.nWordIndex)) {
1326e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov            *pWord = wordinfo;
1327e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov            return TRUE;
1328e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov        }
1329e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov    }
1330e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov    return FALSE;
1331e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov}
1332e6986e1e8d4a57987f47c215490cb080a65ee29aSvet GanovFX_BOOL CPDF_VariableText::GetLineInfo(const CPVT_WordPlace & place, CPVT_LineInfo & lineinfo)
1333e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov{
1334e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov    if (CSection * pSection = m_SectionArray.GetAt(place.nSecIndex)) {
1335e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov        if (CLine * pLine = pSection->m_LineArray.GetAt(place.nLineIndex)) {
1336e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov            lineinfo = pLine->m_LineInfo;
1337e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov            return TRUE;
1338e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov        }
1339e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov    }
1340e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov    return FALSE;
1341e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov}
1342e6986e1e8d4a57987f47c215490cb080a65ee29aSvet GanovFX_BOOL CPDF_VariableText::GetSectionInfo(const CPVT_WordPlace & place, CPVT_SectionInfo & secinfo)
1343e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov{
1344e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov    if (CSection * pSection = m_SectionArray.GetAt(place.nSecIndex)) {
1345e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov        secinfo = pSection->m_SecInfo;
1346e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov        return TRUE;
1347e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov    }
1348e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov    return FALSE;
1349e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov}
1350e6986e1e8d4a57987f47c215490cb080a65ee29aSvet GanovCPDF_Rect CPDF_VariableText::GetContentRect() const
1351e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov{
1352e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov    return InToOut(CPDF_EditContainer::GetContentRect());
1353e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov}
1354e6986e1e8d4a57987f47c215490cb080a65ee29aSvet GanovFX_FLOAT CPDF_VariableText::GetWordFontSize(const CPVT_WordInfo & WordInfo, FX_BOOL bFactFontSize)
1355e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov{
1356e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov    return m_bRichText && WordInfo.pWordProps ? (WordInfo.pWordProps->nScriptType == PVTWORD_SCRIPT_NORMAL || bFactFontSize ? WordInfo.pWordProps->fFontSize : WordInfo.pWordProps->fFontSize * PVT_HALF) : GetFontSize();
1357e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov}
1358e6986e1e8d4a57987f47c215490cb080a65ee29aSvet GanovFX_INT32 CPDF_VariableText::GetWordFontIndex(const CPVT_WordInfo & WordInfo)
1359e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov{
1360e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov    return m_bRichText && WordInfo.pWordProps ? WordInfo.pWordProps->nFontIndex : WordInfo.nFontIndex;
1361e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov}
1362e6986e1e8d4a57987f47c215490cb080a65ee29aSvet GanovFX_FLOAT CPDF_VariableText::GetWordWidth(FX_INT32 nFontIndex, FX_WORD Word, FX_WORD SubWord,
1363e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov        FX_FLOAT fCharSpace, FX_INT32 nHorzScale,
1364e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov        FX_FLOAT fFontSize, FX_FLOAT fWordTail, FX_INT32 nWordStyle)
1365e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov{
1366e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov    return (GetCharWidth(nFontIndex, Word, SubWord, nWordStyle) * fFontSize * PVT_FONTSCALE + fCharSpace) * nHorzScale * PVT_PERCENT + fWordTail;
1367e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov}
1368e6986e1e8d4a57987f47c215490cb080a65ee29aSvet GanovFX_FLOAT CPDF_VariableText::GetWordWidth(const CPVT_WordInfo & WordInfo)
1369e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov{
1370e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov    return GetWordWidth(GetWordFontIndex(WordInfo), WordInfo.Word, GetSubWord(), GetCharSpace(WordInfo), GetHorzScale(WordInfo),
1371e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov                        GetWordFontSize(WordInfo), WordInfo.fWordTail,
1372e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov                        WordInfo.pWordProps ? WordInfo.pWordProps->nWordStyle : 0);
1373e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov}
1374e6986e1e8d4a57987f47c215490cb080a65ee29aSvet GanovFX_FLOAT CPDF_VariableText::GetLineAscent(const CPVT_SectionInfo & SecInfo)
1375e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov{
1376e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov    return m_bRichText && SecInfo.pWordProps ? GetFontAscent(SecInfo.pWordProps->nFontIndex, SecInfo.pWordProps->fFontSize) :
1377e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov           GetFontAscent(GetDefaultFontIndex(), GetFontSize());
1378e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov}
1379e6986e1e8d4a57987f47c215490cb080a65ee29aSvet GanovFX_FLOAT CPDF_VariableText::GetLineDescent(const CPVT_SectionInfo & SecInfo)
1380e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov{
1381e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov    return m_bRichText && SecInfo.pWordProps ? GetFontDescent(SecInfo.pWordProps->nFontIndex, SecInfo.pWordProps->fFontSize) :
1382e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov           GetFontDescent(GetDefaultFontIndex(), GetFontSize());
1383e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov}
1384e6986e1e8d4a57987f47c215490cb080a65ee29aSvet GanovFX_FLOAT CPDF_VariableText::GetFontAscent(FX_INT32 nFontIndex, FX_FLOAT fFontSize)
1385e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov{
1386e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov    return (FX_FLOAT)GetTypeAscent(nFontIndex) * fFontSize * PVT_FONTSCALE;
1387e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov}
1388e6986e1e8d4a57987f47c215490cb080a65ee29aSvet GanovFX_FLOAT CPDF_VariableText::GetFontDescent(FX_INT32 nFontIndex, FX_FLOAT fFontSize)
1389e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov{
1390e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov    return (FX_FLOAT)GetTypeDescent(nFontIndex) * fFontSize * PVT_FONTSCALE;
1391e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov}
1392e6986e1e8d4a57987f47c215490cb080a65ee29aSvet GanovFX_FLOAT CPDF_VariableText::GetWordAscent(const CPVT_WordInfo & WordInfo, FX_FLOAT fFontSize)
1393e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov{
1394e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov    return GetFontAscent(GetWordFontIndex(WordInfo), fFontSize);
1395e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov}
1396e6986e1e8d4a57987f47c215490cb080a65ee29aSvet GanovFX_FLOAT CPDF_VariableText::GetWordDescent(const CPVT_WordInfo & WordInfo, FX_FLOAT fFontSize)
1397e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov{
1398e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov    return GetFontDescent(GetWordFontIndex(WordInfo), fFontSize);
1399e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov}
1400e6986e1e8d4a57987f47c215490cb080a65ee29aSvet GanovFX_FLOAT CPDF_VariableText::GetWordAscent(const CPVT_WordInfo & WordInfo, FX_BOOL bFactFontSize)
1401e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov{
1402e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov    return GetFontAscent(GetWordFontIndex(WordInfo), GetWordFontSize(WordInfo, bFactFontSize));
1403e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov}
1404e6986e1e8d4a57987f47c215490cb080a65ee29aSvet GanovFX_FLOAT CPDF_VariableText::GetWordDescent(const CPVT_WordInfo & WordInfo, FX_BOOL bFactFontSize)
1405e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov{
1406e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov    return GetFontDescent(GetWordFontIndex(WordInfo), GetWordFontSize(WordInfo, bFactFontSize));
1407e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov}
1408e6986e1e8d4a57987f47c215490cb080a65ee29aSvet GanovFX_FLOAT CPDF_VariableText::GetLineLeading(const CPVT_SectionInfo & SecInfo)
1409e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov{
1410e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov    return m_bRichText && SecInfo.pSecProps ? SecInfo.pSecProps->fLineLeading : m_fLineLeading;
1411e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov}
1412e6986e1e8d4a57987f47c215490cb080a65ee29aSvet GanovFX_FLOAT CPDF_VariableText::GetLineIndent(const CPVT_SectionInfo & SecInfo)
1413e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov{
1414e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov    return m_bRichText && SecInfo.pSecProps ? SecInfo.pSecProps->fLineIndent : 0.0f;
1415e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov}
1416e6986e1e8d4a57987f47c215490cb080a65ee29aSvet GanovFX_INT32 CPDF_VariableText::GetAlignment(const CPVT_SectionInfo& SecInfo)
1417e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov{
1418e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov    return m_bRichText && SecInfo.pSecProps ? SecInfo.pSecProps->nAlignment : this->m_nAlignment;
1419e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov}
1420e6986e1e8d4a57987f47c215490cb080a65ee29aSvet GanovFX_FLOAT CPDF_VariableText::GetCharSpace(const CPVT_WordInfo & WordInfo)
1421e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov{
1422e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov    return m_bRichText && WordInfo.pWordProps ? WordInfo.pWordProps->fCharSpace : m_fCharSpace;
1423e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov}
1424e6986e1e8d4a57987f47c215490cb080a65ee29aSvet GanovFX_INT32 CPDF_VariableText::GetHorzScale(const CPVT_WordInfo & WordInfo)
1425e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov{
1426e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov    return m_bRichText && WordInfo.pWordProps ? WordInfo.pWordProps->nHorzScale : m_nHorzScale;
1427e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov}
1428e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganovvoid CPDF_VariableText::ClearSectionRightWords(const CPVT_WordPlace & place)
1429e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov{
1430e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov    CPVT_WordPlace wordplace = AjustLineHeader(place, TRUE);
1431e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov    if (CSection * pSection = m_SectionArray.GetAt(place.nSecIndex)) {
1432e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov        for (FX_INT32 w = pSection->m_WordArray.GetSize() - 1; w > wordplace.nWordIndex; w--) {
1433e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov            delete pSection->m_WordArray.GetAt(w);
1434e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov            pSection->m_WordArray.RemoveAt(w);
1435e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov        }
1436e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov    }
1437e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov}
1438e6986e1e8d4a57987f47c215490cb080a65ee29aSvet GanovCPVT_WordPlace CPDF_VariableText::AjustLineHeader(const CPVT_WordPlace & place, FX_BOOL bPrevOrNext) const
1439e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov{
1440e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov    if (place.nWordIndex < 0 && place.nLineIndex > 0) {
1441e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov        if (bPrevOrNext) {
1442e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov            return GetPrevWordPlace(place);
1443e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov        } else {
1444e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov            return GetNextWordPlace(place);
1445e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov        }
1446e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov    }
1447e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov    return place;
1448e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov}
1449e6986e1e8d4a57987f47c215490cb080a65ee29aSvet GanovFX_BOOL CPDF_VariableText::ClearEmptySection(const CPVT_WordPlace & place)
1450e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov{
1451e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov    if (place.nSecIndex == 0 && m_SectionArray.GetSize() == 1) {
1452e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov        return FALSE;
1453e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov    }
1454e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov    if (CSection * pSection = m_SectionArray.GetAt(place.nSecIndex)) {
1455e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov        if (pSection->m_WordArray.GetSize() == 0) {
1456e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov            delete pSection;
1457e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov            m_SectionArray.RemoveAt(place.nSecIndex);
1458e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov            return TRUE;
1459e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov        }
1460e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov    }
1461e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov    return FALSE;
1462e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov}
1463e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganovvoid CPDF_VariableText::ClearEmptySections(const CPVT_WordRange & PlaceRange)
1464e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov{
1465e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov    CPVT_WordPlace wordplace;
1466e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov    for (FX_INT32 s = PlaceRange.EndPos.nSecIndex; s > PlaceRange.BeginPos.nSecIndex; s--) {
1467e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov        wordplace.nSecIndex = s;
1468e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov        ClearEmptySection(wordplace);
1469e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov    }
1470e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov}
1471e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganovvoid CPDF_VariableText::LinkLatterSection(const CPVT_WordPlace & place)
1472e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov{
1473e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov    CPVT_WordPlace oldplace = AjustLineHeader(place, TRUE);
1474e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov    if (CSection * pNextSection = m_SectionArray.GetAt(place.nSecIndex + 1)) {
1475e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov        if (CSection * pSection = m_SectionArray.GetAt(oldplace.nSecIndex)) {
1476e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov            for (FX_INT32 w = 0, sz = pNextSection->m_WordArray.GetSize(); w < sz; w++) {
1477e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov                if (CPVT_WordInfo * pWord = pNextSection->m_WordArray.GetAt(w)) {
1478e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov                    oldplace.nWordIndex ++;
1479e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov                    pSection->AddWord(oldplace, *pWord);
1480e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov                }
1481e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov            }
1482e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov        }
1483e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov        delete pNextSection;
1484e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov        m_SectionArray.RemoveAt(place.nSecIndex + 1);
1485e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov    }
1486e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov}
1487e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganovvoid CPDF_VariableText::ClearWords(const CPVT_WordRange & PlaceRange)
1488e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov{
1489e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov    CPVT_WordRange NewRange;
1490e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov    NewRange.BeginPos = AjustLineHeader(PlaceRange.BeginPos, TRUE);
1491e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov    NewRange.EndPos = AjustLineHeader(PlaceRange.EndPos, TRUE);
1492e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov    for (FX_INT32 s = NewRange.EndPos.nSecIndex; s >= NewRange.BeginPos.nSecIndex; s--) {
1493e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov        if (CSection * pSection = m_SectionArray.GetAt(s)) {
1494e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov            pSection->ClearWords(NewRange);
1495e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov        }
1496e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov    }
1497e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov}
1498e6986e1e8d4a57987f47c215490cb080a65ee29aSvet GanovCPVT_WordPlace CPDF_VariableText::ClearLeftWord(const CPVT_WordPlace & place)
1499e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov{
1500e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov    if (CSection * pSection = m_SectionArray.GetAt(place.nSecIndex)) {
1501e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov        CPVT_WordPlace leftplace = this->GetPrevWordPlace(place);
1502e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov        if (leftplace != place) {
1503e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov            if (leftplace.nSecIndex != place.nSecIndex) {
1504e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov                if (pSection->m_WordArray.GetSize() == 0) {
1505e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov                    this->ClearEmptySection(place);
1506e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov                } else {
1507e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov                    this->LinkLatterSection(leftplace);
1508e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov                }
1509e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov            } else {
1510e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov                pSection->ClearWord(place);
1511e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov            }
1512e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov        }
1513e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov        return leftplace;
1514e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov    }
1515e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov    return place;
1516e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov}
1517e6986e1e8d4a57987f47c215490cb080a65ee29aSvet GanovCPVT_WordPlace CPDF_VariableText::ClearRightWord(const CPVT_WordPlace & place)
1518e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov{
1519e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov    if (CSection * pSection = m_SectionArray.GetAt(place.nSecIndex)) {
1520e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov        CPVT_WordPlace rightplace = AjustLineHeader(this->GetNextWordPlace(place), FALSE);
1521e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov        if (rightplace != place) {
1522e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov            if(rightplace.nSecIndex != place.nSecIndex) {
1523e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov                LinkLatterSection(place);
1524e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov            } else {
1525e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov                pSection->ClearWord(rightplace);
1526e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov            }
1527e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov        }
1528e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov    }
1529e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov    return place;
1530e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov}
1531e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganovvoid CPDF_VariableText::RearrangeAll()
1532e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov{
1533e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov    Rearrange(CPVT_WordRange(GetBeginWordPlace(), GetEndWordPlace()));
1534e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov}
1535e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganovvoid CPDF_VariableText::RearrangePart(const CPVT_WordRange & PlaceRange)
1536e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov{
1537e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov    Rearrange(PlaceRange);
1538e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov}
1539e6986e1e8d4a57987f47c215490cb080a65ee29aSvet GanovCPVT_FloatRect CPDF_VariableText::Rearrange(const CPVT_WordRange & PlaceRange)
1540e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov{
1541e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov    CPVT_FloatRect rcRet;
1542e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov    if (IsValid()) {
1543e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov        if (m_bAutoFontSize) {
1544e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov            SetFontSize(GetAutoFontSize());
1545e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov            rcRet = RearrangeSections(CPVT_WordRange(GetBeginWordPlace(), GetEndWordPlace()));
1546e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov        } else {
1547e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov            rcRet = RearrangeSections(PlaceRange);
1548e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov        }
1549e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov    }
1550e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov    SetContentRect(rcRet);
1551e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov    return rcRet;
1552e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov}
1553e6986e1e8d4a57987f47c215490cb080a65ee29aSvet GanovFX_FLOAT CPDF_VariableText::GetAutoFontSize()
1554e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov{
1555e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov    FX_INT32 nTotal = sizeof(gFontSizeSteps) / sizeof(FX_BYTE);
1556e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov    if (IsMultiLine()) {
1557e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov        nTotal /= 4;
1558e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov    }
1559e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov    if (nTotal <= 0) {
1560e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov        return 0;
1561e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov    }
1562e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov    if (GetPlateWidth() <= 0) {
1563e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov        return 0;
1564e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov    }
1565e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov    FX_INT32 nLeft = 0;
1566e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov    FX_INT32 nRight = nTotal - 1;
1567e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov    FX_INT32 nMid = nTotal / 2;
1568e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov    while (nLeft <= nRight) {
1569e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov        if (IsBigger(gFontSizeSteps[nMid])) {
1570e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov            nRight = nMid - 1;
1571e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov            nMid = (nLeft + nRight) / 2;
1572e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov            continue;
1573e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov        } else {
1574e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov            nLeft = nMid + 1;
1575e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov            nMid = (nLeft + nRight) / 2;
1576e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov            continue;
1577e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov        }
1578e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov    }
1579e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov    return (FX_FLOAT)gFontSizeSteps[nMid];
1580e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov}
1581e6986e1e8d4a57987f47c215490cb080a65ee29aSvet GanovFX_BOOL	CPDF_VariableText::IsBigger(FX_FLOAT fFontSize)
1582e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov{
1583e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov    FX_BOOL bBigger =  FALSE;
1584e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov    CPVT_Size szTotal;
1585e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov    for (FX_INT32 s = 0, sz = m_SectionArray.GetSize(); s < sz; s++) {
1586e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov        if (CSection * pSection = m_SectionArray.GetAt(s)) {
1587e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov            CPVT_Size size = pSection->GetSectionSize(fFontSize);
1588e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov            szTotal.x = FPDF_MAX(size.x, szTotal.x);
1589e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov            szTotal.y += size.y;
1590e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov            if (IsFloatBigger(szTotal.x, GetPlateWidth())
1591e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov                    || IsFloatBigger(szTotal.y, GetPlateHeight())
1592e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov               ) {
1593e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov                bBigger = TRUE;
1594e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov                break;
1595e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov            }
1596e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov        }
1597e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov    }
1598e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov    return bBigger;
1599e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov}
1600e6986e1e8d4a57987f47c215490cb080a65ee29aSvet GanovCPVT_FloatRect CPDF_VariableText::RearrangeSections(const CPVT_WordRange & PlaceRange)
1601e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov{
1602e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov    CPVT_WordPlace place;
1603e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov    FX_FLOAT fPosY = 0;
1604e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov    FX_FLOAT fOldHeight;
1605e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov    FX_INT32 nSSecIndex = PlaceRange.BeginPos.nSecIndex;
1606e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov    FX_INT32 nESecIndex = PlaceRange.EndPos.nSecIndex;
1607e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov    CPVT_FloatRect rcRet;
1608e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov    for (FX_INT32 s = 0, sz = m_SectionArray.GetSize(); s < sz; s++) {
1609e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov        place.nSecIndex = s;
1610e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov        if (CSection * pSection = m_SectionArray.GetAt(s)) {
1611e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov            pSection->SecPlace = place;
1612e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov            CPVT_FloatRect rcSec = pSection->m_SecInfo.rcSection;
1613e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov            if (s >= nSSecIndex) {
1614e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov                if (s <= nESecIndex) {
1615e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov                    rcSec = pSection->Rearrange();
1616e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov                    rcSec.top += fPosY;
1617e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov                    rcSec.bottom += fPosY;
1618e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov                } else {
1619e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov                    fOldHeight = pSection->m_SecInfo.rcSection.bottom - pSection->m_SecInfo.rcSection.top;
1620e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov                    rcSec.top = fPosY;
1621e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov                    rcSec.bottom = fPosY + fOldHeight;
1622e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov                }
1623e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov                pSection->m_SecInfo.rcSection = rcSec;
1624e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov                pSection->ResetLinePlace();
1625e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov            }
1626e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov            if (s == 0) {
1627e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov                rcRet = rcSec;
1628e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov            } else {
1629e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov                rcRet.left = FPDF_MIN(rcSec.left, rcRet.left);
1630e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov                rcRet.top = FPDF_MIN(rcSec.top, rcRet.top);
1631e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov                rcRet.right = FPDF_MAX(rcSec.right, rcRet.right);
1632e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov                rcRet.bottom = FPDF_MAX(rcSec.bottom, rcRet.bottom);
1633e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov            }
1634e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov            fPosY += rcSec.Height();
1635e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov        }
1636e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov    }
1637e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov    return rcRet;
1638e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov}
1639e6986e1e8d4a57987f47c215490cb080a65ee29aSvet GanovFX_INT32 CPDF_VariableText::GetCharWidth(FX_INT32 nFontIndex, FX_WORD Word, FX_WORD SubWord, FX_INT32 nWordStyle)
1640e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov{
1641e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov    if (m_pVTProvider) {
1642e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov        if (SubWord > 0) {
1643e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov            return m_pVTProvider->GetCharWidth(nFontIndex, SubWord, nWordStyle);
1644e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov        } else {
1645e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov            return m_pVTProvider->GetCharWidth(nFontIndex, Word, nWordStyle);
1646e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov        }
1647e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov    }
1648e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov    return 0;
1649e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov}
1650e6986e1e8d4a57987f47c215490cb080a65ee29aSvet GanovFX_INT32 CPDF_VariableText::GetTypeAscent(FX_INT32 nFontIndex)
1651e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov{
1652e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov    return m_pVTProvider ? m_pVTProvider->GetTypeAscent(nFontIndex) : 0;
1653e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov}
1654e6986e1e8d4a57987f47c215490cb080a65ee29aSvet GanovFX_INT32 CPDF_VariableText::GetTypeDescent(FX_INT32 nFontIndex)
1655e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov{
1656e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov    return m_pVTProvider ? m_pVTProvider->GetTypeDescent(nFontIndex) : 0;
1657e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov}
1658e6986e1e8d4a57987f47c215490cb080a65ee29aSvet GanovFX_INT32 CPDF_VariableText::GetWordFontIndex(FX_WORD word, FX_INT32 charset, FX_INT32 nFontIndex)
1659e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov{
1660e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov    return m_pVTProvider ? m_pVTProvider->GetWordFontIndex(word, charset, nFontIndex) : -1;
1661e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov}
1662e6986e1e8d4a57987f47c215490cb080a65ee29aSvet GanovFX_INT32 CPDF_VariableText::GetDefaultFontIndex()
1663e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov{
1664e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov    return m_pVTProvider ? m_pVTProvider->GetDefaultFontIndex() : -1;
1665e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov}
1666e6986e1e8d4a57987f47c215490cb080a65ee29aSvet GanovFX_BOOL	CPDF_VariableText::IsLatinWord(FX_WORD word)
1667e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov{
1668e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov    return m_pVTProvider ? m_pVTProvider->IsLatinWord(word) : FALSE;
1669e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov}
1670e6986e1e8d4a57987f47c215490cb080a65ee29aSvet GanovIPDF_VariableText_Iterator * CPDF_VariableText::GetIterator()
1671e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov{
1672e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov    if (!m_pVTIterator) {
1673e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov        m_pVTIterator = new CPDF_VariableText_Iterator(this);
1674e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov    }
1675e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov    return m_pVTIterator;
1676e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov}
1677e6986e1e8d4a57987f47c215490cb080a65ee29aSvet GanovIPDF_VariableText_Provider*	CPDF_VariableText::SetProvider(IPDF_VariableText_Provider * pProvider)
1678e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov{
1679e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov    IPDF_VariableText_Provider* pOld = m_pVTProvider;
1680e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov    m_pVTProvider = pProvider;
1681e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov    return pOld;
1682e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov}
1683e6986e1e8d4a57987f47c215490cb080a65ee29aSvet GanovCPDF_VariableText_Iterator::CPDF_VariableText_Iterator(CPDF_VariableText * pVT):
1684e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov    m_CurPos(-1, -1, -1),
1685e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov    m_pVT(pVT)
1686e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov{
1687e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov}
1688e6986e1e8d4a57987f47c215490cb080a65ee29aSvet GanovCPDF_VariableText_Iterator::~CPDF_VariableText_Iterator()
1689e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov{
1690e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov}
1691e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganovvoid CPDF_VariableText_Iterator::SetAt(FX_INT32 nWordIndex)
1692e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov{
1693e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov    ASSERT(m_pVT != NULL);
1694e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov    m_CurPos = m_pVT->WordIndexToWordPlace(nWordIndex);
1695e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov}
1696e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganovvoid CPDF_VariableText_Iterator::SetAt(const CPVT_WordPlace & place)
1697e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov{
1698e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov    ASSERT(m_pVT != NULL);
1699e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov    m_CurPos = place;
1700e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov}
1701e6986e1e8d4a57987f47c215490cb080a65ee29aSvet GanovFX_BOOL	CPDF_VariableText_Iterator::NextWord()
1702e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov{
1703e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov    ASSERT(m_pVT != NULL);
1704e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov    if (m_CurPos == m_pVT->GetEndWordPlace()) {
1705e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov        return FALSE;
1706e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov    }
1707e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov    m_CurPos = m_pVT->GetNextWordPlace(m_CurPos);
1708e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov    return TRUE;
1709e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov}
1710e6986e1e8d4a57987f47c215490cb080a65ee29aSvet GanovFX_BOOL	CPDF_VariableText_Iterator::PrevWord()
1711e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov{
1712e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov    ASSERT(m_pVT != NULL);
1713e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov    if (m_CurPos == m_pVT->GetBeginWordPlace()) {
1714e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov        return FALSE;
1715e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov    }
1716e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov    m_CurPos = m_pVT->GetPrevWordPlace(m_CurPos);
1717e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov    return TRUE;
1718e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov}
1719e6986e1e8d4a57987f47c215490cb080a65ee29aSvet GanovFX_BOOL	CPDF_VariableText_Iterator::NextLine()
1720e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov{
1721e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov    ASSERT(m_pVT != NULL);
1722e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov    if (CSection * pSection = m_pVT->m_SectionArray.GetAt(m_CurPos.nSecIndex)) {
1723e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov        if (m_CurPos.nLineIndex < pSection->m_LineArray.GetSize() - 1) {
1724e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov            m_CurPos = CPVT_WordPlace(m_CurPos.nSecIndex, m_CurPos.nLineIndex + 1, -1);
1725e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov            return TRUE;
1726e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov        } else {
1727e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov            if (m_CurPos.nSecIndex < m_pVT->m_SectionArray.GetSize() - 1) {
1728e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov                m_CurPos = CPVT_WordPlace(m_CurPos.nSecIndex + 1, 0, -1);
1729e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov                return TRUE;
1730e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov            }
1731e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov        }
1732e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov    }
1733e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov    return FALSE;
1734e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov}
1735e6986e1e8d4a57987f47c215490cb080a65ee29aSvet GanovFX_BOOL	CPDF_VariableText_Iterator::PrevLine()
1736e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov{
1737e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov    ASSERT(m_pVT != NULL);
1738e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov    if (m_pVT->m_SectionArray.GetAt(m_CurPos.nSecIndex)) {
1739e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov        if (m_CurPos.nLineIndex > 0) {
1740e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov            m_CurPos = CPVT_WordPlace(m_CurPos.nSecIndex, m_CurPos.nLineIndex - 1, -1);
1741e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov            return TRUE;
1742e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov        } else {
1743e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov            if (m_CurPos.nSecIndex > 0) {
1744e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov                if (CSection * pLastSection = m_pVT->m_SectionArray.GetAt(m_CurPos.nSecIndex - 1)) {
1745e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov                    m_CurPos = CPVT_WordPlace(m_CurPos.nSecIndex - 1, pLastSection->m_LineArray.GetSize() - 1, -1);
1746e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov                    return TRUE;
1747e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov                }
1748e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov            }
1749e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov        }
1750e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov    }
1751e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov    return FALSE;
1752e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov}
1753e6986e1e8d4a57987f47c215490cb080a65ee29aSvet GanovFX_BOOL	CPDF_VariableText_Iterator::NextSection()
1754e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov{
1755e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov    ASSERT(m_pVT != NULL);
1756e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov    if (m_CurPos.nSecIndex < m_pVT->m_SectionArray.GetSize() - 1) {
1757e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov        m_CurPos = CPVT_WordPlace(m_CurPos.nSecIndex + 1, 0, -1);
1758e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov        return TRUE;
1759e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov    }
1760e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov    return FALSE;
1761e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov}
1762e6986e1e8d4a57987f47c215490cb080a65ee29aSvet GanovFX_BOOL	CPDF_VariableText_Iterator::PrevSection()
1763e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov{
1764e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov    ASSERT(m_pVT != NULL);
1765e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov    if (m_CurPos.nSecIndex > 0) {
1766e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov        m_CurPos = CPVT_WordPlace(m_CurPos.nSecIndex - 1, 0, -1);
1767e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov        return TRUE;
1768e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov    }
1769e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov    return FALSE;
1770e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov}
1771e6986e1e8d4a57987f47c215490cb080a65ee29aSvet GanovFX_BOOL	CPDF_VariableText_Iterator::GetWord(CPVT_Word & word) const
1772e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov{
1773e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov    ASSERT(m_pVT != NULL);
1774e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov    word.WordPlace = m_CurPos;
1775e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov    if (CSection * pSection = m_pVT->m_SectionArray.GetAt(m_CurPos.nSecIndex)) {
1776e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov        if (pSection->m_LineArray.GetAt(m_CurPos.nLineIndex)) {
1777e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov            if (CPVT_WordInfo * pWord = pSection->m_WordArray.GetAt(m_CurPos.nWordIndex)) {
1778e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov                word.Word = pWord->Word;
1779e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov                word.nCharset = pWord->nCharset;
1780e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov                word.fWidth = m_pVT->GetWordWidth(*pWord);
1781e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov                word.ptWord = m_pVT->InToOut(
1782e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov                                  CPDF_Point(pWord->fWordX + pSection->m_SecInfo.rcSection.left,
1783e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov                                             pWord->fWordY + pSection->m_SecInfo.rcSection.top) );
1784e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov                word.fAscent = m_pVT->GetWordAscent(*pWord);
1785e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov                word.fDescent = m_pVT->GetWordDescent(*pWord);
1786e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov                if (pWord->pWordProps) {
1787e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov                    word.WordProps = *pWord->pWordProps;
1788e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov                }
1789e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov                word.nFontIndex = m_pVT->GetWordFontIndex(*pWord);
1790e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov                word.fFontSize = m_pVT->GetWordFontSize(*pWord);
1791e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov                return TRUE;
1792e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov            }
1793e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov        }
1794e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov    }
1795e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov    return FALSE;
1796e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov}
1797e6986e1e8d4a57987f47c215490cb080a65ee29aSvet GanovFX_BOOL	CPDF_VariableText_Iterator::SetWord(const CPVT_Word & word)
1798e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov{
1799e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov    ASSERT(m_pVT != NULL);
1800e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov    if (CSection * pSection = m_pVT->m_SectionArray.GetAt(m_CurPos.nSecIndex)) {
1801e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov        if (CPVT_WordInfo * pWord = pSection->m_WordArray.GetAt(m_CurPos.nWordIndex)) {
1802e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov            if (pWord->pWordProps) {
1803e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov                *pWord->pWordProps = word.WordProps;
1804e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov            }
1805e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov            return TRUE;
1806e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov        }
1807e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov    }
1808e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov    return FALSE;
1809e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov}
1810e6986e1e8d4a57987f47c215490cb080a65ee29aSvet GanovFX_BOOL	CPDF_VariableText_Iterator::GetLine(CPVT_Line & line) const
1811e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov{
1812e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov    ASSERT(m_pVT != NULL);
1813e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov    line.lineplace = CPVT_WordPlace(m_CurPos.nSecIndex, m_CurPos.nLineIndex, -1);
1814e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov    if (CSection * pSection = m_pVT->m_SectionArray.GetAt(m_CurPos.nSecIndex)) {
1815e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov        if (CLine * pLine = pSection->m_LineArray.GetAt(m_CurPos.nLineIndex)) {
1816e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov            line.ptLine = m_pVT->InToOut(
1817e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov                              CPDF_Point(pLine->m_LineInfo.fLineX + pSection->m_SecInfo.rcSection.left,
1818e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov                                         pLine->m_LineInfo.fLineY + pSection->m_SecInfo.rcSection.top) );
1819e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov            line.fLineWidth = pLine->m_LineInfo.fLineWidth;
1820e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov            line.fLineAscent = pLine->m_LineInfo.fLineAscent;
1821e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov            line.fLineDescent = pLine->m_LineInfo.fLineDescent;
1822e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov            line.lineEnd = pLine->GetEndWordPlace();
1823e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov            return TRUE;
1824e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov        }
1825e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov    }
1826e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov    return FALSE;
1827e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov}
1828e6986e1e8d4a57987f47c215490cb080a65ee29aSvet GanovFX_BOOL	CPDF_VariableText_Iterator::GetSection(CPVT_Section & section) const
1829e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov{
1830e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov    ASSERT(m_pVT != NULL);
1831e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov    section.secplace = CPVT_WordPlace(m_CurPos.nSecIndex, 0, -1);
1832e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov    if (CSection * pSection = m_pVT->m_SectionArray.GetAt(m_CurPos.nSecIndex)) {
1833e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov        section.rcSection = m_pVT->InToOut(pSection->m_SecInfo.rcSection);
1834e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov        if (pSection->m_SecInfo.pSecProps) {
1835e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov            section.SecProps = *pSection->m_SecInfo.pSecProps;
1836e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov        }
1837e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov        if (pSection->m_SecInfo.pWordProps) {
1838e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov            section.WordProps = *pSection->m_SecInfo.pWordProps;
1839e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov        }
1840e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov        return TRUE;
1841e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov    }
1842e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov    return FALSE;
1843e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov}
1844e6986e1e8d4a57987f47c215490cb080a65ee29aSvet GanovFX_BOOL	CPDF_VariableText_Iterator::SetSection(const CPVT_Section & section)
1845e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov{
1846e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov    ASSERT(m_pVT != NULL);
1847e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov    if (CSection * pSection = m_pVT->m_SectionArray.GetAt(m_CurPos.nSecIndex)) {
1848e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov        if (pSection->m_SecInfo.pSecProps) {
1849e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov            *pSection->m_SecInfo.pSecProps = section.SecProps;
1850e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov        }
1851e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov        if (pSection->m_SecInfo.pWordProps) {
1852e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov            *pSection->m_SecInfo.pWordProps = section.WordProps;
1853e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov        }
1854e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov        return TRUE;
1855e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov    }
1856e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov    return FALSE;
1857e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov}
1858