diff --git a/src/hb-ot-shape-complex-indic-private.hh b/src/hb-ot-shape-complex-indic-private.hh index 7bf282e74..681391ea0 100644 --- a/src/hb-ot-shape-complex-indic-private.hh +++ b/src/hb-ot-shape-complex-indic-private.hh @@ -83,8 +83,7 @@ enum indic_position_t { POS_SMVD }; -/* Categories used in IndicSyllabicCategory.txt from UCD */ -/* The assignments are guesswork */ +/* Categories used in IndicSyllabicCategory.txt from UCD. */ enum indic_syllabic_category_t { INDIC_SYLLABIC_CATEGORY_OTHER = OT_X, diff --git a/src/hb-ot-shape-complex-indic.cc b/src/hb-ot-shape-complex-indic.cc index dff464b86..c1d731c85 100644 --- a/src/hb-ot-shape-complex-indic.cc +++ b/src/hb-ot-shape-complex-indic.cc @@ -67,7 +67,10 @@ is_joiner (const hb_glyph_info_t &info) static bool is_consonant (const hb_glyph_info_t &info) { - return !!(FLAG (info.indic_category()) & (FLAG (OT_C) | FLAG (OT_Ra))); + /* Note: We treat Vowels as if they were consonants. This is safe because Vowels + * cannot happen in a consonant syllable. The plus side however is, we can call the + * consonant syllable logic from the vowel syllable function and get it all right! */ + return !!(FLAG (info.indic_category()) & (FLAG (OT_C) | FLAG (OT_Ra) | FLAG (OT_V))); } static const struct { @@ -417,10 +420,8 @@ static void initial_reordering_vowel_syllable (const hb_ot_map_t *map, hb_buffer_t *buffer, hb_mask_t *mask_array, unsigned int start, unsigned int end) { - /* TODO - * Not clear to me how this should work. Do the matras move to before the - * independent vowel? No idea. - */ + /* We made the vowels look like consonants. So let's call the consonant logic! */ + initial_reordering_consonant_syllable (map, buffer, mask_array, start, end); } static void