[pango] [HB] Fix _hb_buffer_next() when positioning



commit 141dfa186403bb22e1e3875fdc263d402b2abb1d
Author: Behdad Esfahbod <behdad behdad org>
Date:   Wed Aug 12 16:47:27 2009 -0400

    [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(+), 0 deletions(-)
---
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);



[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]