Revamp color table code.
authorBrian Paul <brian.paul@tungstengraphics.com>
Fri, 13 Oct 2006 00:44:31 +0000 (00:44 +0000)
committerBrian Paul <brian.paul@tungstengraphics.com>
Fri, 13 Oct 2006 00:44:31 +0000 (00:44 +0000)
Always store all color tables as both float and ubyte.

src/mesa/drivers/dri/tdfx/tdfx_tex.c
src/mesa/drivers/dri/unichrome/via_state.c
src/mesa/main/colortab.c
src/mesa/main/colortab.h
src/mesa/main/mtypes.h
src/mesa/main/pixel.c
src/mesa/main/pixel.h
src/mesa/main/texformat_tmp.h
src/mesa/swrast/s_texcombine.c

index f67934587206aaefb1823dc61f2c05e0a1c979e1..aefd1dd5513ab2ff4fee8c9ff02c3bddf4537085 100644 (file)
@@ -594,13 +594,11 @@ tdfxIsTextureResident(GLcontext *ctx, struct gl_texture_object *tObj)
 static GrTexTable_t
 convertPalette(FxU32 data[256], const struct gl_color_table *table)
 {
-    const GLubyte *tableUB = (const GLubyte *) table->Table;
+    const GLubyte *tableUB = table->TableUB;
     GLint width = table->Size;
     FxU32 r, g, b, a;
     GLint i;
 
-    ASSERT(table->Type == GL_UNSIGNED_BYTE);
-
     switch (table->_BaseFormat) {
     case GL_INTENSITY:
         for (i = 0; i < width; i++) {
index 6a2a99df3bcfd5b8549c85f436e110d360a3a0bc..e17442e9e610efb9066a09c3fcc5880dd0910ff6 100644 (file)
@@ -328,8 +328,8 @@ void viaEmitState(struct via_context *vmesa)
         /* KW:  This test never succeeds:
          */
         if (t->regTexFM == HC_HTXnFM_Index8) {
-           struct gl_color_table *table = &texObj->Palette;
-           GLfloat *tableF = (GLfloat *)table->Table;
+           const struct gl_color_table *table = &texObj->Palette;
+           const GLfloat *tableF = table->TableF;
 
            BEGIN_RING(2 + table->Size);
            OUT_RING( HC_HEADER2 );
@@ -453,8 +453,8 @@ void viaEmitState(struct via_context *vmesa)
         /* KW:  This test never succeeds:
          */
         if (t->regTexFM == HC_HTXnFM_Index8) {
-           struct gl_color_table *table = &texObj->Palette;
-           GLfloat *tableF = (GLfloat *)table->Table;
+           const struct gl_color_table *table = &texObj->Palette;
+           const GLfloat *tableF = table->TableF;
 
            BEGIN_RING(2 + table->Size);
            OUT_RING( HC_HEADER2 );
index 8b6fc127fe9069ca54f75c626b2460e0f37b8920..8d010a0499137e6ee207f5f27467a8927924294c 100644 (file)
@@ -1,8 +1,8 @@
 /*
  * Mesa 3-D graphics library
- * Version:  6.5
+ * Version:  6.5.2
  *
- * 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"),
@@ -32,7 +32,7 @@
 #include "state.h"
 
 
-/*
+/**
  * Given an internalFormat token passed to glColorTable,
  * return the corresponding base format.
  * Return -1 if invalid token.
@@ -92,32 +92,14 @@ base_colortab_format( GLenum format )
 
 
 
-/*
+/**
  * Examine table's format and set the component sizes accordingly.
  */
 static void
 set_component_sizes( struct gl_color_table *table )
 {
-   GLubyte sz;
-
-   switch (table->Type) {
-   case GL_UNSIGNED_BYTE:
-      sz = 8 * sizeof(GLubyte);
-      break;
-   case GL_UNSIGNED_SHORT:
-      sz = 8 * sizeof(GLushort);
-      break;
-   case GL_FLOAT:
-      /* Don't actually return 32 here since that causes the conformance
-       * tests to blow up.  Conform thinks the component is an integer,
-       * not a float.
-       */
-      sz = 8;  /** 8 * sizeof(GLfloat); **/
-      break;
-   default:
-      _mesa_problem(NULL, "bad color table type in set_component_sizes 0x%x", table->Type);
-      return;
-   }
+   /* assuming the ubyte table */
+   const GLubyte sz = 8;
 
    switch (table->_BaseFormat) {
       case GL_ALPHA:
@@ -217,7 +199,7 @@ store_colortable_entries(GLcontext *ctx, struct gl_color_table *table,
    }
 
 
-   if (table->Type == GL_FLOAT) {
+   {
       /* convert user-provided data to GLfloat values */
       GLfloat tempTab[MAX_COLOR_TABLE_SIZE * 4];
       GLfloat *tableF;
@@ -233,7 +215,7 @@ store_colortable_entries(GLcontext *ctx, struct gl_color_table *table,
                                     IMAGE_CLAMP_BIT); /* transfer ops */
 
       /* the destination */
-      tableF = (GLfloat *) table->Table;
+      tableF = table->TableF;
 
       /* Apply scale & bias & clamp now */
       switch (table->_BaseFormat) {
@@ -284,16 +266,16 @@ store_colortable_entries(GLcontext *ctx, struct gl_color_table *table,
             return;
          }
    }
-   else {
-      /* non-float (GLchan) */
+
+   /* update the ubyte table */
+   {
       const GLint comps = _mesa_components_in_format(table->_BaseFormat);
-      GLchan *dest = (GLchan *) table->Table + start * comps;
-      _mesa_unpack_color_span_chan(ctx, count,         /* number of entries */
-                                  table->_BaseFormat, /* dest format */
-                                  dest,               /* dest address */
-                                   format, type, data, /* src data */
-                                  &ctx->Unpack,
-                                  0);                 /* transfer ops */
+      const GLfloat *tableF = table->TableF + start * comps;
+      GLubyte *tableUB = table->TableUB + start * comps;
+      GLint i;
+      for (i = 0; i < count * comps; i++) {
+         CLAMPED_FLOAT_TO_UBYTE(tableUB[i], tableF[i]);
+      }
    }
 
    if (ctx->Unpack.BufferObj->Name) {
@@ -317,7 +299,6 @@ _mesa_ColorTable( GLenum target, GLenum internalFormat,
    GLint baseFormat;
    GLfloat rScale = 1.0, gScale = 1.0, bScale = 1.0, aScale = 1.0;
    GLfloat rBias  = 0.0, gBias  = 0.0, bBias  = 0.0, aBias  = 0.0;
-   GLenum tableType = CHAN_TYPE;
    GLint comps;
    ASSERT_OUTSIDE_BEGIN_END_AND_FLUSH(ctx); /* too complex */
 
@@ -367,11 +348,9 @@ _mesa_ColorTable( GLenum target, GLenum internalFormat,
          break;
       case GL_SHARED_TEXTURE_PALETTE_EXT:
          table = &ctx->Texture.Palette;
-        tableType = GL_FLOAT;
          break;
       case GL_COLOR_TABLE:
          table = &ctx->ColorTable;
-        tableType = GL_FLOAT;
          rScale = ctx->Pixel.ColorTableScale[0];
          gScale = ctx->Pixel.ColorTableScale[1];
          bScale = ctx->Pixel.ColorTableScale[2];
@@ -391,7 +370,6 @@ _mesa_ColorTable( GLenum target, GLenum internalFormat,
             return;
          }
          table = &(texUnit->ColorTable);
-        tableType = GL_FLOAT;
          rScale = ctx->Pixel.TextureColorTableScale[0];
          gScale = ctx->Pixel.TextureColorTableScale[1];
          bScale = ctx->Pixel.TextureColorTableScale[2];
@@ -407,12 +385,10 @@ _mesa_ColorTable( GLenum target, GLenum internalFormat,
             return;
          }
          table = &(texUnit->ProxyColorTable);
-        tableType = GL_FLOAT;
          proxy = GL_TRUE;
          break;
       case GL_POST_CONVOLUTION_COLOR_TABLE:
          table = &ctx->PostConvolutionColorTable;
-        tableType = GL_FLOAT;
          rScale = ctx->Pixel.PCCTscale[0];
          gScale = ctx->Pixel.PCCTscale[1];
          bScale = ctx->Pixel.PCCTscale[2];
@@ -424,12 +400,10 @@ _mesa_ColorTable( GLenum target, GLenum internalFormat,
          break;
       case GL_PROXY_POST_CONVOLUTION_COLOR_TABLE:
          table = &ctx->ProxyPostConvolutionColorTable;
-        tableType = GL_FLOAT;
          proxy = GL_TRUE;
          break;
       case GL_POST_COLOR_MATRIX_COLOR_TABLE:
          table = &ctx->PostColorMatrixColorTable;
-        tableType = GL_FLOAT;
          rScale = ctx->Pixel.PCMCTscale[0];
          gScale = ctx->Pixel.PCMCTscale[1];
          bScale = ctx->Pixel.PCMCTscale[2];
@@ -441,7 +415,6 @@ _mesa_ColorTable( GLenum target, GLenum internalFormat,
          break;
       case GL_PROXY_POST_COLOR_MATRIX_COLOR_TABLE:
          table = &ctx->ProxyPostColorMatrixColorTable;
-        tableType = GL_FLOAT;
          proxy = GL_TRUE;
          break;
       default:
@@ -491,27 +464,18 @@ _mesa_ColorTable( GLenum target, GLenum internalFormat,
    table->Size = width;
    table->InternalFormat = internalFormat;
    table->_BaseFormat = (GLenum) baseFormat;
-   table->Type = (tableType == GL_FLOAT) ? GL_FLOAT : CHAN_TYPE;
 
    comps = _mesa_components_in_format(table->_BaseFormat);
    assert(comps > 0);  /* error should have been caught sooner */
 
    if (!proxy) {
-      /* free old table, if any */
-      if (table->Table) {
-         FREE(table->Table);
-         table->Table = NULL;
-      }
+      _mesa_free_colortable_data(table);
 
       if (width > 0) {
-         if (table->Type == GL_FLOAT) {
-           table->Table = MALLOC(comps * width * sizeof(GLfloat));
-        }
-        else {
-            table->Table = MALLOC(comps * width * sizeof(GLchan));
-        }
+         table->TableF = _mesa_malloc(comps * width * sizeof(GLfloat));
+         table->TableUB = _mesa_malloc(comps * width * sizeof(GLubyte));
 
-        if (!table->Table) {
+        if (!table->TableF || !table->TableUB) {
            _mesa_error(ctx, GL_OUT_OF_MEMORY, "glColorTable");
            return;
         }
@@ -652,8 +616,8 @@ _mesa_ColorSubTable( GLenum target, GLsizei start,
       return;
    }
 
-   if (!table->Table) {
-      _mesa_error(ctx, GL_OUT_OF_MEMORY, "glColorSubTable");
+   if (!table->TableF || !table->TableUB) {
+      /* a GL_OUT_OF_MEMORY error would have been recorded previously */
       return;
    }
 
@@ -708,7 +672,7 @@ _mesa_GetColorTable( GLenum target, GLenum format,
    GET_CURRENT_CONTEXT(ctx);
    struct gl_texture_unit *texUnit = &ctx->Texture.Unit[ctx->Texture.CurrentUnit];
    struct gl_color_table *table = NULL;
-   GLchan rgba[MAX_COLOR_TABLE_SIZE][4];
+   GLfloat rgba[MAX_COLOR_TABLE_SIZE][4];
    ASSERT_OUTSIDE_BEGIN_END_AND_FLUSH(ctx);
 
    if (ctx->NewState) {
@@ -759,177 +723,67 @@ _mesa_GetColorTable( GLenum target, GLenum format,
    ASSERT(table);
 
    switch (table->_BaseFormat) {
-      case GL_ALPHA:
-         if (table->Type == GL_FLOAT) {
-            const GLfloat *tableF = (const GLfloat *) table->Table;
-            GLuint i;
-            for (i = 0; i < table->Size; i++) {
-               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 {
-            const GLchan *tableUB = (const GLchan *) table->Table;
-            GLuint i;
-            for (i = 0; i < table->Size; i++) {
-               rgba[i][RCOMP] = 0;
-               rgba[i][GCOMP] = 0;
-               rgba[i][BCOMP] = 0;
-               rgba[i][ACOMP] = tableUB[i];
-            }
-         }
-         break;
-      case GL_LUMINANCE:
-         if (table->Type == GL_FLOAT) {
-            const GLfloat *tableF = (const GLfloat *) table->Table;
-            GLuint i;
-            for (i = 0; i < table->Size; i++) {
-#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] =
-               rgba[i][GCOMP] =
-               rgba[i][BCOMP] = tableUB[i];
-               rgba[i][ACOMP] = CHAN_MAX;
-            }
-         }
-         break;
-      case GL_LUMINANCE_ALPHA:
-         if (table->Type == GL_FLOAT) {
-            const GLfloat *tableF = (const GLfloat *) table->Table;
-            GLuint i;
-            for (i = 0; i < table->Size; i++) {
-#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] =
-               rgba[i][GCOMP] =
-               rgba[i][BCOMP] = tableUB[i*2+0];
-               rgba[i][ACOMP] = tableUB[i*2+1];
-            }
+   case GL_ALPHA:
+      {
+         GLuint i;
+         for (i = 0; i < table->Size; i++) {
+            rgba[i][RCOMP] = 0;
+            rgba[i][GCOMP] = 0;
+            rgba[i][BCOMP] = 0;
+            rgba[i][ACOMP] = table->TableF[i];
          }
-         break;
-      case GL_INTENSITY:
-         if (table->Type == GL_FLOAT) {
-            const GLfloat *tableF = (const GLfloat *) table->Table;
-            GLuint i;
-            for (i = 0; i < table->Size; i++) {
-#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] =
-               rgba[i][GCOMP] =
-               rgba[i][BCOMP] =
-               rgba[i][ACOMP] = tableUB[i];
-            }
-         }
-         break;
-      case GL_RGB:
-         if (table->Type == GL_FLOAT) {
-            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
-            }
+      }
+      break;
+   case GL_LUMINANCE:
+      {
+         GLuint i;
+         for (i = 0; i < table->Size; i++) {
+            rgba[i][RCOMP] =
+            rgba[i][GCOMP] =
+            rgba[i][BCOMP] = table->TableF[i];
+            rgba[i][ACOMP] = 1.0F;
          }
-         else {
-            const GLchan *tableUB = (const GLchan *) table->Table;
-            GLuint i;
-            for (i = 0; i < table->Size; i++) {
-               rgba[i][RCOMP] = tableUB[i*3+0];
-               rgba[i][GCOMP] = tableUB[i*3+1];
-               rgba[i][BCOMP] = tableUB[i*3+2];
-               rgba[i][ACOMP] = CHAN_MAX;
-            }
+      }
+      break;
+   case GL_LUMINANCE_ALPHA:
+      {
+         GLuint i;
+         for (i = 0; i < table->Size; i++) {
+            rgba[i][RCOMP] =
+            rgba[i][GCOMP] =
+            rgba[i][BCOMP] = table->TableF[i*2+0];
+            rgba[i][ACOMP] = table->TableF[i*2+1];
          }
-         break;
-      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);
-               rgba[i][GCOMP] = IROUND_POS(tableF[i*4+1] * CHAN_MAXF);
-               rgba[i][BCOMP] = IROUND_POS(tableF[i*4+2] * CHAN_MAXF);
-               rgba[i][ACOMP] = IROUND_POS(tableF[i*4+3] * CHAN_MAXF);
-            }
-#endif
+      }
+      break;
+   case GL_INTENSITY:
+      {
+         GLuint i;
+         for (i = 0; i < table->Size; i++) {
+            rgba[i][RCOMP] =
+            rgba[i][GCOMP] =
+            rgba[i][BCOMP] =
+            rgba[i][ACOMP] = table->TableF[i];
          }
-         else {
-            const GLchan *tableUB = (const GLchan *) table->Table;
-            GLuint i;
-            for (i = 0; i < table->Size; i++) {
-               rgba[i][RCOMP] = tableUB[i*4+0];
-               rgba[i][GCOMP] = tableUB[i*4+1];
-               rgba[i][BCOMP] = tableUB[i*4+2];
-               rgba[i][ACOMP] = tableUB[i*4+3];
-            }
+      }
+      break;
+   case GL_RGB:
+      {
+         GLuint i;
+         for (i = 0; i < table->Size; i++) {
+            rgba[i][RCOMP] = table->TableF[i*3+0];
+            rgba[i][GCOMP] = table->TableF[i*3+1];
+            rgba[i][BCOMP] = table->TableF[i*3+2];
+            rgba[i][ACOMP] = 1.0F;
          }
-         break;
-      default:
-         _mesa_problem(ctx, "bad table format in glGetColorTable");
-         return;
+      }
+      break;
+   case GL_RGBA:
+      _mesa_memcpy(rgba, table->TableF, 4 * table->Size * sizeof(GLfloat));
+      break;
+   default:
+      _mesa_problem(ctx, "bad table format in glGetColorTable");
+      return;
    }
 
    if (ctx->Pack.BufferObj->Name) {
@@ -953,7 +807,7 @@ _mesa_GetColorTable( GLenum target, GLenum format,
       data = ADD_POINTERS(buf, data);
    }
 
-   _mesa_pack_rgba_span_chan(ctx, table->Size, (const GLchan (*)[4]) rgba,
+   _mesa_pack_rgba_span_float(ctx, table->Size, (const GLfloat (*)[4]) rgba,
                         format, type, data, &ctx->Pack, GL_FALSE);
 
    if (ctx->Pack.BufferObj->Name) {
@@ -1434,8 +1288,8 @@ _mesa_GetColorTableParameteriv( GLenum target, GLenum pname, GLint *params )
 void
 _mesa_init_colortable( struct gl_color_table *p )
 {
-   p->Type = CHAN_TYPE;
-   p->Table = NULL;
+   p->TableF = NULL;
+   p->TableUB = NULL;
    p->Size = 0;
    p->InternalFormat = GL_RGBA;
 }
@@ -1445,9 +1299,13 @@ _mesa_init_colortable( struct gl_color_table *p )
 void
 _mesa_free_colortable_data( struct gl_color_table *p )
 {
-   if (p->Table) {
-      FREE(p->Table);
-      p->Table = NULL;
+   if (p->TableF) {
+      _mesa_free(p->TableF);
+      p->TableF = NULL;
+   }
+   if (p->TableUB) {
+      _mesa_free(p->TableUB);
+      p->TableUB = NULL;
    }
 }
 
@@ -1455,7 +1313,8 @@ _mesa_free_colortable_data( struct gl_color_table *p )
 /*
  * Initialize all colortables for a context.
  */
-void _mesa_init_colortables( GLcontext * ctx )
+void
+_mesa_init_colortables( GLcontext * ctx )
 {
    /* Color tables */
    _mesa_init_colortable(&ctx->ColorTable);
@@ -1470,7 +1329,8 @@ void _mesa_init_colortables( GLcontext * ctx )
 /*
  * Free all colortable data for a context
  */
-void _mesa_free_colortables_data( GLcontext *ctx )
+void
+_mesa_free_colortables_data( GLcontext *ctx )
 {
    _mesa_free_colortable_data(&ctx->ColorTable);
    _mesa_free_colortable_data(&ctx->ProxyColorTable);
index 4bd16210a0bb7644b823f209422beba407a4c0bd..b6ff737a65fefe13c8c0f644e75dbaaed7d98c20 100644 (file)
@@ -1,18 +1,8 @@
-/**
- * \file colortab.h
- * Color tables.
- * 
- * \if subset
- * (No-op)
- *
- * \endif
- */
-
 /*
  * Mesa 3-D graphics library
- * Version:  3.5
+ * Version:  6.5.2
  *
- * Copyright (C) 1999-2001  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"),
index 799e647731a75c8c566e76a4e0fa28cb7d837b9f..b7ab0bc36f5f24e137e6af953538cef62f8e93d8 100644 (file)
@@ -392,9 +392,9 @@ struct gl_color_table
 {
    GLenum InternalFormat;      /**< The user-specified format */
    GLenum _BaseFormat;         /**< GL_ALPHA, GL_RGBA, GL_RGB, etc */
-   GLuint Size;           /**< number of entries (rows) in table */
-   GLvoid *Table;         /**< points to data of <Type> */
-   GLenum Type;           /**< GL_UNSIGNED_BYTE or GL_FLOAT */
+   GLuint Size;                /**< number of entries in table */
+   GLfloat *TableF;            /**< Color table, floating point values */
+   GLubyte *TableUB;           /**< Color table, ubyte values */
    GLubyte RedSize;
    GLubyte GreenSize;
    GLubyte BlueSize;
index 10013bb50decd846902c3ea15cfb1f16b7ee0560..e0a9084326048d660fb2cbe30183fd50a41275d3 100644 (file)
@@ -1171,200 +1171,88 @@ void
 _mesa_lookup_rgba_float(const struct gl_color_table *table,
                         GLuint n, GLfloat rgba[][4])
 {
-   if (!table->Table || table->Size == 0)
+   const GLint max = table->Size - 1;
+   const GLfloat scale = (GLfloat) max;
+   const GLfloat *lut = table->TableF;
+   GLuint i;
+
+   if (!table->TableF || table->Size == 0)
       return;
 
    switch (table->_BaseFormat) {
       case GL_INTENSITY:
          /* replace RGBA with I */
-         if (table->Type == GL_FLOAT) {
-            const GLint max = table->Size - 1;
-            const GLfloat scale = (GLfloat) max;
-            const GLfloat *lut = (const GLfloat *) table->Table;
-            GLuint i;
-            for (i = 0; i < n; i++) {
-               GLint j = IROUND(rgba[i][RCOMP] * scale);
-               GLfloat c = lut[CLAMP(j, 0, max)];
-               rgba[i][RCOMP] = rgba[i][GCOMP] =
-                  rgba[i][BCOMP] = rgba[i][ACOMP] = c;
-            }
-         }
-         else {
-            const GLint max = table->Size - 1;
-            const GLfloat scale = (GLfloat) max;
-            const GLchan *lut = (const GLchan *) table->Table;
-            GLuint i;
-            for (i = 0; i < n; i++) {
-               GLint j = IROUND(rgba[i][RCOMP] * scale);
-               GLfloat c = CHAN_TO_FLOAT(lut[CLAMP(j, 0, max)]);
-               rgba[i][RCOMP] = rgba[i][GCOMP] =
-                  rgba[i][BCOMP] = rgba[i][ACOMP] = c;
-            }
+         for (i = 0; i < n; i++) {
+            GLint j = IROUND(rgba[i][RCOMP] * scale);
+            GLfloat c = lut[CLAMP(j, 0, max)];
+            rgba[i][RCOMP] =
+            rgba[i][GCOMP] =
+            rgba[i][BCOMP] =
+            rgba[i][ACOMP] = c;
          }
          break;
       case GL_LUMINANCE:
          /* replace RGB with L */
-         if (table->Type == GL_FLOAT) {
-            const GLint max = table->Size - 1;
-            const GLfloat scale = (GLfloat) max;
-            const GLfloat *lut = (const GLfloat *) table->Table;
-            GLuint i;
-            for (i = 0; i < n; i++) {
-               GLint j = IROUND(rgba[i][RCOMP] * scale);
-               GLfloat c = lut[CLAMP(j, 0, max)];
-               rgba[i][RCOMP] = rgba[i][GCOMP] = rgba[i][BCOMP] = c;
-            }
-         }
-         else {
-            const GLint max = table->Size - 1;
-            const GLfloat scale = (GLfloat) max;
-            const GLchan *lut = (const GLchan *) table->Table;
-            GLuint i;
-            for (i = 0; i < n; i++) {
-               GLint j = IROUND(rgba[i][RCOMP] * scale);
-               GLfloat c = CHAN_TO_FLOAT(lut[CLAMP(j, 0, max)]);
-               rgba[i][RCOMP] = rgba[i][GCOMP] = rgba[i][BCOMP] = c;
-            }
+         for (i = 0; i < n; i++) {
+            GLint j = IROUND(rgba[i][RCOMP] * scale);
+            GLfloat c = lut[CLAMP(j, 0, max)];
+            rgba[i][RCOMP] =
+            rgba[i][GCOMP] =
+            rgba[i][BCOMP] = c;
          }
          break;
       case GL_ALPHA:
          /* replace A with A */
-         if (table->Type == GL_FLOAT) {
-            const GLint max = table->Size - 1;
-            const GLfloat scale = (GLfloat) max;
-            const GLfloat *lut = (const GLfloat *) table->Table;
-            GLuint i;
-            for (i = 0; i < n; i++) {
-               GLint j = IROUND(rgba[i][ACOMP] * scale);
-               rgba[i][ACOMP] = lut[CLAMP(j, 0, max)];
-            }
-         }
-         else {
-            const GLint max = table->Size - 1;
-            const GLfloat scale = (GLfloat) max;
-            const GLchan *lut = (const GLchan *) table->Table;
-            GLuint i;
-            for (i = 0; i < n; i++) {
-               GLint j = IROUND(rgba[i][ACOMP] * scale);
-               rgba[i][ACOMP] = CHAN_TO_FLOAT(lut[CLAMP(j, 0, max)]);
-            }
+         for (i = 0; i < n; i++) {
+            GLint j = IROUND(rgba[i][ACOMP] * scale);
+            rgba[i][ACOMP] = lut[CLAMP(j, 0, max)];
          }
          break;
       case GL_LUMINANCE_ALPHA:
          /* replace RGBA with LLLA */
-         if (table->Type == GL_FLOAT) {
-            const GLint max = table->Size - 1;
-            const GLfloat scale = (GLfloat) max;
-            const GLfloat *lut = (const GLfloat *) table->Table;
-            GLuint i;
-            for (i = 0; i < n; i++) {
-               GLint jL = IROUND(rgba[i][RCOMP] * scale);
-               GLint jA = IROUND(rgba[i][ACOMP] * scale);
-               GLfloat luminance, alpha;
-               jL = CLAMP(jL, 0, max);
-               jA = CLAMP(jA, 0, max);
-               luminance = lut[jL * 2 + 0];
-               alpha     = lut[jA * 2 + 1];
-               rgba[i][RCOMP] = rgba[i][GCOMP] = rgba[i][BCOMP] = luminance;
-               rgba[i][ACOMP] = alpha;;
-            }
-         }
-         else {
-            const GLint max = table->Size - 1;
-            const GLfloat scale = (GLfloat) max;
-            const GLchan *lut = (const GLchan *) table->Table;
-            GLuint i;
-            for (i = 0; i < n; i++) {
-               GLint jL = IROUND(rgba[i][RCOMP] * scale);
-               GLint jA = IROUND(rgba[i][ACOMP] * scale);
-               GLfloat luminance, alpha;
-               jL = CLAMP(jL, 0, max);
-               jA = CLAMP(jA, 0, max);
-               luminance = CHAN_TO_FLOAT(lut[jL * 2 + 0]);
-               alpha     = CHAN_TO_FLOAT(lut[jA * 2 + 1]);
-               rgba[i][RCOMP] = rgba[i][GCOMP] = rgba[i][BCOMP] = luminance;
-               rgba[i][ACOMP] = alpha;;
-            }
+         for (i = 0; i < n; i++) {
+            GLint jL = IROUND(rgba[i][RCOMP] * scale);
+            GLint jA = IROUND(rgba[i][ACOMP] * scale);
+            GLfloat luminance, alpha;
+            jL = CLAMP(jL, 0, max);
+            jA = CLAMP(jA, 0, max);
+            luminance = lut[jL * 2 + 0];
+            alpha     = lut[jA * 2 + 1];
+            rgba[i][RCOMP] =
+            rgba[i][GCOMP] =
+            rgba[i][BCOMP] = luminance;
+            rgba[i][ACOMP] = alpha;;
          }
          break;
       case GL_RGB:
          /* replace RGB with RGB */
-         if (table->Type == GL_FLOAT) {
-            const GLint max = table->Size - 1;
-            const GLfloat scale = (GLfloat) max;
-            const GLfloat *lut = (const GLfloat *) table->Table;
-            GLuint i;
-            for (i = 0; i < n; i++) {
-               GLint jR = IROUND(rgba[i][RCOMP] * scale);
-               GLint jG = IROUND(rgba[i][GCOMP] * scale);
-               GLint jB = IROUND(rgba[i][BCOMP] * scale);
-               jR = CLAMP(jR, 0, max);
-               jG = CLAMP(jG, 0, max);
-               jB = CLAMP(jB, 0, max);
-               rgba[i][RCOMP] = lut[jR * 3 + 0];
-               rgba[i][GCOMP] = lut[jG * 3 + 1];
-               rgba[i][BCOMP] = lut[jB * 3 + 2];
-            }
-         }
-         else {
-            const GLint max = table->Size - 1;
-            const GLfloat scale = (GLfloat) max;
-            const GLchan *lut = (const GLchan *) table->Table;
-            GLuint i;
-            for (i = 0; i < n; i++) {
-               GLint jR = IROUND(rgba[i][RCOMP] * scale);
-               GLint jG = IROUND(rgba[i][GCOMP] * scale);
-               GLint jB = IROUND(rgba[i][BCOMP] * scale);
-               jR = CLAMP(jR, 0, max);
-               jG = CLAMP(jG, 0, max);
-               jB = CLAMP(jB, 0, max);
-               rgba[i][RCOMP] = CHAN_TO_FLOAT(lut[jR * 3 + 0]);
-               rgba[i][GCOMP] = CHAN_TO_FLOAT(lut[jG * 3 + 1]);
-               rgba[i][BCOMP] = CHAN_TO_FLOAT(lut[jB * 3 + 2]);
-            }
+         for (i = 0; i < n; i++) {
+            GLint jR = IROUND(rgba[i][RCOMP] * scale);
+            GLint jG = IROUND(rgba[i][GCOMP] * scale);
+            GLint jB = IROUND(rgba[i][BCOMP] * scale);
+            jR = CLAMP(jR, 0, max);
+            jG = CLAMP(jG, 0, max);
+            jB = CLAMP(jB, 0, max);
+            rgba[i][RCOMP] = lut[jR * 3 + 0];
+            rgba[i][GCOMP] = lut[jG * 3 + 1];
+            rgba[i][BCOMP] = lut[jB * 3 + 2];
          }
          break;
       case GL_RGBA:
          /* replace RGBA with RGBA */
-         if (table->Type == GL_FLOAT) {
-            const GLint max = table->Size - 1;
-            const GLfloat scale = (GLfloat) max;
-            const GLfloat *lut = (const GLfloat *) table->Table;
-            GLuint i;
-            for (i = 0; i < n; i++) {
-               GLint jR = IROUND(rgba[i][RCOMP] * scale);
-               GLint jG = IROUND(rgba[i][GCOMP] * scale);
-               GLint jB = IROUND(rgba[i][BCOMP] * scale);
-               GLint jA = IROUND(rgba[i][ACOMP] * scale);
-               jR = CLAMP(jR, 0, max);
-               jG = CLAMP(jG, 0, max);
-               jB = CLAMP(jB, 0, max);
-               jA = CLAMP(jA, 0, max);
-               rgba[i][RCOMP] = lut[jR * 4 + 0];
-               rgba[i][GCOMP] = lut[jG * 4 + 1];
-               rgba[i][BCOMP] = lut[jB * 4 + 2];
-               rgba[i][ACOMP] = lut[jA * 4 + 3];
-            }
-         }
-         else {
-            const GLint max = table->Size - 1;
-            const GLfloat scale = (GLfloat) max;
-            const GLchan *lut = (const GLchan *) table->Table;
-            GLuint i;
-            for (i = 0; i < n; i++) {
-               GLint jR = IROUND(rgba[i][RCOMP] * scale);
-               GLint jG = IROUND(rgba[i][GCOMP] * scale);
-               GLint jB = IROUND(rgba[i][BCOMP] * scale);
-               GLint jA = IROUND(rgba[i][ACOMP] * scale);
-               jR = CLAMP(jR, 0, max);
-               jG = CLAMP(jG, 0, max);
-               jB = CLAMP(jB, 0, max);
-               jA = CLAMP(jA, 0, max);
-               rgba[i][RCOMP] = CHAN_TO_FLOAT(lut[jR * 4 + 0]);
-               rgba[i][GCOMP] = CHAN_TO_FLOAT(lut[jG * 4 + 1]);
-               rgba[i][BCOMP] = CHAN_TO_FLOAT(lut[jB * 4 + 2]);
-               rgba[i][ACOMP] = CHAN_TO_FLOAT(lut[jA * 4 + 3]);
-            }
+         for (i = 0; i < n; i++) {
+            GLint jR = IROUND(rgba[i][RCOMP] * scale);
+            GLint jG = IROUND(rgba[i][GCOMP] * scale);
+            GLint jB = IROUND(rgba[i][BCOMP] * scale);
+            GLint jA = IROUND(rgba[i][ACOMP] * scale);
+            jR = CLAMP(jR, 0, max);
+            jG = CLAMP(jG, 0, max);
+            jB = CLAMP(jB, 0, max);
+            jA = CLAMP(jA, 0, max);
+            rgba[i][RCOMP] = lut[jR * 4 + 0];
+            rgba[i][GCOMP] = lut[jG * 4 + 1];
+            rgba[i][BCOMP] = lut[jB * 4 + 2];
+            rgba[i][ACOMP] = lut[jA * 4 + 3];
          }
          break;
       default:
@@ -1376,271 +1264,143 @@ _mesa_lookup_rgba_float(const struct gl_color_table *table,
 
 
 /**
- * Apply a color table lookup to an array of GLchan RGBA colors.
+ * Apply a color table lookup to an array of ubyte/RGBA colors.
  */
 void
-_mesa_lookup_rgba_chan(const struct gl_color_table *table,
-                       GLuint n, GLchan rgba[][4])
+_mesa_lookup_rgba_ubyte(const struct gl_color_table *table,
+                        GLuint n, GLubyte rgba[][4])
 {
-   if (!table->Table || table->Size == 0)
+   const GLubyte *lut = table->TableUB;
+   const GLfloat scale = (GLfloat) (table->Size - 1) / 255.0;
+   GLuint i;
+
+   if (!table->TableUB || table->Size == 0)
       return;
 
    switch (table->_BaseFormat) {
-      case GL_INTENSITY:
-         /* replace RGBA with I */
-         if (table->Type == GL_FLOAT) {
-            const GLfloat scale = (GLfloat) (table->Size - 1) / CHAN_MAXF;
-            const GLfloat *lut = (const GLfloat *) table->Table;
-            GLuint i;
-            for (i = 0; i < n; i++) {
-               GLint j = IROUND((GLfloat) rgba[i][RCOMP] * scale);
-               GLchan c;
-               CLAMPED_FLOAT_TO_CHAN(c, lut[j]);
-               rgba[i][RCOMP] = rgba[i][GCOMP] =
-                  rgba[i][BCOMP] = rgba[i][ACOMP] = c;
-            }
+   case GL_INTENSITY:
+      /* replace RGBA with I */
+      if (table->Size == 256) {
+         for (i = 0; i < n; i++) {
+            const GLubyte c = lut[rgba[i][RCOMP]];
+            rgba[i][RCOMP] =
+            rgba[i][GCOMP] =
+            rgba[i][BCOMP] =
+            rgba[i][ACOMP] = c;
          }
-         else {
-#if CHAN_TYPE == GL_UNSIGNED_BYTE
-            if (table->Size == 256) {
-               /* common case */
-               const GLchan *lut = (const GLchan *) table->Table;
-               GLuint i;
-               for (i = 0; i < n; i++) {
-                  const GLchan c = lut[rgba[i][RCOMP]];
-                  rgba[i][RCOMP] = rgba[i][GCOMP] =
-                     rgba[i][BCOMP] = rgba[i][ACOMP] = c;
-               }
-            }
-            else
-#endif
-            {
-               const GLfloat scale = (GLfloat) (table->Size - 1) / CHAN_MAXF;
-               const GLchan *lut = (const GLchan *) table->Table;
-               GLuint i;
-               for (i = 0; i < n; i++) {
-                  GLint j = IROUND((GLfloat) rgba[i][RCOMP] * scale);
-                  rgba[i][RCOMP] = rgba[i][GCOMP] =
-                     rgba[i][BCOMP] = rgba[i][ACOMP] = lut[j];
-               }
-            }
+      }
+      else {
+         for (i = 0; i < n; i++) {
+            GLint j = IROUND((GLfloat) rgba[i][RCOMP] * scale);
+            rgba[i][RCOMP] =
+            rgba[i][GCOMP] =
+            rgba[i][BCOMP] =
+            rgba[i][ACOMP] = lut[j];
          }
-         break;
-      case GL_LUMINANCE:
-         /* replace RGB with L */
-         if (table->Type == GL_FLOAT) {
-            const GLfloat scale = (GLfloat) (table->Size - 1) / CHAN_MAXF;
-            const GLfloat *lut = (const GLfloat *) table->Table;
-            GLuint i;
-            for (i = 0; i < n; i++) {
-               GLint j = IROUND((GLfloat) rgba[i][RCOMP] * scale);
-               GLchan c;
-               CLAMPED_FLOAT_TO_CHAN(c, lut[j]);
-               rgba[i][RCOMP] = rgba[i][GCOMP] = rgba[i][BCOMP] = c;
-            }
+      }
+      break;
+   case GL_LUMINANCE:
+      /* replace RGB with L */
+      if (table->Size == 256) {
+         for (i = 0; i < n; i++) {
+            const GLubyte c = lut[rgba[i][RCOMP]];
+            rgba[i][RCOMP] =
+            rgba[i][GCOMP] =
+            rgba[i][BCOMP] = c;
          }
-         else {
-#if CHAN_TYPE == GL_UNSIGNED_BYTE
-            if (table->Size == 256) {
-               /* common case */
-               const GLchan *lut = (const GLchan *) table->Table;
-               GLuint i;
-               for (i = 0; i < n; i++) {
-                  const GLchan c = lut[rgba[i][RCOMP]];
-                  rgba[i][RCOMP] = rgba[i][GCOMP] = rgba[i][BCOMP] = c;
-               }
-            }
-            else
-#endif
-            {
-               const GLfloat scale = (GLfloat) (table->Size - 1) / CHAN_MAXF;
-               const GLchan *lut = (const GLchan *) table->Table;
-               GLuint i;
-               for (i = 0; i < n; i++) {
-                  GLint j = IROUND((GLfloat) rgba[i][RCOMP] * scale);
-                  rgba[i][RCOMP] = rgba[i][GCOMP] = rgba[i][BCOMP] = lut[j];
-               }
-            }
+      }
+      else {
+         for (i = 0; i < n; i++) {
+            GLint j = IROUND((GLfloat) rgba[i][RCOMP] * scale);
+            rgba[i][RCOMP] =
+            rgba[i][GCOMP] =
+            rgba[i][BCOMP] = lut[j];
          }
-         break;
-      case GL_ALPHA:
-         /* replace A with A */
-         if (table->Type == GL_FLOAT) {
-            const GLfloat scale = (GLfloat) (table->Size - 1) / CHAN_MAXF;
-            const GLfloat *lut = (const GLfloat *) table->Table;
-            GLuint i;
-            for (i = 0; i < n; i++) {
-               GLint j = IROUND((GLfloat) rgba[i][ACOMP] * scale);
-               GLchan c;
-               CLAMPED_FLOAT_TO_CHAN(c, lut[j]);
-               rgba[i][ACOMP] = c;
-            }
+      }
+      break;
+   case GL_ALPHA:
+      /* replace A with A */
+      if (table->Size == 256) {
+         for (i = 0; i < n; i++) {
+            rgba[i][ACOMP] = lut[rgba[i][ACOMP]];
          }
-         else {
-#if CHAN_TYPE == GL_UNSIGNED_BYTE
-            if (table->Size == 256) {
-               /* common case */
-               const GLchan *lut = (const GLchan *) table->Table;
-               GLuint i;
-               for (i = 0; i < n; i++) {
-                  rgba[i][ACOMP] = lut[rgba[i][ACOMP]];
-               }
-            }
-            else
-#endif
-            {
-               const GLfloat scale = (GLfloat) (table->Size - 1) / CHAN_MAXF;
-               const GLchan *lut = (const GLchan *) table->Table;
-               GLuint i;
-               for (i = 0; i < n; i++) {
-                  GLint j = IROUND((GLfloat) rgba[i][ACOMP] * scale);
-                  rgba[i][ACOMP] = lut[j];
-               }
-            }
+      }
+      else {
+         for (i = 0; i < n; i++) {
+            GLint j = IROUND((GLfloat) rgba[i][ACOMP] * scale);
+            rgba[i][ACOMP] = lut[j];
          }
-         break;
-      case GL_LUMINANCE_ALPHA:
-         /* replace RGBA with LLLA */
-         if (table->Type == GL_FLOAT) {
-            const GLfloat scale = (GLfloat) (table->Size - 1) / CHAN_MAXF;
-            const GLfloat *lut = (const GLfloat *) table->Table;
-            GLuint i;
-            for (i = 0; i < n; i++) {
-               GLint jL = IROUND((GLfloat) rgba[i][RCOMP] * scale);
-               GLint jA = IROUND((GLfloat) rgba[i][ACOMP] * scale);
-               GLchan luminance, alpha;
-               CLAMPED_FLOAT_TO_CHAN(luminance, lut[jL * 2 + 0]);
-               CLAMPED_FLOAT_TO_CHAN(alpha, lut[jA * 2 + 1]);
-               rgba[i][RCOMP] = rgba[i][GCOMP] = rgba[i][BCOMP] = luminance;
-               rgba[i][ACOMP] = alpha;;
-            }
+      }
+      break;
+   case GL_LUMINANCE_ALPHA:
+      /* replace RGBA with LLLA */
+      if (table->Size == 256) {
+         for (i = 0; i < n; i++) {
+            GLchan l = lut[rgba[i][RCOMP] * 2 + 0];
+            GLchan a = lut[rgba[i][ACOMP] * 2 + 1];;
+            rgba[i][RCOMP] =
+            rgba[i][GCOMP] =
+            rgba[i][BCOMP] = l;
+            rgba[i][ACOMP] = a;
          }
-         else {
-#if CHAN_TYPE == GL_UNSIGNED_BYTE
-            if (table->Size == 256) {
-               /* common case */
-               const GLchan *lut = (const GLchan *) table->Table;
-               GLuint i;
-               for (i = 0; i < n; i++) {
-                  GLchan l = lut[rgba[i][RCOMP] * 2 + 0];
-                  GLchan a = lut[rgba[i][ACOMP] * 2 + 1];;
-                  rgba[i][RCOMP] = rgba[i][GCOMP] = rgba[i][BCOMP] = l;
-                  rgba[i][ACOMP] = a;
-               }
-            }
-            else
-#endif
-            {
-               const GLfloat scale = (GLfloat) (table->Size - 1) / CHAN_MAXF;
-               const GLchan *lut = (const GLchan *) table->Table;
-               GLuint i;
-               for (i = 0; i < n; i++) {
-                  GLint jL = IROUND((GLfloat) rgba[i][RCOMP] * scale);
-                  GLint jA = IROUND((GLfloat) rgba[i][ACOMP] * scale);
-                  GLchan luminance = lut[jL * 2 + 0];
-                  GLchan alpha     = lut[jA * 2 + 1];
-                  rgba[i][RCOMP] = rgba[i][GCOMP] = rgba[i][BCOMP] = luminance;
-                  rgba[i][ACOMP] = alpha;
-               }
-            }
+      }
+      else {
+         for (i = 0; i < n; i++) {
+            GLint jL = IROUND((GLfloat) rgba[i][RCOMP] * scale);
+            GLint jA = IROUND((GLfloat) rgba[i][ACOMP] * scale);
+            GLchan luminance = lut[jL * 2 + 0];
+            GLchan alpha     = lut[jA * 2 + 1];
+            rgba[i][RCOMP] =
+            rgba[i][GCOMP] =
+            rgba[i][BCOMP] = luminance;
+            rgba[i][ACOMP] = alpha;
          }
-         break;
-      case GL_RGB:
-         /* replace RGB with RGB */
-         if (table->Type == GL_FLOAT) {
-            const GLfloat scale = (GLfloat) (table->Size - 1) / CHAN_MAXF;
-            const GLfloat *lut = (const GLfloat *) table->Table;
-            GLuint i;
-            for (i = 0; i < n; i++) {
-               GLint jR = IROUND((GLfloat) rgba[i][RCOMP] * scale);
-               GLint jG = IROUND((GLfloat) rgba[i][GCOMP] * scale);
-               GLint jB = IROUND((GLfloat) rgba[i][BCOMP] * scale);
-               CLAMPED_FLOAT_TO_CHAN(rgba[i][RCOMP], lut[jR * 3 + 0]);
-               CLAMPED_FLOAT_TO_CHAN(rgba[i][GCOMP], lut[jG * 3 + 1]);
-               CLAMPED_FLOAT_TO_CHAN(rgba[i][BCOMP], lut[jB * 3 + 2]);
-            }
+      }
+      break;
+   case GL_RGB:
+      if (table->Size == 256) {
+         for (i = 0; i < n; i++) {
+            rgba[i][RCOMP] = lut[rgba[i][RCOMP] * 3 + 0];
+            rgba[i][GCOMP] = lut[rgba[i][GCOMP] * 3 + 1];
+            rgba[i][BCOMP] = lut[rgba[i][BCOMP] * 3 + 2];
          }
-         else {
-#if CHAN_TYPE == GL_UNSIGNED_BYTE
-            if (table->Size == 256) {
-               /* common case */
-               const GLchan *lut = (const GLchan *) table->Table;
-               GLuint i;
-               for (i = 0; i < n; i++) {
-                  rgba[i][RCOMP] = lut[rgba[i][RCOMP] * 3 + 0];
-                  rgba[i][GCOMP] = lut[rgba[i][GCOMP] * 3 + 1];
-                  rgba[i][BCOMP] = lut[rgba[i][BCOMP] * 3 + 2];
-               }
-            }
-            else
-#endif
-            {
-               const GLfloat scale = (GLfloat) (table->Size - 1) / CHAN_MAXF;
-               const GLchan *lut = (const GLchan *) table->Table;
-               GLuint i;
-               for (i = 0; i < n; i++) {
-                  GLint jR = IROUND((GLfloat) rgba[i][RCOMP] * scale);
-                  GLint jG = IROUND((GLfloat) rgba[i][GCOMP] * scale);
-                  GLint jB = IROUND((GLfloat) rgba[i][BCOMP] * scale);
-                  rgba[i][RCOMP] = lut[jR * 3 + 0];
-                  rgba[i][GCOMP] = lut[jG * 3 + 1];
-                  rgba[i][BCOMP] = lut[jB * 3 + 2];
-               }
-            }
+      }
+      else {
+         for (i = 0; i < n; i++) {
+            GLint jR = IROUND((GLfloat) rgba[i][RCOMP] * scale);
+            GLint jG = IROUND((GLfloat) rgba[i][GCOMP] * scale);
+            GLint jB = IROUND((GLfloat) rgba[i][BCOMP] * scale);
+            rgba[i][RCOMP] = lut[jR * 3 + 0];
+            rgba[i][GCOMP] = lut[jG * 3 + 1];
+            rgba[i][BCOMP] = lut[jB * 3 + 2];
          }
-         break;
-      case GL_RGBA:
-         /* replace RGBA with RGBA */
-         if (table->Type == GL_FLOAT) {
-            const GLfloat scale = (GLfloat) (table->Size - 1) / CHAN_MAXF;
-            const GLfloat *lut = (const GLfloat *) table->Table;
-            GLuint i;
-            for (i = 0; i < n; i++) {
-               GLint jR = IROUND((GLfloat) rgba[i][RCOMP] * scale);
-               GLint jG = IROUND((GLfloat) rgba[i][GCOMP] * scale);
-               GLint jB = IROUND((GLfloat) rgba[i][BCOMP] * scale);
-               GLint jA = IROUND((GLfloat) rgba[i][ACOMP] * scale);
-               CLAMPED_FLOAT_TO_CHAN(rgba[i][RCOMP], lut[jR * 4 + 0]);
-               CLAMPED_FLOAT_TO_CHAN(rgba[i][GCOMP], lut[jG * 4 + 1]);
-               CLAMPED_FLOAT_TO_CHAN(rgba[i][BCOMP], lut[jB * 4 + 2]);
-               CLAMPED_FLOAT_TO_CHAN(rgba[i][ACOMP], lut[jA * 4 + 3]);
-            }
+      }
+      break;
+   case GL_RGBA:
+      if (table->Size == 256) {
+         for (i = 0; i < n; i++) {
+            rgba[i][RCOMP] = lut[rgba[i][RCOMP] * 4 + 0];
+            rgba[i][GCOMP] = lut[rgba[i][GCOMP] * 4 + 1];
+            rgba[i][BCOMP] = lut[rgba[i][BCOMP] * 4 + 2];
+            rgba[i][ACOMP] = lut[rgba[i][ACOMP] * 4 + 3];
          }
-         else {
-#if CHAN_TYPE == GL_UNSIGNED_BYTE
-            if (table->Size == 256) {
-               /* common case */
-               const GLchan *lut = (const GLchan *) table->Table;
-               GLuint i;
-               for (i = 0; i < n; i++) {
-                  rgba[i][RCOMP] = lut[rgba[i][RCOMP] * 4 + 0];
-                  rgba[i][GCOMP] = lut[rgba[i][GCOMP] * 4 + 1];
-                  rgba[i][BCOMP] = lut[rgba[i][BCOMP] * 4 + 2];
-                  rgba[i][ACOMP] = lut[rgba[i][ACOMP] * 4 + 3];
-               }
-            }
-            else
-#endif
-            {
-               const GLfloat scale = (GLfloat) (table->Size - 1) / CHAN_MAXF;
-               const GLfloat *lut = (const GLfloat *) table->Table;
-               GLuint i;
-               for (i = 0; i < n; i++) {
-                  GLint jR = IROUND((GLfloat) rgba[i][RCOMP] * scale);
-                  GLint jG = IROUND((GLfloat) rgba[i][GCOMP] * scale);
-                  GLint jB = IROUND((GLfloat) rgba[i][BCOMP] * scale);
-                  GLint jA = IROUND((GLfloat) rgba[i][ACOMP] * scale);
-                  CLAMPED_FLOAT_TO_CHAN(rgba[i][RCOMP], lut[jR * 4 + 0]);
-                  CLAMPED_FLOAT_TO_CHAN(rgba[i][GCOMP], lut[jG * 4 + 1]);
-                  CLAMPED_FLOAT_TO_CHAN(rgba[i][BCOMP], lut[jB * 4 + 2]);
-                  CLAMPED_FLOAT_TO_CHAN(rgba[i][ACOMP], lut[jA * 4 + 3]);
-               }
-            }
+      }
+      else {
+         for (i = 0; i < n; i++) {
+            GLint jR = IROUND((GLfloat) rgba[i][RCOMP] * scale);
+            GLint jG = IROUND((GLfloat) rgba[i][GCOMP] * scale);
+            GLint jB = IROUND((GLfloat) rgba[i][BCOMP] * scale);
+            GLint jA = IROUND((GLfloat) rgba[i][ACOMP] * scale);
+            CLAMPED_FLOAT_TO_CHAN(rgba[i][RCOMP], lut[jR * 4 + 0]);
+            CLAMPED_FLOAT_TO_CHAN(rgba[i][GCOMP], lut[jG * 4 + 1]);
+            CLAMPED_FLOAT_TO_CHAN(rgba[i][BCOMP], lut[jB * 4 + 2]);
+            CLAMPED_FLOAT_TO_CHAN(rgba[i][ACOMP], lut[jA * 4 + 3]);
          }
-         break;
-      default:
-         _mesa_problem(NULL, "Bad format in _mesa_lookup_rgba_chan");
-         return;
+      }
+      break;
+   default:
+      _mesa_problem(NULL, "Bad format in _mesa_lookup_rgba_chan");
+      return;
    }
 }
 
index 0445b527e83763cfebef02201401e53011c622fe..87f54ed8b3fbcc9bc79846ccd99fd727ddedcde0 100644 (file)
@@ -98,8 +98,8 @@ _mesa_lookup_rgba_float(const struct gl_color_table *table,
                         GLuint n, GLfloat rgba[][4]);
 
 extern void
-_mesa_lookup_rgba_chan(const struct gl_color_table *table,
-                       GLuint n, GLchan rgba[][4]);
+_mesa_lookup_rgba_ubyte(const struct gl_color_table *table,
+                        GLuint n, GLubyte rgba[][4]);
 
 
 extern void
index 0d3519188e2e151cc80ac907c3d5cd3363e74ada..99785da1a0a2f6206d2bcaa932a875f24ca78dfa 100644 (file)
@@ -1060,6 +1060,7 @@ static void FETCH(ci8)( const struct gl_texture_image *texImage,
 {
    const GLubyte *src = TEXEL_ADDR(GLubyte, texImage, i, j, k, 1);
    const struct gl_color_table *palette;
+   GLubyte texelUB[4];
    GLuint index;
    GET_CURRENT_CONTEXT(ctx);
 
@@ -1075,91 +1076,61 @@ static void FETCH(ci8)( const struct gl_texture_image *texImage,
    /* Mask the index against size of palette to avoid going out of bounds */
    index = (*src) & (palette->Size - 1);
 
-   if (palette->Type == GL_FLOAT) {
-      const GLfloat *ftable = (const GLfloat *) palette->Table;
+   {
+      const GLubyte *table = palette->TableUB;
       switch (palette->_BaseFormat) {
       case GL_ALPHA:
-         texel[RCOMP] =
-         texel[GCOMP] =
-         texel[BCOMP] = 0;
-         texel[ACOMP] = (GLchan) (ftable[index] * CHAN_MAX);
-         return;
+         texelUB[RCOMP] =
+         texelUB[GCOMP] =
+         texelUB[BCOMP] = 0;
+         texelUB[ACOMP] = table[index];
+         break;;
       case GL_LUMINANCE:
-         texel[RCOMP] =
-         texel[GCOMP] =
-         texel[BCOMP] = (GLchan) (ftable[index] * CHAN_MAX);
-         texel[ACOMP] = CHAN_MAX;
+         texelUB[RCOMP] =
+         texelUB[GCOMP] =
+         texelUB[BCOMP] = table[index];
+         texelUB[ACOMP] = 255;
          break;
       case GL_INTENSITY:
-         texel[RCOMP] =
-         texel[GCOMP] =
-         texel[BCOMP] =
-         texel[ACOMP] = ftable[index] * CHAN_MAX;
-         return;
+         texelUB[RCOMP] =
+         texelUB[GCOMP] =
+         texelUB[BCOMP] =
+         texelUB[ACOMP] = table[index];
+         break;;
       case GL_LUMINANCE_ALPHA:
-         texel[RCOMP] =
-         texel[GCOMP] =
-         texel[BCOMP] = (GLchan) (ftable[index * 2 + 0] * CHAN_MAX);
-         texel[ACOMP] = (GLchan) (ftable[index * 2 + 1] * CHAN_MAX);
-         return;
+         texelUB[RCOMP] =
+         texelUB[GCOMP] =
+         texelUB[BCOMP] = table[index * 2 + 0];
+         texelUB[ACOMP] = table[index * 2 + 1];
+         break;;
       case GL_RGB:
-         texel[RCOMP] = (GLchan) (ftable[index * 3 + 0] * CHAN_MAX);
-         texel[GCOMP] = (GLchan) (ftable[index * 3 + 1] * CHAN_MAX);
-         texel[BCOMP] = (GLchan) (ftable[index * 3 + 2] * CHAN_MAX);
-         texel[ACOMP] = CHAN_MAX;
-         return;
+         texelUB[RCOMP] = table[index * 3 + 0];
+         texelUB[GCOMP] = table[index * 3 + 1];
+         texelUB[BCOMP] = table[index * 3 + 2];
+         texelUB[ACOMP] = 255;
+         break;;
       case GL_RGBA:
-         texel[RCOMP] = (GLchan) (ftable[index * 4 + 0] * CHAN_MAX);
-         texel[GCOMP] = (GLchan) (ftable[index * 4 + 1] * CHAN_MAX);
-         texel[BCOMP] = (GLchan) (ftable[index * 4 + 2] * CHAN_MAX);
-         texel[ACOMP] = (GLchan) (ftable[index * 4 + 3] * CHAN_MAX);
-         return;
-      default:
-         _mesa_problem(ctx, "Bad palette format in fetch_texel_ci8");
-       }
-   }
-   else {
-      const GLchan *table = (const GLchan *) palette->Table;
-      switch (palette->_BaseFormat) {
-      case GL_ALPHA:
-         texel[RCOMP] =
-         texel[GCOMP] =
-         texel[BCOMP] = 0;
-         texel[ACOMP] = table[index];
-         return;
-      case GL_LUMINANCE:
-         texel[RCOMP] =
-         texel[GCOMP] =
-         texel[BCOMP] = table[index];
-         texel[ACOMP] = CHAN_MAX;
-         break;
-      case GL_INTENSITY:
-         texel[RCOMP] =
-         texel[GCOMP] =
-         texel[BCOMP] =
-         texel[ACOMP] = table[index];
-         return;
-      case GL_LUMINANCE_ALPHA:
-         texel[RCOMP] =
-         texel[GCOMP] =
-         texel[BCOMP] = table[index * 2 + 0];
-         texel[ACOMP] = table[index * 2 + 1];
-         return;
-      case GL_RGB:
-         texel[RCOMP] = table[index * 3 + 0];
-         texel[GCOMP] = table[index * 3 + 1];
-         texel[BCOMP] = table[index * 3 + 2];
-         texel[ACOMP] = CHAN_MAX;
-         return;
-      case GL_RGBA:
-         texel[RCOMP] = table[index * 4 + 0];
-         texel[GCOMP] = table[index * 4 + 1];
-         texel[BCOMP] = table[index * 4 + 2];
-         texel[ACOMP] = table[index * 4 + 3];
-         return;
+         texelUB[RCOMP] = table[index * 4 + 0];
+         texelUB[GCOMP] = table[index * 4 + 1];
+         texelUB[BCOMP] = table[index * 4 + 2];
+         texelUB[ACOMP] = table[index * 4 + 3];
+         break;;
       default:
          _mesa_problem(ctx, "Bad palette format in fetch_texel_ci8");
       }
+#if CHAN_TYPE == GL_UNSIGNED_BYTE
+      COPY_4UBV(texel, texelUB);
+#elif CHAN_TYPE == GL_UNSIGNED_SHORT
+      texel[0] = UBYTE_TO_USHORT(texelUB[0]);
+      texel[1] = UBYTE_TO_USHORT(texelUB[1]);
+      texel[2] = UBYTE_TO_USHORT(texelUB[2]);
+      texel[3] = UBYTE_TO_USHORT(texelUB[3]);
+#else
+      texel[0] = UBYTE_TO_FLOAT(texelUB[0]);
+      texel[1] = UBYTE_TO_FLOAT(texelUB[1]);
+      texel[2] = UBYTE_TO_FLOAT(texelUB[2]);
+      texel[3] = UBYTE_TO_FLOAT(texelUB[3]);
+#endif
    }
 }
 
index efa2ed3488ded23c20e919a560de16f55df896f9..2a3455f35e25f462c7c75cc38b6247dae9e04e18 100644 (file)
@@ -1132,7 +1132,13 @@ _swrast_texture_span( GLcontext *ctx, SWspan *span )
 
          /* GL_SGI_texture_color_table */
          if (texUnit->ColorTableEnabled) {
-            _mesa_lookup_rgba_chan(&texUnit->ColorTable, span->end, texels);
+#if CHAN_TYPE == GL_UNSIGNED_BYTE
+            _mesa_lookup_rgba_ubyte(&texUnit->ColorTable, span->end, texels);
+#elif CHAN_TYPE == GL_UNSIGNED_SHORT
+            _mesa_lookup_rgba_ubyte(&texUnit->ColorTable, span->end, texels);
+#else
+            _mesa_lookup_rgba_float(&texUnit->ColorTable, span->end, texels);
+#endif
          }
       }
    }