[cairo] Two usage questions( matrix and fill with dash stroke)

Bill Spitzak spitzak at thefoundry.co.uk
Wed Apr 9 11:00:31 PDT 2008


Fortunatly the 6-component matrix is far easier than the 4x4 matrix used 
for 3D:

cairo_matrix_t m = get_the_matrix();

double scale_x = hypot(m.xx, m.yx);
double scale_y = hypot(-m.xy, m.yy);
double rotate = atan2(m.xx, m.yx);
double rotate2 = atan2(-m.xy, m.yy);
double translate_x = m.x0;
double translate_y = m.y0;

If rotate==rotate2 then this will produce the correct values for a 
scale, rotate, translate calls in that order for Postscript/Cairo/PDF 
(some graphics apis such as OpenGL may take the three calls in the 
reverse order).

If rotate==-rotate2 then it is a reflection. Replace scale_y with 
-scale_y (I think...)

Else if rotate != rotate2 then the matrix has some "shear" which means 
that right angles are not preserved. There is no cairo api other than 
setting the matrix to produce this, and other graphics apis vary on 
whether they provide this and how it is specified. So you might just 
have to ignore this possibility.

If the determinant (m.xx*m.yy-m.yx*m.xy) is zero then it is a degenerate 
transform which transforms everything to a point or a line and the above 
results are garbage. It is best to skip these. You may be tempted to 
think you can figure out the rotation of the line but I have found that 
to be much harder than it looks.

If your api only takes a single scale then use the square root of the 
determinant.

Warning: I may have the signs reversed on some of the above.


More information about the cairo mailing list