From e4040adbe7dbec82962699f654802d17ca77e4fd Mon Sep 17 00:00:00 2001 From: Benjamin Otte Date: Mon, 1 May 2023 22:23:50 +0200 Subject: [PATCH] rendernode: Implement texture diffing for scale nodes --- gsk/gskrendernodeimpl.c | 24 ++++++++++++++++++++---- 1 file changed, 20 insertions(+), 4 deletions(-) diff --git a/gsk/gskrendernodeimpl.c b/gsk/gskrendernodeimpl.c index a0b6fd9b2f..90ef6fd13f 100644 --- a/gsk/gskrendernodeimpl.c +++ b/gsk/gskrendernodeimpl.c @@ -1844,13 +1844,29 @@ gsk_texture_scale_node_diff (GskRenderNode *node1, { GskTextureScaleNode *self1 = (GskTextureScaleNode *) node1; GskTextureScaleNode *self2 = (GskTextureScaleNode *) node2; + cairo_region_t *sub; - if (graphene_rect_equal (&node1->bounds, &node2->bounds) && - self1->texture == self2->texture && - self1->filter == self2->filter) + if (!graphene_rect_equal (&node1->bounds, &node2->bounds) || + self1->filter != self2->filter || + gdk_texture_get_width (self1->texture) != gdk_texture_get_width (self2->texture) || + gdk_texture_get_height (self1->texture) != gdk_texture_get_height (self2->texture)) + { + gsk_render_node_diff_impossible (node1, node2, region); + return; + } + + if (self1->texture == self2->texture) return; - gsk_render_node_diff_impossible (node1, node2, region); + sub = cairo_region_create (); + gdk_texture_diff (self1->texture, self2->texture, sub); + region_union_region_affine (region, + sub, + node1->bounds.size.width / gdk_texture_get_width (self1->texture), + node1->bounds.size.height / gdk_texture_get_height (self1->texture), + node1->bounds.origin.x, + node1->bounds.origin.y); + cairo_region_destroy (sub); } static void