GtkSnapshot: Reuse snapshot state objects

Rather than allocate new ones all the time we reuse the previous ones.
We just clear them and save them in the parent for later reuse.
This commit is contained in:
Alexander Larsson 2017-01-11 11:41:46 +01:00
parent f67ae85b7a
commit 6341fab985
2 changed files with 30 additions and 11 deletions

View File

@ -84,11 +84,18 @@ gtk_snapshot_state_new (GtkSnapshotState *parent,
{
GtkSnapshotState *state;
state = g_slice_new0 (GtkSnapshotState);
if (parent != NULL && parent->cached_state != NULL)
{
state = parent->cached_state;
parent->cached_state = NULL;
}
else
{
state = g_slice_new0 (GtkSnapshotState);
state->nodes = g_ptr_array_new_with_free_func ((GDestroyNotify) gsk_render_node_unref);
state->parent = parent;
}
state->nodes = g_ptr_array_new_with_free_func ((GDestroyNotify) gsk_render_node_unref);
state->parent = parent;
state->name = name;
if (clip)
state->clip_region = cairo_region_reference (clip);
@ -99,16 +106,21 @@ gtk_snapshot_state_new (GtkSnapshotState *parent,
return state;
}
static void
gtk_snapshot_state_clear (GtkSnapshotState *state)
{
g_ptr_array_set_size (state->nodes, 0);
g_clear_pointer (&state->clip_region, cairo_region_destroy);
g_clear_pointer (&state->name, g_free);
}
static void
gtk_snapshot_state_free (GtkSnapshotState *state)
{
if (state->cached_state)
gtk_snapshot_state_free (state->cached_state);
gtk_snapshot_state_clear (state);
g_ptr_array_unref (state->nodes);
if (state->clip_region)
cairo_region_destroy (state->clip_region);
g_free (state->name);
g_slice_free (GtkSnapshotState, state);
}
@ -697,7 +709,13 @@ gtk_snapshot_pop (GtkSnapshot *snapshot)
state->nodes->len,
state->name);
gtk_snapshot_state_free (state);
if (snapshot->state == NULL)
gtk_snapshot_state_free (state);
else
{
gtk_snapshot_state_clear (state);
snapshot->state->cached_state = state;
}
return node;
}

View File

@ -31,6 +31,7 @@ typedef GskRenderNode * (* GtkSnapshotCollectFunc) (GtkSnapshotState *state,
struct _GtkSnapshotState {
GtkSnapshotState *parent;
GtkSnapshotState *cached_state; /* A cleared state object we can (re)use */
char *name;
GPtrArray *nodes;