[cairo] Radial shader transformation

Thomas Hunger info at teh-web.de
Mon Mar 1 15:12:54 PST 2004

> Instead the shader could be transformed by the difference between the space
> it was defined in and the current transform. This is just the inverse of
> the transform matrix when the shader was defined, multiplied by the current
> transform matrix. You could then use rotate and scale to define a tilted
> ellipse transform, and still scale and translate and even rotate as you
> draw your shapes.

Hm. If we'd introduce a gstate->shader_matrix, it could store the current 
tranformation matrix at creation time (1) and then multiply this with the 
gstate->ctm right before passing control points to the actual shader 

  rotate (Pi/2)
 setup_linear_shader ()
  rotate  (PI/2)

would rotate the gradient by PI so actually mirroring it. Is that what you 

So we would have two possibilities:
1) a set_shader() always sets up a normalized shader of "size" == 1.0 so the 
user has to transform it to make it fit to whatever position, size and 
orientation one wants. this has the advantage that the set_shader() functions 
would be simple to call. It has the disadvantage that the user has to have 
implicit knowledge about the shaders definition of normal. i.e. does the 
linear shader cover -0.5 to 0.5 or 0.0 to 1.0, ist it horizontal or vertical 
by default. stuff like that. though I think it would not be a big problem if 

2) a set_shader() takes shader-specific arguments (probably similar to the 
svg-arguments). It has the disadvantage of a bulky interface. On the positive 
side it is more intuitive since the user can do stuff like
cairo_rectangle (0, 0, w, h);
cairo_set_shader_linear (0, 0, w, 0); 
to make an exactly fitting shader without needing extra transforms.

Both approaches seem ok to me. What do you think? (seems like you like the 
transform approach more, I just wanted to point out the issues I see with it)


P.S. level set methods look very interesting though the mathematics are too 
hard to grasp for me tonight. How could these be hardware accelerated?

More information about the cairo mailing list