Revamp color table code.

Always store all color tables as both float and ubyte.
This commit is contained in:
Brian Paul 2006-10-13 00:44:31 +00:00
parent e392c92250
commit e5a6fcc345
9 changed files with 334 additions and 749 deletions

View 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++) {

View 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 );

View 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
}
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];
}
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:
{
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;
}
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
}
}
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];
}
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_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];
}
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
}
}
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;
}
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];
}
}
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
}
}
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_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
}
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;
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);

View 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"),

View 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;

View 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;
}
}

View 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

View 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
}
}

View 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
}
}
}