mirror of
https://gitlab.freedesktop.org/mesa/mesa.git
synced 2026-01-04 20:00:11 +01:00
colortable w/ size=0 wasn't handled correctly
This commit is contained in:
parent
bed4c5bf58
commit
8753b1c397
2 changed files with 80 additions and 97 deletions
|
|
@ -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;
|
||||
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);
|
||||
_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");
|
||||
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) {
|
||||
|
|
|
|||
|
|
@ -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) {
|
||||
|
|
|
|||
Loading…
Add table
Reference in a new issue