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