diff --git a/boilerplate/cairo-boilerplate.c b/boilerplate/cairo-boilerplate.c index d3f312f3e..2a3a354d8 100644 --- a/boilerplate/cairo-boilerplate.c +++ b/boilerplate/cairo-boilerplate.c @@ -115,7 +115,7 @@ cairo_boilerplate_format_from_content (cairo_content_t content) case CAIRO_CONTENT_ALPHA: format = CAIRO_FORMAT_A8; break; default: assert (0); /* not reached */ - format = (cairo_format_t) -1; + format = CAIRO_FORMAT_INVALID; break; } diff --git a/src/cairo-debug.c b/src/cairo-debug.c index e36406975..359018ac2 100644 --- a/src/cairo-debug.c +++ b/src/cairo-debug.c @@ -110,6 +110,7 @@ _cairo_debug_check_image_surface_is_defined (const cairo_surface_t *surface) case CAIRO_FORMAT_ARGB32: width = image->width*4; break; + case CAIRO_FORMAT_INVALID: default: /* XXX compute width from pixman bpp */ return; diff --git a/src/cairo-gl-glyphs.c b/src/cairo-gl-glyphs.c index 06c29c5b1..5e9b7bbac 100644 --- a/src/cairo-gl-glyphs.c +++ b/src/cairo-gl-glyphs.c @@ -164,6 +164,9 @@ cairo_gl_context_get_glyph_cache (cairo_gl_context_t *ctx, cache = &ctx->glyph_cache[1]; format = CAIRO_FORMAT_A8; break; + case CAIRO_FORMAT_INVALID: + ASSERT_NOT_REACHED; + return NULL; } if (unlikely (cache->tex == 0)) { @@ -182,6 +185,9 @@ cairo_gl_context_get_glyph_cache (cairo_gl_context_t *ctx, case CAIRO_FORMAT_A8: internal_format = GL_ALPHA; break; + case CAIRO_FORMAT_INVALID: + ASSERT_NOT_REACHED; + return NULL; } glGenTextures (1, &cache->tex); diff --git a/src/cairo-image-surface.c b/src/cairo-image-surface.c index 9d74350f8..e53f53fda 100644 --- a/src/cairo-image-surface.c +++ b/src/cairo-image-surface.c @@ -277,6 +277,7 @@ _cairo_format_to_pixman_format_code (cairo_format_t format) ret = PIXMAN_x8r8g8b8; break; case CAIRO_FORMAT_ARGB32: + case CAIRO_FORMAT_INVALID: default: ret = PIXMAN_a8r8g8b8; break; @@ -626,7 +627,7 @@ _cairo_format_from_content (cairo_content_t content) } ASSERT_NOT_REACHED; - return CAIRO_FORMAT_ARGB32; + return CAIRO_FORMAT_INVALID; } cairo_content_t @@ -640,6 +641,8 @@ _cairo_content_from_format (cairo_format_t format) case CAIRO_FORMAT_A8: case CAIRO_FORMAT_A1: return CAIRO_CONTENT_ALPHA; + case CAIRO_FORMAT_INVALID: + break; } ASSERT_NOT_REACHED; @@ -658,6 +661,7 @@ _cairo_format_bits_per_pixel (cairo_format_t format) return 8; case CAIRO_FORMAT_A1: return 1; + case CAIRO_FORMAT_INVALID: default: ASSERT_NOT_REACHED; return 0; diff --git a/src/cairo-png.c b/src/cairo-png.c index 8b9b43c70..6e0563de6 100644 --- a/src/cairo-png.c +++ b/src/cairo-png.c @@ -230,6 +230,7 @@ write_png (cairo_surface_t *surface, png_set_packswap (png); #endif break; + case CAIRO_FORMAT_INVALID: default: status = _cairo_error (CAIRO_STATUS_INVALID_FORMAT); goto BAIL4; diff --git a/src/cairo-scaled-font.c b/src/cairo-scaled-font.c index 4171c465e..a5db3f13c 100644 --- a/src/cairo-scaled-font.c +++ b/src/cairo-scaled-font.c @@ -2146,6 +2146,7 @@ _cairo_scaled_font_show_glyphs (cairo_scaled_font_t *scaled_font, mask_format = glyph_surface->format; break; case CAIRO_FORMAT_RGB24: + case CAIRO_FORMAT_INVALID: default: ASSERT_NOT_REACHED; mask_format = CAIRO_FORMAT_ARGB32; diff --git a/src/cairo-script-surface.c b/src/cairo-script-surface.c index 77cac9bd0..e342ceda8 100644 --- a/src/cairo-script-surface.c +++ b/src/cairo-script-surface.c @@ -817,14 +817,15 @@ _emit_stroke_style (cairo_script_surface_t *surface, static const char * _format_to_string (cairo_format_t format) { - static const char *names[] = { - "ARGB32", /* CAIRO_FORMAT_ARGB32 */ - "RGB24", /* CAIRO_FORMAT_RGB24 */ - "A8", /* CAIRO_FORMAT_A8 */ - "A1" /* CAIRO_FORMAT_A1 */ - }; - assert (format < ARRAY_LENGTH (names)); - return names[format]; + switch (format) { + case CAIRO_FORMAT_ARGB32: return "ARGB32"; + case CAIRO_FORMAT_RGB24: return "RGB24"; + case CAIRO_FORMAT_A8: return "A8"; + case CAIRO_FORMAT_A1: return "A1"; + case CAIRO_FORMAT_INVALID: return "INVALID"; + } + ASSERT_NOT_REACHED; + return "INVALID"; } static cairo_status_t @@ -1057,6 +1058,7 @@ _write_image_surface (cairo_output_stream_t *output, data += stride; } break; + case CAIRO_FORMAT_INVALID: default: ASSERT_NOT_REACHED; break; @@ -1110,6 +1112,7 @@ _write_image_surface (cairo_output_stream_t *output, data += stride; } break; + case CAIRO_FORMAT_INVALID: default: ASSERT_NOT_REACHED; break; @@ -1230,6 +1233,9 @@ _emit_image_surface (cairo_script_surface_t *surface, case CAIRO_FORMAT_ARGB32: len = clone->width * 4; break; + case CAIRO_FORMAT_INVALID: + ASSERT_NOT_REACHED; + break; } len *= clone->height; diff --git a/src/cairo-win32-surface.c b/src/cairo-win32-surface.c index ce872f749..a7786cbca 100644 --- a/src/cairo-win32-surface.c +++ b/src/cairo-win32-surface.c @@ -176,6 +176,9 @@ _create_dc_and_bitmap (cairo_win32_surface_t *surface, surface->is_dib = FALSE; switch (format) { + default: + case CAIRO_FORMAT_INVALID: + return _cairo_error (CAIRO_STATUS_INVALID_FORMAT); case CAIRO_FORMAT_ARGB32: case CAIRO_FORMAT_RGB24: num_palette = 0; @@ -337,6 +340,9 @@ _cairo_win32_surface_create_for_dc (HDC original_dc, unsigned char *bits; int rowstride; + if (! CAIRO_FORMAT_VALID (format)) + return _cairo_surface_create_in_error (_cairo_error (CAIRO_STATUS_INVALID_FORMAT)); + surface = malloc (sizeof (cairo_win32_surface_t)); if (surface == NULL) return _cairo_surface_create_in_error (_cairo_error (CAIRO_STATUS_NO_MEMORY)); diff --git a/src/cairo-xcb-surface-render.c b/src/cairo-xcb-surface-render.c index 375287211..e7a101426 100644 --- a/src/cairo-xcb-surface-render.c +++ b/src/cairo-xcb-surface-render.c @@ -3829,6 +3829,7 @@ _cairo_xcb_scaled_font_get_glyphset_info_for_format (cairo_scaled_font_t *scaled switch (format) { default: + case CAIRO_FORMAT_INVALID: case CAIRO_FORMAT_RGB24: case CAIRO_FORMAT_ARGB32: glyphset_index = GLYPHSET_INDEX_ARGB32; break; case CAIRO_FORMAT_A8: glyphset_index = GLYPHSET_INDEX_A8; break; @@ -3892,6 +3893,7 @@ _cairo_xcb_scaled_font_get_glyphset_info_for_pending_free_glyph ( if (surface != NULL) { switch (surface->format) { default: + case CAIRO_FORMAT_INVALID: case CAIRO_FORMAT_RGB24: case CAIRO_FORMAT_ARGB32: i = GLYPHSET_INDEX_ARGB32; break; case CAIRO_FORMAT_A8: i = GLYPHSET_INDEX_A8; break; @@ -4058,6 +4060,7 @@ _cairo_xcb_surface_add_glyph (cairo_xcb_connection_t *connection, break; case CAIRO_FORMAT_RGB24: + case CAIRO_FORMAT_INVALID: default: ASSERT_NOT_REACHED; break; diff --git a/src/cairo-xlib-display.c b/src/cairo-xlib-display.c index d8715c622..f9b9617fb 100644 --- a/src/cairo-xlib-display.c +++ b/src/cairo-xlib-display.c @@ -591,6 +591,7 @@ _cairo_xlib_display_get_xrender_format (cairo_xlib_display_t *display, pict_format = PictStandardA8; break; case CAIRO_FORMAT_RGB24: pict_format = PictStandardRGB24; break; + case CAIRO_FORMAT_INVALID: default: ASSERT_NOT_REACHED; case CAIRO_FORMAT_ARGB32: diff --git a/src/cairo-xlib-surface.c b/src/cairo-xlib-surface.c index 85459481f..f8620e3a2 100644 --- a/src/cairo-xlib-surface.c +++ b/src/cairo-xlib-surface.c @@ -3749,6 +3749,7 @@ _cairo_xlib_scaled_font_get_glyphset_info_for_format (cairo_scaled_font_t *scale switch (format) { default: + case CAIRO_FORMAT_INVALID: case CAIRO_FORMAT_RGB24: case CAIRO_FORMAT_ARGB32: glyphset_index = GLYPHSET_INDEX_ARGB32; break; case CAIRO_FORMAT_A8: glyphset_index = GLYPHSET_INDEX_A8; break; @@ -3810,6 +3811,7 @@ _cairo_xlib_scaled_font_get_glyphset_info_for_pending_free_glyph ( if (surface != NULL) { switch (surface->format) { default: + case CAIRO_FORMAT_INVALID: case CAIRO_FORMAT_RGB24: case CAIRO_FORMAT_ARGB32: i = GLYPHSET_INDEX_ARGB32; break; case CAIRO_FORMAT_A8: i = GLYPHSET_INDEX_A8; break; @@ -3999,6 +4001,7 @@ _cairo_xlib_surface_add_glyph (Display *dpy, } break; case CAIRO_FORMAT_RGB24: + case CAIRO_FORMAT_INVALID: default: ASSERT_NOT_REACHED; break; diff --git a/src/cairo-xml-surface.c b/src/cairo-xml-surface.c index 53247a02e..407aa969b 100644 --- a/src/cairo-xml-surface.c +++ b/src/cairo-xml-surface.c @@ -71,17 +71,6 @@ slim_hidden_proto (cairo_xml_for_recording_surface); static const cairo_surface_backend_t _cairo_xml_surface_backend; -static const char * -_direction_to_string (cairo_bool_t backward) -{ - static const char *names[] = { - "FORWARD", - "BACKWARD" - }; - assert (backward < ARRAY_LENGTH (names)); - return names[backward]; -} - static const char * _operator_to_string (cairo_operator_t op) { @@ -214,14 +203,15 @@ _content_to_string (cairo_content_t content) static const char * _format_to_string (cairo_format_t format) { - static const char *names[] = { - "ARGB32", /* CAIRO_FORMAT_ARGB32 */ - "RGB24", /* CAIRO_FORMAT_RGB24 */ - "A8", /* CAIRO_FORMAT_A8 */ - "A1" /* CAIRO_FORMAT_A1 */ - }; - assert (format < ARRAY_LENGTH (names)); - return names[format]; + switch (format) { + case CAIRO_FORMAT_ARGB32: return "ARGB32"; + case CAIRO_FORMAT_RGB24: return "RGB24"; + case CAIRO_FORMAT_A8: return "A8"; + case CAIRO_FORMAT_A1: return "A1"; + case CAIRO_FORMAT_INVALID: return "INVALID"; + } + ASSERT_NOT_REACHED; + return "INVALID"; } static void diff --git a/src/cairo.h b/src/cairo.h index 453874dfb..7e9846155 100644 --- a/src/cairo.h +++ b/src/cairo.h @@ -2231,6 +2231,7 @@ cairo_surface_has_show_text_glyphs (cairo_surface_t *surface); /** * cairo_format_t: + * @CAIRO_FORMAT_INVALID: no such format exists or is supported. * @CAIRO_FORMAT_ARGB32: each pixel is a 32-bit quantity, with * alpha in the upper 8 bits, then red, then green, then blue. * The 32-bit quantities are stored native-endian. Pre-multiplied @@ -2257,10 +2258,11 @@ cairo_surface_has_show_text_glyphs (cairo_surface_t *surface); * New entries may be added in future versions. **/ typedef enum _cairo_format { - CAIRO_FORMAT_ARGB32, - CAIRO_FORMAT_RGB24, - CAIRO_FORMAT_A8, - CAIRO_FORMAT_A1 + CAIRO_FORMAT_INVALID = -1, + CAIRO_FORMAT_ARGB32 = 0, + CAIRO_FORMAT_RGB24 = 1, + CAIRO_FORMAT_A8 = 2, + CAIRO_FORMAT_A1 = 3 /* The value of 4 is reserved by a deprecated enum value. * The next format added must have an explicit value of 5. CAIRO_FORMAT_RGB16_565 = 4, diff --git a/src/cairoint.h b/src/cairoint.h index c2a486611..741ccf365 100644 --- a/src/cairoint.h +++ b/src/cairoint.h @@ -2148,8 +2148,8 @@ _cairo_surface_has_device_transform (cairo_surface_t *surface) cairo_pure; * to support it (at least cairo_surface_write_to_png() and a few spots * in cairo-xlib-surface.c--again see -Wswitch-enum). */ -#define CAIRO_FORMAT_INVALID ((unsigned int) -1) -#define CAIRO_FORMAT_VALID(format) ((format) <= CAIRO_FORMAT_A1) +#define CAIRO_FORMAT_VALID(format) ((format) >= CAIRO_FORMAT_ARGB32 && \ + (format) <= CAIRO_FORMAT_A1) /* pixman-required stride alignment in bytes. */ #define CAIRO_STRIDE_ALIGNMENT (sizeof (uint32_t)) diff --git a/src/drm/cairo-drm-gallium-surface.c b/src/drm/cairo-drm-gallium-surface.c index 73d75478b..faea87bcb 100644 --- a/src/drm/cairo-drm-gallium-surface.c +++ b/src/drm/cairo-drm-gallium-surface.c @@ -522,6 +522,7 @@ gallium_surface_create_for_name (cairo_drm_device_t *base_dev, switch (format) { default: + case CAIRO_FORMAT_INVALID: case CAIRO_FORMAT_A1: return _cairo_surface_create_in_error (_cairo_error (CAIRO_STATUS_INVALID_FORMAT)); case CAIRO_FORMAT_A8: diff --git a/src/drm/cairo-drm-i915-surface.c b/src/drm/cairo-drm-i915-surface.c index 851c3731b..dabc02e9a 100644 --- a/src/drm/cairo-drm-i915-surface.c +++ b/src/drm/cairo-drm-i915-surface.c @@ -1594,6 +1594,7 @@ i915_buffer_cache_init (intel_buffer_cache_t *cache, cache->buffer.height = height; switch (format) { + case CAIRO_FORMAT_INVALID: case CAIRO_FORMAT_A1: case CAIRO_FORMAT_RGB24: ASSERT_NOT_REACHED; diff --git a/src/drm/cairo-drm-intel-surface.c b/src/drm/cairo-drm-intel-surface.c index 5b7c60bec..965772d0d 100644 --- a/src/drm/cairo-drm-intel-surface.c +++ b/src/drm/cairo-drm-intel-surface.c @@ -349,7 +349,7 @@ intel_surface_create_for_name (cairo_drm_device_t *device, cairo_status_t status; switch (format) { - default: + case CAIRO_FORMAT_INVALID: case CAIRO_FORMAT_A1: return _cairo_surface_create_in_error (_cairo_error (CAIRO_STATUS_INVALID_FORMAT)); case CAIRO_FORMAT_ARGB32: diff --git a/src/drm/cairo-drm-intel.c b/src/drm/cairo-drm-intel.c index 748aceefc..dd5883a07 100644 --- a/src/drm/cairo-drm-intel.c +++ b/src/drm/cairo-drm-intel.c @@ -708,7 +708,6 @@ intel_bo_put_image (intel_device_t *dev, offset = dst_y * stride; data = src->data + src_y * src->stride; switch (src->format) { - default: case CAIRO_FORMAT_ARGB32: case CAIRO_FORMAT_RGB24: offset += 4 * dst_x; @@ -726,6 +725,8 @@ intel_bo_put_image (intel_device_t *dev, src_x, src_y, width, height, dst_x, dst_y); + default: + return _cairo_error (CAIRO_STATUS_INVALID_FORMAT); } if (bo->tiling == I915_TILING_NONE) { @@ -1016,8 +1017,6 @@ intel_glyph_cache_add_glyph (intel_device_t *device, } break; - default: - ASSERT_NOT_REACHED; case CAIRO_FORMAT_RGB24: case CAIRO_FORMAT_ARGB32: dst += 4*node->x; @@ -1028,6 +1027,9 @@ intel_glyph_cache_add_glyph (intel_device_t *device, src += glyph_surface->stride; } break; + default: + ASSERT_NOT_REACHED; + return _cairo_error (CAIRO_STATUS_INVALID_FORMAT); } /* leave mapped! */ @@ -1113,6 +1115,7 @@ intel_get_glyph_cache (intel_device_t *device, break; default: ASSERT_NOT_REACHED; + return _cairo_error (CAIRO_STATUS_INVALID_FORMAT); } if (unlikely (cache->buffer.bo == NULL)) { @@ -1227,7 +1230,9 @@ intel_buffer_cache_init (intel_buffer_cache_t *cache, switch (format) { case CAIRO_FORMAT_A1: case CAIRO_FORMAT_RGB24: + case CAIRO_FORMAT_INVALID: ASSERT_NOT_REACHED; + return _cairo_error (CAIRO_STATUS_INVALID_FORMAT); case CAIRO_FORMAT_ARGB32: cache->buffer.map0 = MAPSURF_32BIT | MT_32BIT_ARGB8888; cache->buffer.stride = width * 4; diff --git a/src/drm/cairo-drm-radeon-surface.c b/src/drm/cairo-drm-radeon-surface.c index 7521199ab..e43a9754e 100644 --- a/src/drm/cairo-drm-radeon-surface.c +++ b/src/drm/cairo-drm-radeon-surface.c @@ -367,7 +367,7 @@ radeon_surface_create_for_name (cairo_drm_device_t *device, cairo_content_t content; switch (format) { - default: + case CAIRO_FORMAT_INVALID: case CAIRO_FORMAT_A1: return _cairo_surface_create_in_error (_cairo_error (CAIRO_STATUS_INVALID_FORMAT)); case CAIRO_FORMAT_ARGB32: diff --git a/test/any2ppm.c b/test/any2ppm.c index 4d215e082..a7bb49a67 100644 --- a/test/any2ppm.c +++ b/test/any2ppm.c @@ -191,6 +191,7 @@ write_ppm (cairo_surface_t *surface, int fd) format_str = "P5"; break; case CAIRO_FORMAT_A1: + case CAIRO_FORMAT_INVALID: default: return "unhandled image format"; } diff --git a/test/png.c b/test/png.c index fb50a9b55..9f082c9dc 100644 --- a/test/png.c +++ b/test/png.c @@ -57,6 +57,7 @@ format_to_string (cairo_format_t format) case CAIRO_FORMAT_A8: return "a8"; case CAIRO_FORMAT_RGB24: return "rgb24"; case CAIRO_FORMAT_ARGB32: return "argb32"; + case CAIRO_FORMAT_INVALID: default: return "???"; } } diff --git a/util/cairo-script/cairo-script-operators.c b/util/cairo-script/cairo-script-operators.c index 2456c3acd..1f8ae90a0 100644 --- a/util/cairo-script/cairo-script-operators.c +++ b/util/cairo-script/cairo-script-operators.c @@ -2844,6 +2844,7 @@ _image_read_raw (csi_file_t *src, len = 3 * width * height; break; default: + case CAIRO_FORMAT_INVALID: case CAIRO_FORMAT_ARGB32: len = 4 * width * height; break; @@ -2894,6 +2895,7 @@ _image_read_raw (csi_file_t *src, #endif } break; + case CAIRO_FORMAT_INVALID: case CAIRO_FORMAT_ARGB32: /* stride == width */ break; @@ -2968,6 +2970,7 @@ _image_read_raw (csi_file_t *src, #endif } break; + case CAIRO_FORMAT_INVALID: case CAIRO_FORMAT_ARGB32: /* stride == width */ break; @@ -2994,6 +2997,7 @@ _image_read_raw (csi_file_t *src, break; case CAIRO_FORMAT_RGB24: + case CAIRO_FORMAT_INVALID: default: break; } @@ -6140,6 +6144,7 @@ _integer_constants[] = { { "A8", CAIRO_FORMAT_A8 }, { "RGB24", CAIRO_FORMAT_RGB24 }, { "ARGB32", CAIRO_FORMAT_ARGB32 }, + { "INVALID", CAIRO_FORMAT_INVALID }, { NULL, 0 } }; diff --git a/util/cairo-sphinx/sphinx.c b/util/cairo-sphinx/sphinx.c index 6d2cda700..20d9f01b4 100644 --- a/util/cairo-sphinx/sphinx.c +++ b/util/cairo-sphinx/sphinx.c @@ -618,6 +618,9 @@ compare_images (cairo_surface_t *a, bb += stride; } break; + + case CAIRO_FORMAT_INVALID: + break; } return TRUE; @@ -831,7 +834,7 @@ request_image (struct client *c, unsigned long offset = -1; int len; - assert (format != (cairo_format_t) -1); + assert (format != CAIRO_FORMAT_INVALID); len = sprintf (buf, ".image %lu %d %d %d %d\n", closure->id, format, width, height, stride); @@ -900,14 +903,14 @@ send_surface (struct client *c, { cairo_surface_t *source = closure->surface; cairo_surface_t *image; - cairo_format_t format = (cairo_format_t) -1; + cairo_format_t format = CAIRO_FORMAT_INVALID; cairo_t *cr; int width, height, stride; void *data; unsigned long serial; get_surface_size (source, &width, &height, &format); - if (format == (cairo_format_t) -1) + if (format == CAIRO_FORMAT_INVALID) format = format_for_content (cairo_surface_get_content (source)); stride = cairo_format_stride_for_width (format, width); diff --git a/util/cairo-trace/trace.c b/util/cairo-trace/trace.c index 46ec7f29e..9bc06e0c9 100644 --- a/util/cairo-trace/trace.c +++ b/util/cairo-trace/trace.c @@ -1439,6 +1439,7 @@ _format_to_string (cairo_format_t format) { #define f(name) case CAIRO_FORMAT_ ## name: return #name switch (format) { + f(INVALID); f(ARGB32); f(RGB24); f(A8); @@ -1570,6 +1571,7 @@ _emit_image (cairo_surface_t *image, case CAIRO_FORMAT_A8: len = width; break; case CAIRO_FORMAT_RGB24: len = 3*width; break; default: + case CAIRO_FORMAT_INVALID: case CAIRO_FORMAT_ARGB32: len = 4*width; break; } @@ -1607,6 +1609,7 @@ _emit_image (cairo_surface_t *image, data += stride; } break; + case CAIRO_FORMAT_INVALID: default: break; } @@ -1659,6 +1662,7 @@ _emit_image (cairo_surface_t *image, data += stride; } break; + case CAIRO_FORMAT_INVALID: default: break; }