From: Benjamin Otte Date: Mon, 1 May 2023 20:23:50 +0000 (+0200) Subject: rendernode: Implement texture diffing for scale nodes X-Git-Tag: archive/raspbian/4.12.3+ds-1+rpi1~1^2^2^2~22^2~1^2~301^2~1 X-Git-Url: https://dgit.raspbian.org/?a=commitdiff_plain;h=e4040adbe7dbec82962699f654802d17ca77e4fd;p=gtk4.git rendernode: Implement texture diffing for scale nodes --- 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