From 686a322c76fa20ed45d5bbfc9742024300e83e7d Mon Sep 17 00:00:00 2001 From: Junyan He Date: Wed, 18 Apr 2012 08:04:26 +0800 Subject: [PATCH] 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 Signed-off-by: Zhigang Gong --- glamor/glamor_render.c | 37 +++++++++++++++++++++++-------------- 1 file changed, 23 insertions(+), 14 deletions(-) diff --git a/glamor/glamor_render.c b/glamor/glamor_render.c index 21186a813..a01f9ee17 100644 --- a/glamor/glamor_render.c +++ b/glamor/glamor_render.c @@ -2074,26 +2074,35 @@ _glamor_gradient_set_pixmap_destination(ScreenPtr screen, static int _glamor_gradient_set_stops(PicturePtr src_picture, PictGradient * pgradient, - GLfloat *stop_colors, GLfloat *n_stops) + GLfloat *stop_colors, GLfloat *n_stops) { int i; - int count; + int count = 1; - for (i = 1; i < pgradient->nstops + 1; i++) { - stop_colors[i*4] = pixman_fixed_to_double( - pgradient->stops[i-1].color.red); - stop_colors[i*4+1] = pixman_fixed_to_double( - pgradient->stops[i-1].color.green); - stop_colors[i*4+2] = pixman_fixed_to_double( - pgradient->stops[i-1].color.blue); - stop_colors[i*4+3] = pixman_fixed_to_double( - pgradient->stops[i-1].color.alpha); + for (i = 0; i < pgradient->nstops; i++) { + /* We find some gradient picture set the stops at the same percentage, which + will cause the shader problem because the (stops[i] - stops[i-1]) will + be used as divisor. We just keep the later one if stops[i] == stops[i-1] */ + if (i < pgradient->nstops - 1 + && pgradient->stops[i].x == pgradient->stops[i+1].x) + continue; - n_stops[i] = (GLfloat)pixman_fixed_to_double( - pgradient->stops[i-1].x); + stop_colors[count*4] = pixman_fixed_to_double( + 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) { #define REPEAT_FILL_STOPS(m, n) \