OLD | NEW |
| (Empty) |
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: | |
28 CPVT_Size() : x(0.0f), y(0.0f) {} | |
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: | |
37 CPVT_FloatRect() { left = top = right = bottom = 0.0f; } | |
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 } | |
47 explicit CPVT_FloatRect(const CFX_FloatRect& rect) { | |
48 left = rect.left; | |
49 top = rect.top; | |
50 right = rect.right; | |
51 bottom = rect.bottom; | |
52 } | |
53 void Default() { left = top = right = bottom = 0.0f; } | |
54 FX_FLOAT Height() const { | |
55 if (top > bottom) | |
56 return top - bottom; | |
57 return bottom - top; | |
58 } | |
59 }; | |
60 struct CPVT_SectionInfo { | |
61 CPVT_SectionInfo() | |
62 : rcSection(), nTotalLine(0), pSecProps(NULL), pWordProps(NULL) {} | |
63 virtual ~CPVT_SectionInfo() { | |
64 delete pSecProps; | |
65 delete pWordProps; | |
66 } | |
67 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 { | |
98 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 { | |
117 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) {} | |
125 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) {} | |
136 virtual ~CPVT_WordInfo() { delete pWordProps; } | |
137 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 { | |
171 CPVT_FloatRange() : fMin(0.0f), fMax(0.0f) {} | |
172 CPVT_FloatRange(FX_FLOAT min, FX_FLOAT max) : fMin(min), fMax(max) {} | |
173 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: | |
179 FX_BOOL IsEmpty() { return CFX_ArrayTemplate<TYPE>::GetSize() <= 0; } | |
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 } | |
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: | |
205 CLines() : m_nTotal(0) {} | |
206 virtual ~CLines() { RemoveAll(); } | |
207 int32_t GetSize() const { return m_Lines.GetSize(); } | |
208 CLine* GetAt(int32_t nIndex) const { return m_Lines.GetAt(nIndex); } | |
209 void Empty() { m_nTotal = 0; } | |
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 } | |
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 } | |
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 CFX_FloatPoint& 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: | |
297 CPDF_EditContainer() : m_rcPlate(0, 0, 0, 0), m_rcContent(0, 0, 0, 0) {} | |
298 virtual ~CPDF_EditContainer() {} | |
299 virtual void SetPlateRect(const CFX_FloatRect& rect) { m_rcPlate = rect; } | |
300 virtual const CFX_FloatRect& GetPlateRect() const { return m_rcPlate; } | |
301 virtual void SetContentRect(const CPVT_FloatRect& rect) { | |
302 m_rcContent = rect; | |
303 } | |
304 virtual CFX_FloatRect GetContentRect() const { return m_rcContent; } | |
305 FX_FLOAT GetPlateWidth() const { return m_rcPlate.right - m_rcPlate.left; } | |
306 FX_FLOAT GetPlateHeight() const { return m_rcPlate.top - m_rcPlate.bottom; } | |
307 CPVT_Size GetPlateSize() const { | |
308 return CPVT_Size(GetPlateWidth(), GetPlateHeight()); | |
309 } | |
310 CFX_FloatPoint GetBTPoint() const { | |
311 return CFX_FloatPoint(m_rcPlate.left, m_rcPlate.top); | |
312 } | |
313 CFX_FloatPoint GetETPoint() const { | |
314 return CFX_FloatPoint(m_rcPlate.right, m_rcPlate.bottom); | |
315 } | |
316 inline CFX_FloatPoint InToOut(const CFX_FloatPoint& point) const { | |
317 return CFX_FloatPoint(point.x + GetBTPoint().x, GetBTPoint().y - point.y); | |
318 } | |
319 inline CFX_FloatPoint OutToIn(const CFX_FloatPoint& point) const { | |
320 return CFX_FloatPoint(point.x - GetBTPoint().x, GetBTPoint().y - point.y); | |
321 } | |
322 inline CFX_FloatRect InToOut(const CPVT_FloatRect& rect) const { | |
323 CFX_FloatPoint ptLeftTop = InToOut(CFX_FloatPoint(rect.left, rect.top)); | |
324 CFX_FloatPoint ptRightBottom = | |
325 InToOut(CFX_FloatPoint(rect.right, rect.bottom)); | |
326 return CFX_FloatRect(ptLeftTop.x, ptRightBottom.y, ptRightBottom.x, | |
327 ptLeftTop.y); | |
328 } | |
329 inline CPVT_FloatRect OutToIn(const CFX_FloatRect& rect) const { | |
330 CFX_FloatPoint ptLeftTop = OutToIn(CFX_FloatPoint(rect.left, rect.top)); | |
331 CFX_FloatPoint ptRightBottom = | |
332 OutToIn(CFX_FloatPoint(rect.right, rect.bottom)); | |
333 return CPVT_FloatRect(ptLeftTop.x, ptLeftTop.y, ptRightBottom.x, | |
334 ptRightBottom.y); | |
335 } | |
336 | |
337 private: | |
338 CFX_FloatRect m_rcPlate; | |
339 CPVT_FloatRect m_rcContent; | |
340 }; | |
341 | |
342 class CPDF_VariableText : public IPDF_VariableText, private CPDF_EditContainer { | |
343 friend class CTypeset; | |
344 friend class CSection; | |
345 friend class CPDF_VariableText_Iterator; | |
346 | |
347 public: | |
348 CPDF_VariableText(); | |
349 ~CPDF_VariableText() override; | |
350 | |
351 // IPDF_VariableText | |
352 IPDF_VariableText_Provider* SetProvider( | |
353 IPDF_VariableText_Provider* pProvider) override; | |
354 IPDF_VariableText_Iterator* GetIterator() override; | |
355 void SetPlateRect(const CFX_FloatRect& rect) override { | |
356 CPDF_EditContainer::SetPlateRect(rect); | |
357 } | |
358 void SetAlignment(int32_t nFormat = 0) override { m_nAlignment = nFormat; } | |
359 void SetPasswordChar(FX_WORD wSubWord = '*') override { | |
360 m_wSubWord = wSubWord; | |
361 } | |
362 void SetLimitChar(int32_t nLimitChar = 0) override { | |
363 m_nLimitChar = nLimitChar; | |
364 } | |
365 void SetCharSpace(FX_FLOAT fCharSpace = 0.0f) override { | |
366 m_fCharSpace = fCharSpace; | |
367 } | |
368 void SetHorzScale(int32_t nHorzScale = 100) override { | |
369 m_nHorzScale = nHorzScale; | |
370 } | |
371 void SetMultiLine(FX_BOOL bMultiLine = TRUE) override { | |
372 m_bMultiLine = bMultiLine; | |
373 } | |
374 void SetAutoReturn(FX_BOOL bAuto = TRUE) override { m_bLimitWidth = bAuto; } | |
375 void SetFontSize(FX_FLOAT fFontSize) override { m_fFontSize = fFontSize; } | |
376 void SetCharArray(int32_t nCharArray = 0) override { | |
377 m_nCharArray = nCharArray; | |
378 } | |
379 void SetAutoFontSize(FX_BOOL bAuto = TRUE) override { | |
380 m_bAutoFontSize = bAuto; | |
381 } | |
382 void SetRichText(FX_BOOL bRichText) override { m_bRichText = bRichText; } | |
383 void SetLineLeading(FX_FLOAT fLineLeading) override { | |
384 m_fLineLeading = fLineLeading; | |
385 } | |
386 void Initialize() override; | |
387 FX_BOOL IsValid() const override { return m_bInitial; } | |
388 FX_BOOL IsRichText() const override { return m_bRichText; } | |
389 void RearrangeAll() override; | |
390 void RearrangePart(const CPVT_WordRange& PlaceRange) override; | |
391 void ResetAll() override; | |
392 void SetText(const FX_WCHAR* text, | |
393 int32_t charset = 1, | |
394 const CPVT_SecProps* pSecProps = NULL, | |
395 const CPVT_WordProps* pWordProps = NULL) override; | |
396 CPVT_WordPlace InsertWord(const CPVT_WordPlace& place, | |
397 FX_WORD word, | |
398 int32_t charset = 1, | |
399 const CPVT_WordProps* pWordProps = NULL) override; | |
400 CPVT_WordPlace InsertSection( | |
401 const CPVT_WordPlace& place, | |
402 const CPVT_SecProps* pSecProps = NULL, | |
403 const CPVT_WordProps* pWordProps = NULL) override; | |
404 CPVT_WordPlace InsertText(const CPVT_WordPlace& place, | |
405 const FX_WCHAR* text, | |
406 int32_t charset = 1, | |
407 const CPVT_SecProps* pSecProps = NULL, | |
408 const CPVT_WordProps* pWordProps = NULL) override; | |
409 CPVT_WordPlace DeleteWords(const CPVT_WordRange& PlaceRange) override; | |
410 CPVT_WordPlace DeleteWord(const CPVT_WordPlace& place) override; | |
411 CPVT_WordPlace BackSpaceWord(const CPVT_WordPlace& place) override; | |
412 const CFX_FloatRect& GetPlateRect() const override { | |
413 return CPDF_EditContainer::GetPlateRect(); | |
414 } | |
415 CFX_FloatRect GetContentRect() const override; | |
416 int32_t GetTotalWords() const override; | |
417 FX_FLOAT GetFontSize() const override { return m_fFontSize; } | |
418 int32_t GetAlignment() const override { return m_nAlignment; } | |
419 FX_WORD GetPasswordChar() const override { return GetSubWord(); } | |
420 int32_t GetCharArray() const override { return m_nCharArray; } | |
421 int32_t GetLimitChar() const override { return m_nLimitChar; } | |
422 FX_BOOL IsMultiLine() const override { return m_bMultiLine; } | |
423 int32_t GetHorzScale() const override { return m_nHorzScale; } | |
424 FX_FLOAT GetCharSpace() const override { return m_fCharSpace; } | |
425 CPVT_WordPlace GetBeginWordPlace() const override; | |
426 CPVT_WordPlace GetEndWordPlace() const override; | |
427 CPVT_WordPlace GetPrevWordPlace(const CPVT_WordPlace& place) const override; | |
428 CPVT_WordPlace GetNextWordPlace(const CPVT_WordPlace& place) const override; | |
429 CPVT_WordPlace SearchWordPlace(const CFX_FloatPoint& point) const override; | |
430 CPVT_WordPlace GetUpWordPlace(const CPVT_WordPlace& place, | |
431 const CFX_FloatPoint& point) const override; | |
432 CPVT_WordPlace GetDownWordPlace(const CPVT_WordPlace& place, | |
433 const CFX_FloatPoint& point) const override; | |
434 CPVT_WordPlace GetLineBeginPlace(const CPVT_WordPlace& place) const override; | |
435 CPVT_WordPlace GetLineEndPlace(const CPVT_WordPlace& place) const override; | |
436 CPVT_WordPlace GetSectionBeginPlace( | |
437 const CPVT_WordPlace& place) const override; | |
438 CPVT_WordPlace GetSectionEndPlace(const CPVT_WordPlace& place) const override; | |
439 void UpdateWordPlace(CPVT_WordPlace& place) const override; | |
440 CPVT_WordPlace AdjustLineHeader(const CPVT_WordPlace& place, | |
441 FX_BOOL bPrevOrNext) const override; | |
442 int32_t WordPlaceToWordIndex(const CPVT_WordPlace& place) const override; | |
443 CPVT_WordPlace WordIndexToWordPlace(int32_t index) const override; | |
444 | |
445 FX_WORD GetSubWord() const { return m_wSubWord; } | |
446 | |
447 private: | |
448 int32_t GetCharWidth(int32_t nFontIndex, | |
449 FX_WORD Word, | |
450 FX_WORD SubWord, | |
451 int32_t nWordStyle); | |
452 int32_t GetTypeAscent(int32_t nFontIndex); | |
453 int32_t GetTypeDescent(int32_t nFontIndex); | |
454 int32_t GetWordFontIndex(FX_WORD word, int32_t charset, int32_t nFontIndex); | |
455 int32_t GetDefaultFontIndex(); | |
456 FX_BOOL IsLatinWord(FX_WORD word); | |
457 | |
458 CPVT_WordPlace AddSection(const CPVT_WordPlace& place, | |
459 const CPVT_SectionInfo& secinfo); | |
460 CPVT_WordPlace AddLine(const CPVT_WordPlace& place, | |
461 const CPVT_LineInfo& lineinfo); | |
462 CPVT_WordPlace AddWord(const CPVT_WordPlace& place, | |
463 const CPVT_WordInfo& wordinfo); | |
464 FX_BOOL GetWordInfo(const CPVT_WordPlace& place, CPVT_WordInfo& wordinfo); | |
465 FX_BOOL SetWordInfo(const CPVT_WordPlace& place, | |
466 const CPVT_WordInfo& wordinfo); | |
467 FX_BOOL GetLineInfo(const CPVT_WordPlace& place, CPVT_LineInfo& lineinfo); | |
468 FX_BOOL GetSectionInfo(const CPVT_WordPlace& place, | |
469 CPVT_SectionInfo& secinfo); | |
470 FX_FLOAT GetWordFontSize(const CPVT_WordInfo& WordInfo, | |
471 FX_BOOL bFactFontSize = FALSE); | |
472 FX_FLOAT GetWordWidth(int32_t nFontIndex, | |
473 FX_WORD Word, | |
474 FX_WORD SubWord, | |
475 FX_FLOAT fCharSpace, | |
476 int32_t nHorzScale, | |
477 FX_FLOAT fFontSize, | |
478 FX_FLOAT fWordTail, | |
479 int32_t nWordStyle); | |
480 FX_FLOAT GetWordWidth(const CPVT_WordInfo& WordInfo); | |
481 FX_FLOAT GetWordAscent(const CPVT_WordInfo& WordInfo, FX_FLOAT fFontSize); | |
482 FX_FLOAT GetWordDescent(const CPVT_WordInfo& WordInfo, FX_FLOAT fFontSize); | |
483 FX_FLOAT GetWordAscent(const CPVT_WordInfo& WordInfo, | |
484 FX_BOOL bFactFontSize = FALSE); | |
485 FX_FLOAT GetWordDescent(const CPVT_WordInfo& WordInfo, | |
486 FX_BOOL bFactFontSize = FALSE); | |
487 FX_FLOAT GetLineAscent(const CPVT_SectionInfo& SecInfo); | |
488 FX_FLOAT GetLineDescent(const CPVT_SectionInfo& SecInfo); | |
489 FX_FLOAT GetFontAscent(int32_t nFontIndex, FX_FLOAT fFontSize); | |
490 FX_FLOAT GetFontDescent(int32_t nFontIndex, FX_FLOAT fFontSize); | |
491 int32_t GetWordFontIndex(const CPVT_WordInfo& WordInfo); | |
492 FX_FLOAT GetCharSpace(const CPVT_WordInfo& WordInfo); | |
493 int32_t GetHorzScale(const CPVT_WordInfo& WordInfo); | |
494 FX_FLOAT GetLineLeading(const CPVT_SectionInfo& SecInfo); | |
495 FX_FLOAT GetLineIndent(const CPVT_SectionInfo& SecInfo); | |
496 int32_t GetAlignment(const CPVT_SectionInfo& SecInfo); | |
497 | |
498 void ClearSectionRightWords(const CPVT_WordPlace& place); | |
499 | |
500 FX_BOOL ClearEmptySection(const CPVT_WordPlace& place); | |
501 void ClearEmptySections(const CPVT_WordRange& PlaceRange); | |
502 void LinkLatterSection(const CPVT_WordPlace& place); | |
503 void ClearWords(const CPVT_WordRange& PlaceRange); | |
504 CPVT_WordPlace ClearLeftWord(const CPVT_WordPlace& place); | |
505 CPVT_WordPlace ClearRightWord(const CPVT_WordPlace& place); | |
506 | |
507 private: | |
508 CPVT_FloatRect Rearrange(const CPVT_WordRange& PlaceRange); | |
509 FX_FLOAT GetAutoFontSize(); | |
510 FX_BOOL IsBigger(FX_FLOAT fFontSize); | |
511 CPVT_FloatRect RearrangeSections(const CPVT_WordRange& PlaceRange); | |
512 | |
513 void ResetSectionArray(); | |
514 | |
515 CPVT_ArrayTemplate<CSection*> m_SectionArray; | |
516 int32_t m_nLimitChar; | |
517 int32_t m_nCharArray; | |
518 FX_BOOL m_bMultiLine; | |
519 FX_BOOL m_bLimitWidth; | |
520 FX_BOOL m_bAutoFontSize; | |
521 int32_t m_nAlignment; | |
522 FX_FLOAT m_fLineLeading; | |
523 FX_FLOAT m_fCharSpace; | |
524 int32_t m_nHorzScale; | |
525 FX_WORD m_wSubWord; | |
526 FX_FLOAT m_fFontSize; | |
527 | |
528 private: | |
529 FX_BOOL m_bInitial; | |
530 FX_BOOL m_bRichText; | |
531 IPDF_VariableText_Provider* m_pVTProvider; | |
532 CPDF_VariableText_Iterator* m_pVTIterator; | |
533 }; | |
534 | |
535 class CPDF_VariableText_Iterator : public IPDF_VariableText_Iterator { | |
536 public: | |
537 explicit CPDF_VariableText_Iterator(CPDF_VariableText* pVT); | |
538 ~CPDF_VariableText_Iterator() override; | |
539 | |
540 // IPDF_VariableText_Iterator | |
541 FX_BOOL NextWord() override; | |
542 FX_BOOL PrevWord() override; | |
543 FX_BOOL NextLine() override; | |
544 FX_BOOL PrevLine() override; | |
545 FX_BOOL NextSection() override; | |
546 FX_BOOL PrevSection() override; | |
547 FX_BOOL SetWord(const CPVT_Word& word) override; | |
548 FX_BOOL GetWord(CPVT_Word& word) const override; | |
549 FX_BOOL GetLine(CPVT_Line& line) const override; | |
550 FX_BOOL GetSection(CPVT_Section& section) const override; | |
551 FX_BOOL SetSection(const CPVT_Section& section) override; | |
552 void SetAt(int32_t nWordIndex) override; | |
553 void SetAt(const CPVT_WordPlace& place) override; | |
554 const CPVT_WordPlace& GetAt() const override { return m_CurPos; } | |
555 | |
556 private: | |
557 CPVT_WordPlace m_CurPos; | |
558 CPDF_VariableText* m_pVT; | |
559 }; | |
560 | |
561 #endif // CORE_SRC_FPDFDOC_PDF_VT_H_ | |
OLD | NEW |