From e5a6fcc345867b550a159a7d94912a81e618279c Mon Sep 17 00:00:00 2001 From: Brian Paul Date: Fri, 13 Oct 2006 00:44:31 +0000 Subject: Revamp color table code. Always store all color tables as both float and ubyte. --- src/mesa/main/colortab.c | 328 ++++++++++++++--------------------------------- 1 file changed, 94 insertions(+), 234 deletions(-) (limited to 'src/mesa/main/colortab.c') 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); -- cgit v1.2.3