diff options
Diffstat (limited to 'src/mesa/swrast')
-rw-r--r-- | src/mesa/swrast/s_drawpix.c | 18 | ||||
-rw-r--r-- | src/mesa/swrast/s_zoom.c | 89 | ||||
-rw-r--r-- | src/mesa/swrast/s_zoom.h | 21 |
3 files changed, 92 insertions, 36 deletions
diff --git a/src/mesa/swrast/s_drawpix.c b/src/mesa/swrast/s_drawpix.c index 008b60dcff9..ab33d61b572 100644 --- a/src/mesa/swrast/s_drawpix.c +++ b/src/mesa/swrast/s_drawpix.c @@ -627,7 +627,7 @@ draw_depth_pixels( GLcontext *ctx, GLint x, GLint y, GLenum type, const GLvoid *pixels ) { const GLboolean bias_or_scale = ctx->Pixel.DepthBias!=0.0 || ctx->Pixel.DepthScale!=1.0; - const GLboolean zoom = ctx->Pixel.ZoomX!=1.0 || ctx->Pixel.ZoomY!=1.0; + const GLboolean zoom = ctx->Pixel.ZoomX != 1.0 || ctx->Pixel.ZoomY != 1.0; const GLint desty = y; struct sw_span span; @@ -720,19 +720,13 @@ draw_depth_pixels( GLcontext *ctx, GLint x, GLint y, span.array->z[i] = (GLdepth) (floatSpan[i] * zs + 0.5F); } } - if (ctx->Visual.rgbMode) { - if (zoom) { - _swrast_write_zoomed_rgba_span(ctx, &span, - (const GLchan (*)[4]) span.array->rgba, - desty, skipPixels); - } - else - _swrast_write_rgba_span(ctx, &span); + if (zoom) { + _swrast_write_zoomed_depth_span(ctx, &span, desty, skipPixels); + } + else if (ctx->Visual.rgbMode) { + _swrast_write_rgba_span(ctx, &span); } else { - if (zoom) - _swrast_write_zoomed_index_span(ctx, &span, desty, 0); - else _swrast_write_index_span(ctx, &span); } } diff --git a/src/mesa/swrast/s_zoom.c b/src/mesa/swrast/s_zoom.c index c53bc93fab4..b67a2970109 100644 --- a/src/mesa/swrast/s_zoom.c +++ b/src/mesa/swrast/s_zoom.c @@ -45,44 +45,58 @@ zoom_span( GLcontext *ctx, const struct sw_span *span, GLint c0, c1, skipCol; GLint i, j; const GLuint maxWidth = MIN2( ctx->DrawBuffer->Width, MAX_WIDTH ); - GLchan rgbaSave[MAX_WIDTH][4]; - GLuint indexSave[MAX_WIDTH]; - const GLchan (*rgba)[4] = (const GLchan (*)[4]) src; - const GLchan (*rgb)[3] = (const GLchan (*)[3]) src; - const GLuint *indexes = (const GLuint *) src; struct sw_span zoomed; struct span_arrays zoomed_arrays; /* this is big! */ - /* no pixel arrays! */ + /* no pixel arrays! must be horizontal spans. */ ASSERT((span->arrayMask & SPAN_XY) == 0); ASSERT(span->primitive == GL_BITMAP); INIT_SPAN(zoomed, GL_BITMAP, 0, 0, 0); zoomed.array = &zoomed_arrays; - zoomed.z = span->z; - zoomed.zStep = span->zStep; /* span->zStep == 0 */ + /* copy fog interp info */ zoomed.fog = span->fog; zoomed.fogStep = span->fogStep; + /* XXX copy texcoord info? */ + if (format == GL_RGBA || format == GL_RGB) { + /* copy Z info */ + zoomed.z = span->z; + zoomed.zStep = span->zStep; + /* we'll generate an array of colorss */ zoomed.interpMask = span->interpMask & ~SPAN_RGBA; zoomed.arrayMask |= SPAN_RGBA; } else if (format == GL_COLOR_INDEX) { + /* copy Z info */ + zoomed.z = span->z; + zoomed.zStep = span->zStep; + /* we'll generate an array of color indexes */ zoomed.interpMask = span->interpMask & ~SPAN_INDEX; zoomed.arrayMask |= SPAN_INDEX; } + else { + assert(format == GL_DEPTH_COMPONENT); + /* Copy color info */ + zoomed.red = span->red; + zoomed.green = span->green; + zoomed.blue = span->blue; + zoomed.alpha = span->alpha; + zoomed.redStep = span->redStep; + zoomed.greenStep = span->greenStep; + zoomed.blueStep = span->blueStep; + zoomed.alphaStep = span->alphaStep; + /* we'll generate an array of depth values */ + zoomed.interpMask = span->interpMask & ~SPAN_Z; + zoomed.arrayMask |= SPAN_Z; + } /* * Compute which columns to draw: [c0, c1) */ -#if 0 - c0 = (GLint) span->x; - c1 = (GLint) (span->x + span->end * ctx->Pixel.ZoomX); -#else c0 = (GLint) (span->x + skipPixels * ctx->Pixel.ZoomX); c1 = (GLint) (span->x + (skipPixels + span->end) * ctx->Pixel.ZoomX); -#endif if (c0 == c1) { return; } @@ -140,6 +154,7 @@ zoom_span( GLcontext *ctx, const struct sw_span *span, /* zoom the span horizontally */ if (format == GL_RGBA) { + const GLchan (*rgba)[4] = (const GLchan (*)[4]) src; if (ctx->Pixel.ZoomX == -1.0F) { /* common case */ for (j = (GLint) zoomed.start; j < (GLint) zoomed.end; j++) { @@ -163,6 +178,7 @@ zoom_span( GLcontext *ctx, const struct sw_span *span, } } else if (format == GL_RGB) { + const GLchan (*rgb)[3] = (const GLchan (*)[3]) src; if (ctx->Pixel.ZoomX == -1.0F) { /* common case */ for (j = (GLint) zoomed.start; j < (GLint) zoomed.end; j++) { @@ -192,6 +208,7 @@ zoom_span( GLcontext *ctx, const struct sw_span *span, } } else if (format == GL_COLOR_INDEX) { + const GLuint *indexes = (const GLuint *) src; if (ctx->Pixel.ZoomX == -1.0F) { /* common case */ for (j = (GLint) zoomed.start; j < (GLint) zoomed.end; j++) { @@ -214,6 +231,37 @@ zoom_span( GLcontext *ctx, const struct sw_span *span, } } } + else { + const GLdepth *zValues = (const GLuint *) src; + assert(format == GL_DEPTH_COMPONENT); + if (ctx->Pixel.ZoomX == -1.0F) { + /* common case */ + for (j = (GLint) zoomed.start; j < (GLint) zoomed.end; j++) { + i = span->end - (j + skipCol) - 1; + zoomed.array->z[j] = zValues[i]; + } + } + else { + /* general solution */ + const GLfloat xscale = 1.0F / ctx->Pixel.ZoomX; + for (j = (GLint) zoomed.start; j < (GLint) zoomed.end; j++) { + i = (GLint) ((j + skipCol) * xscale); + if (ctx->Pixel.ZoomX < 0.0) { + ASSERT(i <= 0); + i = span->end + i - 1; + } + ASSERT(i >= 0); + ASSERT(i < (GLint) span->end); + zoomed.array->z[j] = zValues[i]; + } + } + /* Now, fall into either the RGB or COLOR_INDEX path below */ + if (ctx->Visual.rgbMode) + format = GL_RGBA; + else + format = GL_COLOR_INDEX; + } + /* write the span in rows [r0, r1) */ if (format == GL_RGBA || format == GL_RGB) { @@ -221,6 +269,7 @@ zoom_span( GLcontext *ctx, const struct sw_span *span, * going to call _swrast_write_zoomed_span() more than once. * Also, clipping may change the span end value, so store it as well. */ + GLchan rgbaSave[MAX_WIDTH][4]; const GLint end = zoomed.end; /* save */ if (r1 - r0 > 1) { MEMCPY(rgbaSave, zoomed.array->rgba, zoomed.end * 4 * sizeof(GLchan)); @@ -235,6 +284,7 @@ zoom_span( GLcontext *ctx, const struct sw_span *span, } } else if (format == GL_COLOR_INDEX) { + GLuint indexSave[MAX_WIDTH]; const GLint end = zoomed.end; /* save */ if (r1 - r0 > 1) { MEMCPY(indexSave, zoomed.array->index, zoomed.end * sizeof(GLuint)); @@ -273,8 +323,17 @@ void _swrast_write_zoomed_index_span( GLcontext *ctx, const struct sw_span *span, GLint y0, GLint skipPixels ) { - zoom_span(ctx, span, (const GLvoid *) span->array->index, y0, - GL_COLOR_INDEX, skipPixels); + zoom_span(ctx, span, (const GLvoid *) span->array->index, y0, + GL_COLOR_INDEX, skipPixels); +} + + +void +_swrast_write_zoomed_depth_span( GLcontext *ctx, const struct sw_span *span, + GLint y0, GLint skipPixels ) +{ + zoom_span(ctx, span, (const GLvoid *) span->array->z, y0, + GL_DEPTH_COMPONENT, skipPixels); } diff --git a/src/mesa/swrast/s_zoom.h b/src/mesa/swrast/s_zoom.h index e410e9d2618..aa9a891eb7f 100644 --- a/src/mesa/swrast/s_zoom.h +++ b/src/mesa/swrast/s_zoom.h @@ -1,9 +1,8 @@ - /* * Mesa 3-D graphics library * Version: 5.1 * - * Copyright (C) 1999-2002 Brian Paul All Rights Reserved. + * Copyright (C) 1999-2003 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"), @@ -31,21 +30,25 @@ extern void _swrast_write_zoomed_rgba_span( GLcontext *ctx, const struct sw_span *span, - CONST GLchan rgb[][4], GLint y0, - GLint skipPixels ); + CONST GLchan rgb[][4], GLint y0, + GLint skipPixels ); extern void _swrast_write_zoomed_rgb_span( GLcontext *ctx, const struct sw_span *span, - CONST GLchan rgb[][3], GLint y0, - GLint skipPixels ); + CONST GLchan rgb[][3], GLint y0, + GLint skipPixels ); extern void _swrast_write_zoomed_index_span( GLcontext *ctx, const struct sw_span *span, - GLint y0, GLint skipPixels ); + GLint y0, GLint skipPixels ); + +extern void +_swrast_write_zoomed_depth_span( GLcontext *ctx, const struct sw_span *span, + GLint y0, GLint skipPixels ); extern void _swrast_write_zoomed_stencil_span( GLcontext *ctx, GLuint n, GLint x, GLint y, - const GLstencil stencil[], GLint y0, - GLint skipPixels ); + const GLstencil stencil[], GLint y0, + GLint skipPixels ); #endif |