[cairo] Problems with cairo_get_line_width and "new" semantics
spitzak at d2.com
Tue May 16 14:42:08 PDT 2006
Better proposal for dashes to make pens only be a matrix:
The gstate has a "pen space" where the pen is a 1-unit diameter circle
or square. The "penCTM" transforms from pen space to the device. There
is also a current dash pattern, measured in pen diameters (and thus in
1-unit lengths in pen space). There is also a number called "dashscale"
which does not effect drawing and is provided for back-compatability.
Stoking a path is done by transforming the path to pen space. The line
cap and dash pattern are used to figure out the border paths in pen
space. These paths are then transformed to device space and filled.
cairo_set_pen(cairo_t*, const cairo_matrix_t*) multiplies the matrix by
the CTM and changes the penCTM to that. The dash pattern and dashscale
cairo_get_pen(cairo_t*, cairo_matrix_t*) returns the penCTM divided by
the current CTM.
cairo_set_dash_pattern(...) multiplies all the lengths by the dashscale
and stores that as the dash pattern.
cairo_get_dash_pattern() divides the current dash pattern by dashscale
and returns that.
cairo_set_dashscale(,n) stores this number, and multiplies the current
dash pattern by the ratio between this and the previous one (? if this
is what back-compatability requires).
cairo_get_dashscale sets or returns this number.
cairo_set_line_width(size) does cairo_set_pen(identity*size) and
cairo_get_line_width() returns 1/cairo_get_dashscale() times the square
root of the determinant of the penCTM divided by the CTM.
More information about the cairo