OLD | NEW |
1 /* | 1 /* |
2 * Copyright © 2015 Mozilla Foundation. | 2 * Copyright © 2015 Mozilla Foundation. |
3 * Copyright © 2015 Google, Inc. | 3 * Copyright © 2015 Google, Inc. |
4 * | 4 * |
5 * This is part of HarfBuzz, a text shaping library. | 5 * This is part of HarfBuzz, a text shaping library. |
6 * | 6 * |
7 * Permission is hereby granted, without written agreement and without | 7 * Permission is hereby granted, without written agreement and without |
8 * license or royalty fees, to use, copy, modify, and distribute this | 8 * license or royalty fees, to use, copy, modify, and distribute this |
9 * software and its documentation for any purpose, provided that the | 9 * software and its documentation for any purpose, provided that the |
10 * above copyright notice and the following two paragraphs appear in | 10 * above copyright notice and the following two paragraphs appear in |
(...skipping 166 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
177 case HB_SCRIPT_NKO: | 177 case HB_SCRIPT_NKO: |
178 case HB_SCRIPT_PHAGS_PA: | 178 case HB_SCRIPT_PHAGS_PA: |
179 | 179 |
180 /* Unicode-6.0 additions */ | 180 /* Unicode-6.0 additions */ |
181 case HB_SCRIPT_MANDAIC: | 181 case HB_SCRIPT_MANDAIC: |
182 | 182 |
183 /* Unicode-7.0 additions */ | 183 /* Unicode-7.0 additions */ |
184 case HB_SCRIPT_MANICHAEAN: | 184 case HB_SCRIPT_MANICHAEAN: |
185 case HB_SCRIPT_PSALTER_PAHLAVI: | 185 case HB_SCRIPT_PSALTER_PAHLAVI: |
186 | 186 |
| 187 /* Unicode-9.0 additions */ |
| 188 case HB_SCRIPT_ADLAM: |
| 189 |
187 return true; | 190 return true; |
188 | 191 |
189 default: | 192 default: |
190 return false; | 193 return false; |
191 } | 194 } |
192 } | 195 } |
193 | 196 |
194 static void * | 197 static void * |
195 data_create_use (const hb_ot_shape_plan_t *plan) | 198 data_create_use (const hb_ot_shape_plan_t *plan) |
196 { | 199 { |
(...skipping 23 matching lines...) Expand all Loading... |
220 | 223 |
221 if (use_plan->arabic_plan) | 224 if (use_plan->arabic_plan) |
222 data_destroy_arabic (use_plan->arabic_plan); | 225 data_destroy_arabic (use_plan->arabic_plan); |
223 | 226 |
224 free (data); | 227 free (data); |
225 } | 228 } |
226 | 229 |
227 enum syllable_type_t { | 230 enum syllable_type_t { |
228 independent_cluster, | 231 independent_cluster, |
229 virama_terminated_cluster, | 232 virama_terminated_cluster, |
230 consonant_cluster, | 233 standard_cluster, |
231 vowel_cluster, | |
232 number_joiner_terminated_cluster, | 234 number_joiner_terminated_cluster, |
233 numeral_cluster, | 235 numeral_cluster, |
234 symbol_cluster, | 236 symbol_cluster, |
235 broken_cluster, | 237 broken_cluster, |
| 238 non_cluster, |
236 }; | 239 }; |
237 | 240 |
238 #include "hb-ot-shape-complex-use-machine.hh" | 241 #include "hb-ot-shape-complex-use-machine.hh" |
239 | 242 |
240 | 243 |
241 static void | 244 static void |
242 setup_masks_use (const hb_ot_shape_plan_t *plan, | 245 setup_masks_use (const hb_ot_shape_plan_t *plan, |
243 hb_buffer_t *buffer, | 246 hb_buffer_t *buffer, |
244 hb_font_t *font HB_UNUSED) | 247 hb_font_t *font HB_UNUSED) |
245 { | 248 { |
(...skipping 59 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
305 unsigned int last_start = 0; | 308 unsigned int last_start = 0; |
306 joining_form_t last_form = _NONE; | 309 joining_form_t last_form = _NONE; |
307 hb_glyph_info_t *info = buffer->info; | 310 hb_glyph_info_t *info = buffer->info; |
308 foreach_syllable (buffer, start, end) | 311 foreach_syllable (buffer, start, end) |
309 { | 312 { |
310 syllable_type_t syllable_type = (syllable_type_t) (info[start].syllable() &
0x0F); | 313 syllable_type_t syllable_type = (syllable_type_t) (info[start].syllable() &
0x0F); |
311 switch (syllable_type) | 314 switch (syllable_type) |
312 { | 315 { |
313 case independent_cluster: | 316 case independent_cluster: |
314 case symbol_cluster: | 317 case symbol_cluster: |
| 318 case non_cluster: |
315 /* These don't join. Nothing to do. */ | 319 /* These don't join. Nothing to do. */ |
316 last_form = _NONE; | 320 last_form = _NONE; |
317 break; | 321 break; |
318 | 322 |
319 case virama_terminated_cluster: | 323 case virama_terminated_cluster: |
320 case consonant_cluster: | 324 case standard_cluster: |
321 case vowel_cluster: | |
322 case number_joiner_terminated_cluster: | 325 case number_joiner_terminated_cluster: |
323 case numeral_cluster: | 326 case numeral_cluster: |
324 case broken_cluster: | 327 case broken_cluster: |
325 | 328 |
326 bool join = last_form == FINA || last_form == ISOL; | 329 bool join = last_form == FINA || last_form == ISOL; |
327 | 330 |
328 if (join) | 331 if (join) |
329 { | 332 { |
330 /* Fixup previous syllable's form. */ | 333 /* Fixup previous syllable's form. */ |
331 last_form = last_form == FINA ? MEDI : INIT; | 334 last_form = last_form == FINA ? MEDI : INIT; |
(...skipping 82 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
414 return info.use_category() == USE_H && !_hb_glyph_info_ligated (&info); | 417 return info.use_category() == USE_H && !_hb_glyph_info_ligated (&info); |
415 } | 418 } |
416 | 419 |
417 static void | 420 static void |
418 reorder_syllable (hb_buffer_t *buffer, unsigned int start, unsigned int end) | 421 reorder_syllable (hb_buffer_t *buffer, unsigned int start, unsigned int end) |
419 { | 422 { |
420 syllable_type_t syllable_type = (syllable_type_t) (buffer->info[start].syllabl
e() & 0x0F); | 423 syllable_type_t syllable_type = (syllable_type_t) (buffer->info[start].syllabl
e() & 0x0F); |
421 /* Only a few syllable types need reordering. */ | 424 /* Only a few syllable types need reordering. */ |
422 if (unlikely (!(FLAG_SAFE (syllable_type) & | 425 if (unlikely (!(FLAG_SAFE (syllable_type) & |
423 (FLAG (virama_terminated_cluster) | | 426 (FLAG (virama_terminated_cluster) | |
424 » » FLAG (consonant_cluster) | | 427 » » FLAG (standard_cluster) | |
425 » » FLAG (vowel_cluster) | | |
426 FLAG (broken_cluster) | | 428 FLAG (broken_cluster) | |
427 0)))) | 429 0)))) |
428 return; | 430 return; |
429 | 431 |
430 hb_glyph_info_t *info = buffer->info; | 432 hb_glyph_info_t *info = buffer->info; |
431 | 433 |
432 #define BASE_FLAGS (FLAG (USE_B) | FLAG (USE_GB) | FLAG (USE_IV)) | 434 #define BASE_FLAGS (FLAG (USE_B) | FLAG (USE_GB)) |
433 | 435 |
434 /* Move things forward. */ | 436 /* Move things forward. */ |
435 if (info[start].use_category() == USE_R && end - start > 1) | 437 if (info[start].use_category() == USE_R && end - start > 1) |
436 { | 438 { |
437 /* Got a repha. Reorder it to after first base, before first halant. */ | 439 /* Got a repha. Reorder it to after first base, before first halant. */ |
438 for (unsigned int i = start + 1; i < end; i++) | 440 for (unsigned int i = start + 1; i < end; i++) |
439 if ((FLAG_UNSAFE (info[i].use_category()) & (BASE_FLAGS)) || is_halant (in
fo[i])) | 441 if ((FLAG_UNSAFE (info[i].use_category()) & (BASE_FLAGS)) || is_halant (in
fo[i])) |
440 { | 442 { |
441 /* If we hit a halant, move before it; otherwise it's a base: move to it
's | 443 /* If we hit a halant, move before it; otherwise it's a base: move to it
's |
442 * place, and shift things in between backward. */ | 444 * place, and shift things in between backward. */ |
(...skipping 136 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
579 data_destroy_use, | 581 data_destroy_use, |
580 NULL, /* preprocess_text */ | 582 NULL, /* preprocess_text */ |
581 NULL, /* postprocess_glyphs */ | 583 NULL, /* postprocess_glyphs */ |
582 HB_OT_SHAPE_NORMALIZATION_MODE_COMPOSED_DIACRITICS_NO_SHORT_CIRCUIT, | 584 HB_OT_SHAPE_NORMALIZATION_MODE_COMPOSED_DIACRITICS_NO_SHORT_CIRCUIT, |
583 NULL, /* decompose */ | 585 NULL, /* decompose */ |
584 compose_use, | 586 compose_use, |
585 setup_masks_use, | 587 setup_masks_use, |
586 HB_OT_SHAPE_ZERO_WIDTH_MARKS_BY_GDEF_EARLY, | 588 HB_OT_SHAPE_ZERO_WIDTH_MARKS_BY_GDEF_EARLY, |
587 false, /* fallback_position */ | 589 false, /* fallback_position */ |
588 }; | 590 }; |
OLD | NEW |