[cairo] Fwd: cairo path rendering bug with inkscape
Carl Worth
cworth at cworth.org
Sat Apr 5 23:27:52 PDT 2008
On Sat, 5 Apr 2008 15:48:20 -0400, "bulia byak" wrote:
> OK, while I'm still not sure about the correct behavior of close_path,
> I just eliminated it by replacing it with a lineto to the remembered
> start-of-path point, and that got rid of the bug. Thanks for helping
> to figure this out, and sorry for bothering you with this :)
That will make the bug go away, sure. But it will introduce
another. If you don't do a cairo_close_path when the SVG has the
close-path ('z') operator, then you'll get caps at the beginning and
ending of the path rather than a join between them.
> On Sat, Apr 5, 2008 at 2:40 PM, bulia byak <buliabyak at gmail.com> wrote:
> > On Sat, Apr 5, 2008 at 9:54 AM, Carl Worth <cworth at cworth.org> wrote:
> > I then wondered how replacing a curveto with a moveto in any path may
> > result in drawing a _line_ which was _not in the path_. But then I
> > remembered about the close_path command, z.
Yes, the close_path is critical to the bug.
> > If some curves preceding
> > it were replaced by movetos, it will indeed draw a line from the last
> > stroked point which will be wrong. But then the question is, is it
> > correct to draw a closepath command from the last stroked point, not
> > from the current point? If closepath would work from the current
> > point, as set by movetos, there would be no bug here.
That's not quite what's happening.
A close_path operation always do draw a line from the current
point. But it draws a line (and joins) back to the beginning of the
current sub-path, (that is, it joins back to the most recent move_to).
What's funny is that in cairo 1.2 we added a path manipulation
function, (cairo_new_sub_path), that doesn't have any analogue in
PostScript, PDF, or SVG. What it does is begin a new sub path but
without setting the current point, (so it's exactly half of a
move_to).
For your optimization you would actually want the other half of
move_to. That is, what you want to do is to change the current point,
but without starting a new sub-path. I suppose we could add another
function for that, but I wonder if it would be more confusing than
helpful in general.
In the meantime, you can actually do the right thing, but it takes a
little more effort. What you would need to do is every time you are
optimizing away a path element, save the final point, (but don't issue
a move_to), replacing a point saved in any immediately previously
optimized-away element. Then, at the next non-optimized-away element,
if there's a saved point you would issue a cairo_line_to to that
point. That way, you optimize away almost as much drawing, (all but
one line), but you avoid introducing the extra, undesired sub-path.
I don't know if any of that is making sense, (I hope it is, but
describing the state-management in prose can be tricky). I wanted to
try writing code for that today, but I didn't get a chance.
Anyway, more than anything, I'm glad that you're playing with cairo
inside of inkscape, and I want to let you know that we're always
available if you have any questions or problems.
-Carl
-------------- next part --------------
A non-text attachment was scrubbed...
Name: not available
Type: application/pgp-signature
Size: 189 bytes
Desc: not available
Url : http://lists.cairographics.org/archives/cairo/attachments/20080405/177a216c/attachment.pgp
More information about the cairo
mailing list