[Cairo] Color transforms

Bill Spitzak spitzak at d2.com
Wed Jul 16 17:50:51 PDT 2003


On Wednesday 16 July 2003 11:20 am, Carl Worth wrote:

> On Jul 16, Bill Spitzak wrote:
>  > Curveto is then implemented portably by transforming the points,
>  > figuring out the subdivisions so the error is less than 1/4
>  > transformed pixel, and then calling the transformed interface with
>  > the resulting line segments.
>
> Actually, it's important to keep the curve as a curve, (rather than an
> approximation by line segments), until the stroke operation [*].
> Approximating the curve to within an error value is a very different
> thing than approximating the stroked outline to within the same error
> value. Many graphics systems get this wrong and the resulting errors
> can be visible with large line width and sharp curvature.

I had not thought about that (my library did not bother with drawing lines on 
paths other than to use the graphics system's pen).

Converting a path to a stroke outline is actually really complex and maybe 
should be in the device-independent portion. The device-dependent portion 
would only have a method to fill a fully-constructed and transformed path, 
and perhaps a "fast" line drawing for any line thicknesses less than 1. 
However this may have problems in that it may make it impossible to use some 
acceleration that the hardware may have.

> Someone familiar with the algorithm within Cairo might point out that
> the curve stroking algorithm actually does operate on a piecewise
> linear approximation of the curve. So the approximation could happen
> earlier. But the path data structure would have to maintain the
> distinction between linear segments belonging to curves vs. those
> belonging to true linear path segments so the joins could be handled
> differently. Come to think of it, for round joins no distinction is
> actually needed --- sounds like there's room for a minor optimization
> of round joins here.

This sounds like the problem can be solved by being able to indicate at each 
point what type of line-join is wanted. Perhaps this could be added to the 
interface instead? Then curveto could produce straight line segments with 
round joins. It also seems that would be useful for producing some shapes 
that GUI's want, for instance a rectangle with some square and some rounded 
corners.

PostScript seems to join the segments with whatever join type the user has 
selected. But it also has several other bugs, for instance round joins seem 
to be done by splatting a circle atop the intersection, which is visible if 
the lines are shorter than they are wide.

-- 
                   ,~,~,~,~ ~ ~ ~ ~
     /\_       _|_========___         Bill Spitzak
 ~~~/\/\\~~~~~~\____________/~~~~~~~~ spitzak at d2.com




More information about the cairo mailing list