Merge XFA to PDFium master at 4dc95e7 on 10/28/2014
[pdfium.git] / xfa / src / fgas / include / fx_rbk.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 _FX_RTFBREAK\r
8 #define _FX_RTFBREAK\r
9 class IFX_Unknown;\r
10 class IFX_Font;\r
11 class CFX_Char;\r
12 class CFX_RTFChar;\r
13 class CFX_RTFBreakPiece;\r
14 class IFX_RTFBreak;\r
15 #define FX_RTFBREAKPOLICY_None                                  0x00\r
16 #define FX_RTFBREAKPOLICY_SpaceBreak                    0x01\r
17 #define FX_RTFBREAKPOLICY_NumberBreak                   0x02\r
18 #define FX_RTFBREAKPOLICY_InfixBreak                    0x04\r
19 #define FX_RTFBREAKPOLICY_TabBreak                              0x08\r
20 #define FX_RTFBREAKPOLICY_OrphanPositionedTab   0x10\r
21 #define FX_RTFBREAK_None                                                0x00\r
22 #define FX_RTFBREAK_PieceBreak                                  0x01\r
23 #define FX_RTFBREAK_LineBreak                                   0x02\r
24 #define FX_RTFBREAK_ParagraphBreak                              0x03\r
25 #define FX_RTFBREAK_PageBreak                                   0x04\r
26 #define FX_RTFLAYOUTSTYLE_Pagination                    0x01\r
27 #define FX_RTFLAYOUTSTYLE_VerticalLayout                0x02\r
28 #define FX_RTFLAYOUTSTYLE_VerticalChars                 0x04\r
29 #define FX_RTFLAYOUTSTYLE_LineDirection                 0x08\r
30 #define FX_RTFLAYOUTSTYLE_ExpandTab                             0x10\r
31 #define FX_RTFLAYOUTSTYLE_ArabicNumber                  0x20\r
32 #define FX_RTFLAYOUTSTYLE_SingleLine                    0x40\r
33 #define FX_RTFLAYOUTSTYLE_MBCSCode                              0x80\r
34 #define FX_RTFCHARSTYLE_Alignment                               0x000F\r
35 #define FX_RTFCHARSTYLE_ArabicNumber                    0x0010\r
36 #define FX_RTFCHARSTYLE_ArabicShadda                    0x0020\r
37 #define FX_RTFCHARSTYLE_OddBidiLevel                    0x0040\r
38 #define FX_RTFCHARSTYLE_RTLReadingOrder                 0x0080\r
39 #define FX_RTFCHARSTYLE_ArabicContext                   0x0300\r
40 #define FX_RTFCHARSTYLE_ArabicIndic                             0x0400\r
41 #define FX_RTFCHARSTYLE_ArabicComma                             0x0800\r
42 #define FX_RTFLINEALIGNMENT_Left                                0\r
43 #define FX_RTFLINEALIGNMENT_Center                              1\r
44 #define FX_RTFLINEALIGNMENT_Right                               2\r
45 #define FX_RTFLINEALIGNMENT_Justified                   (1 << 2)\r
46 #define FX_RTFLINEALIGNMENT_Distributed                 (2 << 2)\r
47 #define FX_RTFLINEALIGNMENT_JustifiedLeft               (FX_RTFLINEALIGNMENT_Left | FX_RTFLINEALIGNMENT_Justified)\r
48 #define FX_RTFLINEALIGNMENT_JustifiedCenter             (FX_RTFLINEALIGNMENT_Center | FX_RTFLINEALIGNMENT_Justified)\r
49 #define FX_RTFLINEALIGNMENT_JustifiedRight              (FX_RTFLINEALIGNMENT_Right | FX_RTFLINEALIGNMENT_Justified)\r
50 #define FX_RTFLINEALIGNMENT_DistributedLeft             (FX_RTFLINEALIGNMENT_Left | FX_RTFLINEALIGNMENT_Distributed)\r
51 #define FX_RTFLINEALIGNMENT_DistributedCenter   (FX_RTFLINEALIGNMENT_Center | FX_RTFLINEALIGNMENT_Distributed)\r
52 #define FX_RTFLINEALIGNMENT_DistributedRight    (FX_RTFLINEALIGNMENT_Right | FX_RTFLINEALIGNMENT_Distributed)\r
53 #define FX_RTFLINEALIGNMENT_LowerMask                   0x03\r
54 #define FX_RTFLINEALIGNMENT_HigherMask                  0x0C\r
55 typedef struct _FX_RTFTEXTOBJ {\r
56     _FX_RTFTEXTOBJ()\r
57     {\r
58         pStr = NULL;\r
59         pWidths = NULL;\r
60         iLength = 0;\r
61         pFont = NULL;\r
62         fFontSize = 12.0f;\r
63         dwLayoutStyles = 0;\r
64         iCharRotation = 0;\r
65         iBidiLevel = 0;\r
66         pRect = NULL;\r
67         wLineBreakChar = L'\n';\r
68         iHorizontalScale = 100;\r
69         iVerticalScale = 100;\r
70     }\r
71     FX_LPCWSTR          pStr;\r
72     FX_INT32            *pWidths;\r
73     FX_INT32            iLength;\r
74     IFX_Font            *pFont;\r
75     FX_FLOAT            fFontSize;\r
76     FX_DWORD            dwLayoutStyles;\r
77     FX_INT32            iCharRotation;\r
78     FX_INT32            iBidiLevel;\r
79     FX_LPCRECTF         pRect;\r
80     FX_WCHAR            wLineBreakChar;\r
81     FX_INT32            iHorizontalScale;\r
82     FX_INT32            iVerticalScale;\r
83 } FX_RTFTEXTOBJ, * FX_LPRTFTEXTOBJ;\r
84 typedef FX_RTFTEXTOBJ const * FX_LPCRTFTEXTOBJ;\r
85 class CFX_RTFPiece : public CFX_Target\r
86 {\r
87 public:\r
88     CFX_RTFPiece() : m_dwStatus(FX_RTFBREAK_PieceBreak)\r
89         , m_iStartPos(0)\r
90         , m_iWidth(-1)\r
91         , m_iStartChar(0)\r
92         , m_iChars(0)\r
93         , m_iBidiLevel(0)\r
94         , m_iBidiPos(0)\r
95         , m_iFontSize(0)\r
96         , m_iFontHeight(0)\r
97         , m_iHorizontalScale(100)\r
98         , m_iVerticalScale(100)\r
99         , m_dwLayoutStyles(0)\r
100         , m_dwIdentity(0)\r
101         , m_pChars(NULL)\r
102         , m_pUserData(NULL)\r
103     {\r
104     }\r
105     ~CFX_RTFPiece()\r
106     {\r
107         Reset();\r
108     }\r
109     void AppendChar(const CFX_RTFChar &tc)\r
110     {\r
111         FXSYS_assert(m_pChars != NULL);\r
112         m_pChars->Add(tc);\r
113         if (m_iWidth < 0) {\r
114             m_iWidth = tc.m_iCharWidth;\r
115         } else {\r
116             m_iWidth += tc.m_iCharWidth;\r
117         }\r
118         m_iChars ++;\r
119     }\r
120     FX_INT32 GetEndPos() const\r
121     {\r
122         return m_iWidth < 0 ? m_iStartPos : m_iStartPos + m_iWidth;\r
123     }\r
124     FX_INT32 GetLength() const\r
125     {\r
126         return m_iChars;\r
127     }\r
128     FX_INT32 GetEndChar() const\r
129     {\r
130         return m_iStartChar + m_iChars;\r
131     }\r
132     CFX_RTFChar& GetChar(FX_INT32 index)\r
133     {\r
134         FXSYS_assert(index > -1 && index < m_iChars && m_pChars != NULL);\r
135         return *m_pChars->GetDataPtr(m_iStartChar + index);\r
136     }\r
137     CFX_RTFChar* GetCharPtr(FX_INT32 index) const\r
138     {\r
139         FXSYS_assert(index > -1 && index < m_iChars && m_pChars != NULL);\r
140         return m_pChars->GetDataPtr(m_iStartChar + index);\r
141     }\r
142     void GetString (FX_LPWSTR pText) const\r
143     {\r
144         FXSYS_assert(pText != NULL);\r
145         FX_INT32 iEndChar = m_iStartChar + m_iChars;\r
146         CFX_RTFChar *pChar;\r
147         for (FX_INT32 i = m_iStartChar; i < iEndChar; i ++) {\r
148             pChar = m_pChars->GetDataPtr(i);\r
149             *pText ++ = (FX_WCHAR)pChar->m_wCharCode;\r
150         }\r
151     }\r
152     void GetString(CFX_WideString &wsText) const\r
153     {\r
154         FX_LPWSTR pText = wsText.GetBuffer(m_iChars);\r
155         GetString(pText);\r
156         wsText.ReleaseBuffer(m_iChars);\r
157     }\r
158     void GetWidths(FX_INT32 *pWidths) const\r
159     {\r
160         FXSYS_assert(pWidths != NULL);\r
161         FX_INT32 iEndChar = m_iStartChar + m_iChars;\r
162         CFX_RTFChar *pChar;\r
163         for (FX_INT32 i = m_iStartChar; i < iEndChar; i ++) {\r
164             pChar = m_pChars->GetDataPtr(i);\r
165             *pWidths ++ = pChar->m_iCharWidth;\r
166         }\r
167     }\r
168     void Reset()\r
169     {\r
170         m_dwStatus = FX_RTFBREAK_PieceBreak;\r
171         if (m_iWidth > -1) {\r
172             m_iStartPos += m_iWidth;\r
173         }\r
174         m_iWidth = -1;\r
175         m_iStartChar += m_iChars;\r
176         m_iChars = 0;\r
177         m_iBidiLevel = 0;\r
178         m_iBidiPos = 0;\r
179         m_iHorizontalScale = 100;\r
180         m_iVerticalScale = 100;\r
181     }\r
182     FX_DWORD                    m_dwStatus;\r
183     FX_INT32                    m_iStartPos;\r
184     FX_INT32                    m_iWidth;\r
185     FX_INT32                    m_iStartChar;\r
186     FX_INT32                    m_iChars;\r
187     FX_INT32                    m_iBidiLevel;\r
188     FX_INT32                    m_iBidiPos;\r
189     FX_INT32                    m_iFontSize;\r
190     FX_INT32                    m_iFontHeight;\r
191     FX_INT32                    m_iHorizontalScale;\r
192     FX_INT32                    m_iVerticalScale;\r
193     FX_DWORD                    m_dwLayoutStyles;\r
194     FX_DWORD                    m_dwIdentity;\r
195     CFX_RTFCharArray    *m_pChars;\r
196     IFX_Unknown                 *m_pUserData;\r
197 };\r
198 typedef CFX_BaseArrayTemplate<CFX_RTFPiece> CFX_RTFPieceArray;\r
199 class IFX_RTFBreak\r
200 {\r
201 public:\r
202     static IFX_RTFBreak*        Create(FX_DWORD dwPolicies);\r
203     virtual void                        Release() = 0;\r
204     virtual void                        SetLineWidth(FX_FLOAT fLineStart, FX_FLOAT fLineEnd) = 0;\r
205     virtual void                        SetLinePos(FX_FLOAT fLinePos) = 0;\r
206     virtual FX_DWORD            GetLayoutStyles() const = 0;\r
207     virtual void                        SetLayoutStyles(FX_DWORD dwLayoutStyles) = 0;\r
208     virtual void                        SetFont(IFX_Font *pFont) = 0;\r
209     virtual void                        SetFontSize(FX_FLOAT fFontSize) = 0;\r
210     virtual void                        SetTabWidth(FX_FLOAT fTabWidth) = 0;\r
211     virtual void                        AddPositionedTab(FX_FLOAT fTabPos) = 0;\r
212     virtual void                        SetPositionedTabs(const CFX_FloatArray &tabs) = 0;\r
213     virtual void                        ClearPositionedTabs() = 0;\r
214     virtual void                        SetDefaultChar(FX_WCHAR wch) = 0;\r
215     virtual void                        SetLineBreakChar(FX_WCHAR wch) = 0;\r
216     virtual void                        SetLineBreakTolerance(FX_FLOAT fTolerance) = 0;\r
217     virtual void                        SetHorizontalScale(FX_INT32 iScale) = 0;\r
218     virtual void                        SetVerticalScale(FX_INT32 iScale) = 0;\r
219     virtual void                        SetCharRotation(FX_INT32 iCharRotation) = 0;\r
220     virtual void                        SetCharSpace(FX_FLOAT fCharSpace) = 0;\r
221     virtual void                        SetWordSpace(FX_BOOL bDefault, FX_FLOAT fWordSpace) = 0;\r
222     virtual void                        SetReadingOrder(FX_BOOL bRTL = FALSE) = 0;\r
223     virtual void                        SetAlignment(FX_INT32 iAlignment = FX_RTFLINEALIGNMENT_Left) = 0;\r
224     virtual void                        SetUserData(IFX_Unknown *pUserData) = 0;\r
225     virtual FX_DWORD                                    AppendChar(FX_WCHAR wch) = 0;\r
226     virtual FX_DWORD                                    EndBreak(FX_DWORD dwStatus = FX_RTFBREAK_PieceBreak) = 0;\r
227     virtual FX_INT32                                    CountBreakPieces() const = 0;\r
228     virtual const CFX_RTFPiece*                 GetBreakPiece(FX_INT32 index) const = 0;\r
229     virtual void                                                GetLineRect(CFX_RectF &rect) const = 0;\r
230     virtual void                                                ClearBreakPieces() = 0;\r
231     virtual void                        Reset() = 0;\r
232     virtual FX_INT32            GetDisplayPos(FX_LPCRTFTEXTOBJ pText, FXTEXT_CHARPOS *pCharPos, FX_BOOL bCharCode = FALSE, CFX_WideString *pWSForms = NULL, FX_AdjustCharDisplayPos pAdjustPos = NULL) const = 0;\r
233     virtual FX_INT32            GetCharRects(FX_LPCRTFTEXTOBJ pText, CFX_RectFArray &rtArray, FX_BOOL bCharBBox = FALSE) const = 0;\r
234 };\r
235 #endif\r