summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorAndrea Canciani <ranma42@gmail.com>2010-06-08 17:04:00 +0200
committerAndrea Canciani <ranma42@gmail.com>2010-06-10 16:07:42 +0200
commita0f8cfe64660c0043db15f9b9cbf1298bf1838d1 (patch)
treeecf70f5168f7a9935950d0b113b2b14b74a61ec6 /src
parentbccd89b4177b5f5bd05def9bee5f0927a9f25e4a (diff)
pattern: improve degenerate gradients handling
Degenerate radial gradients are now considered clear.
Diffstat (limited to 'src')
-rw-r--r--src/cairo-pattern.c35
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))