summaryrefslogtreecommitdiff
path: root/gsk/gskrendernode.c
diff options
context:
space:
mode:
Diffstat (limited to 'gsk/gskrendernode.c')
-rw-r--r--gsk/gskrendernode.c39
1 files changed, 36 insertions, 3 deletions
diff --git a/gsk/gskrendernode.c b/gsk/gskrendernode.c
index 9fe76d64f7..04f2bbdc66 100644
--- a/gsk/gskrendernode.c
+++ b/gsk/gskrendernode.c
@@ -144,10 +144,15 @@ gsk_render_node_finalize (GskRenderNode *self)
{
GskRenderNodeIter iter;
+ /* We need to drop the reference on each child
+ * before clearing the node
+ */
gsk_render_node_iter_init (&iter, self);
while (gsk_render_node_iter_next (&iter, NULL))
gsk_render_node_iter_remove (&iter);
+ gsk_render_node_clear (self);
+
g_type_free_instance ((GTypeInstance *) self);
}
@@ -231,14 +236,12 @@ gsk_render_node_get_type (void)
return gsk_render_node_type__volatile;
}
-/**
+/*< private >
* gsk_render_node_new:
*
* Creates a new #GskRenderNode, to be used with #GskRenderer.
*
* Returns: (transfer full): the newly created #GskRenderNode
- *
- * Since: 3.22
*/
GskRenderNode *
gsk_render_node_new (void)
@@ -246,6 +249,36 @@ gsk_render_node_new (void)
return (GskRenderNode *) g_type_create_instance (GSK_TYPE_RENDER_NODE);
}
+void
+gsk_render_node_clear (GskRenderNode *self)
+{
+ graphene_rect_init_from_rect (&self->bounds, graphene_rect_zero ());
+
+ graphene_matrix_init_identity (&self->transform);
+ graphene_matrix_init_identity (&self->child_transform);
+
+ self->opacity = 1.0;
+
+ self->is_mutable = TRUE;
+ self->opaque = FALSE;
+ self->hidden = FALSE;
+ self->needs_world_matrix_update = TRUE;
+
+ self->parent = NULL;
+ self->first_child = NULL;
+ self->last_child = NULL;
+ self->prev_sibling = NULL;
+ self->next_sibling = NULL;
+ self->n_children = 0;
+
+ self->age = 0;
+
+ g_free (self->name);
+ self->name = NULL;
+
+ g_clear_pointer (&self->surface, cairo_surface_destroy);
+}
+
/**
* gsk_render_node_ref:
* @node: a #GskRenderNode