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