[cairo] _cairo_surface_wrapper_get_target_extents() too small

Simon Sapin simon.sapin at exyr.org
Fri Mar 29 07:43:24 PDT 2013

Le 27/03/2013 13:12, Simon Sapin a écrit :
> Hi,
> When rendering to PDF with WeasyPrint a document containing a SVG image,
> SVG elements in the right and bottom of the image are not shown in some
> cases.
> git bisect indicates that the bug appeared in this cairo commit:
> http://cgit.freedesktop.org/cairo/commit/?id=09b42c748e9dbcc923560c7d8bf5298fbffe95ef
> Reverting it on top of today’s master fixes the bug.
> WeasyPrint has CairoSVG render the image to an intermediate cairo SVG
> surface, which is then used in surface pattern as a source to paint in
> the final PDF surface. The bug appears when the target context has a
> scale to make the image smaller than its "intrinsic" size. Making the
> SVG surface smaller (with its content scaled accordingly) and
> compensating with a scale on the target surface works around the problem.
> Apparently, the rectangle returned by
> _cairo_surface_wrapper_get_target_extents() is smaller than it should
> be. Something is transformed wrong, but I’m not sure what coordinate
> system each rectangle is supposed to be in.

Based on further research, it appears that the wrapper->transform value 
in _cairo_surface_wrapper_get_target_extents() should account for the 
target context’s transformation matrix, but doesn’t. wrapper->transform 
is always the identity matrix in our tests, even though the context has 
a non-identity transform when painting the surface pattern.

Removing any calls to cairo_save() and cairo_restore() also works around 
the issue, but for reasons we do not understand.

Simon Sapin

More information about the cairo mailing list