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.
This commit is contained in:
Andrea Canciani 2010-04-19 09:53:00 +02:00
parent 7461947eb1
commit baaf312e04
10 changed files with 47 additions and 55 deletions

View file

@ -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;
}

View file

@ -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,

View file

@ -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,

View file

@ -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);
}

View file

@ -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);

View file

@ -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);

View file

@ -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 {

View file

@ -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))

View file

@ -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))

View file

@ -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,