From ab2776c9a16134c50b48fd202263421ec0f466e7 Mon Sep 17 00:00:00 2001 From: Chris Wilson Date: Thu, 29 Apr 2010 18:50:32 +0100 Subject: [PATCH] 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. --- src/cairo-surface-snapshot.c | 21 ++++++++++++++++++++- 1 file changed, 20 insertions(+), 1 deletion(-) 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 *)