eb05801849fce544c28ea9e7df331146a1edd351
[pdfium.git] / core / src / fxcrt / fx_arabic.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 _FX_ARABIC_IMP
8 #define _FX_ARABIC_IMP
9 typedef struct _FX_ARABICCHARRANGE {
10     FX_WCHAR wStart;
11     FX_WCHAR wEnd;
12 } FX_ARABICCHARRANGE;
13 class CFX_ArabicChar : public IFX_ArabicChar
14 {
15 public:
16     virtual void                Release()
17     {
18         delete this;
19     }
20     virtual FX_BOOL             IsArabicChar(FX_WCHAR wch) const;
21     virtual FX_BOOL             IsArabicFormChar(FX_WCHAR wch) const;
22
23     virtual FX_WCHAR    GetFormChar(FX_WCHAR wch, FX_WCHAR prev = 0, FX_WCHAR next = 0) const;
24     virtual FX_WCHAR    GetFormChar(const CFX_Char *cur, const CFX_Char *prev, const CFX_Char *next) const;
25 protected:
26     FX_LPCARBFORMTABLE ParseChar(const CFX_Char *pTC, FX_WCHAR &wChar, FX_CHARTYPE &eType) const;
27 };
28 void FX_BidiReverseString(CFX_WideString &wsText, FX_INT32 iStart, FX_INT32 iCount);
29 void FX_BidiSetDeferredRun(CFX_Int32Array &values, FX_INT32 iStart, FX_INT32 iCount, FX_INT32 iValue);
30 #define FX_BCON         FX_BIDICLASS_ON
31 #define FX_BCL          FX_BIDICLASS_L
32 #define FX_BCR          FX_BIDICLASS_R
33 #define FX_BCAN         FX_BIDICLASS_AN
34 #define FX_BCEN         FX_BIDICLASS_EN
35 #define FX_BCAL         FX_BIDICLASS_AL
36 #define FX_BCNSM        FX_BIDICLASS_NSM
37 #define FX_BCCS         FX_BIDICLASS_CS
38 #define FX_BCES         FX_BIDICLASS_ES
39 #define FX_BCET         FX_BIDICLASS_ET
40 #define FX_BCBN         FX_BIDICLASS_BN
41 #define FX_BCS          FX_BIDICLASS_S
42 #define FX_BCWS         FX_BIDICLASS_WS
43 #define FX_BCB          FX_BIDICLASS_B
44 #define FX_BCRLO        FX_BIDICLASS_RLO
45 #define FX_BCRLE        FX_BIDICLASS_RLE
46 #define FX_BCLRO        FX_BIDICLASS_LRO
47 #define FX_BCLRE        FX_BIDICLASS_LRE
48 #define FX_BCPDF        FX_BIDICLASS_PDF
49 #define FX_BCN          FX_BIDICLASS_N
50 void FX_BidiClassify(const CFX_WideString &wsText, CFX_Int32Array &classes, FX_BOOL bWS = FALSE);
51 #define FX_BIDIMAXLEVEL                 61
52 #define FX_BidiGreaterEven(a)   (FX_IsOdd(a) ? ((a) + 1) : ((a) + 2))
53 #define FX_BidiGreaterOdd(a)    (FX_IsOdd(a) ? ((a) + 2) : ((a) + 1))
54 FX_INT32 FX_BidiResolveExplicit(FX_INT32 iBaseLevel, FX_INT32 iDirection, CFX_Int32Array &classes, CFX_Int32Array &levels, FX_INT32 iStart, FX_INT32 iCount, FX_INT32 iNest = 0);
55 #define FX_BidiDirection(a)     (FX_IsOdd(a) ? FX_BIDICLASS_R : FX_BIDICLASS_L)
56 enum FX_BIDIWEAKSTATE {
57     FX_BIDIWEAKSTATE_xa = 0,
58     FX_BIDIWEAKSTATE_xr,
59     FX_BIDIWEAKSTATE_xl,
60     FX_BIDIWEAKSTATE_ao,
61     FX_BIDIWEAKSTATE_ro,
62     FX_BIDIWEAKSTATE_lo,
63     FX_BIDIWEAKSTATE_rt,
64     FX_BIDIWEAKSTATE_lt,
65     FX_BIDIWEAKSTATE_cn,
66     FX_BIDIWEAKSTATE_ra,
67     FX_BIDIWEAKSTATE_re,
68     FX_BIDIWEAKSTATE_la,
69     FX_BIDIWEAKSTATE_le,
70     FX_BIDIWEAKSTATE_ac,
71     FX_BIDIWEAKSTATE_rc,
72     FX_BIDIWEAKSTATE_rs,
73     FX_BIDIWEAKSTATE_lc,
74     FX_BIDIWEAKSTATE_ls,
75     FX_BIDIWEAKSTATE_ret,
76     FX_BIDIWEAKSTATE_let,
77 };
78 #define FX_BWSxa        FX_BIDIWEAKSTATE_xa
79 #define FX_BWSxr        FX_BIDIWEAKSTATE_xr
80 #define FX_BWSxl        FX_BIDIWEAKSTATE_xl
81 #define FX_BWSao        FX_BIDIWEAKSTATE_ao
82 #define FX_BWSro        FX_BIDIWEAKSTATE_ro
83 #define FX_BWSlo        FX_BIDIWEAKSTATE_lo
84 #define FX_BWSrt        FX_BIDIWEAKSTATE_rt
85 #define FX_BWSlt        FX_BIDIWEAKSTATE_lt
86 #define FX_BWScn        FX_BIDIWEAKSTATE_cn
87 #define FX_BWSra        FX_BIDIWEAKSTATE_ra
88 #define FX_BWSre        FX_BIDIWEAKSTATE_re
89 #define FX_BWSla        FX_BIDIWEAKSTATE_la
90 #define FX_BWSle        FX_BIDIWEAKSTATE_le
91 #define FX_BWSac        FX_BIDIWEAKSTATE_ac
92 #define FX_BWSrc        FX_BIDIWEAKSTATE_rc
93 #define FX_BWSrs        FX_BIDIWEAKSTATE_rs
94 #define FX_BWSlc        FX_BIDIWEAKSTATE_lc
95 #define FX_BWSls        FX_BIDIWEAKSTATE_ls
96 #define FX_BWSret       FX_BIDIWEAKSTATE_ret
97 #define FX_BWSlet       FX_BIDIWEAKSTATE_let
98 enum FX_BIDIWEAKACTION {
99     FX_BIDIWEAKACTION_IX = 0x100,
100     FX_BIDIWEAKACTION_XX = 0x0F,
101     FX_BIDIWEAKACTION_xxx = (0x0F << 4) + 0x0F,
102     FX_BIDIWEAKACTION_xIx = 0x100 + FX_BIDIWEAKACTION_xxx,
103     FX_BIDIWEAKACTION_xxN = (0x0F << 4) + FX_BIDICLASS_ON,
104     FX_BIDIWEAKACTION_xxE = (0x0F << 4) + FX_BIDICLASS_EN,
105     FX_BIDIWEAKACTION_xxA = (0x0F << 4) + FX_BIDICLASS_AN,
106     FX_BIDIWEAKACTION_xxR = (0x0F << 4) + FX_BIDICLASS_R,
107     FX_BIDIWEAKACTION_xxL = (0x0F << 4) + FX_BIDICLASS_L,
108     FX_BIDIWEAKACTION_Nxx = (FX_BIDICLASS_ON << 4) + 0x0F,
109     FX_BIDIWEAKACTION_Axx = (FX_BIDICLASS_AN << 4) + 0x0F,
110     FX_BIDIWEAKACTION_ExE = (FX_BIDICLASS_EN << 4) + FX_BIDICLASS_EN,
111     FX_BIDIWEAKACTION_NIx = (FX_BIDICLASS_ON << 4) + 0x0F + 0x100,
112     FX_BIDIWEAKACTION_NxN = (FX_BIDICLASS_ON << 4) + FX_BIDICLASS_ON,
113     FX_BIDIWEAKACTION_NxR = (FX_BIDICLASS_ON << 4) + FX_BIDICLASS_R,
114     FX_BIDIWEAKACTION_NxE = (FX_BIDICLASS_ON << 4) + FX_BIDICLASS_EN,
115     FX_BIDIWEAKACTION_AxA = (FX_BIDICLASS_AN << 4) + FX_BIDICLASS_AN,
116     FX_BIDIWEAKACTION_NxL = (FX_BIDICLASS_ON << 4) + FX_BIDICLASS_L,
117     FX_BIDIWEAKACTION_LxL = (FX_BIDICLASS_L << 4) + FX_BIDICLASS_L,
118     FX_BIDIWEAKACTION_xIL = (0x0F << 4) + FX_BIDICLASS_L + 0x100,
119     FX_BIDIWEAKACTION_AxR = (FX_BIDICLASS_AN << 4) + FX_BIDICLASS_R,
120     FX_BIDIWEAKACTION_Lxx = (FX_BIDICLASS_L << 4) + 0x0F,
121 };
122 #define FX_BWAIX        FX_BIDIWEAKACTION_IX
123 #define FX_BWAXX        FX_BIDIWEAKACTION_XX
124 #define FX_BWAxxx       FX_BIDIWEAKACTION_xxx
125 #define FX_BWAxIx       FX_BIDIWEAKACTION_xIx
126 #define FX_BWAxxN       FX_BIDIWEAKACTION_xxN
127 #define FX_BWAxxE       FX_BIDIWEAKACTION_xxE
128 #define FX_BWAxxA       FX_BIDIWEAKACTION_xxA
129 #define FX_BWAxxR       FX_BIDIWEAKACTION_xxR
130 #define FX_BWAxxL       FX_BIDIWEAKACTION_xxL
131 #define FX_BWANxx       FX_BIDIWEAKACTION_Nxx
132 #define FX_BWAAxx       FX_BIDIWEAKACTION_Axx
133 #define FX_BWAExE       FX_BIDIWEAKACTION_ExE
134 #define FX_BWANIx       FX_BIDIWEAKACTION_NIx
135 #define FX_BWANxN       FX_BIDIWEAKACTION_NxN
136 #define FX_BWANxR       FX_BIDIWEAKACTION_NxR
137 #define FX_BWANxE       FX_BIDIWEAKACTION_NxE
138 #define FX_BWAAxA       FX_BIDIWEAKACTION_AxA
139 #define FX_BWANxL       FX_BIDIWEAKACTION_NxL
140 #define FX_BWALxL       FX_BIDIWEAKACTION_LxL
141 #define FX_BWAxIL       FX_BIDIWEAKACTION_xIL
142 #define FX_BWAAxR       FX_BIDIWEAKACTION_AxR
143 #define FX_BWALxx       FX_BIDIWEAKACTION_Lxx
144 #define FX_BidiGetDeferredType(a)       (((a) >> 4) & 0x0F)
145 #define FX_BidiGetResolvedType(a)       ((a) & 0x0F)
146 void FX_BidiResolveWeak(FX_INT32 iBaseLevel, CFX_Int32Array &classes, CFX_Int32Array &levels);
147 enum FX_BIDINEUTRALSTATE {
148     FX_BIDINEUTRALSTATE_r = 0,
149     FX_BIDINEUTRALSTATE_l,
150     FX_BIDINEUTRALSTATE_rn,
151     FX_BIDINEUTRALSTATE_ln,
152     FX_BIDINEUTRALSTATE_a,
153     FX_BIDINEUTRALSTATE_na,
154 };
155 #define FX_BNSr         FX_BIDINEUTRALSTATE_r
156 #define FX_BNSl         FX_BIDINEUTRALSTATE_l
157 #define FX_BNSrn        FX_BIDINEUTRALSTATE_rn
158 #define FX_BNSln        FX_BIDINEUTRALSTATE_ln
159 #define FX_BNSa         FX_BIDINEUTRALSTATE_a
160 #define FX_BNSna        FX_BIDINEUTRALSTATE_na
161 enum FX_BIDINEUTRALACTION {
162     FX_BIDINEUTRALACTION_nL = FX_BIDICLASS_L,
163     FX_BIDINEUTRALACTION_En = (FX_BIDICLASS_AN << 4),
164     FX_BIDINEUTRALACTION_Rn = (FX_BIDICLASS_R << 4),
165     FX_BIDINEUTRALACTION_Ln = (FX_BIDICLASS_L << 4),
166     FX_BIDINEUTRALACTION_In = FX_BIDIWEAKACTION_IX,
167     FX_BIDINEUTRALACTION_LnL = (FX_BIDICLASS_L << 4) + FX_BIDICLASS_L,
168 };
169 #define FX_BNAnL        FX_BIDINEUTRALACTION_nL
170 #define FX_BNAEn        FX_BIDINEUTRALACTION_En
171 #define FX_BNARn        FX_BIDINEUTRALACTION_Rn
172 #define FX_BNALn        FX_BIDINEUTRALACTION_Ln
173 #define FX_BNAIn        FX_BIDINEUTRALACTION_In
174 #define FX_BNALnL       FX_BIDINEUTRALACTION_LnL
175 FX_INT32 FX_BidiGetDeferredNeutrals(FX_INT32 iAction, FX_INT32 iLevel);
176 FX_INT32 FX_BidiGetResolvedNeutrals(FX_INT32 iAction);
177 void FX_BidiResolveNeutrals(FX_INT32 iBaseLevel, CFX_Int32Array &classes, const CFX_Int32Array &levels);
178 void FX_BidiResolveImplicit(const CFX_Int32Array &classes, CFX_Int32Array &levels);
179 void FX_BidiResolveWhitespace(FX_INT32 iBaseLevel, const CFX_Int32Array &classes, CFX_Int32Array &levels);
180 FX_INT32 FX_BidiReorderLevel(FX_INT32 iBaseLevel, CFX_WideString &wsText, const CFX_Int32Array &levels, FX_INT32 iStart, FX_BOOL bReverse = FALSE);
181 void FX_BidiReorder(FX_INT32 iBaseLevel, CFX_WideString &wsText, const CFX_Int32Array &levels);
182 class CFX_BidiChar FX_FINAL : public IFX_BidiChar
183 {
184 public:
185     CFX_BidiChar();
186     virtual void                Release() FX_OVERRIDE
187     {
188         delete this;
189     }
190     virtual void                SetPolicy(FX_BOOL bSeparateNeutral = TRUE) FX_OVERRIDE
191     {
192         m_bSeparateNeutral = bSeparateNeutral;
193     }
194     virtual FX_BOOL             AppendChar(FX_WCHAR wch) FX_OVERRIDE;
195     virtual FX_BOOL             EndChar() FX_OVERRIDE;
196     virtual FX_INT32    GetBidiInfo(FX_INT32 &iStart, FX_INT32 &iCount) FX_OVERRIDE;
197     virtual void                Reset() FX_OVERRIDE;
198
199 private:
200     ~CFX_BidiChar() { }
201     FX_BOOL             m_bSeparateNeutral;
202     FX_INT32    m_iCurStart;
203     FX_INT32    m_iCurCount;
204     FX_INT32    m_iCurBidi;
205     FX_INT32    m_iLastBidi;
206     FX_INT32    m_iLastStart;
207     FX_INT32    m_iLastCount;
208 };
209 #endif