diff options
author | Matthias Clasen <mclasen@redhat.com> | 2022-04-08 13:10:43 -0400 |
---|---|---|
committer | Matthias Clasen <mclasen@redhat.com> | 2022-04-08 16:44:29 -0400 |
commit | 303dcc667b64ad57f5320cadbe4e4437d0d0558a (patch) | |
tree | 8b09ca90c698baab3183aebf7783a6457d9a0285 /demos/gtk-demo/nodewidget.c | |
parent | a73b6b4392f68c0015bb5dbf299f007ac7e87e72 (diff) | |
download | gtk+-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.c | 76 |
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); +} |