snapshot: Implement gtk_snapshot_push_opacity()

Use it in GtkWidget's opacity handling.
This commit is contained in:
Benjamin Otte 2016-12-17 08:06:59 +01:00
parent 6b29dbf26a
commit 9822fe81a3
3 changed files with 59 additions and 12 deletions

View File

@ -275,6 +275,58 @@ gtk_snapshot_push_transform (GtkSnapshot *snapshot,
real_transform);
}
static GskRenderNode *
gtk_snapshot_collect_opacity (GskRenderNode **nodes,
guint n_nodes,
const char *name,
gpointer opacity)
{
GskRenderNode *node, *opacity_node;
node = gtk_snapshot_collect_default (nodes, n_nodes, name, NULL);
if (node == NULL)
return NULL;
opacity_node = gsk_opacity_node_new (node, *(double *) opacity);
gsk_render_node_set_name (opacity_node, name);
gsk_render_node_unref (node);
g_free (opacity);
return opacity_node;
}
void
gtk_snapshot_push_opacity (GtkSnapshot *snapshot,
double opacity,
const char *name,
...)
{
double *real_opacity;
char *str;
if (name)
{
va_list args;
va_start (args, name);
str = g_strdup_vprintf (name, args);
va_end (args);
}
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);
}
static void
rectangle_init_from_graphene (cairo_rectangle_int_t *cairo,
const graphene_rect_t *graphene)

View File

@ -47,6 +47,11 @@ void gtk_snapshot_push_transform (GtkSnapshot
const char *name,
...) G_GNUC_PRINTF (3, 4);
GDK_AVAILABLE_IN_3_90
void gtk_snapshot_push_opacity (GtkSnapshot *snapshot,
double opacity,
const char *name,
...) G_GNUC_PRINTF (3, 4);
GDK_AVAILABLE_IN_3_90
void gtk_snapshot_push_clip (GtkSnapshot *snapshot,
const graphene_rect_t *bounds,
const char *name,

View File

@ -15573,7 +15573,7 @@ gtk_widget_snapshot (GtkWidget *widget,
else
{
if (opacity < 1.0)
gtk_snapshot_push (snapshot, TRUE, "OpacityGroup<%s>", G_OBJECT_TYPE_NAME (widget));
gtk_snapshot_push_opacity (snapshot, opacity, "Opacity<%s,%f>", G_OBJECT_TYPE_NAME (widget), opacity);
klass->snapshot (widget, snapshot);
@ -15593,17 +15593,7 @@ gtk_widget_snapshot (GtkWidget *widget,
}
if (opacity < 1.0)
{
GskRenderNode *opacity_node, *node;
node = gtk_snapshot_pop (snapshot);
opacity_node = gsk_opacity_node_new (node, opacity);
gsk_render_node_set_name (opacity_node, "Opacity");
gsk_render_node_unref (node);
gtk_snapshot_append_node (snapshot, opacity_node);
gsk_render_node_unref (opacity_node);
}
gtk_snapshot_pop_and_append (snapshot);
}
}