[HB] Reuse the positions array as alt string array
This commit is contained in:
parent
5c44188455
commit
cbe5a4e08e
|
@ -78,7 +78,6 @@ struct _hb_buffer_t {
|
||||||
|
|
||||||
hb_internal_glyph_info_t *in_string;
|
hb_internal_glyph_info_t *in_string;
|
||||||
hb_internal_glyph_info_t *out_string;
|
hb_internal_glyph_info_t *out_string;
|
||||||
hb_internal_glyph_info_t *alt_string;
|
|
||||||
hb_internal_glyph_position_t *positions;
|
hb_internal_glyph_position_t *positions;
|
||||||
|
|
||||||
hb_direction_t direction;
|
hb_direction_t direction;
|
||||||
|
|
|
@ -46,11 +46,10 @@ static hb_buffer_t _hb_buffer_nil = {
|
||||||
* in-place.
|
* in-place.
|
||||||
*
|
*
|
||||||
* As soon as out_string gets longer than in_string, out_string is moved over
|
* As soon as out_string gets longer than in_string, out_string is moved over
|
||||||
* to an alternate buffer (alt_string), and its current contents (out_length
|
* to an alternate buffer (which we reuse the positions buffer for!), and its
|
||||||
* entries) are copied to the alt buffer. This should all remain transparent
|
* current contents (out_length entries) are copied to the alt buffer.
|
||||||
* to the user. swap() then switches in_string and alt_string. alt_string is
|
* This should all remain transparent to the user. swap() then switches
|
||||||
* not allocated until its needed, but after that it's grown with in_string
|
* in_string and out_string.
|
||||||
* unconditionally.
|
|
||||||
*/
|
*/
|
||||||
|
|
||||||
/* XXX err handling */
|
/* XXX err handling */
|
||||||
|
@ -63,10 +62,10 @@ hb_buffer_ensure_separate (hb_buffer_t *buffer, unsigned int size)
|
||||||
hb_buffer_ensure (buffer, size);
|
hb_buffer_ensure (buffer, size);
|
||||||
if (buffer->out_string == buffer->in_string)
|
if (buffer->out_string == buffer->in_string)
|
||||||
{
|
{
|
||||||
if (!buffer->alt_string)
|
if (!buffer->positions)
|
||||||
buffer->alt_string = calloc (buffer->allocated, sizeof (buffer->alt_string[0]));
|
buffer->positions = calloc (buffer->allocated, sizeof (buffer->positions[0]));
|
||||||
|
|
||||||
buffer->out_string = buffer->alt_string;
|
buffer->out_string = buffer->positions;
|
||||||
memcpy (buffer->out_string, buffer->in_string, buffer->out_length * sizeof (buffer->out_string[0]));
|
memcpy (buffer->out_string, buffer->in_string, buffer->out_length * sizeof (buffer->out_string[0]));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -105,7 +104,6 @@ hb_buffer_destroy (hb_buffer_t *buffer)
|
||||||
HB_OBJECT_DO_DESTROY (buffer);
|
HB_OBJECT_DO_DESTROY (buffer);
|
||||||
|
|
||||||
free (buffer->in_string);
|
free (buffer->in_string);
|
||||||
free (buffer->alt_string);
|
|
||||||
free (buffer->positions);
|
free (buffer->positions);
|
||||||
|
|
||||||
free (buffer);
|
free (buffer);
|
||||||
|
@ -138,19 +136,12 @@ hb_buffer_ensure (hb_buffer_t *buffer, unsigned int size)
|
||||||
if (buffer->out_string != buffer->in_string)
|
if (buffer->out_string != buffer->in_string)
|
||||||
{
|
{
|
||||||
buffer->in_string = realloc (buffer->in_string, new_allocated * sizeof (buffer->in_string[0]));
|
buffer->in_string = realloc (buffer->in_string, new_allocated * sizeof (buffer->in_string[0]));
|
||||||
buffer->alt_string = realloc (buffer->alt_string, new_allocated * sizeof (buffer->alt_string[0]));
|
buffer->out_string = buffer->positions;
|
||||||
buffer->out_string = buffer->alt_string;
|
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
buffer->in_string = realloc (buffer->in_string, new_allocated * sizeof (buffer->in_string[0]));
|
buffer->in_string = realloc (buffer->in_string, new_allocated * sizeof (buffer->in_string[0]));
|
||||||
buffer->out_string = buffer->in_string;
|
buffer->out_string = buffer->in_string;
|
||||||
|
|
||||||
if (buffer->alt_string)
|
|
||||||
{
|
|
||||||
free (buffer->alt_string);
|
|
||||||
buffer->alt_string = NULL;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
buffer->allocated = new_allocated;
|
buffer->allocated = new_allocated;
|
||||||
|
@ -221,8 +212,7 @@ _hb_buffer_swap (hb_buffer_t *buffer)
|
||||||
hb_internal_glyph_info_t *tmp_string;
|
hb_internal_glyph_info_t *tmp_string;
|
||||||
tmp_string = buffer->in_string;
|
tmp_string = buffer->in_string;
|
||||||
buffer->in_string = buffer->out_string;
|
buffer->in_string = buffer->out_string;
|
||||||
buffer->out_string = tmp_string;
|
buffer->positions = buffer->out_string = tmp_string;
|
||||||
buffer->alt_string = buffer->out_string;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
tmp = buffer->in_length;
|
tmp = buffer->in_length;
|
||||||
|
|
Loading…
Reference in New Issue