rendernodepaintable: Allow the node to be NULL
authorBenjamin Otte <otte@redhat.com>
Sat, 4 Mar 2023 17:11:36 +0000 (18:11 +0100)
committerBenjamin Otte <otte.benjamin@googlemail.com>
Sun, 5 Mar 2023 15:23:20 +0000 (15:23 +0000)
This can happen when creating paintables from GtkSnapshot when nothing
was drawn.

gtk/gtkrendernodepaintable.c
gtk/gtksnapshot.c

index bbe9cc5b13be5f724eaa81ca330a7fa43b6ef7f7..87bb1ca19a5a4fb15c7ce0ee93e6798333293205 100644 (file)
@@ -45,7 +45,8 @@ gtk_render_node_paintable_paintable_snapshot (GdkPaintable *paintable,
   GtkRenderNodePaintable *self = GTK_RENDER_NODE_PAINTABLE (paintable);
 
   if (self->bounds.size.width <= 0 ||
-      self->bounds.size.height <= 0)
+      self->bounds.size.height <= 0 ||
+      self->node == NULL)
     return;
 
   gtk_snapshot_save (snapshot);
@@ -141,12 +142,12 @@ gtk_render_node_paintable_new (GskRenderNode         *node,
 {
   GtkRenderNodePaintable *self;
 
-  g_return_val_if_fail (GSK_IS_RENDER_NODE (node), NULL);
+  g_return_val_if_fail (node == NULL || GSK_IS_RENDER_NODE (node), NULL);
   g_return_val_if_fail (bounds != NULL, NULL);
 
   self = g_object_new (GTK_TYPE_RENDER_NODE_PAINTABLE, NULL);
 
-  self->node = gsk_render_node_ref (node);
+  self->node = node ? gsk_render_node_ref (node) : NULL;
   self->bounds = *bounds;
 
   return GDK_PAINTABLE (self);
index 1ebc641bea62056ade14a2084a32d232315edd4c..bca57eaab26a9c6fba6b323d5e631a238e8dfe2a 100644 (file)
@@ -1623,17 +1623,22 @@ gtk_snapshot_to_paintable (GtkSnapshot           *snapshot,
     {
       graphene_size_init_from_size (&bounds.size, size);
     }
-  else
+  else if (node)
     {
       gsk_render_node_get_bounds (node, &bounds);
       bounds.size.width += bounds.origin.x;
       bounds.size.height += bounds.origin.y;
     }
+  else
+    {
+      bounds.size.width = 0;
+      bounds.size.height = 0;
+    }
   bounds.origin.x = 0;
   bounds.origin.y = 0;
 
   paintable = gtk_render_node_paintable_new (node, &bounds);
-  gsk_render_node_unref (node);
+  g_clear_pointer (&node, gsk_render_node_unref);
 
   return paintable;
 }