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