[PATCH] [cairo-xlib-surface] Check for fallback support for the xrender_format
Chris Wilson
chris at chris-wilson.co.uk
Wed Apr 2 03:17:04 PDT 2008
On the fallback path, we can only recreate an image surface for
supported pixman formats (without a Visual) so check that the
user supplied xrender_format is supported upon creation.
---
src/cairo-xlib-surface.c | 28 ++++++++++++++++++++++++++++
1 files changed, 28 insertions(+), 0 deletions(-)
diff --git a/src/cairo-xlib-surface.c b/src/cairo-xlib-surface.c
index 3649ca6..7fd9198 100644
--- a/src/cairo-xlib-surface.c
+++ b/src/cairo-xlib-surface.c
@@ -2398,6 +2398,34 @@ cairo_xlib_surface_create_with_xrender_format (Display *dpy,
int width,
int height)
{
+ pixman_format_code_t pixman_format;
+ cairo_format_masks_t xlib_masks;
+ cairo_status_t status;
+
+ xlib_masks.alpha_mask = (unsigned long)
+ format->direct.alphaMask << format->direct.alpha;
+ xlib_masks.red_mask = (unsigned long)
+ format->direct.redMask << format->direct.red;
+ xlib_masks.green_mask = (unsigned long)
+ format->direct.greenMask << format->direct.green;
+ xlib_masks.blue_mask = (unsigned long)
+ format->direct.blueMask << format->direct.blue;
+
+ if (format->depth > 16) {
+ xlib_masks.bpp = 32;
+ } else if (format->depth > 8) {
+ xlib_masks.bpp = 16;
+ } else if (format->depth > 1) {
+ xlib_masks.bpp = 8;
+ } else {
+ xlib_masks.bpp = 1;
+ }
+
+ /* check that we can handle fallbacks for this xrender_format */
+ status = _pixman_format_from_masks (&xlib_masks, &pixman_format);
+ if (status)
+ return _cairo_surface_create_in_error (_cairo_error (CAIRO_STATUS_INVALID_VISUAL));
+
return _cairo_xlib_surface_create_internal (dpy, drawable, screen,
NULL, format, width, height, 0);
}
--
1.5.4.5
--=-e8vGDlfOajmFWL5O0SUe--
More information about the cairo
mailing list