summaryrefslogtreecommitdiff
path: root/src/cairo-surface-subsurface.c
diff options
context:
space:
mode:
authorChris Wilson <chris@chris-wilson.co.uk>2011-11-23 15:49:53 +0000
committerChris Wilson <chris@chris-wilson.co.uk>2011-11-23 17:35:30 +0000
commit2fb4a0e119b075921442dd2266f4dcc24c9f12e7 (patch)
treebc2670800e06071aface69d51822413e6870d745 /src/cairo-surface-subsurface.c
parent894d8c8bf7cd83be8775c79233f21d9c11c14b2a (diff)
downloadcairo-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.c28
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);
+}