Fix the bug caused by gradient picture set the stops at the same percentage.

Fix the bug caused by gradient picture set the stops at
 the same percentage. The (stops[i] - stops[i-1]) will
 be used as divisor in the shader, which will cause
 problem. We just keep the later one if stops[i] ==
 stops[i-1].

Signed-off-by: Junyan He <junyan.he@linux.intel.com>
Signed-off-by: Zhigang Gong <zhigang.gong@linux.intel.com>
This commit is contained in:
Junyan He 2012-04-18 08:04:26 +08:00 committed by Eric Anholt
parent 3d96929596
commit 686a322c76

View File

@ -2074,26 +2074,35 @@ _glamor_gradient_set_pixmap_destination(ScreenPtr screen,
static int static int
_glamor_gradient_set_stops(PicturePtr src_picture, PictGradient * pgradient, _glamor_gradient_set_stops(PicturePtr src_picture, PictGradient * pgradient,
GLfloat *stop_colors, GLfloat *n_stops) GLfloat *stop_colors, GLfloat *n_stops)
{ {
int i; int i;
int count; int count = 1;
for (i = 1; i < pgradient->nstops + 1; i++) { for (i = 0; i < pgradient->nstops; i++) {
stop_colors[i*4] = pixman_fixed_to_double( /* We find some gradient picture set the stops at the same percentage, which
pgradient->stops[i-1].color.red); will cause the shader problem because the (stops[i] - stops[i-1]) will
stop_colors[i*4+1] = pixman_fixed_to_double( be used as divisor. We just keep the later one if stops[i] == stops[i-1] */
pgradient->stops[i-1].color.green); if (i < pgradient->nstops - 1
stop_colors[i*4+2] = pixman_fixed_to_double( && pgradient->stops[i].x == pgradient->stops[i+1].x)
pgradient->stops[i-1].color.blue); continue;
stop_colors[i*4+3] = pixman_fixed_to_double(
pgradient->stops[i-1].color.alpha);
n_stops[i] = (GLfloat)pixman_fixed_to_double( stop_colors[count*4] = pixman_fixed_to_double(
pgradient->stops[i-1].x); pgradient->stops[i].color.red);
stop_colors[count*4+1] = pixman_fixed_to_double(
pgradient->stops[i].color.green);
stop_colors[count*4+2] = pixman_fixed_to_double(
pgradient->stops[i].color.blue);
stop_colors[count*4+3] = pixman_fixed_to_double(
pgradient->stops[i].color.alpha);
n_stops[count] = (GLfloat)pixman_fixed_to_double(
pgradient->stops[i].x);
count++;
} }
count = pgradient->nstops + 2; /* for the end stop. */
count++;
switch (src_picture->repeatType) { switch (src_picture->repeatType) {
#define REPEAT_FILL_STOPS(m, n) \ #define REPEAT_FILL_STOPS(m, n) \