gl: Change rounded_rect_shrink()
authorBenjamin Otte <otte@redhat.com>
Mon, 11 Sep 2023 03:17:56 +0000 (05:17 +0200)
committerMatthias Clasen <mclasen@redhat.com>
Tue, 19 Sep 2023 20:32:27 +0000 (16:32 -0400)
The code now follows gsk_rounded_rect_shrink() and with it the behavior
of the Cairo renderer and Webkit.

The old code did what the GL renderer and Cairo do, but I consider that
wrong.

I did not test Chrome.

Test attached

gsk/gl/resources/preamble.vs.glsl
testsuite/gsk/compare/shrink-rounded-border.node [new file with mode: 0644]
testsuite/gsk/compare/shrink-rounded-border.png [new file with mode: 0644]
testsuite/gsk/meson.build

index 758bca89d200e57457dc691f64b10d0776c461ef..ff3d5bb5a7265cdc8578cc87cb8db16a0b8e9e9b 100644 (file)
@@ -28,6 +28,8 @@ gsk_rounded_rect_shrink (GskRoundedRect r, vec4 amount)
   if (r.corner_points1.zw == r.bounds.zy) new_corner_points1.zw = new_bounds.zy;
   if (r.corner_points2.xy == r.bounds.zw) new_corner_points2.xy = new_bounds.zw;
   if (r.corner_points2.zw == r.bounds.xw) new_corner_points2.zw = new_bounds.xw;
+  new_corner_points1 = clamp (new_corner_points1, new_bounds.xyxy, new_bounds.zwzw);
+  new_corner_points2 = clamp (new_corner_points2, new_bounds.xyxy, new_bounds.zwzw);
 
   return GskRoundedRect (new_bounds, new_corner_points1, new_corner_points2);
 }
diff --git a/testsuite/gsk/compare/shrink-rounded-border.node b/testsuite/gsk/compare/shrink-rounded-border.node
new file mode 100644 (file)
index 0000000..15b662c
--- /dev/null
@@ -0,0 +1,19 @@
+/* We clip out the transparent region inside the
+   border so we can check that the shrinking of
+   the inside works properly.
+   Comment out the clip to see the actual border
+ */
+
+clip {
+  /* blame sqrt(2) for those numbers:
+     The shrunkrect should be 40 40 70 70 / 70 0
+     70/sqrt(2) = 49.4974747...
+     40 + 49 = 89 and 40 + 70 - 49 = 61,
+     giving you:
+   */
+  clip: 61 61 28 28;
+  child: border {
+    outline: 0 0 150 150 / 150 0 150 0;
+    widths: 40;
+  }
+}
diff --git a/testsuite/gsk/compare/shrink-rounded-border.png b/testsuite/gsk/compare/shrink-rounded-border.png
new file mode 100644 (file)
index 0000000..82aacda
Binary files /dev/null and b/testsuite/gsk/compare/shrink-rounded-border.png differ
index 53da9d1dcc7c50bf889e56651009f14957397461..bbcefc920588e8177a2c01b87ea31074337de707 100644 (file)
@@ -92,6 +92,7 @@ compare_render_tests = [
   'shadow-behind',
   'shadow-in-opacity',
   'shadow-opacity',
+  'shrink-rounded-border',
   'texture-scale-magnify-10000x',
   'texture-scale-magnify-rotate',
   'texture-scale-stripes',