[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.
This commit is contained in:
Behdad Esfahbod 2009-08-12 16:47:27 -04:00
parent 5ccf1ba339
commit e4679d9fae
2 changed files with 13 additions and 0 deletions

View File

@ -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;

View File

@ -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);