[cairo] Embed a second gstate.

Experiment with embedding a second gstate into the initial context to
reduce allocations.
This commit is contained in:
Chris Wilson 2008-12-18 18:34:16 +00:00
parent 8abd21bd3a
commit b661f3d27b
2 changed files with 7 additions and 7 deletions

View file

@ -48,7 +48,7 @@ struct _cairo {
cairo_user_data_array_t user_data;
cairo_gstate_t *gstate;
cairo_gstate_t gstate_tail[1];
cairo_gstate_t gstate_tail[2];
cairo_gstate_t *gstate_freelist;
cairo_path_fixed_t path[1];

View file

@ -49,9 +49,7 @@ static const cairo_t _cairo_nil = {
CAIRO_STATUS_NO_MEMORY, /* status */
{ 0, 0, 0, NULL }, /* user_data */
NULL, /* gstate */
{{ /* gstate_tail */
0
}},
{{ 0 }, { 0 }}, /* gstate_tail */
NULL, /* gstate_freelist */
{{ /* path */
{ 0, 0 }, /* last_move_point */
@ -164,8 +162,9 @@ cairo_create (cairo_surface_t *target)
_cairo_user_data_array_init (&cr->user_data);
_cairo_path_fixed_init (cr->path);
cr->gstate = cr->gstate_tail;
cr->gstate_freelist = NULL;
cr->gstate = &cr->gstate_tail[0];
cr->gstate_freelist = &cr->gstate_tail[1];
cr->gstate_tail[1].next = NULL;
status = _cairo_gstate_init (cr->gstate, target);
if (unlikely (status))
@ -222,7 +221,7 @@ cairo_destroy (cairo_t *cr)
if (! _cairo_reference_count_dec_and_test (&cr->ref_count))
return;
while (cr->gstate != cr->gstate_tail) {
while (cr->gstate != &cr->gstate_tail[0]) {
if (_cairo_gstate_restore (&cr->gstate, &cr->gstate_freelist))
break;
}
@ -237,6 +236,7 @@ cairo_destroy (cairo_t *cr)
cairo_surface_flush (surface);
_cairo_gstate_fini (cr->gstate);
cr->gstate_freelist = cr->gstate_freelist->next; /* skip over tail[1] */
while (cr->gstate_freelist != NULL) {
cairo_gstate_t *gstate = cr->gstate_freelist;
cr->gstate_freelist = gstate->next;