diff options
author | Andrea Canciani <ranma42@gmail.com> | 2010-06-08 17:04:00 +0200 |
---|---|---|
committer | Andrea Canciani <ranma42@gmail.com> | 2010-06-10 16:07:42 +0200 |
commit | a0f8cfe64660c0043db15f9b9cbf1298bf1838d1 (patch) | |
tree | ecf70f5168f7a9935950d0b113b2b14b74a61ec6 /src | |
parent | bccd89b4177b5f5bd05def9bee5f0927a9f25e4a (diff) |
pattern: improve degenerate gradients handling
Degenerate radial gradients are now considered clear.
Diffstat (limited to 'src')
-rw-r--r-- | src/cairo-pattern.c | 35 |
1 files changed, 25 insertions, 10 deletions
diff --git a/src/cairo-pattern.c b/src/cairo-pattern.c index 319101f6..70412583 100644 --- a/src/cairo-pattern.c +++ b/src/cairo-pattern.c @@ -1764,12 +1764,14 @@ _gradient_is_clear (const cairo_gradient_pattern_t *gradient, { unsigned int i; - /* Check if the extents intersect the drawn part of the pattern. - * TODO: radial gradients, other linear extend modes. - */ + assert (gradient->base.type == CAIRO_PATTERN_TYPE_LINEAR || + gradient->base.type == CAIRO_PATTERN_TYPE_RADIAL); + + /* Check if the extents intersect the drawn part of the pattern. */ if (gradient->base.type == CAIRO_PATTERN_TYPE_LINEAR) { if (gradient->base.extend == CAIRO_EXTEND_NONE) { cairo_linear_pattern_t *linear = (cairo_linear_pattern_t *) gradient; + /* EXTEND_NONE degenerate linear gradients are clear */ if (linear->p1.x == linear->p2.x && linear->p1.y == linear->p2.y) return TRUE; @@ -1780,6 +1782,13 @@ _gradient_is_clear (const cairo_gradient_pattern_t *gradient, return TRUE; } } + } else { + cairo_radial_pattern_t *radial = (cairo_radial_pattern_t *) gradient; + /* degenerate radial gradients are clear */ + if (((radial->c1.x == radial->c2.x && radial->c1.y == radial->c2.y) || + radial->r1 == 0) && radial->r1 == radial->r2) + return TRUE; + /* TODO: check actual intersection */ } for (i = 0; i < gradient->n_stops; i++) @@ -1808,7 +1817,10 @@ _cairo_gradient_pattern_is_solid (const cairo_gradient_pattern_t *gradient, { unsigned int i; - /* TODO: radial, degenerate linear */ + assert (gradient->base.type == CAIRO_PATTERN_TYPE_LINEAR || + gradient->base.type == CAIRO_PATTERN_TYPE_RADIAL); + + /* TODO: radial, degenerate linear */ if (gradient->base.type == CAIRO_PATTERN_TYPE_LINEAR) { if (gradient->base.extend == CAIRO_EXTEND_NONE) { cairo_linear_pattern_t *linear = (cairo_linear_pattern_t *) gradient; @@ -1913,17 +1925,20 @@ _gradient_is_opaque (const cairo_gradient_pattern_t *gradient, { unsigned int i; + assert (gradient->base.type == CAIRO_PATTERN_TYPE_LINEAR || + gradient->base.type == CAIRO_PATTERN_TYPE_RADIAL); + if (gradient->n_stops == 0) return FALSE; - /* TODO: radial gradients, degenerate linear gradients */ if (gradient->base.type == CAIRO_PATTERN_TYPE_LINEAR) { - cairo_linear_pattern_t *linear = (cairo_linear_pattern_t *) gradient; - if (linear->p1.x == linear->p2.x && linear->p1.y == linear->p2.y) - return FALSE; - if (gradient->base.extend == CAIRO_EXTEND_NONE) { double t[2]; + cairo_linear_pattern_t *linear = (cairo_linear_pattern_t *) gradient; + + /* EXTEND_NONE degenerate radial gradients are clear */ + if (linear->p1.x == linear->p2.x && linear->p1.y == linear->p2.y) + return FALSE; if (extents == NULL) return FALSE; @@ -1933,7 +1948,7 @@ _gradient_is_opaque (const cairo_gradient_pattern_t *gradient, return FALSE; } } else - return FALSE; + return FALSE; /* TODO: check actual intersection */ for (i = 0; i < gradient->n_stops; i++) if (! CAIRO_COLOR_IS_OPAQUE (&gradient->stops[i].color)) |