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