X-Git-Url: https://git.libre-soc.org/?a=blobdiff_plain;f=src%2Fmesa%2Fmain%2Fcolortab.c;h=9fb0baf4a7c3e624148b189e268f503708f84195;hb=d0b5c77c68f45f9da5421248a064ece831923b0c;hp=3fdab6a27db69b1ea319f8c5fc4f94d77f123761;hpb=66f3231322c8c1c398cc95617813da5b4aa6bddc;p=mesa.git diff --git a/src/mesa/main/colortab.c b/src/mesa/main/colortab.c index 3fdab6a27db..9fb0baf4a7c 100644 --- a/src/mesa/main/colortab.c +++ b/src/mesa/main/colortab.c @@ -1,8 +1,8 @@ /* * Mesa 3-D graphics library - * Version: 6.3 + * Version: 6.5.2 * - * Copyright (C) 1999-2004 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,30 +92,16 @@ 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 = sizeof(GLubyte); - break; - case GL_UNSIGNED_SHORT: - sz = sizeof(GLushort); - break; - case GL_FLOAT: - sz = 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->Format) { + switch (table->_BaseFormat) { case GL_ALPHA: table->RedSize = 0; table->GreenSize = 0; @@ -195,7 +181,7 @@ store_colortable_entries(GLcontext *ctx, struct gl_color_table *table, if (ctx->Unpack.BufferObj->Name) { /* Get/unpack the color table data from a PBO */ GLubyte *buf; - if (!_mesa_validate_pbo_access(&ctx->Unpack, count, 1, 1, + if (!_mesa_validate_pbo_access(1, &ctx->Unpack, count, 1, 1, format, type, data)) { _mesa_error(ctx, GL_INVALID_OPERATION, "glColor[Sub]Table(bad PBO access)"); @@ -213,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; @@ -221,7 +207,7 @@ store_colortable_entries(GLcontext *ctx, struct gl_color_table *table, _mesa_unpack_color_span_float(ctx, count, /* number of pixels */ - table->Format, /* dest format */ + table->_BaseFormat, /* dest format */ tempTab, /* dest address */ format, type, /* src format/type */ data, /* src data */ @@ -229,10 +215,10 @@ 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->Format) { + switch (table->_BaseFormat) { case GL_INTENSITY: for (i = 0; i < count; i++) { GLuint j = start + i; @@ -280,16 +266,16 @@ store_colortable_entries(GLcontext *ctx, struct gl_color_table *table, return; } } - else { - /* non-float (GLchan) */ - const GLint comps = _mesa_components_in_format(table->Format); - GLchan *dest = (GLchan *) table->Table + start * comps; - _mesa_unpack_color_span_chan(ctx, count, /* number of entries */ - table->Format, /* dest format */ - dest, /* dest address */ - format, type, data, /* src data */ - &ctx->Unpack, - 0); /* transfer ops */ + + /* update the ubyte table */ + { + const GLint comps = _mesa_components_in_format(table->_BaseFormat); + 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) { @@ -313,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 */ @@ -366,7 +351,6 @@ _mesa_ColorTable( GLenum target, GLenum internalFormat, 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]; @@ -386,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]; @@ -406,7 +389,6 @@ _mesa_ColorTable( GLenum target, GLenum internalFormat, 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]; @@ -422,7 +404,6 @@ _mesa_ColorTable( GLenum target, GLenum internalFormat, 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]; @@ -450,7 +431,7 @@ _mesa_ColorTable( GLenum target, GLenum internalFormat, } baseFormat = base_colortab_format(internalFormat); - if (baseFormat < 0 || baseFormat == GL_COLOR_INDEX) { + if (baseFormat < 0) { _mesa_error(ctx, GL_INVALID_ENUM, "glColorTable(internalFormat)"); return; } @@ -459,8 +440,8 @@ _mesa_ColorTable( GLenum target, GLenum internalFormat, /* error */ if (proxy) { table->Size = 0; - table->IntFormat = (GLenum) 0; - table->Format = (GLenum) 0; + table->InternalFormat = (GLenum) 0; + table->_BaseFormat = (GLenum) 0; } else { _mesa_error(ctx, GL_INVALID_VALUE, "glColorTable(width=%d)", width); @@ -471,8 +452,8 @@ _mesa_ColorTable( GLenum target, GLenum internalFormat, if (width > (GLsizei) ctx->Const.MaxColorTableSize) { if (proxy) { table->Size = 0; - table->IntFormat = (GLenum) 0; - table->Format = (GLenum) 0; + table->InternalFormat = (GLenum) 0; + table->_BaseFormat = (GLenum) 0; } else { _mesa_error(ctx, GL_TABLE_TOO_LARGE, "glColorTable(width)"); @@ -481,31 +462,20 @@ _mesa_ColorTable( GLenum target, GLenum internalFormat, } table->Size = width; - table->IntFormat = internalFormat; - table->Format = (GLenum) baseFormat; - set_component_sizes(table); + table->InternalFormat = internalFormat; + table->_BaseFormat = (GLenum) baseFormat; - comps = _mesa_components_in_format(table->Format); + 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 (tableType == GL_FLOAT) { - table->Type = GL_FLOAT; - table->Table = MALLOC(comps * width * sizeof(GLfloat)); - } - else { - table->Type = CHAN_TYPE; - table->Table = MALLOC(comps * width * sizeof(GLchan)); - } + table->TableF = (GLfloat *) _mesa_malloc(comps * width * sizeof(GLfloat)); + table->TableUB = (GLubyte *) _mesa_malloc(comps * width * sizeof(GLubyte)); - if (!table->Table) { + if (!table->TableF || !table->TableUB) { _mesa_error(ctx, GL_OUT_OF_MEMORY, "glColorTable"); return; } @@ -520,6 +490,9 @@ _mesa_ColorTable( GLenum target, GLenum internalFormat, } } /* proxy */ + /* do this after the table's Type and Format are set */ + set_component_sizes(table); + if (texObj || target == GL_SHARED_TEXTURE_PALETTE_EXT) { /* texture object palette, texObj==NULL means the shared palette */ if (ctx->Driver.UpdateTexturePalette) { @@ -543,7 +516,6 @@ _mesa_ColorSubTable( GLenum target, GLsizei start, struct gl_color_table *table = NULL; 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; - GLint comps; ASSERT_OUTSIDE_BEGIN_END_AND_FLUSH(ctx); switch (target) { @@ -636,16 +608,16 @@ _mesa_ColorSubTable( GLenum target, GLsizei start, return; } - comps = _mesa_components_in_format(table->Format); - assert(comps > 0); /* error should have been caught sooner */ + /* error should have been caught sooner */ + assert(_mesa_components_in_format(table->_BaseFormat) > 0); if (start + count > (GLint) table->Size) { _mesa_error(ctx, GL_INVALID_VALUE, "glColorSubTable(count)"); 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; } @@ -700,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) { @@ -750,148 +722,74 @@ _mesa_GetColorTable( GLenum target, GLenum format, ASSERT(table); - switch (table->Format) { - 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; - rgba[i][ACOMP] = IROUND_POS(tableF[i] * CHAN_MAXF); - } - } - 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++) { - rgba[i][RCOMP] = IROUND_POS(tableF[i] * CHAN_MAXF); - rgba[i][GCOMP] = IROUND_POS(tableF[i] * CHAN_MAXF); - rgba[i][BCOMP] = IROUND_POS(tableF[i] * CHAN_MAXF); - rgba[i][ACOMP] = CHAN_MAX; - } - } - else { - const GLchan *tableUB = (const GLchan *) table->Table; - GLuint i; - for (i = 0; i < table->Size; i++) { - rgba[i][RCOMP] = tableUB[i]; - rgba[i][GCOMP] = tableUB[i]; - 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++) { - rgba[i][RCOMP] = IROUND_POS(tableF[i*2+0] * CHAN_MAXF); - rgba[i][GCOMP] = IROUND_POS(tableF[i*2+0] * CHAN_MAXF); - rgba[i][BCOMP] = IROUND_POS(tableF[i*2+0] * CHAN_MAXF); - rgba[i][ACOMP] = IROUND_POS(tableF[i*2+1] * CHAN_MAXF); - } + switch (table->_BaseFormat) { + 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] = tableUB[i*2+0]; - rgba[i][GCOMP] = tableUB[i*2+0]; - 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++) { - rgba[i][RCOMP] = IROUND_POS(tableF[i] * CHAN_MAXF); - rgba[i][GCOMP] = IROUND_POS(tableF[i] * CHAN_MAXF); - rgba[i][BCOMP] = IROUND_POS(tableF[i] * CHAN_MAXF); - rgba[i][ACOMP] = IROUND_POS(tableF[i] * CHAN_MAXF); - } - } - else { - const GLchan *tableUB = (const GLchan *) table->Table; - GLuint i; - for (i = 0; i < table->Size; i++) { - rgba[i][RCOMP] = tableUB[i]; - rgba[i][GCOMP] = tableUB[i]; - rgba[i][BCOMP] = tableUB[i]; - 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++) { - 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; - } + } + 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; - 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); - } + } + 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) { /* pack color table into PBO */ GLubyte *buf; - if (!_mesa_validate_pbo_access(&ctx->Pack, table->Size, 1, 1, + if (!_mesa_validate_pbo_access(1, &ctx->Pack, table->Size, 1, 1, format, type, data)) { _mesa_error(ctx, GL_INVALID_OPERATION, "glGetColorTable(invalid PBO access)"); @@ -909,8 +807,8 @@ _mesa_GetColorTable( GLenum target, GLenum format, data = ADD_POINTERS(buf, data); } - _mesa_pack_rgba_span_chan(ctx, table->Size, (const GLchan (*)[4]) rgba, - format, type, data, &ctx->Pack, GL_FALSE); + _mesa_pack_rgba_span_float(ctx, table->Size, rgba, + format, type, data, &ctx->Pack, 0x0); if (ctx->Pack.BufferObj->Name) { ctx->Driver.UnmapBuffer(ctx, GL_PIXEL_PACK_BUFFER_EXT, @@ -1179,7 +1077,7 @@ _mesa_GetColorTableParameterfv( GLenum target, GLenum pname, GLfloat *params ) switch (pname) { case GL_COLOR_TABLE_FORMAT: - *params = (GLfloat) table->IntFormat; + *params = (GLfloat) table->InternalFormat; break; case GL_COLOR_TABLE_WIDTH: *params = (GLfloat) table->Size; @@ -1353,7 +1251,7 @@ _mesa_GetColorTableParameteriv( GLenum target, GLenum pname, GLint *params ) switch (pname) { case GL_COLOR_TABLE_FORMAT: - *params = table->IntFormat; + *params = table->InternalFormat; break; case GL_COLOR_TABLE_WIDTH: *params = table->Size; @@ -1390,10 +1288,10 @@ _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->IntFormat = GL_RGBA; + p->InternalFormat = GL_RGBA; } @@ -1401,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; } } @@ -1411,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); @@ -1426,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);