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
lmpx.com only provides a reader for public news (NNTP) servers. It is not affiliated with the servers or forums shown here and is not responsible for the content of articles, which is written by their respective authors.