summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorKeith Packard <keithp@keithp.com>2005-07-21 08:45:57 +0000
committerKeith Packard <keithp@keithp.com>2005-07-21 08:45:57 +0000
commitb3dfbe94c3ec7713904cf5bd1872a0480f96f03a (patch)
tree0db4ace66cb95e5bdfdda8689956e112f8d5d661 /src
parent464ce69689045614a0c44037c77e1261c3fecda5 (diff)
Add cairo_xlib_surface_set_drawable which changes the target drawable for an xlib cairo_t to another which shares the same format, screen and display.
reviewed by: otaylor, cworth
Diffstat (limited to 'src')
-rw-r--r--src/cairo-xlib-surface.c44
-rw-r--r--src/cairo-xlib.h6
2 files changed, 50 insertions, 0 deletions
diff --git a/src/cairo-xlib-surface.c b/src/cairo-xlib-surface.c
index 1d579955d..9e93289ff 100644
--- a/src/cairo-xlib-surface.c
+++ b/src/cairo-xlib-surface.c
@@ -1623,6 +1623,50 @@ cairo_xlib_surface_set_size (cairo_surface_t *surface,
xlib_surface->height = height;
}
+/**
+ * cairo_xlib_surface_set_drawable:
+ * @surface: a #cairo_surface_t for the XLib backend
+ * @drawable: the new drawable for the surface
+ *
+ * Informs cairo of a new X Drawable underlying the
+ * surface. The drawable must match the display, screen
+ * and format of the existing drawable or the application
+ * will get X protocol errors and will probably terminate.
+ * No checks are done by this function to ensure this
+ * compatibility.
+ **/
+void
+cairo_xlib_surface_set_drawable (cairo_surface_t *abstract_surface,
+ Drawable drawable,
+ int width,
+ int height)
+{
+ cairo_xlib_surface_t *surface = (cairo_xlib_surface_t *)abstract_surface;
+
+ /* XXX: How do we want to handle this error case? */
+ if (! _cairo_surface_is_xlib (abstract_surface))
+ return;
+
+ /* XXX: and what about this case? */
+ if (surface->owns_pixmap)
+ return;
+
+ if (surface->drawable != drawable) {
+ if (surface->dst_picture)
+ XRenderFreePicture (surface->dpy, surface->dst_picture);
+
+ if (surface->src_picture)
+ XRenderFreePicture (surface->dpy, surface->src_picture);
+
+ surface->dst_picture = None;
+ surface->src_picture = None;
+
+ surface->drawable = drawable;
+ }
+ surface->width = width;
+ surface->height = height;
+}
+
/* RENDER glyphset cache code */
typedef struct glyphset_cache {
diff --git a/src/cairo-xlib.h b/src/cairo-xlib.h
index dbe0e15fb..5cdf1378b 100644
--- a/src/cairo-xlib.h
+++ b/src/cairo-xlib.h
@@ -64,6 +64,12 @@ cairo_xlib_surface_set_size (cairo_surface_t *surface,
int width,
int height);
+void
+cairo_xlib_surface_set_drawable (cairo_surface_t *surface,
+ Drawable drawable,
+ int width,
+ int height);
+
CAIRO_END_DECLS
#else /* CAIRO_HAS_XLIB_SURFACE */