77 lines
1.6 KiB
C
77 lines
1.6 KiB
C
#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);
|
|
}
|