dynamically allocate color table data, uses less memory
This commit is contained in:
@@ -332,7 +332,7 @@ void fxDDTexDel(GLcontext *ctx, struct gl_texture_object *tObj)
|
|||||||
fprintf(stderr,"fxmesa: fxDDTexDel(%d,%x)\n",tObj->Name,(GLuint)ti);
|
fprintf(stderr,"fxmesa: fxDDTexDel(%d,%x)\n",tObj->Name,(GLuint)ti);
|
||||||
}
|
}
|
||||||
|
|
||||||
if(!ti)
|
if (!ti)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
fxTMFreeTexture(fxMesa,tObj);
|
fxTMFreeTexture(fxMesa,tObj);
|
||||||
@@ -343,77 +343,105 @@ void fxDDTexDel(GLcontext *ctx, struct gl_texture_object *tObj)
|
|||||||
ctx->NewState|=NEW_TEXTURING;
|
ctx->NewState|=NEW_TEXTURING;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Convert gl_color_table table to Glide's format.
|
||||||
|
*/
|
||||||
|
|
||||||
|
static void convertPalette(FxU32 data[256], const struct gl_color_table *table)
|
||||||
|
{
|
||||||
|
const GLubyte *tableUB = (const GLubyte *) table->Table;
|
||||||
|
GLint width = table->Size;
|
||||||
|
FxU32 r, g, b, a;
|
||||||
|
GLint i;
|
||||||
|
|
||||||
|
ASSERT(table->TableType == GL_UNSIGNED_BYTE);
|
||||||
|
|
||||||
|
switch (table->Format) {
|
||||||
|
case GL_INTENSITY:
|
||||||
|
for (i = 0; i < width; i++) {
|
||||||
|
r = tableUB[i];
|
||||||
|
g = tableUB[i];
|
||||||
|
b = tableUB[i];
|
||||||
|
a = tableUB[i];
|
||||||
|
data[i] = (a << 24) | (r << 16) | (g << 8) | b;
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
case GL_LUMINANCE:
|
||||||
|
for (i = 0; i < width; i++) {
|
||||||
|
r = tableUB[i];
|
||||||
|
g = tableUB[i];
|
||||||
|
b = tableUB[i];
|
||||||
|
a = 255;
|
||||||
|
data[i] = (a << 24) | (r << 16) | (g << 8) | b;
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
case GL_ALPHA:
|
||||||
|
for (i = 0; i < width; i++) {
|
||||||
|
r = g = b = 255;
|
||||||
|
a = tableUB[i];
|
||||||
|
data[i] = (a << 24) | (r << 16) | (g << 8) | b;
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
case GL_LUMINANCE_ALPHA:
|
||||||
|
for (i = 0; i < width; i++) {
|
||||||
|
r = g = b = tableUB[i*2+0];
|
||||||
|
a = tableUB[i*2+1];
|
||||||
|
data[i] = (a << 24) | (r << 16) | (g << 8) | b;
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
case GL_RGB:
|
||||||
|
for (i = 0; i < width; i++) {
|
||||||
|
r = tableUB[i*3+0];
|
||||||
|
g = tableUB[i*3+1];
|
||||||
|
b = tableUB[i*3+2];
|
||||||
|
a = 255;
|
||||||
|
data[i] = (a << 24) | (r << 16) | (g << 8) | b;
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
case GL_RGBA:
|
||||||
|
for (i = 0; i < width; i++) {
|
||||||
|
r = tableUB[i*4+0];
|
||||||
|
g = tableUB[i*4+1];
|
||||||
|
b = tableUB[i*4+2];
|
||||||
|
a = tableUB[i*4+3];
|
||||||
|
data[i] = (a << 24) | (r << 16) | (g << 8) | b;
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
void fxDDTexPalette(GLcontext *ctx, struct gl_texture_object *tObj)
|
void fxDDTexPalette(GLcontext *ctx, struct gl_texture_object *tObj)
|
||||||
{
|
{
|
||||||
fxMesaContext fxMesa=(fxMesaContext)ctx->DriverCtx;
|
fxMesaContext fxMesa=(fxMesaContext)ctx->DriverCtx;
|
||||||
int i;
|
|
||||||
FxU32 r,g,b,a;
|
if (tObj) {
|
||||||
|
/* per-texture palette */
|
||||||
tfxTexInfo *ti;
|
tfxTexInfo *ti;
|
||||||
|
|
||||||
if(tObj) {
|
|
||||||
if (MESA_VERBOSE&VERBOSE_DRIVER) {
|
if (MESA_VERBOSE&VERBOSE_DRIVER) {
|
||||||
fprintf(stderr,"fxmesa: fxDDTexPalette(%d,%x)\n",tObj->Name,(GLuint)tObj->DriverData);
|
fprintf(stderr,"fxmesa: fxDDTexPalette(%d,%x)\n",
|
||||||
|
tObj->Name,(GLuint)tObj->DriverData);
|
||||||
}
|
}
|
||||||
|
|
||||||
if(tObj->Palette.Format!=GL_RGBA) {
|
|
||||||
#ifndef FX_SILENT
|
|
||||||
fprintf(stderr,"fx Driver: unsupported palette format in texpalette()\n");
|
|
||||||
#endif
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
if(tObj->Palette.Size>256) {
|
|
||||||
#ifndef FX_SILENT
|
|
||||||
fprintf(stderr,"fx Driver: unsupported palette size in texpalette()\n");
|
|
||||||
#endif
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (!tObj->DriverData)
|
if (!tObj->DriverData)
|
||||||
tObj->DriverData=fxAllocTexObjData(fxMesa);
|
tObj->DriverData=fxAllocTexObjData(fxMesa);
|
||||||
|
|
||||||
ti=fxTMGetTexInfo(tObj);
|
ti=fxTMGetTexInfo(tObj);
|
||||||
|
convertPalette(ti->palette.data, &tObj->Palette);
|
||||||
for(i=0;i<tObj->Palette.Size;i++) {
|
|
||||||
r=tObj->Palette.Table[i*4];
|
|
||||||
g=tObj->Palette.Table[i*4+1];
|
|
||||||
b=tObj->Palette.Table[i*4+2];
|
|
||||||
a=tObj->Palette.Table[i*4+3];
|
|
||||||
ti->palette.data[i]=(a<<24)|(r<<16)|(g<<8)|b;
|
|
||||||
}
|
|
||||||
|
|
||||||
fxTexInvalidate(ctx,tObj);
|
fxTexInvalidate(ctx,tObj);
|
||||||
} else {
|
}
|
||||||
|
else {
|
||||||
|
/* global texture palette */
|
||||||
if (MESA_VERBOSE&VERBOSE_DRIVER) {
|
if (MESA_VERBOSE&VERBOSE_DRIVER) {
|
||||||
fprintf(stderr,"fxmesa: fxDDTexPalette(global)\n");
|
fprintf(stderr,"fxmesa: fxDDTexPalette(global)\n");
|
||||||
}
|
}
|
||||||
if(ctx->Texture.Palette.Format!=GL_RGBA) {
|
convertPalette(fxMesa->glbPalette.data, &ctx->Texture.Palette);
|
||||||
#ifndef FX_SILENT
|
|
||||||
fprintf(stderr,"fx Driver: unsupported palette format in texpalette()\n");
|
|
||||||
#endif
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
if(ctx->Texture.Palette.Size>256) {
|
|
||||||
#ifndef FX_SILENT
|
|
||||||
fprintf(stderr,"fx Driver: unsupported palette size in texpalette()\n");
|
|
||||||
#endif
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
for(i=0;i<ctx->Texture.Palette.Size;i++) {
|
|
||||||
r=ctx->Texture.Palette.Table[i*4];
|
|
||||||
g=ctx->Texture.Palette.Table[i*4+1];
|
|
||||||
b=ctx->Texture.Palette.Table[i*4+2];
|
|
||||||
a=ctx->Texture.Palette.Table[i*4+3];
|
|
||||||
fxMesa->glbPalette.data[i]=(a<<24)|(r<<16)|(g<<8)|b;
|
|
||||||
}
|
|
||||||
|
|
||||||
fxMesa->new_state|=FX_NEW_TEXTURING;
|
fxMesa->new_state|=FX_NEW_TEXTURING;
|
||||||
ctx->Driver.RenderStart = fxSetupFXUnits;
|
ctx->Driver.RenderStart = fxSetupFXUnits;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
void fxDDTexUseGlbPalette(GLcontext *ctx, GLboolean state)
|
void fxDDTexUseGlbPalette(GLcontext *ctx, GLboolean state)
|
||||||
{
|
{
|
||||||
fxMesaContext fxMesa=(fxMesaContext)ctx->DriverCtx;
|
fxMesaContext fxMesa=(fxMesaContext)ctx->DriverCtx;
|
||||||
|
@@ -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
|
* Mesa 3-D graphics library
|
||||||
@@ -33,6 +33,7 @@
|
|||||||
#include "context.h"
|
#include "context.h"
|
||||||
#include "image.h"
|
#include "image.h"
|
||||||
#include "macros.h"
|
#include "macros.h"
|
||||||
|
#include "mem.h"
|
||||||
#include "mmath.h"
|
#include "mmath.h"
|
||||||
#include "span.h"
|
#include "span.h"
|
||||||
#include "teximage.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.
|
* Examine table's format and set the component sizes accordingly.
|
||||||
*/
|
*/
|
||||||
@@ -216,9 +253,9 @@ _mesa_ColorTable( GLenum target, GLenum internalFormat,
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (width < 1 || width > MAX_COLOR_TABLE_SIZE
|
if (width < 1 || width > ctx->Const.MaxColorTableSize
|
||||||
|| _mesa_bitcount(width) != 1) {
|
|| _mesa_bitcount(width) != 1) {
|
||||||
if (width > MAX_COLOR_TABLE_SIZE)
|
if (width > ctx->Const.MaxColorTableSize)
|
||||||
gl_error(ctx, GL_TABLE_TOO_LARGE, "glColorTable(width)");
|
gl_error(ctx, GL_TABLE_TOO_LARGE, "glColorTable(width)");
|
||||||
else
|
else
|
||||||
gl_error(ctx, GL_INVALID_VALUE, "glColorTable(width)");
|
gl_error(ctx, GL_INVALID_VALUE, "glColorTable(width)");
|
||||||
@@ -237,55 +274,71 @@ _mesa_ColorTable( GLenum target, GLenum internalFormat,
|
|||||||
set_component_sizes(table);
|
set_component_sizes(table);
|
||||||
|
|
||||||
if (!proxy) {
|
if (!proxy) {
|
||||||
|
/* 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,
|
_mesa_unpack_ubyte_color_span(ctx, width, table->Format,
|
||||||
table->Table, /* dest */
|
tableUB, /* dest */
|
||||||
format, type, data,
|
format, type, data,
|
||||||
&ctx->Unpack, GL_TRUE);
|
&ctx->Unpack, GL_TRUE);
|
||||||
|
|
||||||
if (floatTable) {
|
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
|
/* Apply scale and bias and convert GLubyte values to GLfloats
|
||||||
* in [0, 1]. Store results in the tableF[].
|
* in [0, 1]. Store results in the tableF[].
|
||||||
*/
|
*/
|
||||||
GLuint i;
|
|
||||||
rScale /= 255.0;
|
rScale /= 255.0;
|
||||||
gScale /= 255.0;
|
gScale /= 255.0;
|
||||||
bScale /= 255.0;
|
bScale /= 255.0;
|
||||||
aScale /= 255.0;
|
aScale /= 255.0;
|
||||||
|
tableF = (GLfloat *) table->Table;
|
||||||
|
|
||||||
switch (table->Format) {
|
switch (table->Format) {
|
||||||
case GL_INTENSITY:
|
case GL_INTENSITY:
|
||||||
for (i = 0; i < width; i++) {
|
for (i = 0; i < width; i++) {
|
||||||
table->TableF[i] = table->Table[i] * rScale + rBias;
|
tableF[i] = tableUB[i] * rScale + rBias;
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
case GL_LUMINANCE:
|
case GL_LUMINANCE:
|
||||||
for (i = 0; i < width; i++) {
|
for (i = 0; i < width; i++) {
|
||||||
table->TableF[i] = table->Table[i] * rScale + rBias;
|
tableF[i] = tableUB[i] * rScale + rBias;
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
case GL_ALPHA:
|
case GL_ALPHA:
|
||||||
for (i = 0; i < width; i++) {
|
for (i = 0; i < width; i++) {
|
||||||
table->TableF[i] = table->Table[i] * aScale + aBias;
|
tableF[i] = tableUB[i] * aScale + aBias;
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
case GL_LUMINANCE_ALPHA:
|
case GL_LUMINANCE_ALPHA:
|
||||||
for (i = 0; i < width; i++) {
|
for (i = 0; i < width; i++) {
|
||||||
table->TableF[i*2+0] = table->Table[i*2+0] * rScale + rBias;
|
tableF[i*2+0] = tableUB[i*2+0] * rScale + rBias;
|
||||||
table->TableF[i*2+1] = table->Table[i*2+1] * aScale + aBias;
|
tableF[i*2+1] = tableUB[i*2+1] * aScale + aBias;
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
case GL_RGB:
|
case GL_RGB:
|
||||||
for (i = 0; i < width; i++) {
|
for (i = 0; i < width; i++) {
|
||||||
table->TableF[i*3+0] = table->Table[i*3+0] * rScale + rBias;
|
tableF[i*3+0] = tableUB[i*3+0] * rScale + rBias;
|
||||||
table->TableF[i*3+1] = table->Table[i*3+1] * gScale + gBias;
|
tableF[i*3+1] = tableUB[i*3+1] * gScale + gBias;
|
||||||
table->TableF[i*3+2] = table->Table[i*3+2] * bScale + bBias;
|
tableF[i*3+2] = tableUB[i*3+2] * bScale + bBias;
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
case GL_RGBA:
|
case GL_RGBA:
|
||||||
for (i = 0; i < width; i++) {
|
for (i = 0; i < width; i++) {
|
||||||
table->TableF[i*4+0] = table->Table[i*4+0] * rScale + rBias;
|
tableF[i*4+0] = tableUB[i*4+0] * rScale + rBias;
|
||||||
table->TableF[i*4+1] = table->Table[i*4+1] * gScale + gBias;
|
tableF[i*4+1] = tableUB[i*4+1] * gScale + gBias;
|
||||||
table->TableF[i*4+2] = table->Table[i*4+2] * bScale + bBias;
|
tableF[i*4+2] = tableUB[i*4+2] * bScale + bBias;
|
||||||
table->TableF[i*4+3] = table->Table[i*4+3] * aScale + aBias;
|
tableF[i*4+3] = tableUB[i*4+3] * aScale + aBias;
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
@@ -293,7 +346,20 @@ _mesa_ColorTable( GLenum target, GLenum internalFormat,
|
|||||||
return;
|
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) {
|
if (texObj || target == GL_SHARED_TEXTURE_PALETTE_EXT) {
|
||||||
/* texture object palette, texObj==NULL means the shared palette */
|
/* texture object palette, texObj==NULL means the shared palette */
|
||||||
@@ -370,10 +436,22 @@ _mesa_ColorSubTable( GLenum target, GLsizei start,
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
dest = table->Table + start * comps * sizeof(GLubyte);
|
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,
|
_mesa_unpack_ubyte_color_span(ctx, count, table->Format, dest,
|
||||||
format, type, data,
|
format, type, data,
|
||||||
&ctx->Unpack, GL_TRUE);
|
&ctx->Unpack, GL_TRUE);
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
ASSERT(table->TableType == GL_FLOAT);
|
||||||
|
/* XXX todo */
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
if (texObj || target == GL_SHARED_TEXTURE_PALETTE_EXT) {
|
if (texObj || target == GL_SHARED_TEXTURE_PALETTE_EXT) {
|
||||||
/* per-texture object palette */
|
/* 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_texture_unit *texUnit = &ctx->Texture.Unit[ctx->Texture.CurrentUnit];
|
||||||
struct gl_color_table *table = NULL;
|
struct gl_color_table *table = NULL;
|
||||||
GLubyte rgba[MAX_COLOR_TABLE_SIZE][4];
|
GLubyte rgba[MAX_COLOR_TABLE_SIZE][4];
|
||||||
GLboolean floatTable = GL_FALSE;
|
|
||||||
GLint i;
|
GLint i;
|
||||||
|
|
||||||
ASSERT_OUTSIDE_BEGIN_END(ctx, "glGetColorTable");
|
ASSERT_OUTSIDE_BEGIN_END(ctx, "glGetColorTable");
|
||||||
@@ -470,15 +547,12 @@ _mesa_GetColorTable( GLenum target, GLenum format,
|
|||||||
break;
|
break;
|
||||||
case GL_COLOR_TABLE:
|
case GL_COLOR_TABLE:
|
||||||
table = &ctx->ColorTable;
|
table = &ctx->ColorTable;
|
||||||
floatTable = GL_TRUE;
|
|
||||||
break;
|
break;
|
||||||
case GL_POST_CONVOLUTION_COLOR_TABLE:
|
case GL_POST_CONVOLUTION_COLOR_TABLE:
|
||||||
table = &ctx->PostConvolutionColorTable;
|
table = &ctx->PostConvolutionColorTable;
|
||||||
floatTable = GL_TRUE;
|
|
||||||
break;
|
break;
|
||||||
case GL_POST_COLOR_MATRIX_COLOR_TABLE:
|
case GL_POST_COLOR_MATRIX_COLOR_TABLE:
|
||||||
table = &ctx->PostColorMatrixColorTable;
|
table = &ctx->PostColorMatrixColorTable;
|
||||||
floatTable = GL_TRUE;
|
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
gl_error(ctx, GL_INVALID_ENUM, "glGetColorTable(target)");
|
gl_error(ctx, GL_INVALID_ENUM, "glGetColorTable(target)");
|
||||||
@@ -489,110 +563,122 @@ _mesa_GetColorTable( GLenum target, GLenum format,
|
|||||||
|
|
||||||
switch (table->Format) {
|
switch (table->Format) {
|
||||||
case GL_ALPHA:
|
case GL_ALPHA:
|
||||||
if (floatTable) {
|
if (table->TableType == GL_FLOAT) {
|
||||||
|
const GLfloat *tableF = (const GLfloat *) table->Table;
|
||||||
for (i = 0; i < table->Size; i++) {
|
for (i = 0; i < table->Size; i++) {
|
||||||
rgba[i][RCOMP] = 0;
|
rgba[i][RCOMP] = 0;
|
||||||
rgba[i][GCOMP] = 0;
|
rgba[i][GCOMP] = 0;
|
||||||
rgba[i][BCOMP] = 0;
|
rgba[i][BCOMP] = 0;
|
||||||
rgba[i][ACOMP] = (GLint) (table->TableF[i] * 255.0F);
|
rgba[i][ACOMP] = (GLint) (tableF[i] * 255.0F);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
|
const GLubyte *tableUB = (const GLubyte *) table->Table;
|
||||||
for (i = 0; i < table->Size; i++) {
|
for (i = 0; i < table->Size; i++) {
|
||||||
rgba[i][RCOMP] = 0;
|
rgba[i][RCOMP] = 0;
|
||||||
rgba[i][GCOMP] = 0;
|
rgba[i][GCOMP] = 0;
|
||||||
rgba[i][BCOMP] = 0;
|
rgba[i][BCOMP] = 0;
|
||||||
rgba[i][ACOMP] = table->Table[i];
|
rgba[i][ACOMP] = tableUB[i];
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
case GL_LUMINANCE:
|
case GL_LUMINANCE:
|
||||||
if (floatTable) {
|
if (table->TableType == GL_FLOAT) {
|
||||||
|
const GLfloat *tableF = (const GLfloat *) table->Table;
|
||||||
for (i = 0; i < table->Size; i++) {
|
for (i = 0; i < table->Size; i++) {
|
||||||
rgba[i][RCOMP] = (GLint) (table->Table[i] * 255.0F);
|
rgba[i][RCOMP] = (GLint) (tableF[i] * 255.0F);
|
||||||
rgba[i][GCOMP] = (GLint) (table->Table[i] * 255.0F);
|
rgba[i][GCOMP] = (GLint) (tableF[i] * 255.0F);
|
||||||
rgba[i][BCOMP] = (GLint) (table->Table[i] * 255.0F);
|
rgba[i][BCOMP] = (GLint) (tableF[i] * 255.0F);
|
||||||
rgba[i][ACOMP] = 255;
|
rgba[i][ACOMP] = 255;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
|
const GLubyte *tableUB = (const GLubyte *) table->Table;
|
||||||
for (i = 0; i < table->Size; i++) {
|
for (i = 0; i < table->Size; i++) {
|
||||||
rgba[i][RCOMP] = table->Table[i];
|
rgba[i][RCOMP] = tableUB[i];
|
||||||
rgba[i][GCOMP] = table->Table[i];
|
rgba[i][GCOMP] = tableUB[i];
|
||||||
rgba[i][BCOMP] = table->Table[i];
|
rgba[i][BCOMP] = tableUB[i];
|
||||||
rgba[i][ACOMP] = 255;
|
rgba[i][ACOMP] = 255;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
case GL_LUMINANCE_ALPHA:
|
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++) {
|
for (i = 0; i < table->Size; i++) {
|
||||||
rgba[i][RCOMP] = (GLint) (table->Table[i*2+0] * 255.0F);
|
rgba[i][RCOMP] = (GLint) (tableF[i*2+0] * 255.0F);
|
||||||
rgba[i][GCOMP] = (GLint) (table->Table[i*2+0] * 255.0F);
|
rgba[i][GCOMP] = (GLint) (tableF[i*2+0] * 255.0F);
|
||||||
rgba[i][BCOMP] = (GLint) (table->Table[i*2+0] * 255.0F);
|
rgba[i][BCOMP] = (GLint) (tableF[i*2+0] * 255.0F);
|
||||||
rgba[i][ACOMP] = (GLint) (table->Table[i*2+1] * 255.0F);
|
rgba[i][ACOMP] = (GLint) (tableF[i*2+1] * 255.0F);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
|
const GLubyte *tableUB = (const GLubyte *) table->Table;
|
||||||
for (i = 0; i < table->Size; i++) {
|
for (i = 0; i < table->Size; i++) {
|
||||||
rgba[i][RCOMP] = table->Table[i*2+0];
|
rgba[i][RCOMP] = tableUB[i*2+0];
|
||||||
rgba[i][GCOMP] = table->Table[i*2+0];
|
rgba[i][GCOMP] = tableUB[i*2+0];
|
||||||
rgba[i][BCOMP] = table->Table[i*2+0];
|
rgba[i][BCOMP] = tableUB[i*2+0];
|
||||||
rgba[i][ACOMP] = table->Table[i*2+1];
|
rgba[i][ACOMP] = tableUB[i*2+1];
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
case GL_INTENSITY:
|
case GL_INTENSITY:
|
||||||
if (floatTable) {
|
if (table->TableType == GL_FLOAT) {
|
||||||
|
const GLfloat *tableF = (const GLfloat *) table->Table;
|
||||||
for (i = 0; i < table->Size; i++) {
|
for (i = 0; i < table->Size; i++) {
|
||||||
rgba[i][RCOMP] = (GLint) (table->Table[i] * 255.0F);
|
rgba[i][RCOMP] = (GLint) (tableF[i] * 255.0F);
|
||||||
rgba[i][GCOMP] = (GLint) (table->Table[i] * 255.0F);
|
rgba[i][GCOMP] = (GLint) (tableF[i] * 255.0F);
|
||||||
rgba[i][BCOMP] = (GLint) (table->Table[i] * 255.0F);
|
rgba[i][BCOMP] = (GLint) (tableF[i] * 255.0F);
|
||||||
rgba[i][ACOMP] = 255;
|
rgba[i][ACOMP] = (GLint) (tableF[i] * 255.0F);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
|
const GLubyte *tableUB = (const GLubyte *) table->Table;
|
||||||
for (i = 0; i < table->Size; i++) {
|
for (i = 0; i < table->Size; i++) {
|
||||||
rgba[i][RCOMP] = table->Table[i];
|
rgba[i][RCOMP] = tableUB[i];
|
||||||
rgba[i][GCOMP] = table->Table[i];
|
rgba[i][GCOMP] = tableUB[i];
|
||||||
rgba[i][BCOMP] = table->Table[i];
|
rgba[i][BCOMP] = tableUB[i];
|
||||||
rgba[i][ACOMP] = 255;
|
rgba[i][ACOMP] = tableUB[i];
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
case GL_RGB:
|
case GL_RGB:
|
||||||
if (floatTable) {
|
if (table->TableType == GL_FLOAT) {
|
||||||
|
const GLfloat *tableF = (const GLfloat *) table->Table;
|
||||||
for (i = 0; i < table->Size; i++) {
|
for (i = 0; i < table->Size; i++) {
|
||||||
rgba[i][RCOMP] = (GLint) (table->Table[i*3+0] * 255.0F);
|
rgba[i][RCOMP] = (GLint) (tableF[i*3+0] * 255.0F);
|
||||||
rgba[i][GCOMP] = (GLint) (table->Table[i*3+1] * 255.0F);
|
rgba[i][GCOMP] = (GLint) (tableF[i*3+1] * 255.0F);
|
||||||
rgba[i][BCOMP] = (GLint) (table->Table[i*3+2] * 255.0F);
|
rgba[i][BCOMP] = (GLint) (tableF[i*3+2] * 255.0F);
|
||||||
rgba[i][ACOMP] = 255;
|
rgba[i][ACOMP] = 255;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
|
const GLubyte *tableUB = (const GLubyte *) table->Table;
|
||||||
for (i = 0; i < table->Size; i++) {
|
for (i = 0; i < table->Size; i++) {
|
||||||
rgba[i][RCOMP] = table->Table[i*3+0];
|
rgba[i][RCOMP] = tableUB[i*3+0];
|
||||||
rgba[i][GCOMP] = table->Table[i*3+1];
|
rgba[i][GCOMP] = tableUB[i*3+1];
|
||||||
rgba[i][BCOMP] = table->Table[i*3+2];
|
rgba[i][BCOMP] = tableUB[i*3+2];
|
||||||
rgba[i][ACOMP] = 255;
|
rgba[i][ACOMP] = 255;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
case GL_RGBA:
|
case GL_RGBA:
|
||||||
if (floatTable) {
|
if (table->TableType == GL_FLOAT) {
|
||||||
|
const GLfloat *tableF = (const GLfloat *) table->Table;
|
||||||
for (i = 0; i < table->Size; i++) {
|
for (i = 0; i < table->Size; i++) {
|
||||||
rgba[i][RCOMP] = (GLint) (table->Table[i*4+0] * 255.0F);
|
rgba[i][RCOMP] = (GLint) (tableF[i*4+0] * 255.0F);
|
||||||
rgba[i][GCOMP] = (GLint) (table->Table[i*4+1] * 255.0F);
|
rgba[i][GCOMP] = (GLint) (tableF[i*4+1] * 255.0F);
|
||||||
rgba[i][BCOMP] = (GLint) (table->Table[i*4+2] * 255.0F);
|
rgba[i][BCOMP] = (GLint) (tableF[i*4+2] * 255.0F);
|
||||||
rgba[i][ACOMP] = (GLint) (table->Table[i*4+3] * 255.0F);
|
rgba[i][ACOMP] = (GLint) (tableF[i*4+3] * 255.0F);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
|
const GLubyte *tableUB = (const GLubyte *) table->Table;
|
||||||
for (i = 0; i < table->Size; i++) {
|
for (i = 0; i < table->Size; i++) {
|
||||||
rgba[i][RCOMP] = table->Table[i*4+0];
|
rgba[i][RCOMP] = tableUB[i*4+0];
|
||||||
rgba[i][GCOMP] = table->Table[i*4+1];
|
rgba[i][GCOMP] = tableUB[i*4+1];
|
||||||
rgba[i][BCOMP] = table->Table[i*4+2];
|
rgba[i][BCOMP] = tableUB[i*4+2];
|
||||||
rgba[i][ACOMP] = table->Table[i*4+3];
|
rgba[i][ACOMP] = tableUB[i*4+3];
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
|
@@ -1,4 +1,4 @@
|
|||||||
/* $Id: colortab.h,v 1.6 2000/04/12 00:27:37 brianp Exp $ */
|
/* $Id: colortab.h,v 1.7 2000/04/17 17:57:04 brianp Exp $ */
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Mesa 3-D graphics library
|
* Mesa 3-D graphics library
|
||||||
@@ -32,6 +32,13 @@
|
|||||||
#include "types.h"
|
#include "types.h"
|
||||||
|
|
||||||
|
|
||||||
|
extern void
|
||||||
|
_mesa_init_colortable( struct gl_color_table *p );
|
||||||
|
|
||||||
|
extern void
|
||||||
|
_mesa_free_colortable_data( struct gl_color_table *p );
|
||||||
|
|
||||||
|
|
||||||
extern void
|
extern void
|
||||||
_mesa_ColorTable( GLenum target, GLenum internalformat,
|
_mesa_ColorTable( GLenum target, GLenum internalformat,
|
||||||
GLsizei width, GLenum format, GLenum type,
|
GLsizei width, GLenum format, GLenum type,
|
||||||
|
@@ -1,4 +1,4 @@
|
|||||||
/* $Id: context.c,v 1.59 2000/04/12 00:27:37 brianp Exp $ */
|
/* $Id: context.c,v 1.60 2000/04/17 17:57:04 brianp Exp $ */
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Mesa 3-D graphics library
|
* Mesa 3-D graphics library
|
||||||
@@ -32,6 +32,7 @@
|
|||||||
#include "accum.h"
|
#include "accum.h"
|
||||||
#include "alphabuf.h"
|
#include "alphabuf.h"
|
||||||
#include "clip.h"
|
#include "clip.h"
|
||||||
|
#include "colortab.h"
|
||||||
#include "context.h"
|
#include "context.h"
|
||||||
#include "cva.h"
|
#include "cva.h"
|
||||||
#include "depth.h"
|
#include "depth.h"
|
||||||
@@ -778,24 +779,6 @@ static void init_2d_map( struct gl_2d_map *map, int n, const float *initial )
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
static void init_color_table( struct gl_color_table *p )
|
|
||||||
{
|
|
||||||
p->Table[0] = 255;
|
|
||||||
p->Table[1] = 255;
|
|
||||||
p->Table[2] = 255;
|
|
||||||
p->Table[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;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Initialize the attribute groups in a GLcontext.
|
* Initialize the attribute groups in a GLcontext.
|
||||||
*/
|
*/
|
||||||
@@ -822,6 +805,7 @@ static void init_attrib_groups( GLcontext *ctx )
|
|||||||
ctx->Const.MaxLineWidthAA = MAX_LINE_WIDTH;
|
ctx->Const.MaxLineWidthAA = MAX_LINE_WIDTH;
|
||||||
ctx->Const.LineWidthGranularity = LINE_WIDTH_GRANULARITY;
|
ctx->Const.LineWidthGranularity = LINE_WIDTH_GRANULARITY;
|
||||||
ctx->Const.NumAuxBuffers = NUM_AUX_BUFFERS;
|
ctx->Const.NumAuxBuffers = NUM_AUX_BUFFERS;
|
||||||
|
ctx->Const.MaxColorTableSize = MAX_COLOR_TABLE_SIZE;
|
||||||
|
|
||||||
/* Modelview matrix */
|
/* Modelview matrix */
|
||||||
gl_matrix_ctr( &ctx->ModelView );
|
gl_matrix_ctr( &ctx->ModelView );
|
||||||
@@ -1207,7 +1191,7 @@ static void init_attrib_groups( GLcontext *ctx )
|
|||||||
ctx->Texture.Enabled = 0;
|
ctx->Texture.Enabled = 0;
|
||||||
for (i=0; i<MAX_TEXTURE_UNITS; i++)
|
for (i=0; i<MAX_TEXTURE_UNITS; i++)
|
||||||
init_texture_unit( ctx, i );
|
init_texture_unit( ctx, i );
|
||||||
init_color_table(&ctx->Texture.Palette);
|
_mesa_init_colortable(&ctx->Texture.Palette);
|
||||||
|
|
||||||
/* Transformation group */
|
/* Transformation group */
|
||||||
ctx->Transform.MatrixMode = GL_MODELVIEW;
|
ctx->Transform.MatrixMode = GL_MODELVIEW;
|
||||||
@@ -1325,12 +1309,12 @@ static void init_attrib_groups( GLcontext *ctx )
|
|||||||
ctx->CurrentPos = 0;
|
ctx->CurrentPos = 0;
|
||||||
|
|
||||||
/* Color tables */
|
/* Color tables */
|
||||||
init_color_table(&ctx->ColorTable);
|
_mesa_init_colortable(&ctx->ColorTable);
|
||||||
init_color_table(&ctx->ProxyColorTable);
|
_mesa_init_colortable(&ctx->ProxyColorTable);
|
||||||
init_color_table(&ctx->PostConvolutionColorTable);
|
_mesa_init_colortable(&ctx->PostConvolutionColorTable);
|
||||||
init_color_table(&ctx->ProxyPostConvolutionColorTable);
|
_mesa_init_colortable(&ctx->ProxyPostConvolutionColorTable);
|
||||||
init_color_table(&ctx->PostColorMatrixColorTable);
|
_mesa_init_colortable(&ctx->PostColorMatrixColorTable);
|
||||||
init_color_table(&ctx->ProxyPostColorMatrixColorTable);
|
_mesa_init_colortable(&ctx->ProxyPostColorMatrixColorTable);
|
||||||
|
|
||||||
/* Miscellaneous */
|
/* Miscellaneous */
|
||||||
ctx->NewState = NEW_ALL;
|
ctx->NewState = NEW_ALL;
|
||||||
@@ -1598,7 +1582,7 @@ void gl_free_context_data( GLcontext *ctx )
|
|||||||
|
|
||||||
FREE( ctx->PB );
|
FREE( ctx->PB );
|
||||||
|
|
||||||
if(ctx->input != ctx->VB->IM)
|
if (ctx->input != ctx->VB->IM)
|
||||||
gl_immediate_free( ctx->input );
|
gl_immediate_free( ctx->input );
|
||||||
|
|
||||||
gl_vb_free( ctx->VB );
|
gl_vb_free( ctx->VB );
|
||||||
@@ -1661,6 +1645,11 @@ void gl_free_context_data( GLcontext *ctx )
|
|||||||
if (ctx->EvalMap.Map2Texture4.Points)
|
if (ctx->EvalMap.Map2Texture4.Points)
|
||||||
FREE( ctx->EvalMap.Map2Texture4.Points );
|
FREE( ctx->EvalMap.Map2Texture4.Points );
|
||||||
|
|
||||||
|
_mesa_free_colortable_data( &ctx->ColorTable );
|
||||||
|
_mesa_free_colortable_data( &ctx->PostConvolutionColorTable );
|
||||||
|
_mesa_free_colortable_data( &ctx->PostColorMatrixColorTable );
|
||||||
|
_mesa_free_colortable_data( &ctx->Texture.Palette );
|
||||||
|
|
||||||
/* Free cache of immediate buffers. */
|
/* Free cache of immediate buffers. */
|
||||||
while (ctx->nr_im_queued-- > 0) {
|
while (ctx->nr_im_queued-- > 0) {
|
||||||
struct immediate * next = ctx->freed_im_queue->next;
|
struct immediate * next = ctx->freed_im_queue->next;
|
||||||
|
@@ -1,4 +1,4 @@
|
|||||||
/* $Id: pixel.c,v 1.8 2000/04/17 15:13:53 brianp Exp $ */
|
/* $Id: pixel.c,v 1.9 2000/04/17 17:57:04 brianp Exp $ */
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Mesa 3-D graphics library
|
* Mesa 3-D graphics library
|
||||||
@@ -726,40 +726,75 @@ void
|
|||||||
_mesa_lookup_rgba(const struct gl_color_table *table,
|
_mesa_lookup_rgba(const struct gl_color_table *table,
|
||||||
GLuint n, GLfloat rgba[][4])
|
GLuint n, GLfloat rgba[][4])
|
||||||
{
|
{
|
||||||
|
ASSERT(table->TableType == GL_FLOAT);
|
||||||
|
if (!table->Table)
|
||||||
|
return;
|
||||||
|
|
||||||
switch (table->Format) {
|
switch (table->Format) {
|
||||||
case GL_INTENSITY:
|
case GL_INTENSITY:
|
||||||
{
|
|
||||||
const GLfloat scale = (GLfloat) (table->Size - 1);
|
|
||||||
const GLfloat *lut = table->TableF;
|
|
||||||
GLuint i;
|
|
||||||
/* replace RGBA with I */
|
/* replace RGBA with I */
|
||||||
|
if (table->TableType == GL_UNSIGNED_BYTE) {
|
||||||
|
const GLfloat scale = (GLfloat) (table->Size - 1);
|
||||||
|
const GLubyte *lut = (const GLubyte *) table->Table;
|
||||||
|
GLuint i;
|
||||||
for (i = 0; i < n; i++) {
|
for (i = 0; i < n; i++) {
|
||||||
GLint j = (GLint) (rgba[i][RCOMP] * scale + 0.5F);
|
GLint j = (GLint) (rgba[i][RCOMP] * scale + 0.5F);
|
||||||
GLubyte c = lut[j];
|
GLfloat c = lut[j] * (1.0F / 255.0F);
|
||||||
|
rgba[i][RCOMP] = rgba[i][GCOMP] =
|
||||||
|
rgba[i][BCOMP] = rgba[i][ACOMP] = c;
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
const GLfloat scale = (GLfloat) (table->Size - 1);
|
||||||
|
const GLfloat *lut = (const GLfloat *) table->Table;
|
||||||
|
GLuint i;
|
||||||
|
for (i = 0; i < n; i++) {
|
||||||
|
GLint j = (GLint) (rgba[i][RCOMP] * scale + 0.5F);
|
||||||
|
GLfloat c = lut[j];
|
||||||
rgba[i][RCOMP] = rgba[i][GCOMP] =
|
rgba[i][RCOMP] = rgba[i][GCOMP] =
|
||||||
rgba[i][BCOMP] = rgba[i][ACOMP] = c;
|
rgba[i][BCOMP] = rgba[i][ACOMP] = c;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
case GL_LUMINANCE:
|
case GL_LUMINANCE:
|
||||||
{
|
|
||||||
const GLfloat scale = (GLfloat) (table->Size - 1);
|
|
||||||
const GLfloat *lut = table->TableF;
|
|
||||||
GLuint i;
|
|
||||||
/* replace RGB with L */
|
/* replace RGB with L */
|
||||||
|
if (table->TableType == GL_UNSIGNED_BYTE) {
|
||||||
|
const GLfloat scale = (GLfloat) (table->Size - 1);
|
||||||
|
const GLubyte *lut = (const GLubyte *) table->Table;
|
||||||
|
GLuint i;
|
||||||
for (i = 0; i < n; i++) {
|
for (i = 0; i < n; i++) {
|
||||||
GLint j = (GLint) (rgba[i][RCOMP] * scale + 0.5F);
|
GLint j = (GLint) (rgba[i][RCOMP] * scale + 0.5F);
|
||||||
GLubyte c = lut[j];
|
GLfloat c = lut[j] * (1.0F / 255.0F);
|
||||||
|
rgba[i][RCOMP] = rgba[i][GCOMP] = rgba[i][BCOMP] = c;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
const GLfloat scale = (GLfloat) (table->Size - 1);
|
||||||
|
const GLfloat *lut = (const GLfloat *) table->Table;
|
||||||
|
GLuint i;
|
||||||
|
for (i = 0; i < n; i++) {
|
||||||
|
GLint j = (GLint) (rgba[i][RCOMP] * scale + 0.5F);
|
||||||
|
GLfloat c = lut[j];
|
||||||
rgba[i][RCOMP] = rgba[i][GCOMP] = rgba[i][BCOMP] = c;
|
rgba[i][RCOMP] = rgba[i][GCOMP] = rgba[i][BCOMP] = c;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
case GL_ALPHA:
|
case GL_ALPHA:
|
||||||
{
|
|
||||||
const GLfloat scale = (GLfloat) (table->Size - 1);
|
|
||||||
const GLfloat *lut = table->TableF;
|
|
||||||
GLuint i;
|
|
||||||
/* replace A with A */
|
/* replace A with A */
|
||||||
|
if (table->TableType == GL_UNSIGNED_BYTE) {
|
||||||
|
const GLfloat scale = (GLfloat) (table->Size - 1);
|
||||||
|
const GLubyte *lut = (const GLubyte *) table->Table;
|
||||||
|
GLuint i;
|
||||||
|
for (i = 0; i < n; i++) {
|
||||||
|
GLint j = (GLint) (rgba[i][ACOMP] * scale + 0.5F);
|
||||||
|
rgba[i][ACOMP] = lut[j] * (1.0F / 255.0F);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
const GLfloat scale = (GLfloat) (table->Size - 1);
|
||||||
|
const GLfloat *lut = (const GLfloat *) table->Table;
|
||||||
|
GLuint i;
|
||||||
for (i = 0; i < n; i++) {
|
for (i = 0; i < n; i++) {
|
||||||
GLint j = (GLint) (rgba[i][ACOMP] * scale + 0.5F);
|
GLint j = (GLint) (rgba[i][ACOMP] * scale + 0.5F);
|
||||||
rgba[i][ACOMP] = lut[j];
|
rgba[i][ACOMP] = lut[j];
|
||||||
@@ -767,27 +802,53 @@ _mesa_lookup_rgba(const struct gl_color_table *table,
|
|||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
case GL_LUMINANCE_ALPHA:
|
case GL_LUMINANCE_ALPHA:
|
||||||
{
|
|
||||||
const GLfloat scale = (GLfloat) (table->Size - 1);
|
|
||||||
const GLfloat *lut = table->TableF;
|
|
||||||
GLuint i;
|
|
||||||
/* replace RGBA with LLLA */
|
/* replace RGBA with LLLA */
|
||||||
|
if (table->TableType == GL_UNSIGNED_BYTE) {
|
||||||
|
const GLfloat scale = (GLfloat) (table->Size - 1);
|
||||||
|
const GLubyte *lut = (const GLubyte *) table->Table;
|
||||||
|
GLuint i;
|
||||||
for (i = 0; i < n; i++) {
|
for (i = 0; i < n; i++) {
|
||||||
GLint jL = (GLint) (rgba[i][RCOMP] * scale + 0.5F);
|
GLint jL = (GLint) (rgba[i][RCOMP] * scale + 0.5F);
|
||||||
GLint jA = (GLint) (rgba[i][ACOMP] * scale + 0.5F);
|
GLint jA = (GLint) (rgba[i][ACOMP] * scale + 0.5F);
|
||||||
GLubyte luminance = lut[jL * 2 + 0];
|
GLfloat luminance = lut[jL * 2 + 0] * (1.0F / 255.0F);
|
||||||
GLubyte alpha = lut[jA * 2 + 1];
|
GLfloat alpha = lut[jA * 2 + 1] * (1.0F / 255.0F);
|
||||||
|
rgba[i][RCOMP] = rgba[i][GCOMP] = rgba[i][BCOMP] = luminance;
|
||||||
|
rgba[i][ACOMP] = alpha;;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
const GLfloat scale = (GLfloat) (table->Size - 1);
|
||||||
|
const GLfloat *lut = (const GLfloat *) table->Table;
|
||||||
|
GLuint i;
|
||||||
|
for (i = 0; i < n; i++) {
|
||||||
|
GLint jL = (GLint) (rgba[i][RCOMP] * scale + 0.5F);
|
||||||
|
GLint jA = (GLint) (rgba[i][ACOMP] * scale + 0.5F);
|
||||||
|
GLfloat luminance = lut[jL * 2 + 0];
|
||||||
|
GLfloat alpha = lut[jA * 2 + 1];
|
||||||
rgba[i][RCOMP] = rgba[i][GCOMP] = rgba[i][BCOMP] = luminance;
|
rgba[i][RCOMP] = rgba[i][GCOMP] = rgba[i][BCOMP] = luminance;
|
||||||
rgba[i][ACOMP] = alpha;;
|
rgba[i][ACOMP] = alpha;;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
case GL_RGB:
|
case GL_RGB:
|
||||||
{
|
|
||||||
const GLfloat scale = (GLfloat) (table->Size - 1);
|
|
||||||
const GLfloat *lut = table->TableF;
|
|
||||||
GLuint i;
|
|
||||||
/* replace RGB with RGB */
|
/* replace RGB with RGB */
|
||||||
|
if (table->TableType == GL_UNSIGNED_BYTE) {
|
||||||
|
const GLfloat scale = (GLfloat) (table->Size - 1);
|
||||||
|
const GLubyte *lut = (const GLubyte *) table->Table;
|
||||||
|
GLuint i;
|
||||||
|
for (i = 0; i < n; i++) {
|
||||||
|
GLint jR = (GLint) (rgba[i][RCOMP] * scale + 0.5F);
|
||||||
|
GLint jG = (GLint) (rgba[i][GCOMP] * scale + 0.5F);
|
||||||
|
GLint jB = (GLint) (rgba[i][BCOMP] * scale + 0.5F);
|
||||||
|
rgba[i][RCOMP] = lut[jR * 3 + 0] * (1.0F / 255.0F);
|
||||||
|
rgba[i][GCOMP] = lut[jG * 3 + 1] * (1.0F / 255.0F);
|
||||||
|
rgba[i][BCOMP] = lut[jB * 3 + 2] * (1.0F / 255.0F);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
const GLfloat scale = (GLfloat) (table->Size - 1);
|
||||||
|
const GLfloat *lut = (const GLfloat *) table->Table;
|
||||||
|
GLuint i;
|
||||||
for (i = 0; i < n; i++) {
|
for (i = 0; i < n; i++) {
|
||||||
GLint jR = (GLint) (rgba[i][RCOMP] * scale + 0.5F);
|
GLint jR = (GLint) (rgba[i][RCOMP] * scale + 0.5F);
|
||||||
GLint jG = (GLint) (rgba[i][GCOMP] * scale + 0.5F);
|
GLint jG = (GLint) (rgba[i][GCOMP] * scale + 0.5F);
|
||||||
@@ -799,11 +860,26 @@ _mesa_lookup_rgba(const struct gl_color_table *table,
|
|||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
case GL_RGBA:
|
case GL_RGBA:
|
||||||
{
|
|
||||||
const GLfloat scale = (GLfloat) (table->Size - 1);
|
|
||||||
const GLfloat *lut = table->TableF;
|
|
||||||
GLuint i;
|
|
||||||
/* replace RGBA with RGBA */
|
/* replace RGBA with RGBA */
|
||||||
|
if (table->TableType == GL_UNSIGNED_BYTE) {
|
||||||
|
const GLfloat scale = (GLfloat) (table->Size - 1);
|
||||||
|
const GLubyte *lut = (const GLubyte *) table->Table;
|
||||||
|
GLuint i;
|
||||||
|
for (i = 0; i < n; i++) {
|
||||||
|
GLint jR = (GLint) (rgba[i][RCOMP] * scale + 0.5F);
|
||||||
|
GLint jG = (GLint) (rgba[i][GCOMP] * scale + 0.5F);
|
||||||
|
GLint jB = (GLint) (rgba[i][BCOMP] * scale + 0.5F);
|
||||||
|
GLint jA = (GLint) (rgba[i][ACOMP] * scale + 0.5F);
|
||||||
|
rgba[i][RCOMP] = lut[jR * 4 + 0] * (1.0F / 255.0F);
|
||||||
|
rgba[i][GCOMP] = lut[jG * 4 + 1] * (1.0F / 255.0F);
|
||||||
|
rgba[i][BCOMP] = lut[jB * 4 + 2] * (1.0F / 255.0F);
|
||||||
|
rgba[i][ACOMP] = lut[jA * 4 + 3] * (1.0F / 255.0F);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
const GLfloat scale = (GLfloat) (table->Size - 1);
|
||||||
|
const GLfloat *lut = (const GLfloat *) table->Table;
|
||||||
|
GLuint i;
|
||||||
for (i = 0; i < n; i++) {
|
for (i = 0; i < n; i++) {
|
||||||
GLint jR = (GLint) (rgba[i][RCOMP] * scale + 0.5F);
|
GLint jR = (GLint) (rgba[i][RCOMP] * scale + 0.5F);
|
||||||
GLint jG = (GLint) (rgba[i][GCOMP] * scale + 0.5F);
|
GLint jG = (GLint) (rgba[i][GCOMP] * scale + 0.5F);
|
||||||
|
@@ -28,6 +28,7 @@
|
|||||||
#include "all.h"
|
#include "all.h"
|
||||||
#else
|
#else
|
||||||
#include "glheader.h"
|
#include "glheader.h"
|
||||||
|
#include "colortab.h"
|
||||||
#include "context.h"
|
#include "context.h"
|
||||||
#include "enums.h"
|
#include "enums.h"
|
||||||
#include "hash.h"
|
#include "hash.h"
|
||||||
@@ -73,13 +74,7 @@ gl_alloc_texture_object( struct gl_shared_state *shared, GLuint name,
|
|||||||
obj->BaseLevel = 0;
|
obj->BaseLevel = 0;
|
||||||
obj->MaxLevel = 1000;
|
obj->MaxLevel = 1000;
|
||||||
obj->MinMagThresh = 0.0F;
|
obj->MinMagThresh = 0.0F;
|
||||||
obj->Palette.Table[0] = 255;
|
_mesa_init_colortable(&obj->Palette);
|
||||||
obj->Palette.Table[1] = 255;
|
|
||||||
obj->Palette.Table[2] = 255;
|
|
||||||
obj->Palette.Table[3] = 255;
|
|
||||||
obj->Palette.Size = 1;
|
|
||||||
obj->Palette.IntFormat = GL_RGBA;
|
|
||||||
obj->Palette.Format = GL_RGBA;
|
|
||||||
|
|
||||||
/* insert into linked list */
|
/* insert into linked list */
|
||||||
if (shared) {
|
if (shared) {
|
||||||
@@ -143,7 +138,9 @@ void gl_free_texture_object( struct gl_shared_state *shared,
|
|||||||
_mesa_HashRemove(shared->TexObjects, t->Name);
|
_mesa_HashRemove(shared->TexObjects, t->Name);
|
||||||
}
|
}
|
||||||
|
|
||||||
/* free texture image */
|
_mesa_free_colortable_data(&t->Palette);
|
||||||
|
|
||||||
|
/* free texture images */
|
||||||
{
|
{
|
||||||
GLuint i;
|
GLuint i;
|
||||||
for (i=0;i<MAX_TEXTURE_LEVELS;i++) {
|
for (i=0;i<MAX_TEXTURE_LEVELS;i++) {
|
||||||
|
Reference in New Issue
Block a user