[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