diff options
author | Chris Wilson <chris@chris-wilson.co.uk> | 2010-04-29 18:50:32 +0100 |
---|---|---|
committer | Chris Wilson <chris@chris-wilson.co.uk> | 2010-04-30 10:16:23 +0100 |
commit | ab2776c9a16134c50b48fd202263421ec0f466e7 (patch) | |
tree | 06ffa1954fce75273c45acda4c8132c8eb735fcf /src/cairo-surface-snapshot.c | |
parent | 07122f37d11eabe62bc9c81ccbf71bbe8b7a1005 (diff) | |
download | cairo-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.c | 21 |
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 *) |