[cairo] Cairo and ISO C++
spitzak at gmail.com
Tue Jan 14 14:47:10 PST 2014
Behdad Esfahbod wrote:
> To fix this, we want to lock the line width / font size in device space at the
> time they are set. To fix these in the wrapper is not impossible:
> - During set_line_width / set_font_size, multiply them by the current
> transformation matrix and set to *that*,
> - During stroke() / show_text/glyphs/...(), cairo_save(), set transformation
> matrix to identity, stroke/show_text/..., and cairo_restore(),
A way to fix it is to ignore the cairo transforms entirely and do them
yourself in the wrapper. Cairo is run with the identity transform. You
can redefine the state object to not have cairo's transform and to
This can also be used to fix the linewidth=0 problem which I will
describe in another email.
> - For font_size: show_text/glyphs/... take glyph coordinates, so we need to
> multiply those by the current transformation matrix before resetting the
> matrix. Alternatively, we can transform the font matrix by inverse of current
> transformation matrix and set that before the operation.
The relative portion of glyph coordinates cannot use the CTM, otherwise
text layout (which is mostly concerned with placing the glyphs next to
each other in a way controlled by the glyph size) would have to be told
the transform. I would instead use a space where 0,0 lines up with the
CTM but the scale and rotation are the ones when the font was selected.
Font metrics must also be returned in this space.
> Also, this has implications on dashed lines. I think the
> dash pattern also suffers from the same shortcomings.
I think it would be acceptable to define dash patterns as being in "pen
space", ie if the pen is twice as large all the dashes are twice as
long. This could be implemented by leaving Cairo's line width at 1 and
transforming to "pen space" before drawing any lines. This could be done
if the wrapper does all transforms.
More information about the cairo