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