[surface] Move the meta-data copy-on-snapshot to the generic layer.

As pointed out by Paolo Bonzini, copying the meta data for a snapshot is
common for all backends and so should be handled by the generic layer.
This commit is contained in:
Chris Wilson 2009-02-13 13:23:50 +00:00
parent adaf70a93f
commit cc8a09567c
2 changed files with 27 additions and 14 deletions

View file

@ -1152,17 +1152,6 @@ _cairo_surface_fallback_snapshot (cairo_surface_t *surface)
return _cairo_surface_create_in_error (status); return _cairo_surface_create_in_error (status);
} }
status = _cairo_surface_copy_mime_data (snapshot, surface);
if (unlikely (status)) {
cairo_surface_destroy (snapshot);
return _cairo_surface_create_in_error (status);
}
snapshot->device_transform = surface->device_transform;
snapshot->device_transform_inverse = surface->device_transform_inverse;
snapshot->is_snapshot = TRUE;
return snapshot; return snapshot;
} }

View file

@ -1399,16 +1399,40 @@ _cairo_surface_clone_similar (cairo_surface_t *surface,
cairo_surface_t * cairo_surface_t *
_cairo_surface_snapshot (cairo_surface_t *surface) _cairo_surface_snapshot (cairo_surface_t *surface)
{ {
cairo_surface_t *snapshot;
cairo_status_t status;
if (surface->status) if (surface->status)
return _cairo_surface_create_in_error (surface->status); return _cairo_surface_create_in_error (surface->status);
if (surface->finished) if (surface->finished)
return _cairo_surface_create_in_error (_cairo_error (CAIRO_STATUS_SURFACE_FINISHED)); return _cairo_surface_create_in_error (_cairo_error (CAIRO_STATUS_SURFACE_FINISHED));
if (surface->backend->snapshot) if (surface->is_snapshot)
return surface->backend->snapshot (surface); return cairo_surface_reference (surface);
return _cairo_surface_fallback_snapshot (surface); snapshot = NULL;
if (surface->backend->snapshot != NULL)
snapshot = surface->backend->snapshot (surface);
if (snapshot == NULL)
snapshot = _cairo_surface_fallback_snapshot (surface);
if (unlikely (snapshot->status))
return snapshot;
status = _cairo_surface_copy_mime_data (snapshot, surface);
if (unlikely (status)) {
cairo_surface_destroy (snapshot);
return _cairo_surface_create_in_error (status);
}
snapshot->device_transform = surface->device_transform;
snapshot->device_transform_inverse = surface->device_transform_inverse;
snapshot->is_snapshot = TRUE;
return snapshot;
} }
/** /**