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 <beh...@behdad.org>
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 <beh...@behdad.org>
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 <beh...@behdad.org>
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
HarfBuzz@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/harfbuzz

Reply via email to