diff options
author | Keith Packard <keithp@keithp.com> | 2005-07-21 08:45:57 +0000 |
---|---|---|
committer | Keith Packard <keithp@keithp.com> | 2005-07-21 08:45:57 +0000 |
commit | b3dfbe94c3ec7713904cf5bd1872a0480f96f03a (patch) | |
tree | 0db4ace66cb95e5bdfdda8689956e112f8d5d661 /src | |
parent | 464ce69689045614a0c44037c77e1261c3fecda5 (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.c | 44 | ||||
-rw-r--r-- | src/cairo-xlib.h | 6 |
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 */ |