From b49b05518358852452f88b123ca3b6c031a595c0 Mon Sep 17 00:00:00 2001 From: Benjamin Otte Date: Sun, 28 Jan 2024 03:21:52 +0100 Subject: [PATCH] rendernode: Implement diff() for repeat nodes If the children have an empty diff and the repeat nodes' sizes are equal, the diff is empty. --- gsk/gskrendernodeimpl.c | 27 +++++++++++++++++++++++++++ 1 file changed, 27 insertions(+) diff --git a/gsk/gskrendernodeimpl.c b/gsk/gskrendernodeimpl.c index 01c1b53716..ec91dc8f79 100644 --- a/gsk/gskrendernodeimpl.c +++ b/gsk/gskrendernodeimpl.c @@ -4224,6 +4224,32 @@ gsk_repeat_node_draw (GskRenderNode *node, } } +static void +gsk_repeat_node_diff (GskRenderNode *node1, + GskRenderNode *node2, + GskDiffData *data) +{ + GskRepeatNode *self1 = (GskRepeatNode *) node1; + GskRepeatNode *self2 = (GskRepeatNode *) node2; + + if (gsk_rect_equal (&node1->bounds, &node2->bounds) && + gsk_rect_equal (&self1->child_bounds, &self2->child_bounds)) + { + cairo_region_t *sub; + + sub = cairo_region_create(); + gsk_render_node_data_diff (self1->child, self2->child, &(GskDiffData) {sub, data->offload }); + if (cairo_region_is_empty (sub)) + { + cairo_region_destroy (sub); + return; + } + cairo_region_destroy (sub); + } + + gsk_render_node_diff_impossible (node1, node2, data); +} + static void gsk_repeat_node_class_init (gpointer g_class, gpointer class_data) @@ -4234,6 +4260,7 @@ gsk_repeat_node_class_init (gpointer g_class, node_class->finalize = gsk_repeat_node_finalize; node_class->draw = gsk_repeat_node_draw; + node_class->diff = gsk_repeat_node_diff; } /**