glDrawPixels(GL_DEPTH_COMPONENT) with glPixelZoom didn't work
authorBrian Paul <brian.paul@tungstengraphics.com>
Sat, 23 Aug 2003 21:40:21 +0000 (21:40 +0000)
committerBrian Paul <brian.paul@tungstengraphics.com>
Sat, 23 Aug 2003 21:40:21 +0000 (21:40 +0000)
src/mesa/swrast/s_drawpix.c
src/mesa/swrast/s_zoom.c
src/mesa/swrast/s_zoom.h

index 008b60dcff9d75ce1e8067cba97b0be4048c22ab..ab33d61b572be829980750f085572266b6a57814 100644 (file)
@@ -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);
             }
          }
index c53bc93fab4c927626887bc0864069ca97d08e89..b67a2970109ea0656ec4ffa9322c5334b936164e 100644 (file)
@@ -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);
 }
 
 
index e410e9d2618d5d232dbe88aa36bb308b49f09d02..aa9a891eb7fc7ab549a1471240bd115e139b6df9 100644 (file)
@@ -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"),
 
 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