diff options
| -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 008b60dcff..ab33d61b57 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 c53bc93fab..b67a297010 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 e410e9d261..aa9a891eb7 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 | 
