[gtk+/wip/otte/rendernode: 86/100] snapshot: Implement gtk_snapshot_push_opacity()



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]