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