From baaf312e047a9bea6f54e63cd6534c2ed7448523 Mon Sep 17 00:00:00 2001 From: Andrea Canciani Date: Mon, 19 Apr 2010 09:53:00 +0200 Subject: [PATCH] pattern: remove content field from solid patterns The content field in solid patterns had ill-defined semantic (or no semantic at all), thus it can be removed. --- src/cairo-color.c | 16 ++++++++++++++++ src/cairo-gl-surface.c | 2 +- src/cairo-gstate.c | 14 +++++--------- src/cairo-pattern.c | 37 ++++++++++--------------------------- src/cairo-script-surface.c | 9 +++------ src/cairo-surface.c | 4 ++-- src/cairo-types-private.h | 1 - src/cairo-xlib-surface.c | 6 +++--- src/cairo.c | 4 ++-- src/cairoint.h | 9 +++++---- 10 files changed, 47 insertions(+), 55 deletions(-) diff --git a/src/cairo-color.c b/src/cairo-color.c index 9483c8b9a..6bc170533 100644 --- a/src/cairo-color.c +++ b/src/cairo-color.c @@ -210,3 +210,19 @@ _cairo_color_stop_equal (const cairo_color_stop_t *color_a, return TRUE; } + +cairo_content_t +_cairo_color_get_content (const cairo_color_t *color) +{ + if (CAIRO_COLOR_IS_OPAQUE (color)) + return CAIRO_CONTENT_COLOR; + + if (color->red_short == 0 && + color->green_short == 0 && + color->blue_short == 0) + { + return CAIRO_CONTENT_ALPHA; + } + + return CAIRO_CONTENT_COLOR_ALPHA; +} diff --git a/src/cairo-gl-surface.c b/src/cairo-gl-surface.c index b896e0b7d..e79f46c9f 100644 --- a/src/cairo-gl-surface.c +++ b/src/cairo-gl-surface.c @@ -1022,7 +1022,7 @@ _cairo_gl_surface_fill_rectangles (void *abstract_dst, if (unlikely (status)) goto CLEANUP; - _cairo_pattern_init_solid (&solid, color, CAIRO_CONTENT_COLOR_ALPHA); + _cairo_pattern_init_solid (&solid, color); status = _cairo_gl_composite_set_source (&setup, &solid.base, 0, 0, 0, 0, diff --git a/src/cairo-gstate.c b/src/cairo-gstate.c index f7a32aec3..4738449b1 100644 --- a/src/cairo-gstate.c +++ b/src/cairo-gstate.c @@ -415,8 +415,7 @@ _cairo_gstate_get_source (cairo_gstate_t *gstate) { if (gstate->source == &_cairo_pattern_black.base) { /* do not expose the static object to the user */ - gstate->source = _cairo_pattern_create_solid (CAIRO_COLOR_BLACK, - CAIRO_CONTENT_COLOR); + gstate->source = _cairo_pattern_create_solid (CAIRO_COLOR_BLACK); } return gstate->source; @@ -861,7 +860,7 @@ _init_solid_for_color_stop (cairo_solid_pattern_t *solid, color->green, color->blue, color->alpha); - _cairo_pattern_init_solid (solid, &premult, CAIRO_CONTENT_COLOR_ALPHA); + _cairo_pattern_init_solid (solid, &premult); } static void @@ -884,8 +883,7 @@ _cairo_gstate_copy_pattern (cairo_pattern_t *pattern, if (_cairo_surface_get_extents (surface->surface, &extents) && (extents.width == 0 || extents.height == 0)) { _cairo_pattern_init_solid ((cairo_solid_pattern_t *) pattern, - CAIRO_COLOR_TRANSPARENT, - surface->surface->content); + CAIRO_COLOR_TRANSPARENT); return; } @@ -904,8 +902,7 @@ _cairo_gstate_copy_pattern (cairo_pattern_t *pattern, &src->stops->color); } else { _cairo_pattern_init_solid ((cairo_solid_pattern_t *) pattern, - CAIRO_COLOR_TRANSPARENT, - CAIRO_CONTENT_ALPHA); + CAIRO_COLOR_TRANSPARENT); } return; @@ -1147,8 +1144,7 @@ _cairo_gstate_mask (cairo_gstate_t *gstate, _cairo_color_multiply_alpha (&combined, mask_pattern.solid.color.alpha); } - _cairo_pattern_init_solid (&source_pattern.solid, &combined, - solid->content | mask_pattern.solid.content); + _cairo_pattern_init_solid (&source_pattern.solid, &combined); status = _cairo_surface_paint (gstate->target, op, &source_pattern.base, diff --git a/src/cairo-pattern.c b/src/cairo-pattern.c index e9743e222..27a7a8017 100644 --- a/src/cairo-pattern.c +++ b/src/cairo-pattern.c @@ -65,7 +65,6 @@ const cairo_solid_pattern_t _cairo_pattern_black = { CAIRO_FILTER_DEFAULT, /* filter */ CAIRO_EXTEND_GRADIENT_DEFAULT}, /* extend */ { 0., 0., 0., 1., 0, 0, 0, 0xffff },/* color (double rgba, short rgba) */ - CAIRO_CONTENT_COLOR, /* content */ }; const cairo_solid_pattern_t _cairo_pattern_clear = { @@ -77,7 +76,6 @@ const cairo_solid_pattern_t _cairo_pattern_clear = { CAIRO_FILTER_DEFAULT, /* filter */ CAIRO_EXTEND_GRADIENT_DEFAULT}, /* extend */ { 0., 0., 0., 0., 0, 0, 0, 0 },/* color (double rgba, short rgba) */ - CAIRO_CONTENT_ALPHA, /* content */ }; const cairo_solid_pattern_t _cairo_pattern_white = { @@ -89,7 +87,6 @@ const cairo_solid_pattern_t _cairo_pattern_white = { CAIRO_FILTER_DEFAULT, /* filter */ CAIRO_EXTEND_GRADIENT_DEFAULT}, /* extend */ { 1., 1., 1., 1., 0xffff, 0xffff, 0xffff, 0xffff },/* color (double rgba, short rgba) */ - CAIRO_CONTENT_COLOR_ALPHA, /* content */ }; /** @@ -420,15 +417,10 @@ _cairo_pattern_create_copy (cairo_pattern_t **pattern_out, void _cairo_pattern_init_solid (cairo_solid_pattern_t *pattern, - const cairo_color_t *color, - cairo_content_t content) + const cairo_color_t *color) { - if (content == CAIRO_CONTENT_COLOR_ALPHA && CAIRO_COLOR_IS_OPAQUE (color)) - content = CAIRO_CONTENT_COLOR; - _cairo_pattern_init (&pattern->base, CAIRO_PATTERN_TYPE_SOLID); pattern->color = *color; - pattern->content = content; } void @@ -486,8 +478,7 @@ _cairo_pattern_init_radial (cairo_radial_pattern_t *pattern, } cairo_pattern_t * -_cairo_pattern_create_solid (const cairo_color_t *color, - cairo_content_t content) +_cairo_pattern_create_solid (const cairo_color_t *color) { cairo_solid_pattern_t *pattern; @@ -502,7 +493,7 @@ _cairo_pattern_create_solid (const cairo_color_t *color, } } - _cairo_pattern_init_solid (pattern, color, content); + _cairo_pattern_init_solid (pattern, color); CAIRO_REFERENCE_COUNT_INIT (&pattern->base.ref_count, 1); return &pattern->base; @@ -518,7 +509,7 @@ _cairo_pattern_create_in_error (cairo_status_t status) CAIRO_MUTEX_INITIALIZE (); - pattern = _cairo_pattern_create_solid (CAIRO_COLOR_BLACK, CAIRO_CONTENT_COLOR); + pattern = _cairo_pattern_create_solid (CAIRO_COLOR_BLACK); if (pattern->status == CAIRO_STATUS_SUCCESS) status = _cairo_pattern_set_error (pattern, status); @@ -558,7 +549,7 @@ cairo_pattern_create_rgb (double red, double green, double blue) CAIRO_MUTEX_INITIALIZE (); - return _cairo_pattern_create_solid (&color, CAIRO_CONTENT_COLOR); + return _cairo_pattern_create_solid (&color); } slim_hidden_def (cairo_pattern_create_rgb); @@ -598,7 +589,7 @@ cairo_pattern_create_rgba (double red, double green, double blue, CAIRO_MUTEX_INITIALIZE (); - return _cairo_pattern_create_solid (&color, CAIRO_CONTENT_COLOR_ALPHA); + return _cairo_pattern_create_solid (&color); } slim_hidden_def (cairo_pattern_create_rgba); @@ -1566,7 +1557,6 @@ _cairo_pattern_acquire_surface_for_gradient (const cairo_gradient_pattern_t *pat #define MAX_SURFACE_CACHE_SIZE 16 static struct { struct _cairo_pattern_solid_surface_cache{ - cairo_content_t content; cairo_color_t color; cairo_surface_t *surface; } cache[MAX_SURFACE_CACHE_SIZE]; @@ -1579,7 +1569,7 @@ _cairo_pattern_solid_surface_matches ( const cairo_solid_pattern_t *pattern, cairo_surface_t *dst) { - if (cache->content != pattern->content) + if (cairo_surface_get_content (cache->surface) != _cairo_color_get_content (&pattern->color)) return FALSE; if (CAIRO_REFERENCE_COUNT_GET_VALUE (&cache->surface->ref_count) != 1) @@ -1690,7 +1680,6 @@ _cairo_pattern_acquire_surface_for_solid (const cairo_solid_pattern_t *patt to_destroy = solid_surface_cache.cache[i].surface; solid_surface_cache.cache[i].surface = surface; solid_surface_cache.cache[i].color = pattern->color; - solid_surface_cache.cache[i].content = pattern->content; DONE: *out = cairo_surface_reference (solid_surface_cache.cache[i].surface); @@ -2210,7 +2199,7 @@ _init_solid_for_color_stop (cairo_solid_pattern_t *solid, color->green, color->blue, color->alpha); - _cairo_pattern_init_solid (solid, &premult, CAIRO_CONTENT_COLOR_ALPHA); + _cairo_pattern_init_solid (solid, &premult); } /** @@ -2275,8 +2264,7 @@ _cairo_pattern_acquire_surface (const cairo_pattern_t *pattern, _init_solid_for_color_stop (&solid, &src->stops->color); } else { _cairo_pattern_init_solid (&solid, - CAIRO_COLOR_TRANSPARENT, - CAIRO_CONTENT_ALPHA); + CAIRO_COLOR_TRANSPARENT); } status = _cairo_pattern_acquire_surface_for_solid (&solid, dst, @@ -2393,8 +2381,7 @@ _cairo_pattern_acquire_surfaces (const cairo_pattern_t *src, combined = src_solid->color; _cairo_color_multiply_alpha (&combined, mask_solid->color.alpha); - _cairo_pattern_init_solid (&src_tmp.solid, &combined, - src_solid->content | mask_solid->content); + _cairo_pattern_init_solid (&src_tmp.solid, &combined); src = &src_tmp.base; mask = NULL; @@ -2608,7 +2595,6 @@ _cairo_solid_pattern_hash (unsigned long hash, { const cairo_solid_pattern_t *solid = (cairo_solid_pattern_t *) pattern; - hash = _cairo_hash_bytes (hash, &solid->content, sizeof (solid->content)); hash = _cairo_hash_bytes (hash, &solid->color, sizeof (solid->color)); return hash; @@ -2748,9 +2734,6 @@ _cairo_solid_pattern_equal (const cairo_pattern_t *A, const cairo_solid_pattern_t *a = (cairo_solid_pattern_t *) A; const cairo_solid_pattern_t *b = (cairo_solid_pattern_t *) B; - if (a->content != b->content) - return FALSE; - return _cairo_color_equal (&a->color, &b->color); } diff --git a/src/cairo-script-surface.c b/src/cairo-script-surface.c index b925081b3..d1c281639 100644 --- a/src/cairo-script-surface.c +++ b/src/cairo-script-surface.c @@ -855,11 +855,9 @@ _emit_solid_pattern (cairo_script_surface_t *surface, cairo_solid_pattern_t *solid = (cairo_solid_pattern_t *) pattern; cairo_script_context_t *ctx = to_context (surface); - if (solid->content & CAIRO_CONTENT_ALPHA && - ! CAIRO_COLOR_IS_OPAQUE (&solid->color)) + if (! CAIRO_COLOR_IS_OPAQUE (&solid->color)) { - if (! (solid->content & CAIRO_CONTENT_COLOR) || - ! (surface->base.content & CAIRO_CONTENT_COLOR) || + if (! (surface->base.content & CAIRO_CONTENT_COLOR) || ((solid->color.red_short == 0 || solid->color.red_short == 0xffff) && (solid->color.green_short == 0 || solid->color.green_short == 0xffff) && (solid->color.blue_short == 0 || solid->color.blue_short == 0xffff) )) @@ -3379,8 +3377,7 @@ _cairo_script_implicit_context_init (cairo_script_implicit_context_t *cr) cr->current_antialias = CAIRO_ANTIALIAS_DEFAULT; _cairo_stroke_style_init (&cr->current_style); _cairo_pattern_init_solid (&cr->current_source.solid, - CAIRO_COLOR_BLACK, - CAIRO_CONTENT_COLOR); + CAIRO_COLOR_BLACK); _cairo_path_fixed_init (&cr->current_path); cairo_matrix_init_identity (&cr->current_ctm); cairo_matrix_init_identity (&cr->current_stroke_matrix); diff --git a/src/cairo-surface.c b/src/cairo-surface.c index 624ba35db..9d5f7b820 100644 --- a/src/cairo-surface.c +++ b/src/cairo-surface.c @@ -480,7 +480,7 @@ _cairo_surface_create_similar_solid (cairo_surface_t *other, if (surface == NULL || surface->status) return surface; - _cairo_pattern_init_solid (&pattern, color, content); + _cairo_pattern_init_solid (&pattern, color); status = _cairo_surface_paint (surface, color == CAIRO_COLOR_TRANSPARENT ? CAIRO_OPERATOR_CLEAR : CAIRO_OPERATOR_SOURCE, @@ -507,7 +507,7 @@ _cairo_surface_create_solid_pattern_surface (cairo_surface_t *other, } return _cairo_surface_create_similar_solid (other, - solid_pattern->content, + _cairo_color_get_content (&solid_pattern->color), 1, 1, &solid_pattern->color, FALSE); diff --git a/src/cairo-types-private.h b/src/cairo-types-private.h index fa65677e7..dbfdd7984 100644 --- a/src/cairo-types-private.h +++ b/src/cairo-types-private.h @@ -356,7 +356,6 @@ struct _cairo_pattern { struct _cairo_solid_pattern { cairo_pattern_t base; cairo_color_t color; - cairo_content_t content; }; typedef struct _cairo_surface_pattern { diff --git a/src/cairo-xlib-surface.c b/src/cairo-xlib-surface.c index 070629649..93467ffea 100644 --- a/src/cairo-xlib-surface.c +++ b/src/cairo-xlib-surface.c @@ -1432,8 +1432,8 @@ _cairo_xlib_surface_create_solid_pattern_surface (void *abstrac return NULL; image = (cairo_image_surface_t *) - _cairo_image_surface_create_with_content (solid_pattern->content, - width, height); + _cairo_image_surface_create_with_content (_cairo_color_get_content (&solid_pattern->color), + width, height); status = image->base.status; if (unlikely (status)) goto BAIL; @@ -2427,7 +2427,7 @@ _cairo_xlib_surface_solid_fill_rectangles (cairo_xlib_surface_t *surface, GC gc; int i; - _cairo_pattern_init_solid (&solid, color, CAIRO_CONTENT_COLOR); + _cairo_pattern_init_solid (&solid, color); status = _cairo_xlib_display_acquire (surface->base.device, &display); if (unlikely (status)) diff --git a/src/cairo.c b/src/cairo.c index 7ddfd8442..b2a3a7b36 100644 --- a/src/cairo.c +++ b/src/cairo.c @@ -2144,8 +2144,8 @@ cairo_paint_with_alpha (cairo_t *cr, return; } - _cairo_color_init_rgba (&color, 1., 1., 1., alpha); - _cairo_pattern_init_solid (&pattern, &color, CAIRO_CONTENT_ALPHA); + _cairo_color_init_rgba (&color, 0., 0., 0., alpha); + _cairo_pattern_init_solid (&pattern, &color); status = _cairo_gstate_mask (cr->gstate, &pattern.base); if (unlikely (status)) diff --git a/src/cairoint.h b/src/cairoint.h index 9fbb7723b..22ff16da6 100644 --- a/src/cairoint.h +++ b/src/cairoint.h @@ -1017,6 +1017,9 @@ cairo_private cairo_bool_t _cairo_color_stop_equal (const cairo_color_stop_t *color_a, const cairo_color_stop_t *color_b) cairo_pure; +cairo_content_t +_cairo_color_get_content (const cairo_color_t *color) cairo_pure; + /* cairo-font-face.c */ extern const cairo_private cairo_font_face_t _cairo_font_face_nil; @@ -2180,8 +2183,7 @@ _cairo_pattern_init_snapshot (cairo_pattern_t *pattern, cairo_private void _cairo_pattern_init_solid (cairo_solid_pattern_t *pattern, - const cairo_color_t *color, - cairo_content_t content); + const cairo_color_t *color); cairo_private void _cairo_pattern_init_for_surface (cairo_surface_pattern_t *pattern, @@ -2203,8 +2205,7 @@ cairo_private void _cairo_pattern_fini_snapshot (cairo_pattern_t *pattern); cairo_private cairo_pattern_t * -_cairo_pattern_create_solid (const cairo_color_t *color, - cairo_content_t content); +_cairo_pattern_create_solid (const cairo_color_t *color); cairo_private void _cairo_pattern_transform (cairo_pattern_t *pattern,