more color table and imaging work

This commit is contained in:
Brian Paul
2000-04-18 14:32:10 +00:00
parent 7b5f09c7de
commit c397a6b283
4 changed files with 340 additions and 54 deletions

View File

@@ -1,4 +1,4 @@
/* $Id: colortab.c,v 1.15 2000/04/17 17:57:04 brianp Exp $ */
/* $Id: colortab.c,v 1.16 2000/04/18 14:32:10 brianp Exp $ */
/*
* Mesa 3-D graphics library
@@ -153,6 +153,7 @@ _mesa_ColorTable( GLenum target, GLenum internalFormat,
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;
GLboolean floatTable = GL_FALSE;
GLint comps;
ASSERT_OUTSIDE_BEGIN_END_AND_FLUSH(ctx, "glColorTable");
@@ -267,12 +268,14 @@ _mesa_ColorTable( GLenum target, GLenum internalFormat,
return;
}
table->Size = width;
table->IntFormat = internalFormat;
table->Format = (GLenum) baseFormat;
set_component_sizes(table);
comps = _mesa_components_in_format(table->Format);
assert(comps > 0); /* error should have been caught sooner */
if (!proxy) {
/* free old table, if any */
if (table->Table) {
@@ -289,7 +292,7 @@ _mesa_ColorTable( GLenum target, GLenum internalFormat,
&ctx->Unpack, GL_TRUE);
table->TableType = GL_FLOAT;
table->Table = MALLOC(4 * width * sizeof(GLfloat));
table->Table = MALLOC(comps * width * sizeof(GLfloat));
if (!table->Table) {
gl_error(ctx, GL_OUT_OF_MEMORY, "glColorTable");
return;
@@ -349,7 +352,7 @@ _mesa_ColorTable( GLenum target, GLenum internalFormat,
else {
/* store GLubyte table */
table->TableType = GL_UNSIGNED_BYTE;
table->Table = MALLOC(4 * width * sizeof(GLubyte));
table->Table = MALLOC(comps * width * sizeof(GLubyte));
if (!table->Table) {
gl_error(ctx, GL_OUT_OF_MEMORY, "glColorTable");
return;
@@ -367,7 +370,6 @@ _mesa_ColorTable( GLenum target, GLenum internalFormat,
(*ctx->Driver.UpdateTexturePalette)( ctx, texObj );
}
}
}
@@ -382,7 +384,6 @@ _mesa_ColorSubTable( GLenum target, GLsizei start,
struct gl_texture_object *texObj = NULL;
struct gl_color_table *table = NULL;
GLint comps;
GLubyte *dest;
ASSERT_OUTSIDE_BEGIN_END_AND_FLUSH(ctx, "glColorSubTable");
@@ -442,17 +443,17 @@ _mesa_ColorSubTable( GLenum target, GLsizei start,
}
if (table->TableType == GL_UNSIGNED_BYTE) {
dest = (GLubyte *) table->Table + start * comps * sizeof(GLubyte);
GLubyte *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);
format, type, data, &ctx->Unpack, GL_TRUE);
}
else {
GLfloat *dest = (GLfloat *) table->Table + start * comps * sizeof(GLfloat);
ASSERT(table->TableType == GL_FLOAT);
/* XXX todo */
_mesa_unpack_float_color_span(ctx, count, table->Format, dest,
format, type, data, &ctx->Unpack, GL_TRUE);
}
if (texObj || target == GL_SHARED_TEXTURE_PALETTE_EXT) {
/* per-texture object palette */
if (ctx->Driver.UpdateTexturePalette) {

View File

@@ -1,4 +1,4 @@
/* $Id: drawpix.c,v 1.20 2000/04/12 18:54:48 brianp Exp $ */
/* $Id: drawpix.c,v 1.21 2000/04/18 14:32:10 brianp Exp $ */
/*
* Mesa 3-D graphics library
@@ -121,6 +121,8 @@ simple_DrawPixels( GLcontext *ctx, GLint x, GLint y,
&& !ctx->Pixel.ScaleOrBiasRGBApcm
&& ctx->ColorMatrix.type == MATRIX_IDENTITY
&& !ctx->Pixel.ColorTableEnabled
&& !ctx->Pixel.PostColorMatrixColorTableEnabled
&& !ctx->Pixel.MinMaxEnabled
&& ctx->Pixel.IndexShift==0 && ctx->Pixel.IndexOffset==0
&& ctx->Pixel.MapColorFlag==0
&& ctx->Texture.ReallyEnabled == 0
@@ -650,6 +652,8 @@ draw_rgba_pixels( GLcontext *ctx, GLint x, GLint y,
pixels, width, height, format, type, 0, row, 0);
_mesa_unpack_ubyte_color_span(ctx, width, GL_RGBA, (void*) rgba,
format, type, source, unpack, GL_TRUE);
if (ctx->Pixel.MinMaxEnabled && ctx->MinMax.Sink)
continue;
if (ctx->Texture.ReallyEnabled && ctx->Pixel.PixelTextureEnabled) {
GLfloat s[MAX_WIDTH], t[MAX_WIDTH], r[MAX_WIDTH], q[MAX_WIDTH];

View File

@@ -1,4 +1,4 @@
/* $Id: image.c,v 1.28 2000/04/17 15:13:53 brianp Exp $ */
/* $Id: image.c,v 1.29 2000/04/18 14:32:10 brianp Exp $ */
/*
* Mesa 3-D graphics library
@@ -31,6 +31,7 @@
#include "glheader.h"
#include "context.h"
#include "image.h"
#include "imaging.h"
#include "macros.h"
#include "mem.h"
#include "mmath.h"
@@ -602,7 +603,7 @@ _mesa_pack_polygon_stipple( const GLuint pattern[32], GLubyte *dest,
* applyTransferOps - apply scale/bias/lookup-table ops?
*/
void
_mesa_pack_rgba_span( const GLcontext *ctx,
_mesa_pack_rgba_span( GLcontext *ctx,
GLuint n, CONST GLubyte srcRgba[][4],
GLenum format, GLenum type, GLvoid *destination,
const struct gl_pixelstore_attrib *packing,
@@ -613,7 +614,8 @@ _mesa_pack_rgba_span( const GLcontext *ctx,
ctx->ColorMatrix.type != MATRIX_IDENTITY ||
ctx->Pixel.ScaleOrBiasRGBApcm ||
ctx->Pixel.ColorTableEnabled ||
ctx->Pixel.PostColorMatrixColorTableEnabled);
ctx->Pixel.PostColorMatrixColorTableEnabled ||
ctx->Pixel.MinMaxEnabled);
/* Test for optimized case first */
if (!applyTransferOps && format == GL_RGBA && type == GL_UNSIGNED_BYTE) {
@@ -680,6 +682,11 @@ _mesa_pack_rgba_span( const GLcontext *ctx,
}
/* XXX histogram here */
/* XXX min/max here */
if (ctx->Pixel.MinMaxEnabled) {
_mesa_update_minmax(ctx, n, (const GLfloat (*)[4]) rgba);
if (ctx->MinMax.Sink)
return;
}
}
if (format==GL_LUMINANCE || format==GL_LUMINANCE_ALPHA) {
@@ -2128,7 +2135,7 @@ extract_float_rgba(GLuint n, GLfloat rgba[][4],
* XXX perhaps expand this to process whole images someday.
*/
void
_mesa_unpack_ubyte_color_span( const GLcontext *ctx,
_mesa_unpack_ubyte_color_span( GLcontext *ctx,
GLuint n, GLenum dstFormat, GLubyte dest[],
GLenum srcFormat, GLenum srcType,
const GLvoid *source,
@@ -2186,7 +2193,8 @@ _mesa_unpack_ubyte_color_span( const GLcontext *ctx,
ctx->ColorMatrix.type != MATRIX_IDENTITY ||
ctx->Pixel.ScaleOrBiasRGBApcm ||
ctx->Pixel.ColorTableEnabled ||
ctx->Pixel.PostColorMatrixColorTableEnabled);
ctx->Pixel.PostColorMatrixColorTableEnabled ||
ctx->Pixel.MinMaxEnabled);
/* Try simple cases first */
if (!applyTransferOps && srcType == GL_UNSIGNED_BYTE) {
@@ -2258,26 +2266,22 @@ _mesa_unpack_ubyte_color_span( const GLcontext *ctx,
extract_uint_indexes(n, indexes, srcFormat, srcType, source,
unpacking);
/* shift and offset indexes */
_mesa_shift_and_offset_ci(ctx, n, indexes);
if (applyTransferOps) {
if (ctx->Pixel.MapColorFlag) {
_mesa_map_ci(ctx, n, indexes);
}
if (ctx->Pixel.IndexShift || ctx->Pixel.IndexOffset) {
_mesa_shift_and_offset_ci(ctx, n, indexes);
}
}
if (dstFormat == GL_COLOR_INDEX) {
if (applyTransferOps) {
if (ctx->Pixel.MapColorFlag) {
/* Apply lookup table */
_mesa_map_ci(ctx, n, indexes);
}
if (ctx->Pixel.IndexShift || ctx->Pixel.IndexOffset) {
_mesa_shift_and_offset_ci(ctx, n, indexes);
}
}
/* convert to GLubyte and return */
{
GLuint i;
for (i = 0; i < n; i++) {
dest[i] = (GLubyte) (indexes[i] & 0xff);
}
GLuint i;
for (i = 0; i < n; i++) {
dest[i] = (GLubyte) (indexes[i] & 0xff);
}
return;
}
else {
/* Convert indexes to RGBA */
@@ -2290,28 +2294,36 @@ _mesa_unpack_ubyte_color_span( const GLcontext *ctx,
if (applyTransferOps) {
/* scale and bias colors */
_mesa_scale_and_bias_rgba(ctx, n, rgba);
if (ctx->Pixel.ScaleOrBiasRGBA) {
_mesa_scale_and_bias_rgba(ctx, n, rgba);
}
/* color map lookup */
if (ctx->Pixel.MapColorFlag) {
_mesa_map_rgba(ctx, n, rgba);
}
/* GL_COLOR_TABLE lookup */
if (ctx->Pixel.ColorTableEnabled) {
_mesa_lookup_rgba(&ctx->ColorTable, n, rgba);
}
/* XXX convolution here */
/* XXX post-convolution color table look-up here */
/* color matrix transform */
if (ctx->ColorMatrix.type != MATRIX_IDENTITY ||
ctx->Pixel.ScaleOrBiasRGBApcm) {
_mesa_transform_rgba(ctx, n, rgba);
}
/* GL_POST_COLOR_MATRIX_COLOR_TABLE lookup */
if (ctx->Pixel.PostColorMatrixColorTableEnabled) {
_mesa_lookup_rgba(&ctx->PostColorMatrixColorTable, n, rgba);
}
/* XXX histogram here */
/* XXX min/max here */
}
}
if (applyTransferOps) {
/* GL_COLOR_TABLE lookup */
if (ctx->Pixel.ColorTableEnabled) {
_mesa_lookup_rgba(&ctx->ColorTable, n, rgba);
}
/* XXX convolution here */
/* XXX post-convolution color table look-up here */
/* color matrix transform */
if (ctx->ColorMatrix.type != MATRIX_IDENTITY ||
ctx->Pixel.ScaleOrBiasRGBApcm) {
_mesa_transform_rgba(ctx, n, rgba);
}
/* GL_POST_COLOR_MATRIX_COLOR_TABLE lookup */
if (ctx->Pixel.PostColorMatrixColorTableEnabled) {
_mesa_lookup_rgba(&ctx->PostColorMatrixColorTable, n, rgba);
}
/* XXX histogram here */
/* XXX min/max here */
if (ctx->Pixel.MinMaxEnabled) {
_mesa_update_minmax(ctx, n, (const GLfloat (*)[4]) rgba);
}
}
@@ -2433,6 +2445,266 @@ _mesa_unpack_ubyte_color_span( const GLcontext *ctx,
}
void
_mesa_unpack_float_color_span( GLcontext *ctx,
GLuint n, GLenum dstFormat, GLfloat dest[],
GLenum srcFormat, GLenum srcType,
const GLvoid *source,
const struct gl_pixelstore_attrib *unpacking,
GLboolean applyTransferOps )
{
ASSERT(dstFormat == GL_ALPHA ||
dstFormat == GL_LUMINANCE ||
dstFormat == GL_LUMINANCE_ALPHA ||
dstFormat == GL_INTENSITY ||
dstFormat == GL_RGB ||
dstFormat == GL_RGBA ||
dstFormat == GL_COLOR_INDEX);
ASSERT(srcFormat == GL_RED ||
srcFormat == GL_GREEN ||
srcFormat == GL_BLUE ||
srcFormat == GL_ALPHA ||
srcFormat == GL_LUMINANCE ||
srcFormat == GL_LUMINANCE_ALPHA ||
srcFormat == GL_INTENSITY ||
srcFormat == GL_RGB ||
srcFormat == GL_BGR ||
srcFormat == GL_RGBA ||
srcFormat == GL_BGRA ||
srcFormat == GL_ABGR_EXT ||
srcFormat == GL_COLOR_INDEX);
ASSERT(srcType == GL_BITMAP ||
srcType == GL_UNSIGNED_BYTE ||
srcType == GL_BYTE ||
srcType == GL_UNSIGNED_SHORT ||
srcType == GL_SHORT ||
srcType == GL_UNSIGNED_INT ||
srcType == GL_INT ||
srcType == GL_FLOAT ||
srcType == GL_UNSIGNED_BYTE_3_3_2 ||
srcType == GL_UNSIGNED_BYTE_2_3_3_REV ||
srcType == GL_UNSIGNED_SHORT_5_6_5 ||
srcType == GL_UNSIGNED_SHORT_5_6_5_REV ||
srcType == GL_UNSIGNED_SHORT_4_4_4_4 ||
srcType == GL_UNSIGNED_SHORT_4_4_4_4_REV ||
srcType == GL_UNSIGNED_SHORT_5_5_5_1 ||
srcType == GL_UNSIGNED_SHORT_1_5_5_5_REV ||
srcType == GL_UNSIGNED_INT_8_8_8_8 ||
srcType == GL_UNSIGNED_INT_8_8_8_8_REV ||
srcType == GL_UNSIGNED_INT_10_10_10_2 ||
srcType == GL_UNSIGNED_INT_2_10_10_10_REV);
/* this is intended for RGBA mode only */
assert(ctx->Visual->RGBAflag);
applyTransferOps &= (ctx->Pixel.ScaleOrBiasRGBA ||
ctx->Pixel.MapColorFlag ||
ctx->ColorMatrix.type != MATRIX_IDENTITY ||
ctx->Pixel.ScaleOrBiasRGBApcm ||
ctx->Pixel.ColorTableEnabled ||
ctx->Pixel.PostColorMatrixColorTableEnabled ||
ctx->Pixel.MinMaxEnabled);
/* general solution, no special cases, yet */
{
GLfloat rgba[MAX_WIDTH][4];
GLint dstComponents;
GLint dstRedIndex, dstGreenIndex, dstBlueIndex, dstAlphaIndex;
GLint dstLuminanceIndex, dstIntensityIndex;
dstComponents = _mesa_components_in_format( dstFormat );
/* source & dest image formats should have been error checked by now */
assert(dstComponents > 0);
/*
* Extract image data and convert to RGBA floats
*/
assert(n <= MAX_WIDTH);
if (srcFormat == GL_COLOR_INDEX) {
GLuint indexes[MAX_WIDTH];
extract_uint_indexes(n, indexes, srcFormat, srcType, source,
unpacking);
if (applyTransferOps) {
if (ctx->Pixel.MapColorFlag) {
_mesa_map_ci(ctx, n, indexes);
}
if (ctx->Pixel.IndexShift || ctx->Pixel.IndexOffset) {
_mesa_shift_and_offset_ci(ctx, n, indexes);
}
}
if (dstFormat == GL_COLOR_INDEX) {
/* convert to GLubyte and return */
GLuint i;
for (i = 0; i < n; i++) {
dest[i] = (GLubyte) (indexes[i] & 0xff);
}
return;
}
else {
/* Convert indexes to RGBA */
_mesa_map_ci_to_rgba(ctx, n, indexes, rgba);
}
}
else {
extract_float_rgba(n, rgba, srcFormat, srcType, source,
unpacking->SwapBytes);
if (applyTransferOps) {
/* scale and bias colors */
if (ctx->Pixel.ScaleOrBiasRGBA) {
_mesa_scale_and_bias_rgba(ctx, n, rgba);
}
/* color map lookup */
if (ctx->Pixel.MapColorFlag) {
_mesa_map_rgba(ctx, n, rgba);
}
}
}
if (applyTransferOps) {
/* GL_COLOR_TABLE lookup */
if (ctx->Pixel.ColorTableEnabled) {
_mesa_lookup_rgba(&ctx->ColorTable, n, rgba);
}
/* XXX convolution here */
/* XXX post-convolution color table look-up here */
/* color matrix transform */
if (ctx->ColorMatrix.type != MATRIX_IDENTITY ||
ctx->Pixel.ScaleOrBiasRGBApcm) {
_mesa_transform_rgba(ctx, n, rgba);
}
/* GL_POST_COLOR_MATRIX_COLOR_TABLE lookup */
if (ctx->Pixel.PostColorMatrixColorTableEnabled) {
_mesa_lookup_rgba(&ctx->PostColorMatrixColorTable, n, rgba);
}
/* XXX histogram here */
/* XXX min/max here */
if (ctx->Pixel.MinMaxEnabled) {
_mesa_update_minmax(ctx, n, (const GLfloat (*)[4]) rgba);
}
}
/* clamp to [0,1] */
{
GLuint i;
for (i = 0; i < n; i++) {
rgba[i][RCOMP] = CLAMP(rgba[i][RCOMP], 0.0F, 1.0F);
rgba[i][GCOMP] = CLAMP(rgba[i][GCOMP], 0.0F, 1.0F);
rgba[i][BCOMP] = CLAMP(rgba[i][BCOMP], 0.0F, 1.0F);
rgba[i][ACOMP] = CLAMP(rgba[i][ACOMP], 0.0F, 1.0F);
}
}
/* Now determine which color channels we need to produce.
* And determine the dest index (offset) within each color tuple.
*/
switch (dstFormat) {
case GL_ALPHA:
dstAlphaIndex = 0;
dstRedIndex = dstGreenIndex = dstBlueIndex = -1;
dstLuminanceIndex = dstIntensityIndex = -1;
break;
case GL_LUMINANCE:
dstLuminanceIndex = 0;
dstRedIndex = dstGreenIndex = dstBlueIndex = dstAlphaIndex = -1;
dstIntensityIndex = -1;
break;
case GL_LUMINANCE_ALPHA:
dstLuminanceIndex = 0;
dstAlphaIndex = 1;
dstRedIndex = dstGreenIndex = dstBlueIndex = -1;
dstIntensityIndex = -1;
break;
case GL_INTENSITY:
dstIntensityIndex = 0;
dstRedIndex = dstGreenIndex = dstBlueIndex = dstAlphaIndex = -1;
dstLuminanceIndex = -1;
break;
case GL_RGB:
dstRedIndex = 0;
dstGreenIndex = 1;
dstBlueIndex = 2;
dstAlphaIndex = dstLuminanceIndex = dstIntensityIndex = -1;
break;
case GL_RGBA:
dstRedIndex = 0;
dstGreenIndex = 1;
dstBlueIndex = 2;
dstAlphaIndex = 3;
dstLuminanceIndex = dstIntensityIndex = -1;
break;
default:
gl_problem(ctx, "bad dstFormat in _mesa_unpack_float_span()");
return;
}
/* Now pack results in teh requested dstFormat */
if (dstRedIndex >= 0) {
GLfloat *dst = dest;
GLuint i;
for (i = 0; i < n; i++) {
dst[dstRedIndex] = rgba[i][RCOMP];
dst += dstComponents;
}
}
if (dstGreenIndex >= 0) {
GLfloat *dst = dest;
GLuint i;
for (i = 0; i < n; i++) {
dst[dstGreenIndex] = rgba[i][GCOMP];
dst += dstComponents;
}
}
if (dstBlueIndex >= 0) {
GLfloat *dst = dest;
GLuint i;
for (i = 0; i < n; i++) {
dst[dstBlueIndex] = rgba[i][BCOMP];
dst += dstComponents;
}
}
if (dstAlphaIndex >= 0) {
GLfloat *dst = dest;
GLuint i;
for (i = 0; i < n; i++) {
dst[dstAlphaIndex] = rgba[i][ACOMP];
dst += dstComponents;
}
}
if (dstIntensityIndex >= 0) {
GLfloat *dst = dest;
GLuint i;
assert(dstIntensityIndex == 0);
assert(dstComponents == 1);
for (i = 0; i < n; i++) {
/* Intensity comes from red channel */
dst[i] = rgba[i][RCOMP];
}
}
if (dstLuminanceIndex >= 0) {
GLfloat *dst = dest;
GLuint i;
assert(dstLuminanceIndex == 0);
for (i = 0; i < n; i++) {
/* Luminance comes from red channel */
dst[0] = rgba[i][RCOMP];
dst += dstComponents;
}
}
}
}
/*
* Unpack a row of color index data from a client buffer according to

View File

@@ -1,4 +1,4 @@
/* $Id: image.h,v 1.7 2000/03/21 16:09:38 brianp Exp $ */
/* $Id: image.h,v 1.8 2000/04/18 14:32:10 brianp Exp $ */
/*
* Mesa 3-D graphics library
@@ -80,7 +80,7 @@ _mesa_pack_polygon_stipple( const GLuint pattern[32], GLubyte *dest,
extern void
_mesa_pack_rgba_span( const GLcontext *ctx,
_mesa_pack_rgba_span( GLcontext *ctx,
GLuint n, CONST GLubyte rgba[][4],
GLenum format, GLenum type, GLvoid *dest,
const struct gl_pixelstore_attrib *packing,
@@ -88,7 +88,7 @@ _mesa_pack_rgba_span( const GLcontext *ctx,
extern void
_mesa_unpack_ubyte_color_span( const GLcontext *ctx,
_mesa_unpack_ubyte_color_span( GLcontext *ctx,
GLuint n, GLenum dstFormat, GLubyte dest[],
GLenum srcFormat, GLenum srcType,
const GLvoid *source,
@@ -96,6 +96,15 @@ _mesa_unpack_ubyte_color_span( const GLcontext *ctx,
GLboolean applyTransferOps );
extern void
_mesa_unpack_float_color_span( GLcontext *ctx,
GLuint n, GLenum dstFormat, GLfloat dest[],
GLenum srcFormat, GLenum srcType,
const GLvoid *source,
const struct gl_pixelstore_attrib *unpacking,
GLboolean applyTransferOps );
extern void
_mesa_unpack_index_span( const GLcontext *ctx, GLuint n,
GLenum dstType, GLvoid *dest,