Apply antialiasing coverage factor to alpha after texture application,

not before.
This commit is contained in:
Brian Paul 2001-05-15 21:30:26 +00:00
parent a51f07d5a1
commit 5071b0812f
9 changed files with 301 additions and 230 deletions

View File

@ -1,4 +1,4 @@
/* $Id: s_aalinetemp.h,v 1.9 2001/05/10 17:41:41 brianp Exp $ */
/* $Id: s_aalinetemp.h,v 1.10 2001/05/15 21:30:26 brianp Exp $ */
/*
* Mesa 3-D graphics library
@ -42,8 +42,11 @@ NAME(plot)(GLcontext *ctx, const struct LineInfo *line,
const GLfloat coverage = compute_coveragef(line, ix, iy);
GLdepth z;
GLfloat fog;
#ifdef DO_RGBA
GLchan red, green, blue, alpha;
GLint frac, indx, index;
#else
GLint index;
#endif
GLchan specRed, specGreen, specBlue;
GLfloat tex[MAX_TEXTURE_UNITS][4], lambda[MAX_TEXTURE_UNITS];
@ -68,20 +71,11 @@ NAME(plot)(GLcontext *ctx, const struct LineInfo *line,
red = solve_plane_chan(fx, fy, line->rPlane);
green = solve_plane_chan(fx, fy, line->gPlane);
blue = solve_plane_chan(fx, fy, line->bPlane);
alpha = (GLchan) (solve_plane_chan(fx, fy, line->aPlane) * coverage);;
#else
(void) red;
(void) green;
(void) blue;
(void) alpha;
alpha = solve_plane_chan(fx, fy, line->aPlane);
#endif
#ifdef DO_INDEX
frac = (GLint) (15.0 * coverage);
indx = (GLint) solve_plane(fx, fy, line->iPlane);
index = (indx & ~0xf) | frac;
index = (GLint) solve_plane(fx, fy, line->iPlane);
#else
(void) frac;
(void) indx;
(void) index;
#endif
#ifdef DO_SPEC
@ -123,6 +117,8 @@ NAME(plot)(GLcontext *ctx, const struct LineInfo *line,
#endif
PB_COVERAGE(pb, coverage);
#if defined(DO_MULTITEX)
#if defined(DO_SPEC)
PB_WRITE_MULTITEX_SPEC_PIXEL(pb, ix, iy, z, fog, red, green, blue, alpha,
@ -139,6 +135,7 @@ NAME(plot)(GLcontext *ctx, const struct LineInfo *line,
PB_WRITE_CI_PIXEL(pb, ix, iy, z, fog, index);
#endif
pb->haveCoverage = GL_TRUE;
PB_CHECK_FLUSH(ctx, pb);
}

View File

@ -1,4 +1,4 @@
/* $Id: s_aatritemp.h,v 1.14 2001/05/15 16:18:13 brianp Exp $ */
/* $Id: s_aatritemp.h,v 1.15 2001/05/15 21:30:27 brianp Exp $ */
/*
* Mesa 3-D graphics library
@ -70,6 +70,9 @@
#ifdef DO_INDEX
GLfloat iPlane[4]; /* color index */
GLuint index[MAX_WIDTH];
GLint icoverageSpan[MAX_WIDTH];
#else
GLfloat coverageSpan[MAX_WIDTH];
#endif
#ifdef DO_SPEC
GLfloat srPlane[4], sgPlane[4], sbPlane[4]; /* spec color */
@ -283,6 +286,11 @@
while (coverage > 0.0F) {
/* (cx,cy) = center of fragment */
const GLfloat cx = ix + 0.5F, cy = iy + 0.5F;
#ifdef DO_INDEX
icoverageSpan[count] = compute_coveragei(pMin, pMid, pMax, ix, iy);
#else
coverageSpan[count] = coverage;
#endif
#ifdef DO_Z
z[count] = (GLdepth) solve_plane(cx, cy, zPlane);
#endif
@ -293,14 +301,10 @@
rgba[count][RCOMP] = solve_plane_chan(cx, cy, rPlane);
rgba[count][GCOMP] = solve_plane_chan(cx, cy, gPlane);
rgba[count][BCOMP] = solve_plane_chan(cx, cy, bPlane);
rgba[count][ACOMP] = (GLchan) (solve_plane_chan(cx, cy, aPlane) * coverage);
rgba[count][ACOMP] = solve_plane_chan(cx, cy, aPlane);
#endif
#ifdef DO_INDEX
{
GLint frac = compute_coveragei(pMin, pMid, pMax, ix, iy);
GLint indx = (GLint) solve_plane(cx, cy, iPlane);
index[count] = (indx & ~0xf) | frac;
}
index[count] = (GLint) solve_plane(cx, cy, iPlane);
#endif
#ifdef DO_SPEC
spec[count][RCOMP] = solve_plane_chan(cx, cy, srPlane);
@ -344,33 +348,37 @@
#ifdef DO_MULTITEX
# ifdef DO_SPEC
_mesa_write_multitexture_span(ctx, n, startX, iy, z, fog,
(const GLfloat (*)[MAX_WIDTH]) s,
(const GLfloat (*)[MAX_WIDTH]) t,
(const GLfloat (*)[MAX_WIDTH]) u,
(GLfloat (*)[MAX_WIDTH]) lambda,
rgba, (const GLchan (*)[4]) spec,
GL_POLYGON);
(const GLfloat (*)[MAX_WIDTH]) s,
(const GLfloat (*)[MAX_WIDTH]) t,
(const GLfloat (*)[MAX_WIDTH]) u,
(GLfloat (*)[MAX_WIDTH]) lambda,
rgba, (const GLchan (*)[4]) spec,
coverageSpan, GL_POLYGON);
# else
_mesa_write_multitexture_span(ctx, n, startX, iy, z, fog,
(const GLfloat (*)[MAX_WIDTH]) s,
(const GLfloat (*)[MAX_WIDTH]) t,
(const GLfloat (*)[MAX_WIDTH]) u,
lambda, rgba, NULL, GL_POLYGON);
(const GLfloat (*)[MAX_WIDTH]) s,
(const GLfloat (*)[MAX_WIDTH]) t,
(const GLfloat (*)[MAX_WIDTH]) u,
lambda, rgba, NULL, coverageSpan,
GL_POLYGON);
# endif
#elif defined(DO_TEX)
# ifdef DO_SPEC
_mesa_write_texture_span(ctx, n, startX, iy, z, fog,
s, t, u, lambda, rgba,
(const GLchan (*)[4]) spec, GL_POLYGON);
s, t, u, lambda, rgba,
(const GLchan (*)[4]) spec,
coverageSpan, GL_POLYGON);
# else
_mesa_write_texture_span(ctx, n, startX, iy, z, fog,
s, t, u, lambda,
rgba, NULL, GL_POLYGON);
s, t, u, lambda,
rgba, NULL, coverageSpan, GL_POLYGON);
# endif
#elif defined(DO_RGBA)
_mesa_write_rgba_span(ctx, n, startX, iy, z, fog, rgba, GL_POLYGON);
_mesa_write_rgba_span(ctx, n, startX, iy, z, fog, rgba,
coverageSpan, GL_POLYGON);
#elif defined(DO_INDEX)
_mesa_write_index_span(ctx, n, startX, iy, z, fog, index, GL_POLYGON);
_mesa_write_index_span(ctx, n, startX, iy, z, fog, index,
icoverageSpan, GL_POLYGON);
#endif
}
}
@ -407,6 +415,11 @@
while (coverage > 0.0F) {
/* (cx,cy) = center of fragment */
const GLfloat cx = ix + 0.5F, cy = iy + 0.5F;
#ifdef DO_INDEX
icoverageSpan[ix] = compute_coveragei(pMin, pMid, pMax, ix, iy);
#else
coverageSpan[ix] = coverage;
#endif
#ifdef DO_Z
z[ix] = (GLdepth) solve_plane(cx, cy, zPlane);
#endif
@ -417,14 +430,10 @@
rgba[ix][RCOMP] = solve_plane_chan(cx, cy, rPlane);
rgba[ix][GCOMP] = solve_plane_chan(cx, cy, gPlane);
rgba[ix][BCOMP] = solve_plane_chan(cx, cy, bPlane);
rgba[ix][ACOMP] = (GLchan) (solve_plane_chan(cx, cy, aPlane) * coverage);
rgba[ix][ACOMP] = solve_plane_chan(cx, cy, aPlane);
#endif
#ifdef DO_INDEX
{
GLint frac = compute_coveragei(pMin, pMax, pMid, ix, iy);
GLint indx = (GLint) solve_plane(cx, cy, iPlane);
index[ix] = (indx & ~0xf) | frac;
}
index[ix] = (GLint) solve_plane(cx, cy, iPlane);
#endif
#ifdef DO_SPEC
spec[ix][RCOMP] = solve_plane_chan(cx, cy, srPlane);
@ -483,39 +492,43 @@
}
# ifdef DO_SPEC
_mesa_write_multitexture_span(ctx, n, left, iy, z + left, fog + left,
(const GLfloat (*)[MAX_WIDTH]) s,
(const GLfloat (*)[MAX_WIDTH]) t,
(const GLfloat (*)[MAX_WIDTH]) u,
lambda, rgba + left,
(const GLchan (*)[4]) (spec + left),
GL_POLYGON);
(const GLfloat (*)[MAX_WIDTH]) s,
(const GLfloat (*)[MAX_WIDTH]) t,
(const GLfloat (*)[MAX_WIDTH]) u,
lambda, rgba + left,
(const GLchan (*)[4]) (spec + left),
coverageSpan + left,
GL_POLYGON);
# else
_mesa_write_multitexture_span(ctx, n, left, iy, z + left, fog + left,
(const GLfloat (*)[MAX_WIDTH]) s,
(const GLfloat (*)[MAX_WIDTH]) t,
(const GLfloat (*)[MAX_WIDTH]) u,
lambda,
rgba + left, NULL, GL_POLYGON);
(const GLfloat (*)[MAX_WIDTH]) s,
(const GLfloat (*)[MAX_WIDTH]) t,
(const GLfloat (*)[MAX_WIDTH]) u,
lambda,
rgba + left, NULL, coverageSpan + left,
GL_POLYGON);
# endif
#elif defined(DO_TEX)
# ifdef DO_SPEC
_mesa_write_texture_span(ctx, n, left, iy, z + left, fog + left,
s + left, t + left, u + left,
lambda + left, rgba + left,
(const GLchan (*)[4]) (spec + left),
GL_POLYGON);
s + left, t + left, u + left,
lambda + left, rgba + left,
(const GLchan (*)[4]) (spec + left),
coverageSpan + left,
GL_POLYGON);
# else
_mesa_write_texture_span(ctx, n, left, iy, z + left, fog + left,
s + left, t + left,
u + left, lambda + left,
rgba + left, NULL, GL_POLYGON);
s + left, t + left,
u + left, lambda + left,
rgba + left, NULL,
coverageSpan + left, GL_POLYGON);
# endif
#elif defined(DO_RGBA)
_mesa_write_rgba_span(ctx, n, left, iy, z + left, fog + left,
rgba + left, GL_POLYGON);
rgba + left, coverageSpan + left, GL_POLYGON);
#elif defined(DO_INDEX)
_mesa_write_index_span(ctx, n, left, iy, z + left, fog + left,
index + left, GL_POLYGON);
index + left, icoverageSpan + left, GL_POLYGON);
#endif
}
}

View File

@ -1,4 +1,4 @@
/* $Id: s_copypix.c,v 1.16 2001/03/19 02:25:36 keithw Exp $ */
/* $Id: s_copypix.c,v 1.17 2001/05/15 21:30:27 brianp Exp $ */
/*
* Mesa 3-D graphics library
@ -286,7 +286,8 @@ copy_conv_rgba_pixels(GLcontext *ctx, GLint srcx, GLint srcy,
(const GLchan (*)[4])rgba, desty);
}
else {
_mesa_write_rgba_span( ctx, width, destx, dy, zspan, 0, rgba, GL_BITMAP );
_mesa_write_rgba_span( ctx, width, destx, dy, zspan, 0, rgba,
NULL, GL_BITMAP );
}
}
@ -531,7 +532,8 @@ copy_rgba_pixels(GLcontext *ctx, GLint srcx, GLint srcy,
(const GLchan (*)[4])rgba, desty);
}
else {
_mesa_write_rgba_span( ctx, width, destx, dy, zspan, 0, rgba, GL_BITMAP );
_mesa_write_rgba_span( ctx, width, destx, dy, zspan, 0, rgba,
NULL, GL_BITMAP );
}
}
@ -641,10 +643,12 @@ static void copy_ci_pixels( GLcontext *ctx,
}
if (zoom) {
_mesa_write_zoomed_index_span( ctx, width, destx, dy, zspan, 0, indexes, desty );
_mesa_write_zoomed_index_span(ctx, width, destx, dy, zspan, 0,
indexes, desty );
}
else {
_mesa_write_index_span(ctx, width, destx, dy, zspan, 0, indexes, GL_BITMAP);
_mesa_write_index_span(ctx, width, destx, dy, zspan, 0, indexes,
NULL, GL_BITMAP);
}
}
@ -751,17 +755,17 @@ static void copy_depth_pixels( GLcontext *ctx, GLint srcx, GLint srcy,
}
else {
_mesa_write_rgba_span( ctx, width, destx, dy, zspan, 0,
rgba, GL_BITMAP);
rgba, NULL, GL_BITMAP);
}
}
else {
if (zoom) {
_mesa_write_zoomed_index_span( ctx, width, destx, dy,
zspan, 0, indexes, desty );
zspan, 0, indexes, desty );
}
else {
_mesa_write_index_span( ctx, width, destx, dy,
zspan, 0, indexes, GL_BITMAP );
zspan, 0, indexes, NULL, GL_BITMAP );
}
}
}

View File

@ -1,4 +1,4 @@
/* $Id: s_drawpix.c,v 1.17 2001/04/20 19:21:41 brianp Exp $ */
/* $Id: s_drawpix.c,v 1.18 2001/05/15 21:30:27 brianp Exp $ */
/*
* Mesa 3-D graphics library
@ -513,10 +513,12 @@ draw_index_pixels( GLcontext *ctx, GLint x, GLint y,
type, source, &ctx->Unpack,
ctx->_ImageTransferState);
if (zoom) {
_mesa_write_zoomed_index_span(ctx, drawWidth, x, y, zspan, 0, indexes, desty);
_mesa_write_zoomed_index_span(ctx, drawWidth, x, y, zspan, 0,
indexes, desty);
}
else {
_mesa_write_index_span(ctx, drawWidth, x, y, zspan, 0, indexes, GL_BITMAP);
_mesa_write_index_span(ctx, drawWidth, x, y, zspan, 0, indexes,
NULL, GL_BITMAP);
}
}
}
@ -638,7 +640,8 @@ draw_depth_pixels( GLcontext *ctx, GLint x, GLint y,
GLint i;
for (i = 0; i < width; i++)
zspan[i] = zptr[i];
_mesa_write_rgba_span( ctx, width, x, y, zspan, 0, rgba, GL_BITMAP );
_mesa_write_rgba_span(ctx, width, x, y, zspan, 0, rgba,
NULL, GL_BITMAP);
}
}
else if (type==GL_UNSIGNED_INT && ctx->Visual.depthBits == 32
@ -649,7 +652,8 @@ draw_depth_pixels( GLcontext *ctx, GLint x, GLint y,
const GLuint *zptr = (const GLuint *)
_mesa_image_address(&ctx->Unpack, pixels, width, height,
GL_DEPTH_COMPONENT, type, 0, row, 0);
_mesa_write_rgba_span( ctx, width, x, y, zptr, 0, rgba, GL_BITMAP );
_mesa_write_rgba_span(ctx, width, x, y, zptr, 0, rgba,
NULL, GL_BITMAP);
}
}
else {
@ -674,20 +678,21 @@ draw_depth_pixels( GLcontext *ctx, GLint x, GLint y,
if (ctx->Visual.rgbMode) {
if (zoom) {
_mesa_write_zoomed_rgba_span(ctx, width, x, y, zspan, 0,
(const GLchan (*)[4]) rgba, desty);
(const GLchan (*)[4]) rgba, desty);
}
else {
_mesa_write_rgba_span(ctx, width, x, y, zspan, 0, rgba, GL_BITMAP);
_mesa_write_rgba_span(ctx, width, x, y, zspan, 0,
rgba, NULL, GL_BITMAP);
}
}
else {
if (zoom) {
_mesa_write_zoomed_index_span(ctx, width, x, y, zspan, 0,
ispan, GL_BITMAP);
ispan, GL_BITMAP);
}
else {
_mesa_write_index_span(ctx, width, x, y, zspan, 0,
ispan, GL_BITMAP);
ispan, NULL, GL_BITMAP);
}
}
@ -832,16 +837,16 @@ draw_rgba_pixels( GLcontext *ctx, GLint x, GLint y,
}
if (quickDraw) {
(*swrast->Driver.WriteRGBASpan)( ctx, width, x, y,
(CONST GLchan (*)[4]) rgba, NULL);
(*swrast->Driver.WriteRGBASpan)(ctx, width, x, y,
(CONST GLchan (*)[4]) rgba, NULL);
}
else if (zoom) {
_mesa_write_zoomed_rgba_span( ctx, width, x, y, zspan, 0,
(CONST GLchan (*)[4]) rgba, desty );
_mesa_write_zoomed_rgba_span(ctx, width, x, y, zspan, 0,
(CONST GLchan (*)[4]) rgba, desty);
}
else {
_mesa_write_rgba_span( ctx, (GLuint) width, x, y, zspan, 0,
rgba, GL_BITMAP);
_mesa_write_rgba_span(ctx, (GLuint) width, x, y, zspan, 0,
rgba, NULL, GL_BITMAP);
}
}
}

View File

@ -1,4 +1,4 @@
/* $Id: s_pointtemp.h,v 1.6 2001/05/09 17:31:46 brianp Exp $ */
/* $Id: s_pointtemp.h,v 1.7 2001/05/15 21:30:27 brianp Exp $ */
/*
* Mesa 3-D graphics library
@ -184,7 +184,7 @@ NAME ( GLcontext *ctx, const SWvertex *vert )
const GLfloat rmax = radius + 0.7071F;
const GLfloat rmin2 = MAX2(0.0, rmin * rmin);
const GLfloat rmax2 = rmax * rmax;
const GLfloat cscale = 256.0F / (rmax2 - rmin2);
const GLfloat cscale = 1.0F / (rmax2 - rmin2);
const GLint xmin = (GLint) (vert->win[0] - radius);
const GLint xmax = (GLint) (vert->win[0] + radius);
const GLint ymin = (GLint) (vert->win[1] - radius);
@ -225,15 +225,14 @@ NAME ( GLcontext *ctx, const SWvertex *vert )
alpha = vert->color[3];
#endif
if (dist2 >= rmin2) {
GLint coverage = (GLint) (256.0F - (dist2 - rmin2) * cscale);
#if FLAGS & RGBA
/* coverage is in [0,256] */
alpha = (alpha * coverage) >> 8;
#else
/* 4 fractional index bits */
index = (index & ~0xf) | (coverage >> 4); /* XXX verify */
#endif
/* compute partial coverage */
PB_COVERAGE(PB, 1.0F - (dist2 - rmin2) * cscale);
}
else {
/* full coverage */
PB_COVERAGE(PB, 1.0F);
}
#endif /* SMOOTH */
#if ((FLAGS & (ATTENUATE | RGBA)) == (ATTENUATE | RGBA))
@ -273,6 +272,11 @@ NAME ( GLcontext *ctx, const SWvertex *vert )
#endif
}
}
#if FLAGS & SMOOTH
PB->haveCoverage = GL_TRUE;
#endif
PB_CHECK_FLUSH(ctx,PB);
}

View File

@ -1,4 +1,4 @@
/* $Id: s_span.c,v 1.13 2001/05/03 22:13:32 brianp Exp $ */
/* $Id: s_span.c,v 1.14 2001/05/15 21:30:27 brianp Exp $ */
/*
* Mesa 3-D graphics library
@ -51,12 +51,12 @@
/*
* Apply the current polygon stipple pattern to a span of pixels.
*/
static void stipple_polygon_span( GLcontext *ctx,
GLuint n, GLint x, GLint y, GLubyte mask[] )
static void
stipple_polygon_span( GLcontext *ctx, GLuint n, GLint x, GLint y,
GLubyte mask[] )
{
const GLuint highbit = 0x80000000;
GLuint i, m, stipple;
@ -83,8 +83,8 @@ static void stipple_polygon_span( GLcontext *ctx,
* as a special case:
* 0 = all pixels clipped
*/
static GLuint clip_span( GLcontext *ctx,
GLint n, GLint x, GLint y, GLubyte mask[] )
static GLuint
clip_span( GLcontext *ctx, GLint n, GLint x, GLint y, GLubyte mask[] )
{
/* Clip to top and bottom */
if (y < 0 || y >= ctx->DrawBuffer->Height) {
@ -123,9 +123,9 @@ static GLuint clip_span( GLcontext *ctx,
/*
* Draw to more than one color buffer (or none).
*/
static void multi_write_index_span( GLcontext *ctx, GLuint n,
GLint x, GLint y, const GLuint indexes[],
const GLubyte mask[] )
static void
multi_write_index_span( GLcontext *ctx, GLuint n, GLint x, GLint y,
const GLuint indexes[], const GLubyte mask[] )
{
SWcontext *swrast = SWRAST_CONTEXT(ctx);
GLuint bufferBit;
@ -178,10 +178,11 @@ static void multi_write_index_span( GLcontext *ctx, GLuint n,
* index - array of [n] color indexes
* primitive - either GL_POINT, GL_LINE, GL_POLYGON, or GL_BITMAP
*/
void _mesa_write_index_span( GLcontext *ctx,
GLuint n, GLint x, GLint y, const GLdepth z[],
const GLfloat fog[],
GLuint indexIn[], GLenum primitive )
void
_mesa_write_index_span( GLcontext *ctx, GLuint n, GLint x, GLint y,
const GLdepth z[], const GLfloat fog[],
GLuint indexIn[], const GLint coverage[],
GLenum primitive )
{
const GLuint modBits = FOG_BIT | BLEND_BIT | MASKING_BIT | LOGIC_OP_BIT;
GLubyte mask[MAX_WIDTH];
@ -244,6 +245,15 @@ void _mesa_write_index_span( GLcontext *ctx,
_mesa_depth_fog_ci_pixels( ctx, n, z, index );
}
/* Antialias coverage application */
if (coverage) {
GLuint i;
for (i = 0; i < n; i++) {
ASSERT(coverage[i] < 16);
index[i] = (index[i] & ~0xf) | coverage[i];
}
}
if (swrast->_RasterMask & MULTI_DRAW_BIT) {
/* draw to zero or two or more buffers */
multi_write_index_span( ctx, n, x, y, index, mask );
@ -269,11 +279,11 @@ void _mesa_write_index_span( GLcontext *ctx,
void _mesa_write_monoindex_span( GLcontext *ctx,
GLuint n, GLint x, GLint y,
const GLdepth z[],
const GLfloat fog[],
GLuint index, GLenum primitive )
void
_mesa_write_monoindex_span( GLcontext *ctx, GLuint n, GLint x, GLint y,
const GLdepth z[], const GLfloat fog[],
GLuint index, const GLint coverage[],
GLenum primitive )
{
SWcontext *swrast = SWRAST_CONTEXT(ctx);
GLubyte mask[MAX_WIDTH];
@ -322,7 +332,8 @@ void _mesa_write_monoindex_span( GLcontext *ctx,
if (ctx->Fog.Enabled
|| ctx->Color.IndexLogicOpEnabled
|| ctx->Color.IndexMask != 0xffffffff) {
|| ctx->Color.IndexMask != 0xffffffff
|| coverage) {
/* different index per pixel */
GLuint indexes[MAX_WIDTH];
for (i = 0; i < n; i++) {
@ -336,6 +347,15 @@ void _mesa_write_monoindex_span( GLcontext *ctx,
_mesa_depth_fog_ci_pixels( ctx, n, z, indexes );
}
/* Antialias coverage application */
if (coverage) {
GLuint i;
for (i = 0; i < n; i++) {
ASSERT(coverage[i] < 16);
indexes[i] = (indexes[i] & ~0xf) | coverage[i];
}
}
if (swrast->_RasterMask & MULTI_DRAW_BIT) {
/* draw to zero or two or more buffers */
multi_write_index_span( ctx, n, x, y, indexes, mask );
@ -377,9 +397,9 @@ void _mesa_write_monoindex_span( GLcontext *ctx,
/*
* Draw to more than one RGBA color buffer (or none).
*/
static void multi_write_rgba_span( GLcontext *ctx, GLuint n,
GLint x, GLint y, CONST GLchan rgba[][4],
const GLubyte mask[] )
static void
multi_write_rgba_span( GLcontext *ctx, GLuint n, GLint x, GLint y,
CONST GLchan rgba[][4], const GLubyte mask[] )
{
const GLuint colorMask = *((GLuint *) ctx->Color.ColorMask);
GLuint bufferBit;
@ -442,11 +462,11 @@ static void multi_write_rgba_span( GLcontext *ctx, GLuint n,
void _mesa_write_rgba_span( GLcontext *ctx,
GLuint n, GLint x, GLint y, const GLdepth z[],
const GLfloat *fog,
GLchan rgbaIn[][4],
GLenum primitive )
void
_mesa_write_rgba_span( GLcontext *ctx, GLuint n, GLint x, GLint y,
const GLdepth z[], const GLfloat fog[],
GLchan rgbaIn[][4], const GLfloat coverage[],
GLenum primitive )
{
const GLuint modBits = FOG_BIT | BLEND_BIT | MASKING_BIT |
LOGIC_OP_BIT | TEXTURE_BIT;
@ -530,6 +550,14 @@ void _mesa_write_rgba_span( GLcontext *ctx,
_mesa_depth_fog_rgba_pixels( ctx, n, z, rgba );
}
/* Antialias coverage application */
if (coverage) {
GLuint i;
for (i = 0; i < n; i++) {
rgba[i][ACOMP] = (GLchan) (rgba[i][ACOMP] * coverage[i]);
}
}
if (swrast->_RasterMask & MULTI_DRAW_BIT) {
multi_write_rgba_span( ctx, n, x, y, (const GLchan (*)[4]) rgba, mask );
}
@ -578,11 +606,11 @@ void _mesa_write_rgba_span( GLcontext *ctx,
* r, g, b, a - the color of the pixels
* primitive - either GL_POINT, GL_LINE, GL_POLYGON or GL_BITMAP.
*/
void _mesa_write_monocolor_span( GLcontext *ctx,
GLuint n, GLint x, GLint y, const GLdepth z[],
const GLfloat fog[],
const GLchan color[4],
GLenum primitive )
void
_mesa_write_monocolor_span( GLcontext *ctx, GLuint n, GLint x, GLint y,
const GLdepth z[], const GLfloat fog[],
const GLchan color[4], const GLfloat coverage[],
GLenum primitive )
{
const GLuint colorMask = *((GLuint *) ctx->Color.ColorMask);
GLuint i;
@ -656,7 +684,7 @@ void _mesa_write_monocolor_span( GLcontext *ctx,
}
if (ctx->Color.ColorLogicOpEnabled || colorMask != 0xffffffff ||
(swrast->_RasterMask & (BLEND_BIT | FOG_BIT))) {
(swrast->_RasterMask & (BLEND_BIT | FOG_BIT)) || coverage) {
/* assign same color to each pixel */
for (i = 0; i < n; i++) {
if (mask[i]) {
@ -672,6 +700,14 @@ void _mesa_write_monocolor_span( GLcontext *ctx,
_mesa_depth_fog_rgba_pixels( ctx, n, z, rgba );
}
/* Antialias coverage application */
if (coverage) {
GLuint i;
for (i = 0; i < n; i++) {
rgba[i][ACOMP] = (GLchan) (rgba[i][ACOMP] * coverage[i]);
}
}
if (swrast->_RasterMask & MULTI_DRAW_BIT) {
multi_write_rgba_span( ctx, n, x, y,
(const GLchan (*)[4]) rgba, mask );
@ -734,7 +770,8 @@ void _mesa_write_monocolor_span( GLcontext *ctx,
* Add specular color to base color. This is used only when
* GL_LIGHT_MODEL_COLOR_CONTROL = GL_SEPARATE_SPECULAR_COLOR.
*/
static void add_colors(GLuint n, GLchan rgba[][4], CONST GLchan specular[][4] )
static void
add_colors(GLuint n, GLchan rgba[][4], CONST GLchan specular[][4] )
{
GLuint i;
for (i = 0; i < n; i++) {
@ -761,13 +798,13 @@ static void add_colors(GLuint n, GLchan rgba[][4], CONST GLchan specular[][4] )
* rgba - array of [n] color components
* primitive - either GL_POINT, GL_LINE, GL_POLYGON or GL_BITMAP.
*/
void _mesa_write_texture_span( GLcontext *ctx,
GLuint n, GLint x, GLint y, const GLdepth z[],
const GLfloat fog[],
const GLfloat s[], const GLfloat t[],
const GLfloat u[], GLfloat lambda[],
GLchan rgbaIn[][4], CONST GLchan spec[][4],
GLenum primitive )
void
_mesa_write_texture_span( GLcontext *ctx, GLuint n, GLint x, GLint y,
const GLdepth z[], const GLfloat fog[],
const GLfloat s[], const GLfloat t[],
const GLfloat u[], GLfloat lambda[],
GLchan rgbaIn[][4], CONST GLchan spec[][4],
const GLfloat coverage[], GLenum primitive )
{
const GLuint colorMask = *((GLuint *) ctx->Color.ColorMask);
GLubyte mask[MAX_WIDTH];
@ -859,8 +896,9 @@ void _mesa_write_texture_span( GLcontext *ctx,
/* Add base and specular colors */
if (spec &&
(ctx->Fog.ColorSumEnabled ||
(ctx->Light.Enabled && ctx->Light.Model.ColorControl == GL_SEPARATE_SPECULAR_COLOR)))
add_colors( n, rgba, spec ); /* rgba = rgba + spec */
(ctx->Light.Enabled &&
ctx->Light.Model.ColorControl == GL_SEPARATE_SPECULAR_COLOR)))
add_colors( n, rgba, spec ); /* rgba = rgba + spec */
/* Per-pixel fog */
if (ctx->Fog.Enabled) {
@ -870,6 +908,14 @@ void _mesa_write_texture_span( GLcontext *ctx,
_mesa_depth_fog_rgba_pixels( ctx, n, z, rgba );
}
/* Antialias coverage application */
if (coverage) {
GLuint i;
for (i = 0; i < n; i++) {
rgba[i][ACOMP] = (GLchan) (rgba[i][ACOMP] * coverage[i]);
}
}
if (swrast->_RasterMask & MULTI_DRAW_BIT) {
multi_write_rgba_span( ctx, n, x, y, (const GLchan (*)[4]) rgba, mask );
}
@ -903,17 +949,16 @@ void _mesa_write_texture_span( GLcontext *ctx,
* As above but perform multiple stages of texture application.
*/
void
_mesa_write_multitexture_span( GLcontext *ctx,
GLuint n, GLint x, GLint y,
const GLdepth z[],
const GLfloat fog[],
CONST GLfloat s[MAX_TEXTURE_UNITS][MAX_WIDTH],
CONST GLfloat t[MAX_TEXTURE_UNITS][MAX_WIDTH],
CONST GLfloat u[MAX_TEXTURE_UNITS][MAX_WIDTH],
GLfloat lambda[][MAX_WIDTH],
GLchan rgbaIn[MAX_TEXTURE_UNITS][4],
CONST GLchan spec[MAX_TEXTURE_UNITS][4],
GLenum primitive )
_mesa_write_multitexture_span( GLcontext *ctx, GLuint n, GLint x, GLint y,
const GLdepth z[], const GLfloat fog[],
CONST GLfloat s[MAX_TEXTURE_UNITS][MAX_WIDTH],
CONST GLfloat t[MAX_TEXTURE_UNITS][MAX_WIDTH],
CONST GLfloat u[MAX_TEXTURE_UNITS][MAX_WIDTH],
GLfloat lambda[][MAX_WIDTH],
GLchan rgbaIn[MAX_TEXTURE_UNITS][4],
CONST GLchan spec[MAX_TEXTURE_UNITS][4],
const GLfloat coverage[],
GLenum primitive )
{
GLubyte mask[MAX_WIDTH];
GLboolean write_all = GL_TRUE;
@ -1022,6 +1067,14 @@ _mesa_write_multitexture_span( GLcontext *ctx,
_mesa_depth_fog_rgba_pixels( ctx, n, z, rgba );
}
/* Antialias coverage application */
if (coverage) {
GLuint i;
for (i = 0; i < n; i++) {
rgba[i][ACOMP] = (GLchan) (rgba[i][ACOMP] * coverage[i]);
}
}
if (swrast->_RasterMask & MULTI_DRAW_BIT) {
multi_write_rgba_span( ctx, n, x, y, (const GLchan (*)[4]) rgba, mask );
}
@ -1058,9 +1111,9 @@ _mesa_write_multitexture_span( GLcontext *ctx,
* Read RGBA pixels from frame buffer. Clipping will be done to prevent
* reading ouside the buffer's boundaries.
*/
void _mesa_read_rgba_span( GLcontext *ctx, GLframebuffer *buffer,
GLuint n, GLint x, GLint y,
GLchan rgba[][4] )
void
_mesa_read_rgba_span( GLcontext *ctx, GLframebuffer *buffer,
GLuint n, GLint x, GLint y, GLchan rgba[][4] )
{
SWcontext *swrast = SWRAST_CONTEXT(ctx);
if (y < 0 || y >= buffer->Height
@ -1112,8 +1165,9 @@ void _mesa_read_rgba_span( GLcontext *ctx, GLframebuffer *buffer,
* Read CI pixels from frame buffer. Clipping will be done to prevent
* reading ouside the buffer's boundaries.
*/
void _mesa_read_index_span( GLcontext *ctx, GLframebuffer *buffer,
GLuint n, GLint x, GLint y, GLuint indx[] )
void
_mesa_read_index_span( GLcontext *ctx, GLframebuffer *buffer,
GLuint n, GLint x, GLint y, GLuint indx[] )
{
SWcontext *swrast = SWRAST_CONTEXT(ctx);
if (y < 0 || y >= buffer->Height

View File

@ -1,4 +1,4 @@
/* $Id: s_span.h,v 1.5 2001/05/03 22:13:32 brianp Exp $ */
/* $Id: s_span.h,v 1.6 2001/05/15 21:30:27 brianp Exp $ */
/*
* Mesa 3-D graphics library
@ -25,9 +25,6 @@
*/
#ifndef S_SPAN_H
#define S_SPAN_H
@ -36,64 +33,62 @@
#include "swrast.h"
extern void _mesa_write_index_span( GLcontext *ctx,
GLuint n, GLint x, GLint y, const GLdepth z[],
const GLfloat fog[],
GLuint index[], GLenum primitive );
extern void _mesa_write_monoindex_span( GLcontext *ctx,
GLuint n, GLint x, GLint y,
const GLdepth z[],
const GLfloat fog[],
GLuint index, GLenum primitive );
extern void _mesa_write_rgba_span( GLcontext *ctx,
GLuint n, GLint x, GLint y, const GLdepth z[],
const GLfloat fog[],
GLchan rgba[][4], GLenum primitive );
extern void _mesa_write_monocolor_span( GLcontext *ctx,
GLuint n, GLint x, GLint y,
const GLdepth z[],
const GLfloat fog[],
const GLchan color[4],
GLenum primitive );
extern void _mesa_write_texture_span( GLcontext *ctx,
GLuint n, GLint x, GLint y,
const GLdepth z[],
const GLfloat fog[],
const GLfloat s[], const GLfloat t[],
const GLfloat u[], GLfloat lambda[],
GLchan rgba[][4], CONST GLchan spec[][4],
GLenum primitive );
extern void
_mesa_write_index_span( GLcontext *ctx, GLuint n, GLint x, GLint y,
const GLdepth z[], const GLfloat fog[],
GLuint index[], const GLint coverage[],
GLenum primitive );
extern void
_mesa_write_multitexture_span( GLcontext *ctx,
GLuint n, GLint x, GLint y,
const GLdepth z[],
const GLfloat fog[],
CONST GLfloat s[MAX_TEXTURE_UNITS][MAX_WIDTH],
CONST GLfloat t[MAX_TEXTURE_UNITS][MAX_WIDTH],
CONST GLfloat u[MAX_TEXTURE_UNITS][MAX_WIDTH],
GLfloat lambda[MAX_TEXTURE_UNITS][MAX_WIDTH],
GLchan rgba[][4],
CONST GLchan spec[][4],
_mesa_write_monoindex_span( GLcontext *ctx, GLuint n, GLint x, GLint y,
const GLdepth z[], const GLfloat fog[],
GLuint index, const GLint coverage[],
GLenum primitive );
extern void _mesa_read_rgba_span( GLcontext *ctx, GLframebuffer *buffer,
GLuint n, GLint x, GLint y,
GLchan rgba[][4] );
extern void
_mesa_write_rgba_span( GLcontext *ctx, GLuint n, GLint x, GLint y,
const GLdepth z[], const GLfloat fog[],
GLchan rgba[][4], const GLfloat coverage[],
GLenum primitive );
extern void _mesa_read_index_span( GLcontext *ctx, GLframebuffer *buffer,
GLuint n, GLint x, GLint y, GLuint indx[] );
extern void
_mesa_write_monocolor_span( GLcontext *ctx, GLuint n, GLint x, GLint y,
const GLdepth z[], const GLfloat fog[],
const GLchan color[4], const GLfloat coverage[],
GLenum primitive );
extern void
_mesa_write_texture_span( GLcontext *ctx, GLuint n, GLint x, GLint y,
const GLdepth z[], const GLfloat fog[],
const GLfloat s[], const GLfloat t[],
const GLfloat u[], GLfloat lambda[],
GLchan rgba[][4], CONST GLchan spec[][4],
const GLfloat coverage[], GLenum primitive );
extern void
_mesa_write_multitexture_span( GLcontext *ctx, GLuint n, GLint x, GLint y,
const GLdepth z[], const GLfloat fog[],
CONST GLfloat s[MAX_TEXTURE_UNITS][MAX_WIDTH],
CONST GLfloat t[MAX_TEXTURE_UNITS][MAX_WIDTH],
CONST GLfloat u[MAX_TEXTURE_UNITS][MAX_WIDTH],
GLfloat lambda[MAX_TEXTURE_UNITS][MAX_WIDTH],
GLchan rgba[][4], CONST GLchan spec[][4],
const GLfloat coverage[], GLenum primitive );
extern void
_mesa_read_rgba_span( GLcontext *ctx, GLframebuffer *buffer,
GLuint n, GLint x, GLint y, GLchan rgba[][4] );
extern void
_mesa_read_index_span( GLcontext *ctx, GLframebuffer *buffer,
GLuint n, GLint x, GLint y, GLuint indx[] );
#endif

View File

@ -1,4 +1,4 @@
/* $Id: s_triangle.c,v 1.26 2001/05/14 16:23:04 brianp Exp $ */
/* $Id: s_triangle.c,v 1.27 2001/05/15 21:30:27 brianp Exp $ */
/*
* Mesa 3-D graphics library
@ -92,7 +92,7 @@ static void flat_ci_triangle( GLcontext *ctx,
span.fog += span.fogStep; \
} \
_mesa_write_monoindex_span(ctx, span.count, span.x, span.y, \
zSpan, fogSpan, v0->index, GL_POLYGON );
zSpan, fogSpan, v0->index, NULL, GL_POLYGON );
#include "s_tritemp.h"
}
@ -125,7 +125,7 @@ static void smooth_ci_triangle( GLcontext *ctx,
span.fog += span.fogStep; \
} \
_mesa_write_index_span(ctx, span.count, span.x, span.y, \
zSpan, fogSpan, indexSpan, GL_POLYGON);
zSpan, fogSpan, indexSpan, NULL, GL_POLYGON);
#include "s_tritemp.h"
}
@ -154,8 +154,8 @@ static void flat_rgba_triangle( GLcontext *ctx,
fogSpan[i] = span.fog; \
span.fog += span.fogStep; \
} \
_mesa_write_monocolor_span(ctx, span.count, span.x, span.y, \
zSpan, fogSpan, v2->color, GL_POLYGON );
_mesa_write_monocolor_span(ctx, span.count, span.x, span.y, zSpan, \
fogSpan, v2->color, NULL, GL_POLYGON );
#include "s_tritemp.h"
@ -201,7 +201,7 @@ static void smooth_rgba_triangle( GLcontext *ctx,
} \
_mesa_write_rgba_span(ctx, span.count, span.x, span.y, \
(CONST GLdepth *) zSpan, \
fogSpan, rgbaSpan, GL_POLYGON);
fogSpan, rgbaSpan, NULL, GL_POLYGON);
#include "s_tritemp.h"
@ -592,7 +592,7 @@ affine_span(GLcontext *ctx, struct triangle_span *span,
break;
}
_mesa_write_rgba_span(ctx, span->count, span->x, span->y,
zspan, fogspan, rgba, GL_POLYGON);
zspan, fogspan, rgba, NULL, GL_POLYGON);
#undef SPAN1
#undef SPAN2
@ -1400,8 +1400,8 @@ static void near_persp_textured_triangle(GLcontext *ctx,
} \
} \
_mesa_write_rgba_span( ctx, n, LEFT, Y, zspan, \
fogspan, rgba, GL_POLYGON); \
span.red = span.green = span.blue = span.alpha = 0; \
fogspan, rgba, NULL, GL_POLYGON); \
span.red = span.green = span.blue = span.alpha = 0; \
} \
} \
@ -1586,9 +1586,9 @@ static void lin_persp_textured_triangle( GLcontext *ctx,
abort(); \
} \
} \
_mesa_write_rgba_span( ctx, n, LEFT, Y, zspan, \
fogspan, \
rgba, GL_POLYGON ); \
_mesa_write_rgba_span(ctx, n, LEFT, Y, zspan, \
fogspan, rgba, NULL, \
GL_POLYGON); \
} \
}
@ -1807,7 +1807,7 @@ rasterize_span(GLcontext *ctx, const struct triangle_span *span)
(const GLfloat (*)[MAX_WIDTH]) mrTex,
(GLfloat (*)[MAX_WIDTH]) mLambda,
rgba, (CONST GLchan (*)[4]) spec,
GL_POLYGON );
NULL, GL_POLYGON );
}
else {
_mesa_write_multitexture_span(ctx, span->count, span->x, span->y,
@ -1816,7 +1816,7 @@ rasterize_span(GLcontext *ctx, const struct triangle_span *span)
(const GLfloat (*)[MAX_WIDTH]) mtTex,
(const GLfloat (*)[MAX_WIDTH]) mrTex,
(GLfloat (*)[MAX_WIDTH]) mLambda,
rgba, NULL, GL_POLYGON);
rgba, NULL, NULL, GL_POLYGON);
}
}
else {
@ -1825,12 +1825,12 @@ rasterize_span(GLcontext *ctx, const struct triangle_span *span)
_mesa_write_texture_span(ctx, span->count, span->x, span->y,
z, fogPtr, sTex, tTex, rTex, lambda,
rgba, (CONST GLchan (*)[4]) spec,
GL_POLYGON);
NULL, GL_POLYGON);
}
else {
_mesa_write_texture_span(ctx, span->count, span->x, span->y,
z, fogPtr, sTex, tTex, rTex, lambda,
rgba, NULL, GL_POLYGON);
rgba, NULL, NULL, GL_POLYGON);
}
}
}
@ -1910,7 +1910,7 @@ static void general_textured_triangle( GLcontext *ctx,
} \
_mesa_write_texture_span(ctx, span.count, span.x, span.y, \
zSpan, fogSpan, sSpan, tSpan, uSpan, \
NULL, rgbaSpan, NULL, GL_POLYGON );
NULL, rgbaSpan, NULL, NULL, GL_POLYGON );
#include "s_tritemp.h"
}

View File

@ -1,4 +1,4 @@
/* $Id: s_zoom.c,v 1.5 2001/05/03 22:13:32 brianp Exp $ */
/* $Id: s_zoom.c,v 1.6 2001/05/15 21:30:27 brianp Exp $ */
/*
* Mesa 3-D graphics library
@ -143,8 +143,7 @@ _mesa_write_zoomed_rgba_span( GLcontext *ctx,
/* write the span */
for (r=r0; r<r1; r++) {
_mesa_write_rgba_span( ctx, m, x+skipcol, r, zdepth,
(fog ? zfog : 0),
zrgba, GL_BITMAP );
(fog ? zfog : 0), zrgba, NULL, GL_BITMAP );
}
}
@ -254,7 +253,7 @@ _mesa_write_zoomed_rgb_span( GLcontext *ctx,
/* write the span */
for (r=r0; r<r1; r++) {
_mesa_write_rgba_span( ctx, m, x+skipcol, r, zdepth,
(fog ? zfog : 0), zrgba, GL_BITMAP );
(fog ? zfog : 0), zrgba, NULL, GL_BITMAP );
}
}
@ -361,7 +360,7 @@ _mesa_write_zoomed_index_span( GLcontext *ctx,
/* write the span */
for (r=r0; r<r1; r++) {
_mesa_write_index_span( ctx, m, x+skipcol, r, zdepth,
(fog ? zfog : 0), zindexes, GL_BITMAP );
(fog ? zfog : 0), zindexes, NULL, GL_BITMAP );
}
}