diff --git a/src/hb-buffer-private.hh b/src/hb-buffer-private.hh index d6189d246..c96723a3b 100644 --- a/src/hb-buffer-private.hh +++ b/src/hb-buffer-private.hh @@ -141,9 +141,11 @@ struct hb_buffer_t { HB_INTERNAL void swap_buffers (void); HB_INTERNAL void clear_output (void); HB_INTERNAL void clear_positions (void); + HB_INTERNAL void replace_glyphs (unsigned int num_in, unsigned int num_out, const hb_codepoint_t *glyph_data); + HB_INTERNAL void replace_glyph (hb_codepoint_t glyph_index); /* Makes a copy of the glyph at idx to output and replace glyph_index */ HB_INTERNAL void output_glyph (hb_codepoint_t glyph_index); @@ -196,5 +198,4 @@ struct hb_buffer_t { HB_BUFFER_XALLOCATE_VAR (b, deallocate_var, var (), #var) - #endif /* HB_BUFFER_PRIVATE_HH */ diff --git a/src/hb-buffer.cc b/src/hb-buffer.cc index f8c62ac51..b9623e880 100644 --- a/src/hb-buffer.cc +++ b/src/hb-buffer.cc @@ -134,6 +134,7 @@ hb_buffer_t::get_scratch_buffer (unsigned int *size) } + /* HarfBuzz-Internal API */ void @@ -234,12 +235,13 @@ hb_buffer_t::swap_buffers (void) idx = 0; } + void hb_buffer_t::replace_glyphs (unsigned int num_in, unsigned int num_out, const uint32_t *glyph_data) { - if (!make_room_for (num_in, num_out)) return; + if (unlikely (!make_room_for (num_in, num_out))) return; merge_clusters (idx, idx + num_in); @@ -259,7 +261,7 @@ hb_buffer_t::replace_glyphs (unsigned int num_in, void hb_buffer_t::output_glyph (hb_codepoint_t glyph_index) { - if (!make_room_for (0, 1)) return; + if (unlikely (!make_room_for (0, 1))) return; out_info[out_len] = info[idx]; out_info[out_len].codepoint = glyph_index; @@ -270,7 +272,7 @@ hb_buffer_t::output_glyph (hb_codepoint_t glyph_index) void hb_buffer_t::copy_glyph (void) { - if (!make_room_for (0, 1)) return; + if (unlikely (!make_room_for (0, 1))) return; out_info[out_len] = info[idx]; @@ -280,9 +282,10 @@ hb_buffer_t::copy_glyph (void) void hb_buffer_t::replace_glyph (hb_codepoint_t glyph_index) { - if (!make_room_for (1, 1)) return; - - out_info[out_len] = info[idx]; + if (unlikely (out_info != info || out_len != idx)) { + if (unlikely (!make_room_for (1, 1))) return; + out_info[out_len] = info[idx]; + } out_info[out_len].codepoint = glyph_index; idx++; @@ -294,20 +297,17 @@ hb_buffer_t::next_glyph (void) { if (have_output) { - if (out_info != info) - { - if (unlikely (!ensure (out_len + 1))) return; + if (unlikely (out_info != info || out_len != idx)) { + if (unlikely (!make_room_for (1, 1))) return; out_info[out_len] = info[idx]; } - else if (out_len != idx) - out_info[out_len] = info[idx]; - out_len++; } idx++; } + void hb_buffer_t::set_masks (hb_mask_t value, hb_mask_t mask,