mirror of
https://gitlab.freedesktop.org/cairo/cairo.git
synced 2025-12-29 03:20:13 +01:00
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:
parent
cffb398f5a
commit
f7613eeece
4 changed files with 68 additions and 4 deletions
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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 */
|
||||
|
|
|
|||
|
|
@ -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,
|
||||
|
||||
|
|
|
|||
|
|
@ -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 */
|
||||
|
|
|
|||
Loading…
Add table
Reference in a new issue