113 if (unlikely (unicode == 0x1A60u)) return 254; |
113 if (unlikely (unicode == 0x1A60u)) return 254; |
114 |
114 |
115 /* XXX This hack belongs to the Tibetan shaper: |
115 /* XXX This hack belongs to the Tibetan shaper: |
116 * Reorder PADMA to ensure it comes after any vowel marks. */ |
116 * Reorder PADMA to ensure it comes after any vowel marks. */ |
117 if (unlikely (unicode == 0x0FC6u)) return 254; |
117 if (unlikely (unicode == 0x0FC6u)) return 254; |
|
118 /* Reorder TSA -PHRU to reorder before U+0F74 */ |
|
119 if (unlikely (unicode == 0x0F39u)) return 127; |
118 |
120 |
119 return _hb_modified_combining_class[combining_class (unicode)]; |
121 return _hb_modified_combining_class[combining_class (unicode)]; |
120 } |
122 } |
121 |
123 |
122 static inline hb_bool_t |
124 static inline hb_bool_t |
178 case 0x03: return unlikely (ch == 0x034Fu); |
180 case 0x03: return unlikely (ch == 0x034Fu); |
179 case 0x06: return unlikely (ch == 0x061Cu); |
181 case 0x06: return unlikely (ch == 0x061Cu); |
180 case 0x17: return hb_in_range (ch, 0x17B4u, 0x17B5u); |
182 case 0x17: return hb_in_range (ch, 0x17B4u, 0x17B5u); |
181 case 0x18: return hb_in_range (ch, 0x180Bu, 0x180Eu); |
183 case 0x18: return hb_in_range (ch, 0x180Bu, 0x180Eu); |
182 case 0x20: return hb_in_ranges (ch, 0x200Bu, 0x200Fu, |
184 case 0x20: return hb_in_ranges (ch, 0x200Bu, 0x200Fu, |
183 0x202Au, 0x202Eu, |
185 0x202Au, 0x202Eu, |
184 0x2060u, 0x206Fu); |
186 0x2060u, 0x206Fu); |
185 case 0xFE: return hb_in_range (ch, 0xFE00u, 0xFE0Fu) || ch == 0xFEFFu; |
187 case 0xFE: return hb_in_range (ch, 0xFE00u, 0xFE0Fu) || ch == 0xFEFFu; |
186 case 0xFF: return hb_in_range (ch, 0xFFF0u, 0xFFF8u); |
188 case 0xFF: return hb_in_range (ch, 0xFFF0u, 0xFFF8u); |
187 default: return false; |
189 default: return false; |
188 } |
190 } |
189 } |
191 } |
197 default: return false; |
199 default: return false; |
198 } |
200 } |
199 } |
201 } |
200 } |
202 } |
201 |
203 |
|
204 /* Space estimates based on: |
|
205 * http://www.unicode.org/charts/PDF/U2000.pdf |
|
206 * https://www.microsoft.com/typography/developers/fdsspec/spaces.aspx |
|
207 */ |
|
208 enum space_t { |
|
209 NOT_SPACE = 0, |
|
210 SPACE_EM = 1, |
|
211 SPACE_EM_2 = 2, |
|
212 SPACE_EM_3 = 3, |
|
213 SPACE_EM_4 = 4, |
|
214 SPACE_EM_5 = 5, |
|
215 SPACE_EM_6 = 6, |
|
216 SPACE_EM_16 = 16, |
|
217 SPACE_4_EM_18, /* 4/18th of an EM! */ |
|
218 SPACE, |
|
219 SPACE_FIGURE, |
|
220 SPACE_PUNCTUATION, |
|
221 SPACE_NARROW, |
|
222 }; |
|
223 static inline space_t |
|
224 space_fallback_type (hb_codepoint_t u) |
|
225 { |
|
226 switch (u) |
|
227 { |
|
228 /* All GC=Zs chars that can use a fallback. */ |
|
229 default: return NOT_SPACE; /* U+1680 OGHAM SPACE MARK */ |
|
230 case 0x0020u: return SPACE; /* U+0020 SPACE */ |
|
231 case 0x00A0u: return SPACE; /* U+00A0 NO-BREAK SPACE */ |
|
232 case 0x2000u: return SPACE_EM_2; /* U+2000 EN QUAD */ |
|
233 case 0x2001u: return SPACE_EM; /* U+2001 EM QUAD */ |
|
234 case 0x2002u: return SPACE_EM_2; /* U+2002 EN SPACE */ |
|
235 case 0x2003u: return SPACE_EM; /* U+2003 EM SPACE */ |
|
236 case 0x2004u: return SPACE_EM_3; /* U+2004 THREE-PER-EM SPACE */ |
|
237 case 0x2005u: return SPACE_EM_4; /* U+2005 FOUR-PER-EM SPACE */ |
|
238 case 0x2006u: return SPACE_EM_6; /* U+2006 SIX-PER-EM SPACE */ |
|
239 case 0x2007u: return SPACE_FIGURE; /* U+2007 FIGURE SPACE */ |
|
240 case 0x2008u: return SPACE_PUNCTUATION; /* U+2008 PUNCTUATION SPACE */ |
|
241 case 0x2009u: return SPACE_EM_5; /* U+2009 THIN SPACE */ |
|
242 case 0x200Au: return SPACE_EM_16; /* U+200A HAIR SPACE */ |
|
243 case 0x202Fu: return SPACE_NARROW; /* U+202F NARROW NO-BREAK SPACE */ |
|
244 case 0x205Fu: return SPACE_4_EM_18; /* U+205F MEDIUM MATHEMATICAL SPACE */ |
|
245 case 0x3000u: return SPACE_EM; /* U+3000 IDEOGRAPHIC SPACE */ |
|
246 } |
|
247 } |
202 |
248 |
203 struct { |
249 struct { |
204 #define HB_UNICODE_FUNC_IMPLEMENT(name) hb_unicode_##name##_func_t name; |
250 #define HB_UNICODE_FUNC_IMPLEMENT(name) hb_unicode_##name##_func_t name; |
205 HB_UNICODE_FUNCS_IMPLEMENT_CALLBACKS |
251 HB_UNICODE_FUNCS_IMPLEMENT_CALLBACKS |
206 #undef HB_UNICODE_FUNC_IMPLEMENT |
252 #undef HB_UNICODE_FUNC_IMPLEMENT |
297 |
343 |
298 /* Lao */ |
344 /* Lao */ |
299 #define HB_MODIFIED_COMBINING_CLASS_CCC118 118 /* sign u / sign uu */ |
345 #define HB_MODIFIED_COMBINING_CLASS_CCC118 118 /* sign u / sign uu */ |
300 #define HB_MODIFIED_COMBINING_CLASS_CCC122 122 /* mai * */ |
346 #define HB_MODIFIED_COMBINING_CLASS_CCC122 122 /* mai * */ |
301 |
347 |
302 /* Tibetan */ |
348 /* Tibetan |
|
349 * Modify U+0F74 (ccc=132) to reorder before ccc=130 marks. |
|
350 */ |
303 #define HB_MODIFIED_COMBINING_CLASS_CCC129 129 /* sign aa */ |
351 #define HB_MODIFIED_COMBINING_CLASS_CCC129 129 /* sign aa */ |
304 #define HB_MODIFIED_COMBINING_CLASS_CCC130 130 /* sign i */ |
352 #define HB_MODIFIED_COMBINING_CLASS_CCC130 130 /* sign i */ |
305 #define HB_MODIFIED_COMBINING_CLASS_CCC132 132 /* sign u */ |
353 #define HB_MODIFIED_COMBINING_CLASS_CCC132 128 /* sign u */ |
306 |
354 |
307 |
355 |
308 /* Misc */ |
356 /* Misc */ |
309 |
357 |
310 #define HB_UNICODE_GENERAL_CATEGORY_IS_MARK(gen_cat) \ |
358 #define HB_UNICODE_GENERAL_CATEGORY_IS_MARK(gen_cat) \ |
311 (FLAG_SAFE (gen_cat) & \ |
359 (FLAG_SAFE (gen_cat) & \ |
312 (FLAG (HB_UNICODE_GENERAL_CATEGORY_SPACING_MARK) | \ |
360 (FLAG (HB_UNICODE_GENERAL_CATEGORY_SPACING_MARK) | \ |
313 FLAG (HB_UNICODE_GENERAL_CATEGORY_ENCLOSING_MARK) | \ |
361 FLAG (HB_UNICODE_GENERAL_CATEGORY_ENCLOSING_MARK) | \ |
314 FLAG (HB_UNICODE_GENERAL_CATEGORY_NON_SPACING_MARK))) |
362 FLAG (HB_UNICODE_GENERAL_CATEGORY_NON_SPACING_MARK))) |
315 |
363 |
|
364 #define HB_UNICODE_GENERAL_CATEGORY_IS_NON_ENCLOSING_MARK_OR_MODIFIER_SYMBOL(gen_cat) \ |
|
365 (FLAG_SAFE (gen_cat) & \ |
|
366 (FLAG (HB_UNICODE_GENERAL_CATEGORY_SPACING_MARK) | \ |
|
367 FLAG (HB_UNICODE_GENERAL_CATEGORY_NON_SPACING_MARK) | \ |
|
368 FLAG (HB_UNICODE_GENERAL_CATEGORY_MODIFIER_SYMBOL))) |
316 |
369 |
317 #endif /* HB_UNICODE_PRIVATE_HH */ |
370 #endif /* HB_UNICODE_PRIVATE_HH */ |