Merge XFA to PDFium master at 4dc95e7 on 10/28/2014
[pdfium.git] / xfa / src / fgas / src / layout / fx_rtfbreak.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_IMP\r
8 #define _FX_RTFBREAK_IMP\r
9 class CFX_RTFLine;\r
10 class CFX_RTFBreak;\r
11 class CFX_RTFLine : public CFX_Object\r
12 {\r
13 public:\r
14     CFX_RTFLine() : m_LinePieces(16)\r
15         , m_iStart(0)\r
16         , m_iWidth(0)\r
17         , m_iArabicChars(0)\r
18         , m_iMBCSChars(0)\r
19     {\r
20     }\r
21     ~CFX_RTFLine()\r
22     {\r
23         RemoveAll();\r
24     }\r
25     FX_INT32 CountChars() const\r
26     {\r
27         return m_LineChars.GetSize();\r
28     }\r
29     CFX_RTFChar& GetChar(FX_INT32 index)\r
30     {\r
31         FXSYS_assert(index > -1 && index < m_LineChars.GetSize());\r
32         return *m_LineChars.GetDataPtr(index);\r
33     }\r
34     CFX_RTFChar* GetCharPtr(FX_INT32 index)\r
35     {\r
36         FXSYS_assert(index > -1 && index < m_LineChars.GetSize());\r
37         return m_LineChars.GetDataPtr(index);\r
38     }\r
39     FX_INT32 CountPieces() const\r
40     {\r
41         return m_LinePieces.GetSize();\r
42     }\r
43     CFX_RTFPiece& GetPiece(FX_INT32 index) const\r
44     {\r
45         FXSYS_assert(index > -1 && index < m_LinePieces.GetSize());\r
46         return m_LinePieces.GetAt(index);\r
47     }\r
48     CFX_RTFPiece* GetPiecePtr(FX_INT32 index) const\r
49     {\r
50         FXSYS_assert(index > -1 && index < m_LinePieces.GetSize());\r
51         return m_LinePieces.GetPtrAt(index);\r
52     }\r
53     FX_INT32 GetLineEnd() const\r
54     {\r
55         return m_iStart + m_iWidth;\r
56     }\r
57     void RemoveAll(FX_BOOL bLeaveMemory = FALSE)\r
58     {\r
59         CFX_RTFChar *pChar;\r
60         IFX_Unknown *pUnknown;\r
61         FX_INT32 iCount = m_LineChars.GetSize();\r
62         for (FX_INT32 i = 0; i < iCount; i ++) {\r
63             pChar = m_LineChars.GetDataPtr(i);\r
64             if ((pUnknown = pChar->m_pUserData) != NULL) {\r
65                 pUnknown->Release();\r
66             }\r
67         }\r
68         m_LineChars.RemoveAll();\r
69         m_LinePieces.RemoveAll(bLeaveMemory);\r
70         m_iWidth = 0;\r
71         m_iArabicChars = 0;\r
72         m_iMBCSChars = 0;\r
73     }\r
74     CFX_RTFCharArray    m_LineChars;\r
75     CFX_RTFPieceArray   m_LinePieces;\r
76     FX_INT32                    m_iStart;\r
77     FX_INT32                    m_iWidth;\r
78     FX_INT32                    m_iArabicChars;\r
79     FX_INT32                    m_iMBCSChars;\r
80 };\r
81 class CFX_RTFBreak : public IFX_RTFBreak, public CFX_Object\r
82 {\r
83 public:\r
84     CFX_RTFBreak(FX_DWORD dwPolicies);\r
85     ~CFX_RTFBreak();\r
86     virtual void                        Release()\r
87     {\r
88         delete this;\r
89     }\r
90     virtual void                        SetLineWidth(FX_FLOAT fLineStart, FX_FLOAT fLineEnd);\r
91     virtual void                        SetLinePos(FX_FLOAT fLinePos);\r
92     virtual FX_DWORD            GetLayoutStyles() const\r
93     {\r
94         return m_dwLayoutStyles;\r
95     }\r
96     virtual void                        SetLayoutStyles(FX_DWORD dwLayoutStyles);\r
97     virtual void                        SetFont(IFX_Font *pFont);\r
98     virtual void                        SetFontSize(FX_FLOAT fFontSize);\r
99     virtual void                        SetTabWidth(FX_FLOAT fTabWidth);\r
100     virtual void                        AddPositionedTab(FX_FLOAT fTabPos);\r
101     virtual void                        SetPositionedTabs(const CFX_FloatArray &tabs);\r
102     virtual void                        ClearPositionedTabs();\r
103     virtual void                        SetDefaultChar(FX_WCHAR wch);\r
104     virtual void                        SetLineBreakChar(FX_WCHAR wch);\r
105     virtual void                        SetLineBreakTolerance(FX_FLOAT fTolerance);\r
106     virtual void                        SetHorizontalScale(FX_INT32 iScale);\r
107     virtual void                        SetVerticalScale(FX_INT32 iScale);\r
108     virtual void                        SetCharRotation(FX_INT32 iCharRotation);\r
109     virtual void                        SetCharSpace(FX_FLOAT fCharSpace);\r
110     virtual void                        SetWordSpace(FX_BOOL bDefault, FX_FLOAT fWordSpace);\r
111     virtual void                        SetReadingOrder(FX_BOOL bRTL = FALSE);\r
112     virtual void                        SetAlignment(FX_INT32 iAlignment = FX_RTFLINEALIGNMENT_Left);\r
113     virtual void                        SetUserData(IFX_Unknown *pUserData);\r
114     virtual FX_DWORD                                    AppendChar(FX_WCHAR wch);\r
115     virtual FX_DWORD                                    EndBreak(FX_DWORD dwStatus = FX_RTFBREAK_PieceBreak);\r
116     virtual FX_INT32                                    CountBreakPieces() const;\r
117     virtual const CFX_RTFPiece*                 GetBreakPiece(FX_INT32 index) const;\r
118     virtual void                                                GetLineRect(CFX_RectF &rect) const;\r
119     virtual void                                                ClearBreakPieces();\r
120     virtual void                        Reset();\r
121     virtual FX_INT32            GetDisplayPos(FX_LPCRTFTEXTOBJ pText, FXTEXT_CHARPOS *pCharPos, FX_BOOL bCharCode = FALSE, CFX_WideString *pWSForms = NULL, FX_AdjustCharDisplayPos pAdjustPos = NULL) const;\r
122     virtual FX_INT32            GetCharRects(FX_LPCRTFTEXTOBJ pText, CFX_RectFArray &rtArray, FX_BOOL bCharBBox = FALSE) const;\r
123     FX_DWORD                            AppendChar_CharCode(FX_WCHAR wch);\r
124     FX_DWORD                            AppendChar_Combination(CFX_RTFChar *pCurChar, FX_INT32 iRotation);\r
125     FX_DWORD                            AppendChar_Tab(CFX_RTFChar *pCurChar, FX_INT32 iRotation);\r
126     FX_DWORD                            AppendChar_Control(CFX_RTFChar *pCurChar, FX_INT32 iRotation);\r
127     FX_DWORD                            AppendChar_Arabic(CFX_RTFChar *pCurChar, FX_INT32 iRotation);\r
128     FX_DWORD                            AppendChar_Others(CFX_RTFChar *pCurChar, FX_INT32 iRotation);\r
129 protected:\r
130     FX_DWORD                    m_dwPolicies;\r
131     IFX_ArabicChar              *m_pArabicChar;\r
132     FX_INT32                    m_iLineStart;\r
133     FX_INT32                    m_iLineEnd;\r
134     FX_DWORD                    m_dwLayoutStyles;\r
135     FX_BOOL                             m_bPagination;\r
136     FX_BOOL                             m_bVertical;\r
137     FX_BOOL                             m_bSingleLine;\r
138     FX_BOOL                             m_bCharCode;\r
139     IFX_Font                    *m_pFont;\r
140     FX_INT32                    m_iFontHeight;\r
141     FX_INT32                    m_iFontSize;\r
142     FX_INT32                    m_iTabWidth;\r
143     CFX_Int32Array              m_PositionedTabs;\r
144     FX_BOOL                             m_bOrphanLine;\r
145     FX_WCHAR                    m_wDefChar;\r
146     FX_INT32                    m_iDefChar;\r
147     FX_WCHAR                    m_wLineBreakChar;\r
148     FX_INT32                    m_iHorizontalScale;\r
149     FX_INT32                    m_iVerticalScale;\r
150     FX_INT32                    m_iLineRotation;\r
151     FX_INT32                    m_iCharRotation;\r
152     FX_INT32                    m_iRotation;\r
153     FX_INT32                    m_iCharSpace;\r
154     FX_BOOL                             m_bWordSpace;\r
155     FX_INT32                    m_iWordSpace;\r
156     FX_BOOL                             m_bRTL;\r
157     FX_INT32                    m_iAlignment;\r
158     IFX_Unknown                 *m_pUserData;\r
159     FX_DWORD                    m_dwCharType;\r
160     FX_DWORD                    m_dwIdentity;\r
161     CFX_RTFLine                 m_RTFLine1;\r
162     CFX_RTFLine                 m_RTFLine2;\r
163     CFX_RTFLine                 *m_pCurLine;\r
164     FX_INT32                    m_iReady;\r
165     FX_INT32                    m_iTolerance;\r
166     FX_INT32                    GetLineRotation(FX_DWORD dwStyles) const;\r
167     void                                SetBreakStatus();\r
168     CFX_RTFChar*                GetLastChar(FX_INT32 index) const;\r
169     CFX_RTFLine*                GetRTFLine(FX_BOOL bReady) const;\r
170     CFX_RTFPieceArray*  GetRTFPieces(FX_BOOL bReady) const;\r
171     FX_DWORD                    GetUnifiedCharType(FX_DWORD dwType) const;\r
172     FX_INT32                    GetLastPositionedTab() const;\r
173     FX_BOOL                             GetPositionedTab(FX_INT32 &iTabPos) const;\r
174     FX_INT32                    GetBreakPos(CFX_RTFCharArray &tca, FX_INT32 &iEndPos, FX_BOOL bAllChars = FALSE, FX_BOOL bOnlyBrk = FALSE);\r
175     void                                SplitTextLine(CFX_RTFLine *pCurLine, CFX_RTFLine *pNextLine, FX_BOOL bAllChars = FALSE);\r
176     FX_BOOL                             EndBreak_SplitLine(CFX_RTFLine *pNextLine, FX_BOOL bAllChars, FX_DWORD dwStatus);\r
177     void                                EndBreak_BidiLine(CFX_TPOArray &tpos, FX_DWORD dwStatus);\r
178     void                                EndBreak_Alignment(CFX_TPOArray &tpos, FX_BOOL bAllChars, FX_DWORD dwStatus);\r
179 };\r
180 #endif\r