summaryrefslogtreecommitdiff
path: root/src/mesa/main/colortab.c
diff options
context:
space:
mode:
authorBrian Paul <brian.paul@tungstengraphics.com>2000-04-17 17:57:04 +0000
committerBrian Paul <brian.paul@tungstengraphics.com>2000-04-17 17:57:04 +0000
commit4bdcfe50f8886e43714f9b7edd25cbff19e6a97d (patch)
treea3853f9e9100dd9492db094ab5a8fc59acb98e4f /src/mesa/main/colortab.c
parent0bb0c7cc85f8b41a36d8a7b723ac3d6755954879 (diff)
dynamically allocate color table data, uses less memory
Diffstat (limited to 'src/mesa/main/colortab.c')
-rw-r--r--src/mesa/main/colortab.c234
1 files changed, 160 insertions, 74 deletions
diff --git a/src/mesa/main/colortab.c b/src/mesa/main/colortab.c
index 98c8bde3f9..634b5c2524 100644
--- a/src/mesa/main/colortab.c
+++ b/src/mesa/main/colortab.c
@@ -1,4 +1,4 @@
-/* $Id: colortab.c,v 1.14 2000/04/17 15:13:53 brianp Exp $ */
+/* $Id: colortab.c,v 1.15 2000/04/17 17:57:04 brianp Exp $ */
/*
* Mesa 3-D graphics library
@@ -33,6 +33,7 @@
#include "context.h"
#include "image.h"
#include "macros.h"
+#include "mem.h"
#include "mmath.h"
#include "span.h"
#include "teximage.h"
@@ -40,6 +41,42 @@
+void
+_mesa_init_colortable( struct gl_color_table *p )
+{
+ p->TableType = GL_UNSIGNED_BYTE;
+ /* allocate a width=1 table by default */
+ p->Table = CALLOC(4 * sizeof(GLubyte));
+ if (p->Table) {
+ GLubyte *t = (GLubyte *) p->Table;
+ t[0] = 255;
+ t[1] = 255;
+ t[2] = 255;
+ t[3] = 255;
+ }
+ p->Size = 1;
+ p->IntFormat = GL_RGBA;
+ p->Format = GL_RGBA;
+ p->RedSize = 8;
+ p->GreenSize = 8;
+ p->BlueSize = 8;
+ p->AlphaSize = 8;
+ p->IntensitySize = 0;
+ p->LuminanceSize = 0;
+}
+
+
+
+void
+_mesa_free_colortable_data( struct gl_color_table *p )
+{
+ if (p->Table) {
+ FREE(p->Table);
+ p->Table = NULL;
+ }
+}
+
+
/*
* Examine table's format and set the component sizes accordingly.
*/
@@ -216,9 +253,9 @@ _mesa_ColorTable( GLenum target, GLenum internalFormat,
return;
}
- if (width < 1 || width > MAX_COLOR_TABLE_SIZE
+ if (width < 1 || width > ctx->Const.MaxColorTableSize
|| _mesa_bitcount(width) != 1) {
- if (width > MAX_COLOR_TABLE_SIZE)
+ if (width > ctx->Const.MaxColorTableSize)
gl_error(ctx, GL_TABLE_TOO_LARGE, "glColorTable(width)");
else
gl_error(ctx, GL_INVALID_VALUE, "glColorTable(width)");
@@ -237,55 +274,71 @@ _mesa_ColorTable( GLenum target, GLenum internalFormat,
set_component_sizes(table);
if (!proxy) {
- _mesa_unpack_ubyte_color_span(ctx, width, table->Format,
- table->Table, /* dest */
- format, type, data,
- &ctx->Unpack, GL_TRUE);
-
+ /* free old table, if any */
+ if (table->Table) {
+ FREE(table->Table);
+ }
if (floatTable) {
+ GLubyte tableUB[MAX_COLOR_TABLE_SIZE * 4];
+ GLfloat *tableF;
+ GLuint i;
+
+ _mesa_unpack_ubyte_color_span(ctx, width, table->Format,
+ tableUB, /* dest */
+ format, type, data,
+ &ctx->Unpack, GL_TRUE);
+
+ table->TableType = GL_FLOAT;
+ table->Table = MALLOC(4 * width * sizeof(GLfloat));
+ if (!table->Table) {
+ gl_error(ctx, GL_OUT_OF_MEMORY, "glColorTable");
+ return;
+ }
+
/* Apply scale and bias and convert GLubyte values to GLfloats
* in [0, 1]. Store results in the tableF[].
*/
- GLuint i;
rScale /= 255.0;
gScale /= 255.0;
bScale /= 255.0;
aScale /= 255.0;
+ tableF = (GLfloat *) table->Table;
+
switch (table->Format) {
case GL_INTENSITY:
for (i = 0; i < width; i++) {
- table->TableF[i] = table->Table[i] * rScale + rBias;
+ tableF[i] = tableUB[i] * rScale + rBias;
}
break;
case GL_LUMINANCE:
for (i = 0; i < width; i++) {
- table->TableF[i] = table->Table[i] * rScale + rBias;
+ tableF[i] = tableUB[i] * rScale + rBias;
}
break;
case GL_ALPHA:
for (i = 0; i < width; i++) {
- table->TableF[i] = table->Table[i] * aScale + aBias;
+ tableF[i] = tableUB[i] * aScale + aBias;
}
break;
case GL_LUMINANCE_ALPHA:
for (i = 0; i < width; i++) {
- table->TableF[i*2+0] = table->Table[i*2+0] * rScale + rBias;
- table->TableF[i*2+1] = table->Table[i*2+1] * aScale + aBias;
+ tableF[i*2+0] = tableUB[i*2+0] * rScale + rBias;
+ tableF[i*2+1] = tableUB[i*2+1] * aScale + aBias;
}
break;
case GL_RGB:
for (i = 0; i < width; i++) {
- table->TableF[i*3+0] = table->Table[i*3+0] * rScale + rBias;
- table->TableF[i*3+1] = table->Table[i*3+1] * gScale + gBias;
- table->TableF[i*3+2] = table->Table[i*3+2] * bScale + bBias;
+ tableF[i*3+0] = tableUB[i*3+0] * rScale + rBias;
+ tableF[i*3+1] = tableUB[i*3+1] * gScale + gBias;
+ tableF[i*3+2] = tableUB[i*3+2] * bScale + bBias;
}
break;
case GL_RGBA:
for (i = 0; i < width; i++) {
- table->TableF[i*4+0] = table->Table[i*4+0] * rScale + rBias;
- table->TableF[i*4+1] = table->Table[i*4+1] * gScale + gBias;
- table->TableF[i*4+2] = table->Table[i*4+2] * bScale + bBias;
- table->TableF[i*4+3] = table->Table[i*4+3] * aScale + aBias;
+ tableF[i*4+0] = tableUB[i*4+0] * rScale + rBias;
+ tableF[i*4+1] = tableUB[i*4+1] * gScale + gBias;
+ tableF[i*4+2] = tableUB[i*4+2] * bScale + bBias;
+ tableF[i*4+3] = tableUB[i*4+3] * aScale + aBias;
}
break;
default:
@@ -293,7 +346,20 @@ _mesa_ColorTable( GLenum target, GLenum internalFormat,
return;
}
}
- }
+ else {
+ /* store GLubyte table */
+ table->TableType = GL_UNSIGNED_BYTE;
+ table->Table = MALLOC(4 * width * sizeof(GLubyte));
+ if (!table->Table) {
+ gl_error(ctx, GL_OUT_OF_MEMORY, "glColorTable");
+ return;
+ }
+ _mesa_unpack_ubyte_color_span(ctx, width, table->Format,
+ table->Table, /* dest */
+ format, type, data,
+ &ctx->Unpack, GL_TRUE);
+ } /* floatTable */
+ } /* proxy */
if (texObj || target == GL_SHARED_TEXTURE_PALETTE_EXT) {
/* texture object palette, texObj==NULL means the shared palette */
@@ -370,10 +436,22 @@ _mesa_ColorSubTable( GLenum target, GLsizei start,
return;
}
- dest = table->Table + start * comps * sizeof(GLubyte);
- _mesa_unpack_ubyte_color_span(ctx, count, table->Format, dest,
- format, type, data,
- &ctx->Unpack, GL_TRUE);
+ if (!table->Table) {
+ gl_error(ctx, GL_OUT_OF_MEMORY, "glColorSubTable");
+ return;
+ }
+
+ if (table->TableType == GL_UNSIGNED_BYTE) {
+ dest = (GLubyte *) table->Table + start * comps * sizeof(GLubyte);
+ _mesa_unpack_ubyte_color_span(ctx, count, table->Format, dest,
+ format, type, data,
+ &ctx->Unpack, GL_TRUE);
+ }
+ else {
+ ASSERT(table->TableType == GL_FLOAT);
+ /* XXX todo */
+ }
+
if (texObj || target == GL_SHARED_TEXTURE_PALETTE_EXT) {
/* per-texture object palette */
@@ -450,7 +528,6 @@ _mesa_GetColorTable( GLenum target, GLenum format,
struct gl_texture_unit *texUnit = &ctx->Texture.Unit[ctx->Texture.CurrentUnit];
struct gl_color_table *table = NULL;
GLubyte rgba[MAX_COLOR_TABLE_SIZE][4];
- GLboolean floatTable = GL_FALSE;
GLint i;
ASSERT_OUTSIDE_BEGIN_END(ctx, "glGetColorTable");
@@ -470,15 +547,12 @@ _mesa_GetColorTable( GLenum target, GLenum format,
break;
case GL_COLOR_TABLE:
table = &ctx->ColorTable;
- floatTable = GL_TRUE;
break;
case GL_POST_CONVOLUTION_COLOR_TABLE:
table = &ctx->PostConvolutionColorTable;
- floatTable = GL_TRUE;
break;
case GL_POST_COLOR_MATRIX_COLOR_TABLE:
table = &ctx->PostColorMatrixColorTable;
- floatTable = GL_TRUE;
break;
default:
gl_error(ctx, GL_INVALID_ENUM, "glGetColorTable(target)");
@@ -489,110 +563,122 @@ _mesa_GetColorTable( GLenum target, GLenum format,
switch (table->Format) {
case GL_ALPHA:
- if (floatTable) {
+ if (table->TableType == GL_FLOAT) {
+ const GLfloat *tableF = (const GLfloat *) table->Table;
for (i = 0; i < table->Size; i++) {
rgba[i][RCOMP] = 0;
rgba[i][GCOMP] = 0;
rgba[i][BCOMP] = 0;
- rgba[i][ACOMP] = (GLint) (table->TableF[i] * 255.0F);
+ rgba[i][ACOMP] = (GLint) (tableF[i] * 255.0F);
}
}
else {
+ const GLubyte *tableUB = (const GLubyte *) table->Table;
for (i = 0; i < table->Size; i++) {
rgba[i][RCOMP] = 0;
rgba[i][GCOMP] = 0;
rgba[i][BCOMP] = 0;
- rgba[i][ACOMP] = table->Table[i];
+ rgba[i][ACOMP] = tableUB[i];
}
}
break;
case GL_LUMINANCE:
- if (floatTable) {
+ if (table->TableType == GL_FLOAT) {
+ const GLfloat *tableF = (const GLfloat *) table->Table;
for (i = 0; i < table->Size; i++) {
- rgba[i][RCOMP] = (GLint) (table->Table[i] * 255.0F);
- rgba[i][GCOMP] = (GLint) (table->Table[i] * 255.0F);
- rgba[i][BCOMP] = (GLint) (table->Table[i] * 255.0F);
+ rgba[i][RCOMP] = (GLint) (tableF[i] * 255.0F);
+ rgba[i][GCOMP] = (GLint) (tableF[i] * 255.0F);
+ rgba[i][BCOMP] = (GLint) (tableF[i] * 255.0F);
rgba[i][ACOMP] = 255;
}
}
else {
+ const GLubyte *tableUB = (const GLubyte *) table->Table;
for (i = 0; i < table->Size; i++) {
- rgba[i][RCOMP] = table->Table[i];
- rgba[i][GCOMP] = table->Table[i];
- rgba[i][BCOMP] = table->Table[i];
+ rgba[i][RCOMP] = tableUB[i];
+ rgba[i][GCOMP] = tableUB[i];
+ rgba[i][BCOMP] = tableUB[i];
rgba[i][ACOMP] = 255;
}
}
break;
case GL_LUMINANCE_ALPHA:
- if (floatTable) {
+ if (table->TableType == GL_FLOAT) {
+ const GLfloat *tableF = (const GLfloat *) table->Table;
for (i = 0; i < table->Size; i++) {
- rgba[i][RCOMP] = (GLint) (table->Table[i*2+0] * 255.0F);
- rgba[i][GCOMP] = (GLint) (table->Table[i*2+0] * 255.0F);
- rgba[i][BCOMP] = (GLint) (table->Table[i*2+0] * 255.0F);
- rgba[i][ACOMP] = (GLint) (table->Table[i*2+1] * 255.0F);
+ rgba[i][RCOMP] = (GLint) (tableF[i*2+0] * 255.0F);
+ rgba[i][GCOMP] = (GLint) (tableF[i*2+0] * 255.0F);
+ rgba[i][BCOMP] = (GLint) (tableF[i*2+0] * 255.0F);
+ rgba[i][ACOMP] = (GLint) (tableF[i*2+1] * 255.0F);
}
}
else {
+ const GLubyte *tableUB = (const GLubyte *) table->Table;
for (i = 0; i < table->Size; i++) {
- rgba[i][RCOMP] = table->Table[i*2+0];
- rgba[i][GCOMP] = table->Table[i*2+0];
- rgba[i][BCOMP] = table->Table[i*2+0];
- rgba[i][ACOMP] = table->Table[i*2+1];
+ 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 (floatTable) {
+ if (table->TableType == GL_FLOAT) {
+ const GLfloat *tableF = (const GLfloat *) table->Table;
for (i = 0; i < table->Size; i++) {
- rgba[i][RCOMP] = (GLint) (table->Table[i] * 255.0F);
- rgba[i][GCOMP] = (GLint) (table->Table[i] * 255.0F);
- rgba[i][BCOMP] = (GLint) (table->Table[i] * 255.0F);
- rgba[i][ACOMP] = 255;
+ rgba[i][RCOMP] = (GLint) (tableF[i] * 255.0F);
+ rgba[i][GCOMP] = (GLint) (tableF[i] * 255.0F);
+ rgba[i][BCOMP] = (GLint) (tableF[i] * 255.0F);
+ rgba[i][ACOMP] = (GLint) (tableF[i] * 255.0F);
}
}
else {
+ const GLubyte *tableUB = (const GLubyte *) table->Table;
for (i = 0; i < table->Size; i++) {
- rgba[i][RCOMP] = table->Table[i];
- rgba[i][GCOMP] = table->Table[i];
- rgba[i][BCOMP] = table->Table[i];
- rgba[i][ACOMP] = 255;
+ 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 (floatTable) {
+ if (table->TableType == GL_FLOAT) {
+ const GLfloat *tableF = (const GLfloat *) table->Table;
for (i = 0; i < table->Size; i++) {
- rgba[i][RCOMP] = (GLint) (table->Table[i*3+0] * 255.0F);
- rgba[i][GCOMP] = (GLint) (table->Table[i*3+1] * 255.0F);
- rgba[i][BCOMP] = (GLint) (table->Table[i*3+2] * 255.0F);
+ rgba[i][RCOMP] = (GLint) (tableF[i*3+0] * 255.0F);
+ rgba[i][GCOMP] = (GLint) (tableF[i*3+1] * 255.0F);
+ rgba[i][BCOMP] = (GLint) (tableF[i*3+2] * 255.0F);
rgba[i][ACOMP] = 255;
}
}
else {
+ const GLubyte *tableUB = (const GLubyte *) table->Table;
for (i = 0; i < table->Size; i++) {
- rgba[i][RCOMP] = table->Table[i*3+0];
- rgba[i][GCOMP] = table->Table[i*3+1];
- rgba[i][BCOMP] = table->Table[i*3+2];
+ rgba[i][RCOMP] = tableUB[i*3+0];
+ rgba[i][GCOMP] = tableUB[i*3+1];
+ rgba[i][BCOMP] = tableUB[i*3+2];
rgba[i][ACOMP] = 255;
}
}
break;
case GL_RGBA:
- if (floatTable) {
+ if (table->TableType == GL_FLOAT) {
+ const GLfloat *tableF = (const GLfloat *) table->Table;
for (i = 0; i < table->Size; i++) {
- rgba[i][RCOMP] = (GLint) (table->Table[i*4+0] * 255.0F);
- rgba[i][GCOMP] = (GLint) (table->Table[i*4+1] * 255.0F);
- rgba[i][BCOMP] = (GLint) (table->Table[i*4+2] * 255.0F);
- rgba[i][ACOMP] = (GLint) (table->Table[i*4+3] * 255.0F);
+ rgba[i][RCOMP] = (GLint) (tableF[i*4+0] * 255.0F);
+ rgba[i][GCOMP] = (GLint) (tableF[i*4+1] * 255.0F);
+ rgba[i][BCOMP] = (GLint) (tableF[i*4+2] * 255.0F);
+ rgba[i][ACOMP] = (GLint) (tableF[i*4+3] * 255.0F);
}
}
else {
+ const GLubyte *tableUB = (const GLubyte *) table->Table;
for (i = 0; i < table->Size; i++) {
- rgba[i][RCOMP] = table->Table[i*4+0];
- rgba[i][GCOMP] = table->Table[i*4+1];
- rgba[i][BCOMP] = table->Table[i*4+2];
- rgba[i][ACOMP] = table->Table[i*4+3];
+ 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;