]>
Commit | Line | Data |
---|---|---|
1 | /* | |
2 | * | |
3 | * (C) Copyright IBM Corp. 1998-2005 - All Rights Reserved | |
4 | * | |
5 | */ | |
6 | ||
7 | #ifndef __THAISHAPING_H | |
8 | #define __THAISHAPING_H | |
9 | ||
10 | /** | |
11 | * \file | |
12 | * \internal | |
13 | */ | |
14 | ||
15 | #include "LETypes.h" | |
16 | #include "LEGlyphFilter.h" | |
17 | #include "OpenTypeTables.h" | |
18 | ||
19 | U_NAMESPACE_BEGIN | |
20 | ||
21 | class LEGlyphStorage; | |
22 | ||
23 | class ThaiShaping /* not : public UObject because all methods are static */ { | |
24 | public: | |
25 | ||
26 | enum { | |
27 | // Character classes | |
28 | NON = 0, | |
29 | CON = 1, | |
30 | COA = 2, | |
31 | COD = 3, | |
32 | LVO = 4, | |
33 | FV1 = 5, | |
34 | FV2 = 6, | |
35 | FV3 = 7, | |
36 | BV1 = 8, | |
37 | BV2 = 9, | |
38 | BDI = 10, | |
39 | TON = 11, | |
40 | AD1 = 12, | |
41 | AD2 = 13, | |
42 | AD3 = 14, | |
43 | NIK = 15, | |
44 | AV1 = 16, | |
45 | AV2 = 17, | |
46 | AV3 = 18, | |
47 | classCount = 19, | |
48 | ||
49 | // State Transition actions | |
50 | tA = 0, | |
51 | tC = 1, | |
52 | tD = 2, | |
53 | tE = 3, | |
54 | tF = 4, | |
55 | tG = 5, | |
56 | tH = 6, | |
57 | tR = 7, | |
58 | tS = 8 | |
59 | }; | |
60 | ||
61 | struct StateTransition | |
62 | { | |
63 | le_uint8 nextState; | |
64 | le_uint8 action; | |
65 | ||
66 | le_uint8 getNextState() { return nextState; }; | |
67 | le_uint8 getAction() { return action; }; | |
68 | }; | |
69 | ||
70 | static le_int32 compose(const LEUnicode *input, le_int32 offset, le_int32 charCount, le_uint8 glyphSet, | |
71 | LEUnicode errorChar, LEUnicode *output, LEGlyphStorage &glyphStorage); | |
72 | ||
73 | private: | |
74 | // forbid instantiation | |
75 | ThaiShaping(); | |
76 | ||
77 | static const le_uint8 classTable[]; | |
78 | static const StateTransition thaiStateTable[][classCount]; | |
79 | ||
80 | inline static StateTransition getTransition(le_uint8 state, le_uint8 currClass); | |
81 | ||
82 | static le_uint8 doTransition(StateTransition transition, LEUnicode currChar, le_int32 inputIndex, le_uint8 glyphSet, | |
83 | LEUnicode errorChar, LEUnicode *outputBuffer, LEGlyphStorage &glyphStorage, le_int32 &outputIndex); | |
84 | ||
85 | static le_uint8 getNextState(LEUnicode ch, le_uint8 state, le_int32 inputIndex, le_uint8 glyphSet, LEUnicode errorChar, | |
86 | le_uint8 &charClass, LEUnicode *output, LEGlyphStorage &glyphStorage, le_int32 &outputIndex); | |
87 | ||
88 | static le_bool isLegalHere(LEUnicode ch, le_uint8 prevState); | |
89 | static le_uint8 getCharClass(LEUnicode ch); | |
90 | ||
91 | static LEUnicode noDescenderCOD(LEUnicode cod, le_uint8 glyphSet); | |
92 | static LEUnicode leftAboveVowel(LEUnicode vowel, le_uint8 glyphSet); | |
93 | static LEUnicode lowerBelowVowel(LEUnicode vowel, le_uint8 glyphSet); | |
94 | static LEUnicode lowerRightTone(LEUnicode tone, le_uint8 glyphSet); | |
95 | static LEUnicode lowerLeftTone(LEUnicode tone, le_uint8 glyphSet); | |
96 | static LEUnicode upperLeftTone(LEUnicode tone, le_uint8 glyphSet); | |
97 | ||
98 | }; | |
99 | ||
100 | inline ThaiShaping::StateTransition ThaiShaping::getTransition(le_uint8 state, le_uint8 currClass) | |
101 | { | |
102 | return thaiStateTable[state][currClass]; | |
103 | } | |
104 | ||
105 | U_NAMESPACE_END | |
106 | #endif | |
107 | ||
108 |