diff --git a/src/hb-ot-shape-complex-indic.cc b/src/hb-ot-shape-complex-indic.cc index 10ec5c5da..feb5136ab 100644 --- a/src/hb-ot-shape-complex-indic.cc +++ b/src/hb-ot-shape-complex-indic.cc @@ -493,13 +493,17 @@ initial_reordering_consonant_syllable (const hb_ot_map_t *map, hb_buffer_t *buff } /* XXX This will not match for old-Indic spec since the Halant-Ra order is reversed already. */ - if (basic_mask_array[PREF] && - base + 3 <= end && - info[base + 1].indic_category() == OT_H && - info[base + 2].indic_category() == OT_Ra) + if (basic_mask_array[PREF] && base + 3 <= end) { - info[base + 1].mask |= basic_mask_array[PREF]; - info[base + 2].mask |= basic_mask_array[PREF]; + /* Find a Halant,Ra sequence and mark it fore pre-base reordering processing. */ + for (unsigned int i = base + 1; i + 1 < end; i++) + if (info[i].indic_category() == OT_H && + info[i + 1].indic_category() == OT_Ra) + { + info[i].mask |= basic_mask_array[PREF]; + info[i + 1].mask |= basic_mask_array[PREF]; + break; + } } /* Apply ZWJ/ZWNJ effects */ @@ -815,40 +819,44 @@ final_reordering_syllable (hb_buffer_t *buffer, if (pref_mask && base + 1 < end) /* Otherwise there can't be any pre-base reordering Ra. */ { - /* 1. Only reorder a glyph produced by substitution during application - * of the feature. (Note that a font may shape a Ra consonant with - * the feature generally but block it in certain contexts.) - */ - if ((info[base + 1].mask & pref_mask) != 0 && - (base + 2 == end || - (info[base + 2].mask & pref_mask) == 0)) - { - /* - * 2. Try to find a target position the same way as for pre-base matra. - * If it is found, reorder pre-base consonant glyph. - * - * 3. If position is not found, reorder immediately before main - * consonant. - */ - - unsigned int new_pos = base; - while (new_pos > start + 1 && - !(FLAG (info[new_pos - 1].indic_category()) & (FLAG (OT_M) | FLAG (OT_H)))) - new_pos--; - - if (new_pos > start && info[new_pos - 1].indic_category() == OT_H) - /* -> If ZWJ or ZWNJ follow this halant, position is moved after it. */ - if (new_pos < end && is_joiner (info[new_pos])) - new_pos++; - + for (unsigned int i = base + 1; i < end; i++) + if ((info[i].mask & pref_mask) != 0) { - unsigned int old_pos = base + 1; - hb_glyph_info_t tmp = info[old_pos]; - memmove (&info[new_pos + 1], &info[new_pos], (old_pos - new_pos) * sizeof (info[0])); - info[new_pos] = tmp; - start_of_last_cluster = MIN (new_pos, start_of_last_cluster); + /* 1. Only reorder a glyph produced by substitution during application + * of the feature. (Note that a font may shape a Ra consonant with + * the feature generally but block it in certain contexts.) + */ + if (i + 1 == end || (info[i + 1].mask & pref_mask) == 0) + { + /* + * 2. Try to find a target position the same way as for pre-base matra. + * If it is found, reorder pre-base consonant glyph. + * + * 3. If position is not found, reorder immediately before main + * consonant. + */ + + unsigned int new_pos = base; + while (new_pos > start + 1 && + !(FLAG (info[new_pos - 1].indic_category()) & (FLAG (OT_M) | FLAG (OT_H)))) + new_pos--; + + if (new_pos > start && info[new_pos - 1].indic_category() == OT_H) + /* -> If ZWJ or ZWNJ follow this halant, position is moved after it. */ + if (new_pos < end && is_joiner (info[new_pos])) + new_pos++; + + { + unsigned int old_pos = i; + hb_glyph_info_t tmp = info[old_pos]; + memmove (&info[new_pos + 1], &info[new_pos], (old_pos - new_pos) * sizeof (info[0])); + info[new_pos] = tmp; + start_of_last_cluster = MIN (new_pos, start_of_last_cluster); + } + } + + break; } - } }