1 /* $Id: colortab.c,v 1.45 2002/07/09 01:22:50 brianp Exp $ */
4 * Mesa 3-D graphics library
7 * Copyright (C) 1999-2002 Brian Paul All Rights Reserved.
9 * Permission is hereby granted, free of charge, to any person obtaining a
10 * copy of this software and associated documentation files (the "Software"),
11 * to deal in the Software without restriction, including without limitation
12 * the rights to use, copy, modify, merge, publish, distribute, sublicense,
13 * and/or sell copies of the Software, and to permit persons to whom the
14 * Software is furnished to do so, subject to the following conditions:
16 * The above copyright notice and this permission notice shall be included
17 * in all copies or substantial portions of the Software.
19 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
20 * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
21 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
22 * BRIAN PAUL BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN
23 * AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
24 * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
44 * Given an internalFormat token passed to glColorTable,
45 * return the corresponding base format.
46 * Return -1 if invalid token.
49 base_colortab_format( GLenum format
)
64 case GL_LUMINANCE_ALPHA
:
65 case GL_LUMINANCE4_ALPHA4
:
66 case GL_LUMINANCE6_ALPHA2
:
67 case GL_LUMINANCE8_ALPHA8
:
68 case GL_LUMINANCE12_ALPHA4
:
69 case GL_LUMINANCE12_ALPHA12
:
70 case GL_LUMINANCE16_ALPHA16
:
71 return GL_LUMINANCE_ALPHA
;
97 return -1; /* error */
103 _mesa_init_colortable( struct gl_color_table
*p
)
105 p
->FloatTable
= GL_FALSE
;
108 p
->IntFormat
= GL_RGBA
;
114 _mesa_free_colortable_data( struct gl_color_table
*p
)
124 * Examine table's format and set the component sizes accordingly.
127 set_component_sizes( struct gl_color_table
*table
)
129 switch (table
->Format
) {
132 table
->GreenSize
= 0;
134 table
->AlphaSize
= CHAN_BITS
;
135 table
->IntensitySize
= 0;
136 table
->LuminanceSize
= 0;
140 table
->GreenSize
= 0;
142 table
->AlphaSize
= 0;
143 table
->IntensitySize
= 0;
144 table
->LuminanceSize
= CHAN_BITS
;
146 case GL_LUMINANCE_ALPHA
:
148 table
->GreenSize
= 0;
150 table
->AlphaSize
= CHAN_BITS
;
151 table
->IntensitySize
= 0;
152 table
->LuminanceSize
= CHAN_BITS
;
156 table
->GreenSize
= 0;
158 table
->AlphaSize
= 0;
159 table
->IntensitySize
= CHAN_BITS
;
160 table
->LuminanceSize
= 0;
163 table
->RedSize
= CHAN_BITS
;
164 table
->GreenSize
= CHAN_BITS
;
165 table
->BlueSize
= CHAN_BITS
;
166 table
->AlphaSize
= 0;
167 table
->IntensitySize
= 0;
168 table
->LuminanceSize
= 0;
171 table
->RedSize
= CHAN_BITS
;
172 table
->GreenSize
= CHAN_BITS
;
173 table
->BlueSize
= CHAN_BITS
;
174 table
->AlphaSize
= CHAN_BITS
;
175 table
->IntensitySize
= 0;
176 table
->LuminanceSize
= 0;
179 _mesa_problem(NULL
, "unexpected format in set_component_sizes");
186 _mesa_ColorTable( GLenum target
, GLenum internalFormat
,
187 GLsizei width
, GLenum format
, GLenum type
,
190 GET_CURRENT_CONTEXT(ctx
);
191 struct gl_texture_unit
*texUnit
= &ctx
->Texture
.Unit
[ctx
->Texture
.CurrentUnit
];
192 struct gl_texture_object
*texObj
= NULL
;
193 struct gl_color_table
*table
= NULL
;
194 GLboolean proxy
= GL_FALSE
;
196 GLfloat rScale
= 1.0, gScale
= 1.0, bScale
= 1.0, aScale
= 1.0;
197 GLfloat rBias
= 0.0, gBias
= 0.0, bBias
= 0.0, aBias
= 0.0;
198 GLboolean floatTable
= GL_FALSE
;
200 ASSERT_OUTSIDE_BEGIN_END_AND_FLUSH(ctx
); /* too complex */
204 texObj
= texUnit
->Current1D
;
205 table
= &texObj
->Palette
;
208 texObj
= texUnit
->Current2D
;
209 table
= &texObj
->Palette
;
212 texObj
= texUnit
->Current3D
;
213 table
= &texObj
->Palette
;
215 case GL_TEXTURE_CUBE_MAP_ARB
:
216 if (!ctx
->Extensions
.ARB_texture_cube_map
) {
217 _mesa_error(ctx
, GL_INVALID_ENUM
, "glColorTable(target)");
220 texObj
= texUnit
->CurrentCubeMap
;
221 table
= &texObj
->Palette
;
223 case GL_PROXY_TEXTURE_1D
:
224 texObj
= ctx
->Texture
.Proxy1D
;
225 table
= &texObj
->Palette
;
228 case GL_PROXY_TEXTURE_2D
:
229 texObj
= ctx
->Texture
.Proxy2D
;
230 table
= &texObj
->Palette
;
233 case GL_PROXY_TEXTURE_3D
:
234 texObj
= ctx
->Texture
.Proxy3D
;
235 table
= &texObj
->Palette
;
238 case GL_PROXY_TEXTURE_CUBE_MAP_ARB
:
239 if (!ctx
->Extensions
.ARB_texture_cube_map
) {
240 _mesa_error(ctx
, GL_INVALID_ENUM
, "glColorTable(target)");
243 texObj
= ctx
->Texture
.ProxyCubeMap
;
244 table
= &texObj
->Palette
;
246 case GL_SHARED_TEXTURE_PALETTE_EXT
:
247 table
= &ctx
->Texture
.Palette
;
250 table
= &ctx
->ColorTable
;
251 floatTable
= GL_TRUE
;
252 rScale
= ctx
->Pixel
.ColorTableScale
[0];
253 gScale
= ctx
->Pixel
.ColorTableScale
[1];
254 bScale
= ctx
->Pixel
.ColorTableScale
[2];
255 aScale
= ctx
->Pixel
.ColorTableScale
[3];
256 rBias
= ctx
->Pixel
.ColorTableBias
[0];
257 gBias
= ctx
->Pixel
.ColorTableBias
[1];
258 bBias
= ctx
->Pixel
.ColorTableBias
[2];
259 aBias
= ctx
->Pixel
.ColorTableBias
[3];
261 case GL_PROXY_COLOR_TABLE
:
262 table
= &ctx
->ProxyColorTable
;
265 case GL_POST_CONVOLUTION_COLOR_TABLE
:
266 table
= &ctx
->PostConvolutionColorTable
;
267 floatTable
= GL_TRUE
;
268 rScale
= ctx
->Pixel
.PCCTscale
[0];
269 gScale
= ctx
->Pixel
.PCCTscale
[1];
270 bScale
= ctx
->Pixel
.PCCTscale
[2];
271 aScale
= ctx
->Pixel
.PCCTscale
[3];
272 rBias
= ctx
->Pixel
.PCCTbias
[0];
273 gBias
= ctx
->Pixel
.PCCTbias
[1];
274 bBias
= ctx
->Pixel
.PCCTbias
[2];
275 aBias
= ctx
->Pixel
.PCCTbias
[3];
277 case GL_PROXY_POST_CONVOLUTION_COLOR_TABLE
:
278 table
= &ctx
->ProxyPostConvolutionColorTable
;
281 case GL_POST_COLOR_MATRIX_COLOR_TABLE
:
282 table
= &ctx
->PostColorMatrixColorTable
;
283 floatTable
= GL_TRUE
;
284 rScale
= ctx
->Pixel
.PCMCTscale
[0];
285 gScale
= ctx
->Pixel
.PCMCTscale
[1];
286 bScale
= ctx
->Pixel
.PCMCTscale
[2];
287 aScale
= ctx
->Pixel
.PCMCTscale
[3];
288 rBias
= ctx
->Pixel
.PCMCTbias
[0];
289 gBias
= ctx
->Pixel
.PCMCTbias
[1];
290 bBias
= ctx
->Pixel
.PCMCTbias
[2];
291 aBias
= ctx
->Pixel
.PCMCTbias
[3];
293 case GL_PROXY_POST_COLOR_MATRIX_COLOR_TABLE
:
294 table
= &ctx
->ProxyPostColorMatrixColorTable
;
298 _mesa_error(ctx
, GL_INVALID_ENUM
, "glColorTable(target)");
304 if (!_mesa_is_legal_format_and_type(format
, type
) ||
305 format
== GL_INTENSITY
) {
306 _mesa_error(ctx
, GL_INVALID_OPERATION
, "glColorTable(format or type)");
310 baseFormat
= base_colortab_format(internalFormat
);
311 if (baseFormat
< 0 || baseFormat
== GL_COLOR_INDEX
) {
312 _mesa_error(ctx
, GL_INVALID_ENUM
, "glColorTable(internalFormat)");
316 if (width
< 0 || (width
!= 0 && _mesa_bitcount(width
) != 1)) {
320 table
->IntFormat
= (GLenum
) 0;
321 table
->Format
= (GLenum
) 0;
324 _mesa_error(ctx
, GL_INVALID_VALUE
, "glColorTable(width=%d)", width
);
329 if (width
> (GLsizei
) ctx
->Const
.MaxColorTableSize
) {
332 table
->IntFormat
= (GLenum
) 0;
333 table
->Format
= (GLenum
) 0;
336 _mesa_error(ctx
, GL_TABLE_TOO_LARGE
, "glColorTable(width)");
342 table
->IntFormat
= internalFormat
;
343 table
->Format
= (GLenum
) baseFormat
;
344 set_component_sizes(table
);
346 comps
= _mesa_components_in_format(table
->Format
);
347 assert(comps
> 0); /* error should have been caught sooner */
350 /* free old table, if any */
357 GLfloat tempTab
[MAX_COLOR_TABLE_SIZE
* 4];
361 _mesa_unpack_float_color_span(ctx
, width
, table
->Format
,
363 format
, type
, data
, &ctx
->Unpack
,
366 table
->FloatTable
= GL_TRUE
;
367 table
->Table
= MALLOC(comps
* width
* sizeof(GLfloat
));
369 _mesa_error(ctx
, GL_OUT_OF_MEMORY
, "glColorTable");
373 tableF
= (GLfloat
*) table
->Table
;
375 switch (table
->Format
) {
377 for (i
= 0; i
< width
; i
++) {
378 tableF
[i
] = CLAMP(tempTab
[i
] * rScale
+ rBias
, 0.0F
, 1.0F
);
382 for (i
= 0; i
< width
; i
++) {
383 tableF
[i
] = CLAMP(tempTab
[i
] * rScale
+ rBias
, 0.0F
, 1.0F
);
387 for (i
= 0; i
< width
; i
++) {
388 tableF
[i
] = CLAMP(tempTab
[i
] * aScale
+ aBias
, 0.0F
, 1.0F
);
391 case GL_LUMINANCE_ALPHA
:
392 for (i
= 0; i
< width
; i
++) {
393 tableF
[i
*2+0] = CLAMP(tempTab
[i
*2+0] * rScale
+ rBias
, 0.0F
, 1.0F
);
394 tableF
[i
*2+1] = CLAMP(tempTab
[i
*2+1] * aScale
+ aBias
, 0.0F
, 1.0F
);
398 for (i
= 0; i
< width
; i
++) {
399 tableF
[i
*3+0] = CLAMP(tempTab
[i
*3+0] * rScale
+ rBias
, 0.0F
, 1.0F
);
400 tableF
[i
*3+1] = CLAMP(tempTab
[i
*3+1] * gScale
+ gBias
, 0.0F
, 1.0F
);
401 tableF
[i
*3+2] = CLAMP(tempTab
[i
*3+2] * bScale
+ bBias
, 0.0F
, 1.0F
);
405 for (i
= 0; i
< width
; i
++) {
406 tableF
[i
*4+0] = CLAMP(tempTab
[i
*4+0] * rScale
+ rBias
, 0.0F
, 1.0F
);
407 tableF
[i
*4+1] = CLAMP(tempTab
[i
*4+1] * gScale
+ gBias
, 0.0F
, 1.0F
);
408 tableF
[i
*4+2] = CLAMP(tempTab
[i
*4+2] * bScale
+ bBias
, 0.0F
, 1.0F
);
409 tableF
[i
*4+3] = CLAMP(tempTab
[i
*4+3] * aScale
+ aBias
, 0.0F
, 1.0F
);
413 _mesa_problem(ctx
, "Bad format in _mesa_ColorTable");
418 /* store GLchan table */
419 table
->FloatTable
= GL_FALSE
;
420 table
->Table
= MALLOC(comps
* width
* sizeof(GLchan
));
422 _mesa_error(ctx
, GL_OUT_OF_MEMORY
, "glColorTable");
425 _mesa_unpack_chan_color_span(ctx
, width
, table
->Format
,
426 (GLchan
*) table
->Table
, /* dest */
433 if (texObj
|| target
== GL_SHARED_TEXTURE_PALETTE_EXT
) {
434 /* texture object palette, texObj==NULL means the shared palette */
435 if (ctx
->Driver
.UpdateTexturePalette
) {
436 (*ctx
->Driver
.UpdateTexturePalette
)( ctx
, texObj
);
440 ctx
->NewState
|= _NEW_PIXEL
;
446 _mesa_ColorSubTable( GLenum target
, GLsizei start
,
447 GLsizei count
, GLenum format
, GLenum type
,
450 GET_CURRENT_CONTEXT(ctx
);
451 struct gl_texture_unit
*texUnit
= &ctx
->Texture
.Unit
[ctx
->Texture
.CurrentUnit
];
452 struct gl_texture_object
*texObj
= NULL
;
453 struct gl_color_table
*table
= NULL
;
454 GLfloat rScale
= 1.0, gScale
= 1.0, bScale
= 1.0, aScale
= 1.0;
455 GLfloat rBias
= 0.0, gBias
= 0.0, bBias
= 0.0, aBias
= 0.0;
457 ASSERT_OUTSIDE_BEGIN_END_AND_FLUSH(ctx
);
461 texObj
= texUnit
->Current1D
;
462 table
= &texObj
->Palette
;
465 texObj
= texUnit
->Current2D
;
466 table
= &texObj
->Palette
;
469 texObj
= texUnit
->Current3D
;
470 table
= &texObj
->Palette
;
472 case GL_TEXTURE_CUBE_MAP_ARB
:
473 if (!ctx
->Extensions
.ARB_texture_cube_map
) {
474 _mesa_error(ctx
, GL_INVALID_ENUM
, "glColorSubTable(target)");
477 texObj
= texUnit
->CurrentCubeMap
;
478 table
= &texObj
->Palette
;
480 case GL_SHARED_TEXTURE_PALETTE_EXT
:
481 table
= &ctx
->Texture
.Palette
;
484 table
= &ctx
->ColorTable
;
485 rScale
= ctx
->Pixel
.ColorTableScale
[0];
486 gScale
= ctx
->Pixel
.ColorTableScale
[1];
487 bScale
= ctx
->Pixel
.ColorTableScale
[2];
488 aScale
= ctx
->Pixel
.ColorTableScale
[3];
489 rBias
= ctx
->Pixel
.ColorTableBias
[0];
490 gBias
= ctx
->Pixel
.ColorTableBias
[1];
491 bBias
= ctx
->Pixel
.ColorTableBias
[2];
492 aBias
= ctx
->Pixel
.ColorTableBias
[3];
494 case GL_POST_CONVOLUTION_COLOR_TABLE
:
495 table
= &ctx
->PostConvolutionColorTable
;
496 rScale
= ctx
->Pixel
.PCCTscale
[0];
497 gScale
= ctx
->Pixel
.PCCTscale
[1];
498 bScale
= ctx
->Pixel
.PCCTscale
[2];
499 aScale
= ctx
->Pixel
.PCCTscale
[3];
500 rBias
= ctx
->Pixel
.PCCTbias
[0];
501 gBias
= ctx
->Pixel
.PCCTbias
[1];
502 bBias
= ctx
->Pixel
.PCCTbias
[2];
503 aBias
= ctx
->Pixel
.PCCTbias
[3];
505 case GL_POST_COLOR_MATRIX_COLOR_TABLE
:
506 table
= &ctx
->PostColorMatrixColorTable
;
507 rScale
= ctx
->Pixel
.PCMCTscale
[0];
508 gScale
= ctx
->Pixel
.PCMCTscale
[1];
509 bScale
= ctx
->Pixel
.PCMCTscale
[2];
510 aScale
= ctx
->Pixel
.PCMCTscale
[3];
511 rBias
= ctx
->Pixel
.PCMCTbias
[0];
512 gBias
= ctx
->Pixel
.PCMCTbias
[1];
513 bBias
= ctx
->Pixel
.PCMCTbias
[2];
514 aBias
= ctx
->Pixel
.PCMCTbias
[3];
517 _mesa_error(ctx
, GL_INVALID_ENUM
, "glColorSubTable(target)");
523 if (!_mesa_is_legal_format_and_type(format
, type
) ||
524 format
== GL_INTENSITY
) {
525 _mesa_error(ctx
, GL_INVALID_OPERATION
, "glColorSubTable(format or type)");
530 _mesa_error(ctx
, GL_INVALID_VALUE
, "glColorSubTable(count)");
534 comps
= _mesa_components_in_format(table
->Format
);
535 assert(comps
> 0); /* error should have been caught sooner */
537 if (start
+ count
> (GLint
) table
->Size
) {
538 _mesa_error(ctx
, GL_INVALID_VALUE
, "glColorSubTable(count)");
543 _mesa_error(ctx
, GL_OUT_OF_MEMORY
, "glColorSubTable");
547 if (!table
->FloatTable
) {
548 GLchan
*dest
= (GLchan
*) table
->Table
+ start
* comps
* sizeof(GLchan
);
549 _mesa_unpack_chan_color_span(ctx
, count
, table
->Format
, dest
,
550 format
, type
, data
, &ctx
->Unpack
, 0);
553 GLfloat tempTab
[MAX_COLOR_TABLE_SIZE
* 4];
557 ASSERT(table
->FloatTable
);
559 _mesa_unpack_float_color_span(ctx
, count
, table
->Format
,
561 format
, type
, data
, &ctx
->Unpack
,
564 tableF
= (GLfloat
*) table
->Table
;
566 switch (table
->Format
) {
568 for (i
= 0; i
< count
; i
++) {
569 GLuint j
= start
+ i
;
570 tableF
[j
] = CLAMP(tempTab
[i
] * rScale
+ rBias
, 0.0F
, 1.0F
);
574 for (i
= 0; i
< count
; i
++) {
575 GLuint j
= start
+ i
;
576 tableF
[j
] = CLAMP(tempTab
[i
] * rScale
+ rBias
, 0.0F
, 1.0F
);
580 for (i
= 0; i
< count
; i
++) {
581 GLuint j
= start
+ i
;
582 tableF
[j
] = CLAMP(tempTab
[i
] * aScale
+ aBias
, 0.0F
, 1.0F
);
585 case GL_LUMINANCE_ALPHA
:
586 for (i
= 0; i
< count
; i
++) {
587 GLuint j
= start
+ i
;
588 tableF
[j
*2+0] = CLAMP(tempTab
[i
*2+0] * rScale
+ rBias
, 0.0F
, 1.0F
);
589 tableF
[j
*2+1] = CLAMP(tempTab
[i
*2+1] * aScale
+ aBias
, 0.0F
, 1.0F
);
593 for (i
= 0; i
< count
; i
++) {
594 GLuint j
= start
+ i
;
595 tableF
[j
*3+0] = CLAMP(tempTab
[i
*3+0] * rScale
+ rBias
, 0.0F
, 1.0F
);
596 tableF
[j
*3+1] = CLAMP(tempTab
[i
*3+1] * gScale
+ gBias
, 0.0F
, 1.0F
);
597 tableF
[j
*3+2] = CLAMP(tempTab
[i
*3+2] * bScale
+ bBias
, 0.0F
, 1.0F
);
601 for (i
= 0; i
< count
; i
++) {
602 GLuint j
= start
+ i
;
603 tableF
[j
*4+0] = CLAMP(tempTab
[i
*4+0] * rScale
+ rBias
, 0.0F
, 1.0F
);
604 tableF
[j
*4+1] = CLAMP(tempTab
[i
*4+1] * gScale
+ gBias
, 0.0F
, 1.0F
);
605 tableF
[j
*4+2] = CLAMP(tempTab
[i
*4+2] * bScale
+ bBias
, 0.0F
, 1.0F
);
606 tableF
[j
*4+3] = CLAMP(tempTab
[i
*4+3] * aScale
+ aBias
, 0.0F
, 1.0F
);
610 _mesa_problem(ctx
, "Bad format in _mesa_ColorSubTable");
615 if (texObj
|| target
== GL_SHARED_TEXTURE_PALETTE_EXT
) {
616 /* per-texture object palette */
617 if (ctx
->Driver
.UpdateTexturePalette
) {
618 (*ctx
->Driver
.UpdateTexturePalette
)( ctx
, texObj
);
622 ctx
->NewState
|= _NEW_PIXEL
;
629 _mesa_CopyColorTable(GLenum target
, GLenum internalformat
,
630 GLint x
, GLint y
, GLsizei width
)
632 GET_CURRENT_CONTEXT(ctx
);
633 ASSERT_OUTSIDE_BEGIN_END_AND_FLUSH(ctx
);
635 /* Select buffer to read from */
636 ctx
->Driver
.CopyColorTable( ctx
, target
, internalformat
, x
, y
, width
);
643 _mesa_CopyColorSubTable(GLenum target
, GLsizei start
,
644 GLint x
, GLint y
, GLsizei width
)
646 GET_CURRENT_CONTEXT(ctx
);
647 ASSERT_OUTSIDE_BEGIN_END_AND_FLUSH(ctx
);
649 ctx
->Driver
.CopyColorSubTable( ctx
, target
, start
, x
, y
, width
);
655 _mesa_GetColorTable( GLenum target
, GLenum format
,
656 GLenum type
, GLvoid
*data
)
658 GET_CURRENT_CONTEXT(ctx
);
659 struct gl_texture_unit
*texUnit
= &ctx
->Texture
.Unit
[ctx
->Texture
.CurrentUnit
];
660 struct gl_color_table
*table
= NULL
;
661 GLchan rgba
[MAX_COLOR_TABLE_SIZE
][4];
662 ASSERT_OUTSIDE_BEGIN_END_AND_FLUSH(ctx
);
665 _mesa_update_state(ctx
);
670 table
= &texUnit
->Current1D
->Palette
;
673 table
= &texUnit
->Current2D
->Palette
;
676 table
= &texUnit
->Current3D
->Palette
;
678 case GL_TEXTURE_CUBE_MAP_ARB
:
679 if (!ctx
->Extensions
.ARB_texture_cube_map
) {
680 _mesa_error(ctx
, GL_INVALID_ENUM
, "glGetColorTable(target)");
683 table
= &texUnit
->CurrentCubeMap
->Palette
;
685 case GL_SHARED_TEXTURE_PALETTE_EXT
:
686 table
= &ctx
->Texture
.Palette
;
689 table
= &ctx
->ColorTable
;
691 case GL_POST_CONVOLUTION_COLOR_TABLE
:
692 table
= &ctx
->PostConvolutionColorTable
;
694 case GL_POST_COLOR_MATRIX_COLOR_TABLE
:
695 table
= &ctx
->PostColorMatrixColorTable
;
698 _mesa_error(ctx
, GL_INVALID_ENUM
, "glGetColorTable(target)");
704 switch (table
->Format
) {
706 if (table
->FloatTable
) {
707 const GLfloat
*tableF
= (const GLfloat
*) table
->Table
;
709 for (i
= 0; i
< table
->Size
; i
++) {
713 rgba
[i
][ACOMP
] = IROUND_POS(tableF
[i
] * CHAN_MAXF
);
717 const GLchan
*tableUB
= (const GLchan
*) table
->Table
;
719 for (i
= 0; i
< table
->Size
; i
++) {
723 rgba
[i
][ACOMP
] = tableUB
[i
];
728 if (table
->FloatTable
) {
729 const GLfloat
*tableF
= (const GLfloat
*) table
->Table
;
731 for (i
= 0; i
< table
->Size
; i
++) {
732 rgba
[i
][RCOMP
] = IROUND_POS(tableF
[i
] * CHAN_MAXF
);
733 rgba
[i
][GCOMP
] = IROUND_POS(tableF
[i
] * CHAN_MAXF
);
734 rgba
[i
][BCOMP
] = IROUND_POS(tableF
[i
] * CHAN_MAXF
);
735 rgba
[i
][ACOMP
] = CHAN_MAX
;
739 const GLchan
*tableUB
= (const GLchan
*) table
->Table
;
741 for (i
= 0; i
< table
->Size
; i
++) {
742 rgba
[i
][RCOMP
] = tableUB
[i
];
743 rgba
[i
][GCOMP
] = tableUB
[i
];
744 rgba
[i
][BCOMP
] = tableUB
[i
];
745 rgba
[i
][ACOMP
] = CHAN_MAX
;
749 case GL_LUMINANCE_ALPHA
:
750 if (table
->FloatTable
) {
751 const GLfloat
*tableF
= (const GLfloat
*) table
->Table
;
753 for (i
= 0; i
< table
->Size
; i
++) {
754 rgba
[i
][RCOMP
] = IROUND_POS(tableF
[i
*2+0] * CHAN_MAXF
);
755 rgba
[i
][GCOMP
] = IROUND_POS(tableF
[i
*2+0] * CHAN_MAXF
);
756 rgba
[i
][BCOMP
] = IROUND_POS(tableF
[i
*2+0] * CHAN_MAXF
);
757 rgba
[i
][ACOMP
] = IROUND_POS(tableF
[i
*2+1] * CHAN_MAXF
);
761 const GLchan
*tableUB
= (const GLchan
*) table
->Table
;
763 for (i
= 0; i
< table
->Size
; i
++) {
764 rgba
[i
][RCOMP
] = tableUB
[i
*2+0];
765 rgba
[i
][GCOMP
] = tableUB
[i
*2+0];
766 rgba
[i
][BCOMP
] = tableUB
[i
*2+0];
767 rgba
[i
][ACOMP
] = tableUB
[i
*2+1];
772 if (table
->FloatTable
) {
773 const GLfloat
*tableF
= (const GLfloat
*) table
->Table
;
775 for (i
= 0; i
< table
->Size
; i
++) {
776 rgba
[i
][RCOMP
] = IROUND_POS(tableF
[i
] * CHAN_MAXF
);
777 rgba
[i
][GCOMP
] = IROUND_POS(tableF
[i
] * CHAN_MAXF
);
778 rgba
[i
][BCOMP
] = IROUND_POS(tableF
[i
] * CHAN_MAXF
);
779 rgba
[i
][ACOMP
] = IROUND_POS(tableF
[i
] * CHAN_MAXF
);
783 const GLchan
*tableUB
= (const GLchan
*) table
->Table
;
785 for (i
= 0; i
< table
->Size
; i
++) {
786 rgba
[i
][RCOMP
] = tableUB
[i
];
787 rgba
[i
][GCOMP
] = tableUB
[i
];
788 rgba
[i
][BCOMP
] = tableUB
[i
];
789 rgba
[i
][ACOMP
] = tableUB
[i
];
794 if (table
->FloatTable
) {
795 const GLfloat
*tableF
= (const GLfloat
*) table
->Table
;
797 for (i
= 0; i
< table
->Size
; i
++) {
798 rgba
[i
][RCOMP
] = IROUND_POS(tableF
[i
*3+0] * CHAN_MAXF
);
799 rgba
[i
][GCOMP
] = IROUND_POS(tableF
[i
*3+1] * CHAN_MAXF
);
800 rgba
[i
][BCOMP
] = IROUND_POS(tableF
[i
*3+2] * CHAN_MAXF
);
801 rgba
[i
][ACOMP
] = CHAN_MAX
;
805 const GLchan
*tableUB
= (const GLchan
*) table
->Table
;
807 for (i
= 0; i
< table
->Size
; i
++) {
808 rgba
[i
][RCOMP
] = tableUB
[i
*3+0];
809 rgba
[i
][GCOMP
] = tableUB
[i
*3+1];
810 rgba
[i
][BCOMP
] = tableUB
[i
*3+2];
811 rgba
[i
][ACOMP
] = CHAN_MAX
;
816 if (table
->FloatTable
) {
817 const GLfloat
*tableF
= (const GLfloat
*) table
->Table
;
819 for (i
= 0; i
< table
->Size
; i
++) {
820 rgba
[i
][RCOMP
] = IROUND_POS(tableF
[i
*4+0] * CHAN_MAXF
);
821 rgba
[i
][GCOMP
] = IROUND_POS(tableF
[i
*4+1] * CHAN_MAXF
);
822 rgba
[i
][BCOMP
] = IROUND_POS(tableF
[i
*4+2] * CHAN_MAXF
);
823 rgba
[i
][ACOMP
] = IROUND_POS(tableF
[i
*4+3] * CHAN_MAXF
);
827 const GLchan
*tableUB
= (const GLchan
*) table
->Table
;
829 for (i
= 0; i
< table
->Size
; i
++) {
830 rgba
[i
][RCOMP
] = tableUB
[i
*4+0];
831 rgba
[i
][GCOMP
] = tableUB
[i
*4+1];
832 rgba
[i
][BCOMP
] = tableUB
[i
*4+2];
833 rgba
[i
][ACOMP
] = tableUB
[i
*4+3];
838 _mesa_problem(ctx
, "bad table format in glGetColorTable");
842 _mesa_pack_rgba_span(ctx
, table
->Size
, (const GLchan (*)[4]) rgba
,
843 format
, type
, data
, &ctx
->Pack
, GL_FALSE
);
849 _mesa_ColorTableParameterfv(GLenum target
, GLenum pname
, const GLfloat
*params
)
851 GET_CURRENT_CONTEXT(ctx
);
852 ASSERT_OUTSIDE_BEGIN_END_AND_FLUSH(ctx
);
855 case GL_COLOR_TABLE_SGI
:
856 if (pname
== GL_COLOR_TABLE_SCALE_SGI
) {
857 ctx
->Pixel
.ColorTableScale
[0] = params
[0];
858 ctx
->Pixel
.ColorTableScale
[1] = params
[1];
859 ctx
->Pixel
.ColorTableScale
[2] = params
[2];
860 ctx
->Pixel
.ColorTableScale
[3] = params
[3];
862 else if (pname
== GL_COLOR_TABLE_BIAS_SGI
) {
863 ctx
->Pixel
.ColorTableBias
[0] = params
[0];
864 ctx
->Pixel
.ColorTableBias
[1] = params
[1];
865 ctx
->Pixel
.ColorTableBias
[2] = params
[2];
866 ctx
->Pixel
.ColorTableBias
[3] = params
[3];
869 _mesa_error(ctx
, GL_INVALID_ENUM
, "glColorTableParameterfv(pname)");
873 case GL_POST_CONVOLUTION_COLOR_TABLE_SGI
:
874 if (pname
== GL_COLOR_TABLE_SCALE_SGI
) {
875 ctx
->Pixel
.PCCTscale
[0] = params
[0];
876 ctx
->Pixel
.PCCTscale
[1] = params
[1];
877 ctx
->Pixel
.PCCTscale
[2] = params
[2];
878 ctx
->Pixel
.PCCTscale
[3] = params
[3];
880 else if (pname
== GL_COLOR_TABLE_BIAS_SGI
) {
881 ctx
->Pixel
.PCCTbias
[0] = params
[0];
882 ctx
->Pixel
.PCCTbias
[1] = params
[1];
883 ctx
->Pixel
.PCCTbias
[2] = params
[2];
884 ctx
->Pixel
.PCCTbias
[3] = params
[3];
887 _mesa_error(ctx
, GL_INVALID_ENUM
, "glColorTableParameterfv(pname)");
891 case GL_POST_COLOR_MATRIX_COLOR_TABLE_SGI
:
892 if (pname
== GL_COLOR_TABLE_SCALE_SGI
) {
893 ctx
->Pixel
.PCMCTscale
[0] = params
[0];
894 ctx
->Pixel
.PCMCTscale
[1] = params
[1];
895 ctx
->Pixel
.PCMCTscale
[2] = params
[2];
896 ctx
->Pixel
.PCMCTscale
[3] = params
[3];
898 else if (pname
== GL_COLOR_TABLE_BIAS_SGI
) {
899 ctx
->Pixel
.PCMCTbias
[0] = params
[0];
900 ctx
->Pixel
.PCMCTbias
[1] = params
[1];
901 ctx
->Pixel
.PCMCTbias
[2] = params
[2];
902 ctx
->Pixel
.PCMCTbias
[3] = params
[3];
905 _mesa_error(ctx
, GL_INVALID_ENUM
, "glColorTableParameterfv(pname)");
910 _mesa_error(ctx
, GL_INVALID_ENUM
, "glColorTableParameter(target)");
914 ctx
->NewState
|= _NEW_PIXEL
;
920 _mesa_ColorTableParameteriv(GLenum target
, GLenum pname
, const GLint
*params
)
923 if (pname
== GL_COLOR_TABLE_SGI
||
924 pname
== GL_POST_CONVOLUTION_COLOR_TABLE_SGI
||
925 pname
== GL_POST_COLOR_MATRIX_COLOR_TABLE_SGI
) {
927 fparams
[0] = (GLfloat
) params
[0];
928 fparams
[1] = (GLfloat
) params
[1];
929 fparams
[2] = (GLfloat
) params
[2];
930 fparams
[3] = (GLfloat
) params
[3];
934 fparams
[0] = (GLfloat
) params
[0];
936 _mesa_ColorTableParameterfv(target
, pname
, fparams
);
942 _mesa_GetColorTableParameterfv( GLenum target
, GLenum pname
, GLfloat
*params
)
944 GET_CURRENT_CONTEXT(ctx
);
945 struct gl_texture_unit
*texUnit
= &ctx
->Texture
.Unit
[ctx
->Texture
.CurrentUnit
];
946 struct gl_color_table
*table
= NULL
;
947 ASSERT_OUTSIDE_BEGIN_END(ctx
);
951 table
= &texUnit
->Current1D
->Palette
;
954 table
= &texUnit
->Current2D
->Palette
;
957 table
= &texUnit
->Current3D
->Palette
;
959 case GL_TEXTURE_CUBE_MAP_ARB
:
960 if (!ctx
->Extensions
.ARB_texture_cube_map
) {
961 _mesa_error(ctx
, GL_INVALID_ENUM
,
962 "glGetColorTableParameterfv(target)");
965 table
= &texUnit
->CurrentCubeMap
->Palette
;
967 case GL_PROXY_TEXTURE_1D
:
968 table
= &ctx
->Texture
.Proxy1D
->Palette
;
970 case GL_PROXY_TEXTURE_2D
:
971 table
= &ctx
->Texture
.Proxy2D
->Palette
;
973 case GL_PROXY_TEXTURE_3D
:
974 table
= &ctx
->Texture
.Proxy3D
->Palette
;
976 case GL_PROXY_TEXTURE_CUBE_MAP_ARB
:
977 if (!ctx
->Extensions
.ARB_texture_cube_map
) {
978 _mesa_error(ctx
, GL_INVALID_ENUM
,
979 "glGetColorTableParameterfv(target)");
982 table
= &ctx
->Texture
.ProxyCubeMap
->Palette
;
984 case GL_SHARED_TEXTURE_PALETTE_EXT
:
985 table
= &ctx
->Texture
.Palette
;
988 table
= &ctx
->ColorTable
;
989 if (pname
== GL_COLOR_TABLE_SCALE_SGI
) {
990 params
[0] = ctx
->Pixel
.ColorTableScale
[0];
991 params
[1] = ctx
->Pixel
.ColorTableScale
[1];
992 params
[2] = ctx
->Pixel
.ColorTableScale
[2];
993 params
[3] = ctx
->Pixel
.ColorTableScale
[3];
996 else if (pname
== GL_COLOR_TABLE_BIAS_SGI
) {
997 params
[0] = ctx
->Pixel
.ColorTableBias
[0];
998 params
[1] = ctx
->Pixel
.ColorTableBias
[1];
999 params
[2] = ctx
->Pixel
.ColorTableBias
[2];
1000 params
[3] = ctx
->Pixel
.ColorTableBias
[3];
1004 case GL_PROXY_COLOR_TABLE
:
1005 table
= &ctx
->ProxyColorTable
;
1007 case GL_POST_CONVOLUTION_COLOR_TABLE
:
1008 table
= &ctx
->PostConvolutionColorTable
;
1009 if (pname
== GL_COLOR_TABLE_SCALE_SGI
) {
1010 params
[0] = ctx
->Pixel
.PCCTscale
[0];
1011 params
[1] = ctx
->Pixel
.PCCTscale
[1];
1012 params
[2] = ctx
->Pixel
.PCCTscale
[2];
1013 params
[3] = ctx
->Pixel
.PCCTscale
[3];
1016 else if (pname
== GL_COLOR_TABLE_BIAS_SGI
) {
1017 params
[0] = ctx
->Pixel
.PCCTbias
[0];
1018 params
[1] = ctx
->Pixel
.PCCTbias
[1];
1019 params
[2] = ctx
->Pixel
.PCCTbias
[2];
1020 params
[3] = ctx
->Pixel
.PCCTbias
[3];
1024 case GL_PROXY_POST_CONVOLUTION_COLOR_TABLE
:
1025 table
= &ctx
->ProxyPostConvolutionColorTable
;
1027 case GL_POST_COLOR_MATRIX_COLOR_TABLE
:
1028 table
= &ctx
->PostColorMatrixColorTable
;
1029 if (pname
== GL_COLOR_TABLE_SCALE_SGI
) {
1030 params
[0] = ctx
->Pixel
.PCMCTscale
[0];
1031 params
[1] = ctx
->Pixel
.PCMCTscale
[1];
1032 params
[2] = ctx
->Pixel
.PCMCTscale
[2];
1033 params
[3] = ctx
->Pixel
.PCMCTscale
[3];
1036 else if (pname
== GL_COLOR_TABLE_BIAS_SGI
) {
1037 params
[0] = ctx
->Pixel
.PCMCTbias
[0];
1038 params
[1] = ctx
->Pixel
.PCMCTbias
[1];
1039 params
[2] = ctx
->Pixel
.PCMCTbias
[2];
1040 params
[3] = ctx
->Pixel
.PCMCTbias
[3];
1044 case GL_PROXY_POST_COLOR_MATRIX_COLOR_TABLE
:
1045 table
= &ctx
->ProxyPostColorMatrixColorTable
;
1048 _mesa_error(ctx
, GL_INVALID_ENUM
, "glGetColorTableParameterfv(target)");
1055 case GL_COLOR_TABLE_FORMAT
:
1056 *params
= (GLfloat
) table
->IntFormat
;
1058 case GL_COLOR_TABLE_WIDTH
:
1059 *params
= (GLfloat
) table
->Size
;
1061 case GL_COLOR_TABLE_RED_SIZE
:
1062 *params
= table
->RedSize
;
1064 case GL_COLOR_TABLE_GREEN_SIZE
:
1065 *params
= table
->GreenSize
;
1067 case GL_COLOR_TABLE_BLUE_SIZE
:
1068 *params
= table
->BlueSize
;
1070 case GL_COLOR_TABLE_ALPHA_SIZE
:
1071 *params
= table
->AlphaSize
;
1073 case GL_COLOR_TABLE_LUMINANCE_SIZE
:
1074 *params
= table
->LuminanceSize
;
1076 case GL_COLOR_TABLE_INTENSITY_SIZE
:
1077 *params
= table
->IntensitySize
;
1080 _mesa_error(ctx
, GL_INVALID_ENUM
, "glGetColorTableParameterfv(pname)" );
1088 _mesa_GetColorTableParameteriv( GLenum target
, GLenum pname
, GLint
*params
)
1090 GET_CURRENT_CONTEXT(ctx
);
1091 struct gl_texture_unit
*texUnit
= &ctx
->Texture
.Unit
[ctx
->Texture
.CurrentUnit
];
1092 struct gl_color_table
*table
= NULL
;
1093 ASSERT_OUTSIDE_BEGIN_END(ctx
);
1097 table
= &texUnit
->Current1D
->Palette
;
1100 table
= &texUnit
->Current2D
->Palette
;
1103 table
= &texUnit
->Current3D
->Palette
;
1105 case GL_TEXTURE_CUBE_MAP_ARB
:
1106 if (!ctx
->Extensions
.ARB_texture_cube_map
) {
1107 _mesa_error(ctx
, GL_INVALID_ENUM
,
1108 "glGetColorTableParameteriv(target)");
1111 table
= &texUnit
->CurrentCubeMap
->Palette
;
1113 case GL_PROXY_TEXTURE_1D
:
1114 table
= &ctx
->Texture
.Proxy1D
->Palette
;
1116 case GL_PROXY_TEXTURE_2D
:
1117 table
= &ctx
->Texture
.Proxy2D
->Palette
;
1119 case GL_PROXY_TEXTURE_3D
:
1120 table
= &ctx
->Texture
.Proxy3D
->Palette
;
1122 case GL_PROXY_TEXTURE_CUBE_MAP_ARB
:
1123 if (!ctx
->Extensions
.ARB_texture_cube_map
) {
1124 _mesa_error(ctx
, GL_INVALID_ENUM
,
1125 "glGetColorTableParameteriv(target)");
1128 table
= &ctx
->Texture
.ProxyCubeMap
->Palette
;
1130 case GL_SHARED_TEXTURE_PALETTE_EXT
:
1131 table
= &ctx
->Texture
.Palette
;
1133 case GL_COLOR_TABLE
:
1134 table
= &ctx
->ColorTable
;
1135 if (pname
== GL_COLOR_TABLE_SCALE_SGI
) {
1136 params
[0] = (GLint
) ctx
->Pixel
.ColorTableScale
[0];
1137 params
[1] = (GLint
) ctx
->Pixel
.ColorTableScale
[1];
1138 params
[2] = (GLint
) ctx
->Pixel
.ColorTableScale
[2];
1139 params
[3] = (GLint
) ctx
->Pixel
.ColorTableScale
[3];
1142 else if (pname
== GL_COLOR_TABLE_BIAS_SGI
) {
1143 params
[0] = (GLint
) ctx
->Pixel
.ColorTableBias
[0];
1144 params
[1] = (GLint
) ctx
->Pixel
.ColorTableBias
[1];
1145 params
[2] = (GLint
) ctx
->Pixel
.ColorTableBias
[2];
1146 params
[3] = (GLint
) ctx
->Pixel
.ColorTableBias
[3];
1150 case GL_PROXY_COLOR_TABLE
:
1151 table
= &ctx
->ProxyColorTable
;
1153 case GL_POST_CONVOLUTION_COLOR_TABLE
:
1154 table
= &ctx
->PostConvolutionColorTable
;
1155 if (pname
== GL_COLOR_TABLE_SCALE_SGI
) {
1156 params
[0] = (GLint
) ctx
->Pixel
.PCCTscale
[0];
1157 params
[1] = (GLint
) ctx
->Pixel
.PCCTscale
[1];
1158 params
[2] = (GLint
) ctx
->Pixel
.PCCTscale
[2];
1159 params
[3] = (GLint
) ctx
->Pixel
.PCCTscale
[3];
1162 else if (pname
== GL_COLOR_TABLE_BIAS_SGI
) {
1163 params
[0] = (GLint
) ctx
->Pixel
.PCCTbias
[0];
1164 params
[1] = (GLint
) ctx
->Pixel
.PCCTbias
[1];
1165 params
[2] = (GLint
) ctx
->Pixel
.PCCTbias
[2];
1166 params
[3] = (GLint
) ctx
->Pixel
.PCCTbias
[3];
1170 case GL_PROXY_POST_CONVOLUTION_COLOR_TABLE
:
1171 table
= &ctx
->ProxyPostConvolutionColorTable
;
1173 case GL_POST_COLOR_MATRIX_COLOR_TABLE
:
1174 table
= &ctx
->PostColorMatrixColorTable
;
1175 if (pname
== GL_COLOR_TABLE_SCALE_SGI
) {
1176 params
[0] = (GLint
) ctx
->Pixel
.PCMCTscale
[0];
1177 params
[1] = (GLint
) ctx
->Pixel
.PCMCTscale
[1];
1178 params
[2] = (GLint
) ctx
->Pixel
.PCMCTscale
[2];
1179 params
[3] = (GLint
) ctx
->Pixel
.PCMCTscale
[3];
1182 else if (pname
== GL_COLOR_TABLE_BIAS_SGI
) {
1183 params
[0] = (GLint
) ctx
->Pixel
.PCMCTbias
[0];
1184 params
[1] = (GLint
) ctx
->Pixel
.PCMCTbias
[1];
1185 params
[2] = (GLint
) ctx
->Pixel
.PCMCTbias
[2];
1186 params
[3] = (GLint
) ctx
->Pixel
.PCMCTbias
[3];
1190 case GL_PROXY_POST_COLOR_MATRIX_COLOR_TABLE
:
1191 table
= &ctx
->ProxyPostColorMatrixColorTable
;
1194 _mesa_error(ctx
, GL_INVALID_ENUM
, "glGetColorTableParameteriv(target)");
1201 case GL_COLOR_TABLE_FORMAT
:
1202 *params
= table
->IntFormat
;
1204 case GL_COLOR_TABLE_WIDTH
:
1205 *params
= table
->Size
;
1207 case GL_COLOR_TABLE_RED_SIZE
:
1208 *params
= table
->RedSize
;
1210 case GL_COLOR_TABLE_GREEN_SIZE
:
1211 *params
= table
->GreenSize
;
1213 case GL_COLOR_TABLE_BLUE_SIZE
:
1214 *params
= table
->BlueSize
;
1216 case GL_COLOR_TABLE_ALPHA_SIZE
:
1217 *params
= table
->AlphaSize
;
1219 case GL_COLOR_TABLE_LUMINANCE_SIZE
:
1220 *params
= table
->LuminanceSize
;
1222 case GL_COLOR_TABLE_INTENSITY_SIZE
:
1223 *params
= table
->IntensitySize
;
1226 _mesa_error(ctx
, GL_INVALID_ENUM
, "glGetColorTableParameteriv(pname)" );