Re: _cairo_surface_wrapper_get_target_extents() too small
Simon Sapin <[email protected]>
| Newsgroups | gmane.comp.lib.cairo |
|---|---|
| Message-ID | <[email protected]> |
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 -- cairo mailing list [email protected] http://lists.cairographics.org/mailman/listinfo/cairo