summaryrefslogtreecommitdiff
path: root/demos/gtk-demo/nodewidget.c
diff options
context:
space:
mode:
authorMatthias Clasen <mclasen@redhat.com>2022-04-08 13:10:43 -0400
committerMatthias Clasen <mclasen@redhat.com>2022-04-08 16:44:29 -0400
commit303dcc667b64ad57f5320cadbe4e4437d0d0558a (patch)
tree8b09ca90c698baab3183aebf7783a6457d9a0285 /demos/gtk-demo/nodewidget.c
parenta73b6b4392f68c0015bb5dbf299f007ac7e87e72 (diff)
downloadgtk+-path-work-rebased.tar.gz
gtk-demo: Add a few path benchmarkspath-work-rebased
The Tiger and Graph examples in the fishbowl test path handling.
Diffstat (limited to 'demos/gtk-demo/nodewidget.c')
-rw-r--r--demos/gtk-demo/nodewidget.c76
1 files changed, 76 insertions, 0 deletions
diff --git a/demos/gtk-demo/nodewidget.c b/demos/gtk-demo/nodewidget.c
new file mode 100644
index 0000000000..06fbf74217
--- /dev/null
+++ b/demos/gtk-demo/nodewidget.c
@@ -0,0 +1,76 @@
+#include "nodewidget.h"
+
+struct _NodeWidget
+{
+ GtkWidget parent_instance;
+
+ GskRenderNode *node;
+};
+
+struct _NodeWidgetClass
+{
+ GtkWidgetClass parent_class;
+};
+
+G_DEFINE_TYPE (NodeWidget, node_widget, GTK_TYPE_WIDGET)
+
+static void
+node_widget_init (NodeWidget *self)
+{
+}
+
+static void
+node_widget_dispose (GObject *object)
+{
+ NodeWidget *self = NODE_WIDGET (object);
+
+ gsk_render_node_unref (self->node);
+
+ G_OBJECT_CLASS (node_widget_parent_class)->dispose (object);
+}
+
+static void
+node_widget_snapshot (GtkWidget *widget,
+ GtkSnapshot *snapshot)
+{
+ NodeWidget *self = NODE_WIDGET (widget);
+
+ gtk_snapshot_append_node (snapshot, self->node);
+}
+
+static void
+node_widget_class_init (NodeWidgetClass *class)
+{
+ GObjectClass *object_class = G_OBJECT_CLASS (class);
+ GtkWidgetClass *widget_class = GTK_WIDGET_CLASS (class);
+
+ object_class->dispose = node_widget_dispose;
+
+ widget_class->snapshot = node_widget_snapshot;
+}
+
+GtkWidget *
+node_widget_new (const char *resource)
+{
+ NodeWidget *self;
+ GBytes *bytes;
+ GskRenderNode *node;
+ graphene_rect_t bounds;
+ float scale;
+ GskTransform *transform;
+
+ self = g_object_new (NODE_TYPE_WIDGET, NULL);
+
+ bytes = g_resources_lookup_data (resource, 0, NULL);
+ node = gsk_render_node_deserialize (bytes, NULL, NULL);
+ g_bytes_unref (bytes);
+
+ gsk_render_node_get_bounds (node, &bounds);
+ scale = MIN (100.0/bounds.size.width, 100.0/bounds.size.height);
+ transform = gsk_transform_scale (NULL, scale, scale);
+ self->node = gsk_transform_node_new (node, transform);
+ gsk_transform_unref (transform);
+ gsk_render_node_unref (node);
+
+ return GTK_WIDGET (self);
+}