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