[cairo] How do you get tight bounding boxes and/or unused margins cropped for final libcairo results?

Alan W. Irwin irwin at beluga.phys.uvic.ca
Mon Sep 10 13:40:56 PDT 2007


On 2007-09-10 15:42-0400 Behdad Esfahbod wrote:

> On Mon, 2007-09-10 at 14:00 -0400, Alan W. Irwin wrote:
>> [...]Therefore, I hope there is a general
>> way to do this (crop [in the ImageMagick sense] unused margins from the
>> final result) internal to libcairo that works for some/all libcairo back ends.
>> If so, can somebody point me in the right direction?
>
> Hi, and welcome to cairo!
>
> Currently cairo surfaces need to know the size at surface creation time.
> A common approach to fixing this chicken-egg problem is that
> applications first create a 1x1 (or 0x0) dummy surface of the same type
> as the final one, render to it and compute extents (using
> cairo_stroke_extents(), cairo_fill_extents(),
> pango_layout_get_extents(), etc), and then create the final surface at
> the right size and render again.

Exactly, it is a chicken-egg problem.  :-)

I might be able to implement such a solution for our cairo devices. I guess
it would involve storing all the cairo calls in order so they can be
replayed.  That's actually not too bad since we don't use that large a
variety of libcairo calls. I presume an offset to all x and y coordinates
would also be involved for the cairo replay to fit everything inside the
smaller rectangular area.

What is the advantage to 1x1?  Does it make the first pass go a lot quicker
without affecting the calculated extents?

>
> I can't readily think of any generic solution to this.  For PS/PDF/SVG
> we have cairo_[ps/pdf/svg]_surface_set_size() but the docs say they
> should only be called before any drawing operations have been performed
> on the current page.  We can look into fixing this such that they work
> even after drawing to the page.  It shouldn't be *that* hard to do.  But
> this approach doesn't work for raster backends, needless to say.
>
> In the future we may make the cairo meta-surface public.  At that point
> you can render to the meta-surface, measure, create final surface and
> replay the meta surface to the final surface.

That would be extremely useful, but meanwhile I will probably implement the
replay scenario discussed above.  Since this appears to be a fairly common
approach to the problem, I would appreciate it if somebody could point
me to some sample code that does replays.

Alan
__________________________
Alan W. Irwin

Astronomical research affiliation with Department of Physics and Astronomy,
University of Victoria (astrowww.phys.uvic.ca).

Programming affiliations with the FreeEOS equation-of-state implementation
for stellar interiors (freeeos.sf.net); PLplot scientific plotting software
package (plplot.org); the libLASi project (unifont.org/lasi); the Loads of
Linux Links project (loll.sf.net); and the Linux Brochure Project
(lbproject.sf.net).
__________________________

Linux-powered Science
__________________________


More information about the cairo mailing list