From: Johan E. <jbc...@sw...> - 2014-08-05 19:29:38
|
On 5-8-2014 21:15, Tavmjong Bah wrote: > On Tue, 2014-08-05 at 20:46 +0200, Johan Engelen wrote: >> Hi all, >> Liam just committed a bug fix to Inkscape trunk, regarding our SVG >> parser. >> >> SVG spec says: >> "If the endpoints (x1, y1) and (x2, y2) are identical, then this is >> equivalent to omitting the elliptical arc segment entirely." [1] >> >> Liam changed the parser so that it will simply drop such segments: >> >> void _arcTo(double rx, double ry, double angle, >> bool large_arc, bool sweep, Point p) >> { >> + if (_current == p) { // sic, probably should be >> are_near(_current, p) >> >> + return; >> + } >> _quad_tangent = _cubic_tangent = _current = p; >> _sink.arcTo(rx, ry, angle, large_arc, sweep, p); >> } > >> I am not sure about this change. We are not dropping any degenerate >> bezier segments in our parser. > I think this is not the same as a degenerate bezier. This describes an > ellipse with given major and minor axis but there is no way to figure > out where along the ellipse one should start drawing. The following path > consists of four very different (almost complete) ellipses where the > final points are just a little bit different from the starting points: > > <path d="m 50,50 > a 20 30 45 1 0 1,1 > 20 30 45 1 0 -1,-1 > 20 30 45 1 0 -1,1 > 20 30 45 1 0 1,-1" > style="fill:none;stroke:black"/> Ok, I see you're saying that "a 20 30 45 1 0 0,0" is ambiguous, hence invalid and the parser can skip it. (degenerate line segments are not ambiguous) This would vote in favor of floating point comparison, but I think in the interest of (human) predictability, the equals-check should be made are_near. Do you agree? regards, Johan |