[cairo] Re: Avoiding seams
mental at rydia.net
mental at rydia.net
Mon Dec 12 15:49:04 PST 2005
Quoting Timothée Lecomte <timothee.lecomte at ens.fr>:
> So SATURATE is not the best solution. I think that drawing at a
> higher resolution has the same last problem, unless I draw
> everything on the higher-resolution context.
You'd need to draw everything which needs to meet cleanly on that
same context, yes.
> I have followed with great interest the discussion between
> MenTaLguY and Bill Spitzak about a possible new entry in the API.
> I am not convinced at all by "aliased_lineto"
> or "aliased_curveto". It implies to detect which sides of the
> polygons need to be aliased to avoid seams, and it's not simple
> at all !
It's actually a rehashing of a very old discussion. It isn't just a
problem for drawing e.g. adjoining triagles for
perspective-projected surfaces, but really a general issue which
affects any renderer which tries to approximate coverage via the
alpha channel for intermediate rendering steps.
Google for:
"star and ring" cairo
and you'll find the original thread, along with the star-and-ring
test case I devised to show off the issue.
> Moreover, I want antialiased separations between my polygons, as
> they are of different colors.
Ahh, good catch. I'd overlooked that shortcoming.
> Do you have any other ideas ?
Maybe two-sided fills. But that's not really any easier to work
with than the aliased_lineto business, even if it did allow
antialiasing.
The only apparent solutions involve FSAA, which as far as I know
involves one of two families of techniques:
- oversampling (render at higher resolution w/o antialiasing)
- geometric (e.g. build a BSP tree of the entire scene and
rasterize in a single pass)
There are a couple other interesting ways of "cheating" -- for
example, the AGG renderer dialates paths slightly so they overlap.
However, that approach only manages to avoid seams if the shapes
involved are all fully opaque.
As far as I can tell, the Macromedia Flash renderer uses
oversampling. I don't know what Xara uses, but it'll be
open-sourced soon. I suspect it also oversamples.
For what it's worth, I originally became aware of the issue with
Inkscape's current renderer (livarot). Designers complaining
loudly about seams between their precisely aligned shapes. Livarot
isn't cairo-based, but uses the same approach to partial coverage
approximation. libart too.
I've got a nasty feeling that OSS renderers have been pursuing a
dead end in this regard. It's a 90% solution that doesn't seem to
admit a 10% fix.
-mental
More information about the cairo
mailing list