summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorBenjamin Otte <otte@redhat.com>2023-05-01 22:23:50 +0200
committerBenjamin Otte <otte@redhat.com>2023-05-02 00:30:58 +0200
commite4040adbe7dbec82962699f654802d17ca77e4fd (patch)
tree7c9b90ea995bf4563d1a94c1f24e9dd9e335345f
parent6506a3bc9c2b988bd8fbd93a2bca60203ad09153 (diff)
downloadgtk+-e4040adbe7dbec82962699f654802d17ca77e4fd.tar.gz
rendernode: Implement texture diffing for scale nodes
-rw-r--r--gsk/gskrendernodeimpl.c24
1 files 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