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