[cairo] [PATCH 4/4] Add cairo_xcb_surface_set_drawable
Keith Packard
keithp at keithp.com
Fri Dec 2 06:57:24 PST 2011
Mirrors cairo_xlib_surface_set_drawable, allowing the drawable
targeted by a surface to be changed on the fly.
Signed-off-by: Keith Packard <keithp at keithp.com>
---
doc/public/cairo-sections.txt | 1 +
src/cairo-xcb-private.h | 1 +
src/cairo-xcb-surface.c | 68 +++++++++++++++++++++++++++++++++++++++++
src/cairo-xcb.h | 6 +++
4 files changed, 76 insertions(+), 0 deletions(-)
diff --git a/doc/public/cairo-sections.txt b/doc/public/cairo-sections.txt
index ddc6921..f988663 100644
--- a/doc/public/cairo-sections.txt
+++ b/doc/public/cairo-sections.txt
@@ -160,6 +160,7 @@ cairo_xcb_surface_create
cairo_xcb_surface_create_for_bitmap
cairo_xcb_surface_create_with_xrender_format
cairo_xcb_surface_set_size
+cairo_xcb_surface_set_drawable
</SECTION>
<SECTION>
diff --git a/src/cairo-xcb-private.h b/src/cairo-xcb-private.h
index 42a112c..8d90bc6 100644
--- a/src/cairo-xcb-private.h
+++ b/src/cairo-xcb-private.h
@@ -806,6 +806,7 @@ slim_hidden_proto (cairo_xcb_surface_create);
slim_hidden_proto (cairo_xcb_surface_create_for_bitmap);
slim_hidden_proto (cairo_xcb_surface_create_with_xrender_format);
slim_hidden_proto (cairo_xcb_surface_set_size);
+slim_hidden_proto (cairo_xcb_surface_set_drawable);
slim_hidden_proto (cairo_xcb_device_debug_get_precision);
slim_hidden_proto_no_warn (cairo_xcb_device_debug_set_precision);
#endif
diff --git a/src/cairo-xcb-surface.c b/src/cairo-xcb-surface.c
index 6ddc815..3254cda 100644
--- a/src/cairo-xcb-surface.c
+++ b/src/cairo-xcb-surface.c
@@ -1430,3 +1430,71 @@ cairo_xcb_surface_set_size (cairo_surface_t *abstract_surface,
#if CAIRO_HAS_XLIB_XCB_FUNCTIONS
slim_hidden_def (cairo_xcb_surface_set_size);
#endif
+
+/**
+ * cairo_xcb_surface_set_drawable:
+ * @surface: a #cairo_surface_t for the XCB backend
+ * @drawable: the new drawable of the surface
+ * @width: the new width of the surface
+ * @height: the new height of the surface
+ *
+ * Informs cairo of the new drawable and size of the XCB drawable underlying the
+ * surface.
+ *
+ **/
+void
+cairo_xcb_surface_set_drawable (cairo_surface_t *abstract_surface,
+ xcb_drawable_t drawable,
+ int width,
+ int height)
+{
+ cairo_xcb_surface_t *surface;
+
+ if (unlikely (abstract_surface->status))
+ return;
+ if (unlikely (abstract_surface->finished)) {
+ _cairo_surface_set_error (abstract_surface,
+ _cairo_error (CAIRO_STATUS_SURFACE_FINISHED));
+ return;
+ }
+
+
+ if (abstract_surface->type != CAIRO_SURFACE_TYPE_XCB) {
+ _cairo_surface_set_error (abstract_surface,
+ _cairo_error (CAIRO_STATUS_SURFACE_TYPE_MISMATCH));
+ return;
+ }
+
+ if (width > XLIB_COORD_MAX || height > XLIB_COORD_MAX || width <= 0 || height <= 0) {
+ _cairo_surface_set_error (abstract_surface,
+ _cairo_error (CAIRO_STATUS_INVALID_SIZE));
+ return;
+ }
+
+ surface = (cairo_xcb_surface_t *) abstract_surface;
+
+ if (surface->owns_pixmap)
+ return;
+
+ if (surface->drawable != drawable) {
+ cairo_status_t status;
+ status = _cairo_xcb_connection_acquire (surface->connection);
+ if (unlikely (status))
+ return;
+
+ if (surface->picture != XCB_NONE) {
+ _cairo_xcb_connection_render_free_picture (surface->connection,
+ surface->picture);
+ surface->picture = XCB_NONE;
+ }
+
+ _cairo_xcb_connection_release (surface->connection);
+
+ surface->drawable = drawable;
+ }
+ surface->width = width;
+ surface->height = height;
+}
+#if CAIRO_HAS_XLIB_XCB_FUNCTIONS
+slim_hidden_def (cairo_xcb_surface_set_drawable);
+#endif
diff --git a/src/cairo-xcb.h b/src/cairo-xcb.h
index 4bfb0b5..e321d84 100644
--- a/src/cairo-xcb.h
+++ b/src/cairo-xcb.h
@@ -75,6 +75,12 @@ cairo_xcb_surface_set_size (cairo_surface_t *surface,
int width,
int height);
+cairo_public void
+cairo_xcb_surface_set_drawable (cairo_surface_t *surface,
+ xcb_drawable_t drawable,
+ int width,
+ int height);
+
cairo_public xcb_connection_t *
cairo_xcb_device_get_connection (cairo_device_t *device);
--
1.7.7.3
More information about the cairo
mailing list