[cairo] _cairo_pattern_create_copy()

Behdad Esfahbod behdad at behdad.org
Thu May 1 08:41:27 PDT 2008

On Thu, 2008-05-01 at 14:45 +0100, Chris Wilson wrote:
> A few months ago, Adrian Johnson committed this patch:
> commit b4e0864b960887fd71de85d514cb3e855c276080
> Author: Adrian Johnson <ajohnson at redneon.com>
> Date:   Mon Jan 7 20:42:15 2008 +1030
>     Use _cairo_pattern_create_copy() in cairo-surface.c
>     Use _cairo_pattern_create_copy()/cairo_pattern_destroy() instead of
>     _cairo_pattern_init_copy()/_cairo_pattern_fini() so the PDF backend
>     can reference the patterns and destroy them later.
> Profiling memory allocations for firefox3 whilst loading and scrolling
> through the sites listed on http://wiki.mozilla.org/Mozilla2:Trender, we
> see:
> Allocator					Count	Bytes
> _cairo_pattern_create_copy			583303	80412256
> _cairo_skip_list_insert *			566032	12425880
> _cairo_freelist_alloc *				341702	2788704
> _cairo_gstate_clone				275247	99088920
> _cairo_array_grow_by				248526	1988208
> _cairo_region_get_boxes				197682	4867120
> _cairo_xlib_surface_create_internal		174801	68521992
> _cairo_bo_event_queue_init *			149475	90881712
> cairo_create					139520	126126080
> _cairo_pen_init_copy				112085	22154640
> * tessellator
> I would like to push the _cairo_pattern_create_copy() down into the PDF
> backend -

Makes sense.

> I hesitate in case I've missed some subtlety in the
> interactions of the various paginated/meta/pdf layers that requires a
> reference rather than a copy. (And someone needs to review the use of
> cairo_pattern_reference within the Quartz backend.)

Well we can try to review if you send a patch ;).

> Whilst discussing
> the pattern copy, can we eliminate the copy entirely (other than when a
> snapshot is required) by tracking the pattern transform separately? If
> we can reuse the same pattern multiple times, then it becomes
> interesting to see what we can cache, or what resources we can minimise.

I wouldn't bother before one can describe a plan to gain from it.
Patterns are small objects anyway.  What's the gain?  And the issue here
is a general one, that various properties of an object have different
use patterns.  If you could break an object on each property you could
do more caching...  I have had this feeling about the scaled fonts

For example, if metrics hinting is off, you will be always returning the
same metrics regardless of CTM.  It's quite natural to want to share the
cached metrics across different font sizes then.  But if metrics hinting
is on, you are back to different metrics per scaled font.  Kinda same
about glyph path when hinting is off.


"Those who would give up Essential Liberty to purchase a little
 Temporary Safety, deserve neither Liberty nor Safety."
        -- Benjamin Franklin, 1759

More information about the cairo mailing list