diff --git a/gtk/gtksnapshot.c b/gtk/gtksnapshot.c index dfcd3f3ac7..e977e4af9f 100644 --- a/gtk/gtksnapshot.c +++ b/gtk/gtksnapshot.c @@ -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) diff --git a/gtk/gtksnapshot.h b/gtk/gtksnapshot.h index ea9c578ad3..c5c2d20b3d 100644 --- a/gtk/gtksnapshot.h +++ b/gtk/gtksnapshot.h @@ -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, diff --git a/gtk/gtkwidget.c b/gtk/gtkwidget.c index 163f621a8b..8c54364362 100644 --- a/gtk/gtkwidget.c +++ b/gtk/gtkwidget.c @@ -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); } }