summaryrefslogtreecommitdiff
path: root/src/cairo-surface-snapshot.c
diff options
context:
space:
mode:
authorChris Wilson <chris@chris-wilson.co.uk>2010-04-29 18:50:32 +0100
committerChris Wilson <chris@chris-wilson.co.uk>2010-04-30 10:16:23 +0100
commitab2776c9a16134c50b48fd202263421ec0f466e7 (patch)
tree06ffa1954fce75273c45acda4c8132c8eb735fcf /src/cairo-surface-snapshot.c
parent07122f37d11eabe62bc9c81ccbf71bbe8b7a1005 (diff)
downloadcairo-ab2776c9a16134c50b48fd202263421ec0f466e7.tar.gz
snapshot: Attach the backend generated snapshot to the target
Cache the result of snapshotting using the backend vfunc in the normal manner by attaching the snapshot to the target. This should reduce resource usage in these cases.
Diffstat (limited to 'src/cairo-surface-snapshot.c')
-rw-r--r--src/cairo-surface-snapshot.c21
1 files changed, 20 insertions, 1 deletions
diff --git a/src/cairo-surface-snapshot.c b/src/cairo-surface-snapshot.c
index 02c79c1ce..20cc6b9ad 100644
--- a/src/cairo-surface-snapshot.c
+++ b/src/cairo-surface-snapshot.c
@@ -196,9 +196,28 @@ _cairo_surface_snapshot (cairo_surface_t *surface)
if (surface->backend->snapshot != NULL) {
cairo_surface_t *snap;
- snap = surface->backend->snapshot (surface);
+ snap = _cairo_surface_has_snapshot (surface, surface->backend);
if (snap != NULL)
+ return cairo_surface_reference (snap);
+
+ snap = surface->backend->snapshot (surface);
+ if (snap != NULL) {
+ if (unlikely (snap->status))
+ return snap;
+
+ status = _cairo_surface_copy_mime_data (snap, surface);
+ if (unlikely (status)) {
+ cairo_surface_destroy (snap);
+ return _cairo_surface_create_in_error (status);
+ }
+
+ snap->device_transform = surface->device_transform;
+ snap->device_transform_inverse = surface->device_transform_inverse;
+
+ _cairo_surface_attach_snapshot (surface, snap, NULL);
+
return snap;
+ }
}
snapshot = (cairo_surface_snapshot_t *)