Fix warnings in android build, fix font rendering issue, fix issue 357588: wrong...
[pdfium.git] / core / src / fpdfdoc / pdf_vt.h
1 // Copyright 2014 PDFium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file.
4  
5 // Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
6
7 #define _PDF_VT_H_
8 class CPVT_Size;
9 class CPVT_FloatRect;
10 struct CPVT_SectionInfo;
11 struct CPVT_LineInfo;
12 struct CPVT_WordInfo;
13 class CLine;
14 class CLines;
15 class CSection;
16 class CTypeset;
17 class CPDF_EditContainer;
18 class CPDF_VariableText;
19 class CPDF_VariableText_Iterator;
20 #define IsFloatZero(f)                                          ((f) < 0.0001 && (f) > -0.0001)
21 #define IsFloatBigger(fa,fb)                            ((fa) > (fb) && !IsFloatZero((fa) - (fb)))
22 #define IsFloatSmaller(fa,fb)                           ((fa) < (fb) && !IsFloatZero((fa) - (fb)))
23 template<class T> T FPDF_MIN (const T & i, const T & j)
24 {
25     return ((i < j) ? i : j);
26 }
27 template<class T> T FPDF_MAX (const T & i, const T & j)
28 {
29     return ((i > j) ? i : j);
30 }
31 class CPVT_Size
32 {
33 public:
34     CPVT_Size() : x(0.0f), y(0.0f)
35     {
36     }
37     CPVT_Size(FX_FLOAT x, FX_FLOAT y)
38     {
39         this->x = x;
40         this->y = y;
41     }
42     FX_FLOAT x, y;
43 };
44 class CPVT_FloatRect : public CFX_FloatRect
45 {
46 public:
47     CPVT_FloatRect()
48     {
49         left = top = right = bottom = 0.0f;
50     }
51     CPVT_FloatRect(FX_FLOAT left, FX_FLOAT top,
52                    FX_FLOAT right, FX_FLOAT bottom)
53     {
54         this->left = left;
55         this->top = top;
56         this->right = right;
57         this->bottom = bottom;
58     }
59     CPVT_FloatRect(const CPDF_Rect & rect)
60     {
61         this->left = rect.left;
62         this->top = rect.top;
63         this->right = rect.right;
64         this->bottom = rect.bottom;
65     }
66     void Default()
67     {
68         left = top = right = bottom = 0.0f;
69     }
70     FX_FLOAT Height() const
71     {
72         if(this->top > this->bottom) {
73             return this->top - this->bottom;
74         } else {
75             return this->bottom - this->top;
76         }
77     }
78 };
79 struct CPVT_SectionInfo {
80     CPVT_SectionInfo() : rcSection(), nTotalLine(0), pSecProps(NULL), pWordProps(NULL)
81     {
82     }
83     virtual ~CPVT_SectionInfo()
84     {
85         if (pSecProps) {
86             delete pSecProps;
87         }
88         if (pWordProps) {
89             delete pWordProps;
90         }
91     }
92     CPVT_SectionInfo(const CPVT_SectionInfo & other): rcSection(), nTotalLine(0), pSecProps(NULL), pWordProps(NULL)
93     {
94         operator = (other);
95     }
96     void operator = (const CPVT_SectionInfo & other)
97     {
98         if (this == &other) {
99             return;
100         }
101         this->rcSection = other.rcSection;
102         this->nTotalLine = other.nTotalLine;
103         if (other.pSecProps) {
104             if (pSecProps) {
105                 *pSecProps = *other.pSecProps;
106             } else {
107                 pSecProps = FX_NEW CPVT_SecProps(*other.pSecProps);
108             }
109         }
110         if (other.pWordProps) {
111             if (pWordProps) {
112                 *pWordProps = *other.pWordProps;
113             } else {
114                 pWordProps = FX_NEW CPVT_WordProps(*other.pWordProps);
115             }
116         }
117     }
118     CPVT_FloatRect                              rcSection;
119     FX_INT32                                    nTotalLine;
120     CPVT_SecProps*                              pSecProps;
121     CPVT_WordProps*                             pWordProps;
122 };
123 struct CPVT_LineInfo {
124     CPVT_LineInfo() : nTotalWord(0), nBeginWordIndex(-1), nEndWordIndex(-1),
125         fLineX(0.0f), fLineY(0.0f), fLineWidth(0.0f), fLineAscent(0.0f), fLineDescent(0.0f)
126     {
127     }
128     FX_INT32                                    nTotalWord;
129     FX_INT32                                    nBeginWordIndex;
130     FX_INT32                                    nEndWordIndex;
131     FX_FLOAT                                    fLineX;
132     FX_FLOAT                                    fLineY;
133     FX_FLOAT                                    fLineWidth;
134     FX_FLOAT                                    fLineAscent;
135     FX_FLOAT                                    fLineDescent;
136 };
137 struct CPVT_WordInfo : public CFX_Object {
138     CPVT_WordInfo() : Word(0), nCharset(0),
139         fWordX(0.0f), fWordY(0.0f), fWordTail(0.0f), nFontIndex(-1), pWordProps(NULL)
140     {
141     }
142     CPVT_WordInfo(FX_WORD word, FX_INT32 charset, FX_INT32 fontIndex, CPVT_WordProps * pProps):
143         Word(word), nCharset(charset), fWordX(0.0f), fWordY(0.0f), fWordTail(0.0f),
144         nFontIndex(fontIndex), pWordProps(pProps)
145     {
146     }
147     virtual ~CPVT_WordInfo()
148     {
149         if (pWordProps) {
150             delete pWordProps;
151         }
152     }
153     CPVT_WordInfo(const CPVT_WordInfo & word): Word(0), nCharset(0),
154         fWordX(0.0f), fWordY(0.0f), fWordTail(0.0f), nFontIndex(-1), pWordProps(NULL)
155     {
156         operator = (word);
157     }
158     void operator = (const CPVT_WordInfo & word)
159     {
160         if (this == &word) {
161             return;
162         }
163         this->Word = word.Word;
164         this->nCharset = word.nCharset;
165         this->nFontIndex = word.nFontIndex;
166         if (word.pWordProps) {
167             if (pWordProps) {
168                 *pWordProps = *word.pWordProps;
169             } else {
170                 pWordProps = FX_NEW CPVT_WordProps(*word.pWordProps);
171             }
172         }
173     }
174     FX_WORD                                             Word;
175     FX_INT32                                    nCharset;
176     FX_FLOAT                                    fWordX;
177     FX_FLOAT                                    fWordY;
178     FX_FLOAT                                    fWordTail;
179     FX_INT32                                    nFontIndex;
180     CPVT_WordProps*                             pWordProps;
181 };
182 struct CPVT_FloatRange {
183     CPVT_FloatRange() : fMin(0.0f), fMax(0.0f)
184     {
185     }
186     CPVT_FloatRange(FX_FLOAT min, FX_FLOAT max) : fMin(min), fMax(max)
187     {
188     }
189     FX_FLOAT Range() const
190     {
191         return fMax - fMin;
192     }
193     FX_FLOAT fMin, fMax;
194 };
195 template<class TYPE> class CPVT_ArrayTemplate : public CFX_ArrayTemplate<TYPE>
196 {
197 public:
198     FX_BOOL IsEmpty()
199     {
200         return CFX_ArrayTemplate<TYPE>::GetSize() <= 0;
201     }
202     TYPE GetAt(int nIndex) const
203     {
204         if (nIndex >= 0 && nIndex < CFX_ArrayTemplate<TYPE>::GetSize()) {
205             return CFX_ArrayTemplate<TYPE>::GetAt(nIndex);
206         }
207         return NULL;
208     }
209     void RemoveAt(int nIndex)
210     {
211         if (nIndex >= 0 && nIndex < CFX_ArrayTemplate<TYPE>::GetSize()) {
212             CFX_ArrayTemplate<TYPE>::RemoveAt(nIndex);
213         }
214     }
215 };
216 class CLine : public CFX_Object
217 {
218 public:
219     CLine();
220     virtual ~CLine();
221     CPVT_WordPlace                                                      GetBeginWordPlace() const;
222     CPVT_WordPlace                                                      GetEndWordPlace() const;
223     CPVT_WordPlace                                                      GetPrevWordPlace(const CPVT_WordPlace & place) const;
224     CPVT_WordPlace                                                      GetNextWordPlace(const CPVT_WordPlace & place) const;
225     CPVT_WordPlace                                                      LinePlace;
226     CPVT_LineInfo                                                       m_LineInfo;
227 };
228 class CLines
229 {
230 public:
231     CLines() : m_nTotal(0) {}
232     virtual ~CLines()
233     {
234         RemoveAll();
235     }
236     FX_INT32                                                            GetSize() const
237     {
238         return m_Lines.GetSize();
239     }
240     CLine *                                                                     GetAt(FX_INT32 nIndex) const
241     {
242         return m_Lines.GetAt(nIndex);
243     }
244     void                                                                        Empty()
245     {
246         m_nTotal = 0;
247     }
248     void                                                                        RemoveAll()
249     {
250         for (FX_INT32 i = 0, sz = GetSize(); i < sz; i++) {
251             delete GetAt(i);
252         }
253         m_Lines.RemoveAll();
254         m_nTotal = 0;
255     }
256     FX_INT32                                                            Add(const CPVT_LineInfo & lineinfo)
257     {
258         if (m_nTotal >= GetSize()) {
259             if (CLine * pLine = FX_NEW CLine) {
260                 pLine->m_LineInfo = lineinfo;
261                 m_Lines.Add(pLine);
262                 return m_nTotal++;
263             }
264             return m_nTotal;
265         } else {
266             if (CLine * pLine = GetAt(m_nTotal)) {
267                 pLine->m_LineInfo = lineinfo;
268             }
269             return m_nTotal++;
270         }
271     }
272     void                                                                        Clear()
273     {
274         for (FX_INT32 i = GetSize() - 1; i >= m_nTotal; i--) {
275             delete GetAt(i);
276             m_Lines.RemoveAt(i);
277         }
278     }
279 private:
280     CPVT_ArrayTemplate<CLine*>                          m_Lines;
281     FX_INT32                                                            m_nTotal;
282 };
283 class CSection : public CFX_Object
284 {
285     friend class CTypeset;
286 public:
287     CSection(CPDF_VariableText * pVT);
288     virtual ~CSection();
289     void                                                                        ResetAll();
290     void                                                                        ResetLineArray();
291     void                                                                        ResetWordArray();
292     void                                                                        ResetLinePlace();
293     CPVT_WordPlace                                                      AddWord(const CPVT_WordPlace & place, const CPVT_WordInfo & wordinfo);
294     CPVT_WordPlace                                                      AddLine(const CPVT_LineInfo & lineinfo);
295     void                                                                        ClearWords(const CPVT_WordRange & PlaceRange);
296     void                                                                        ClearWord(const CPVT_WordPlace & place);
297     CPVT_FloatRect                                                      Rearrange();
298     CPVT_Size                                                           GetSectionSize(FX_FLOAT fFontSize);
299     CPVT_WordPlace                                                      GetBeginWordPlace() const;
300     CPVT_WordPlace                                                      GetEndWordPlace() const;
301     CPVT_WordPlace                                                      GetPrevWordPlace(const CPVT_WordPlace & place) const;
302     CPVT_WordPlace                                                      GetNextWordPlace(const CPVT_WordPlace & place) const;
303     void                                                                        UpdateWordPlace(CPVT_WordPlace & place) const;
304     CPVT_WordPlace                                                      SearchWordPlace(const CPDF_Point & point) const;
305     CPVT_WordPlace                                                      SearchWordPlace(FX_FLOAT fx, const CPVT_WordPlace & lineplace) const;
306     CPVT_WordPlace                                                      SearchWordPlace(FX_FLOAT fx, const CPVT_WordRange & range) const;
307 public:
308     CPVT_WordPlace                                                      SecPlace;
309     CPVT_SectionInfo                                            m_SecInfo;
310     CLines                                                                      m_LineArray;
311     CPVT_ArrayTemplate<CPVT_WordInfo*>          m_WordArray;
312 private:
313     void                                                                        ClearLeftWords(FX_INT32 nWordIndex);
314     void                                                                        ClearRightWords(FX_INT32 nWordIndex);
315     void                                                                        ClearMidWords(FX_INT32 nBeginIndex, FX_INT32 nEndIndex);
316
317     CPDF_VariableText                                           *m_pVT;
318 };
319 class CTypeset
320 {
321 public:
322     CTypeset(CSection * pSection);
323     virtual ~CTypeset();
324     CPVT_Size                                                           GetEditSize(FX_FLOAT fFontSize);
325     CPVT_FloatRect                                                      Typeset();
326     CPVT_FloatRect                                                      CharArray();
327 private:
328     void                                                                        SplitLines(FX_BOOL bTypeset, FX_FLOAT fFontSize);
329     void                                                                        OutputLines();
330
331     CPVT_FloatRect                                                      m_rcRet;
332     CPDF_VariableText                                           * m_pVT;
333     CSection                                                            * m_pSection;
334 };
335 class CPDF_EditContainer
336 {
337 public:
338     CPDF_EditContainer(): m_rcPlate(0, 0, 0, 0), m_rcContent(0, 0, 0, 0) {};
339     virtual ~CPDF_EditContainer() {};
340     virtual void                                                        SetPlateRect(const CPDF_Rect & rect)
341     {
342         m_rcPlate = rect;
343     };
344     virtual const CPDF_Rect &                           GetPlateRect() const
345     {
346         return m_rcPlate;
347     };
348     virtual void                                                        SetContentRect(const CPVT_FloatRect & rect)
349     {
350         m_rcContent = rect;
351     };
352     virtual CPDF_Rect                                           GetContentRect() const
353     {
354         return m_rcContent;
355     };
356     FX_FLOAT                                                            GetPlateWidth() const
357     {
358         return m_rcPlate.right - m_rcPlate.left;
359     };
360     FX_FLOAT                                                            GetPlateHeight() const
361     {
362         return m_rcPlate.top - m_rcPlate.bottom;
363     };
364     CPVT_Size                                                           GetPlateSize() const
365     {
366         return CPVT_Size(GetPlateWidth(), GetPlateHeight());
367     };
368     CPDF_Point                                                          GetBTPoint() const
369     {
370         return CPDF_Point(m_rcPlate.left, m_rcPlate.top);
371     };
372     CPDF_Point                                                          GetETPoint() const
373     {
374         return CPDF_Point(m_rcPlate.right, m_rcPlate.bottom);
375     };
376     inline CPDF_Point                                           InToOut(const CPDF_Point & point) const
377     {
378         return CPDF_Point(point.x + GetBTPoint().x, GetBTPoint().y - point.y);
379     };
380     inline CPDF_Point                                           OutToIn(const CPDF_Point & point) const
381     {
382         return CPDF_Point(point.x - GetBTPoint().x, GetBTPoint().y - point.y);
383     };
384     inline CPDF_Rect                                            InToOut(const CPVT_FloatRect & rect) const
385     {
386         CPDF_Point ptLeftTop = InToOut(CPDF_Point(rect.left, rect.top));
387         CPDF_Point ptRightBottom = InToOut(CPDF_Point(rect.right, rect.bottom));
388         return CPDF_Rect(ptLeftTop.x, ptRightBottom.y, ptRightBottom.x, ptLeftTop.y);
389     };
390     inline CPVT_FloatRect                                       OutToIn(const CPDF_Rect & rect) const
391     {
392         CPDF_Point ptLeftTop = OutToIn(CPDF_Point(rect.left, rect.top));
393         CPDF_Point ptRightBottom = OutToIn(CPDF_Point(rect.right, rect.bottom));
394         return CPVT_FloatRect(ptLeftTop.x, ptLeftTop.y, ptRightBottom.x, ptRightBottom.y);
395     };
396
397 private:
398     CPDF_Rect                                                           m_rcPlate;
399     CPVT_FloatRect                                                      m_rcContent;
400 };
401 class CPDF_VariableText : public IPDF_VariableText, public CFX_Object, private CPDF_EditContainer
402 {
403     friend class CTypeset;
404     friend class CSection;
405     friend class CPDF_VariableText_Iterator;
406 public:
407     CPDF_VariableText();
408     virtual ~CPDF_VariableText();
409     IPDF_VariableText_Provider*                         SetProvider(IPDF_VariableText_Provider * pProvider);
410     IPDF_VariableText_Iterator*                         GetIterator();
411     void                                                                        SetPlateRect(const CPDF_Rect & rect)
412     {
413         CPDF_EditContainer::SetPlateRect(rect);
414     }
415     void                                                                        SetAlignment(FX_INT32 nFormat = 0)
416     {
417         m_nAlignment = nFormat;
418     }
419     void                                                                        SetPasswordChar(FX_WORD wSubWord = '*')
420     {
421         m_wSubWord = wSubWord;
422     }
423     void                                                                        SetLimitChar(FX_INT32 nLimitChar = 0)
424     {
425         m_nLimitChar = nLimitChar;
426     }
427     void                                                                        SetCharSpace(FX_FLOAT fCharSpace = 0.0f)
428     {
429         m_fCharSpace = fCharSpace;
430     }
431     void                                                                        SetHorzScale(FX_INT32 nHorzScale = 100)
432     {
433         m_nHorzScale = nHorzScale;
434     }
435     void                                                                        SetMultiLine(FX_BOOL bMultiLine = TRUE)
436     {
437         m_bMultiLine = bMultiLine;
438     }
439     void                                                                        SetAutoReturn(FX_BOOL bAuto = TRUE)
440     {
441         m_bLimitWidth = bAuto;
442     }
443     void                                                                        SetFontSize(FX_FLOAT fFontSize)
444     {
445         m_fFontSize = fFontSize;
446     }
447     void                                                                        SetCharArray(FX_INT32 nCharArray = 0)
448     {
449         m_nCharArray = nCharArray;
450     }
451     void                                                                        SetAutoFontSize(FX_BOOL bAuto = TRUE)
452     {
453         m_bAutoFontSize = bAuto;
454     }
455     void                                                                        SetRichText(FX_BOOL bRichText)
456     {
457         m_bRichText = bRichText;
458     }
459     void                                                                        SetLineLeading(FX_FLOAT fLineLeading)
460     {
461         m_fLineLeading = fLineLeading;
462     }
463     void                                                                        Initialize();
464     FX_BOOL                                                                     IsValid() const
465     {
466         return m_bInitial;
467     }
468     FX_BOOL                                                                     IsRichText() const
469     {
470         return m_bRichText;
471     }
472     void                                                                        RearrangeAll();
473     void                                                                        RearrangePart(const CPVT_WordRange & PlaceRange);
474     void                                                                        ResetAll();
475     void                                                                        SetText(FX_LPCWSTR text, FX_INT32 charset = 1, const CPVT_SecProps * pSecProps = NULL,
476             const CPVT_WordProps * pWordProps = NULL);
477     CPVT_WordPlace                                                      InsertWord(const CPVT_WordPlace & place, FX_WORD word, FX_INT32 charset = 1,
478             const CPVT_WordProps * pWordProps = NULL);
479     CPVT_WordPlace                                                      InsertSection(const CPVT_WordPlace & place, const CPVT_SecProps * pSecProps = NULL,
480             const CPVT_WordProps * pWordProps = NULL);
481     CPVT_WordPlace                                                      InsertText(const CPVT_WordPlace & place, FX_LPCWSTR text, FX_INT32 charset = 1,
482             const CPVT_SecProps * pSecProps = NULL,     const CPVT_WordProps * pWordProps = NULL);
483     CPVT_WordPlace                                                      DeleteWords(const CPVT_WordRange & PlaceRange);
484     CPVT_WordPlace                                                      DeleteWord(const CPVT_WordPlace & place);
485     CPVT_WordPlace                                                      BackSpaceWord(const CPVT_WordPlace & place);
486     const CPDF_Rect &                                           GetPlateRect() const
487     {
488         return CPDF_EditContainer::GetPlateRect();
489     }
490     CPDF_Rect                                                           GetContentRect() const;
491     FX_INT32                                                            GetTotalWords() const;
492     FX_FLOAT                                                            GetFontSize() const
493     {
494         return m_fFontSize;
495     }
496     FX_INT32                                                            GetAlignment() const
497     {
498         return m_nAlignment;
499     }
500     FX_INT32                                                            GetCharArray() const
501     {
502         return m_nCharArray;
503     }
504     FX_INT32                                                            GetLimitChar() const
505     {
506         return m_nLimitChar;
507     }
508     FX_BOOL                                                                     IsMultiLine() const
509     {
510         return m_bMultiLine;
511     }
512     FX_INT32                                                            GetHorzScale() const
513     {
514         return m_nHorzScale;
515     }
516     FX_FLOAT                                                            GetCharSpace() const
517     {
518         return m_fCharSpace;
519     }
520
521     inline CPVT_WordPlace                                       GetBeginWordPlace() const;
522     inline CPVT_WordPlace                                       GetEndWordPlace() const;
523     CPVT_WordPlace                                                      GetPrevWordPlace(const CPVT_WordPlace & place) const;
524     CPVT_WordPlace                                                      GetNextWordPlace(const CPVT_WordPlace & place) const;
525     CPVT_WordPlace                                                      SearchWordPlace(const CPDF_Point & point) const;
526     CPVT_WordPlace                                                      GetUpWordPlace(const CPVT_WordPlace & place, const CPDF_Point & point) const;
527     CPVT_WordPlace                                                      GetDownWordPlace(const CPVT_WordPlace & place, const CPDF_Point & point) const;
528     CPVT_WordPlace                                                      GetLineBeginPlace(const CPVT_WordPlace & place) const;
529     CPVT_WordPlace                                                      GetLineEndPlace(const CPVT_WordPlace & place) const;
530     CPVT_WordPlace                                                      GetSectionBeginPlace(const CPVT_WordPlace & place) const;
531     CPVT_WordPlace                                                      GetSectionEndPlace(const CPVT_WordPlace & place) const;
532     void                                                                        UpdateWordPlace(CPVT_WordPlace & place) const;
533     FX_INT32                                                            WordPlaceToWordIndex(const CPVT_WordPlace & place) const;
534     CPVT_WordPlace                                                      WordIndexToWordPlace(FX_INT32 index) const;
535     FX_WORD                                                                     GetPasswordChar() const
536     {
537         return GetSubWord();
538     }
539     FX_WORD                                                                     GetSubWord() const
540     {
541         return m_wSubWord;
542     }
543 private:
544     FX_INT32                                                            GetCharWidth(FX_INT32 nFontIndex, FX_WORD Word, FX_WORD SubWord, FX_INT32 nWordStyle);
545     FX_INT32                                                            GetTypeAscent(FX_INT32 nFontIndex);
546     FX_INT32                                                            GetTypeDescent(FX_INT32 nFontIndex);
547     FX_INT32                                                            GetWordFontIndex(FX_WORD word, FX_INT32 charset, FX_INT32 nFontIndex);
548     FX_INT32                                                            GetDefaultFontIndex();
549     FX_BOOL                                                                     IsLatinWord(FX_WORD word);
550 private:
551
552     CPVT_WordPlace                                                      AddSection(const CPVT_WordPlace & place, const CPVT_SectionInfo & secinfo);
553     CPVT_WordPlace                                                      AddLine(const CPVT_WordPlace & place, const CPVT_LineInfo & lineinfo);
554     CPVT_WordPlace                                                      AddWord(const CPVT_WordPlace & place, const CPVT_WordInfo & wordinfo);
555     FX_BOOL                                                                     GetWordInfo(const CPVT_WordPlace & place, CPVT_WordInfo & wordinfo);
556     FX_BOOL                                                                     SetWordInfo(const CPVT_WordPlace & place, const CPVT_WordInfo & wordinfo);
557     FX_BOOL                                                                     GetLineInfo(const CPVT_WordPlace & place, CPVT_LineInfo & lineinfo);
558     FX_BOOL                                                                     GetSectionInfo(const CPVT_WordPlace & place, CPVT_SectionInfo & secinfo);
559     FX_FLOAT                                                            GetWordFontSize(const CPVT_WordInfo & WordInfo, FX_BOOL bFactFontSize = FALSE);
560     FX_FLOAT                                                            GetWordWidth(FX_INT32 nFontIndex, FX_WORD Word, FX_WORD SubWord,
561             FX_FLOAT fCharSpace, FX_INT32 nHorzScale,
562             FX_FLOAT fFontSize, FX_FLOAT fWordTail, FX_INT32 nWordStyle);
563     FX_FLOAT                                                            GetWordWidth(const CPVT_WordInfo & WordInfo);
564     FX_FLOAT                                                            GetWordAscent(const CPVT_WordInfo & WordInfo, FX_FLOAT fFontSize);
565     FX_FLOAT                                                            GetWordDescent(const CPVT_WordInfo & WordInfo, FX_FLOAT fFontSize);
566     FX_FLOAT                                                            GetWordAscent(const CPVT_WordInfo & WordInfo, FX_BOOL bFactFontSize = FALSE);
567     FX_FLOAT                                                            GetWordDescent(const CPVT_WordInfo & WordInfo, FX_BOOL bFactFontSize = FALSE);
568     FX_FLOAT                                                            GetLineAscent(const CPVT_SectionInfo & SecInfo);
569     FX_FLOAT                                                            GetLineDescent(const CPVT_SectionInfo & SecInfo);
570     FX_FLOAT                                                            GetFontAscent(FX_INT32 nFontIndex, FX_FLOAT fFontSize);
571     FX_FLOAT                                                            GetFontDescent(FX_INT32 nFontIndex, FX_FLOAT fFontSize);
572     FX_INT32                                                            GetWordFontIndex(const CPVT_WordInfo & WordInfo);
573     FX_FLOAT                                                            GetCharSpace(const CPVT_WordInfo & WordInfo);
574     FX_INT32                                                            GetHorzScale(const CPVT_WordInfo & WordInfo);
575     FX_FLOAT                                                            GetLineLeading(const CPVT_SectionInfo & SecInfo);
576     FX_FLOAT                                                            GetLineIndent(const CPVT_SectionInfo & SecInfo);
577     FX_INT32                                                            GetAlignment(const CPVT_SectionInfo& SecInfo);
578
579     void                                                                        ClearSectionRightWords(const CPVT_WordPlace & place);
580     CPVT_WordPlace                                                      AjustLineHeader(const CPVT_WordPlace & place, FX_BOOL bPrevOrNext) const;
581     FX_BOOL                                                                     ClearEmptySection(const CPVT_WordPlace & place);
582     void                                                                        ClearEmptySections(const CPVT_WordRange & PlaceRange);
583     void                                                                        LinkLatterSection(const CPVT_WordPlace & place);
584     void                                                                        ClearWords(const CPVT_WordRange & PlaceRange);
585     CPVT_WordPlace                                                      ClearLeftWord(const CPVT_WordPlace & place);
586     CPVT_WordPlace                                                      ClearRightWord(const CPVT_WordPlace & place);
587 private:
588     CPVT_FloatRect                                                      Rearrange(const CPVT_WordRange & PlaceRange);
589     FX_FLOAT                                                            GetAutoFontSize();
590     FX_BOOL                                                                     IsBigger(FX_FLOAT fFontSize);
591     CPVT_FloatRect                                                      RearrangeSections(const CPVT_WordRange & PlaceRange);
592 private:
593     void                                                                        ResetSectionArray();
594 private:
595     CPVT_ArrayTemplate<CSection*>                       m_SectionArray;
596     FX_INT32                                                            m_nLimitChar;
597     FX_INT32                                                            m_nCharArray;
598     FX_BOOL                                                                     m_bMultiLine;
599     FX_BOOL                                                                     m_bLimitWidth;
600     FX_BOOL                                                                     m_bAutoFontSize;
601     FX_INT32                                                            m_nAlignment;
602     FX_FLOAT                                                            m_fLineLeading;
603     FX_FLOAT                                                            m_fCharSpace;
604     FX_INT32                                                            m_nHorzScale;
605     FX_WORD                                                                     m_wSubWord;
606     FX_FLOAT                                                            m_fWordSpace;
607     FX_FLOAT                                                            m_fFontSize;
608
609 private:
610     FX_BOOL                                                                     m_bInitial;
611     FX_BOOL                                                                     m_bRichText;
612     FX_FLOAT                                                            m_fCaretOriginX;
613     FX_INT32                                                            m_nCurFontIndex;
614     IPDF_VariableText_Provider *                        m_pVTProvider;
615     CPDF_VariableText_Iterator *                        m_pVTIterator;
616 };
617 class CPDF_VariableText_Iterator : public IPDF_VariableText_Iterator, public CFX_Object
618 {
619 public:
620     CPDF_VariableText_Iterator(CPDF_VariableText * pVT);
621     virtual ~CPDF_VariableText_Iterator();
622     FX_BOOL                                                                     NextWord();
623     FX_BOOL                                                                     PrevWord();
624     FX_BOOL                                                                     NextLine();
625     FX_BOOL                                                                     PrevLine();
626     FX_BOOL                                                                     NextSection();
627     FX_BOOL                                                                     PrevSection();
628     FX_BOOL                                                                     SetWord(const CPVT_Word & word);
629     FX_BOOL                                                                     GetWord(CPVT_Word & word) const;
630     FX_BOOL                                                                     GetLine(CPVT_Line & line) const;
631     FX_BOOL                                                                     GetSection(CPVT_Section & section) const;
632     FX_BOOL                                                                     SetSection(const CPVT_Section & section);
633     void                                                                        SetAt(FX_INT32 nWordIndex);
634     void                                                                        SetAt(const CPVT_WordPlace & place);
635     const CPVT_WordPlace &                                      GetAt() const
636     {
637         return m_CurPos;
638     };
639 private:
640     CPVT_WordPlace                                                      m_CurPos;
641     CPDF_VariableText *                                         m_pVT;
642 };