Remove clamp parameter from _mesa_unpack_color_span_float(). Pass the
authorBrian Paul <brian.paul@tungstengraphics.com>
Sat, 28 Feb 2004 22:30:58 +0000 (22:30 +0000)
committerBrian Paul <brian.paul@tungstengraphics.com>
Sat, 28 Feb 2004 22:30:58 +0000 (22:30 +0000)
IMAGE_CLAMP_BIT if needed.
Added ClampVertexColors and ClampFragmentColors to GLcontext in anticipation
of upcoming extensions (not fully used yet).

src/mesa/main/colortab.c
src/mesa/main/context.c
src/mesa/main/convolve.c
src/mesa/main/image.c
src/mesa/main/image.h
src/mesa/main/mtypes.h
src/mesa/main/texstore.c
src/mesa/swrast/s_copypix.c
src/mesa/swrast/s_drawpix.c

index af7aa00512f2351f35d9c021de16976adf8ad4ea..862f210bb984ad1bf443bd38a6e5a5061474b44a 100644 (file)
@@ -204,8 +204,7 @@ store_colortable_entries(GLcontext *ctx, struct gl_color_table *table,
                                     tempTab,        /* dest address */
                                     format, type, data, /* src data */
                                    &ctx->Unpack,
-                                    0,              /* transfer ops */
-                                   GL_FALSE);      /* clamping */
+                                    IMAGE_CLAMP_BIT); /* transfer ops */
 
       tableF = (GLfloat *) table->Table;
 
index 7de8115ad1c2780a3f7105723eb7b73b7f486f90..951763642b303960f73b92e205799209f823d894 100644 (file)
@@ -1133,6 +1133,12 @@ init_attrib_groups( GLcontext *ctx )
    ctx->ErrorValue = (GLenum) GL_NO_ERROR;
    ctx->CatchSignals = GL_TRUE;
    ctx->_Facing = 0;
+#if CHAN_TYPE == GL_FLOAT
+   ctx->ClampFragmentColors = GL_FALSE; /* XXX temporary */
+#else
+   ctx->ClampFragmentColors = GL_TRUE;
+#endif
+   ctx->ClampVertexColors = GL_TRUE;
 
    return GL_TRUE;
 }
index edb02482b399526d644678fb98254d97d2f12727..c1965c5feb9f19e984751f31bd0644f3494c5dd2 100644 (file)
@@ -1,8 +1,8 @@
 /*
  * Mesa 3-D graphics library
- * Version:  5.1
+ * Version:  6.1
  *
- * Copyright (C) 1999-2003  Brian Paul   All Rights Reserved.
+ * Copyright (C) 1999-2004  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"),
@@ -146,7 +146,7 @@ _mesa_ConvolutionFilter1D(GLenum target, GLenum internalFormat, GLsizei width, G
    _mesa_unpack_color_span_float(ctx, width, GL_RGBA,
                                  ctx->Convolution1D.Filter,
                                  format, type, image, &ctx->Unpack,
-                                 0, GL_FALSE);
+                                 0); /* transferOps */
 
    /* apply scale and bias */
    {
@@ -229,7 +229,7 @@ _mesa_ConvolutionFilter2D(GLenum target, GLenum internalFormat, GLsizei width, G
       GLfloat *dst = ctx->Convolution2D.Filter + i * width * 4;
       _mesa_unpack_color_span_float(ctx, width, GL_RGBA, dst,
                                     format, type, src, &ctx->Unpack,
-                                    0, GL_FALSE);
+                                    0); /* transferOps */
    }
 
    /* apply scale and bias */
@@ -810,7 +810,7 @@ _mesa_SeparableFilter2D(GLenum target, GLenum internalFormat, GLsizei width, GLs
    _mesa_unpack_color_span_float(ctx, width, GL_RGBA,
                                  ctx->Separable2D.Filter,
                                  format, type, row, &ctx->Unpack,
-                                 0, GL_FALSE);
+                                 0);  /* transferOps */
 
    /* apply scale and bias */
    {
@@ -837,7 +837,7 @@ _mesa_SeparableFilter2D(GLenum target, GLenum internalFormat, GLsizei width, GLs
    _mesa_unpack_color_span_float(ctx, width, GL_RGBA,
                                  &ctx->Separable2D.Filter[colStart],
                                  format, type, column, &ctx->Unpack,
-                                 0, GL_FALSE);
+                                 0); /* transferOps */
 
    /* apply scale and bias */
    {
index ba5b4ff17ad0f4a3bbde72c0407ca938bf04908f..5c117f6ce6a9b94bb0788b773e302dff15f44a77 100644 (file)
@@ -972,8 +972,7 @@ _mesa_apply_rgba_transfer_ops(GLcontext *ctx, GLuint transferOps,
    if (transferOps & IMAGE_MIN_MAX_BIT) {
       _mesa_update_minmax(ctx, n, (CONST GLfloat (*)[4]) rgba);
    }
-
-#if CHAN_TYPE != GL_FLOAT
+   /* clamping to [0,1] */
    if (transferOps & IMAGE_CLAMP_BIT) {
       GLuint i;
       for (i = 0; i < n; i++) {
@@ -983,7 +982,6 @@ _mesa_apply_rgba_transfer_ops(GLcontext *ctx, GLuint transferOps,
          rgba[i][ACOMP] = CLAMP(rgba[i][ACOMP], 0.0F, 1.0F);
       }
    }
-#endif
 }
 
 
@@ -1026,17 +1024,18 @@ _mesa_pack_rgba_span_float( GLcontext *ctx,
       rgba = (const GLfloat (*)[4]) rgbaIn;
    }
 
-   /* XXX clamp rgba to [0,1]? */
-
    if (dstFormat == GL_LUMINANCE || dstFormat == GL_LUMINANCE_ALPHA) {
       /* compute luminance values */
-      for (i = 0; i < n; i++) {
-         GLfloat sum = rgba[i][RCOMP] + rgba[i][GCOMP] + rgba[i][BCOMP];
-#if CHAN_TYPE == GL_FLOAT
-         luminance[i] = sum;
-#else
-         luminance[i] = CLAMP(sum, 0.0F, 1.0F);
-#endif
+      if (ctx->ClampFragmentColors) {
+         for (i = 0; i < n; i++) {
+            GLfloat sum = rgba[i][RCOMP] + rgba[i][GCOMP] + rgba[i][BCOMP];
+            luminance[i] = CLAMP(sum, 0.0F, 1.0F);
+         }
+      }
+      else {
+         for (i = 0; i < n; i++) {
+            luminance[i] = rgba[i][RCOMP] + rgba[i][GCOMP] + rgba[i][BCOMP];
+         }
       }
    }
 
@@ -2942,6 +2941,7 @@ _mesa_unpack_color_span_chan( GLcontext *ctx,
                             srcPacking->SwapBytes);
       }
 
+      /* Need to clamp if returning GLubytes or GLushorts */
 #if CHAN_TYPE != GL_FLOAT
       transferOps |= IMAGE_CLAMP_BIT;
 #endif
@@ -3069,7 +3069,7 @@ _mesa_unpack_color_span_float( GLcontext *ctx,
                                GLenum srcFormat, GLenum srcType,
                                const GLvoid *source,
                                const struct gl_pixelstore_attrib *srcPacking,
-                               GLuint transferOps, GLboolean clamp )
+                               GLuint transferOps )
 {
    ASSERT(dstFormat == GL_ALPHA ||
           dstFormat == GL_LUMINANCE ||
@@ -3169,12 +3169,6 @@ _mesa_unpack_color_span_float( GLcontext *ctx,
                             srcPacking->SwapBytes);
       }
 
-#if CHAN_TYPE != GL_FLOAT
-      if (clamp) {
-         transferOps |= IMAGE_CLAMP_BIT;
-      }
-#endif
-
       if (transferOps) {
          _mesa_apply_rgba_transfer_ops(ctx, transferOps, n, rgba);
       }
index cd79d5f223f37728ecf0dbba920af5a7a88151ee..b3757a30fdcd1ff4d0353f9879f324c943e29b70 100644 (file)
@@ -110,10 +110,10 @@ _mesa_pack_rgba_span_float( GLcontext *ctx,
 
 extern void
 _mesa_pack_rgba_span_chan( GLcontext *ctx,
-                      GLuint n, CONST GLchan rgba[][4],
-                      GLenum dstFormat, GLenum dstType, GLvoid *dstAddr,
-                      const struct gl_pixelstore_attrib *dstPacking,
-                      GLuint transferOps );
+                           GLuint n, CONST GLchan rgba[][4],
+                           GLenum dstFormat, GLenum dstType, GLvoid *dstAddr,
+                           const struct gl_pixelstore_attrib *dstPacking,
+                           GLuint transferOps );
 
 
 extern void
@@ -131,7 +131,7 @@ _mesa_unpack_color_span_float( GLcontext *ctx,
                                GLenum srcFormat, GLenum srcType,
                                const GLvoid *source,
                                const struct gl_pixelstore_attrib *srcPacking,
-                               GLuint transferOps, GLboolean clamp );
+                               GLuint transferOps );
 
 
 extern void
index d1cfa4597bc2d507dfd562bb3867cfc8a2ec0bb6..1c03a056069884dc31123abb3d0651d6027a804f 100644 (file)
@@ -2319,6 +2319,12 @@ struct __GLcontextRec {
    GLfloat MRD;                /**< minimum resolvable difference in Z values */
    /*@}*/
 
+   /** \name Color clamping (tentative part of GL_ARB_color_clamp_control) */
+   /*@{*/
+   GLboolean ClampFragmentColors;
+   GLboolean ClampVertexColors;
+   /*@}*/
+
    /** Should 3Dfx Glide driver catch signals? */
    GLboolean CatchSignals;
 
index 61bbc10bf67883817bdec33cae63dbfce45204a0..315cd6ca2d34168d28cd8535972321a4cb3b4dca 100644 (file)
@@ -360,9 +360,8 @@ transfer_teximage(GLcontext *ctx, GLuint dimensions,
                                               srcAddr, srcWidth, srcHeight,
                                               srcFormat, srcType, img, row, 0);
                _mesa_unpack_color_span_float(ctx, srcWidth, GL_RGBA, dstf,
-                         srcFormat, srcType, src, srcPacking,
-                         transferOps & IMAGE_PRE_CONVOLUTION_BITS,
-                         GL_TRUE);
+                 srcFormat, srcType, src, srcPacking,
+                 (transferOps & IMAGE_PRE_CONVOLUTION_BITS) | IMAGE_CLAMP_BIT);
                dstf += srcWidth * 4;
             }
 
index 9176755e35345bbfab905f493ec59030687d5eee..f715e5a6267e150fe61d508c69b0c1d03d365c51 100644 (file)
@@ -1,8 +1,8 @@
 /*
  * Mesa 3-D graphics library
- * Version:  5.1
+ * Version:  6.1
  *
- * Copyright (C) 1999-2003  Brian Paul   All Rights Reserved.
+ * Copyright (C) 1999-2004  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"),
 
 #include "glheader.h"
 #include "context.h"
+#include "colormac.h"
 #include "convolve.h"
 #include "histogram.h"
+#include "image.h"
 #include "macros.h"
 #include "imports.h"
 #include "pixel.h"
@@ -86,6 +88,40 @@ regions_overlap(GLint srcx, GLint srcy,
 }
 
 
+/**
+ * Convert GLfloat[n][4] colors to GLchan[n][4].
+ * XXX maybe move into image.c
+ */
+static void
+float_span_to_chan(GLuint n, CONST GLfloat in[][4], GLchan out[][4])
+{
+   GLuint i;
+   for (i = 0; i < n; i++) {
+      UNCLAMPED_FLOAT_TO_CHAN(out[i][RCOMP], in[i][RCOMP]);
+      UNCLAMPED_FLOAT_TO_CHAN(out[i][GCOMP], in[i][GCOMP]);
+      UNCLAMPED_FLOAT_TO_CHAN(out[i][BCOMP], in[i][BCOMP]);
+      UNCLAMPED_FLOAT_TO_CHAN(out[i][ACOMP], in[i][ACOMP]);
+   }
+}
+
+
+/**
+ * Convert GLchan[n][4] colors to GLfloat[n][4].
+ * XXX maybe move into image.c
+ */
+static void
+chan_span_to_float(GLuint n, CONST GLchan in[][4], GLfloat out[][4])
+{
+   GLuint i;
+   for (i = 0; i < n; i++) {
+      out[i][RCOMP] = CHAN_TO_FLOAT(in[i][RCOMP]);
+      out[i][GCOMP] = CHAN_TO_FLOAT(in[i][GCOMP]);
+      out[i][BCOMP] = CHAN_TO_FLOAT(in[i][BCOMP]);
+      out[i][ACOMP] = CHAN_TO_FLOAT(in[i][ACOMP]);
+   }
+}
+
+
 
 /*
  * RGBA copypixels with convolution.
@@ -150,15 +186,11 @@ copy_conv_rgba_pixels(GLcontext *ctx, GLint srcx, GLint srcy,
    dest = tmpImage;
    for (row = 0; row < height; row++) {
       GLchan rgba[MAX_WIDTH][4];
-      GLint i;
-      _swrast_read_rgba_span(ctx, ctx->ReadBuffer, width, srcx, srcy + row, rgba);
-      /* convert GLchan to GLfloat */
-      for (i = 0; i < width; i++) {
-         *dest++ = (GLfloat) rgba[i][RCOMP] * (1.0F / CHAN_MAXF);
-         *dest++ = (GLfloat) rgba[i][GCOMP] * (1.0F / CHAN_MAXF);
-         *dest++ = (GLfloat) rgba[i][BCOMP] * (1.0F / CHAN_MAXF);
-         *dest++ = (GLfloat) rgba[i][ACOMP] * (1.0F / CHAN_MAXF);
-      }
+      /* Read GLchan and convert to GLfloat */
+      _swrast_read_rgba_span(ctx, ctx->ReadBuffer, width, srcx,
+                             srcy + row, rgba);
+      chan_span_to_float(width, (CONST GLchan (*)[4]) rgba,
+                         (GLfloat (*)[4]) dest);
    }
 
    if (changeBuffer) {
@@ -195,19 +227,10 @@ copy_conv_rgba_pixels(GLcontext *ctx, GLint srcx, GLint srcy,
    /* write the new image */
    for (row = 0; row < height; row++) {
       const GLfloat *src = convImage + row * width * 4;
-      GLint i, dy;
+      GLint dy;
 
-      /* clamp to [0,1] and convert float back to chan */
-      for (i = 0; i < width; i++) {
-         GLint r = (GLint) (src[i * 4 + RCOMP] * CHAN_MAXF);
-         GLint g = (GLint) (src[i * 4 + GCOMP] * CHAN_MAXF);
-         GLint b = (GLint) (src[i * 4 + BCOMP] * CHAN_MAXF);
-         GLint a = (GLint) (src[i * 4 + ACOMP] * CHAN_MAXF);
-         span.array->rgba[i][RCOMP] = (GLchan) CLAMP(r, 0, CHAN_MAX);
-         span.array->rgba[i][GCOMP] = (GLchan) CLAMP(g, 0, CHAN_MAX);
-         span.array->rgba[i][BCOMP] = (GLchan) CLAMP(b, 0, CHAN_MAX);
-         span.array->rgba[i][ACOMP] = (GLchan) CLAMP(a, 0, CHAN_MAX);
-      }
+      /* convert floats back to chan */
+      float_span_to_chan(width, (const GLfloat (*)[4]) src, span.array->rgba);
 
       if (ctx->Pixel.PixelTextureEnabled && ctx->Texture._EnabledUnits) {
          span.end = width;
@@ -355,32 +378,16 @@ copy_rgba_pixels(GLcontext *ctx, GLint srcx, GLint srcy,
       }
 
       if (transferOps) {
-         const GLfloat scale = (1.0F / CHAN_MAXF);
-         GLint k;
          DEFMARRAY(GLfloat, rgbaFloat, MAX_WIDTH, 4);  /* mac 32k limitation */
          CHECKARRAY(rgbaFloat, return);
 
-         /* convert chan to float */
-         for (k = 0; k < width; k++) {
-            rgbaFloat[k][RCOMP] = (GLfloat) span.array->rgba[k][RCOMP] * scale;
-            rgbaFloat[k][GCOMP] = (GLfloat) span.array->rgba[k][GCOMP] * scale;
-            rgbaFloat[k][BCOMP] = (GLfloat) span.array->rgba[k][BCOMP] * scale;
-            rgbaFloat[k][ACOMP] = (GLfloat) span.array->rgba[k][ACOMP] * scale;
-         }
-
+         /* convert to float, transfer, convert back to chan */
+         chan_span_to_float(width, (CONST GLchan (*)[4]) span.array->rgba,
+                            rgbaFloat);
          _mesa_apply_rgba_transfer_ops(ctx, transferOps, width, rgbaFloat);
+         float_span_to_chan(width, (CONST GLfloat (*)[4]) rgbaFloat,
+                            span.array->rgba);
 
-         /* clamp to [0,1] and convert float back to chan */
-         for (k = 0; k < width; k++) {
-            GLint r = (GLint) (rgbaFloat[k][RCOMP] * CHAN_MAXF);
-            GLint g = (GLint) (rgbaFloat[k][GCOMP] * CHAN_MAXF);
-            GLint b = (GLint) (rgbaFloat[k][BCOMP] * CHAN_MAXF);
-            GLint a = (GLint) (rgbaFloat[k][ACOMP] * CHAN_MAXF);
-            span.array->rgba[k][RCOMP] = (GLchan) CLAMP(r, 0, CHAN_MAX);
-            span.array->rgba[k][GCOMP] = (GLchan) CLAMP(g, 0, CHAN_MAX);
-            span.array->rgba[k][BCOMP] = (GLchan) CLAMP(b, 0, CHAN_MAX);
-            span.array->rgba[k][ACOMP] = (GLchan) CLAMP(a, 0, CHAN_MAX);
-         }
          UNDEFARRAY(rgbaFloat);  /* mac 32k limitation */
       }
 
index cc2564f6c590930b7d77df0d1b165a15c1b5b61f..5b6f924405752da31d84d92a756b184c4e514678 100644 (file)
@@ -803,9 +803,8 @@ draw_rgba_pixels( GLcontext *ctx, GLint x, GLint y,
          const GLvoid *source = _mesa_image_address(unpack,
                   pixels, width, height, format, type, 0, row, 0);
          _mesa_unpack_color_span_float(ctx, width, GL_RGBA, (GLfloat *) dest,
-                                      format, type, source, unpack,
-                                      transferOps & IMAGE_PRE_CONVOLUTION_BITS,
-                                      GL_FALSE);
+                                     format, type, source, unpack,
+                                     transferOps & IMAGE_PRE_CONVOLUTION_BITS);
          dest += width * 4;
       }