From 141dfa186403bb22e1e3875fdc263d402b2abb1d Mon Sep 17 00:00:00 2001 From: Behdad Esfahbod Date: Wed, 12 Aug 2009 16:47:27 -0400 Subject: [PATCH] [HB] Fix _hb_buffer_next() when positioning We were copying glyphs to output. This should not happen when in GPOS. Back then it was fine, then some optimizations broke then assumption. --- pango/opentype/hb-buffer-private.h | 1 + pango/opentype/hb-buffer.c | 12 ++++++++++++ 2 files changed, 13 insertions(+) diff --git a/pango/opentype/hb-buffer-private.h b/pango/opentype/hb-buffer-private.h index f33f35f..7ed6806 100644 --- a/pango/opentype/hb-buffer-private.h +++ b/pango/opentype/hb-buffer-private.h @@ -71,6 +71,7 @@ struct _hb_buffer_t { unsigned int allocated; + hb_bool_t have_output; /* weather we have an output buffer going on */ unsigned int in_length; unsigned int out_length; unsigned int in_pos; diff --git a/pango/opentype/hb-buffer.c b/pango/opentype/hb-buffer.c index 2a566b1..94b8a5b 100644 --- a/pango/opentype/hb-buffer.c +++ b/pango/opentype/hb-buffer.c @@ -62,6 +62,7 @@ hb_buffer_ensure_separate (hb_buffer_t *buffer, unsigned int size) hb_buffer_ensure (buffer, size); if (buffer->out_string == buffer->in_string) { + assert (buffer->have_output); if (!buffer->positions) buffer->positions = calloc (buffer->allocated, sizeof (buffer->positions[0])); @@ -112,6 +113,7 @@ hb_buffer_destroy (hb_buffer_t *buffer) void hb_buffer_clear (hb_buffer_t *buffer) { + buffer->have_output = FALSE; buffer->in_length = 0; buffer->out_length = 0; buffer->in_pos = 0; @@ -183,6 +185,7 @@ hb_buffer_set_direction (hb_buffer_t *buffer, void _hb_buffer_clear_output (hb_buffer_t *buffer) { + buffer->have_output = TRUE; buffer->out_length = 0; buffer->out_pos = 0; buffer->out_string = buffer->in_string; @@ -192,6 +195,7 @@ void hb_buffer_clear_positions (hb_buffer_t *buffer) { _hb_buffer_clear_output (buffer); + buffer->have_output = FALSE; if (HB_UNLIKELY (!buffer->positions)) { @@ -207,6 +211,8 @@ _hb_buffer_swap (hb_buffer_t *buffer) { unsigned int tmp; + assert (buffer->have_output); + if (buffer->out_string != buffer->in_string) { hb_internal_glyph_info_t *tmp_string; @@ -318,6 +324,12 @@ _hb_buffer_add_output_glyph (hb_buffer_t *buffer, void _hb_buffer_next_glyph (hb_buffer_t *buffer) { + if (!buffer->have_output) + { + buffer->in_pos++; + return; + } + if (buffer->out_string != buffer->in_string) { hb_buffer_ensure (buffer, buffer->out_pos + 1); -- 2.7.4