[gtk+/wip/alexl/optimize-snapshot: 4/7] GtkSnapshot: Move collect data to a union in the state
- From: Alexander Larsson <alexl src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [gtk+/wip/alexl/optimize-snapshot: 4/7] GtkSnapshot: Move collect data to a union in the state
- Date: Wed, 11 Jan 2017 11:51:46 +0000 (UTC)
commit f67ae85b7a33bf1a6a141050d5fc659b0c678d1b
Author: Alexander Larsson <alexl redhat com>
Date: Wed Jan 11 11:21:27 2017 +0100
GtkSnapshot: Move collect data to a union in the state
This means we allocate the collect data with the state, avoiding
an extra allocation. Also, a union means every state object
is the same size and we could reuse the state objects.
gtk/gtksnapshot.c | 326 ++++++++++++++++++++++------------------------
gtk/gtksnapshotprivate.h | 36 +++++-
2 files changed, 188 insertions(+), 174 deletions(-)
---
diff --git a/gtk/gtksnapshot.c b/gtk/gtksnapshot.c
index eb78809..e170058 100644
--- a/gtk/gtksnapshot.c
+++ b/gtk/gtksnapshot.c
@@ -49,10 +49,10 @@
*/
static GskRenderNode *
-gtk_snapshot_collect_default (GskRenderNode **nodes,
+gtk_snapshot_collect_default (GtkSnapshotState *state,
+ GskRenderNode **nodes,
guint n_nodes,
- const char *name,
- gpointer unused)
+ const char *name)
{
GskRenderNode *node;
@@ -80,8 +80,7 @@ gtk_snapshot_state_new (GtkSnapshotState *parent,
cairo_region_t *clip,
double translate_x,
double translate_y,
- GtkSnapshotCollectFunc collect_func,
- gpointer collect_data)
+ GtkSnapshotCollectFunc collect_func)
{
GtkSnapshotState *state;
@@ -96,7 +95,6 @@ gtk_snapshot_state_new (GtkSnapshotState *parent,
state->translate_x = translate_x;
state->translate_y = translate_y;
state->collect_func = collect_func;
- state->collect_data = collect_data;
return state;
}
@@ -143,8 +141,7 @@ gtk_snapshot_init (GtkSnapshot *snapshot,
str,
(cairo_region_t *) clip,
0, 0,
- gtk_snapshot_collect_default,
- NULL);
+ gtk_snapshot_collect_default);
}
GskRenderNode *
@@ -202,8 +199,7 @@ gtk_snapshot_push (GtkSnapshot *snapshot,
snapshot->state->clip_region,
snapshot->state->translate_x,
snapshot->state->translate_y,
- gtk_snapshot_collect_default,
- NULL);
+ gtk_snapshot_collect_default);
}
else
{
@@ -211,29 +207,27 @@ gtk_snapshot_push (GtkSnapshot *snapshot,
str,
NULL,
0, 0,
- gtk_snapshot_collect_default,
- NULL);
+ gtk_snapshot_collect_default);
}
}
static GskRenderNode *
-gtk_snapshot_collect_transform (GskRenderNode **nodes,
+gtk_snapshot_collect_transform (GtkSnapshotState *state,
+ GskRenderNode **nodes,
guint n_nodes,
- const char *name,
- gpointer transform)
+ const char *name)
{
GskRenderNode *node, *transform_node;
- node = gtk_snapshot_collect_default (nodes, n_nodes, name, NULL);
+ node = gtk_snapshot_collect_default (state, nodes, n_nodes, name);
if (node == NULL)
return NULL;
- transform_node = gsk_transform_node_new (node, transform);
+ transform_node = gsk_transform_node_new (node, &state->data.transform.transform);
if (name)
gsk_render_node_set_name (transform_node, name);
gsk_render_node_unref (node);
- g_slice_free (graphene_matrix_t, transform);
return transform_node;
}
@@ -244,19 +238,8 @@ gtk_snapshot_push_transform (GtkSnapshot *snapshot,
const char *name,
...)
{
+ GtkSnapshotState *state;
graphene_matrix_t offset;
- graphene_matrix_t* real_transform;
-
- graphene_matrix_init_translate (&offset,
- &GRAPHENE_POINT3D_INIT(
- snapshot->state->translate_x,
- snapshot->state->translate_y,
- 0
- ));
-
- real_transform = g_slice_new (graphene_matrix_t);
- graphene_matrix_multiply (transform, &offset, real_transform);
-
char *str;
if (name && snapshot->record_names)
@@ -270,49 +253,52 @@ gtk_snapshot_push_transform (GtkSnapshot *snapshot,
else
str = NULL;
- snapshot->state = gtk_snapshot_state_new (snapshot->state,
- str,
- NULL,
- 0, 0,
- gtk_snapshot_collect_transform,
- real_transform);
+ state = gtk_snapshot_state_new (snapshot->state,
+ str,
+ NULL,
+ 0, 0,
+ gtk_snapshot_collect_transform);
+
+ graphene_matrix_init_translate (&offset,
+ &GRAPHENE_POINT3D_INIT(
+ snapshot->state->translate_x,
+ snapshot->state->translate_y,
+ 0
+ ));
+
+ graphene_matrix_multiply (transform, &offset, &state->data.transform.transform);
+
+ snapshot->state = state;
}
static GskRenderNode *
-gtk_snapshot_collect_opacity (GskRenderNode **nodes,
+gtk_snapshot_collect_opacity (GtkSnapshotState *state,
+ GskRenderNode **nodes,
guint n_nodes,
- const char *name,
- gpointer opacity)
+ const char *name)
{
GskRenderNode *node, *opacity_node;
- node = gtk_snapshot_collect_default (nodes, n_nodes, name, NULL);
+ node = gtk_snapshot_collect_default (state, nodes, n_nodes, name);
if (node == NULL)
return NULL;
- opacity_node = gsk_opacity_node_new (node, *(double *) opacity);
+ opacity_node = gsk_opacity_node_new (node, state->data.opacity.opacity);
if (name)
gsk_render_node_set_name (opacity_node, name);
gsk_render_node_unref (node);
- g_free (opacity);
return opacity_node;
}
-typedef struct _ColorMatrix ColorMatrix;
-struct _ColorMatrix {
- graphene_matrix_t matrix;
- graphene_vec4_t offset;
-};
-
void
gtk_snapshot_push_opacity (GtkSnapshot *snapshot,
double opacity,
const char *name,
...)
{
- double *real_opacity;
+ GtkSnapshotState *state;
char *str;
if (name && snapshot->record_names)
@@ -326,38 +312,35 @@ gtk_snapshot_push_opacity (GtkSnapshot *snapshot,
else
str = NULL;
- real_opacity = g_memdup (&opacity, sizeof (gdouble));
-
- snapshot->state = gtk_snapshot_state_new (snapshot->state,
- str,
- snapshot->state->clip_region,
- snapshot->state->translate_x,
- snapshot->state->translate_y,
- gtk_snapshot_collect_opacity,
- real_opacity);
+ state = gtk_snapshot_state_new (snapshot->state,
+ str,
+ snapshot->state->clip_region,
+ snapshot->state->translate_x,
+ snapshot->state->translate_y,
+ gtk_snapshot_collect_opacity);
+ state->data.opacity.opacity = opacity;
+ snapshot->state = state;
}
static GskRenderNode *
-gtk_snapshot_collect_color_matrix (GskRenderNode **nodes,
- guint n_nodes,
- const char *name,
- gpointer data)
+gtk_snapshot_collect_color_matrix (GtkSnapshotState *state,
+ GskRenderNode **nodes,
+ guint n_nodes,
+ const char *name)
{
- ColorMatrix *color_matrix = data;
GskRenderNode *node, *color_matrix_node;
- node = gtk_snapshot_collect_default (nodes, n_nodes, name, NULL);
+ node = gtk_snapshot_collect_default (state, nodes, n_nodes, name);
if (node == NULL)
return NULL;
color_matrix_node = gsk_color_matrix_node_new (node,
- &color_matrix->matrix,
- &color_matrix->offset);
+ &state->data.color_matrix.matrix,
+ &state->data.color_matrix.offset);
if (name)
gsk_render_node_set_name (color_matrix_node, name);
gsk_render_node_unref (node);
- g_free (color_matrix);
return color_matrix_node;
}
@@ -369,7 +352,7 @@ gtk_snapshot_push_color_matrix (GtkSnapshot *snapshot,
const char *name,
...)
{
- ColorMatrix *color_matrix_data;
+ GtkSnapshotState *state;
char *str;
if (name && snapshot->record_names)
@@ -383,17 +366,16 @@ gtk_snapshot_push_color_matrix (GtkSnapshot *snapshot,
else
str = NULL;
- color_matrix_data = g_new (ColorMatrix, 1);
- graphene_matrix_init_from_matrix (&color_matrix_data->matrix, color_matrix);
- graphene_vec4_init_from_vec4 (&color_matrix_data->offset, color_offset);
+ state = gtk_snapshot_state_new (snapshot->state,
+ str,
+ snapshot->state->clip_region,
+ snapshot->state->translate_x,
+ snapshot->state->translate_y,
+ gtk_snapshot_collect_color_matrix);
- snapshot->state = gtk_snapshot_state_new (snapshot->state,
- str,
- snapshot->state->clip_region,
- snapshot->state->translate_x,
- snapshot->state->translate_y,
- gtk_snapshot_collect_color_matrix,
- color_matrix_data);
+ graphene_matrix_init_from_matrix (&state->data.color_matrix.matrix, color_matrix);
+ graphene_vec4_init_from_vec4 (&state->data.color_matrix.offset, color_offset);
+ snapshot->state = state;
}
static void
@@ -407,26 +389,26 @@ rectangle_init_from_graphene (cairo_rectangle_int_t *cairo,
}
static GskRenderNode *
-gtk_snapshot_collect_repeat (GskRenderNode **nodes,
- guint n_nodes,
- const char *name,
- gpointer data)
+gtk_snapshot_collect_repeat (GtkSnapshotState *state,
+ GskRenderNode **nodes,
+ guint n_nodes,
+ const char *name)
{
GskRenderNode *node, *repeat_node;
- graphene_rect_t *bounds = data;
+ graphene_rect_t *bounds = &state->data.repeat.bounds;
+ graphene_rect_t *child_bounds = &state->data.repeat.child_bounds;
- node = gtk_snapshot_collect_default (nodes, n_nodes, name, NULL);
+ node = gtk_snapshot_collect_default (state, nodes, n_nodes, name);
if (node == NULL)
return NULL;
- repeat_node = gsk_repeat_node_new (&bounds[0],
+ repeat_node = gsk_repeat_node_new (bounds,
node,
- bounds[1].size.width > 0 ? &bounds[1] : NULL);
+ child_bounds->size.width > 0 ? child_bounds : NULL);
if (name)
gsk_render_node_set_name (repeat_node, name);
gsk_render_node_unref (node);
- g_free (data);
return repeat_node;
}
@@ -438,8 +420,9 @@ gtk_snapshot_push_repeat (GtkSnapshot *snapshot,
const char *name,
...)
{
- cairo_region_t *clip;
- graphene_rect_t *data;
+ GtkSnapshotState *state;
+ cairo_region_t *clip = NULL;
+ graphene_rect_t real_child_bounds = { { 0 } };
char *str;
if (name && snapshot->record_names)
@@ -453,48 +436,47 @@ gtk_snapshot_push_repeat (GtkSnapshot *snapshot,
else
str = NULL;
- data = g_new0 (graphene_rect_t, 2);
- graphene_rect_offset_r (bounds, snapshot->state->translate_x, snapshot->state->translate_y, &data[0]);
if (child_bounds)
{
cairo_rectangle_int_t rect;
- graphene_rect_offset_r (child_bounds, snapshot->state->translate_x, snapshot->state->translate_y,
&data[1]);
- rectangle_init_from_graphene (&rect, &data[1]);
+ graphene_rect_offset_r (child_bounds, snapshot->state->translate_x, snapshot->state->translate_y,
&real_child_bounds);
+ rectangle_init_from_graphene (&rect, &real_child_bounds);
clip = cairo_region_create_rectangle (&rect);
}
- else
- clip = NULL;
- snapshot->state = gtk_snapshot_state_new (snapshot->state,
- str,
- clip,
- snapshot->state->translate_x,
- snapshot->state->translate_y,
- gtk_snapshot_collect_repeat,
- data);
+ state = gtk_snapshot_state_new (snapshot->state,
+ str,
+ clip,
+ snapshot->state->translate_x,
+ snapshot->state->translate_y,
+ gtk_snapshot_collect_repeat);
+
+ graphene_rect_offset_r (bounds, snapshot->state->translate_x, snapshot->state->translate_y,
&state->data.repeat.bounds);
+ state->data.repeat.child_bounds = real_child_bounds;
+
+ snapshot->state = state;
if (clip)
cairo_region_destroy (clip);
}
static GskRenderNode *
-gtk_snapshot_collect_clip (GskRenderNode **nodes,
- guint n_nodes,
- const char *name,
- gpointer bounds)
+gtk_snapshot_collect_clip (GtkSnapshotState *state,
+ GskRenderNode **nodes,
+ guint n_nodes,
+ const char *name)
{
GskRenderNode *node, *clip_node;
- node = gtk_snapshot_collect_default (nodes, n_nodes, name, NULL);
+ node = gtk_snapshot_collect_default (state, nodes, n_nodes, name);
if (node == NULL)
return NULL;
- clip_node = gsk_clip_node_new (node, bounds);
+ clip_node = gsk_clip_node_new (node, &state->data.clip.bounds);
if (name)
gsk_render_node_set_name (clip_node, name);
gsk_render_node_unref (node);
- g_slice_free (graphene_rect_t, bounds);
return clip_node;
}
@@ -505,13 +487,13 @@ gtk_snapshot_push_clip (GtkSnapshot *snapshot,
const char *name,
...)
{
- graphene_rect_t *real_bounds;
+ GtkSnapshotState *state;
+ graphene_rect_t real_bounds;
cairo_region_t *clip;
cairo_rectangle_int_t rect;
char *str;
- real_bounds = g_slice_new (graphene_rect_t);
- graphene_rect_offset_r (bounds, snapshot->state->translate_x, snapshot->state->translate_y, real_bounds);
+ graphene_rect_offset_r (bounds, snapshot->state->translate_x, snapshot->state->translate_y, &real_bounds);
if (name && snapshot->record_names)
{
@@ -523,8 +505,8 @@ gtk_snapshot_push_clip (GtkSnapshot *snapshot,
}
else
str = NULL;
-
- rectangle_init_from_graphene (&rect, real_bounds);
+
+ rectangle_init_from_graphene (&rect, &real_bounds);
if (snapshot->state->clip_region)
{
clip = cairo_region_copy (snapshot->state->clip_region);
@@ -534,35 +516,37 @@ gtk_snapshot_push_clip (GtkSnapshot *snapshot,
{
clip = cairo_region_create_rectangle (&rect);
}
- snapshot->state = gtk_snapshot_state_new (snapshot->state,
- str,
- clip,
- snapshot->state->translate_x,
- snapshot->state->translate_y,
- gtk_snapshot_collect_clip,
- real_bounds);
+ state = gtk_snapshot_state_new (snapshot->state,
+ str,
+ clip,
+ snapshot->state->translate_x,
+ snapshot->state->translate_y,
+ gtk_snapshot_collect_clip);
+
+ state->data.clip.bounds = real_bounds;
+
+ snapshot->state = state;
cairo_region_destroy (clip);
}
static GskRenderNode *
-gtk_snapshot_collect_rounded_clip (GskRenderNode **nodes,
- guint n_nodes,
- const char *name,
- gpointer bounds)
+gtk_snapshot_collect_rounded_clip (GtkSnapshotState *state,
+ GskRenderNode **nodes,
+ guint n_nodes,
+ const char *name)
{
GskRenderNode *node, *clip_node;
- node = gtk_snapshot_collect_default (nodes, n_nodes, name, NULL);
+ node = gtk_snapshot_collect_default (state, nodes, n_nodes, name);
if (node == NULL)
return NULL;
- clip_node = gsk_rounded_clip_node_new (node, bounds);
+ clip_node = gsk_rounded_clip_node_new (node, &state->data.rounded_clip.bounds);
if (name)
gsk_render_node_set_name (clip_node, name);
gsk_render_node_unref (node);
- g_slice_free (GskRoundedRect, bounds);
return clip_node;
}
@@ -573,14 +557,14 @@ gtk_snapshot_push_rounded_clip (GtkSnapshot *snapshot,
const char *name,
...)
{
- GskRoundedRect *real_bounds;
+ GtkSnapshotState *state;
+ GskRoundedRect real_bounds;
cairo_region_t *clip;
cairo_rectangle_int_t rect;
char *str;
- real_bounds = g_slice_new (GskRoundedRect);
- gsk_rounded_rect_init_copy (real_bounds, bounds);
- gsk_rounded_rect_offset (real_bounds, snapshot->state->translate_x, snapshot->state->translate_y);
+ gsk_rounded_rect_init_copy (&real_bounds, bounds);
+ gsk_rounded_rect_offset (&real_bounds, snapshot->state->translate_x, snapshot->state->translate_y);
if (name && snapshot->record_names)
{
@@ -592,8 +576,8 @@ gtk_snapshot_push_rounded_clip (GtkSnapshot *snapshot,
}
else
str = NULL;
-
- rectangle_init_from_graphene (&rect, &real_bounds->bounds);
+
+ rectangle_init_from_graphene (&rect, &real_bounds.bounds);
if (snapshot->state->clip_region)
{
clip = cairo_region_copy (snapshot->state->clip_region);
@@ -603,41 +587,40 @@ gtk_snapshot_push_rounded_clip (GtkSnapshot *snapshot,
{
clip = cairo_region_create_rectangle (&rect);
}
- snapshot->state = gtk_snapshot_state_new (snapshot->state,
- str,
- clip,
- snapshot->state->translate_x,
- snapshot->state->translate_y,
- gtk_snapshot_collect_rounded_clip,
- real_bounds);
+ state = gtk_snapshot_state_new (snapshot->state,
+ str,
+ clip,
+ snapshot->state->translate_x,
+ snapshot->state->translate_y,
+ gtk_snapshot_collect_rounded_clip);
+
+
+ state->data.rounded_clip.bounds = real_bounds;
+
+ snapshot->state = state;
cairo_region_destroy (clip);
}
-typedef struct {
- gsize n_shadows;
- GskShadow shadows[0];
-} Shadow;
-
static GskRenderNode *
-gtk_snapshot_collect_shadow (GskRenderNode **nodes,
- guint n_nodes,
- const char *name,
- gpointer data)
+gtk_snapshot_collect_shadow (GtkSnapshotState *state,
+ GskRenderNode **nodes,
+ guint n_nodes,
+ const char *name)
{
- Shadow *shadow = data;
GskRenderNode *node, *shadow_node;
- node = gtk_snapshot_collect_default (nodes, n_nodes, name, NULL);
+ node = gtk_snapshot_collect_default (state, nodes, n_nodes, name);
if (node == NULL)
return NULL;
- shadow_node = gsk_shadow_node_new (node, shadow->shadows, shadow->n_shadows);
+ shadow_node = gsk_shadow_node_new (node, state->data.shadow.shadows, state->data.shadow.n_shadows);
if (name)
gsk_render_node_set_name (shadow_node, name);
gsk_render_node_unref (node);
- g_free (shadow);
+ if (state->data.shadow.shadows != &state->data.shadow.a_shadow)
+ g_free (state->data.shadow.shadows);
return shadow_node;
}
@@ -649,12 +632,9 @@ gtk_snapshot_push_shadow (GtkSnapshot *snapshot,
const char *name,
...)
{
- Shadow *real_shadow;
+ GtkSnapshotState *state;
char *str;
- real_shadow = g_malloc (sizeof (GskShadow) * n_shadows + sizeof (GskShadow));
- real_shadow->n_shadows = n_shadows;
- memcpy (real_shadow->shadows, shadow, sizeof (GskShadow) * n_shadows);
if (name && snapshot->record_names)
{
@@ -666,14 +646,22 @@ gtk_snapshot_push_shadow (GtkSnapshot *snapshot,
}
else
str = NULL;
-
- snapshot->state = gtk_snapshot_state_new (snapshot->state,
- str,
- snapshot->state->clip_region,
- snapshot->state->translate_x,
- snapshot->state->translate_y,
- gtk_snapshot_collect_shadow,
- real_shadow);
+
+ state = gtk_snapshot_state_new (snapshot->state,
+ str,
+ snapshot->state->clip_region,
+ snapshot->state->translate_x,
+ snapshot->state->translate_y,
+ gtk_snapshot_collect_shadow);
+
+ state->data.shadow.n_shadows = n_shadows;
+ if (n_shadows == 1)
+ state->data.shadow.shadows = &state->data.shadow.a_shadow;
+ else
+ state->data.shadow.shadows = g_malloc (sizeof (GskShadow) * n_shadows);
+ memcpy (state->data.shadow.shadows, shadow, sizeof (GskShadow) * n_shadows);
+
+ snapshot->state = state;
}
/**
@@ -704,10 +692,10 @@ gtk_snapshot_pop (GtkSnapshot *snapshot)
state = snapshot->state;
snapshot->state = state->parent;
- node = state->collect_func ((GskRenderNode **) state->nodes->pdata,
+ node = state->collect_func (state,
+ (GskRenderNode **) state->nodes->pdata,
state->nodes->len,
- state->name,
- state->collect_data);
+ state->name);
gtk_snapshot_state_free (state);
diff --git a/gtk/gtksnapshotprivate.h b/gtk/gtksnapshotprivate.h
index a06383b..3141558 100644
--- a/gtk/gtksnapshotprivate.h
+++ b/gtk/gtksnapshotprivate.h
@@ -24,10 +24,10 @@ G_BEGIN_DECLS
typedef struct _GtkSnapshotState GtkSnapshotState;
-typedef GskRenderNode * (* GtkSnapshotCollectFunc) (GskRenderNode **nodes,
- guint n_nodes,
- const char *name,
- gpointer user_data);
+typedef GskRenderNode * (* GtkSnapshotCollectFunc) (GtkSnapshotState *state,
+ GskRenderNode **nodes,
+ guint n_nodes,
+ const char *name);
struct _GtkSnapshotState {
GtkSnapshotState *parent;
@@ -40,7 +40,33 @@ struct _GtkSnapshotState {
double translate_y;
GtkSnapshotCollectFunc collect_func;
- gpointer collect_data;
+ union {
+ struct {
+ graphene_matrix_t transform;
+ } transform;
+ struct {
+ double opacity;
+ } opacity;
+ struct {
+ graphene_matrix_t matrix;
+ graphene_vec4_t offset;
+ } color_matrix;
+ struct {
+ graphene_rect_t bounds;
+ graphene_rect_t child_bounds;
+ } repeat;
+ struct {
+ graphene_rect_t bounds;
+ } clip;
+ struct {
+ GskRoundedRect bounds;
+ } rounded_clip;
+ struct {
+ gsize n_shadows;
+ GskShadow *shadows;
+ GskShadow a_shadow; /* Used if n_shadows == 1 */
+ } shadow;
+ } data;
};
struct _GtkSnapshot {
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]