Undo some prev glDraw/CopyPixel changes which fixed a bug in which colors were overwritten by interpolating attributes.
Now just set the span->arrayAttribs mask in glDraw/CopyPixels and be sure we don't overwrite the values in interpolate_active_attribs().
This commit is contained in:
@@ -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;
|
||||
}
|
||||
|
||||
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
|
||||
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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) {
|
||||
|
||||
Reference in New Issue
Block a user