diff --git a/src/hb-buffer.cc b/src/hb-buffer.cc index e66d1a785..3e09260cf 100644 --- a/src/hb-buffer.cc +++ b/src/hb-buffer.cc @@ -572,31 +572,6 @@ done: skip_glyph (); } -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 () { diff --git a/src/hb-buffer.hh b/src/hb-buffer.hh index ea71c8524..942da91e1 100644 --- a/src/hb-buffer.hh +++ b/src/hb-buffer.hh @@ -385,26 +385,74 @@ struct hb_buffer_t /* 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); + } + 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); } - 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_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 */