[gtk+/wip/otte/rendernode: 86/100] snapshot: Implement gtk_snapshot_push_opacity()
- From: Benjamin Otte <otte src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [gtk+/wip/otte/rendernode: 86/100] snapshot: Implement gtk_snapshot_push_opacity()
- Date: Sun, 18 Dec 2016 06:35:55 +0000 (UTC)
commit 2bb85b3ab81ab0dc40343230d0c6e9f3c74297eb
Author: Benjamin Otte <otte redhat com>
Date: Sat Dec 17 08:06:59 2016 +0100
snapshot: Implement gtk_snapshot_push_opacity()
Use it in GtkWidget's opacity handling.
gtk/gtksnapshot.c | 52 ++++++++++++++++++++++++++++++++++++++++++++++++++++
gtk/gtksnapshot.h | 5 +++++
gtk/gtkwidget.c | 14 ++------------
3 files changed, 59 insertions(+), 12 deletions(-)
---
diff --git a/gtk/gtksnapshot.c b/gtk/gtksnapshot.c
index dfcd3f3..e977e4a 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 ea9c578..c5c2d20 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 4d3d24d..afd56f0 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);
}
}
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]