[cairo] Limitation of recording surface
Bernhard R. Fischer
bf at abenteuerland.at
Mon Feb 9 08:39:03 PST 2015
On Thursday 05 February 2015 08:13:34 Bernhard R. Fischer wrote:
> On Wednesday 04 February 2015 23:11:24 Adrian Johnson wrote:
> > On 04/02/15 20:05, Bernhard R. Fischer wrote:
> > > Hi!
> > >
> > > I'm developing Smrender which is a chart renderer for OSM data and I use
> > > cairographics for it. Those charts are highly complex and contain a huge
> > > amount of vector data.
> > >
> > > Internally, everything is rendered to a recording surface which is
> > > finally
> > > "painted" to a PDF surface (or other formats).
> > >
> > >
> > > I found out that with some amount of input data the PDF is degraded to a
> > > raster image instead of vector image.
> > >
> > > Is there any known limit in the recording surface or in the PDF surface
> > > which causes this behavior? Is there any possibility to change this or
> > > do
> > > you have any suggestions what I can do to avoid this?
> > No. As long you do not use operators unsupported by PDF it should not be
> > rasterized. If you are only using CAIRO_OPERATOR_OVER and seeing
> > rasterization in pdf it is likely a bug.
> I use CAIRO_OPERATOR_OVER and CAIRO_OPERATOR_CLEAR but nothing else. I'll
> try to track down the problem more specifically.
I solved the problem.
What I did was to cut out holes of a polygon in a group by using
CAIRO_OPERATOR_CLEAR and then painted the group to the PDF surface
Although this works fine with image surfaces it seems that this operation is
not supported (or not implemented correctly) in the PDF backend as well as in
the SVG backend.
Interestingly, I found out that if the recording surface is painted and saved
twice that the second output file differs from the first one (see code example
below). In my opinion this should not happen.
Nevertheless, the rasterization is a matter of the PDF surface and not the
recording surface. It behaves in the same way as described without the
intermediate recording surface but using a PDF surface directly.
I comiled the following example to demonstrate my observations. Please note
that I also have a solution which is to use sub-paths before fill() instead of
using fill() twice, one to paint and one to cut the hole.
(#define NOT_WORKING to show rasterization and comment it out tho show the
-------------- next part --------------
A non-text attachment was scrubbed...
Size: 473 bytes
Desc: This is a digitally signed message part.
More information about the cairo