src/hb-ot-shape-complex-hangul.cc | 2 +- src/hb-ot-shape-complex-indic.cc | 21 ++++++++++++++++----- src/hb-ot-shape-complex-thai.cc | 2 +- src/hb-ot-shape-complex-use.cc | 4 ++-- src/hb-ot-shape.cc | 5 +++-- 5 files changed, 23 insertions(+), 11 deletions(-)
New commits: commit 5828c45d7a816ccd0a7f10a665ea3cf8cfd63b05 Author: Behdad Esfahbod <beh...@behdad.org> Date: Tue Sep 1 16:26:35 2015 +0100 [indic] Add comments to merge_clusters calls diff --git a/src/hb-ot-shape-complex-indic.cc b/src/hb-ot-shape-complex-indic.cc index 8b55484..00526f3 100644 --- a/src/hb-ot-shape-complex-indic.cc +++ b/src/hb-ot-shape-complex-indic.cc @@ -1025,7 +1025,11 @@ initial_reordering_consonant_syllable (const hb_ot_shape_plan_t *plan, * around like crazy. In old-spec mode, we move halants around, so in * that case merge all clusters after base. Otherwise, check the sort * order and merge as needed. - * For pre-base stuff, we handle cluster issues in final reordering. */ + * For pre-base stuff, we handle cluster issues in final reordering. + * + * We could use buffer->sort() for this, if there was no special + * reordering of pre-base stuff happening later... + */ if (indic_plan->is_old_spec || end - base > 127) buffer->merge_clusters (base, end); else @@ -1404,12 +1408,17 @@ final_reordering_syllable (const hb_ot_shape_plan_t *plan, if (info[i - 1].indic_position () == POS_PRE_M) { unsigned int old_pos = i - 1; + if (old_pos < base && base <= new_pos) /* Shouldn't actually happen. */ + base--; + hb_glyph_info_t tmp = info[old_pos]; memmove (&info[old_pos], &info[old_pos + 1], (new_pos - old_pos) * sizeof (info[0])); info[new_pos] = tmp; - if (old_pos < base && base <= new_pos) /* Shouldn't actually happen. */ - base--; + + /* Note: this merge_clusters() is intentionally *after* the reordering. + * Indic matra reordering is special and tricky... */ buffer->merge_clusters (new_pos, MIN (end, base + 1)); + new_pos--; } } else { @@ -1562,12 +1571,12 @@ final_reordering_syllable (const hb_ot_shape_plan_t *plan, reph_move: { - buffer->merge_clusters (start, new_reph_pos + 1); - /* Move */ + buffer->merge_clusters (start, new_reph_pos + 1); hb_glyph_info_t reph = info[start]; memmove (&info[start], &info[start + 1], (new_reph_pos - start) * sizeof (info[0])); info[new_reph_pos] = reph; + if (start < base && base <= new_reph_pos) base--; } @@ -1640,10 +1649,12 @@ final_reordering_syllable (const hb_ot_shape_plan_t *plan, { unsigned int old_pos = i; + buffer->merge_clusters (new_pos, old_pos + 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; + if (new_pos <= base && base < old_pos) base++; } commit bdc8215949a7add742cc800b4fdea6acaa37d152 Author: Behdad Esfahbod <beh...@behdad.org> Date: Tue Sep 1 16:24:54 2015 +0100 [thai] Respect cluster-level > 0 diff --git a/src/hb-ot-shape-complex-thai.cc b/src/hb-ot-shape-complex-thai.cc index feb7fc7..d4ede20 100644 --- a/src/hb-ot-shape-complex-thai.cc +++ b/src/hb-ot-shape-complex-thai.cc @@ -353,7 +353,7 @@ preprocess_text_thai (const hb_ot_shape_plan_t *plan, { /* Since we decomposed, and NIKHAHIT is combining, merge clusters with the * previous cluster. */ - if (start) + if (start && buffer->cluster_level == HB_BUFFER_CLUSTER_LEVEL_MONOTONE_GRAPHEMES) buffer->merge_out_clusters (start - 1, end); } } commit 5b31fe383ead726ec77062501ed3bb24c02842b3 Author: Behdad Esfahbod <beh...@behdad.org> Date: Tue Sep 1 16:24:34 2015 +0100 [use] Merge /before/ reordering diff --git a/src/hb-ot-shape-complex-use.cc b/src/hb-ot-shape-complex-use.cc index 41eb43f..4b15dee 100644 --- a/src/hb-ot-shape-complex-use.cc +++ b/src/hb-ot-shape-complex-use.cc @@ -436,10 +436,10 @@ reorder_syllable (hb_buffer_t *buffer, unsigned int start, unsigned int end) if (info[i].use_category() == USE_H) i--; + buffer->merge_clusters (start, i + 1); hb_glyph_info_t t = info[start]; memmove (&info[start], &info[start + 1], (i - start) * sizeof (info[0])); info[i] = t; - buffer->merge_clusters (start, i + 1); break; } @@ -464,10 +464,10 @@ reorder_syllable (hb_buffer_t *buffer, unsigned int start, unsigned int end) 0 == _hb_glyph_info_get_lig_comp (&info[i]) && j < i) { + buffer->merge_clusters (j, i + 1); hb_glyph_info_t t = info[i]; memmove (&info[j + 1], &info[j], (i - j) * sizeof (info[0])); info[j] = t; - buffer->merge_clusters (j, i + 1); } } } commit 0d438f89bd9422c66838c776eb4aa867de0a2ad8 Author: Behdad Esfahbod <beh...@behdad.org> Date: Tue Sep 1 16:24:13 2015 +0100 [hangul] Merge /before/ reordering diff --git a/src/hb-ot-shape-complex-hangul.cc b/src/hb-ot-shape-complex-hangul.cc index 763dbf0..1fa79ce 100644 --- a/src/hb-ot-shape-complex-hangul.cc +++ b/src/hb-ot-shape-complex-hangul.cc @@ -205,11 +205,11 @@ preprocess_text_hangul (const hb_ot_shape_plan_t *plan, buffer->next_glyph (); if (!is_zero_width_char (font, u)) { + buffer->merge_out_clusters (start, end + 1); hb_glyph_info_t *info = buffer->out_info; hb_glyph_info_t tone = info[end]; memmove (&info[start + 1], &info[start], (end - start) * sizeof (hb_glyph_info_t)); info[start] = tone; - buffer->merge_out_clusters (start, end + 1); } } else commit f883de664fc4bfe01e30c89e07e31dc113f906d9 Author: Behdad Esfahbod <beh...@behdad.org> Date: Tue Sep 1 16:23:40 2015 +0100 [OT] Merge /before/ reordering diff --git a/src/hb-ot-shape.cc b/src/hb-ot-shape.cc index e24f7a8..40332d6 100644 --- a/src/hb-ot-shape.cc +++ b/src/hb-ot-shape.cc @@ -302,15 +302,16 @@ hb_ensure_native_direction (hb_buffer_t *buffer) { if (likely (!HB_UNICODE_GENERAL_CATEGORY_IS_MARK (_hb_glyph_info_get_general_category (&info[i])))) { - buffer->reverse_range (base, i); if (buffer->cluster_level == HB_BUFFER_CLUSTER_LEVEL_MONOTONE_CHARACTERS) buffer->merge_clusters (base, i); + buffer->reverse_range (base, i); + base = i; } } - buffer->reverse_range (base, count); if (buffer->cluster_level == HB_BUFFER_CLUSTER_LEVEL_MONOTONE_CHARACTERS) buffer->merge_clusters (base, count); + buffer->reverse_range (base, count); buffer->reverse (); _______________________________________________ HarfBuzz mailing list HarfBuzz@lists.freedesktop.org http://lists.freedesktop.org/mailman/listinfo/harfbuzz