From 9ebe8c0286856d46430ae184ba7303bd34485883 Mon Sep 17 00:00:00 2001 From: Behdad Esfahbod Date: Fri, 26 Aug 2011 09:29:42 +0200 Subject: [PATCH] Add buffer->replace_glyphs() --- src/hb-buffer-private.hh | 3 +++ src/hb-buffer.cc | 26 ++++++++++++++++++++++++++ 2 files changed, 29 insertions(+) diff --git a/src/hb-buffer-private.hh b/src/hb-buffer-private.hh index f3f3ab0c3..42922223d 100644 --- a/src/hb-buffer-private.hh +++ b/src/hb-buffer-private.hh @@ -102,6 +102,9 @@ struct _hb_buffer_t { HB_INTERNAL void replace_glyphs_be16 (unsigned int num_in, unsigned int num_out, const uint16_t *glyph_data_be); + HB_INTERNAL void replace_glyphs (unsigned int num_in, + unsigned int num_out, + const uint16_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); diff --git a/src/hb-buffer.cc b/src/hb-buffer.cc index c3cff08cb..3e25b1573 100644 --- a/src/hb-buffer.cc +++ b/src/hb-buffer.cc @@ -267,6 +267,32 @@ hb_buffer_t::replace_glyphs_be16 (unsigned int num_in, out_len += num_out; } +void +hb_buffer_t::replace_glyphs (unsigned int num_in, + unsigned int num_out, + const uint16_t *glyph_data) +{ + if (!make_room_for (num_in, num_out)) return; + + hb_glyph_info_t orig_info = info[idx]; + for (unsigned int i = 1; i < num_in; i++) + { + hb_glyph_info_t *inf = &info[idx + i]; + orig_info.cluster = MIN (orig_info.cluster, inf->cluster); + } + + hb_glyph_info_t *pinfo = &out_info[out_len]; + for (unsigned int i = 0; i < num_out; i++) + { + *pinfo = orig_info; + pinfo->codepoint = glyph_data[i]; + pinfo++; + } + + idx += num_in; + out_len += num_out; +} + void hb_buffer_t::output_glyph (hb_codepoint_t glyph_index) {