diff options
Diffstat (limited to 'xc/extras/Mesa/src/swrast/s_pixeltex.c')
-rw-r--r-- | xc/extras/Mesa/src/swrast/s_pixeltex.c | 63 |
1 files changed, 50 insertions, 13 deletions
diff --git a/xc/extras/Mesa/src/swrast/s_pixeltex.c b/xc/extras/Mesa/src/swrast/s_pixeltex.c index 7990f4ea4..776a38c91 100644 --- a/xc/extras/Mesa/src/swrast/s_pixeltex.c +++ b/xc/extras/Mesa/src/swrast/s_pixeltex.c @@ -1,9 +1,9 @@ /* * Mesa 3-D graphics library - * Version: 3.5 + * Version: 4.1 * - * Copyright (C) 1999-2001 Brian Paul All Rights Reserved. + * Copyright (C) 1999-2002 Brian Paul All Rights Reserved. * * Permission is hereby granted, free of charge, to any person obtaining a * copy of this software and associated documentation files (the "Software"), @@ -34,47 +34,84 @@ #include "glheader.h" #include "colormac.h" +#include "imports.h" #include "s_context.h" #include "s_pixeltex.h" +#include "s_texture.h" /* * Convert RGBA values into strq texture coordinates. */ -void -_mesa_pixeltexgen(GLcontext *ctx, GLuint n, const GLchan rgba[][4], - GLfloat s[], GLfloat t[], GLfloat r[], GLfloat q[]) +static void +pixeltexgen(GLcontext *ctx, GLuint n, const GLchan rgba[][4], + GLfloat texcoord[][4]) { if (ctx->Pixel.FragmentRgbSource == GL_CURRENT_RASTER_COLOR) { GLuint i; for (i = 0; i < n; i++) { - s[i] = ctx->Current.RasterColor[RCOMP]; - t[i] = ctx->Current.RasterColor[GCOMP]; - r[i] = ctx->Current.RasterColor[BCOMP]; + texcoord[i][0] = ctx->Current.RasterColor[RCOMP]; + texcoord[i][1] = ctx->Current.RasterColor[GCOMP]; + texcoord[i][2] = ctx->Current.RasterColor[BCOMP]; } } else { GLuint i; ASSERT(ctx->Pixel.FragmentRgbSource == GL_PIXEL_GROUP_COLOR_SGIS); for (i = 0; i < n; i++) { - s[i] = CHAN_TO_FLOAT(rgba[i][RCOMP]); - t[i] = CHAN_TO_FLOAT(rgba[i][GCOMP]); - r[i] = CHAN_TO_FLOAT(rgba[i][BCOMP]); + texcoord[i][0] = CHAN_TO_FLOAT(rgba[i][RCOMP]); + texcoord[i][1] = CHAN_TO_FLOAT(rgba[i][GCOMP]); + texcoord[i][2] = CHAN_TO_FLOAT(rgba[i][BCOMP]); } } if (ctx->Pixel.FragmentAlphaSource == GL_CURRENT_RASTER_COLOR) { GLuint i; for (i = 0; i < n; i++) { - q[i] = ctx->Current.RasterColor[ACOMP]; + texcoord[i][3] = ctx->Current.RasterColor[ACOMP]; } } else { GLuint i; ASSERT(ctx->Pixel.FragmentAlphaSource == GL_PIXEL_GROUP_COLOR_SGIS); for (i = 0; i < n; i++) { - q[i] = CHAN_TO_FLOAT(rgba[i][ACOMP]); + texcoord[i][3] = CHAN_TO_FLOAT(rgba[i][ACOMP]); + } + } +} + + + +/* + * Used by glDraw/CopyPixels: the incoming image colors are treated + * as texture coordinates. Use those coords to texture the image. + * This is for GL_SGIS_pixel_texture / GL_SGIX_pixel_texture. + */ +void +_swrast_pixel_texture(GLcontext *ctx, struct sw_span *span) +{ + GLuint unit; + + ASSERT(!(span->arrayMask & SPAN_TEXTURE)); + span->arrayMask |= SPAN_TEXTURE; + + /* convert colors into texture coordinates */ + pixeltexgen( ctx, span->end, + (const GLchan (*)[4]) span->array->rgba, + span->array->texcoords[0] ); + + /* copy the new texture units for all enabled units */ + for (unit = 1; unit < ctx->Const.MaxTextureUnits; unit++) { + if (ctx->Texture.Unit[unit]._ReallyEnabled) { + MEMCPY( span->array->texcoords[unit], span->array->texcoords[0], + span->end * 4 * sizeof(GLfloat) ); } } + + /* apply texture mapping */ + _swrast_texture_span( ctx, span ); + + /* this is a work-around to be fixed by initializing again span */ + span->arrayMask &= ~SPAN_TEXTURE; } |