src/hb-buffer-private.hh | 13 +++++++++++++ src/hb-buffer.cc | 19 +++++++++++-------- src/hb-ot-shape-complex-indic.cc | 2 ++ src/hb-ot-shape-complex-myanmar.cc | 2 ++ src/hb-ot-shape-complex-use.cc | 2 ++ src/hb-ot-shape.cc | 3 ++- 6 files changed, 32 insertions(+), 9 deletions(-)
New commits: commit e2a2b5b229c92f1de3b9c3ea111cd1ffa75b18fc Author: Behdad Esfahbod <[email protected]> Date: Thu Aug 10 20:10:12 2017 -0700 [unsafe-to-break] Be careful with flag propagation when merging clusters diff --git a/src/hb-buffer-private.hh b/src/hb-buffer-private.hh index e598f9e1..01972af6 100644 --- a/src/hb-buffer-private.hh +++ b/src/hb-buffer-private.hh @@ -288,6 +288,19 @@ struct hb_buffer_t { return ret; } HB_INTERNAL bool message_impl (hb_font_t *font, const char *fmt, va_list ap) HB_PRINTF_FUNC(3, 0); + + static inline void + set_cluster (hb_glyph_info_t &info, unsigned int cluster, unsigned int mask = 0) + { + if (info.cluster != cluster) + { + if (mask & HB_GLYPH_FLAG_UNSAFE_TO_BREAK) + info.mask |= HB_GLYPH_FLAG_UNSAFE_TO_BREAK; + else + info.mask &= ~HB_GLYPH_FLAG_UNSAFE_TO_BREAK; + } + info.cluster = cluster; + } }; diff --git a/src/hb-buffer.cc b/src/hb-buffer.cc index 2fcb06da..4b0f9603 100644 --- a/src/hb-buffer.cc +++ b/src/hb-buffer.cc @@ -552,7 +552,7 @@ hb_buffer_t::merge_clusters_impl (unsigned int start, if (cluster_level == HB_BUFFER_CLUSTER_LEVEL_CHARACTERS) return; - uint32_t cluster = info[start].cluster; + unsigned int cluster = info[start].cluster; for (unsigned int i = start + 1; i < end; i++) cluster = MIN (cluster, info[i].cluster); @@ -568,10 +568,10 @@ hb_buffer_t::merge_clusters_impl (unsigned int start, /* If we hit the start of buffer, continue in out-buffer. */ if (idx == start) for (unsigned int i = out_len; i && out_info[i - 1].cluster == info[start].cluster; i--) - out_info[i - 1].cluster = cluster; + set_cluster (out_info[i - 1], cluster); for (unsigned int i = start; i < end; i++) - info[i].cluster = cluster; + set_cluster (info[i], cluster); } void hb_buffer_t::merge_out_clusters (unsigned int start, @@ -583,7 +583,7 @@ hb_buffer_t::merge_out_clusters (unsigned int start, if (unlikely (end - start < 2)) return; - uint32_t cluster = out_info[start].cluster; + unsigned int cluster = out_info[start].cluster; for (unsigned int i = start + 1; i < end; i++) cluster = MIN (cluster, out_info[i].cluster); @@ -599,14 +599,16 @@ hb_buffer_t::merge_out_clusters (unsigned int start, /* If we hit the end of out-buffer, continue in buffer. */ if (end == out_len) for (unsigned int i = idx; i < len && info[i].cluster == out_info[end - 1].cluster; i++) - info[i].cluster = cluster; + set_cluster (info[i], cluster); for (unsigned int i = start; i < end; i++) - out_info[i].cluster = cluster; + set_cluster (out_info[i], cluster); } void hb_buffer_t::delete_glyph () { + /* The logic here is duplicated in hb_ot_hide_default_ignorables(). */ + unsigned int cluster = info[idx].cluster; if (idx + 1 < len && cluster == info[idx + 1].cluster) { @@ -619,9 +621,10 @@ hb_buffer_t::delete_glyph () /* Merge cluster backward. */ if (cluster < out_info[out_len - 1].cluster) { + unsigned int mask = info[idx].mask; unsigned int old_cluster = out_info[out_len - 1].cluster; for (unsigned i = out_len; i && out_info[i - 1].cluster == old_cluster; i--) - out_info[i - 1].cluster = cluster; + set_cluster (out_info[i - 1], cluster, mask); } goto done; } diff --git a/src/hb-ot-shape.cc b/src/hb-ot-shape.cc index 29f5e58e..5cd69927 100644 --- a/src/hb-ot-shape.cc +++ b/src/hb-ot-shape.cc @@ -509,9 +509,10 @@ hb_ot_hide_default_ignorables (hb_ot_shape_context_t *c) /* Merge cluster backward. */ if (cluster < info[j - 1].cluster) { + unsigned int mask = info[i].mask; unsigned int old_cluster = info[j - 1].cluster; for (unsigned k = j; k && info[k - 1].cluster == old_cluster; k--) - info[k - 1].cluster = cluster; + buffer->set_cluster (info[k - 1], cluster, mask); } continue; } commit f2868c200896a96a34fc1bba4d43eddc03789da2 Author: Behdad Esfahbod <[email protected]> Date: Thu Aug 10 19:58:05 2017 -0700 Set mask to 0, instead of 1, by default This shouldn't matter. diff --git a/src/hb-buffer.cc b/src/hb-buffer.cc index 6d13e178..2fcb06da 100644 --- a/src/hb-buffer.cc +++ b/src/hb-buffer.cc @@ -267,7 +267,7 @@ hb_buffer_t::add (hb_codepoint_t codepoint, memset (glyph, 0, sizeof (*glyph)); glyph->codepoint = codepoint; - glyph->mask = 1; + glyph->mask = 0; glyph->cluster = cluster; len++; commit 9e005c5d86cd4c19383093f76a237cc8f5f12fb7 Author: Behdad Esfahbod <[email protected]> Date: Thu Aug 10 18:45:33 2017 -0700 [unsafe-to-break] Mark Indic-like clusters as unsafe-to-break diff --git a/src/hb-ot-shape-complex-indic.cc b/src/hb-ot-shape-complex-indic.cc index 02aab082..3cd8fd6c 100644 --- a/src/hb-ot-shape-complex-indic.cc +++ b/src/hb-ot-shape-complex-indic.cc @@ -624,6 +624,8 @@ setup_syllables (const hb_ot_shape_plan_t *plan HB_UNUSED, hb_buffer_t *buffer) { find_syllables (buffer); + foreach_syllable (buffer, start, end) + buffer->unsafe_to_break (start, end); } static int diff --git a/src/hb-ot-shape-complex-myanmar.cc b/src/hb-ot-shape-complex-myanmar.cc index 4e912c36..ebd2b409 100644 --- a/src/hb-ot-shape-complex-myanmar.cc +++ b/src/hb-ot-shape-complex-myanmar.cc @@ -297,6 +297,8 @@ setup_syllables (const hb_ot_shape_plan_t *plan HB_UNUSED, hb_buffer_t *buffer) { find_syllables (buffer); + foreach_syllable (buffer, start, end) + buffer->unsafe_to_break (start, end); } static int diff --git a/src/hb-ot-shape-complex-use.cc b/src/hb-ot-shape-complex-use.cc index af687068..a5ab0ab2 100644 --- a/src/hb-ot-shape-complex-use.cc +++ b/src/hb-ot-shape-complex-use.cc @@ -354,6 +354,8 @@ setup_syllables (const hb_ot_shape_plan_t *plan, hb_buffer_t *buffer) { find_syllables (buffer); + foreach_syllable (buffer, start, end) + buffer->unsafe_to_break (start, end); setup_rphf_mask (plan, buffer); setup_topographical_masks (plan, buffer); } _______________________________________________ HarfBuzz mailing list [email protected] https://lists.freedesktop.org/mailman/listinfo/harfbuzz
