mirror of
https://gitlab.freedesktop.org/mesa/mesa.git
synced 2026-05-09 06:48:06 +02:00
Revamp color table code.
Always store all color tables as both float and ubyte.
This commit is contained in:
parent
e392c92250
commit
e5a6fcc345
9 changed files with 334 additions and 749 deletions
|
|
@ -594,13 +594,11 @@ tdfxIsTextureResident(GLcontext *ctx, struct gl_texture_object *tObj)
|
|||
static GrTexTable_t
|
||||
convertPalette(FxU32 data[256], const struct gl_color_table *table)
|
||||
{
|
||||
const GLubyte *tableUB = (const GLubyte *) table->Table;
|
||||
const GLubyte *tableUB = table->TableUB;
|
||||
GLint width = table->Size;
|
||||
FxU32 r, g, b, a;
|
||||
GLint i;
|
||||
|
||||
ASSERT(table->Type == GL_UNSIGNED_BYTE);
|
||||
|
||||
switch (table->_BaseFormat) {
|
||||
case GL_INTENSITY:
|
||||
for (i = 0; i < width; i++) {
|
||||
|
|
|
|||
|
|
@ -328,8 +328,8 @@ void viaEmitState(struct via_context *vmesa)
|
|||
/* KW: This test never succeeds:
|
||||
*/
|
||||
if (t->regTexFM == HC_HTXnFM_Index8) {
|
||||
struct gl_color_table *table = &texObj->Palette;
|
||||
GLfloat *tableF = (GLfloat *)table->Table;
|
||||
const struct gl_color_table *table = &texObj->Palette;
|
||||
const GLfloat *tableF = table->TableF;
|
||||
|
||||
BEGIN_RING(2 + table->Size);
|
||||
OUT_RING( HC_HEADER2 );
|
||||
|
|
@ -453,8 +453,8 @@ void viaEmitState(struct via_context *vmesa)
|
|||
/* KW: This test never succeeds:
|
||||
*/
|
||||
if (t->regTexFM == HC_HTXnFM_Index8) {
|
||||
struct gl_color_table *table = &texObj->Palette;
|
||||
GLfloat *tableF = (GLfloat *)table->Table;
|
||||
const struct gl_color_table *table = &texObj->Palette;
|
||||
const GLfloat *tableF = table->TableF;
|
||||
|
||||
BEGIN_RING(2 + table->Size);
|
||||
OUT_RING( HC_HEADER2 );
|
||||
|
|
|
|||
|
|
@ -1,8 +1,8 @@
|
|||
/*
|
||||
* Mesa 3-D graphics library
|
||||
* Version: 6.5
|
||||
* Version: 6.5.2
|
||||
*
|
||||
* Copyright (C) 1999-2005 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,32 +92,14 @@ 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 = 8 * sizeof(GLubyte);
|
||||
break;
|
||||
case GL_UNSIGNED_SHORT:
|
||||
sz = 8 * sizeof(GLushort);
|
||||
break;
|
||||
case GL_FLOAT:
|
||||
/* Don't actually return 32 here since that causes the conformance
|
||||
* tests to blow up. Conform thinks the component is an integer,
|
||||
* not a float.
|
||||
*/
|
||||
sz = 8; /** 8 * 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->_BaseFormat) {
|
||||
case GL_ALPHA:
|
||||
|
|
@ -217,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;
|
||||
|
|
@ -233,7 +215,7 @@ 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->_BaseFormat) {
|
||||
|
|
@ -284,16 +266,16 @@ store_colortable_entries(GLcontext *ctx, struct gl_color_table *table,
|
|||
return;
|
||||
}
|
||||
}
|
||||
else {
|
||||
/* non-float (GLchan) */
|
||||
|
||||
/* update the ubyte table */
|
||||
{
|
||||
const GLint comps = _mesa_components_in_format(table->_BaseFormat);
|
||||
GLchan *dest = (GLchan *) table->Table + start * comps;
|
||||
_mesa_unpack_color_span_chan(ctx, count, /* number of entries */
|
||||
table->_BaseFormat, /* dest format */
|
||||
dest, /* dest address */
|
||||
format, type, data, /* src data */
|
||||
&ctx->Unpack,
|
||||
0); /* transfer ops */
|
||||
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) {
|
||||
|
|
@ -317,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 */
|
||||
|
||||
|
|
@ -367,11 +348,9 @@ _mesa_ColorTable( GLenum target, GLenum internalFormat,
|
|||
break;
|
||||
case GL_SHARED_TEXTURE_PALETTE_EXT:
|
||||
table = &ctx->Texture.Palette;
|
||||
tableType = GL_FLOAT;
|
||||
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];
|
||||
|
|
@ -391,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];
|
||||
|
|
@ -407,12 +385,10 @@ _mesa_ColorTable( GLenum target, GLenum internalFormat,
|
|||
return;
|
||||
}
|
||||
table = &(texUnit->ProxyColorTable);
|
||||
tableType = GL_FLOAT;
|
||||
proxy = GL_TRUE;
|
||||
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];
|
||||
|
|
@ -424,12 +400,10 @@ _mesa_ColorTable( GLenum target, GLenum internalFormat,
|
|||
break;
|
||||
case GL_PROXY_POST_CONVOLUTION_COLOR_TABLE:
|
||||
table = &ctx->ProxyPostConvolutionColorTable;
|
||||
tableType = GL_FLOAT;
|
||||
proxy = GL_TRUE;
|
||||
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];
|
||||
|
|
@ -441,7 +415,6 @@ _mesa_ColorTable( GLenum target, GLenum internalFormat,
|
|||
break;
|
||||
case GL_PROXY_POST_COLOR_MATRIX_COLOR_TABLE:
|
||||
table = &ctx->ProxyPostColorMatrixColorTable;
|
||||
tableType = GL_FLOAT;
|
||||
proxy = GL_TRUE;
|
||||
break;
|
||||
default:
|
||||
|
|
@ -491,27 +464,18 @@ _mesa_ColorTable( GLenum target, GLenum internalFormat,
|
|||
table->Size = width;
|
||||
table->InternalFormat = internalFormat;
|
||||
table->_BaseFormat = (GLenum) baseFormat;
|
||||
table->Type = (tableType == GL_FLOAT) ? GL_FLOAT : CHAN_TYPE;
|
||||
|
||||
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 (table->Type == GL_FLOAT) {
|
||||
table->Table = MALLOC(comps * width * sizeof(GLfloat));
|
||||
}
|
||||
else {
|
||||
table->Table = MALLOC(comps * width * sizeof(GLchan));
|
||||
}
|
||||
table->TableF = _mesa_malloc(comps * width * sizeof(GLfloat));
|
||||
table->TableUB = _mesa_malloc(comps * width * sizeof(GLubyte));
|
||||
|
||||
if (!table->Table) {
|
||||
if (!table->TableF || !table->TableUB) {
|
||||
_mesa_error(ctx, GL_OUT_OF_MEMORY, "glColorTable");
|
||||
return;
|
||||
}
|
||||
|
|
@ -652,8 +616,8 @@ _mesa_ColorSubTable( GLenum target, GLsizei start,
|
|||
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;
|
||||
}
|
||||
|
||||
|
|
@ -708,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) {
|
||||
|
|
@ -759,177 +723,67 @@ _mesa_GetColorTable( GLenum target, GLenum format,
|
|||
ASSERT(table);
|
||||
|
||||
switch (table->_BaseFormat) {
|
||||
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;
|
||||
#if CHAN_BITS==32
|
||||
rgba[i][ACOMP] = tableF[i];
|
||||
#else
|
||||
rgba[i][ACOMP] = IROUND_POS(tableF[i] * CHAN_MAXF);
|
||||
#endif
|
||||
}
|
||||
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] = 0;
|
||||
rgba[i][GCOMP] = 0;
|
||||
rgba[i][BCOMP] = 0;
|
||||
rgba[i][ACOMP] = tableUB[i];
|
||||
}
|
||||
}
|
||||
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;
|
||||
}
|
||||
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++) {
|
||||
#if CHAN_BITS==32
|
||||
rgba[i][RCOMP] =
|
||||
rgba[i][GCOMP] =
|
||||
rgba[i][BCOMP] = tableF[i];
|
||||
rgba[i][ACOMP] = CHAN_MAX;
|
||||
#else
|
||||
rgba[i][RCOMP] =
|
||||
rgba[i][GCOMP] =
|
||||
rgba[i][BCOMP] = IROUND_POS(tableF[i] * CHAN_MAXF);
|
||||
rgba[i][ACOMP] = CHAN_MAX;
|
||||
#endif
|
||||
}
|
||||
}
|
||||
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];
|
||||
}
|
||||
else {
|
||||
const GLchan *tableUB = (const GLchan *) table->Table;
|
||||
GLuint i;
|
||||
for (i = 0; i < table->Size; i++) {
|
||||
rgba[i][RCOMP] =
|
||||
rgba[i][GCOMP] =
|
||||
rgba[i][BCOMP] = tableUB[i];
|
||||
rgba[i][ACOMP] = CHAN_MAX;
|
||||
}
|
||||
}
|
||||
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];
|
||||
}
|
||||
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++) {
|
||||
#if CHAN_BITS==32
|
||||
rgba[i][RCOMP] =
|
||||
rgba[i][GCOMP] =
|
||||
rgba[i][BCOMP] = tableF[i*2+0];
|
||||
rgba[i][ACOMP] = tableF[i*2+1];
|
||||
#else
|
||||
rgba[i][RCOMP] =
|
||||
rgba[i][GCOMP] =
|
||||
rgba[i][BCOMP] = IROUND_POS(tableF[i*2+0] * CHAN_MAXF);
|
||||
rgba[i][ACOMP] = IROUND_POS(tableF[i*2+1] * CHAN_MAXF);
|
||||
#endif
|
||||
}
|
||||
}
|
||||
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;
|
||||
}
|
||||
else {
|
||||
const GLchan *tableUB = (const GLchan *) table->Table;
|
||||
GLuint i;
|
||||
for (i = 0; i < table->Size; i++) {
|
||||
rgba[i][RCOMP] =
|
||||
rgba[i][GCOMP] =
|
||||
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++) {
|
||||
#if CHAN_BITS==32
|
||||
rgba[i][RCOMP] =
|
||||
rgba[i][GCOMP] =
|
||||
rgba[i][BCOMP] =
|
||||
rgba[i][ACOMP] = tableF[i];
|
||||
#else
|
||||
rgba[i][RCOMP] =
|
||||
rgba[i][GCOMP] =
|
||||
rgba[i][BCOMP] =
|
||||
rgba[i][ACOMP] = IROUND_POS(tableF[i] * CHAN_MAXF);
|
||||
#endif
|
||||
}
|
||||
}
|
||||
else {
|
||||
const GLchan *tableUB = (const GLchan *) table->Table;
|
||||
GLuint i;
|
||||
for (i = 0; i < table->Size; i++) {
|
||||
rgba[i][RCOMP] =
|
||||
rgba[i][GCOMP] =
|
||||
rgba[i][BCOMP] =
|
||||
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++) {
|
||||
#if CHAN_BITS==32
|
||||
rgba[i][RCOMP] = tableF[i*3+0];
|
||||
rgba[i][GCOMP] = tableF[i*3+1];
|
||||
rgba[i][BCOMP] = tableF[i*3+2];
|
||||
rgba[i][ACOMP] = CHAN_MAX;
|
||||
#else
|
||||
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;
|
||||
#endif
|
||||
}
|
||||
}
|
||||
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_RGBA:
|
||||
if (table->Type == GL_FLOAT) {
|
||||
const GLfloat *tableF = (const GLfloat *) table->Table;
|
||||
#if CHAN_BITS==32
|
||||
_mesa_memcpy(rgba, tableF, 4 * table->Size * sizeof(GLfloat));
|
||||
#else
|
||||
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);
|
||||
}
|
||||
#endif
|
||||
}
|
||||
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;
|
||||
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) {
|
||||
|
|
@ -953,7 +807,7 @@ _mesa_GetColorTable( GLenum target, GLenum format,
|
|||
data = ADD_POINTERS(buf, data);
|
||||
}
|
||||
|
||||
_mesa_pack_rgba_span_chan(ctx, table->Size, (const GLchan (*)[4]) rgba,
|
||||
_mesa_pack_rgba_span_float(ctx, table->Size, (const GLfloat (*)[4]) rgba,
|
||||
format, type, data, &ctx->Pack, GL_FALSE);
|
||||
|
||||
if (ctx->Pack.BufferObj->Name) {
|
||||
|
|
@ -1434,8 +1288,8 @@ _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->InternalFormat = GL_RGBA;
|
||||
}
|
||||
|
|
@ -1445,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;
|
||||
}
|
||||
}
|
||||
|
||||
|
|
@ -1455,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);
|
||||
|
|
@ -1470,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);
|
||||
|
|
|
|||
|
|
@ -1,18 +1,8 @@
|
|||
/**
|
||||
* \file colortab.h
|
||||
* Color tables.
|
||||
*
|
||||
* \if subset
|
||||
* (No-op)
|
||||
*
|
||||
* \endif
|
||||
*/
|
||||
|
||||
/*
|
||||
* Mesa 3-D graphics library
|
||||
* Version: 3.5
|
||||
* Version: 6.5.2
|
||||
*
|
||||
* Copyright (C) 1999-2001 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"),
|
||||
|
|
|
|||
|
|
@ -392,9 +392,9 @@ struct gl_color_table
|
|||
{
|
||||
GLenum InternalFormat; /**< The user-specified format */
|
||||
GLenum _BaseFormat; /**< GL_ALPHA, GL_RGBA, GL_RGB, etc */
|
||||
GLuint Size; /**< number of entries (rows) in table */
|
||||
GLvoid *Table; /**< points to data of <Type> */
|
||||
GLenum Type; /**< GL_UNSIGNED_BYTE or GL_FLOAT */
|
||||
GLuint Size; /**< number of entries in table */
|
||||
GLfloat *TableF; /**< Color table, floating point values */
|
||||
GLubyte *TableUB; /**< Color table, ubyte values */
|
||||
GLubyte RedSize;
|
||||
GLubyte GreenSize;
|
||||
GLubyte BlueSize;
|
||||
|
|
|
|||
|
|
@ -1171,200 +1171,88 @@ void
|
|||
_mesa_lookup_rgba_float(const struct gl_color_table *table,
|
||||
GLuint n, GLfloat rgba[][4])
|
||||
{
|
||||
if (!table->Table || table->Size == 0)
|
||||
const GLint max = table->Size - 1;
|
||||
const GLfloat scale = (GLfloat) max;
|
||||
const GLfloat *lut = table->TableF;
|
||||
GLuint i;
|
||||
|
||||
if (!table->TableF || table->Size == 0)
|
||||
return;
|
||||
|
||||
switch (table->_BaseFormat) {
|
||||
case GL_INTENSITY:
|
||||
/* replace RGBA with I */
|
||||
if (table->Type == GL_FLOAT) {
|
||||
const GLint max = table->Size - 1;
|
||||
const GLfloat scale = (GLfloat) max;
|
||||
const GLfloat *lut = (const GLfloat *) table->Table;
|
||||
GLuint i;
|
||||
for (i = 0; i < n; i++) {
|
||||
GLint j = IROUND(rgba[i][RCOMP] * scale);
|
||||
GLfloat c = lut[CLAMP(j, 0, max)];
|
||||
rgba[i][RCOMP] = rgba[i][GCOMP] =
|
||||
rgba[i][BCOMP] = rgba[i][ACOMP] = c;
|
||||
}
|
||||
}
|
||||
else {
|
||||
const GLint max = table->Size - 1;
|
||||
const GLfloat scale = (GLfloat) max;
|
||||
const GLchan *lut = (const GLchan *) table->Table;
|
||||
GLuint i;
|
||||
for (i = 0; i < n; i++) {
|
||||
GLint j = IROUND(rgba[i][RCOMP] * scale);
|
||||
GLfloat c = CHAN_TO_FLOAT(lut[CLAMP(j, 0, max)]);
|
||||
rgba[i][RCOMP] = rgba[i][GCOMP] =
|
||||
rgba[i][BCOMP] = rgba[i][ACOMP] = c;
|
||||
}
|
||||
for (i = 0; i < n; i++) {
|
||||
GLint j = IROUND(rgba[i][RCOMP] * scale);
|
||||
GLfloat c = lut[CLAMP(j, 0, max)];
|
||||
rgba[i][RCOMP] =
|
||||
rgba[i][GCOMP] =
|
||||
rgba[i][BCOMP] =
|
||||
rgba[i][ACOMP] = c;
|
||||
}
|
||||
break;
|
||||
case GL_LUMINANCE:
|
||||
/* replace RGB with L */
|
||||
if (table->Type == GL_FLOAT) {
|
||||
const GLint max = table->Size - 1;
|
||||
const GLfloat scale = (GLfloat) max;
|
||||
const GLfloat *lut = (const GLfloat *) table->Table;
|
||||
GLuint i;
|
||||
for (i = 0; i < n; i++) {
|
||||
GLint j = IROUND(rgba[i][RCOMP] * scale);
|
||||
GLfloat c = lut[CLAMP(j, 0, max)];
|
||||
rgba[i][RCOMP] = rgba[i][GCOMP] = rgba[i][BCOMP] = c;
|
||||
}
|
||||
}
|
||||
else {
|
||||
const GLint max = table->Size - 1;
|
||||
const GLfloat scale = (GLfloat) max;
|
||||
const GLchan *lut = (const GLchan *) table->Table;
|
||||
GLuint i;
|
||||
for (i = 0; i < n; i++) {
|
||||
GLint j = IROUND(rgba[i][RCOMP] * scale);
|
||||
GLfloat c = CHAN_TO_FLOAT(lut[CLAMP(j, 0, max)]);
|
||||
rgba[i][RCOMP] = rgba[i][GCOMP] = rgba[i][BCOMP] = c;
|
||||
}
|
||||
for (i = 0; i < n; i++) {
|
||||
GLint j = IROUND(rgba[i][RCOMP] * scale);
|
||||
GLfloat c = lut[CLAMP(j, 0, max)];
|
||||
rgba[i][RCOMP] =
|
||||
rgba[i][GCOMP] =
|
||||
rgba[i][BCOMP] = c;
|
||||
}
|
||||
break;
|
||||
case GL_ALPHA:
|
||||
/* replace A with A */
|
||||
if (table->Type == GL_FLOAT) {
|
||||
const GLint max = table->Size - 1;
|
||||
const GLfloat scale = (GLfloat) max;
|
||||
const GLfloat *lut = (const GLfloat *) table->Table;
|
||||
GLuint i;
|
||||
for (i = 0; i < n; i++) {
|
||||
GLint j = IROUND(rgba[i][ACOMP] * scale);
|
||||
rgba[i][ACOMP] = lut[CLAMP(j, 0, max)];
|
||||
}
|
||||
}
|
||||
else {
|
||||
const GLint max = table->Size - 1;
|
||||
const GLfloat scale = (GLfloat) max;
|
||||
const GLchan *lut = (const GLchan *) table->Table;
|
||||
GLuint i;
|
||||
for (i = 0; i < n; i++) {
|
||||
GLint j = IROUND(rgba[i][ACOMP] * scale);
|
||||
rgba[i][ACOMP] = CHAN_TO_FLOAT(lut[CLAMP(j, 0, max)]);
|
||||
}
|
||||
for (i = 0; i < n; i++) {
|
||||
GLint j = IROUND(rgba[i][ACOMP] * scale);
|
||||
rgba[i][ACOMP] = lut[CLAMP(j, 0, max)];
|
||||
}
|
||||
break;
|
||||
case GL_LUMINANCE_ALPHA:
|
||||
/* replace RGBA with LLLA */
|
||||
if (table->Type == GL_FLOAT) {
|
||||
const GLint max = table->Size - 1;
|
||||
const GLfloat scale = (GLfloat) max;
|
||||
const GLfloat *lut = (const GLfloat *) table->Table;
|
||||
GLuint i;
|
||||
for (i = 0; i < n; i++) {
|
||||
GLint jL = IROUND(rgba[i][RCOMP] * scale);
|
||||
GLint jA = IROUND(rgba[i][ACOMP] * scale);
|
||||
GLfloat luminance, alpha;
|
||||
jL = CLAMP(jL, 0, max);
|
||||
jA = CLAMP(jA, 0, max);
|
||||
luminance = lut[jL * 2 + 0];
|
||||
alpha = lut[jA * 2 + 1];
|
||||
rgba[i][RCOMP] = rgba[i][GCOMP] = rgba[i][BCOMP] = luminance;
|
||||
rgba[i][ACOMP] = alpha;;
|
||||
}
|
||||
}
|
||||
else {
|
||||
const GLint max = table->Size - 1;
|
||||
const GLfloat scale = (GLfloat) max;
|
||||
const GLchan *lut = (const GLchan *) table->Table;
|
||||
GLuint i;
|
||||
for (i = 0; i < n; i++) {
|
||||
GLint jL = IROUND(rgba[i][RCOMP] * scale);
|
||||
GLint jA = IROUND(rgba[i][ACOMP] * scale);
|
||||
GLfloat luminance, alpha;
|
||||
jL = CLAMP(jL, 0, max);
|
||||
jA = CLAMP(jA, 0, max);
|
||||
luminance = CHAN_TO_FLOAT(lut[jL * 2 + 0]);
|
||||
alpha = CHAN_TO_FLOAT(lut[jA * 2 + 1]);
|
||||
rgba[i][RCOMP] = rgba[i][GCOMP] = rgba[i][BCOMP] = luminance;
|
||||
rgba[i][ACOMP] = alpha;;
|
||||
}
|
||||
for (i = 0; i < n; i++) {
|
||||
GLint jL = IROUND(rgba[i][RCOMP] * scale);
|
||||
GLint jA = IROUND(rgba[i][ACOMP] * scale);
|
||||
GLfloat luminance, alpha;
|
||||
jL = CLAMP(jL, 0, max);
|
||||
jA = CLAMP(jA, 0, max);
|
||||
luminance = lut[jL * 2 + 0];
|
||||
alpha = lut[jA * 2 + 1];
|
||||
rgba[i][RCOMP] =
|
||||
rgba[i][GCOMP] =
|
||||
rgba[i][BCOMP] = luminance;
|
||||
rgba[i][ACOMP] = alpha;;
|
||||
}
|
||||
break;
|
||||
case GL_RGB:
|
||||
/* replace RGB with RGB */
|
||||
if (table->Type == GL_FLOAT) {
|
||||
const GLint max = table->Size - 1;
|
||||
const GLfloat scale = (GLfloat) max;
|
||||
const GLfloat *lut = (const GLfloat *) table->Table;
|
||||
GLuint i;
|
||||
for (i = 0; i < n; i++) {
|
||||
GLint jR = IROUND(rgba[i][RCOMP] * scale);
|
||||
GLint jG = IROUND(rgba[i][GCOMP] * scale);
|
||||
GLint jB = IROUND(rgba[i][BCOMP] * scale);
|
||||
jR = CLAMP(jR, 0, max);
|
||||
jG = CLAMP(jG, 0, max);
|
||||
jB = CLAMP(jB, 0, max);
|
||||
rgba[i][RCOMP] = lut[jR * 3 + 0];
|
||||
rgba[i][GCOMP] = lut[jG * 3 + 1];
|
||||
rgba[i][BCOMP] = lut[jB * 3 + 2];
|
||||
}
|
||||
}
|
||||
else {
|
||||
const GLint max = table->Size - 1;
|
||||
const GLfloat scale = (GLfloat) max;
|
||||
const GLchan *lut = (const GLchan *) table->Table;
|
||||
GLuint i;
|
||||
for (i = 0; i < n; i++) {
|
||||
GLint jR = IROUND(rgba[i][RCOMP] * scale);
|
||||
GLint jG = IROUND(rgba[i][GCOMP] * scale);
|
||||
GLint jB = IROUND(rgba[i][BCOMP] * scale);
|
||||
jR = CLAMP(jR, 0, max);
|
||||
jG = CLAMP(jG, 0, max);
|
||||
jB = CLAMP(jB, 0, max);
|
||||
rgba[i][RCOMP] = CHAN_TO_FLOAT(lut[jR * 3 + 0]);
|
||||
rgba[i][GCOMP] = CHAN_TO_FLOAT(lut[jG * 3 + 1]);
|
||||
rgba[i][BCOMP] = CHAN_TO_FLOAT(lut[jB * 3 + 2]);
|
||||
}
|
||||
for (i = 0; i < n; i++) {
|
||||
GLint jR = IROUND(rgba[i][RCOMP] * scale);
|
||||
GLint jG = IROUND(rgba[i][GCOMP] * scale);
|
||||
GLint jB = IROUND(rgba[i][BCOMP] * scale);
|
||||
jR = CLAMP(jR, 0, max);
|
||||
jG = CLAMP(jG, 0, max);
|
||||
jB = CLAMP(jB, 0, max);
|
||||
rgba[i][RCOMP] = lut[jR * 3 + 0];
|
||||
rgba[i][GCOMP] = lut[jG * 3 + 1];
|
||||
rgba[i][BCOMP] = lut[jB * 3 + 2];
|
||||
}
|
||||
break;
|
||||
case GL_RGBA:
|
||||
/* replace RGBA with RGBA */
|
||||
if (table->Type == GL_FLOAT) {
|
||||
const GLint max = table->Size - 1;
|
||||
const GLfloat scale = (GLfloat) max;
|
||||
const GLfloat *lut = (const GLfloat *) table->Table;
|
||||
GLuint i;
|
||||
for (i = 0; i < n; i++) {
|
||||
GLint jR = IROUND(rgba[i][RCOMP] * scale);
|
||||
GLint jG = IROUND(rgba[i][GCOMP] * scale);
|
||||
GLint jB = IROUND(rgba[i][BCOMP] * scale);
|
||||
GLint jA = IROUND(rgba[i][ACOMP] * scale);
|
||||
jR = CLAMP(jR, 0, max);
|
||||
jG = CLAMP(jG, 0, max);
|
||||
jB = CLAMP(jB, 0, max);
|
||||
jA = CLAMP(jA, 0, max);
|
||||
rgba[i][RCOMP] = lut[jR * 4 + 0];
|
||||
rgba[i][GCOMP] = lut[jG * 4 + 1];
|
||||
rgba[i][BCOMP] = lut[jB * 4 + 2];
|
||||
rgba[i][ACOMP] = lut[jA * 4 + 3];
|
||||
}
|
||||
}
|
||||
else {
|
||||
const GLint max = table->Size - 1;
|
||||
const GLfloat scale = (GLfloat) max;
|
||||
const GLchan *lut = (const GLchan *) table->Table;
|
||||
GLuint i;
|
||||
for (i = 0; i < n; i++) {
|
||||
GLint jR = IROUND(rgba[i][RCOMP] * scale);
|
||||
GLint jG = IROUND(rgba[i][GCOMP] * scale);
|
||||
GLint jB = IROUND(rgba[i][BCOMP] * scale);
|
||||
GLint jA = IROUND(rgba[i][ACOMP] * scale);
|
||||
jR = CLAMP(jR, 0, max);
|
||||
jG = CLAMP(jG, 0, max);
|
||||
jB = CLAMP(jB, 0, max);
|
||||
jA = CLAMP(jA, 0, max);
|
||||
rgba[i][RCOMP] = CHAN_TO_FLOAT(lut[jR * 4 + 0]);
|
||||
rgba[i][GCOMP] = CHAN_TO_FLOAT(lut[jG * 4 + 1]);
|
||||
rgba[i][BCOMP] = CHAN_TO_FLOAT(lut[jB * 4 + 2]);
|
||||
rgba[i][ACOMP] = CHAN_TO_FLOAT(lut[jA * 4 + 3]);
|
||||
}
|
||||
for (i = 0; i < n; i++) {
|
||||
GLint jR = IROUND(rgba[i][RCOMP] * scale);
|
||||
GLint jG = IROUND(rgba[i][GCOMP] * scale);
|
||||
GLint jB = IROUND(rgba[i][BCOMP] * scale);
|
||||
GLint jA = IROUND(rgba[i][ACOMP] * scale);
|
||||
jR = CLAMP(jR, 0, max);
|
||||
jG = CLAMP(jG, 0, max);
|
||||
jB = CLAMP(jB, 0, max);
|
||||
jA = CLAMP(jA, 0, max);
|
||||
rgba[i][RCOMP] = lut[jR * 4 + 0];
|
||||
rgba[i][GCOMP] = lut[jG * 4 + 1];
|
||||
rgba[i][BCOMP] = lut[jB * 4 + 2];
|
||||
rgba[i][ACOMP] = lut[jA * 4 + 3];
|
||||
}
|
||||
break;
|
||||
default:
|
||||
|
|
@ -1376,271 +1264,143 @@ _mesa_lookup_rgba_float(const struct gl_color_table *table,
|
|||
|
||||
|
||||
/**
|
||||
* Apply a color table lookup to an array of GLchan RGBA colors.
|
||||
* Apply a color table lookup to an array of ubyte/RGBA colors.
|
||||
*/
|
||||
void
|
||||
_mesa_lookup_rgba_chan(const struct gl_color_table *table,
|
||||
GLuint n, GLchan rgba[][4])
|
||||
_mesa_lookup_rgba_ubyte(const struct gl_color_table *table,
|
||||
GLuint n, GLubyte rgba[][4])
|
||||
{
|
||||
if (!table->Table || table->Size == 0)
|
||||
const GLubyte *lut = table->TableUB;
|
||||
const GLfloat scale = (GLfloat) (table->Size - 1) / 255.0;
|
||||
GLuint i;
|
||||
|
||||
if (!table->TableUB || table->Size == 0)
|
||||
return;
|
||||
|
||||
switch (table->_BaseFormat) {
|
||||
case GL_INTENSITY:
|
||||
/* replace RGBA with I */
|
||||
if (table->Type == GL_FLOAT) {
|
||||
const GLfloat scale = (GLfloat) (table->Size - 1) / CHAN_MAXF;
|
||||
const GLfloat *lut = (const GLfloat *) table->Table;
|
||||
GLuint i;
|
||||
for (i = 0; i < n; i++) {
|
||||
GLint j = IROUND((GLfloat) rgba[i][RCOMP] * scale);
|
||||
GLchan c;
|
||||
CLAMPED_FLOAT_TO_CHAN(c, lut[j]);
|
||||
rgba[i][RCOMP] = rgba[i][GCOMP] =
|
||||
rgba[i][BCOMP] = rgba[i][ACOMP] = c;
|
||||
}
|
||||
case GL_INTENSITY:
|
||||
/* replace RGBA with I */
|
||||
if (table->Size == 256) {
|
||||
for (i = 0; i < n; i++) {
|
||||
const GLubyte c = lut[rgba[i][RCOMP]];
|
||||
rgba[i][RCOMP] =
|
||||
rgba[i][GCOMP] =
|
||||
rgba[i][BCOMP] =
|
||||
rgba[i][ACOMP] = c;
|
||||
}
|
||||
else {
|
||||
#if CHAN_TYPE == GL_UNSIGNED_BYTE
|
||||
if (table->Size == 256) {
|
||||
/* common case */
|
||||
const GLchan *lut = (const GLchan *) table->Table;
|
||||
GLuint i;
|
||||
for (i = 0; i < n; i++) {
|
||||
const GLchan c = lut[rgba[i][RCOMP]];
|
||||
rgba[i][RCOMP] = rgba[i][GCOMP] =
|
||||
rgba[i][BCOMP] = rgba[i][ACOMP] = c;
|
||||
}
|
||||
}
|
||||
else
|
||||
#endif
|
||||
{
|
||||
const GLfloat scale = (GLfloat) (table->Size - 1) / CHAN_MAXF;
|
||||
const GLchan *lut = (const GLchan *) table->Table;
|
||||
GLuint i;
|
||||
for (i = 0; i < n; i++) {
|
||||
GLint j = IROUND((GLfloat) rgba[i][RCOMP] * scale);
|
||||
rgba[i][RCOMP] = rgba[i][GCOMP] =
|
||||
rgba[i][BCOMP] = rgba[i][ACOMP] = lut[j];
|
||||
}
|
||||
}
|
||||
}
|
||||
else {
|
||||
for (i = 0; i < n; i++) {
|
||||
GLint j = IROUND((GLfloat) rgba[i][RCOMP] * scale);
|
||||
rgba[i][RCOMP] =
|
||||
rgba[i][GCOMP] =
|
||||
rgba[i][BCOMP] =
|
||||
rgba[i][ACOMP] = lut[j];
|
||||
}
|
||||
break;
|
||||
case GL_LUMINANCE:
|
||||
/* replace RGB with L */
|
||||
if (table->Type == GL_FLOAT) {
|
||||
const GLfloat scale = (GLfloat) (table->Size - 1) / CHAN_MAXF;
|
||||
const GLfloat *lut = (const GLfloat *) table->Table;
|
||||
GLuint i;
|
||||
for (i = 0; i < n; i++) {
|
||||
GLint j = IROUND((GLfloat) rgba[i][RCOMP] * scale);
|
||||
GLchan c;
|
||||
CLAMPED_FLOAT_TO_CHAN(c, lut[j]);
|
||||
rgba[i][RCOMP] = rgba[i][GCOMP] = rgba[i][BCOMP] = c;
|
||||
}
|
||||
}
|
||||
break;
|
||||
case GL_LUMINANCE:
|
||||
/* replace RGB with L */
|
||||
if (table->Size == 256) {
|
||||
for (i = 0; i < n; i++) {
|
||||
const GLubyte c = lut[rgba[i][RCOMP]];
|
||||
rgba[i][RCOMP] =
|
||||
rgba[i][GCOMP] =
|
||||
rgba[i][BCOMP] = c;
|
||||
}
|
||||
else {
|
||||
#if CHAN_TYPE == GL_UNSIGNED_BYTE
|
||||
if (table->Size == 256) {
|
||||
/* common case */
|
||||
const GLchan *lut = (const GLchan *) table->Table;
|
||||
GLuint i;
|
||||
for (i = 0; i < n; i++) {
|
||||
const GLchan c = lut[rgba[i][RCOMP]];
|
||||
rgba[i][RCOMP] = rgba[i][GCOMP] = rgba[i][BCOMP] = c;
|
||||
}
|
||||
}
|
||||
else
|
||||
#endif
|
||||
{
|
||||
const GLfloat scale = (GLfloat) (table->Size - 1) / CHAN_MAXF;
|
||||
const GLchan *lut = (const GLchan *) table->Table;
|
||||
GLuint i;
|
||||
for (i = 0; i < n; i++) {
|
||||
GLint j = IROUND((GLfloat) rgba[i][RCOMP] * scale);
|
||||
rgba[i][RCOMP] = rgba[i][GCOMP] = rgba[i][BCOMP] = lut[j];
|
||||
}
|
||||
}
|
||||
}
|
||||
else {
|
||||
for (i = 0; i < n; i++) {
|
||||
GLint j = IROUND((GLfloat) rgba[i][RCOMP] * scale);
|
||||
rgba[i][RCOMP] =
|
||||
rgba[i][GCOMP] =
|
||||
rgba[i][BCOMP] = lut[j];
|
||||
}
|
||||
break;
|
||||
case GL_ALPHA:
|
||||
/* replace A with A */
|
||||
if (table->Type == GL_FLOAT) {
|
||||
const GLfloat scale = (GLfloat) (table->Size - 1) / CHAN_MAXF;
|
||||
const GLfloat *lut = (const GLfloat *) table->Table;
|
||||
GLuint i;
|
||||
for (i = 0; i < n; i++) {
|
||||
GLint j = IROUND((GLfloat) rgba[i][ACOMP] * scale);
|
||||
GLchan c;
|
||||
CLAMPED_FLOAT_TO_CHAN(c, lut[j]);
|
||||
rgba[i][ACOMP] = c;
|
||||
}
|
||||
}
|
||||
break;
|
||||
case GL_ALPHA:
|
||||
/* replace A with A */
|
||||
if (table->Size == 256) {
|
||||
for (i = 0; i < n; i++) {
|
||||
rgba[i][ACOMP] = lut[rgba[i][ACOMP]];
|
||||
}
|
||||
else {
|
||||
#if CHAN_TYPE == GL_UNSIGNED_BYTE
|
||||
if (table->Size == 256) {
|
||||
/* common case */
|
||||
const GLchan *lut = (const GLchan *) table->Table;
|
||||
GLuint i;
|
||||
for (i = 0; i < n; i++) {
|
||||
rgba[i][ACOMP] = lut[rgba[i][ACOMP]];
|
||||
}
|
||||
}
|
||||
else
|
||||
#endif
|
||||
{
|
||||
const GLfloat scale = (GLfloat) (table->Size - 1) / CHAN_MAXF;
|
||||
const GLchan *lut = (const GLchan *) table->Table;
|
||||
GLuint i;
|
||||
for (i = 0; i < n; i++) {
|
||||
GLint j = IROUND((GLfloat) rgba[i][ACOMP] * scale);
|
||||
rgba[i][ACOMP] = lut[j];
|
||||
}
|
||||
}
|
||||
}
|
||||
else {
|
||||
for (i = 0; i < n; i++) {
|
||||
GLint j = IROUND((GLfloat) rgba[i][ACOMP] * scale);
|
||||
rgba[i][ACOMP] = lut[j];
|
||||
}
|
||||
break;
|
||||
case GL_LUMINANCE_ALPHA:
|
||||
/* replace RGBA with LLLA */
|
||||
if (table->Type == GL_FLOAT) {
|
||||
const GLfloat scale = (GLfloat) (table->Size - 1) / CHAN_MAXF;
|
||||
const GLfloat *lut = (const GLfloat *) table->Table;
|
||||
GLuint i;
|
||||
for (i = 0; i < n; i++) {
|
||||
GLint jL = IROUND((GLfloat) rgba[i][RCOMP] * scale);
|
||||
GLint jA = IROUND((GLfloat) rgba[i][ACOMP] * scale);
|
||||
GLchan luminance, alpha;
|
||||
CLAMPED_FLOAT_TO_CHAN(luminance, lut[jL * 2 + 0]);
|
||||
CLAMPED_FLOAT_TO_CHAN(alpha, lut[jA * 2 + 1]);
|
||||
rgba[i][RCOMP] = rgba[i][GCOMP] = rgba[i][BCOMP] = luminance;
|
||||
rgba[i][ACOMP] = alpha;;
|
||||
}
|
||||
}
|
||||
break;
|
||||
case GL_LUMINANCE_ALPHA:
|
||||
/* replace RGBA with LLLA */
|
||||
if (table->Size == 256) {
|
||||
for (i = 0; i < n; i++) {
|
||||
GLchan l = lut[rgba[i][RCOMP] * 2 + 0];
|
||||
GLchan a = lut[rgba[i][ACOMP] * 2 + 1];;
|
||||
rgba[i][RCOMP] =
|
||||
rgba[i][GCOMP] =
|
||||
rgba[i][BCOMP] = l;
|
||||
rgba[i][ACOMP] = a;
|
||||
}
|
||||
else {
|
||||
#if CHAN_TYPE == GL_UNSIGNED_BYTE
|
||||
if (table->Size == 256) {
|
||||
/* common case */
|
||||
const GLchan *lut = (const GLchan *) table->Table;
|
||||
GLuint i;
|
||||
for (i = 0; i < n; i++) {
|
||||
GLchan l = lut[rgba[i][RCOMP] * 2 + 0];
|
||||
GLchan a = lut[rgba[i][ACOMP] * 2 + 1];;
|
||||
rgba[i][RCOMP] = rgba[i][GCOMP] = rgba[i][BCOMP] = l;
|
||||
rgba[i][ACOMP] = a;
|
||||
}
|
||||
}
|
||||
else
|
||||
#endif
|
||||
{
|
||||
const GLfloat scale = (GLfloat) (table->Size - 1) / CHAN_MAXF;
|
||||
const GLchan *lut = (const GLchan *) table->Table;
|
||||
GLuint i;
|
||||
for (i = 0; i < n; i++) {
|
||||
GLint jL = IROUND((GLfloat) rgba[i][RCOMP] * scale);
|
||||
GLint jA = IROUND((GLfloat) rgba[i][ACOMP] * scale);
|
||||
GLchan luminance = lut[jL * 2 + 0];
|
||||
GLchan alpha = lut[jA * 2 + 1];
|
||||
rgba[i][RCOMP] = rgba[i][GCOMP] = rgba[i][BCOMP] = luminance;
|
||||
rgba[i][ACOMP] = alpha;
|
||||
}
|
||||
}
|
||||
}
|
||||
else {
|
||||
for (i = 0; i < n; i++) {
|
||||
GLint jL = IROUND((GLfloat) rgba[i][RCOMP] * scale);
|
||||
GLint jA = IROUND((GLfloat) rgba[i][ACOMP] * scale);
|
||||
GLchan luminance = lut[jL * 2 + 0];
|
||||
GLchan alpha = lut[jA * 2 + 1];
|
||||
rgba[i][RCOMP] =
|
||||
rgba[i][GCOMP] =
|
||||
rgba[i][BCOMP] = luminance;
|
||||
rgba[i][ACOMP] = alpha;
|
||||
}
|
||||
break;
|
||||
case GL_RGB:
|
||||
/* replace RGB with RGB */
|
||||
if (table->Type == GL_FLOAT) {
|
||||
const GLfloat scale = (GLfloat) (table->Size - 1) / CHAN_MAXF;
|
||||
const GLfloat *lut = (const GLfloat *) table->Table;
|
||||
GLuint i;
|
||||
for (i = 0; i < n; i++) {
|
||||
GLint jR = IROUND((GLfloat) rgba[i][RCOMP] * scale);
|
||||
GLint jG = IROUND((GLfloat) rgba[i][GCOMP] * scale);
|
||||
GLint jB = IROUND((GLfloat) rgba[i][BCOMP] * scale);
|
||||
CLAMPED_FLOAT_TO_CHAN(rgba[i][RCOMP], lut[jR * 3 + 0]);
|
||||
CLAMPED_FLOAT_TO_CHAN(rgba[i][GCOMP], lut[jG * 3 + 1]);
|
||||
CLAMPED_FLOAT_TO_CHAN(rgba[i][BCOMP], lut[jB * 3 + 2]);
|
||||
}
|
||||
}
|
||||
break;
|
||||
case GL_RGB:
|
||||
if (table->Size == 256) {
|
||||
for (i = 0; i < n; i++) {
|
||||
rgba[i][RCOMP] = lut[rgba[i][RCOMP] * 3 + 0];
|
||||
rgba[i][GCOMP] = lut[rgba[i][GCOMP] * 3 + 1];
|
||||
rgba[i][BCOMP] = lut[rgba[i][BCOMP] * 3 + 2];
|
||||
}
|
||||
else {
|
||||
#if CHAN_TYPE == GL_UNSIGNED_BYTE
|
||||
if (table->Size == 256) {
|
||||
/* common case */
|
||||
const GLchan *lut = (const GLchan *) table->Table;
|
||||
GLuint i;
|
||||
for (i = 0; i < n; i++) {
|
||||
rgba[i][RCOMP] = lut[rgba[i][RCOMP] * 3 + 0];
|
||||
rgba[i][GCOMP] = lut[rgba[i][GCOMP] * 3 + 1];
|
||||
rgba[i][BCOMP] = lut[rgba[i][BCOMP] * 3 + 2];
|
||||
}
|
||||
}
|
||||
else
|
||||
#endif
|
||||
{
|
||||
const GLfloat scale = (GLfloat) (table->Size - 1) / CHAN_MAXF;
|
||||
const GLchan *lut = (const GLchan *) table->Table;
|
||||
GLuint i;
|
||||
for (i = 0; i < n; i++) {
|
||||
GLint jR = IROUND((GLfloat) rgba[i][RCOMP] * scale);
|
||||
GLint jG = IROUND((GLfloat) rgba[i][GCOMP] * scale);
|
||||
GLint jB = IROUND((GLfloat) rgba[i][BCOMP] * scale);
|
||||
rgba[i][RCOMP] = lut[jR * 3 + 0];
|
||||
rgba[i][GCOMP] = lut[jG * 3 + 1];
|
||||
rgba[i][BCOMP] = lut[jB * 3 + 2];
|
||||
}
|
||||
}
|
||||
}
|
||||
else {
|
||||
for (i = 0; i < n; i++) {
|
||||
GLint jR = IROUND((GLfloat) rgba[i][RCOMP] * scale);
|
||||
GLint jG = IROUND((GLfloat) rgba[i][GCOMP] * scale);
|
||||
GLint jB = IROUND((GLfloat) rgba[i][BCOMP] * scale);
|
||||
rgba[i][RCOMP] = lut[jR * 3 + 0];
|
||||
rgba[i][GCOMP] = lut[jG * 3 + 1];
|
||||
rgba[i][BCOMP] = lut[jB * 3 + 2];
|
||||
}
|
||||
break;
|
||||
case GL_RGBA:
|
||||
/* replace RGBA with RGBA */
|
||||
if (table->Type == GL_FLOAT) {
|
||||
const GLfloat scale = (GLfloat) (table->Size - 1) / CHAN_MAXF;
|
||||
const GLfloat *lut = (const GLfloat *) table->Table;
|
||||
GLuint i;
|
||||
for (i = 0; i < n; i++) {
|
||||
GLint jR = IROUND((GLfloat) rgba[i][RCOMP] * scale);
|
||||
GLint jG = IROUND((GLfloat) rgba[i][GCOMP] * scale);
|
||||
GLint jB = IROUND((GLfloat) rgba[i][BCOMP] * scale);
|
||||
GLint jA = IROUND((GLfloat) rgba[i][ACOMP] * scale);
|
||||
CLAMPED_FLOAT_TO_CHAN(rgba[i][RCOMP], lut[jR * 4 + 0]);
|
||||
CLAMPED_FLOAT_TO_CHAN(rgba[i][GCOMP], lut[jG * 4 + 1]);
|
||||
CLAMPED_FLOAT_TO_CHAN(rgba[i][BCOMP], lut[jB * 4 + 2]);
|
||||
CLAMPED_FLOAT_TO_CHAN(rgba[i][ACOMP], lut[jA * 4 + 3]);
|
||||
}
|
||||
}
|
||||
break;
|
||||
case GL_RGBA:
|
||||
if (table->Size == 256) {
|
||||
for (i = 0; i < n; i++) {
|
||||
rgba[i][RCOMP] = lut[rgba[i][RCOMP] * 4 + 0];
|
||||
rgba[i][GCOMP] = lut[rgba[i][GCOMP] * 4 + 1];
|
||||
rgba[i][BCOMP] = lut[rgba[i][BCOMP] * 4 + 2];
|
||||
rgba[i][ACOMP] = lut[rgba[i][ACOMP] * 4 + 3];
|
||||
}
|
||||
else {
|
||||
#if CHAN_TYPE == GL_UNSIGNED_BYTE
|
||||
if (table->Size == 256) {
|
||||
/* common case */
|
||||
const GLchan *lut = (const GLchan *) table->Table;
|
||||
GLuint i;
|
||||
for (i = 0; i < n; i++) {
|
||||
rgba[i][RCOMP] = lut[rgba[i][RCOMP] * 4 + 0];
|
||||
rgba[i][GCOMP] = lut[rgba[i][GCOMP] * 4 + 1];
|
||||
rgba[i][BCOMP] = lut[rgba[i][BCOMP] * 4 + 2];
|
||||
rgba[i][ACOMP] = lut[rgba[i][ACOMP] * 4 + 3];
|
||||
}
|
||||
}
|
||||
else
|
||||
#endif
|
||||
{
|
||||
const GLfloat scale = (GLfloat) (table->Size - 1) / CHAN_MAXF;
|
||||
const GLfloat *lut = (const GLfloat *) table->Table;
|
||||
GLuint i;
|
||||
for (i = 0; i < n; i++) {
|
||||
GLint jR = IROUND((GLfloat) rgba[i][RCOMP] * scale);
|
||||
GLint jG = IROUND((GLfloat) rgba[i][GCOMP] * scale);
|
||||
GLint jB = IROUND((GLfloat) rgba[i][BCOMP] * scale);
|
||||
GLint jA = IROUND((GLfloat) rgba[i][ACOMP] * scale);
|
||||
CLAMPED_FLOAT_TO_CHAN(rgba[i][RCOMP], lut[jR * 4 + 0]);
|
||||
CLAMPED_FLOAT_TO_CHAN(rgba[i][GCOMP], lut[jG * 4 + 1]);
|
||||
CLAMPED_FLOAT_TO_CHAN(rgba[i][BCOMP], lut[jB * 4 + 2]);
|
||||
CLAMPED_FLOAT_TO_CHAN(rgba[i][ACOMP], lut[jA * 4 + 3]);
|
||||
}
|
||||
}
|
||||
}
|
||||
else {
|
||||
for (i = 0; i < n; i++) {
|
||||
GLint jR = IROUND((GLfloat) rgba[i][RCOMP] * scale);
|
||||
GLint jG = IROUND((GLfloat) rgba[i][GCOMP] * scale);
|
||||
GLint jB = IROUND((GLfloat) rgba[i][BCOMP] * scale);
|
||||
GLint jA = IROUND((GLfloat) rgba[i][ACOMP] * scale);
|
||||
CLAMPED_FLOAT_TO_CHAN(rgba[i][RCOMP], lut[jR * 4 + 0]);
|
||||
CLAMPED_FLOAT_TO_CHAN(rgba[i][GCOMP], lut[jG * 4 + 1]);
|
||||
CLAMPED_FLOAT_TO_CHAN(rgba[i][BCOMP], lut[jB * 4 + 2]);
|
||||
CLAMPED_FLOAT_TO_CHAN(rgba[i][ACOMP], lut[jA * 4 + 3]);
|
||||
}
|
||||
break;
|
||||
default:
|
||||
_mesa_problem(NULL, "Bad format in _mesa_lookup_rgba_chan");
|
||||
return;
|
||||
}
|
||||
break;
|
||||
default:
|
||||
_mesa_problem(NULL, "Bad format in _mesa_lookup_rgba_chan");
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -98,8 +98,8 @@ _mesa_lookup_rgba_float(const struct gl_color_table *table,
|
|||
GLuint n, GLfloat rgba[][4]);
|
||||
|
||||
extern void
|
||||
_mesa_lookup_rgba_chan(const struct gl_color_table *table,
|
||||
GLuint n, GLchan rgba[][4]);
|
||||
_mesa_lookup_rgba_ubyte(const struct gl_color_table *table,
|
||||
GLuint n, GLubyte rgba[][4]);
|
||||
|
||||
|
||||
extern void
|
||||
|
|
|
|||
|
|
@ -1060,6 +1060,7 @@ static void FETCH(ci8)( const struct gl_texture_image *texImage,
|
|||
{
|
||||
const GLubyte *src = TEXEL_ADDR(GLubyte, texImage, i, j, k, 1);
|
||||
const struct gl_color_table *palette;
|
||||
GLubyte texelUB[4];
|
||||
GLuint index;
|
||||
GET_CURRENT_CONTEXT(ctx);
|
||||
|
||||
|
|
@ -1075,91 +1076,61 @@ static void FETCH(ci8)( const struct gl_texture_image *texImage,
|
|||
/* Mask the index against size of palette to avoid going out of bounds */
|
||||
index = (*src) & (palette->Size - 1);
|
||||
|
||||
if (palette->Type == GL_FLOAT) {
|
||||
const GLfloat *ftable = (const GLfloat *) palette->Table;
|
||||
{
|
||||
const GLubyte *table = palette->TableUB;
|
||||
switch (palette->_BaseFormat) {
|
||||
case GL_ALPHA:
|
||||
texel[RCOMP] =
|
||||
texel[GCOMP] =
|
||||
texel[BCOMP] = 0;
|
||||
texel[ACOMP] = (GLchan) (ftable[index] * CHAN_MAX);
|
||||
return;
|
||||
texelUB[RCOMP] =
|
||||
texelUB[GCOMP] =
|
||||
texelUB[BCOMP] = 0;
|
||||
texelUB[ACOMP] = table[index];
|
||||
break;;
|
||||
case GL_LUMINANCE:
|
||||
texel[RCOMP] =
|
||||
texel[GCOMP] =
|
||||
texel[BCOMP] = (GLchan) (ftable[index] * CHAN_MAX);
|
||||
texel[ACOMP] = CHAN_MAX;
|
||||
texelUB[RCOMP] =
|
||||
texelUB[GCOMP] =
|
||||
texelUB[BCOMP] = table[index];
|
||||
texelUB[ACOMP] = 255;
|
||||
break;
|
||||
case GL_INTENSITY:
|
||||
texel[RCOMP] =
|
||||
texel[GCOMP] =
|
||||
texel[BCOMP] =
|
||||
texel[ACOMP] = ftable[index] * CHAN_MAX;
|
||||
return;
|
||||
texelUB[RCOMP] =
|
||||
texelUB[GCOMP] =
|
||||
texelUB[BCOMP] =
|
||||
texelUB[ACOMP] = table[index];
|
||||
break;;
|
||||
case GL_LUMINANCE_ALPHA:
|
||||
texel[RCOMP] =
|
||||
texel[GCOMP] =
|
||||
texel[BCOMP] = (GLchan) (ftable[index * 2 + 0] * CHAN_MAX);
|
||||
texel[ACOMP] = (GLchan) (ftable[index * 2 + 1] * CHAN_MAX);
|
||||
return;
|
||||
texelUB[RCOMP] =
|
||||
texelUB[GCOMP] =
|
||||
texelUB[BCOMP] = table[index * 2 + 0];
|
||||
texelUB[ACOMP] = table[index * 2 + 1];
|
||||
break;;
|
||||
case GL_RGB:
|
||||
texel[RCOMP] = (GLchan) (ftable[index * 3 + 0] * CHAN_MAX);
|
||||
texel[GCOMP] = (GLchan) (ftable[index * 3 + 1] * CHAN_MAX);
|
||||
texel[BCOMP] = (GLchan) (ftable[index * 3 + 2] * CHAN_MAX);
|
||||
texel[ACOMP] = CHAN_MAX;
|
||||
return;
|
||||
texelUB[RCOMP] = table[index * 3 + 0];
|
||||
texelUB[GCOMP] = table[index * 3 + 1];
|
||||
texelUB[BCOMP] = table[index * 3 + 2];
|
||||
texelUB[ACOMP] = 255;
|
||||
break;;
|
||||
case GL_RGBA:
|
||||
texel[RCOMP] = (GLchan) (ftable[index * 4 + 0] * CHAN_MAX);
|
||||
texel[GCOMP] = (GLchan) (ftable[index * 4 + 1] * CHAN_MAX);
|
||||
texel[BCOMP] = (GLchan) (ftable[index * 4 + 2] * CHAN_MAX);
|
||||
texel[ACOMP] = (GLchan) (ftable[index * 4 + 3] * CHAN_MAX);
|
||||
return;
|
||||
default:
|
||||
_mesa_problem(ctx, "Bad palette format in fetch_texel_ci8");
|
||||
}
|
||||
}
|
||||
else {
|
||||
const GLchan *table = (const GLchan *) palette->Table;
|
||||
switch (palette->_BaseFormat) {
|
||||
case GL_ALPHA:
|
||||
texel[RCOMP] =
|
||||
texel[GCOMP] =
|
||||
texel[BCOMP] = 0;
|
||||
texel[ACOMP] = table[index];
|
||||
return;
|
||||
case GL_LUMINANCE:
|
||||
texel[RCOMP] =
|
||||
texel[GCOMP] =
|
||||
texel[BCOMP] = table[index];
|
||||
texel[ACOMP] = CHAN_MAX;
|
||||
break;
|
||||
case GL_INTENSITY:
|
||||
texel[RCOMP] =
|
||||
texel[GCOMP] =
|
||||
texel[BCOMP] =
|
||||
texel[ACOMP] = table[index];
|
||||
return;
|
||||
case GL_LUMINANCE_ALPHA:
|
||||
texel[RCOMP] =
|
||||
texel[GCOMP] =
|
||||
texel[BCOMP] = table[index * 2 + 0];
|
||||
texel[ACOMP] = table[index * 2 + 1];
|
||||
return;
|
||||
case GL_RGB:
|
||||
texel[RCOMP] = table[index * 3 + 0];
|
||||
texel[GCOMP] = table[index * 3 + 1];
|
||||
texel[BCOMP] = table[index * 3 + 2];
|
||||
texel[ACOMP] = CHAN_MAX;
|
||||
return;
|
||||
case GL_RGBA:
|
||||
texel[RCOMP] = table[index * 4 + 0];
|
||||
texel[GCOMP] = table[index * 4 + 1];
|
||||
texel[BCOMP] = table[index * 4 + 2];
|
||||
texel[ACOMP] = table[index * 4 + 3];
|
||||
return;
|
||||
texelUB[RCOMP] = table[index * 4 + 0];
|
||||
texelUB[GCOMP] = table[index * 4 + 1];
|
||||
texelUB[BCOMP] = table[index * 4 + 2];
|
||||
texelUB[ACOMP] = table[index * 4 + 3];
|
||||
break;;
|
||||
default:
|
||||
_mesa_problem(ctx, "Bad palette format in fetch_texel_ci8");
|
||||
}
|
||||
#if CHAN_TYPE == GL_UNSIGNED_BYTE
|
||||
COPY_4UBV(texel, texelUB);
|
||||
#elif CHAN_TYPE == GL_UNSIGNED_SHORT
|
||||
texel[0] = UBYTE_TO_USHORT(texelUB[0]);
|
||||
texel[1] = UBYTE_TO_USHORT(texelUB[1]);
|
||||
texel[2] = UBYTE_TO_USHORT(texelUB[2]);
|
||||
texel[3] = UBYTE_TO_USHORT(texelUB[3]);
|
||||
#else
|
||||
texel[0] = UBYTE_TO_FLOAT(texelUB[0]);
|
||||
texel[1] = UBYTE_TO_FLOAT(texelUB[1]);
|
||||
texel[2] = UBYTE_TO_FLOAT(texelUB[2]);
|
||||
texel[3] = UBYTE_TO_FLOAT(texelUB[3]);
|
||||
#endif
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -1132,7 +1132,13 @@ _swrast_texture_span( GLcontext *ctx, SWspan *span )
|
|||
|
||||
/* GL_SGI_texture_color_table */
|
||||
if (texUnit->ColorTableEnabled) {
|
||||
_mesa_lookup_rgba_chan(&texUnit->ColorTable, span->end, texels);
|
||||
#if CHAN_TYPE == GL_UNSIGNED_BYTE
|
||||
_mesa_lookup_rgba_ubyte(&texUnit->ColorTable, span->end, texels);
|
||||
#elif CHAN_TYPE == GL_UNSIGNED_SHORT
|
||||
_mesa_lookup_rgba_ubyte(&texUnit->ColorTable, span->end, texels);
|
||||
#else
|
||||
_mesa_lookup_rgba_float(&texUnit->ColorTable, span->end, texels);
|
||||
#endif
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
|||
Loading…
Add table
Reference in a new issue