[pango] [HB] Fix _hb_buffer_next() when positioning
- From: Behdad Esfahbod <behdad src gnome org>
- To: svn-commits-list gnome org
- Cc:
- Subject: [pango] [HB] Fix _hb_buffer_next() when positioning
- Date: Wed, 12 Aug 2009 20:54:38 +0000 (UTC)
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]