diff options
Diffstat (limited to 'src/mesa')
| -rw-r--r-- | src/mesa/drivers/dri/tdfx/tdfx_tex.c | 4 | ||||
| -rw-r--r-- | src/mesa/drivers/dri/unichrome/via_state.c | 8 | ||||
| -rw-r--r-- | src/mesa/main/colortab.c | 328 | ||||
| -rw-r--r-- | src/mesa/main/colortab.h | 14 | ||||
| -rw-r--r-- | src/mesa/main/mtypes.h | 6 | ||||
| -rw-r--r-- | src/mesa/main/pixel.c | 592 | ||||
| -rw-r--r-- | src/mesa/main/pixel.h | 4 | ||||
| -rw-r--r-- | src/mesa/main/texformat_tmp.h | 119 | ||||
| -rw-r--r-- | src/mesa/swrast/s_texcombine.c | 8 | 
9 files changed, 334 insertions, 749 deletions
| diff --git a/src/mesa/drivers/dri/tdfx/tdfx_tex.c b/src/mesa/drivers/dri/tdfx/tdfx_tex.c index f679345872..aefd1dd551 100644 --- a/src/mesa/drivers/dri/tdfx/tdfx_tex.c +++ b/src/mesa/drivers/dri/tdfx/tdfx_tex.c @@ -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++) { diff --git a/src/mesa/drivers/dri/unichrome/via_state.c b/src/mesa/drivers/dri/unichrome/via_state.c index 6a2a99df3b..e17442e9e6 100644 --- a/src/mesa/drivers/dri/unichrome/via_state.c +++ b/src/mesa/drivers/dri/unichrome/via_state.c @@ -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 ); diff --git a/src/mesa/main/colortab.c b/src/mesa/main/colortab.c index 8b6fc127fe..8d010a0499 100644 --- a/src/mesa/main/colortab.c +++ b/src/mesa/main/colortab.c @@ -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); diff --git a/src/mesa/main/colortab.h b/src/mesa/main/colortab.h index 4bd16210a0..b6ff737a65 100644 --- a/src/mesa/main/colortab.h +++ b/src/mesa/main/colortab.h @@ -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"), diff --git a/src/mesa/main/mtypes.h b/src/mesa/main/mtypes.h index 799e647731..b7ab0bc36f 100644 --- a/src/mesa/main/mtypes.h +++ b/src/mesa/main/mtypes.h @@ -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; diff --git a/src/mesa/main/pixel.c b/src/mesa/main/pixel.c index 10013bb50d..e0a9084326 100644 --- a/src/mesa/main/pixel.c +++ b/src/mesa/main/pixel.c @@ -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;     }  } diff --git a/src/mesa/main/pixel.h b/src/mesa/main/pixel.h index 0445b527e8..87f54ed8b3 100644 --- a/src/mesa/main/pixel.h +++ b/src/mesa/main/pixel.h @@ -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 diff --git a/src/mesa/main/texformat_tmp.h b/src/mesa/main/texformat_tmp.h index 0d3519188e..99785da1a0 100644 --- a/src/mesa/main/texformat_tmp.h +++ b/src/mesa/main/texformat_tmp.h @@ -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     }  } diff --git a/src/mesa/swrast/s_texcombine.c b/src/mesa/swrast/s_texcombine.c index efa2ed3488..2a3455f35e 100644 --- a/src/mesa/swrast/s_texcombine.c +++ b/src/mesa/swrast/s_texcombine.c @@ -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           }        }     } | 
