fixes for CHAN_BITS!=8
authorBrian Paul <brian.paul@tungstengraphics.com>
Thu, 27 Apr 2006 02:50:31 +0000 (02:50 +0000)
committerBrian Paul <brian.paul@tungstengraphics.com>
Thu, 27 Apr 2006 02:50:31 +0000 (02:50 +0000)
src/mesa/main/colortab.c
src/mesa/swrast/s_accum.c
src/mesa/swrast/s_logic.c
src/mesa/swrast/s_texcombine.c

index e2f95cf7f9b8b6bf5610d08d888e4e06da0cb6ee..8b6fc127fe9069ca54f75c626b2460e0f37b8920 100644 (file)
@@ -767,7 +767,11 @@ _mesa_GetColorTable( GLenum target, GLenum format,
                rgba[i][RCOMP] = 0;
                rgba[i][GCOMP] = 0;
                rgba[i][BCOMP] = 0;
+#if CHAN_BITS==32
+               rgba[i][ACOMP] = tableF[i];
+#else
                rgba[i][ACOMP] = IROUND_POS(tableF[i] * CHAN_MAXF);
+#endif
             }
          }
          else {
@@ -786,18 +790,25 @@ _mesa_GetColorTable( GLenum target, GLenum format,
             const GLfloat *tableF = (const GLfloat *) table->Table;
             GLuint i;
             for (i = 0; i < table->Size; i++) {
-               rgba[i][RCOMP] = IROUND_POS(tableF[i] * CHAN_MAXF);
-               rgba[i][GCOMP] = IROUND_POS(tableF[i] * CHAN_MAXF);
+#if CHAN_BITS==32
+               rgba[i][RCOMP] =
+               rgba[i][GCOMP] =
+               rgba[i][BCOMP] = tableF[i];
+               rgba[i][ACOMP] = CHAN_MAX;
+#else
+               rgba[i][RCOMP] =
+               rgba[i][GCOMP] =
                rgba[i][BCOMP] = IROUND_POS(tableF[i] * CHAN_MAXF);
                rgba[i][ACOMP] = CHAN_MAX;
+#endif
             }
          }
          else {
             const GLchan *tableUB = (const GLchan *) table->Table;
             GLuint i;
             for (i = 0; i < table->Size; i++) {
-               rgba[i][RCOMP] = tableUB[i];
-               rgba[i][GCOMP] = tableUB[i];
+               rgba[i][RCOMP] =
+               rgba[i][GCOMP] =
                rgba[i][BCOMP] = tableUB[i];
                rgba[i][ACOMP] = CHAN_MAX;
             }
@@ -808,18 +819,25 @@ _mesa_GetColorTable( GLenum target, GLenum format,
             const GLfloat *tableF = (const GLfloat *) table->Table;
             GLuint i;
             for (i = 0; i < table->Size; i++) {
-               rgba[i][RCOMP] = IROUND_POS(tableF[i*2+0] * CHAN_MAXF);
-               rgba[i][GCOMP] = IROUND_POS(tableF[i*2+0] * CHAN_MAXF);
+#if CHAN_BITS==32
+               rgba[i][RCOMP] =
+               rgba[i][GCOMP] =
+               rgba[i][BCOMP] = tableF[i*2+0];
+               rgba[i][ACOMP] = tableF[i*2+1];
+#else
+               rgba[i][RCOMP] =
+               rgba[i][GCOMP] =
                rgba[i][BCOMP] = IROUND_POS(tableF[i*2+0] * CHAN_MAXF);
                rgba[i][ACOMP] = IROUND_POS(tableF[i*2+1] * CHAN_MAXF);
+#endif
             }
          }
          else {
             const GLchan *tableUB = (const GLchan *) table->Table;
             GLuint i;
             for (i = 0; i < table->Size; i++) {
-               rgba[i][RCOMP] = tableUB[i*2+0];
-               rgba[i][GCOMP] = tableUB[i*2+0];
+               rgba[i][RCOMP] =
+               rgba[i][GCOMP] =
                rgba[i][BCOMP] = tableUB[i*2+0];
                rgba[i][ACOMP] = tableUB[i*2+1];
             }
@@ -830,19 +848,26 @@ _mesa_GetColorTable( GLenum target, GLenum format,
             const GLfloat *tableF = (const GLfloat *) table->Table;
             GLuint i;
             for (i = 0; i < table->Size; i++) {
-               rgba[i][RCOMP] = IROUND_POS(tableF[i] * CHAN_MAXF);
-               rgba[i][GCOMP] = IROUND_POS(tableF[i] * CHAN_MAXF);
-               rgba[i][BCOMP] = IROUND_POS(tableF[i] * CHAN_MAXF);
+#if CHAN_BITS==32
+               rgba[i][RCOMP] =
+               rgba[i][GCOMP] =
+               rgba[i][BCOMP] =
+               rgba[i][ACOMP] = tableF[i];
+#else
+               rgba[i][RCOMP] =
+               rgba[i][GCOMP] =
+               rgba[i][BCOMP] =
                rgba[i][ACOMP] = IROUND_POS(tableF[i] * CHAN_MAXF);
+#endif
             }
          }
          else {
             const GLchan *tableUB = (const GLchan *) table->Table;
             GLuint i;
             for (i = 0; i < table->Size; i++) {
-               rgba[i][RCOMP] = tableUB[i];
-               rgba[i][GCOMP] = tableUB[i];
-               rgba[i][BCOMP] = tableUB[i];
+               rgba[i][RCOMP] =
+               rgba[i][GCOMP] =
+               rgba[i][BCOMP] =
                rgba[i][ACOMP] = tableUB[i];
             }
          }
@@ -852,10 +877,17 @@ _mesa_GetColorTable( GLenum target, GLenum format,
             const GLfloat *tableF = (const GLfloat *) table->Table;
             GLuint i;
             for (i = 0; i < table->Size; i++) {
+#if CHAN_BITS==32
+               rgba[i][RCOMP] = tableF[i*3+0];
+               rgba[i][GCOMP] = tableF[i*3+1];
+               rgba[i][BCOMP] = tableF[i*3+2];
+               rgba[i][ACOMP] = CHAN_MAX;
+#else
                rgba[i][RCOMP] = IROUND_POS(tableF[i*3+0] * CHAN_MAXF);
                rgba[i][GCOMP] = IROUND_POS(tableF[i*3+1] * CHAN_MAXF);
                rgba[i][BCOMP] = IROUND_POS(tableF[i*3+2] * CHAN_MAXF);
                rgba[i][ACOMP] = CHAN_MAX;
+#endif
             }
          }
          else {
@@ -872,6 +904,9 @@ _mesa_GetColorTable( GLenum target, GLenum format,
       case GL_RGBA:
          if (table->Type == GL_FLOAT) {
             const GLfloat *tableF = (const GLfloat *) table->Table;
+#if CHAN_BITS==32
+            _mesa_memcpy(rgba, tableF, 4 * table->Size * sizeof(GLfloat));
+#else
             GLuint i;
             for (i = 0; i < table->Size; i++) {
                rgba[i][RCOMP] = IROUND_POS(tableF[i*4+0] * CHAN_MAXF);
@@ -879,6 +914,7 @@ _mesa_GetColorTable( GLenum target, GLenum format,
                rgba[i][BCOMP] = IROUND_POS(tableF[i*4+2] * CHAN_MAXF);
                rgba[i][ACOMP] = IROUND_POS(tableF[i*4+3] * CHAN_MAXF);
             }
+#endif
          }
          else {
             const GLchan *tableUB = (const GLchan *) table->Table;
index cf6dab912b9a00895d8f7a5c56a620f7e32025e6..a159e804976026e386dad56bbae464073840b39a 100644 (file)
@@ -1,8 +1,8 @@
 /*
  * Mesa 3-D graphics library
- * Version:  6.5
+ * Version:  6.5.1
  *
- * Copyright (C) 1999-2005  Brian Paul   All Rights Reserved.
+ * Copyright (C) 1999-2006  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"),
@@ -35,6 +35,9 @@
 #include "s_span.h"
 
 
+/* XXX this would have to change for accum buffers with more or less
+ * than 16 bits per color channel.
+ */
 #define ACCUM_SCALE16 32767.0
 
 
@@ -419,9 +422,6 @@ accum_load(GLcontext *ctx, GLfloat value,
          }
       }
    }
-   else {
-      /* other types someday */
-   }
 }
 
 
@@ -462,7 +462,8 @@ accum_return(GLcontext *ctx, GLfloat value,
    if (accumRb->DataType == GL_SHORT ||
        accumRb->DataType == GL_UNSIGNED_SHORT) {
       const GLfloat scale = value * CHAN_MAXF / ACCUM_SCALE16;
-      GLuint buffer, i;
+      GLuint buffer;
+      GLint i;
 
       /* XXX maybe transpose the 'i' and 'buffer' loops??? */
       for (i = 0; i < height; i++) {
@@ -496,10 +497,17 @@ accum_return(GLcontext *ctx, GLfloat value,
             /* scaled integer (or float) accum buffer */
             GLint j;
             for (j = 0; j < width; j++) {
+#if CHAN_BITS==32
+               GLchan r = acc[j * 4 + 0] * scale;
+               GLchan g = acc[j * 4 + 1] * scale;
+               GLchan b = acc[j * 4 + 2] * scale;
+               GLchan a = acc[j * 4 + 3] * scale;
+#else
                GLint r = IROUND( (GLfloat) (acc[j * 4 + 0]) * scale );
                GLint g = IROUND( (GLfloat) (acc[j * 4 + 1]) * scale );
                GLint b = IROUND( (GLfloat) (acc[j * 4 + 2]) * scale );
                GLint a = IROUND( (GLfloat) (acc[j * 4 + 3]) * scale );
+#endif
                rgba[j][RCOMP] = CLAMP( r, 0, CHAN_MAX );
                rgba[j][GCOMP] = CLAMP( g, 0, CHAN_MAX );
                rgba[j][BCOMP] = CLAMP( b, 0, CHAN_MAX );
index ff3c3fc2f149b9037a13eebb63c1b754dca33b67..60458c2b804f508d6b79111a822be7fce4082a96 100644 (file)
@@ -216,7 +216,7 @@ _swrast_logicop_rgba_span(GLcontext *ctx, struct gl_renderbuffer *rb,
 
    ASSERT(span->end < MAX_WIDTH);
    ASSERT(span->arrayMask & SPAN_RGBA);
-   ASSERT(rb->DataType == GL_UNSIGNED_BYTE);
+   ASSERT(rb->DataType == CHAN_TYPE);
 
    if (span->arrayMask & SPAN_XY) {
       _swrast_get_values(ctx, rb, span->end, span->array->x, span->array->y,
index 3c9fdc4d7574b2336b5a0ef978c74ecc5c03bef8..db77ad8bc3e1486999a7ba0de06883f6e6cf3aea 100644 (file)
 
 #define PROD(A,B)   ( (GLuint)(A) * ((GLuint)(B)+1) )
 #define S_PROD(A,B) ( (GLint)(A) * ((GLint)(B)+1) )
+#if CHAN_BITS == 32
+typedef GLfloat ChanTemp;
+#else
+typedef GLuint ChanTemp;
+#endif
 
 
 /**
@@ -996,10 +1001,10 @@ texture_apply( const GLcontext *ctx,
                break;
             case GL_LUMINANCE:
                for (i=0;i<n;i++) {
-                  GLuint Lt = texel[i][RCOMP];
-                  GLuint r = rgba[i][RCOMP] + Lt;
-                  GLuint g = rgba[i][GCOMP] + Lt;
-                  GLuint b = rgba[i][BCOMP] + Lt;
+                  ChanTemp Lt = texel[i][RCOMP];
+                  ChanTemp r = rgba[i][RCOMP] + Lt;
+                  ChanTemp g = rgba[i][GCOMP] + Lt;
+                  ChanTemp b = rgba[i][BCOMP] + Lt;
                   rgba[i][RCOMP] = MIN2(r, CHAN_MAX);
                   rgba[i][GCOMP] = MIN2(g, CHAN_MAX);
                   rgba[i][BCOMP] = MIN2(b, CHAN_MAX);
@@ -1008,10 +1013,10 @@ texture_apply( const GLcontext *ctx,
                break;
             case GL_LUMINANCE_ALPHA:
                for (i=0;i<n;i++) {
-                  GLuint Lt = texel[i][RCOMP];
-                  GLuint r = rgba[i][RCOMP] + Lt;
-                  GLuint g = rgba[i][GCOMP] + Lt;
-                  GLuint b = rgba[i][BCOMP] + Lt;
+                  ChanTemp Lt = texel[i][RCOMP];
+                  ChanTemp r = rgba[i][RCOMP] + Lt;
+                  ChanTemp g = rgba[i][GCOMP] + Lt;
+                  ChanTemp b = rgba[i][BCOMP] + Lt;
                   rgba[i][RCOMP] = MIN2(r, CHAN_MAX);
                   rgba[i][GCOMP] = MIN2(g, CHAN_MAX);
                   rgba[i][BCOMP] = MIN2(b, CHAN_MAX);
@@ -1021,10 +1026,10 @@ texture_apply( const GLcontext *ctx,
             case GL_INTENSITY:
                for (i=0;i<n;i++) {
                   GLchan It = texel[i][RCOMP];
-                  GLuint r = rgba[i][RCOMP] + It;
-                  GLuint g = rgba[i][GCOMP] + It;
-                  GLuint b = rgba[i][BCOMP] + It;
-                  GLuint a = rgba[i][ACOMP] + It;
+                  ChanTemp r = rgba[i][RCOMP] + It;
+                  ChanTemp g = rgba[i][GCOMP] + It;
+                  ChanTemp b = rgba[i][BCOMP] + It;
+                  ChanTemp a = rgba[i][ACOMP] + It;
                   rgba[i][RCOMP] = MIN2(r, CHAN_MAX);
                   rgba[i][GCOMP] = MIN2(g, CHAN_MAX);
                   rgba[i][BCOMP] = MIN2(b, CHAN_MAX);
@@ -1033,9 +1038,9 @@ texture_apply( const GLcontext *ctx,
                break;
            case GL_RGB:
               for (i=0;i<n;i++) {
-                  GLuint r = rgba[i][RCOMP] + texel[i][RCOMP];
-                  GLuint g = rgba[i][GCOMP] + texel[i][GCOMP];
-                  GLuint b = rgba[i][BCOMP] + texel[i][BCOMP];
+                  ChanTemp r = rgba[i][RCOMP] + texel[i][RCOMP];
+                  ChanTemp g = rgba[i][GCOMP] + texel[i][GCOMP];
+                  ChanTemp b = rgba[i][BCOMP] + texel[i][BCOMP];
                  rgba[i][RCOMP] = MIN2(r, CHAN_MAX);
                  rgba[i][GCOMP] = MIN2(g, CHAN_MAX);
                  rgba[i][BCOMP] = MIN2(b, CHAN_MAX);
@@ -1044,9 +1049,9 @@ texture_apply( const GLcontext *ctx,
               break;
            case GL_RGBA:
               for (i=0;i<n;i++) {
-                  GLuint r = rgba[i][RCOMP] + texel[i][RCOMP];
-                  GLuint g = rgba[i][GCOMP] + texel[i][GCOMP];
-                  GLuint b = rgba[i][BCOMP] + texel[i][BCOMP];
+                  ChanTemp r = rgba[i][RCOMP] + texel[i][RCOMP];
+                  ChanTemp g = rgba[i][GCOMP] + texel[i][GCOMP];
+                  ChanTemp b = rgba[i][BCOMP] + texel[i][BCOMP];
                  rgba[i][RCOMP] = MIN2(r, CHAN_MAX);
                  rgba[i][GCOMP] = MIN2(g, CHAN_MAX);
                  rgba[i][BCOMP] = MIN2(b, CHAN_MAX);