diff options
author | Chris Wilson <chris@chris-wilson.co.uk> | 2011-11-23 15:49:53 +0000 |
---|---|---|
committer | Chris Wilson <chris@chris-wilson.co.uk> | 2011-11-23 17:35:30 +0000 |
commit | 2fb4a0e119b075921442dd2266f4dcc24c9f12e7 (patch) | |
tree | bc2670800e06071aface69d51822413e6870d745 /src/cairo-surface-subsurface.c | |
parent | 894d8c8bf7cd83be8775c79233f21d9c11c14b2a (diff) | |
download | cairo-2fb4a0e119b075921442dd2266f4dcc24c9f12e7.tar.gz |
subsurface: Support caching for cloned subsurfaces
Signed-off-by: Chris Wilson <chris@chris-wilson.co.uk>
Diffstat (limited to 'src/cairo-surface-subsurface.c')
-rw-r--r-- | src/cairo-surface-subsurface.c | 28 |
1 files changed, 28 insertions, 0 deletions
diff --git a/src/cairo-surface-subsurface.c b/src/cairo-surface-subsurface.c index 49f181cbe..2fb9562f4 100644 --- a/src/cairo-surface-subsurface.c +++ b/src/cairo-surface-subsurface.c @@ -50,6 +50,7 @@ _cairo_surface_subsurface_finish (void *abstract_surface) cairo_surface_subsurface_t *surface = abstract_surface; cairo_surface_destroy (surface->target); + cairo_surface_destroy (surface->snapshot); return CAIRO_STATUS_SUCCESS; } @@ -471,6 +472,8 @@ cairo_surface_create_for_rectangle (cairo_surface_t *target, surface->target = cairo_surface_reference (target); surface->base.type = surface->target->type; + surface->snapshot = NULL; + return &surface->base; } @@ -501,9 +504,34 @@ _cairo_surface_create_for_rectangle_int (cairo_surface_t *target, surface->extents = *extents; surface->extents.x += target->device_transform.x0; surface->extents.y += target->device_transform.y0; + surface->target = cairo_surface_reference (target); surface->base.type = surface->target->type; + surface->snapshot = NULL; + return &surface->base; } /* XXX observe mark-dirty */ + +static void +_cairo_surface_subsurface_detach_snapshot (cairo_surface_t *surface) +{ + cairo_surface_subsurface_t *ss = (cairo_surface_subsurface_t *) surface; + + cairo_surface_destroy (ss->snapshot); + ss->snapshot = NULL; +} + +void +_cairo_surface_subsurface_set_snapshot (cairo_surface_t *surface, + cairo_surface_t *snapshot) +{ + cairo_surface_subsurface_t *ss = (cairo_surface_subsurface_t *) surface; + + assert (ss->snapshot == NULL); + ss->snapshot = cairo_surface_reference (snapshot); + + _cairo_surface_attach_snapshot (ss->target, &ss->base, + _cairo_surface_subsurface_detach_snapshot); +} |