[cairo] Level sets for shaders?

Bill Spitzak spitzak at d2.com
Mon Mar 1 13:37:52 PST 2004

Seeing the questions about radial shaders, I was wondering if in fact Cairo 
needs the ability to fill an arbitrary shape with some kind of gradient 
defined by the shape.

We are using "Level Sets" in special effects quite a bit. This is a 2-D array 
of single values that describe a 2D boundary (the idea extends to N 
dimensions and most literature will describe 3D). The values are the distance 
to the nearest point on the boundary except the numbers are positive "inside" 
the shape and negative "outside" the shape. The boundary does not necessarily 
lie on the pixel boundaries, it can be accurately described even if it goes 
through the middle of a pixel. Frequencies higher than 2 (1?) pixels in the 
boundary shape are lost, however.

The primary use of level sets is that it is very easy to calculate related 
shapes from them (such as grow and shrink), to intersect and union them, and 
to change their shape without changing their volume. They are also very 
useful for drawing the shape anti-aliased (it is accurate as long as two 
opposite boundaries are more than 1 pixel apart).

A cairo shader could be a level set built from a Cairo path. This would allow 
the full use of the path construction interface for defining the shader 
shape. A simple lookup from the level set to a color ramp (which itself could 
be defined by 2 colors and a gamma value) will allow a lot of interesting 
shaders to be made. If you also can define a contribution to this lookup from 
the horizontal and vertical partial derivatives of the level set, you can get 
a whole lot more (such as moving the brightest point in a circle to somewhere 
other than the center). For complicated shapes the resulting shading is 
suprisingly nice, and this is apparently by far the fastest way to calculate 
such shading, and is easy to support in hardware.

There is a problem, though. From what I have heard, conversion of a path *to* 
a level set is an expensive calculation. (Conversion the other way is 
cheap). I suspect (but don't know for sure) that the complexity is equivalent 
to that needed to convert a path to an anti-aliased set of pixels shading 
values, so this may fit well into Cairo.

In any case if there is desire for more than linear ramps and circles and 
ellipses for shading, this certainly should be looked into.

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

More information about the cairo mailing list