summaryrefslogtreecommitdiff
path: root/test
diff options
context:
space:
mode:
authorUli Schlachter <psychon@znc.in>2022-12-28 09:58:35 +0000
committerUli Schlachter <psychon@znc.in>2022-12-28 09:58:35 +0000
commit0e56ea9d5cce1a53294ccb06f56c68e581d2a62d (patch)
tree763e0c8184ca11877c1c82852ff730a075a2e182 /test
parent394256abbadd79223332532ca6e376b86b13f1e8 (diff)
parente83776572cac2ceaa392e6ba976eec5ac925bdd7 (diff)
downloadcairo-0e56ea9d5cce1a53294ccb06f56c68e581d2a62d.tar.gz
Merge branch 'round-join' into 'master'
Fix for round joins See merge request cairo/cairo!372
Diffstat (limited to 'test')
-rw-r--r--test/Makefile.sources1
-rw-r--r--test/meson.build1
-rw-r--r--test/reference/round-join-bug-520-bevel.pdf.ref.pngbin0 -> 705 bytes
-rw-r--r--test/reference/round-join-bug-520-bevel.ref.pngbin0 -> 512 bytes
-rw-r--r--test/reference/round-join-bug-520-bevel.svg.ref.pngbin0 -> 705 bytes
-rw-r--r--test/reference/round-join-bug-520-round.ref.pngbin0 -> 705 bytes
-rw-r--r--test/reference/round-join-bug-520-round.xlib-window.ref.pngbin0 -> 806 bytes
-rw-r--r--test/reference/round-join-bug-520-round.xlib.ref.pngbin0 -> 806 bytes
-rw-r--r--test/round-join-bug-520.c109
9 files changed, 111 insertions, 0 deletions
diff --git a/test/Makefile.sources b/test/Makefile.sources
index 2b0464ec9..c01d3ac2a 100644
--- a/test/Makefile.sources
+++ b/test/Makefile.sources
@@ -305,6 +305,7 @@ test_sources = \
rotated-clip.c \
rounded-rectangle-fill.c \
rounded-rectangle-stroke.c \
+ round-join-bug-520.c \
sample.c \
scale-down-source-surface-paint.c \
scale-offset-image.c \
diff --git a/test/meson.build b/test/meson.build
index e7e0a566d..f1612e670 100644
--- a/test/meson.build
+++ b/test/meson.build
@@ -305,6 +305,7 @@ test_sources = [
'rotated-clip.c',
'rounded-rectangle-fill.c',
'rounded-rectangle-stroke.c',
+ 'round-join-bug-520.c',
'sample.c',
'scale-down-source-surface-paint.c',
'scale-offset-image.c',
diff --git a/test/reference/round-join-bug-520-bevel.pdf.ref.png b/test/reference/round-join-bug-520-bevel.pdf.ref.png
new file mode 100644
index 000000000..b1a38e12f
--- /dev/null
+++ b/test/reference/round-join-bug-520-bevel.pdf.ref.png
Binary files differ
diff --git a/test/reference/round-join-bug-520-bevel.ref.png b/test/reference/round-join-bug-520-bevel.ref.png
new file mode 100644
index 000000000..b888f9ba9
--- /dev/null
+++ b/test/reference/round-join-bug-520-bevel.ref.png
Binary files differ
diff --git a/test/reference/round-join-bug-520-bevel.svg.ref.png b/test/reference/round-join-bug-520-bevel.svg.ref.png
new file mode 100644
index 000000000..b1a38e12f
--- /dev/null
+++ b/test/reference/round-join-bug-520-bevel.svg.ref.png
Binary files differ
diff --git a/test/reference/round-join-bug-520-round.ref.png b/test/reference/round-join-bug-520-round.ref.png
new file mode 100644
index 000000000..b1a38e12f
--- /dev/null
+++ b/test/reference/round-join-bug-520-round.ref.png
Binary files differ
diff --git a/test/reference/round-join-bug-520-round.xlib-window.ref.png b/test/reference/round-join-bug-520-round.xlib-window.ref.png
new file mode 100644
index 000000000..14ed9cbfe
--- /dev/null
+++ b/test/reference/round-join-bug-520-round.xlib-window.ref.png
Binary files differ
diff --git a/test/reference/round-join-bug-520-round.xlib.ref.png b/test/reference/round-join-bug-520-round.xlib.ref.png
new file mode 100644
index 000000000..14ed9cbfe
--- /dev/null
+++ b/test/reference/round-join-bug-520-round.xlib.ref.png
Binary files differ
diff --git a/test/round-join-bug-520.c b/test/round-join-bug-520.c
new file mode 100644
index 000000000..be2b5aa0d
--- /dev/null
+++ b/test/round-join-bug-520.c
@@ -0,0 +1,109 @@
+/*
+ * Author: Christian Rohlfs, 2022
+ *
+ * Permission is hereby granted, free of charge, to any person
+ * obtaining a copy of this software and associated documentation
+ * files (the "Software"), to deal in the Software without
+ * restriction, including without limitation the rights to use, copy,
+ * modify, merge, publish, distribute, sublicense, and/or sell copies
+ * of the Software, and to permit persons to whom the Software is
+ * furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be
+ * included in all copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+ * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+ * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+ * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS
+ * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN
+ * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
+ * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+ * SOFTWARE.
+ */
+
+#include "cairo-test.h"
+
+#define WIDTH 100
+#define HEIGHT WIDTH
+
+static cairo_test_status_t
+draw_round(cairo_t *cr, int width, int height)
+{
+ /* Fail condition:
+ 0 >= 2 * ( 1 - tolerance / (line_width / 2) )^2 - 1,
+ with the default tolerance of 0.1, `failing_line_width` is in
+ [0.117157287525381; 0.682842712474619]
+ range.
+ */
+
+ double failing_line_width = 0.3;
+
+ cairo_set_tolerance(cr, 0.1);
+ cairo_scale(cr, width, height);
+
+ cairo_set_source_rgb(cr, 1, 1, 1);
+ cairo_paint(cr);
+
+ cairo_move_to(cr, 0.2, 0.2);
+ cairo_line_to(cr, 0.8, 0.2);
+ cairo_line_to(cr, 0.8, 0.8);
+ cairo_line_to(cr, 0.2, 0.8);
+ cairo_close_path(cr);
+
+ cairo_set_line_join(cr, CAIRO_LINE_JOIN_ROUND);
+ cairo_set_source_rgb(cr, 0, 0, 0);
+ cairo_set_line_width(cr, failing_line_width);
+ cairo_stroke(cr);
+
+ return CAIRO_TEST_SUCCESS;
+}
+
+static cairo_test_status_t
+draw_bevel(cairo_t *cr, int width, int height)
+{
+ /* Fail condition:
+ arc_height < tolerance
+ For 90° join `arc_height` is equal to
+ line_width / 2 * (1 - sqrt(1/2))
+ which is 0.1464466094067262 of a `line_width`.
+ */
+
+ double line_width = 0.3;
+ double failing_tolerance = 0.3 * line_width;
+
+ cairo_set_tolerance(cr, width * failing_tolerance);
+ cairo_scale(cr, width, height);
+
+ cairo_set_source_rgb(cr, 1, 1, 1);
+ cairo_paint(cr);
+
+ cairo_move_to(cr, 0.2, 0.2);
+ cairo_line_to(cr, 0.8, 0.2);
+ cairo_line_to(cr, 0.8, 0.8);
+ cairo_line_to(cr, 0.2, 0.8);
+ cairo_close_path(cr);
+
+ cairo_set_line_join(cr, CAIRO_LINE_JOIN_ROUND);
+ cairo_set_source_rgb(cr, 0, 0, 0);
+ cairo_set_line_width(cr, line_width);
+ cairo_stroke(cr);
+
+ return CAIRO_TEST_SUCCESS;
+}
+
+
+CAIRO_TEST (round_join_bug_520_round,
+ "Tests round joins within tolerance",
+ "stroke, cap, join", /* keywords */
+ NULL, /* requirements */
+ WIDTH, HEIGHT,
+ NULL, draw_round)
+
+CAIRO_TEST (round_join_bug_520_bevel,
+ "Tests round joins omission when `arc_height < tolerance`",
+ "stroke, cap, join", /* keywords */
+ NULL, /* requirements */
+ WIDTH, HEIGHT,
+ NULL, draw_bevel)
+