[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:
parent
5ccf1ba339
commit
e4679d9fae
|
@ -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;
|
||||
|
|
|
@ -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);
|
||||
|
|
Loading…
Reference in New Issue