summaryrefslogtreecommitdiff
path: root/src/mesa/main/colortab.c
diff options
context:
space:
mode:
authorBrian Paul <brian.paul@tungstengraphics.com>2006-10-13 00:44:31 +0000
committerBrian Paul <brian.paul@tungstengraphics.com>2006-10-13 00:44:31 +0000
commite5a6fcc345867b550a159a7d94912a81e618279c (patch)
treedac93f846c871972ebc71269baa85f97e335f573 /src/mesa/main/colortab.c
parente392c92250bf91c7aaaeb78e7ec598f86f2a1d6d (diff)
Revamp color table code.
Always store all color tables as both float and ubyte.
Diffstat (limited to 'src/mesa/main/colortab.c')
-rw-r--r--src/mesa/main/colortab.c328
1 files changed, 94 insertions, 234 deletions
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);