rendernode: Implement texture diffing for scale nodes
authorBenjamin Otte <otte@redhat.com>
Mon, 1 May 2023 20:23:50 +0000 (22:23 +0200)
committerBenjamin Otte <otte@redhat.com>
Mon, 1 May 2023 22:30:58 +0000 (00:30 +0200)
gsk/gskrendernodeimpl.c

index a0b6fd9b2fb02db415610568576d153066069648..90ef6fd13f78bc2827ecb5b451af012093d7d269 100644 (file)
@@ -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