swrast: When reading from a 0-bits r,g,b channel, return 0 not 1.
authorEric Anholt <eric@anholt.net>
Thu, 10 Jun 2010 07:15:48 +0000 (00:15 -0700)
committerEric Anholt <eric@anholt.net>
Thu, 10 Jun 2010 07:22:00 +0000 (00:22 -0700)
It looks like we were reading a fractional value, multiplying by an
enormous negative value, then stuffing that value into a bitfield
assuming it was already clamped.  This becomes relevant for GL_ALPHA
or R/RG FBOs.

src/mesa/swrast/s_readpix.c

index 368311e14dd89f90fe26f4f0ffa91b4e9e86136d..6ad9aceec77b6412e3f87f3503f2523600df7f03 100644 (file)
@@ -265,10 +265,18 @@ adjust_colors(const struct gl_framebuffer *fb, GLuint n, GLfloat rgba[][4])
    const GLuint rShift = 8 - fb->Visual.redBits;
    const GLuint gShift = 8 - fb->Visual.greenBits;
    const GLuint bShift = 8 - fb->Visual.blueBits;
-   const GLfloat rScale = 1.0F / (GLfloat) ((1 << fb->Visual.redBits  ) - 1);
-   const GLfloat gScale = 1.0F / (GLfloat) ((1 << fb->Visual.greenBits) - 1);
-   const GLfloat bScale = 1.0F / (GLfloat) ((1 << fb->Visual.blueBits ) - 1);
+   GLfloat rScale = 1.0F / (GLfloat) ((1 << fb->Visual.redBits  ) - 1);
+   GLfloat gScale = 1.0F / (GLfloat) ((1 << fb->Visual.greenBits) - 1);
+   GLfloat bScale = 1.0F / (GLfloat) ((1 << fb->Visual.blueBits ) - 1);
    GLuint i;
+
+   if (fb->Visual.redBits == 0)
+      rScale = 0;
+   if (fb->Visual.greenBits == 0)
+      gScale = 0;
+   if (fb->Visual.blueBits == 0)
+      bScale = 0;
+
    for (i = 0; i < n; i++) {
       GLint r, g, b;
       /* convert float back to ubyte */