diff options
author | Chris Wilson <chris@chris-wilson.co.uk> | 2010-06-11 21:26:26 +0100 |
---|---|---|
committer | Chris Wilson <chris@chris-wilson.co.uk> | 2010-06-11 21:26:26 +0100 |
commit | a049889c64131b170b66ed8906309f6adee80fa5 (patch) | |
tree | 795d373757be6a7f9011866a192afbf4aff4e57e /src | |
parent | 00bc1d1578dc2640db64315270b00073697fb9fa (diff) |
pattern: Remove incorrect optimisations from _cairo_pattern_aquire_surface()
Safe reduction of patterns is performed in gstate, so not only are the
extra checks in _cairo_pattern_acquire_surface redundant there are also
unsafe. Simply remove them.
Fixes test/radial-gradient-extend [xlib-fallback]
Diffstat (limited to 'src')
-rw-r--r-- | src/cairo-pattern.c | 110 |
1 files changed, 17 insertions, 93 deletions
diff --git a/src/cairo-pattern.c b/src/cairo-pattern.c index c94e0760..56e3b04f 100644 --- a/src/cairo-pattern.c +++ b/src/cairo-pattern.c @@ -2341,21 +2341,6 @@ _cairo_pattern_acquire_surface_for_surface (const cairo_surface_pattern_t *pat return status; } -static void -_init_solid_for_color_stop (cairo_solid_pattern_t *solid, - const cairo_color_stop_t *color) -{ - cairo_color_t premult; - - /* Color stops aren't premultiplied, so fix that here */ - _cairo_color_init_rgba (&premult, - color->red, - color->green, - color->blue, - color->alpha); - _cairo_pattern_init_solid (solid, &premult); -} - /** * _cairo_pattern_acquire_surface: * @pattern: a #cairo_pattern_t @@ -2387,97 +2372,36 @@ _cairo_pattern_acquire_surface (const cairo_pattern_t *pattern, cairo_surface_t **surface_out, cairo_surface_attributes_t *attributes) { - cairo_status_t status; - if (unlikely (pattern->status)) { *surface_out = NULL; return pattern->status; } switch (pattern->type) { - case CAIRO_PATTERN_TYPE_SOLID: { - cairo_solid_pattern_t *src = (cairo_solid_pattern_t *) pattern; + case CAIRO_PATTERN_TYPE_SOLID: + return _cairo_pattern_acquire_surface_for_solid ((cairo_solid_pattern_t *) pattern, + dst, x, y, width, height, + surface_out, + attributes); - status = _cairo_pattern_acquire_surface_for_solid (src, dst, - x, y, width, height, - surface_out, - attributes); - } break; case CAIRO_PATTERN_TYPE_LINEAR: - case CAIRO_PATTERN_TYPE_RADIAL: { - cairo_gradient_pattern_t *src = (cairo_gradient_pattern_t *) pattern; - - /* XXX The gradient->solid conversion code should now be redundant. */ - - /* fast path for gradients with less than 2 color stops */ - if (src->n_stops < 2) - { - cairo_solid_pattern_t solid; - - if (src->n_stops) { - _init_solid_for_color_stop (&solid, &src->stops->color); - } else { - _cairo_pattern_init_solid (&solid, - CAIRO_COLOR_TRANSPARENT); - } - - status = _cairo_pattern_acquire_surface_for_solid (&solid, dst, - x, y, - width, height, - surface_out, - attributes); - } - else - { - unsigned int i; - - /* Is the gradient a uniform colour? - * Happens more often than you would believe. - */ - for (i = 1; i < src->n_stops; i++) { - if (! _cairo_color_stop_equal (&src->stops[0].color, - &src->stops[i].color)) - { - break; - } - } - if (i == src->n_stops) { - cairo_solid_pattern_t solid; + case CAIRO_PATTERN_TYPE_RADIAL: + return _cairo_pattern_acquire_surface_for_gradient ((cairo_gradient_pattern_t *) pattern, + dst, x, y, width, height, + surface_out, + attributes); - _init_solid_for_color_stop (&solid, &src->stops->color); + case CAIRO_PATTERN_TYPE_SURFACE: + return _cairo_pattern_acquire_surface_for_surface ((cairo_surface_pattern_t *) pattern, + dst, x, y, width, height, + flags, + surface_out, + attributes); - status = - _cairo_pattern_acquire_surface_for_solid (&solid, dst, - x, y, - width, height, - surface_out, - attributes); - } else { - status = - _cairo_pattern_acquire_surface_for_gradient (src, dst, - x, y, - width, height, - surface_out, - attributes); - } - } - } break; - case CAIRO_PATTERN_TYPE_SURFACE: { - cairo_surface_pattern_t *src = (cairo_surface_pattern_t *) pattern; - - status = _cairo_pattern_acquire_surface_for_surface (src, dst, - x, y, - width, height, - flags, - surface_out, - attributes); - } break; default: ASSERT_NOT_REACHED; - status = _cairo_error (CAIRO_STATUS_PATTERN_TYPE_MISMATCH); + return _cairo_error (CAIRO_STATUS_PATTERN_TYPE_MISMATCH); } - - return status; } /** |