Add more surface snapshots providers

This patch adds more implementation of the snapshot method.  For
surface types where acquire_source_image is already making a copy
of the bits, doing another one as is the case for the fallback
implementation is a waste.
This commit is contained in:
Paolo Bonzini 2008-11-25 20:15:15 +01:00 committed by Chris Wilson
parent cffb398f5a
commit f7613eeece
4 changed files with 68 additions and 4 deletions

View file

@ -300,6 +300,20 @@ _cairo_glitz_surface_acquire_source_image (void *abstract_surface,
return _cairo_glitz_surface_get_image (surface, NULL, image_out, NULL);
}
static cairo_surface_t *
_cairo_glitz_surface_snapshot (void *abstract_surface)
{
cairo_glitz_surface_t *surface = abstract_surface;
cairo_status_t status;
cairo_image_surface_t *image;
status = _cairo_glitz_surface_get_image (surface, NULL, &image, NULL);
if (unlikely (status))
return _cairo_surface_create_in_error (status);
return &image->base;
}
static void
_cairo_glitz_surface_release_source_image (void *abstract_surface,
cairo_image_surface_t *image,
@ -2317,7 +2331,7 @@ static const cairo_surface_backend_t cairo_glitz_surface_backend = {
NULL, /* fill */
NULL, /* show_glyphs */
NULL, /* snapshot */
_cairo_glitz_surface_snapshot,
_cairo_glitz_surface_is_similar,
_cairo_glitz_surface_reset

View file

@ -1522,6 +1522,23 @@ _cairo_quartz_surface_acquire_source_image (void *abstract_surface,
return CAIRO_STATUS_SUCCESS;
}
static cairo_surface_t *
_cairo_quartz_surface_snapshot (void *abstract_surface)
{
cairo_int_status_t status;
cairo_quartz_surface_t *surface = abstract_surface;
cairo_image_surface_t *image;
if (surface->imageSurfaceEquiv)
return NULL;
status = _cairo_quartz_get_image (surface, &image);
if (unlikely (status))
return _cairo_surface_create_in_error (CAIRO_STATUS_NO_MEMORY);
return &image->base;
}
static void
_cairo_quartz_surface_release_source_image (void *abstract_surface,
cairo_image_surface_t *image,
@ -2458,7 +2475,7 @@ static const struct _cairo_surface_backend cairo_quartz_surface_backend = {
NULL, /* show_glyphs */
#endif
NULL, /* snapshot */
_cairo_quartz_surface_snapshot,
NULL, /* is_similar */
NULL, /* reset */
NULL /* fill_stroke */

View file

@ -611,6 +611,20 @@ _cairo_xcb_surface_acquire_source_image (void *abstract_surfa
return CAIRO_STATUS_SUCCESS;
}
static cairo_surface_t *
_cairo_xcb_surface_snapshot (void *abstract_surface)
{
cairo_xcb_surface_t *surface = abstract_surface;
cairo_image_surface_t *image;
cairo_status_t status;
status = _get_image_surface (surface, NULL, &image, NULL);
if (unlikely (status))
return _cairo_surface_create_in_error (status);
return &image->base;
}
static void
_cairo_xcb_surface_release_source_image (void *abstract_surface,
cairo_image_surface_t *image,
@ -1704,7 +1718,8 @@ static const cairo_surface_backend_t cairo_xcb_surface_backend = {
NULL, /* stroke */
NULL, /* fill */
_cairo_xcb_surface_show_glyphs,
NULL, /* snapshot */
_cairo_xcb_surface_snapshot,
_cairo_xcb_surface_is_similar,

View file

@ -1105,6 +1105,22 @@ _cairo_xlib_surface_acquire_source_image (void *abstract_surf
return CAIRO_STATUS_SUCCESS;
}
static cairo_surface_t *
_cairo_xlib_surface_snapshot (void *abstract_surface)
{
cairo_xlib_surface_t *surface = abstract_surface;
cairo_image_surface_t *image;
cairo_status_t status;
_cairo_xlib_display_notify (surface->display);
status = _get_image_surface (surface, NULL, &image, NULL);
if (unlikely (status))
return _cairo_surface_create_in_error (status);
return &image->base;
}
static void
_cairo_xlib_surface_release_source_image (void *abstract_surface,
cairo_image_surface_t *image,
@ -2505,7 +2521,9 @@ static const cairo_surface_backend_t cairo_xlib_surface_backend = {
NULL, /* stroke */
NULL, /* fill */
_cairo_xlib_surface_show_glyphs,
NULL, /* snapshot */
_cairo_xlib_surface_snapshot,
_cairo_xlib_surface_is_similar,
_cairo_xlib_surface_reset,
NULL, /* fill_stroke */