gradient-walker: For NONE repeats, when x < 0 or x > 1, set both colors to 0
authorSøren Sandmann Pedersen <ssp@redhat.com>
Sun, 18 Dec 2011 12:29:59 +0000 (07:29 -0500)
committerSøren Sandmann Pedersen <ssp@redhat.com>
Tue, 3 Jan 2012 16:37:12 +0000 (11:37 -0500)
ec7c9c2b6865b48b8bd14e4 introduced a bug where NONE gradients would be
misrendered, causing the area outside the gradient to be treated as a
(very) long fade to transparent.The problem was that a check for
positions outside the gradients were dropped in favor of relying on
the sentinels.

Aside from misrendering, this also caused a signed integer overflow
when the code would compute a stepper size based on MIN_INT32.

This patches fixes the issue by reinstating a check for these cases
and setting both the right and left colors to transparent black.

pixman/pixman-gradient-walker.c

index 048039e..e7e724f 100644 (file)
@@ -108,6 +108,13 @@ gradient_walker_reset (pixman_gradient_walker_t *walker,
        left_x  += (pos - x);
        right_x += (pos - x);
     }
+    else if (walker->repeat == PIXMAN_REPEAT_NONE)
+    {
+       if (n == 0)
+           right_c = left_c;
+       else if (n == count)
+           left_c = right_c;
+    }
 
     walker->left_x   = left_x;
     walker->right_x  = right_x;