summaryrefslogtreecommitdiff
path: root/testsuite/gsk/rounded-rect.c
diff options
context:
space:
mode:
authorBenjamin Otte <otte@redhat.com>2023-05-14 23:13:23 +0200
committerBenjamin Otte <otte@redhat.com>2023-05-17 02:25:32 +0200
commitad40e5f63bf8a726ce292871fa9ee9df316da159 (patch)
tree41d8f371c83396dd31dd6071327f2405b60659a4 /testsuite/gsk/rounded-rect.c
parent3b9e038dbc7ffc2261aac4b707b98b451164226c (diff)
downloadgtk+-ad40e5f63bf8a726ce292871fa9ee9df316da159.tar.gz
gsk: Add (private) gsk_rounded_rect_intersection()
The idea is that for a rectangle intersection, each corner of the result is either entirely part of one original rectangle or it is an intersection point. By detecting those 2 cases and treating them differently, we can simplify the code to compare rounded rectangles.
Diffstat (limited to 'testsuite/gsk/rounded-rect.c')
-rw-r--r--testsuite/gsk/rounded-rect.c140
1 files changed, 140 insertions, 0 deletions
diff --git a/testsuite/gsk/rounded-rect.c b/testsuite/gsk/rounded-rect.c
index 5a72928257..552bed49d9 100644
--- a/testsuite/gsk/rounded-rect.c
+++ b/testsuite/gsk/rounded-rect.c
@@ -241,6 +241,145 @@ test_intersect_with_rect (void)
}
}
+static void
+test_intersect (void)
+{
+ struct {
+ GskRoundedRect a;
+ GskRoundedRect b;
+ GskRoundedRectIntersection result;
+ GskRoundedRect expected;
+ } test[] = {
+ {
+ ROUNDED_RECT_INIT(0, 0, 100, 100, 0),
+ ROUNDED_RECT_INIT(0, 0, 100, 100, 20),
+ GSK_INTERSECTION_NONEMPTY,
+ ROUNDED_RECT_INIT(0, 0, 100, 100, 20),
+ },
+ {
+ ROUNDED_RECT_INIT(0, 0, 100, 100, 20),
+ ROUNDED_RECT_INIT(50, 50, 100, 100, 20),
+ GSK_INTERSECTION_NONEMPTY,
+ ROUNDED_RECT_INIT_UNIFORM(50, 50, 50, 50, 20, 0, 20, 0),
+ },
+ {
+ ROUNDED_RECT_INIT(0, 0, 100, 100, 20),
+ ROUNDED_RECT_INIT(50, 0, 100, 100, 20),
+ GSK_INTERSECTION_NONEMPTY,
+ ROUNDED_RECT_INIT(50, 0, 50, 100, 20),
+ },
+ {
+ ROUNDED_RECT_INIT(0, 0, 100, 100, 20),
+ ROUNDED_RECT_INIT(0, 50, 100, 100, 20),
+ GSK_INTERSECTION_NONEMPTY,
+ ROUNDED_RECT_INIT(0, 50, 100, 50, 20),
+ },
+ {
+ ROUNDED_RECT_INIT(0, 0, 100, 100, 20),
+ ROUNDED_RECT_INIT(-50, -50, 100, 100, 20),
+ GSK_INTERSECTION_NONEMPTY,
+ ROUNDED_RECT_INIT_UNIFORM(0, 0, 50, 50, 20, 0, 20, 0),
+ },
+ {
+ ROUNDED_RECT_INIT(0, 0, 100, 100, 20),
+ ROUNDED_RECT_INIT(0, -50, 100, 100, 20),
+ GSK_INTERSECTION_NONEMPTY,
+ ROUNDED_RECT_INIT(0, 0, 100, 50, 20),
+ },
+ {
+ ROUNDED_RECT_INIT(0, 0, 100, 100, 20),
+ ROUNDED_RECT_INIT(-50, 0, 100, 100, 20),
+ GSK_INTERSECTION_NONEMPTY,
+ ROUNDED_RECT_INIT(0, 0, 50, 100, 20),
+ },
+ {
+ ROUNDED_RECT_INIT(0, 0, 100, 100, 20),
+ ROUNDED_RECT_INIT(10, 10, 80, 80, 20),
+ GSK_INTERSECTION_NONEMPTY,
+ ROUNDED_RECT_INIT(10, 10, 80, 80, 20),
+ },
+ {
+ ROUNDED_RECT_INIT(0, 0, 100, 100, 20),
+ ROUNDED_RECT_INIT(10, 10, 80, 80, 10),
+ GSK_INTERSECTION_NONEMPTY,
+ ROUNDED_RECT_INIT(10, 10, 80, 80, 10),
+ },
+ {
+ ROUNDED_RECT_INIT(0, 0, 100, 100, 40),
+ ROUNDED_RECT_INIT(10, 10, 80, 80, 0),
+ GSK_INTERSECTION_NOT_REPRESENTABLE,
+ },
+ {
+ ROUNDED_RECT_INIT(10, 10, 100, 100, 40),
+ ROUNDED_RECT_INIT(30, 0, 40, 40, 0),
+ GSK_INTERSECTION_NOT_REPRESENTABLE,
+ },
+ {
+ ROUNDED_RECT_INIT(10, 10, 100, 100, 40),
+ ROUNDED_RECT_INIT(0, 0, 100, 20, 0),
+ GSK_INTERSECTION_NOT_REPRESENTABLE,
+ },
+ {
+ ROUNDED_RECT_INIT_UNIFORM(647, 18, 133, 35, 5, 0, 0, 5),
+ ROUNDED_RECT_INIT_UNIFORM(14, 12, 1666, 889, 8, 8, 0, 0),
+ GSK_INTERSECTION_NONEMPTY,
+ ROUNDED_RECT_INIT_UNIFORM(647, 18, 133, 35, 5, 0, 0, 5),
+ },
+ {
+ ROUNDED_RECT_INIT_UNIFORM(0, 0, 100, 100, 100, 0, 0, 0),
+ ROUNDED_RECT_INIT_UNIFORM(0, 0, 100, 100, 0, 0, 100, 0),
+ GSK_INTERSECTION_NONEMPTY,
+ ROUNDED_RECT_INIT_UNIFORM(0, 0, 100, 100, 100, 0, 100, 0),
+ },
+ {
+ ROUNDED_RECT_INIT_UNIFORM(0, 0, 100, 100, 100, 0, 0, 0),
+ ROUNDED_RECT_INIT_UNIFORM(-20, -20, 100, 100, 0, 0, 100, 0),
+ GSK_INTERSECTION_NOT_REPRESENTABLE,
+ },
+ {
+ ROUNDED_RECT_INIT_UNIFORM(0, 0, 50, 50, 0, 0, 50, 0),
+ ROUNDED_RECT_INIT_UNIFORM(0, 0, 20, 20, 20, 0, 0, 0),
+ GSK_INTERSECTION_NOT_REPRESENTABLE, /* FIXME: should be empty */
+ },
+ {
+ ROUNDED_RECT_INIT_UNIFORM(0, 0, 50, 50, 0, 0, 50, 0),
+ ROUNDED_RECT_INIT_UNIFORM(0, 0, 21, 21, 21, 0, 0, 0),
+ GSK_INTERSECTION_NOT_REPRESENTABLE,
+ },
+ };
+ gsize i;
+
+ for (i = 0; i < G_N_ELEMENTS (test); i++)
+ {
+ GskRoundedRect out;
+ GskRoundedRectIntersection res;
+
+ if (g_test_verbose ())
+ g_test_message ("intersection test %zu", i);
+
+ memset (&out, 0, sizeof (GskRoundedRect));
+
+ res = gsk_rounded_rect_intersection (&test[i].a, &test[i].b, &out);
+ g_assert_cmpint (res, ==, test[i].result);
+ if (res == GSK_INTERSECTION_NONEMPTY)
+ {
+ if (!gsk_rounded_rect_equal (&out, &test[i].expected))
+ {
+ char *a = gsk_rounded_rect_to_string (&test[i].a);
+ char *b = gsk_rounded_rect_to_string (&test[i].b);
+ char *expected = gsk_rounded_rect_to_string (&test[i].expected);
+ char *result = gsk_rounded_rect_to_string (&out);
+ g_test_message (" A = %s\n"
+ " B = %s\n"
+ "expected %s\n"
+ " got %s\n",
+ a, b, expected, result);
+ }
+ g_assert_true (gsk_rounded_rect_equal (&out, &test[i].expected));
+ }
+ }
+}
+
int
main (int argc,
char *argv[])
@@ -253,6 +392,7 @@ main (int argc,
g_test_add_func ("/rounded-rect/is-circular", test_is_circular);
g_test_add_func ("/rounded-rect/to-float", test_to_float);
g_test_add_func ("/rounded-rect/intersect-with-rect", test_intersect_with_rect);
+ g_test_add_func ("/rounded-rect/intersect", test_intersect);
return g_test_run ();
}