[buffer] Consolidate glyph-flags implementation
diff --git a/src/hb-buffer.cc b/src/hb-buffer.cc
index e66d1a7..3e09260 100644
--- a/src/hb-buffer.cc
+++ b/src/hb-buffer.cc
@@ -573,31 +573,6 @@
}
void
-hb_buffer_t::unsafe_to_break_impl (unsigned int start, unsigned int end, hb_mask_t mask)
-{
- unsigned cluster = _infos_find_min_cluster (info, start, end);
- _infos_set_glyph_flags (info, start, end, cluster, mask);
-}
-void
-hb_buffer_t::unsafe_to_break_from_outbuffer (unsigned int start, unsigned int end, hb_mask_t mask)
-{
- if (!have_output)
- {
- unsafe_to_break_impl (start, end);
- return;
- }
-
- assert (start <= out_len);
- assert (idx <= end);
-
- unsigned cluster = _infos_find_min_cluster (info, idx, end);
- cluster = _infos_find_min_cluster (out_info, start, out_len, cluster);
-
- _infos_set_glyph_flags (out_info, start, out_len, cluster, mask);
- _infos_set_glyph_flags (info, idx, end, cluster, mask);
-}
-
-void
hb_buffer_t::guess_segment_properties ()
{
assert_unicode ();
diff --git a/src/hb-buffer.hh b/src/hb-buffer.hh
index ea71c85..942da91 100644
--- a/src/hb-buffer.hh
+++ b/src/hb-buffer.hh
@@ -385,26 +385,74 @@
/* Merge clusters for deleting current glyph, and skip it. */
HB_INTERNAL void delete_glyph ();
- void unsafe_to_break (unsigned int start,
- unsigned int end)
+
+ void set_glyph_flags (unsigned start,
+ unsigned end,
+ hb_mask_t mask,
+ bool interior = false,
+ bool from_out_buffer = false)
{
- if (end - start < 2)
+ if (interior && !from_out_buffer && end - start < 2)
return;
- unsafe_to_break_impl (start, end);
+
+ scratch_flags |= HB_BUFFER_SCRATCH_FLAG_HAS_GLYPH_FLAGS;
+
+ if (!from_out_buffer || !have_output)
+ {
+ if (!interior)
+ {
+ for (unsigned i = start; i < end; i++)
+ info[i].mask |= mask;
+ }
+ else
+ {
+ unsigned cluster = _infos_find_min_cluster (info, start, end);
+ _infos_set_glyph_flags (info, start, end, cluster, mask);
+ }
+ }
+ else
+ {
+ assert (start <= out_len);
+ assert (idx <= end);
+
+ if (!interior)
+ {
+ for (unsigned i = start; i < out_len; i++)
+ out_info[i].mask |= mask;
+ for (unsigned i = idx; i < end; i++)
+ info[i].mask |= mask;
+ }
+ else
+ {
+ unsigned cluster = _infos_find_min_cluster (info, idx, end);
+ cluster = _infos_find_min_cluster (out_info, start, out_len, cluster);
+
+ _infos_set_glyph_flags (out_info, start, out_len, cluster, mask);
+ _infos_set_glyph_flags (info, idx, end, cluster, mask);
+ }
+ }
}
- void unsafe_to_concat (unsigned int start,
- unsigned int end)
+
+ void unsafe_to_break (unsigned int start, unsigned int end)
{
- if (end - start < 2)
- return;
- unsafe_to_break_impl (start, end, HB_GLYPH_FLAG_UNSAFE_TO_CONCAT);
+ set_glyph_flags (start, end, HB_GLYPH_FLAG_UNSAFE_TO_BREAK | HB_GLYPH_FLAG_UNSAFE_TO_CONCAT,
+ true);
}
- HB_INTERNAL void unsafe_to_break_impl (unsigned int start, unsigned int end,
- hb_mask_t mask = HB_GLYPH_FLAG_UNSAFE_TO_BREAK | HB_GLYPH_FLAG_UNSAFE_TO_CONCAT);
- HB_INTERNAL void unsafe_to_break_from_outbuffer (unsigned int start, unsigned int end,
- hb_mask_t mask = HB_GLYPH_FLAG_UNSAFE_TO_BREAK | HB_GLYPH_FLAG_UNSAFE_TO_CONCAT);
+ void unsafe_to_concat (unsigned int start, unsigned int end)
+ {
+ set_glyph_flags (start, end, HB_GLYPH_FLAG_UNSAFE_TO_CONCAT,
+ true);
+ }
+ void unsafe_to_break_from_outbuffer (unsigned int start, unsigned int end)
+ {
+ set_glyph_flags (start, end, HB_GLYPH_FLAG_UNSAFE_TO_BREAK | HB_GLYPH_FLAG_UNSAFE_TO_CONCAT,
+ true, true);
+ }
void unsafe_to_concat_from_outbuffer (unsigned int start, unsigned int end)
- { unsafe_to_break_from_outbuffer (start, end, HB_GLYPH_FLAG_UNSAFE_TO_CONCAT); }
+ {
+ set_glyph_flags (start, end, HB_GLYPH_FLAG_UNSAFE_TO_CONCAT,
+ true, true);
+ }
/* Internal methods */