[unsafe-to-break] Simplify logic
Always use the algorithm for non-monotone case. It's more robust.
diff --git a/src/hb-buffer.cc b/src/hb-buffer.cc
index afec26f..c65e057 100644
--- a/src/hb-buffer.cc
+++ b/src/hb-buffer.cc
@@ -637,31 +637,17 @@
skip_glyph ();
}
-static inline void
-unsafe_to_break_two_infos (hb_glyph_info_t &info1, hb_glyph_info_t &info2)
-{
- if (info1.cluster == info2.cluster)
- return;
- hb_glyph_info_t &unsafe = info1.cluster > info2.cluster ? info1 : info2;
- unsafe.mask |= HB_GLYPH_FLAG_UNSAFE_TO_BREAK;
-}
-static void
-unsafe_to_break_infos_monotone (hb_glyph_info_t *info, unsigned int start, unsigned int end)
-{
- for (unsigned int i = start + 1; i < end; i++)
- unsafe_to_break_two_infos (info[i - 1], info[i]);
-}
-static unsigned int
-infos_min_cluster (const hb_glyph_info_t *info, unsigned int start, unsigned int end,
- unsigned int cluster)
+static int
+unsafe_to_break_find_min (const hb_glyph_info_t *info, unsigned int start, unsigned int end,
+ unsigned int cluster)
{
for (unsigned int i = start; i < end; i++)
cluster = MIN (cluster, info[i].cluster);
return cluster;
}
static void
-infos_unsafe_to_break_cluster (hb_glyph_info_t *info, unsigned int start, unsigned int end,
- unsigned int cluster)
+unsafe_to_break_set_mask (hb_glyph_info_t *info, unsigned int start, unsigned int end,
+ unsigned int cluster)
{
for (unsigned int i = start; i < end; i++)
if (cluster != info[i].cluster)
@@ -670,16 +656,9 @@
void
hb_buffer_t::unsafe_to_break_impl (unsigned int start, unsigned int end)
{
- if (cluster_level == HB_BUFFER_CLUSTER_LEVEL_CHARACTERS)
- {
- unsigned int cluster = (unsigned int) -1;
- cluster = infos_min_cluster (info, start, end, cluster);
- infos_unsafe_to_break_cluster (info, start, end, cluster);
- return;
- }
-
- /* The case of monotone clusters can be done faster. */
- unsafe_to_break_infos_monotone (info, start, end);
+ unsigned int cluster = (unsigned int) -1;
+ cluster = unsafe_to_break_find_min (info, start, end, cluster);
+ unsafe_to_break_set_mask (info, start, end, cluster);
}
void
hb_buffer_t::unsafe_to_break_from_outbuffer (unsigned int start, unsigned int end)
@@ -687,21 +666,11 @@
assert (start <= out_len);
assert (idx <= end);
- if (cluster_level == HB_BUFFER_CLUSTER_LEVEL_CHARACTERS)
- {
- unsigned int cluster = (unsigned int) -1;
- cluster = infos_min_cluster (out_info, start, out_len, cluster);
- cluster = infos_min_cluster (info, idx, end, cluster);
- infos_unsafe_to_break_cluster (out_info, start, out_len, cluster);
- infos_unsafe_to_break_cluster (info, idx, end, cluster);
- return;
- }
-
- /* The case of monotone clusters can be done faster. */
- unsafe_to_break_infos_monotone (out_info, start, out_len);
- if (start < out_len && idx < end)
- unsafe_to_break_two_infos (out_info[out_len - 1], info[idx]);
- unsafe_to_break_infos_monotone (info, idx, end);
+ unsigned int cluster = (unsigned int) -1;
+ cluster = unsafe_to_break_find_min (out_info, start, out_len, cluster);
+ cluster = unsafe_to_break_find_min (info, idx, end, cluster);
+ unsafe_to_break_set_mask (out_info, start, out_len, cluster);
+ unsafe_to_break_set_mask (info, idx, end, cluster);
}
void