diff options
Diffstat (limited to 'src/cairo-xcb-surface-render.c')
-rw-r--r-- | src/cairo-xcb-surface-render.c | 21 |
1 files changed, 20 insertions, 1 deletions
diff --git a/src/cairo-xcb-surface-render.c b/src/cairo-xcb-surface-render.c index d77ea62d..e3f31831 100644 --- a/src/cairo-xcb-surface-render.c +++ b/src/cairo-xcb-surface-render.c @@ -917,6 +917,15 @@ setup_picture: return picture; } +static void +_decouple_cached_picture (cairo_surface_t *surface) +{ + cairo_xcb_picture_t *picture = (cairo_xcb_picture_t *) surface; + + if (! picture->base.finished) + _cairo_xcb_screen_remove_surface_picture (picture->screen, &picture->base); +} + static cairo_xcb_picture_t * _cairo_xcb_surface_picture (cairo_xcb_surface_t *target, const cairo_surface_pattern_t *pattern, @@ -985,7 +994,17 @@ _cairo_xcb_surface_picture (cairo_xcb_surface_t *target, return picture; } - status = _cairo_surface_attach_snapshot (source, &picture->base, NULL); + status = _cairo_xcb_screen_store_surface_picture (target->screen, + &picture->base, + CAIRO_STRIDE_FOR_WIDTH_BPP (width, PIXMAN_FORMAT_BPP (picture->pixman_format)) * picture->height); + if (unlikely (status)) { + cairo_surface_destroy (&picture->base); + return (cairo_xcb_picture_t *) _cairo_surface_create_in_error (status); + } + + status = _cairo_surface_attach_snapshot (source, + &picture->base, + _decouple_cached_picture); if (unlikely (status)) { cairo_surface_destroy (&picture->base); return (cairo_xcb_picture_t *) _cairo_surface_create_in_error (status); |