Undo some prev glDraw/CopyPixel changes which fixed a bug in which colors were overwr...
authorBrian <brian.paul@tungstengraphics.com>
Sat, 30 Jun 2007 03:29:30 +0000 (21:29 -0600)
committerBrian <brian.paul@tungstengraphics.com>
Sat, 30 Jun 2007 03:29:30 +0000 (21:29 -0600)
Now just set the span->arrayAttribs mask in glDraw/CopyPixels and be sure
we don't overwrite the values in interpolate_active_attribs().

src/mesa/swrast/s_copypix.c
src/mesa/swrast/s_drawpix.c
src/mesa/swrast/s_span.c
src/mesa/swrast/s_zoom.c

index 2383015000aaf30b1b01797b2d3e9562fae71e30..9cd6ca20a9d494986a5c82a1a89cd65af12e246a 100644 (file)
@@ -156,7 +156,7 @@ copy_conv_rgba_pixels(GLcontext *ctx, GLint srcx, GLint srcy,
       /* write the new image */
       for (row = 0; row < height; row++) {
          const GLfloat *src = convImage + row * width * 4;
-         GLvoid *rgba = (GLvoid *) span.array->attribs[FRAG_ATTRIB_COL0];
+         GLfloat *rgba = (GLfloat *) span.array->attribs[FRAG_ATTRIB_COL0];
 
          /* copy convolved colors into span array */
          _mesa_memcpy(rgba, src, width * 4 * sizeof(GLfloat));
@@ -188,8 +188,6 @@ static void
 copy_rgba_pixels(GLcontext *ctx, GLint srcx, GLint srcy,
                  GLint width, GLint height, GLint destx, GLint desty)
 {
-   SWcontext *swrast = SWRAST_CONTEXT(ctx);
-   const GLbitfield prevActiveAttribs = swrast->_ActiveAttribMask;
    GLfloat *tmpImage, *p;
    GLint sy, dy, stepy, row;
    const GLboolean zoom = ctx->Pixel.ZoomX != 1.0F || ctx->Pixel.ZoomY != 1.0F;
@@ -199,15 +197,12 @@ copy_rgba_pixels(GLcontext *ctx, GLint srcx, GLint srcy,
 
    if (!ctx->ReadBuffer->_ColorReadBuffer) {
       /* no readbuffer - OK */
-      goto end;
+      return;
    }
 
-   /* don't interpolate COL0 and overwrite the glDrawPixel colors! */
-   swrast->_ActiveAttribMask &= ~FRAG_BIT_COL0;
-
    if (ctx->Pixel.Convolution2DEnabled || ctx->Pixel.Separable2DEnabled) {
       copy_conv_rgba_pixels(ctx, srcx, srcy, width, height, destx, desty);
-      goto end;
+      return;
    }
    else if (ctx->Pixel.Convolution1DEnabled) {
       /* make sure we don't apply 1D convolution */
@@ -239,12 +234,13 @@ copy_rgba_pixels(GLcontext *ctx, GLint srcx, GLint srcy,
 
    INIT_SPAN(span, GL_BITMAP, 0, 0, SPAN_RGBA);
    _swrast_span_default_attribs(ctx, &span);
+   span.arrayAttribs = FRAG_BIT_COL0; /* we'll fill in COL0 attrib values */
 
    if (overlapping) {
       tmpImage = (GLfloat *) _mesa_malloc(width * height * sizeof(GLfloat) * 4);
       if (!tmpImage) {
          _mesa_error( ctx, GL_OUT_OF_MEMORY, "glCopyPixels" );
-         goto end;
+         return;
       }
       /* read the source image as RGBA/float */
       p = tmpImage;
@@ -299,9 +295,6 @@ copy_rgba_pixels(GLcontext *ctx, GLint srcx, GLint srcy,
 
    if (overlapping)
       _mesa_free(tmpImage);
-
-end:
-   swrast->_ActiveAttribMask = prevActiveAttribs;
 }
 
 
index 925358d77eb5ba8a26c592d48d8389e1e6f156fb..b5388745bab44816c9b8a1964215d98786a3511f 100644 (file)
@@ -532,25 +532,21 @@ draw_rgba_pixels( GLcontext *ctx, GLint x, GLint y,
                   const struct gl_pixelstore_attrib *unpack,
                   const GLvoid *pixels )
 {
-   SWcontext *swrast = SWRAST_CONTEXT(ctx);
-   const GLbitfield prevActiveAttribs = swrast->_ActiveAttribMask;
    const GLint imgX = x, imgY = y;
    const GLboolean zoom = ctx->Pixel.ZoomX!=1.0 || ctx->Pixel.ZoomY!=1.0;
    GLfloat *convImage = NULL;
    GLbitfield transferOps = ctx->_ImageTransferState;
    SWspan span;
 
-   /* don't interpolate COL0 and overwrite the glDrawPixel colors! */
-   swrast->_ActiveAttribMask &= ~FRAG_BIT_COL0;
-
    /* Try an optimized glDrawPixels first */
    if (fast_draw_rgba_pixels(ctx, x, y, width, height, format, type,
                              unpack, pixels)) {
-      goto end;
+      return;
    }
 
    INIT_SPAN(span, GL_BITMAP, 0, 0x0, SPAN_RGBA);
    _swrast_span_default_attribs(ctx, &span);
+   span.arrayAttribs = FRAG_BIT_COL0; /* we're fill in COL0 attrib values */
 
    if (ctx->Pixel.Convolution2DEnabled || ctx->Pixel.Separable2DEnabled) {
       /* Convolution has to be handled specially.  We'll create an
@@ -565,13 +561,13 @@ draw_rgba_pixels( GLcontext *ctx, GLint x, GLint y,
       tmpImage = (GLfloat *) _mesa_malloc(width * height * 4 * sizeof(GLfloat));
       if (!tmpImage) {
          _mesa_error(ctx, GL_OUT_OF_MEMORY, "glDrawPixels");
-         goto end;
+         return;
       }
       convImage = (GLfloat *) _mesa_malloc(width * height * 4 * sizeof(GLfloat));
       if (!convImage) {
          _mesa_free(tmpImage);
          _mesa_error(ctx, GL_OUT_OF_MEMORY, "glDrawPixels");
-         goto end;
+         return;
       }
 
       /* Unpack the image and apply transfer ops up to convolution */
@@ -675,9 +671,6 @@ draw_rgba_pixels( GLcontext *ctx, GLint x, GLint y,
    if (convImage) {
       _mesa_free(convImage);
    }
-
-end:
-   swrast->_ActiveAttribMask = prevActiveAttribs;
 }
 
 
index 4ab6e2e9fbfb3dc6e3e99f39ee94be36252afe64..f23272c2beec5271433972883341f1ee0a1382c2 100644 (file)
@@ -171,10 +171,11 @@ interpolate_active_attribs(GLcontext *ctx, SWspan *span, GLbitfield attrMask)
 {
    const SWcontext *swrast = SWRAST_CONTEXT(ctx);
 
-   /* for glDraw/CopyPixels() we may have turned off some bits in
-    * the _ActiveAttribMask - be sure to obey that mask now.
+   /*
+    * Don't overwrite existing array values, such as colors that may have
+    * been produced by glDraw/CopyPixels.
     */
-   attrMask &= swrast->_ActiveAttribMask;
+   attrMask &= ~span->arrayAttribs;
 
    ATTRIB_LOOP_BEGIN
       if (attrMask & (1 << attr)) {
@@ -201,6 +202,7 @@ interpolate_active_attribs(GLcontext *ctx, SWspan *span, GLbitfield attrMask)
             v3 += dv3dx;
             w += dwdx;
          }
+         ASSERT((span->arrayAttribs & (1 << attr)) == 0);
          span->arrayAttribs |= (1 << attr);
       }
    ATTRIB_LOOP_END
index ab02e3fbb35655b722d64261b8ef53104a02859e..5f495e36c124d913b5b6e980a7244f35a3074c53 100644 (file)
@@ -175,6 +175,7 @@ zoom_span( GLcontext *ctx, GLint imgX, GLint imgY, const SWspan *span,
       /* we'll generate an array of colorss */
       zoomed.interpMask = span->interpMask & ~SPAN_RGBA;
       zoomed.arrayMask |= SPAN_RGBA;
+      zoomed.arrayAttribs |= FRAG_BIT_COL0;  /* we'll produce these values */
       ASSERT(span->arrayMask & SPAN_RGBA);
    }
    else if (format == GL_COLOR_INDEX) {