mirror of
https://gitlab.freedesktop.org/cairo/cairo.git
synced 2026-05-05 01:48:07 +02:00
[cairo] Embed a second gstate.
Experiment with embedding a second gstate into the initial context to reduce allocations.
This commit is contained in:
parent
8abd21bd3a
commit
b661f3d27b
2 changed files with 7 additions and 7 deletions
|
|
@ -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];
|
||||
|
|
|
|||
12
src/cairo.c
12
src/cairo.c
|
|
@ -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;
|
||||
|
|
|
|||
Loading…
Add table
Reference in a new issue