[PATCH] Add another high-curvature spline to the bug-spline test case
Carl Worth <[email protected]>
| Newsgroups | gmane.comp.lib.cairo |
|---|---|
| Message-ID | <[email protected]> |
This demonstrates that there are still rendering errors in stroking high-curvature splines far beyond the specified tolerance, (notice multi-pixel errors in the failure images). The reference image here was obtained with cairo-1.8.0. We need not match its rendering pixel-for-pixel, but we shouldn't have the larger errors that we have here. --- Chris Wilson <[email protected]> writes: > A simple fix in the meantime is just to look at the cosine between the > two segments and decide whether the bevel join the two is within > tolerance of the ideal round join. Hi Chris, I saw your fixes go by this weekend. There are still lots of bugs here. See the attached update to the bug-spline test case showing that in areas of high curvature the stroke boundary is still being very poorly approximated by long straight lines in many cases. And I'm still confused by language in your recent commits: If the angle between two segments is small we can simply replace the round-join with a bevel-join. This is done automatically by the insertion of the triangle fan as it will not be able to find a point around the pen between the two vectors. However, we can make that search cheaper by inspecting whether the bisection angle is small enough that the bevel-join will be within geometric tolerance of the round-join. Why are we computing new triangle fans, etc. during stroking? The insight of the original algorithm is that we can simply copy portions of the pen to the stroke outline. We've already done a fair amount of work to compute a good pen, and we should just use that rather than trying to recompute something. See the attached reference image from cairo 1.8.0 which shows how things should look. Meanwhile, for splines stroked with a large width, and with high-curvature near the end point, the current algorithm is doing extremely badly. The errors are multiple orders of magnitude worse than what I'm showing here. Granted, those errors are in ugly "holes" in the stroke due to self-intersections within the outline from convolving the pen and the path. I don't know that anyone every really wants to draw those holes, but cairo (up to 1.8) at least drew them smoothly, while the current code just goes insane. Contrast these two: http://cworth.org/~cworth/tmp/tough-butt-spline-cairo-1.8.png http://cworth.org/~cworth/tmp/tough-butt-spline-cairo-1.12.2-101-g13d61d7.png Source to render that here: http://cworth.org/~cworth/tmp/tough-butt-spline.c Oddly, even outside the "hole", there's a huge approximation error on the outside of that stroke as well. That error should be independent of the butt-cap used here, but the error is not visible with CAIRO_LINE_CAP_ROUND, (perhaps the capping code is adding a full-circle cap instead of only the half-circle that's strictly needed?). Looking forward to more form you, -Carl test/bug-spline.c | 10 ++++++++++ test/reference/bug-spline.ref.png | Bin 5476 -> 6698 bytes 2 files changed, 10 insertions(+) diff --git a/test/bug-spline.c b/test/bug-spline.c index 00a915c..912b28b 100644 --- a/test/bug-spline.c +++ b/test/bug-spline.c @@ -54,6 +54,16 @@ static const struct spline { }, NARROW_LINE_WIDTH, { 1, 0, 0, 1 }, + }, + { + { + { -9, -73 }, + { 105, 44 }, + { 27, 61 }, + { 41, -55 } + }, + WIDE_LINE_WIDTH, + { 1, 1, 1, 1 } } }; #define NUM_SPLINES (sizeof(splines)/sizeof(splines[0])) diff --git a/test/reference/bug-spline.ref.png b/test/reference/bug-spline.ref.png index ebef26144a827e3630b2b6c1baec1213d8a77f01..d6b0ab8149a213f1655af8a44cac6a3381e2bf7f 100644 GIT binary patch literal 6698 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 NDhM@rvEs{s{|DGd@lyZ* literal 5476 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 -- 1.7.10 -- cairo mailing list [email protected] http://lists.cairographics.org/mailman/listinfo/cairo
signature.asc
(application/pgp-signature, 197 B)
-----BEGIN PGP SIGNATURE----- Version: GnuPG v1.4.12 (GNU/Linux) iEYEARECAAYFAk/oncsACgkQ6JDdNq8qSWj5+gCgqYVGC6GWxrF+ceWvbYSo2OVB BCIAn1AteRjO/iBrNPhbmLsZXgEFvR0Z =FtPD -----END PGP SIGNATURE-----