[gtk+] snapshot: Add GtkSnapshotState



commit 7493f906626e4800e7e05186d95291e48aaa89a7
Author: Benjamin Otte <otte redhat com>
Date:   Thu Nov 17 01:55:26 2016 +0100

    snapshot: Add GtkSnapshotState
    
    Essentially copies cairo_gstate_t.
    
    This is in preparation for attaching more information to the snapshot.

 gtk/gtksnapshot.c        |   88 ++++++++++++++++++++++++++++++++-------------
 gtk/gtksnapshotprivate.h |   18 +++++++---
 2 files changed, 75 insertions(+), 31 deletions(-)
---
diff --git a/gtk/gtksnapshot.c b/gtk/gtksnapshot.c
index fe3500c..22752dd 100644
--- a/gtk/gtksnapshot.c
+++ b/gtk/gtksnapshot.c
@@ -29,36 +29,61 @@
 
 #include "gsk/gskrendernodeprivate.h"
 
+static GtkSnapshotState *
+gtk_snapshot_state_new (GtkSnapshotState *parent,
+                        GskRenderNode    *node)
+{
+  GtkSnapshotState *state;
+
+  state = g_slice_new0 (GtkSnapshotState);
+
+  state->node = node;
+  state->parent = parent;
+  graphene_matrix_init_identity (&state->transform);
+
+  return state;
+}
+
+static void
+gtk_snapshot_state_free (GtkSnapshotState *state)
+{
+  g_slice_free (GtkSnapshotState, state);
+}
+
+static void
+gtk_snapshot_state_set_transform (GtkSnapshotState        *state,
+                                  const graphene_matrix_t *transform)
+{
+  graphene_matrix_init_from_matrix (&state->transform, transform);
+}
+
 void
 gtk_snapshot_init (GtkSnapshot *state,
                    GskRenderer *renderer)
 {
-  state->node = NULL;
+  state->state = NULL;
   state->root = NULL;
   state->renderer = renderer;
-
-  graphene_matrix_init_identity (&state->transform);
 }
 
 GskRenderNode *
-gtk_snapshot_finish (GtkSnapshot *state)
+gtk_snapshot_finish (GtkSnapshot *snapshot)
 {
-  if (state->node != NULL)
+  if (snapshot->state != NULL)
     {
       g_warning ("Too many gtk_snapshot_push() calls.");
     }
 
-  return state->root;
+  return snapshot->root;
 }
 
 void
-gtk_snapshot_push_node (GtkSnapshot   *state,
+gtk_snapshot_push_node (GtkSnapshot   *snapshot,
                         GskRenderNode *node)
 {
-  gtk_snapshot_append_node (state, node);
+  gtk_snapshot_append_node (snapshot, node);
 
-  state->node = node;
-  graphene_matrix_init_identity (&state->transform);
+  snapshot->state = gtk_snapshot_state_new (snapshot->state, node);
 }
 
 void
@@ -91,17 +116,20 @@ gtk_snapshot_push (GtkSnapshot           *state,
 }
 
 void
-gtk_snapshot_pop (GtkSnapshot *state)
+gtk_snapshot_pop (GtkSnapshot *snapshot)
 {
-  if (state->node == NULL)
+  GtkSnapshotState *state;
+
+  if (snapshot->state == NULL)
     {
       g_warning ("Too many gtk_snapshot_pop() calls.");
       return;
     }
 
-  gsk_render_node_get_transform (state->node, &state->transform);
+  state = snapshot->state;
+  snapshot->state = state->parent;
 
-  state->node = gsk_render_node_get_parent (state->node);
+  gtk_snapshot_state_free (state);
 }
 
 GskRenderer *
@@ -139,20 +167,24 @@ gtk_snapshot_create_render_node (const GtkSnapshot *state,
 #endif
 
 void
-gtk_snapshot_set_transform (GtkSnapshot             *state,
+gtk_snapshot_set_transform (GtkSnapshot             *snapshot,
                             const graphene_matrix_t *transform)
 {
-  graphene_matrix_init_from_matrix (&state->transform, transform);
+  g_return_if_fail (snapshot->state != NULL);
+
+  gtk_snapshot_state_set_transform (snapshot->state, transform);
 }
 
 void
-gtk_snapshot_transform (GtkSnapshot             *state,
+gtk_snapshot_transform (GtkSnapshot             *snapshot,
                         const graphene_matrix_t *transform)
 {
   graphene_matrix_t result;
 
-  graphene_matrix_multiply (transform, &state->transform, &result);
-  graphene_matrix_init_from_matrix (&state->transform, &result);
+  g_return_if_fail (snapshot->state != NULL);
+
+  graphene_matrix_multiply (transform, &snapshot->state->transform, &result);
+  gtk_snapshot_state_set_transform (snapshot->state, &result);
 }
 
 void
@@ -169,17 +201,21 @@ gtk_snapshot_translate_2d (GtkSnapshot *state,
 }
 
 void
-gtk_snapshot_append_node (GtkSnapshot   *state,
+gtk_snapshot_append_node (GtkSnapshot   *snapshot,
                           GskRenderNode *node)
 {
-  g_return_if_fail (state != NULL);
+  g_return_if_fail (snapshot != NULL);
   g_return_if_fail (GSK_IS_RENDER_NODE (node));
 
-  gsk_render_node_set_transform (node, &state->transform);
-  if (state->node)
-    gsk_render_node_append_child (state->node, node);
-  else if (state->root == NULL)
-    state->root = gsk_render_node_ref (node);
+  if (snapshot->state)
+    {
+      gsk_render_node_append_child (snapshot->state->node, node);
+      gsk_render_node_set_transform (node, &snapshot->state->transform);
+    }
+  else if (snapshot->root == NULL)
+    {
+      snapshot->root = gsk_render_node_ref (node);
+    }
   else
     {
       g_critical ("Tried appending a node to an already finished snapshot.");
diff --git a/gtk/gtksnapshotprivate.h b/gtk/gtksnapshotprivate.h
index 05c02cd..084331b 100644
--- a/gtk/gtksnapshotprivate.h
+++ b/gtk/gtksnapshotprivate.h
@@ -22,15 +22,23 @@
 
 G_BEGIN_DECLS
 
-struct _GtkSnapshot {
+typedef struct _GtkSnapshotState GtkSnapshotState;
+
+struct _GtkSnapshotState {
+  GtkSnapshotState      *parent;
+
   GskRenderNode         *node;
-  GskRenderNode         *root;
-  
-  GskRenderer           *renderer;
 
   graphene_matrix_t      transform;
 };
 
+struct _GtkSnapshot {
+  GtkSnapshotState      *state;
+
+  GskRenderNode         *root;
+  GskRenderer           *renderer;
+};
+
 void            gtk_snapshot_init               (GtkSnapshot             *state,
                                                  GskRenderer             *renderer);
 GskRenderNode * gtk_snapshot_finish             (GtkSnapshot             *state);
@@ -38,7 +46,7 @@ GskRenderNode * gtk_snapshot_finish             (GtkSnapshot             *state)
 static inline const graphene_matrix_t *
 gtk_snapshot_get_transform (const GtkSnapshot *snapshot)
 {
-  return &snapshot->transform;
+  return &snapshot->state->transform;
 }
 
 G_END_DECLS


[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]