From 8753b1c397d8f5778fa527bf4f6bb6b0cb435874 Mon Sep 17 00:00:00 2001 From: Brian Paul Date: Tue, 27 Feb 2001 16:42:01 +0000 Subject: [PATCH] colortable w/ size=0 wasn't handled correctly --- src/mesa/main/colortab.c | 177 +++++++++++++++++++++-------------------------- src/mesa/main/pixel.c | 4 +- 2 files changed, 82 insertions(+), 99 deletions(-) diff --git a/src/mesa/main/colortab.c b/src/mesa/main/colortab.c index f063a69..1f6019f 100644 --- a/src/mesa/main/colortab.c +++ b/src/mesa/main/colortab.c @@ -1,10 +1,10 @@ -/* $Id: colortab.c,v 1.33 2000/12/26 05:09:27 keithw Exp $ */ +/* $Id: colortab.c,v 1.34 2001/02/27 16:42:01 brianp Exp $ */ /* * Mesa 3-D graphics library * Version: 3.5 * - * Copyright (C) 1999-2000 Brian Paul All Rights Reserved. + * Copyright (C) 1999-2001 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"), @@ -104,24 +104,9 @@ void _mesa_init_colortable( struct gl_color_table *p ) { p->FloatTable = GL_FALSE; - /* allocate a width=1 table by default */ - p->Table = CALLOC(4 * sizeof(GLchan)); - if (p->Table) { - GLchan *t = (GLchan *) p->Table; - t[0] = CHAN_MAX; - t[1] = CHAN_MAX; - t[2] = CHAN_MAX; - t[3] = CHAN_MAX; - } + p->Table = NULL; p->Size = 0; p->IntFormat = GL_RGBA; - p->Format = GL_RGBA; - p->RedSize = CHAN_BITS; - p->GreenSize = CHAN_BITS; - p->BlueSize = CHAN_BITS; - p->AlphaSize = CHAN_BITS; - p->IntensitySize = 0; - p->LuminanceSize = 0; } @@ -142,6 +127,7 @@ _mesa_free_colortable_data( struct gl_color_table *p ) static void set_component_sizes( struct gl_color_table *table ) { + /* XXX what about GLfloat tables? */ switch (table->Format) { case GL_ALPHA: table->RedSize = 0; @@ -335,13 +321,7 @@ _mesa_ColorTable( GLenum target, GLenum internalFormat, table->Format = (GLenum) 0; } else { - if (width > ctx->Const.MaxColorTableSize) - gl_error(ctx, GL_TABLE_TOO_LARGE, "glColorTable(width)"); - else { - char msg[100]; - sprintf(msg, "glColorTable(width=%d)", width); - gl_error(ctx, GL_INVALID_VALUE, msg); - } + gl_error(ctx, GL_TABLE_TOO_LARGE, "glColorTable(width)"); } return; } @@ -358,81 +338,84 @@ _mesa_ColorTable( GLenum target, GLenum internalFormat, /* free old table, if any */ if (table->Table) { FREE(table->Table); + table->Table = NULL; } - if (floatTable) { - GLfloat tempTab[MAX_COLOR_TABLE_SIZE * 4]; - GLfloat *tableF; - GLuint i; - - _mesa_unpack_float_color_span(ctx, width, table->Format, - tempTab, /* dest */ - format, type, data, &ctx->Unpack, - 0, GL_FALSE); - - table->FloatTable = GL_TRUE; - table->Table = MALLOC(comps * width * sizeof(GLfloat)); - if (!table->Table) { - gl_error(ctx, GL_OUT_OF_MEMORY, "glColorTable"); - return; - } - - tableF = (GLfloat *) table->Table; - - switch (table->Format) { - case GL_INTENSITY: - for (i = 0; i < width; i++) { - tableF[i] = CLAMP(tempTab[i] * rScale + rBias, 0.0F, 1.0F); - } - break; - case GL_LUMINANCE: - for (i = 0; i < width; i++) { - tableF[i] = CLAMP(tempTab[i] * rScale + rBias, 0.0F, 1.0F); - } - break; - case GL_ALPHA: - for (i = 0; i < width; i++) { - tableF[i] = CLAMP(tempTab[i] * aScale + aBias, 0.0F, 1.0F); - } - break; - case GL_LUMINANCE_ALPHA: - for (i = 0; i < width; i++) { - tableF[i*2+0] = CLAMP(tempTab[i*2+0] * rScale + rBias, 0.0F, 1.0F); - tableF[i*2+1] = CLAMP(tempTab[i*2+1] * aScale + aBias, 0.0F, 1.0F); - } - break; - case GL_RGB: - for (i = 0; i < width; i++) { - tableF[i*3+0] = CLAMP(tempTab[i*3+0] * rScale + rBias, 0.0F, 1.0F); - tableF[i*3+1] = CLAMP(tempTab[i*3+1] * gScale + gBias, 0.0F, 1.0F); - tableF[i*3+2] = CLAMP(tempTab[i*3+2] * bScale + bBias, 0.0F, 1.0F); - } - break; - case GL_RGBA: - for (i = 0; i < width; i++) { - tableF[i*4+0] = CLAMP(tempTab[i*4+0] * rScale + rBias, 0.0F, 1.0F); - tableF[i*4+1] = CLAMP(tempTab[i*4+1] * gScale + gBias, 0.0F, 1.0F); - tableF[i*4+2] = CLAMP(tempTab[i*4+2] * bScale + bBias, 0.0F, 1.0F); - tableF[i*4+3] = CLAMP(tempTab[i*4+3] * aScale + aBias, 0.0F, 1.0F); - } - break; - default: - gl_problem(ctx, "Bad format in _mesa_ColorTable"); + if (width > 0) { + if (floatTable) { + GLfloat tempTab[MAX_COLOR_TABLE_SIZE * 4]; + GLfloat *tableF; + GLuint i; + + _mesa_unpack_float_color_span(ctx, width, table->Format, + tempTab, /* dest */ + format, type, data, &ctx->Unpack, + 0, GL_FALSE); + + table->FloatTable = GL_TRUE; + table->Table = MALLOC(comps * width * sizeof(GLfloat)); + if (!table->Table) { + gl_error(ctx, GL_OUT_OF_MEMORY, "glColorTable"); return; + } + + tableF = (GLfloat *) table->Table; + + switch (table->Format) { + case GL_INTENSITY: + for (i = 0; i < width; i++) { + tableF[i] = CLAMP(tempTab[i] * rScale + rBias, 0.0F, 1.0F); + } + break; + case GL_LUMINANCE: + for (i = 0; i < width; i++) { + tableF[i] = CLAMP(tempTab[i] * rScale + rBias, 0.0F, 1.0F); + } + break; + case GL_ALPHA: + for (i = 0; i < width; i++) { + tableF[i] = CLAMP(tempTab[i] * aScale + aBias, 0.0F, 1.0F); + } + break; + case GL_LUMINANCE_ALPHA: + for (i = 0; i < width; i++) { + tableF[i*2+0] = CLAMP(tempTab[i*2+0] * rScale + rBias, 0.0F, 1.0F); + tableF[i*2+1] = CLAMP(tempTab[i*2+1] * aScale + aBias, 0.0F, 1.0F); + } + break; + case GL_RGB: + for (i = 0; i < width; i++) { + tableF[i*3+0] = CLAMP(tempTab[i*3+0] * rScale + rBias, 0.0F, 1.0F); + tableF[i*3+1] = CLAMP(tempTab[i*3+1] * gScale + gBias, 0.0F, 1.0F); + tableF[i*3+2] = CLAMP(tempTab[i*3+2] * bScale + bBias, 0.0F, 1.0F); + } + break; + case GL_RGBA: + for (i = 0; i < width; i++) { + tableF[i*4+0] = CLAMP(tempTab[i*4+0] * rScale + rBias, 0.0F, 1.0F); + tableF[i*4+1] = CLAMP(tempTab[i*4+1] * gScale + gBias, 0.0F, 1.0F); + tableF[i*4+2] = CLAMP(tempTab[i*4+2] * bScale + bBias, 0.0F, 1.0F); + tableF[i*4+3] = CLAMP(tempTab[i*4+3] * aScale + aBias, 0.0F, 1.0F); + } + break; + default: + gl_problem(ctx, "Bad format in _mesa_ColorTable"); + return; + } } - } - else { - /* store GLchan table */ - table->FloatTable = GL_FALSE; - table->Table = MALLOC(comps * width * sizeof(GLchan)); - if (!table->Table) { - gl_error(ctx, GL_OUT_OF_MEMORY, "glColorTable"); - return; - } - _mesa_unpack_chan_color_span(ctx, width, table->Format, - table->Table, /* dest */ - format, type, data, - &ctx->Unpack, 0); - } /* floatTable */ + else { + /* store GLchan table */ + table->FloatTable = GL_FALSE; + table->Table = MALLOC(comps * width * sizeof(GLchan)); + if (!table->Table) { + gl_error(ctx, GL_OUT_OF_MEMORY, "glColorTable"); + return; + } + _mesa_unpack_chan_color_span(ctx, width, table->Format, + table->Table, /* dest */ + format, type, data, + &ctx->Unpack, 0); + } /* floatTable */ + } /* width > 0 */ } /* proxy */ if (texObj || target == GL_SHARED_TEXTURE_PALETTE_EXT) { diff --git a/src/mesa/main/pixel.c b/src/mesa/main/pixel.c index 470a2f8..2257507 100644 --- a/src/mesa/main/pixel.c +++ b/src/mesa/main/pixel.c @@ -1,4 +1,4 @@ -/* $Id: pixel.c,v 1.24 2001/01/23 23:39:36 brianp Exp $ */ +/* $Id: pixel.c,v 1.25 2001/02/27 16:42:01 brianp Exp $ */ /* * Mesa 3-D graphics library @@ -877,7 +877,7 @@ _mesa_lookup_rgba(const struct gl_color_table *table, GLuint n, GLfloat rgba[][4]) { ASSERT(table->FloatTable); - if (!table->Table) + if (!table->Table || table->Size == 0) return; switch (table->Format) { -- 2.7.4