gsk: Fix texture-scale node Cairo drawing
authorBenjamin Otte <otte@redhat.com>
Fri, 27 Oct 2023 18:45:12 +0000 (20:45 +0200)
committerMatthias Clasen <mclasen@redhat.com>
Fri, 17 Nov 2023 19:58:53 +0000 (14:58 -0500)
The code was interpreting x/y coordinates wrong sometimes and causing
things to not be drawn at the correct offset.

Testcase included.

gsk/gskrendernodeimpl.c
testsuite/gsk/compare/texture-scale-offset.node [new file with mode: 0644]
testsuite/gsk/compare/texture-scale-offset.png [new file with mode: 0644]
testsuite/gsk/meson.build

index 3790fcb4c35c592752afbe4c90f856163062a3e6..ddacb45e5efb9ed5ffee2aa16adc1e95a3352bc7 100644 (file)
@@ -1835,6 +1835,7 @@ gsk_texture_scale_node_draw (GskRenderNode *node,
   cairo_matrix_init_scale (&matrix,
                            gdk_texture_get_width (self->texture) / node->bounds.size.width,
                            gdk_texture_get_height (self->texture) / node->bounds.size.height);
+  cairo_matrix_translate (&matrix, -node->bounds.origin.x, -node->bounds.origin.y);
   cairo_pattern_set_matrix (pattern, &matrix);
   cairo_pattern_set_filter (pattern, filters[self->filter]);
 
@@ -1842,23 +1843,15 @@ gsk_texture_scale_node_draw (GskRenderNode *node,
   cairo_pattern_destroy (pattern);
   cairo_surface_destroy (surface);
 
-  cairo_rectangle (cr2, 0, 0, node->bounds.size.width, node->bounds.size.height);
+  gsk_cairo_rectangle (cr2, &node->bounds);
   cairo_fill (cr2);
 
   cairo_destroy (cr2);
 
   cairo_save (cr);
 
-  pattern = cairo_pattern_create_for_surface (surface2);
-  cairo_pattern_set_extend (pattern, CAIRO_EXTEND_PAD);
-
-  cairo_matrix_init_identity (&matrix);
-  cairo_matrix_translate (&matrix,
-                          -node->bounds.origin.x,
-                          -node->bounds.origin.y);
-  cairo_pattern_set_matrix (pattern, &matrix);
-  cairo_set_source (cr, pattern);
-  cairo_pattern_destroy (pattern);
+  cairo_set_source_surface (cr, surface2, 0, 0);
+  cairo_pattern_set_extend (cairo_get_source (cr), CAIRO_EXTEND_PAD);
   cairo_surface_destroy (surface2);
 
   gsk_cairo_rectangle (cr, &node->bounds);
diff --git a/testsuite/gsk/compare/texture-scale-offset.node b/testsuite/gsk/compare/texture-scale-offset.node
new file mode 100644 (file)
index 0000000..f10a974
--- /dev/null
@@ -0,0 +1,7 @@
+texture-scale {
+  bounds: 0 50 50 50;
+  texture: url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAADIAAAAyCAYAAAAeP4ixAAAAV0lEQVRoge3PAQ3AMAzAsH78Ofck\
+Li26bATJszM7P3BuB3zFSI2RGiM1RmqM1BipMVJjpMZIjZEaIzVGaozUGKkxUmOkxkiNkRojNUZq\
+jNQYqTFSY6TmBQexAmLPVmNqAAAAAElFTkSuQmCC\
+");
+}
diff --git a/testsuite/gsk/compare/texture-scale-offset.png b/testsuite/gsk/compare/texture-scale-offset.png
new file mode 100644 (file)
index 0000000..9a5764a
Binary files /dev/null and b/testsuite/gsk/compare/texture-scale-offset.png differ
index cd1a32c33106dd1277e8c60f8b7993a59056d663..9d8271988217123363aee7e6bb6051a44fc70852 100644 (file)
@@ -96,6 +96,7 @@ compare_render_tests = [
   'shrink-rounded-border',
   'texture-scale-magnify-10000x',
   'texture-scale-magnify-rotate',
+  'texture-scale-offset',
   'texture-scale-stripes',
   'texture-url',
   'transform-in-transform',