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#ifndef CORE_INCLUDE_FPDFDOC_FPDF_VT_H_
8e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov#define CORE_INCLUDE_FPDFDOC_FPDF_VT_H_
9e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov
10e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov#include "../fpdfapi/fpdf_parser.h"
11e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov#include "../fxcrt/fx_basic.h"
12e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov#include "../fxge/fx_dib.h"
13e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov
14e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganovclass IPDF_VariableText;
15e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganovclass IPDF_VariableText_Iterator;
16e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganovclass IPDF_VariableText_Provider;
17e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganovstruct CPVT_Line;
18e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganovstruct CPVT_Section;
19e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganovstruct CPVT_Word;
20e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganovstruct CPVT_WordPlace;
21e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganovstruct CPVT_WordRange;
22e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov
23e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganovstruct CPVT_WordPlace {
24e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov
25e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov    CPVT_WordPlace() : nSecIndex(-1), nLineIndex(-1), nWordIndex(-1)
26e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov    {
27e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov    }
28e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov
29e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov    CPVT_WordPlace(FX_INT32 nSecIndex, FX_INT32 nLineIndex, FX_INT32 nWordIndex)
30e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov    {
31e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov        this->nSecIndex = nSecIndex;
32e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov        this->nLineIndex = nLineIndex;
33e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov        this->nWordIndex = nWordIndex;
34e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov    }
35e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov
36e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov    void Default()
37e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov    {
38e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov        nSecIndex = nLineIndex = nWordIndex = -1;
39e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov    }
40e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov
41e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov    FX_BOOL operator == (const CPVT_WordPlace & wp) const
42e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov    {
43e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov        return wp.nSecIndex == this->nSecIndex && wp.nLineIndex == this->nLineIndex && wp.nWordIndex == this->nWordIndex;
44e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov    }
45e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov
46e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov    FX_BOOL operator != (const CPVT_WordPlace & wp) const
47e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov    {
48e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov        return wp.nSecIndex != this->nSecIndex || wp.nLineIndex != this->nLineIndex || wp.nWordIndex != this->nWordIndex;
49e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov    }
50e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov
51e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov    inline FX_INT32 WordCmp(const CPVT_WordPlace & wp) const
52e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov    {
53e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov        if (this->nSecIndex > wp.nSecIndex) {
54e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov            return 1;
55e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov        }
56e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov        if (this->nSecIndex < wp.nSecIndex) {
57e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov            return -1;
58e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov        }
59e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov        if (this->nLineIndex > wp.nLineIndex) {
60e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov            return 1;
61e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov        }
62e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov        if (this->nLineIndex < wp.nLineIndex) {
63e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov            return -1;
64e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov        }
65e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov        if (this->nWordIndex > wp.nWordIndex) {
66e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov            return 1;
67e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov        }
68e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov        if (this->nWordIndex < wp.nWordIndex) {
69e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov            return -1;
70e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov        }
71e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov        return 0;
72e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov    }
73e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov
74e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov    inline FX_INT32 LineCmp(const CPVT_WordPlace & wp) const
75e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov    {
76e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov        if (this->nSecIndex > wp.nSecIndex) {
77e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov            return 1;
78e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov        }
79e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov        if (this->nSecIndex < wp.nSecIndex) {
80e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov            return -1;
81e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov        }
82e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov        if (this->nLineIndex > wp.nLineIndex) {
83e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov            return 1;
84e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov        }
85e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov        if (this->nLineIndex < wp.nLineIndex) {
86e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov            return -1;
87e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov        }
88e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov        return 0;
89e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov    }
90e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov
91e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov    inline FX_INT32 SecCmp(const CPVT_WordPlace & wp) const
92e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov    {
93e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov        if (this->nSecIndex > wp.nSecIndex) {
94e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov            return 1;
95e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov        }
96e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov        if (this->nSecIndex < wp.nSecIndex) {
97e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov            return -1;
98e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov        }
99e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov        return 0;
100e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov    }
101e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov
102e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov    FX_INT32							nSecIndex;
103e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov
104e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov    FX_INT32							nLineIndex;
105e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov
106e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov    FX_INT32							nWordIndex;
107e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov};
108e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganovstruct CPVT_WordRange {
109e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov
110e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov    CPVT_WordRange()
111e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov    {
112e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov    }
113e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov
114e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov    CPVT_WordRange(const CPVT_WordPlace & begin, const CPVT_WordPlace & end)
115e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov    {
116e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov        Set(begin, end);
117e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov    }
118e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov
119e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov    void Default()
120e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov    {
121e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov        BeginPos.Default();
122e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov        EndPos.Default();
123e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov    }
124e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov
125e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov    void Set(const CPVT_WordPlace & begin, const CPVT_WordPlace & end)
126e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov    {
127e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov        this->BeginPos = begin;
128e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov        this->EndPos = end;
129e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov        SwapWordPlace();
130e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov    }
131e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov
132e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov    void SetBeginPos(const CPVT_WordPlace & begin)
133e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov    {
134e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov        this->BeginPos = begin;
135e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov        SwapWordPlace();
136e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov    }
137e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov
138e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov    void SetEndPos(const CPVT_WordPlace & end)
139e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov    {
140e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov        this->EndPos = end;
141e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov        SwapWordPlace();
142e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov    }
143e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov
144e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov    FX_BOOL IsExist() const
145e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov    {
146e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov        return this->BeginPos != this->EndPos;
147e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov    }
148e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov
149e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov    FX_BOOL operator != (const CPVT_WordRange & wr) const
150e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov    {
151e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov        return wr.BeginPos != this->BeginPos || wr.EndPos != this->EndPos;
152e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov    }
153e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov
154e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov    void SwapWordPlace()
155e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov    {
156e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov        if (BeginPos.WordCmp(EndPos) > 0) {
157e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov            CPVT_WordPlace place = EndPos;
158e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov            EndPos = BeginPos;
159e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov            BeginPos = place;
160e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov        }
161e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov    }
162e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov
163e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov    CPVT_WordPlace BeginPos;
164e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov
165e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov    CPVT_WordPlace EndPos;
166e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov};
167e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganovstruct CPVT_SecProps  {
168e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov
169e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov    CPVT_SecProps() : fLineLeading(0.0f), fLineIndent(0.0f), nAlignment(0)
170e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov    {
171e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov    }
172e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov
173e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov    CPVT_SecProps(FX_FLOAT lineLeading, FX_FLOAT lineIndent, FX_INT32 alignment) :
174e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov        fLineLeading(lineLeading), fLineIndent(lineIndent), nAlignment(alignment)
175e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov    {
176e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov    }
177e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov
178e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov    CPVT_SecProps(const CPVT_SecProps & other) :
179e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov        fLineLeading(other.fLineLeading), fLineIndent(other.fLineIndent), nAlignment(other.nAlignment)
180e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov    {
181e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov    }
182e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov
183e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov    FX_FLOAT			fLineLeading;
184e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov
185e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov    FX_FLOAT			fLineIndent;
186e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov
187e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov    FX_INT32			nAlignment;
188e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov};
189e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganovstruct CPVT_WordProps  {
190e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov
191e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov    CPVT_WordProps() : nFontIndex(-1), fFontSize(0.0f), dwWordColor(0), nScriptType(0), nWordStyle(0),
192e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov        fCharSpace(0.0f), nHorzScale(0)
193e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov    {
194e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov    }
195e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov
196e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov    CPVT_WordProps(FX_INT32	fontIndex, FX_FLOAT fontSize, FX_COLORREF wordColor = 0, FX_INT32 scriptType = 0, FX_INT32 wordStyle = 0,
197e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov                   FX_FLOAT charSpace = 0, FX_INT32 horzScale = 100) :
198e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov        nFontIndex(fontIndex), fFontSize(fontSize), dwWordColor(wordColor), nScriptType(scriptType),
199e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov        nWordStyle(wordStyle), fCharSpace(charSpace), nHorzScale(horzScale)
200e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov    {
201e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov    }
202e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov
203e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov    CPVT_WordProps(const CPVT_WordProps & other) :
204e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov        nFontIndex(other.nFontIndex), fFontSize(other.fFontSize), dwWordColor(other.dwWordColor),
205e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov        nScriptType(other.nScriptType), nWordStyle(other.nWordStyle), fCharSpace(other.fCharSpace),
206e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov        nHorzScale(other.nHorzScale)
207e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov    {
208e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov    }
209e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov
210e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov    FX_INT32					nFontIndex;
211e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov
212e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov    FX_FLOAT					fFontSize;
213e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov
214e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov    FX_COLORREF					dwWordColor;
215e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov
216e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov    FX_INT32					nScriptType;
217e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov
218e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov    FX_INT32					nWordStyle;
219e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov
220e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov    FX_FLOAT					fCharSpace;
221e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov
222e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov    FX_INT32					nHorzScale;
223e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov};
224e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganovstruct CPVT_Word {
225e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov
226e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov    CPVT_Word() : Word(0), nCharset(0), ptWord(0, 0), fAscent(0.0f), fDescent(0.0f), fWidth(0.0f),
227e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov        fFontSize(0), WordProps()
228e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov    {
229e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov    }
230e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov
231e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov    FX_WORD						Word;
232e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov
233e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov    FX_INT32					nCharset;
234e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov
235e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov    CPVT_WordPlace				WordPlace;
236e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov
237e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov    CPDF_Point					ptWord;
238e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov
239e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov    FX_FLOAT					fAscent;
240e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov
241e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov    FX_FLOAT					fDescent;
242e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov
243e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov    FX_FLOAT					fWidth;
244e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov
245e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov    FX_INT32					nFontIndex;
246e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov
247e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov    FX_FLOAT					fFontSize;
248e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov
249e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov    CPVT_WordProps				WordProps;
250e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov};
251e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganovstruct CPVT_Line {
252e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov
253e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov    CPVT_Line() : ptLine(0, 0), fLineWidth(0.0f), fLineAscent(0.0f), fLineDescent(0.0f)
254e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov    {
255e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov    }
256e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov
257e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov    CPVT_WordPlace				lineplace;
258e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov
259e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov    CPVT_WordPlace				lineEnd;
260e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov
261e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov    CPDF_Point					ptLine;
262e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov
263e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov    FX_FLOAT					fLineWidth;
264e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov
265e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov    FX_FLOAT					fLineAscent;
266e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov
267e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov    FX_FLOAT					fLineDescent;
268e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov};
269e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganovstruct CPVT_Section {
270e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov
271e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov    CPVT_WordPlace				secplace;
272e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov
273e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov    CPDF_Rect					rcSection;
274e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov
275e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov    CPVT_SecProps				SecProps;
276e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov
277e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov    CPVT_WordProps				WordProps;
278e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov};
279e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganovclass IPDF_VariableText_Provider
280e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov{
281e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganovpublic:
282e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov    virtual ~IPDF_VariableText_Provider() { }
283e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov
284e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov    virtual FX_INT32						GetCharWidth(FX_INT32 nFontIndex, FX_WORD word, FX_INT32 nWordStyle) = 0;
285e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov
286e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov    virtual FX_INT32						GetTypeAscent(FX_INT32 nFontIndex) = 0;
287e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov
288e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov    virtual FX_INT32						GetTypeDescent(FX_INT32 nFontIndex) = 0;
289e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov
290e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov    virtual FX_INT32						GetWordFontIndex(FX_WORD word, FX_INT32 charset, FX_INT32 nFontIndex) = 0;
291e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov
292e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov    virtual FX_BOOL							IsLatinWord(FX_WORD word) = 0;
293e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov
294e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov    virtual FX_INT32						GetDefaultFontIndex() = 0;
295e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov};
296e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganovclass IPDF_VariableText_Iterator
297e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov{
298e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganovpublic:
299e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov    virtual ~IPDF_VariableText_Iterator() { }
300e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov
301e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov    virtual FX_BOOL							NextWord() = 0;
302e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov
303e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov    virtual FX_BOOL							PrevWord() = 0;
304e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov
305e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov    virtual FX_BOOL							NextLine() = 0;
306e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov
307e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov    virtual FX_BOOL							PrevLine() = 0;
308e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov
309e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov    virtual FX_BOOL							NextSection() = 0;
310e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov
311e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov    virtual FX_BOOL							PrevSection() = 0;
312e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov
313e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov    virtual FX_BOOL							GetWord(CPVT_Word & word) const = 0;
314e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov
315e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov    virtual FX_BOOL							SetWord(const CPVT_Word & word) = 0;
316e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov
317e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov    virtual FX_BOOL							GetLine(CPVT_Line & line) const = 0;
318e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov
319e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov    virtual FX_BOOL							GetSection(CPVT_Section & section) const = 0;
320e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov
321e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov    virtual	FX_BOOL							SetSection(const CPVT_Section & section) = 0;
322e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov
323e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov    virtual void							SetAt(FX_INT32 nWordIndex) = 0;
324e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov
325e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov    virtual void							SetAt(const CPVT_WordPlace & place) = 0;
326e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov
327e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov    virtual const CPVT_WordPlace &			GetAt() const = 0;
328e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov};
329e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganovclass IPDF_VariableText
330e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov{
331e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganovpublic:
332e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov    static IPDF_VariableText*			NewVariableText();
333e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov
334e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov    static void							DelVariableText(IPDF_VariableText* pVT);
335e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov
336e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov    virtual IPDF_VariableText_Provider*		SetProvider(IPDF_VariableText_Provider * pProvider) = 0;
337e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov
338e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov    virtual IPDF_VariableText_Iterator*		GetIterator() = 0;
339e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov
340e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov    virtual void							SetPlateRect(const CPDF_Rect & rect) = 0;
341e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov
342e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov    virtual void							SetAlignment(FX_INT32 nFormat = 0) = 0;
343e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov
344e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov    virtual void							SetPasswordChar(FX_WORD wSubWord = '*') = 0;
345e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov
346e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov    virtual void							SetLimitChar(FX_INT32 nLimitChar = 0) = 0;
347e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov
348e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov    virtual void							SetCharArray(FX_INT32 nCharArray = 0) = 0;
349e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov
350e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov    virtual void							SetCharSpace(FX_FLOAT fCharSpace = 0.0f) = 0;
351e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov
352e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov    virtual void							SetHorzScale(FX_INT32 nHorzScale = 100) = 0;
353e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov
354e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov    virtual void							SetMultiLine(FX_BOOL bMultiLine = TRUE) = 0;
355e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov
356e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov    virtual void							SetAutoReturn(FX_BOOL bAuto = TRUE) = 0;
357e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov
358e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov    virtual void							SetAutoFontSize(FX_BOOL bAuto = TRUE) = 0;
359e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov
360e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov    virtual void							SetFontSize(FX_FLOAT fFontSize) = 0;
361e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov
362e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov    virtual void							SetLineLeading(FX_FLOAT fLineLeading) = 0;
363e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov
364e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov    virtual void							SetRichText(FX_BOOL bRichText) = 0;
365e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov
366e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov    virtual void							Initialize() = 0;
367e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov
368e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov    virtual FX_BOOL							IsValid() const = 0;
369e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov
370e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov    virtual FX_BOOL							IsRichText() const = 0;
371e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov
372e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov    virtual void							RearrangeAll() = 0;
373e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov
374e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov    virtual void							RearrangePart(const CPVT_WordRange & PlaceRange) = 0;
375e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov
376e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov    virtual void							ResetAll() = 0;
377e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov
378e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov    virtual void							SetText(FX_LPCWSTR text, FX_INT32 charset = 1, const CPVT_SecProps * pSecProps = NULL,
379e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov            const CPVT_WordProps * pWordProps = NULL) = 0;
380e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov
381e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov    virtual CPVT_WordPlace					InsertWord(const CPVT_WordPlace & place, FX_WORD word, FX_INT32 charset = 1,
382e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov            const CPVT_WordProps * pWordProps = NULL) = 0;
383e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov
384e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov    virtual CPVT_WordPlace					InsertSection(const CPVT_WordPlace & place, const CPVT_SecProps * pSecProps = NULL,
385e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov            const CPVT_WordProps * pWordProps = NULL) = 0;
386e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov
387e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov    virtual CPVT_WordPlace					InsertText(const CPVT_WordPlace & place, FX_LPCWSTR text, FX_INT32 charset = 1,
388e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov            const CPVT_SecProps * pSecProps = NULL,	const CPVT_WordProps * pWordProps = NULL) = 0;
389e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov
390e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov    virtual CPVT_WordPlace					DeleteWords(const CPVT_WordRange & PlaceRange) = 0;
391e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov
392e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov    virtual CPVT_WordPlace					DeleteWord(const CPVT_WordPlace & place) = 0;
393e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov
394e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov    virtual CPVT_WordPlace					BackSpaceWord(const CPVT_WordPlace & place) = 0;
395e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov
396e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov    virtual const CPDF_Rect &				GetPlateRect() const = 0;
397e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov
398e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov    virtual CPDF_Rect						GetContentRect() const = 0;
399e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov
400e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov    virtual FX_INT32						GetTotalWords() const = 0;
401e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov
402e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov    virtual FX_FLOAT						GetFontSize() const = 0;
403e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov
404e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov    virtual FX_INT32						GetAlignment() const = 0;
405e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov
406e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov    virtual FX_WORD							GetPasswordChar() const = 0;
407e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov
408e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov    virtual FX_INT32						GetCharArray() const = 0;
409e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov
410e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov    virtual FX_INT32						GetLimitChar() const = 0;
411e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov
412e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov    virtual FX_BOOL							IsMultiLine() const = 0;
413e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov
414e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov    virtual FX_INT32						GetHorzScale() const = 0;
415e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov
416e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov    virtual FX_FLOAT						GetCharSpace() const = 0;
417e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov
418e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov    virtual CPVT_WordPlace					GetBeginWordPlace() const = 0;
419e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov
420e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov    virtual CPVT_WordPlace					GetEndWordPlace() const = 0;
421e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov
422e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov    virtual CPVT_WordPlace					GetPrevWordPlace(const CPVT_WordPlace & place) const = 0;
423e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov
424e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov    virtual CPVT_WordPlace					GetNextWordPlace(const CPVT_WordPlace & place) const = 0;
425e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov
426e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov    virtual CPVT_WordPlace					SearchWordPlace(const CPDF_Point & point) const = 0;
427e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov
428e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov    virtual CPVT_WordPlace					GetUpWordPlace(const CPVT_WordPlace & place, const CPDF_Point & point) const = 0;
429e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov
430e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov    virtual CPVT_WordPlace					GetDownWordPlace(const CPVT_WordPlace & place, const CPDF_Point & point) const = 0;
431e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov
432e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov    virtual CPVT_WordPlace					GetLineBeginPlace(const CPVT_WordPlace & place) const = 0;
433e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov
434e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov    virtual CPVT_WordPlace					GetLineEndPlace(const CPVT_WordPlace & place) const = 0;
435e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov
436e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov    virtual CPVT_WordPlace					GetSectionBeginPlace(const CPVT_WordPlace & place) const = 0;
437e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov
438e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov    virtual CPVT_WordPlace					GetSectionEndPlace(const CPVT_WordPlace & place) const = 0;
439e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov
440e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov    virtual void							UpdateWordPlace(CPVT_WordPlace & place) const = 0;
441e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov
442e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov    virtual CPVT_WordPlace					AjustLineHeader(const CPVT_WordPlace & place, FX_BOOL bPrevOrNext) const = 0;
443e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov
444e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov    virtual FX_INT32						WordPlaceToWordIndex(const CPVT_WordPlace & place) const = 0;
445e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov
446e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov    virtual CPVT_WordPlace					WordIndexToWordPlace(FX_INT32 index) const = 0;
447e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov
448e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganovprotected:
449e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov    ~IPDF_VariableText() { }
450e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov};
451e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov
452e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov#endif  // CORE_INCLUDE_FPDFDOC_FPDF_VT_H_
453