From cdb1ae97f241ec6b24d64b0fa5447d26f6bc5318 Mon Sep 17 00:00:00 2001 From: Carl Worth Date: Sun, 27 Jan 2008 10:31:58 -0800 Subject: [PATCH] Move assertion failure for unsupported masks up one level We're moving the assertion up from inside _pixman_format_to_mask to its callers. This will allow us to selectively eliminate the assertion from the supported xlib backend, while leaving it in the unsupported glitz and xcb backends for now. --- src/cairo-image-surface.c | 62 +++++++++++++++++++++++---------------- src/cairo-xlib-surface.c | 20 +++++++++++-- src/cairoint.h | 5 ++-- 3 files changed, 58 insertions(+), 29 deletions(-) diff --git a/src/cairo-image-surface.c b/src/cairo-image-surface.c index 57dbdb8be..87abf1696 100644 --- a/src/cairo-image-surface.c +++ b/src/cairo-image-surface.c @@ -142,8 +142,9 @@ _cairo_image_surface_create_for_pixman_image (pixman_image_t *pixman_image, } /* XXX: This function should really live inside pixman. */ -pixman_format_code_t -_pixman_format_from_masks (cairo_format_masks_t *masks) +cairo_int_status_t +_pixman_format_from_masks (cairo_format_masks_t *masks, + pixman_format_code_t *format_ret) { switch (masks->bpp) { case 32: @@ -152,28 +153,32 @@ _pixman_format_from_masks (cairo_format_masks_t *masks) masks->green_mask == 0x0000ff00 && masks->blue_mask == 0x000000ff) { - return PIXMAN_a8r8g8b8; + *format_ret = PIXMAN_a8r8g8b8; + return CAIRO_STATUS_SUCCESS; } if (masks->alpha_mask == 0x00000000 && masks->red_mask == 0x00ff0000 && masks->green_mask == 0x0000ff00 && masks->blue_mask == 0x000000ff) { - return PIXMAN_x8r8g8b8; + *format_ret = PIXMAN_x8r8g8b8; + return CAIRO_STATUS_SUCCESS; } if (masks->alpha_mask == 0xff000000 && masks->red_mask == 0x000000ff && masks->green_mask == 0x0000ff00 && masks->blue_mask == 0x00ff0000) { - return PIXMAN_a8b8g8r8; + *format_ret = PIXMAN_a8b8g8r8; + return CAIRO_STATUS_SUCCESS; } if (masks->alpha_mask == 0x00000000 && masks->red_mask == 0x000000ff && masks->green_mask == 0x0000ff00 && masks->blue_mask == 0x00ff0000) { - return PIXMAN_x8b8g8r8; + *format_ret = PIXMAN_x8b8g8r8; + return CAIRO_STATUS_SUCCESS; } break; case 16: @@ -182,44 +187,35 @@ _pixman_format_from_masks (cairo_format_masks_t *masks) masks->green_mask == 0x07e0 && masks->blue_mask == 0x001f) { - return PIXMAN_r5g6b5; + *format_ret = PIXMAN_r5g6b5; + return CAIRO_STATUS_SUCCESS; } if (masks->alpha_mask == 0x0000 && masks->red_mask == 0x7c00 && masks->green_mask == 0x03e0 && masks->blue_mask == 0x001f) { - return PIXMAN_x1r5g5b5; + *format_ret = PIXMAN_x1r5g5b5; + return CAIRO_STATUS_SUCCESS; } break; case 8: if (masks->alpha_mask == 0xff) { - return PIXMAN_a8; + *format_ret = PIXMAN_a8; + return CAIRO_STATUS_SUCCESS; } break; case 1: if (masks->alpha_mask == 0x1) { - return PIXMAN_a1; + *format_ret = PIXMAN_a1; + return CAIRO_STATUS_SUCCESS; } break; } - fprintf (stderr, - "Error: Cairo " PACKAGE_VERSION " does not yet support the requested image format:\n" - "\tDepth: %d\n" - "\tAlpha mask: 0x%08lx\n" - "\tRed mask: 0x%08lx\n" - "\tGreen mask: 0x%08lx\n" - "\tBlue mask: 0x%08lx\n" - "Please file an enhancement request (quoting the above) at:\n" - PACKAGE_BUGREPORT "\n", - masks->bpp, masks->alpha_mask, - masks->red_mask, masks->green_mask, masks->blue_mask); - - ASSERT_NOT_REACHED; - return 0; + return CAIRO_INT_STATUS_UNSUPPORTED; } /* XXX: This function should really live inside pixman. */ @@ -289,9 +285,25 @@ _cairo_image_surface_create_with_masks (unsigned char *data, int height, int stride) { + cairo_int_status_t status; pixman_format_code_t pixman_format; - pixman_format = _pixman_format_from_masks (masks); + status = _pixman_format_from_masks (masks, &pixman_format); + if (status == CAIRO_INT_STATUS_UNSUPPORTED) { + fprintf (stderr, + "Error: Cairo " PACKAGE_VERSION " does not yet support the requested image format:\n" + "\tDepth: %d\n" + "\tAlpha mask: 0x%08lx\n" + "\tRed mask: 0x%08lx\n" + "\tGreen mask: 0x%08lx\n" + "\tBlue mask: 0x%08lx\n" + "Please file an enhancement request (quoting the above) at:\n" + PACKAGE_BUGREPORT "\n", + masks->bpp, masks->alpha_mask, + masks->red_mask, masks->green_mask, masks->blue_mask); + + ASSERT_NOT_REACHED; + } return _cairo_image_surface_create_with_pixman_format (data, pixman_format, diff --git a/src/cairo-xlib-surface.c b/src/cairo-xlib-surface.c index 59dd45bea..cd1814b26 100644 --- a/src/cairo-xlib-surface.c +++ b/src/cairo-xlib-surface.c @@ -461,12 +461,12 @@ _get_image_surface (cairo_xlib_surface_t *surface, cairo_image_surface_t **image_out, cairo_rectangle_int_t *image_rect) { + cairo_int_status_t status; cairo_image_surface_t *image; XImage *ximage; short x1, y1, x2, y2; cairo_format_masks_t masks; pixman_format_code_t pixman_format; - cairo_status_t status; x1 = 0; y1 = 0; @@ -600,7 +600,23 @@ _get_image_surface (cairo_xlib_surface_t *surface, masks.alpha_mask = 0xffffffff; } - pixman_format = _pixman_format_from_masks (&masks); + status = _pixman_format_from_masks (&masks, &pixman_format); + if (status == CAIRO_INT_STATUS_UNSUPPORTED) { + fprintf (stderr, + "Error: Cairo " PACKAGE_VERSION " does not yet support the requested image format:\n" + "\tDepth: %d\n" + "\tAlpha mask: 0x%08lx\n" + "\tRed mask: 0x%08lx\n" + "\tGreen mask: 0x%08lx\n" + "\tBlue mask: 0x%08lx\n" + "Please file an enhancement request (quoting the above) at:\n" + PACKAGE_BUGREPORT "\n", + masks.bpp, masks.alpha_mask, + masks.red_mask, masks.green_mask, masks.blue_mask); + + ASSERT_NOT_REACHED; + } + image = (cairo_image_surface_t*) _cairo_image_surface_create_with_pixman_format ((unsigned char *) ximage->data, pixman_format, diff --git a/src/cairoint.h b/src/cairoint.h index c36a2a8fe..fdeeae591 100644 --- a/src/cairoint.h +++ b/src/cairoint.h @@ -1848,8 +1848,9 @@ cairo_private cairo_surface_t * _cairo_image_surface_create_for_pixman_image (pixman_image_t *pixman_image, pixman_format_code_t pixman_format); -cairo_private pixman_format_code_t -_pixman_format_from_masks (cairo_format_masks_t *masks); +cairo_private cairo_int_status_t +_pixman_format_from_masks (cairo_format_masks_t *masks, + pixman_format_code_t *format_ret); cairo_private void _pixman_format_to_masks (pixman_format_code_t pixman_format,