summaryrefslogtreecommitdiff
path: root/src/cairo-xcb-surface-render.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/cairo-xcb-surface-render.c')
-rw-r--r--src/cairo-xcb-surface-render.c21
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);