snapshot: Repeat color nodes by creating a larger color node
authorTimm Bäder <mail@baedert.org>
Thu, 19 Dec 2019 08:15:13 +0000 (09:15 +0100)
committerTimm Bäder <mail@baedert.org>
Tue, 7 Jan 2020 16:27:17 +0000 (17:27 +0100)
gtk/gtksnapshot.c

index a7f55e6bbb30f6b896ae92327da2c9113de4145e..c87ba493f9cae47ea9748ab04cf48e18141f93b6 100644 (file)
@@ -547,13 +547,25 @@ gtk_snapshot_collect_repeat (GtkSnapshot      *snapshot,
                              guint             n_nodes)
 {
   GskRenderNode *node, *repeat_node;
-  graphene_rect_t *bounds = &state->data.repeat.bounds;
-  graphene_rect_t *child_bounds = &state->data.repeat.child_bounds;
+  const graphene_rect_t *bounds = &state->data.repeat.bounds;
+  const graphene_rect_t *child_bounds = &state->data.repeat.child_bounds;
 
   node = gtk_snapshot_collect_default (snapshot, state, nodes, n_nodes);
   if (node == NULL)
     return NULL;
 
+  if (gsk_render_node_get_node_type (node) == GSK_COLOR_NODE &&
+      graphene_rect_equal (child_bounds, &node->bounds))
+    {
+      /* Repeating a color node entirely is pretty easy by just increasing
+       * the size of the color node. */
+      GskRenderNode *color_node = gsk_color_node_new (gsk_color_node_peek_color (node), bounds);
+
+      gsk_render_node_unref (node);
+
+      return color_node;
+    }
+
   repeat_node = gsk_repeat_node_new (bounds,
                                      node,
                                      child_bounds->size.width > 0 ? child_bounds : NULL);