OLD | NEW |
1 /* | 1 /* |
2 * Copyright © 2012 Google, Inc. | 2 * Copyright © 2012 Google, Inc. |
3 * | 3 * |
4 * This is part of HarfBuzz, a text shaping library. | 4 * This is part of HarfBuzz, a text shaping library. |
5 * | 5 * |
6 * Permission is hereby granted, without written agreement and without | 6 * Permission is hereby granted, without written agreement and without |
7 * license or royalty fees, to use, copy, modify, and distribute this | 7 * license or royalty fees, to use, copy, modify, and distribute this |
8 * software and its documentation for any purpose, provided that the | 8 * software and its documentation for any purpose, provided that the |
9 * above copyright notice and the following two paragraphs appear in | 9 * above copyright notice and the following two paragraphs appear in |
10 * all copies of this software. | 10 * all copies of this software. |
(...skipping 35 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
46 OT_C = 1, | 46 OT_C = 1, |
47 OT_V = 2, | 47 OT_V = 2, |
48 OT_N = 3, | 48 OT_N = 3, |
49 OT_H = 4, | 49 OT_H = 4, |
50 OT_ZWNJ = 5, | 50 OT_ZWNJ = 5, |
51 OT_ZWJ = 6, | 51 OT_ZWJ = 6, |
52 OT_M = 7, | 52 OT_M = 7, |
53 OT_SM = 8, | 53 OT_SM = 8, |
54 OT_VD = 9, | 54 OT_VD = 9, |
55 OT_A = 10, | 55 OT_A = 10, |
56 OT_NBSP = 11, | 56 OT_PLACEHOLDER = 11, |
57 OT_DOTTEDCIRCLE = 12, | 57 OT_DOTTEDCIRCLE = 12, |
58 OT_RS = 13, /* Register Shifter, used in Khmer OT spec. */ | 58 OT_RS = 13, /* Register Shifter, used in Khmer OT spec. */ |
59 OT_Coeng = 14, /* Khmer-style Virama. */ | 59 OT_Coeng = 14, /* Khmer-style Virama. */ |
60 OT_Repha = 15, /* Atomically-encoded logical or visual repha. */ | 60 OT_Repha = 15, /* Atomically-encoded logical or visual repha. */ |
61 OT_Ra = 16, | 61 OT_Ra = 16, |
62 OT_CM = 17, /* Consonant-Medial. */ | 62 OT_CM = 17, /* Consonant-Medial. */ |
63 OT_Avag = 18, /* Avagraha. */ | 63 OT_Symbol = 18, /* Avagraha, etc that take marks (SM,A,VD). */ |
64 OT_CM2 = 31 /* Consonant-Medial, second slot. */ | 64 OT_CM2 = 31 /* Consonant-Medial, second slot. */ |
65 }; | 65 }; |
66 | 66 |
| 67 #define MEDIAL_FLAGS (FLAG (OT_CM) | FLAG (OT_CM2)) |
| 68 |
| 69 /* Note: |
| 70 * |
| 71 * We treat Vowels and placeholders as if they were consonants. This is safe be
cause Vowels |
| 72 * cannot happen in a consonant syllable. The plus side however is, we can call
the |
| 73 * consonant syllable logic from the vowel syllable function and get it all righ
t! */ |
| 74 #define CONSONANT_FLAGS (FLAG (OT_C) | FLAG (OT_Ra) | MEDIAL_FLAGS | FLAG (OT_V)
| FLAG (OT_PLACEHOLDER) | FLAG (OT_DOTTEDCIRCLE)) |
| 75 #define JOINER_FLAGS (FLAG (OT_ZWJ) | FLAG (OT_ZWNJ)) |
| 76 #define HALANT_OR_COENG_FLAGS (FLAG (OT_H) | FLAG (OT_Coeng)) |
| 77 |
| 78 |
67 /* Visual positions in a syllable from left to right. */ | 79 /* Visual positions in a syllable from left to right. */ |
68 enum indic_position_t { | 80 enum indic_position_t { |
69 POS_START, | 81 POS_START, |
70 | 82 |
71 POS_RA_TO_BECOME_REPH, | 83 POS_RA_TO_BECOME_REPH, |
72 POS_PRE_M, | 84 POS_PRE_M, |
73 POS_PRE_C, | 85 POS_PRE_C, |
74 | 86 |
75 POS_BASE_C, | 87 POS_BASE_C, |
76 POS_AFTER_MAIN, | 88 POS_AFTER_MAIN, |
77 | 89 |
78 POS_ABOVE_C, | 90 POS_ABOVE_C, |
79 | 91 |
80 POS_BEFORE_SUB, | 92 POS_BEFORE_SUB, |
81 POS_BELOW_C, | 93 POS_BELOW_C, |
82 POS_AFTER_SUB, | 94 POS_AFTER_SUB, |
83 | 95 |
84 POS_BEFORE_POST, | 96 POS_BEFORE_POST, |
85 POS_POST_C, | 97 POS_POST_C, |
86 POS_AFTER_POST, | 98 POS_AFTER_POST, |
87 | 99 |
88 POS_FINAL_C, | 100 POS_FINAL_C, |
89 POS_SMVD, | 101 POS_SMVD, |
90 | 102 |
91 POS_END | 103 POS_END |
92 }; | 104 }; |
93 | 105 |
94 /* Categories used in IndicSyllabicCategory.txt from UCD. */ | 106 /* Categories used in IndicSyllabicCategory.txt from UCD. */ |
95 enum indic_syllabic_category_t { | 107 enum indic_syllabic_category_t { |
96 INDIC_SYLLABIC_CATEGORY_OTHER»» » = OT_X, | 108 INDIC_SYLLABIC_CATEGORY_OTHER»» » » = OT_X, |
97 | 109 |
98 INDIC_SYLLABIC_CATEGORY_AVAGRAHA» » = OT_Avag, | 110 INDIC_SYLLABIC_CATEGORY_AVAGRAHA» » » = OT_Symbol, |
99 INDIC_SYLLABIC_CATEGORY_BINDU»» » = OT_SM, | 111 INDIC_SYLLABIC_CATEGORY_BINDU»» » » = OT_SM, |
100 INDIC_SYLLABIC_CATEGORY_CONSONANT» » = OT_C, | 112 INDIC_SYLLABIC_CATEGORY_BRAHMI_JOINING_NUMBER»» = OT_PLACEHOLDER, /* TOD
O */ |
101 INDIC_SYLLABIC_CATEGORY_CONSONANT_DEAD» = OT_C, | 113 INDIC_SYLLABIC_CATEGORY_CANTILLATION_MARK» » = OT_A, |
102 INDIC_SYLLABIC_CATEGORY_CONSONANT_FINAL» = OT_CM, | 114 INDIC_SYLLABIC_CATEGORY_CONSONANT» » » = OT_C, |
103 INDIC_SYLLABIC_CATEGORY_CONSONANT_HEAD_LETTER»= OT_C, | 115 INDIC_SYLLABIC_CATEGORY_CONSONANT_DEAD» » = OT_C, |
104 INDIC_SYLLABIC_CATEGORY_CONSONANT_MEDIAL» = OT_CM, | 116 INDIC_SYLLABIC_CATEGORY_CONSONANT_FINAL» » = OT_CM, |
105 INDIC_SYLLABIC_CATEGORY_CONSONANT_PLACEHOLDER»= OT_NBSP, | 117 INDIC_SYLLABIC_CATEGORY_CONSONANT_HEAD_LETTER»» = OT_C, |
106 INDIC_SYLLABIC_CATEGORY_CONSONANT_SUBJOINED» = OT_CM, | 118 INDIC_SYLLABIC_CATEGORY_CONSONANT_MEDIAL» » = OT_CM, |
107 INDIC_SYLLABIC_CATEGORY_CONSONANT_REPHA» = OT_Repha, | 119 INDIC_SYLLABIC_CATEGORY_CONSONANT_PLACEHOLDER»» = OT_PLACEHOLDER, |
108 INDIC_SYLLABIC_CATEGORY_MODIFYING_LETTER» = OT_X, | 120 INDIC_SYLLABIC_CATEGORY_CONSONANT_PRECEDING_REPHA» = OT_Repha, |
109 INDIC_SYLLABIC_CATEGORY_NUKTA»» » = OT_N, | 121 INDIC_SYLLABIC_CATEGORY_CONSONANT_SUBJOINED» » = OT_CM, |
110 INDIC_SYLLABIC_CATEGORY_REGISTER_SHIFTER» = OT_RS, | 122 INDIC_SYLLABIC_CATEGORY_CONSONANT_SUCCEEDING_REPHA» = OT_N, |
111 INDIC_SYLLABIC_CATEGORY_TONE_LETTER» » = OT_X, | 123 INDIC_SYLLABIC_CATEGORY_GEMINATION_MARK» » = OT_SM, |
112 INDIC_SYLLABIC_CATEGORY_TONE_MARK» » = OT_N, | 124 INDIC_SYLLABIC_CATEGORY_INVISIBLE_STACKER» » = OT_H, /* TODO */ |
113 INDIC_SYLLABIC_CATEGORY_VIRAMA» » = OT_H, | 125 INDIC_SYLLABIC_CATEGORY_JOINER» » » = OT_ZWJ, |
114 INDIC_SYLLABIC_CATEGORY_VISARGA» » = OT_SM, | 126 INDIC_SYLLABIC_CATEGORY_MODIFYING_LETTER» » = OT_X, |
115 INDIC_SYLLABIC_CATEGORY_VOWEL»» » = OT_V, | 127 INDIC_SYLLABIC_CATEGORY_NON_JOINER» » » = OT_ZWNJ, |
116 INDIC_SYLLABIC_CATEGORY_VOWEL_DEPENDENT» = OT_M, | 128 INDIC_SYLLABIC_CATEGORY_NUKTA»» » » = OT_N, |
117 INDIC_SYLLABIC_CATEGORY_VOWEL_INDEPENDENT» = OT_V | 129 INDIC_SYLLABIC_CATEGORY_NUMBER» » » = OT_PLACEHOLDER, |
| 130 INDIC_SYLLABIC_CATEGORY_NUMBER_JOINER»» » = OT_PLACEHOLDER, /* TOD
O */ |
| 131 INDIC_SYLLABIC_CATEGORY_PURE_KILLER» » » = OT_H, /* TODO */ |
| 132 INDIC_SYLLABIC_CATEGORY_REGISTER_SHIFTER» » = OT_RS, |
| 133 INDIC_SYLLABIC_CATEGORY_TONE_LETTER» » » = OT_X, |
| 134 INDIC_SYLLABIC_CATEGORY_TONE_MARK» » » = OT_N, |
| 135 INDIC_SYLLABIC_CATEGORY_VIRAMA» » » = OT_H, |
| 136 INDIC_SYLLABIC_CATEGORY_VISARGA» » » = OT_SM, |
| 137 INDIC_SYLLABIC_CATEGORY_VOWEL»» » » = OT_V, |
| 138 INDIC_SYLLABIC_CATEGORY_VOWEL_DEPENDENT» » = OT_M, |
| 139 INDIC_SYLLABIC_CATEGORY_VOWEL_INDEPENDENT» » = OT_V |
118 }; | 140 }; |
119 | 141 |
120 /* Categories used in IndicSMatraCategory.txt from UCD */ | 142 /* Categories used in IndicSMatraCategory.txt from UCD */ |
121 enum indic_matra_category_t { | 143 enum indic_matra_category_t { |
122 INDIC_MATRA_CATEGORY_NOT_APPLICABLE» » = POS_END, | 144 INDIC_MATRA_CATEGORY_NOT_APPLICABLE» » » = POS_END, |
123 | 145 |
124 INDIC_MATRA_CATEGORY_LEFT» » » = POS_PRE_C, | 146 INDIC_MATRA_CATEGORY_LEFT» » » » = POS_PRE_C, |
125 INDIC_MATRA_CATEGORY_TOP» » » = POS_ABOVE_C, | 147 INDIC_MATRA_CATEGORY_TOP» » » » = POS_ABOVE_C, |
126 INDIC_MATRA_CATEGORY_BOTTOM» » » = POS_BELOW_C, | 148 INDIC_MATRA_CATEGORY_BOTTOM» » » » = POS_BELOW_C, |
127 INDIC_MATRA_CATEGORY_RIGHT» » » = POS_POST_C, | 149 INDIC_MATRA_CATEGORY_RIGHT» » » » = POS_POST_C, |
128 | 150 |
129 /* These should resolve to the position of the last part of the split sequence
. */ | 151 /* These should resolve to the position of the last part of the split sequence
. */ |
130 INDIC_MATRA_CATEGORY_BOTTOM_AND_RIGHT»» = INDIC_MATRA_CATEGORY_RIGHT, | 152 INDIC_MATRA_CATEGORY_BOTTOM_AND_RIGHT»» » = INDIC_MATRA_CATEGORY_R
IGHT, |
131 INDIC_MATRA_CATEGORY_LEFT_AND_RIGHT» » = INDIC_MATRA_CATEGORY_RIGHT, | 153 INDIC_MATRA_CATEGORY_LEFT_AND_RIGHT» » » = INDIC_MATRA_CATEGORY_R
IGHT, |
132 INDIC_MATRA_CATEGORY_TOP_AND_BOTTOM» » = INDIC_MATRA_CATEGORY_BOTTOM, | 154 INDIC_MATRA_CATEGORY_TOP_AND_BOTTOM» » » = INDIC_MATRA_CATEGORY_B
OTTOM, |
133 INDIC_MATRA_CATEGORY_TOP_AND_BOTTOM_AND_RIGHT»= INDIC_MATRA_CATEGORY_RIGHT, | 155 INDIC_MATRA_CATEGORY_TOP_AND_BOTTOM_AND_RIGHT»» = INDIC_MATRA_CATEGORY_R
IGHT, |
134 INDIC_MATRA_CATEGORY_TOP_AND_LEFT» » = INDIC_MATRA_CATEGORY_TOP, | 156 INDIC_MATRA_CATEGORY_TOP_AND_LEFT» » » = INDIC_MATRA_CATEGORY_T
OP, |
135 INDIC_MATRA_CATEGORY_TOP_AND_LEFT_AND_RIGHT» = INDIC_MATRA_CATEGORY_RIGHT, | 157 INDIC_MATRA_CATEGORY_TOP_AND_LEFT_AND_RIGHT» » = INDIC_MATRA_CATEGORY_R
IGHT, |
136 INDIC_MATRA_CATEGORY_TOP_AND_RIGHT» » = INDIC_MATRA_CATEGORY_RIGHT, | 158 INDIC_MATRA_CATEGORY_TOP_AND_RIGHT» » » = INDIC_MATRA_CATEGORY_R
IGHT, |
137 | 159 |
138 INDIC_MATRA_CATEGORY_INVISIBLE» » = INDIC_MATRA_CATEGORY_NOT_APPLI
CABLE, | 160 INDIC_MATRA_CATEGORY_OVERSTRUCK» » » = POS_AFTER_MAIN, |
139 INDIC_MATRA_CATEGORY_OVERSTRUCK» » = POS_AFTER_MAIN, | 161 INDIC_MATRA_CATEGORY_VISUAL_ORDER_LEFT» » = POS_PRE_M |
140 INDIC_MATRA_CATEGORY_VISUAL_ORDER_LEFT» = POS_PRE_M | |
141 }; | 162 }; |
142 | 163 |
143 /* Note: We use ASSERT_STATIC_EXPR_ZERO() instead of ASSERT_STATIC_EXPR() and th
e comma operation | 164 /* Note: We use ASSERT_STATIC_EXPR_ZERO() instead of ASSERT_STATIC_EXPR() and th
e comma operation |
144 * because gcc fails to optimize the latter and fills the table in at runtime. *
/ | 165 * because gcc fails to optimize the latter and fills the table in at runtime. *
/ |
145 #define INDIC_COMBINE_CATEGORIES(S,M) \ | 166 #define INDIC_COMBINE_CATEGORIES(S,M) \ |
146 (ASSERT_STATIC_EXPR_ZERO (M == INDIC_MATRA_CATEGORY_NOT_APPLICABLE || (S == IN
DIC_SYLLABIC_CATEGORY_VIRAMA || S == INDIC_SYLLABIC_CATEGORY_VOWEL_DEPENDENT)) +
\ | 167 (ASSERT_STATIC_EXPR_ZERO (M == INDIC_MATRA_CATEGORY_NOT_APPLICABLE || \ |
| 168 » » » ( \ |
| 169 » » » S == INDIC_SYLLABIC_CATEGORY_CONSONANT_MEDIAL || \ |
| 170 » » » S == INDIC_SYLLABIC_CATEGORY_GEMINATION_MARK || \ |
| 171 » » » S == INDIC_SYLLABIC_CATEGORY_REGISTER_SHIFTER || \ |
| 172 » » » S == INDIC_SYLLABIC_CATEGORY_CONSONANT_SUCCEEDING_R
EPHA || \ |
| 173 » » » S == INDIC_SYLLABIC_CATEGORY_VIRAMA || \ |
| 174 » » » S == INDIC_SYLLABIC_CATEGORY_VOWEL_DEPENDENT || \ |
| 175 » » » false)) + \ |
147 ASSERT_STATIC_EXPR_ZERO (S < 255 && M < 255) + \ | 176 ASSERT_STATIC_EXPR_ZERO (S < 255 && M < 255) + \ |
148 ((M << 8) | S)) | 177 ((M << 8) | S)) |
149 | 178 |
150 HB_INTERNAL INDIC_TABLE_ELEMENT_TYPE | 179 HB_INTERNAL INDIC_TABLE_ELEMENT_TYPE |
151 hb_indic_get_categories (hb_codepoint_t u); | 180 hb_indic_get_categories (hb_codepoint_t u); |
152 | 181 |
153 #endif /* HB_OT_SHAPE_COMPLEX_INDIC_PRIVATE_HH */ | 182 #endif /* HB_OT_SHAPE_COMPLEX_INDIC_PRIVATE_HH */ |
OLD | NEW |