diff options
author | Benjamin Otte <otte@redhat.com> | 2023-05-01 22:23:50 +0200 |
---|---|---|
committer | Benjamin Otte <otte@redhat.com> | 2023-05-02 00:30:58 +0200 |
commit | e4040adbe7dbec82962699f654802d17ca77e4fd (patch) | |
tree | 7c9b90ea995bf4563d1a94c1f24e9dd9e335345f /gsk | |
parent | 6506a3bc9c2b988bd8fbd93a2bca60203ad09153 (diff) | |
download | gtk+-e4040adbe7dbec82962699f654802d17ca77e4fd.tar.gz |
rendernode: Implement texture diffing for scale nodes
Diffstat (limited to 'gsk')
-rw-r--r-- | gsk/gskrendernodeimpl.c | 24 |
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 |