summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJunyan He <junyan.he@linux.intel.com>2012-04-18 08:04:26 +0800
committerZhigang Gong <zhigang.gong@linux.intel.com>2012-04-27 15:53:37 +0800
commit4136ba52aa5437f3f40653ff8ec127a37705024f (patch)
treead9061871f87044849e6920d7740736b70a755f7
parenta6d2e02afa15b014622fb169d66b66d66daf3d4a (diff)
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>
-rw-r--r--src/glamor_render.c45
1 files changed, 27 insertions, 18 deletions
diff --git a/src/glamor_render.c b/src/glamor_render.c
index 21186a8..a01f9ee 100644
--- a/src/glamor_render.c
+++ b/src/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;
-
- 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);
-
- n_stops[i] = (GLfloat)pixman_fixed_to_double(
- pgradient->stops[i-1].x);
- }
-
- count = pgradient->nstops + 2;
+ int count = 1;
+
+ 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;
+
+ 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++;
+ }
+
+ /* for the end stop. */
+ count++;
switch (src_picture->repeatType) {
#define REPEAT_FILL_STOPS(m, n) \