• 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 _FPDF_VT_H_
8 #define _FPDF_VT_H_
9 #include "../fxcrt/fx_basic.h"
10 #include "../fpdfapi/fpdf_parser.h"
11 struct CPVT_WordPlace;
12 struct CPVT_WordRange;
13 struct CPVT_Word;
14 struct CPVT_Line;
15 struct CPVT_Section;
16 class IPDF_VariableText_Provider;
17 class IPDF_VariableText_Iterator;
18 class IPDF_VariableText;
19 struct CPVT_WordPlace {
20 
CPVT_WordPlaceCPVT_WordPlace21     CPVT_WordPlace() : nSecIndex(-1), nLineIndex(-1), nWordIndex(-1)
22     {
23     }
24 
CPVT_WordPlaceCPVT_WordPlace25     CPVT_WordPlace(FX_INT32 nSecIndex, FX_INT32 nLineIndex, FX_INT32 nWordIndex)
26     {
27         this->nSecIndex = nSecIndex;
28         this->nLineIndex = nLineIndex;
29         this->nWordIndex = nWordIndex;
30     }
31 
DefaultCPVT_WordPlace32     void Default()
33     {
34         nSecIndex = nLineIndex = nWordIndex = -1;
35     }
36 
37     FX_BOOL operator == (const CPVT_WordPlace & wp) const
38     {
39         return wp.nSecIndex == this->nSecIndex && wp.nLineIndex == this->nLineIndex && wp.nWordIndex == this->nWordIndex;
40     }
41 
42     FX_BOOL operator != (const CPVT_WordPlace & wp) const
43     {
44         return wp.nSecIndex != this->nSecIndex || wp.nLineIndex != this->nLineIndex || wp.nWordIndex != this->nWordIndex;
45     }
46 
WordCmpCPVT_WordPlace47     inline FX_INT32 WordCmp(const CPVT_WordPlace & wp) const
48     {
49         if (this->nSecIndex > wp.nSecIndex) {
50             return 1;
51         }
52         if (this->nSecIndex < wp.nSecIndex) {
53             return -1;
54         }
55         if (this->nLineIndex > wp.nLineIndex) {
56             return 1;
57         }
58         if (this->nLineIndex < wp.nLineIndex) {
59             return -1;
60         }
61         if (this->nWordIndex > wp.nWordIndex) {
62             return 1;
63         }
64         if (this->nWordIndex < wp.nWordIndex) {
65             return -1;
66         }
67         return 0;
68     }
69 
LineCmpCPVT_WordPlace70     inline FX_INT32 LineCmp(const CPVT_WordPlace & wp) const
71     {
72         if (this->nSecIndex > wp.nSecIndex) {
73             return 1;
74         }
75         if (this->nSecIndex < wp.nSecIndex) {
76             return -1;
77         }
78         if (this->nLineIndex > wp.nLineIndex) {
79             return 1;
80         }
81         if (this->nLineIndex < wp.nLineIndex) {
82             return -1;
83         }
84         return 0;
85     }
86 
SecCmpCPVT_WordPlace87     inline FX_INT32 SecCmp(const CPVT_WordPlace & wp) const
88     {
89         if (this->nSecIndex > wp.nSecIndex) {
90             return 1;
91         }
92         if (this->nSecIndex < wp.nSecIndex) {
93             return -1;
94         }
95         return 0;
96     }
97 
98     FX_INT32							nSecIndex;
99 
100     FX_INT32							nLineIndex;
101 
102     FX_INT32							nWordIndex;
103 };
104 struct CPVT_WordRange {
105 
CPVT_WordRangeCPVT_WordRange106     CPVT_WordRange()
107     {
108     }
109 
CPVT_WordRangeCPVT_WordRange110     CPVT_WordRange(const CPVT_WordPlace & begin, const CPVT_WordPlace & end)
111     {
112         Set(begin, end);
113     }
114 
DefaultCPVT_WordRange115     void Default()
116     {
117         BeginPos.Default();
118         EndPos.Default();
119     }
120 
SetCPVT_WordRange121     void Set(const CPVT_WordPlace & begin, const CPVT_WordPlace & end)
122     {
123         this->BeginPos = begin;
124         this->EndPos = end;
125         SwapWordPlace();
126     }
127 
SetBeginPosCPVT_WordRange128     void SetBeginPos(const CPVT_WordPlace & begin)
129     {
130         this->BeginPos = begin;
131         SwapWordPlace();
132     }
133 
SetEndPosCPVT_WordRange134     void SetEndPos(const CPVT_WordPlace & end)
135     {
136         this->EndPos = end;
137         SwapWordPlace();
138     }
139 
IsExistCPVT_WordRange140     FX_BOOL IsExist() const
141     {
142         return this->BeginPos != this->EndPos;
143     }
144 
145     FX_BOOL operator != (const CPVT_WordRange & wr) const
146     {
147         return wr.BeginPos != this->BeginPos || wr.EndPos != this->EndPos;
148     }
149 
SwapWordPlaceCPVT_WordRange150     void SwapWordPlace()
151     {
152         if (BeginPos.WordCmp(EndPos) > 0) {
153             CPVT_WordPlace place = EndPos;
154             EndPos = BeginPos;
155             BeginPos = place;
156         }
157     }
158 
159     CPVT_WordPlace BeginPos;
160 
161     CPVT_WordPlace EndPos;
162 };
163 struct CPVT_SecProps : public CFX_Object {
164 
CPVT_SecPropsCPVT_SecProps165     CPVT_SecProps() : fLineLeading(0.0f), fLineIndent(0.0f), nAlignment(0)
166     {
167     }
168 
CPVT_SecPropsCPVT_SecProps169     CPVT_SecProps(FX_FLOAT lineLeading, FX_FLOAT lineIndent, FX_INT32 alignment) :
170         fLineLeading(lineLeading), fLineIndent(lineIndent), nAlignment(alignment)
171     {
172     }
173 
CPVT_SecPropsCPVT_SecProps174     CPVT_SecProps(const CPVT_SecProps & other) :
175         fLineLeading(other.fLineLeading), fLineIndent(other.fLineIndent), nAlignment(other.nAlignment)
176     {
177     }
178 
179     FX_FLOAT			fLineLeading;
180 
181     FX_FLOAT			fLineIndent;
182 
183     FX_INT32			nAlignment;
184 };
185 struct CPVT_WordProps : public CFX_Object {
186 
CPVT_WordPropsCPVT_WordProps187     CPVT_WordProps() : nFontIndex(-1), fFontSize(0.0f), dwWordColor(0), nScriptType(0), nWordStyle(0),
188         fCharSpace(0.0f), nHorzScale(0)
189     {
190     }
191 
192     CPVT_WordProps(FX_INT32	fontIndex, FX_FLOAT fontSize, FX_COLORREF wordColor = 0, FX_INT32 scriptType = 0, FX_INT32 wordStyle = 0,
193                    FX_FLOAT charSpace = 0, FX_INT32 horzScale = 100) :
nFontIndexCPVT_WordProps194         nFontIndex(fontIndex), fFontSize(fontSize), dwWordColor(wordColor), nScriptType(scriptType),
195         nWordStyle(wordStyle), fCharSpace(charSpace), nHorzScale(horzScale)
196     {
197     }
198 
CPVT_WordPropsCPVT_WordProps199     CPVT_WordProps(const CPVT_WordProps & other) :
200         nFontIndex(other.nFontIndex), fFontSize(other.fFontSize), dwWordColor(other.dwWordColor),
201         nScriptType(other.nScriptType), nWordStyle(other.nWordStyle), fCharSpace(other.fCharSpace),
202         nHorzScale(other.nHorzScale)
203     {
204     }
205 
206     FX_INT32					nFontIndex;
207 
208     FX_FLOAT					fFontSize;
209 
210     FX_COLORREF					dwWordColor;
211 
212     FX_INT32					nScriptType;
213 
214     FX_INT32					nWordStyle;
215 
216     FX_FLOAT					fCharSpace;
217 
218     FX_INT32					nHorzScale;
219 };
220 struct CPVT_Word {
221 
CPVT_WordCPVT_Word222     CPVT_Word() : Word(0), nCharset(0), ptWord(0, 0), fAscent(0.0f), fDescent(0.0f), fWidth(0.0f),
223         fFontSize(0), WordProps()
224     {
225     }
226 
227     FX_WORD						Word;
228 
229     FX_INT32					nCharset;
230 
231     CPVT_WordPlace				WordPlace;
232 
233     CPDF_Point					ptWord;
234 
235     FX_FLOAT					fAscent;
236 
237     FX_FLOAT					fDescent;
238 
239     FX_FLOAT					fWidth;
240 
241     FX_INT32					nFontIndex;
242 
243     FX_FLOAT					fFontSize;
244 
245     CPVT_WordProps				WordProps;
246 };
247 struct CPVT_Line {
248 
CPVT_LineCPVT_Line249     CPVT_Line() : ptLine(0, 0), fLineWidth(0.0f), fLineAscent(0.0f), fLineDescent(0.0f)
250     {
251     }
252 
253     CPVT_WordPlace				lineplace;
254 
255     CPVT_WordPlace				lineEnd;
256 
257     CPDF_Point					ptLine;
258 
259     FX_FLOAT					fLineWidth;
260 
261     FX_FLOAT					fLineAscent;
262 
263     FX_FLOAT					fLineDescent;
264 };
265 struct CPVT_Section {
266 
267     CPVT_WordPlace				secplace;
268 
269     CPDF_Rect					rcSection;
270 
271     CPVT_SecProps				SecProps;
272 
273     CPVT_WordProps				WordProps;
274 };
275 class IPDF_VariableText_Provider
276 {
277 public:
278 
279     virtual FX_INT32						GetCharWidth(FX_INT32 nFontIndex, FX_WORD word, FX_INT32 nWordStyle) = 0;
280 
281     virtual FX_INT32						GetTypeAscent(FX_INT32 nFontIndex) = 0;
282 
283     virtual FX_INT32						GetTypeDescent(FX_INT32 nFontIndex) = 0;
284 
285     virtual FX_INT32						GetWordFontIndex(FX_WORD word, FX_INT32 charset, FX_INT32 nFontIndex) = 0;
286 
287     virtual FX_BOOL							IsLatinWord(FX_WORD word) = 0;
288 
289     virtual FX_INT32						GetDefaultFontIndex() = 0;
290 };
291 class IPDF_VariableText_Iterator
292 {
293 public:
294 
295     virtual FX_BOOL							NextWord() = 0;
296 
297     virtual FX_BOOL							PrevWord() = 0;
298 
299     virtual FX_BOOL							NextLine() = 0;
300 
301     virtual FX_BOOL							PrevLine() = 0;
302 
303     virtual FX_BOOL							NextSection() = 0;
304 
305     virtual FX_BOOL							PrevSection() = 0;
306 
307     virtual FX_BOOL							GetWord(CPVT_Word & word) const = 0;
308 
309     virtual FX_BOOL							SetWord(const CPVT_Word & word) = 0;
310 
311     virtual FX_BOOL							GetLine(CPVT_Line & line) const = 0;
312 
313     virtual FX_BOOL							GetSection(CPVT_Section & section) const = 0;
314 
315     virtual	FX_BOOL							SetSection(const CPVT_Section & section) = 0;
316 
317     virtual void							SetAt(FX_INT32 nWordIndex) = 0;
318 
319     virtual void							SetAt(const CPVT_WordPlace & place) = 0;
320 
321     virtual const CPVT_WordPlace &			GetAt() const = 0;
322 };
323 class IPDF_VariableText
324 {
325 public:
326 
327     static IPDF_VariableText*			NewVariableText();
328 
329     static void							DelVariableText(IPDF_VariableText* pVT);
330 public:
331 
332     virtual IPDF_VariableText_Provider*		SetProvider(IPDF_VariableText_Provider * pProvider) = 0;
333 
334     virtual IPDF_VariableText_Iterator*		GetIterator() = 0;
335 
336     virtual void							SetPlateRect(const CPDF_Rect & rect) = 0;
337 
338     virtual void							SetAlignment(FX_INT32 nFormat = 0) = 0;
339 
340     virtual void							SetPasswordChar(FX_WORD wSubWord = '*') = 0;
341 
342     virtual void							SetLimitChar(FX_INT32 nLimitChar = 0) = 0;
343 
344     virtual void							SetCharArray(FX_INT32 nCharArray = 0) = 0;
345 
346     virtual void							SetCharSpace(FX_FLOAT fCharSpace = 0.0f) = 0;
347 
348     virtual void							SetHorzScale(FX_INT32 nHorzScale = 100) = 0;
349 
350     virtual void							SetMultiLine(FX_BOOL bMultiLine = TRUE) = 0;
351 
352     virtual void							SetAutoReturn(FX_BOOL bAuto = TRUE) = 0;
353 
354     virtual void							SetAutoFontSize(FX_BOOL bAuto = TRUE) = 0;
355 
356     virtual void							SetFontSize(FX_FLOAT fFontSize) = 0;
357 
358     virtual void							SetLineLeading(FX_FLOAT fLineLeading) = 0;
359 
360     virtual void							SetRichText(FX_BOOL bRichText) = 0;
361 
362     virtual void							Initialize() = 0;
363 
364     virtual FX_BOOL							IsValid() const = 0;
365 
366     virtual FX_BOOL							IsRichText() const = 0;
367 
368     virtual void							RearrangeAll() = 0;
369 
370     virtual void							RearrangePart(const CPVT_WordRange & PlaceRange) = 0;
371 
372     virtual void							ResetAll() = 0;
373 
374     virtual void							SetText(FX_LPCWSTR text, FX_INT32 charset = 1, const CPVT_SecProps * pSecProps = NULL,
375             const CPVT_WordProps * pWordProps = NULL) = 0;
376 
377     virtual CPVT_WordPlace					InsertWord(const CPVT_WordPlace & place, FX_WORD word, FX_INT32 charset = 1,
378             const CPVT_WordProps * pWordProps = NULL) = 0;
379 
380     virtual CPVT_WordPlace					InsertSection(const CPVT_WordPlace & place, const CPVT_SecProps * pSecProps = NULL,
381             const CPVT_WordProps * pWordProps = NULL) = 0;
382 
383     virtual CPVT_WordPlace					InsertText(const CPVT_WordPlace & place, FX_LPCWSTR text, FX_INT32 charset = 1,
384             const CPVT_SecProps * pSecProps = NULL,	const CPVT_WordProps * pWordProps = NULL) = 0;
385 
386     virtual CPVT_WordPlace					DeleteWords(const CPVT_WordRange & PlaceRange) = 0;
387 
388     virtual CPVT_WordPlace					DeleteWord(const CPVT_WordPlace & place) = 0;
389 
390     virtual CPVT_WordPlace					BackSpaceWord(const CPVT_WordPlace & place) = 0;
391 
392     virtual const CPDF_Rect &				GetPlateRect() const = 0;
393 
394     virtual CPDF_Rect						GetContentRect() const = 0;
395 
396     virtual FX_INT32						GetTotalWords() const = 0;
397 
398     virtual FX_FLOAT						GetFontSize() const = 0;
399 
400     virtual FX_INT32						GetAlignment() const = 0;
401 
402     virtual FX_WORD							GetPasswordChar() const = 0;
403 
404     virtual FX_INT32						GetCharArray() const = 0;
405 
406     virtual FX_INT32						GetLimitChar() const = 0;
407 
408     virtual FX_BOOL							IsMultiLine() const = 0;
409 
410     virtual FX_INT32						GetHorzScale() const = 0;
411 
412     virtual FX_FLOAT						GetCharSpace() const = 0;
413 
414     virtual CPVT_WordPlace					GetBeginWordPlace() const = 0;
415 
416     virtual CPVT_WordPlace					GetEndWordPlace() const = 0;
417 
418     virtual CPVT_WordPlace					GetPrevWordPlace(const CPVT_WordPlace & place) const = 0;
419 
420     virtual CPVT_WordPlace					GetNextWordPlace(const CPVT_WordPlace & place) const = 0;
421 
422     virtual CPVT_WordPlace					SearchWordPlace(const CPDF_Point & point) const = 0;
423 
424     virtual CPVT_WordPlace					GetUpWordPlace(const CPVT_WordPlace & place, const CPDF_Point & point) const = 0;
425 
426     virtual CPVT_WordPlace					GetDownWordPlace(const CPVT_WordPlace & place, const CPDF_Point & point) const = 0;
427 
428     virtual CPVT_WordPlace					GetLineBeginPlace(const CPVT_WordPlace & place) const = 0;
429 
430     virtual CPVT_WordPlace					GetLineEndPlace(const CPVT_WordPlace & place) const = 0;
431 
432     virtual CPVT_WordPlace					GetSectionBeginPlace(const CPVT_WordPlace & place) const = 0;
433 
434     virtual CPVT_WordPlace					GetSectionEndPlace(const CPVT_WordPlace & place) const = 0;
435 
436     virtual void							UpdateWordPlace(CPVT_WordPlace & place) const = 0;
437 
438     virtual CPVT_WordPlace					AjustLineHeader(const CPVT_WordPlace & place, FX_BOOL bPrevOrNext) const = 0;
439 
440     virtual FX_INT32						WordPlaceToWordIndex(const CPVT_WordPlace & place) const = 0;
441 
442     virtual CPVT_WordPlace					WordIndexToWordPlace(FX_INT32 index) const = 0;
443 };
444 #endif
445