diff --git a/src/cairo-glitz-surface.c b/src/cairo-glitz-surface.c index 7cc2b2336..cd0d254d8 100644 --- a/src/cairo-glitz-surface.c +++ b/src/cairo-glitz-surface.c @@ -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 diff --git a/src/cairo-quartz-surface.c b/src/cairo-quartz-surface.c index 982ede42f..892a156df 100644 --- a/src/cairo-quartz-surface.c +++ b/src/cairo-quartz-surface.c @@ -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 */ diff --git a/src/cairo-xcb-surface.c b/src/cairo-xcb-surface.c index 077e1c46d..30a5c6b34 100644 --- a/src/cairo-xcb-surface.c +++ b/src/cairo-xcb-surface.c @@ -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, diff --git a/src/cairo-xlib-surface.c b/src/cairo-xlib-surface.c index ce3406196..25bdfb380 100644 --- a/src/cairo-xlib-surface.c +++ b/src/cairo-xlib-surface.c @@ -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 */