[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-----
lmpx.com only provides a reader for public news (NNTP) servers. It is not affiliated with the servers or forums shown here and is not responsible for the content of articles, which is written by their respective authors.