internal/stroke: properly calculate maxDist

The calculated value for maxDist (the maximum allowable error when
converting cubic Beziers to quadratics) was way too small when the
first control point was very close to the starting point of the segment.

(f32.Rectangle.Add does not expand the rectangle to include the new point;
it moves the rectangle by the point's X and Y coordinates.)

Splitting the curve into such small pieces was resulting in very ugly
output.

Fixes: https://todo.sr.ht/~eliasnaur/gio/331
Signed-off-by: Andy Balholm <andy@balholm.com>
This commit is contained in:
Andy Balholm
2022-01-01 19:01:48 -08:00
committed by Elias Naur
parent 4f5baa9a51
commit 6d9db2b13c
+4 -1
View File
@@ -670,7 +670,10 @@ func SplitCubic(from, ctrl0, ctrl1, to f32.Point) []QuadSegment {
hull := f32.Rectangle{
Min: from,
Max: ctrl0,
}.Canon().Add(ctrl1).Add(to)
}.Canon().Union(f32.Rectangle{
Min: ctrl1,
Max: to,
}.Canon())
l := hull.Dx()
if h := hull.Dy(); h > l {
l = h