1 /* $Id: colortab.c,v 1.27 2000/11/19 23:10:25 brianp Exp $ */
4 * Mesa 3-D graphics library
7 * Copyright (C) 1999-2000 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.
38 #include "swrast/s_span.h" /* XXX SWRAST hack */
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
;
106 /* allocate a width=1 table by default */
107 p
->Table
= CALLOC(4 * sizeof(GLchan
));
109 GLchan
*t
= (GLchan
*) p
->Table
;
116 p
->IntFormat
= GL_RGBA
;
118 p
->RedSize
= CHAN_BITS
;
119 p
->GreenSize
= CHAN_BITS
;
120 p
->BlueSize
= CHAN_BITS
;
121 p
->AlphaSize
= CHAN_BITS
;
122 p
->IntensitySize
= 0;
123 p
->LuminanceSize
= 0;
129 _mesa_free_colortable_data( struct gl_color_table
*p
)
139 * Examine table's format and set the component sizes accordingly.
142 set_component_sizes( struct gl_color_table
*table
)
144 switch (table
->Format
) {
147 table
->GreenSize
= 0;
149 table
->AlphaSize
= CHAN_BITS
;
150 table
->IntensitySize
= 0;
151 table
->LuminanceSize
= 0;
155 table
->GreenSize
= 0;
157 table
->AlphaSize
= 0;
158 table
->IntensitySize
= 0;
159 table
->LuminanceSize
= CHAN_BITS
;
161 case GL_LUMINANCE_ALPHA
:
163 table
->GreenSize
= 0;
165 table
->AlphaSize
= CHAN_BITS
;
166 table
->IntensitySize
= 0;
167 table
->LuminanceSize
= CHAN_BITS
;
171 table
->GreenSize
= 0;
173 table
->AlphaSize
= 0;
174 table
->IntensitySize
= CHAN_BITS
;
175 table
->LuminanceSize
= 0;
178 table
->RedSize
= CHAN_BITS
;
179 table
->GreenSize
= CHAN_BITS
;
180 table
->BlueSize
= CHAN_BITS
;
181 table
->AlphaSize
= 0;
182 table
->IntensitySize
= 0;
183 table
->LuminanceSize
= 0;
186 table
->RedSize
= CHAN_BITS
;
187 table
->GreenSize
= CHAN_BITS
;
188 table
->BlueSize
= CHAN_BITS
;
189 table
->AlphaSize
= CHAN_BITS
;
190 table
->IntensitySize
= 0;
191 table
->LuminanceSize
= 0;
194 gl_problem(NULL
, "unexpected format in set_component_sizes");
201 _mesa_ColorTable( GLenum target
, GLenum internalFormat
,
202 GLsizei width
, GLenum format
, GLenum type
,
205 GET_CURRENT_CONTEXT(ctx
);
206 struct gl_texture_unit
*texUnit
= &ctx
->Texture
.Unit
[ctx
->Texture
.CurrentUnit
];
207 struct gl_texture_object
*texObj
= NULL
;
208 struct gl_color_table
*table
= NULL
;
209 GLboolean proxy
= GL_FALSE
;
211 GLfloat rScale
= 1.0, gScale
= 1.0, bScale
= 1.0, aScale
= 1.0;
212 GLfloat rBias
= 0.0, gBias
= 0.0, bBias
= 0.0, aBias
= 0.0;
213 GLboolean floatTable
= GL_FALSE
;
216 ASSERT_OUTSIDE_BEGIN_END_AND_FLUSH(ctx
, "glColorTable");
220 texObj
= texUnit
->Current1D
;
221 table
= &texObj
->Palette
;
224 texObj
= texUnit
->Current2D
;
225 table
= &texObj
->Palette
;
228 texObj
= texUnit
->Current3D
;
229 table
= &texObj
->Palette
;
231 case GL_PROXY_TEXTURE_1D
:
232 texObj
= ctx
->Texture
.Proxy1D
;
233 table
= &texObj
->Palette
;
236 case GL_PROXY_TEXTURE_2D
:
237 texObj
= ctx
->Texture
.Proxy2D
;
238 table
= &texObj
->Palette
;
241 case GL_PROXY_TEXTURE_3D
:
242 texObj
= ctx
->Texture
.Proxy3D
;
243 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 gl_error(ctx
, GL_INVALID_ENUM
, "glColorTable(target)");
304 if (!_mesa_is_legal_format_and_type(format
, type
) ||
305 format
== GL_INTENSITY
) {
306 gl_error(ctx
, GL_INVALID_ENUM
, "glColorTable(format or type)");
310 baseFormat
= base_colortab_format(internalFormat
);
311 if (baseFormat
< 0 || baseFormat
== GL_COLOR_INDEX
) {
312 gl_error(ctx
, GL_INVALID_ENUM
, "glColorTable(internalFormat)");
316 if (width
< 0 || _mesa_bitcount(width
) != 1) {
319 table
->IntFormat
= (GLenum
) 0;
320 table
->Format
= (GLenum
) 0;
323 gl_error(ctx
, GL_INVALID_VALUE
, "glColorTable(width)");
328 if (width
> ctx
->Const
.MaxColorTableSize
) {
331 table
->IntFormat
= (GLenum
) 0;
332 table
->Format
= (GLenum
) 0;
335 if (width
> ctx
->Const
.MaxColorTableSize
)
336 gl_error(ctx
, GL_TABLE_TOO_LARGE
, "glColorTable(width)");
338 gl_error(ctx
, GL_INVALID_VALUE
, "glColorTable(width)");
344 table
->IntFormat
= internalFormat
;
345 table
->Format
= (GLenum
) baseFormat
;
346 set_component_sizes(table
);
348 comps
= _mesa_components_in_format(table
->Format
);
349 assert(comps
> 0); /* error should have been caught sooner */
352 /* 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 gl_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 gl_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 gl_error(ctx
, GL_OUT_OF_MEMORY
, "glColorTable");
425 _mesa_unpack_chan_color_span(ctx
, width
, table
->Format
,
426 table
->Table
, /* dest */
432 if (texObj
|| target
== GL_SHARED_TEXTURE_PALETTE_EXT
) {
433 /* texture object palette, texObj==NULL means the shared palette */
434 if (ctx
->Driver
.UpdateTexturePalette
) {
435 (*ctx
->Driver
.UpdateTexturePalette
)( ctx
, texObj
);
439 ctx
->NewState
|= _NEW_PIXEL
;
445 _mesa_ColorSubTable( GLenum target
, GLsizei start
,
446 GLsizei count
, GLenum format
, GLenum type
,
449 GET_CURRENT_CONTEXT(ctx
);
450 struct gl_texture_unit
*texUnit
= &ctx
->Texture
.Unit
[ctx
->Texture
.CurrentUnit
];
451 struct gl_texture_object
*texObj
= NULL
;
452 struct gl_color_table
*table
= NULL
;
453 GLfloat rScale
= 1.0, gScale
= 1.0, bScale
= 1.0, aScale
= 1.0;
454 GLfloat rBias
= 0.0, gBias
= 0.0, bBias
= 0.0, aBias
= 0.0;
457 ASSERT_OUTSIDE_BEGIN_END_AND_FLUSH(ctx
, "glColorSubTable");
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_SHARED_TEXTURE_PALETTE_EXT
:
473 table
= &ctx
->Texture
.Palette
;
476 table
= &ctx
->ColorTable
;
477 rScale
= ctx
->Pixel
.ColorTableScale
[0];
478 gScale
= ctx
->Pixel
.ColorTableScale
[1];
479 bScale
= ctx
->Pixel
.ColorTableScale
[2];
480 aScale
= ctx
->Pixel
.ColorTableScale
[3];
481 rBias
= ctx
->Pixel
.ColorTableBias
[0];
482 gBias
= ctx
->Pixel
.ColorTableBias
[1];
483 bBias
= ctx
->Pixel
.ColorTableBias
[2];
484 aBias
= ctx
->Pixel
.ColorTableBias
[3];
486 case GL_POST_CONVOLUTION_COLOR_TABLE
:
487 table
= &ctx
->PostConvolutionColorTable
;
488 rScale
= ctx
->Pixel
.PCCTscale
[0];
489 gScale
= ctx
->Pixel
.PCCTscale
[1];
490 bScale
= ctx
->Pixel
.PCCTscale
[2];
491 aScale
= ctx
->Pixel
.PCCTscale
[3];
492 rBias
= ctx
->Pixel
.PCCTbias
[0];
493 gBias
= ctx
->Pixel
.PCCTbias
[1];
494 bBias
= ctx
->Pixel
.PCCTbias
[2];
495 aBias
= ctx
->Pixel
.PCCTbias
[3];
497 case GL_POST_COLOR_MATRIX_COLOR_TABLE
:
498 table
= &ctx
->PostColorMatrixColorTable
;
499 rScale
= ctx
->Pixel
.PCMCTscale
[0];
500 gScale
= ctx
->Pixel
.PCMCTscale
[1];
501 bScale
= ctx
->Pixel
.PCMCTscale
[2];
502 aScale
= ctx
->Pixel
.PCMCTscale
[3];
503 rBias
= ctx
->Pixel
.PCMCTbias
[0];
504 gBias
= ctx
->Pixel
.PCMCTbias
[1];
505 bBias
= ctx
->Pixel
.PCMCTbias
[2];
506 aBias
= ctx
->Pixel
.PCMCTbias
[3];
509 gl_error(ctx
, GL_INVALID_ENUM
, "glColorSubTable(target)");
515 if (!_mesa_is_legal_format_and_type(format
, type
) ||
516 format
== GL_INTENSITY
) {
517 gl_error(ctx
, GL_INVALID_ENUM
, "glColorSubTable(format or type)");
522 gl_error(ctx
, GL_INVALID_VALUE
, "glColorSubTable(count)");
526 comps
= _mesa_components_in_format(table
->Format
);
527 assert(comps
> 0); /* error should have been caught sooner */
529 if (start
+ count
> table
->Size
) {
530 gl_error(ctx
, GL_INVALID_VALUE
, "glColorSubTable(count)");
535 gl_error(ctx
, GL_OUT_OF_MEMORY
, "glColorSubTable");
539 if (!table
->FloatTable
) {
540 GLchan
*dest
= (GLchan
*) table
->Table
+ start
* comps
* sizeof(GLchan
);
541 _mesa_unpack_chan_color_span(ctx
, count
, table
->Format
, dest
,
542 format
, type
, data
, &ctx
->Unpack
, 0);
545 GLfloat tempTab
[MAX_COLOR_TABLE_SIZE
* 4];
549 ASSERT(table
->FloatTable
);
551 _mesa_unpack_float_color_span(ctx
, count
, table
->Format
,
553 format
, type
, data
, &ctx
->Unpack
,
556 tableF
= (GLfloat
*) table
->Table
;
558 switch (table
->Format
) {
560 for (i
= 0; i
< count
; i
++) {
561 GLuint j
= start
+ i
;
562 tableF
[j
] = CLAMP(tempTab
[i
] * rScale
+ rBias
, 0.0F
, 1.0F
);
566 for (i
= 0; i
< count
; i
++) {
567 GLuint j
= start
+ i
;
568 tableF
[j
] = CLAMP(tempTab
[i
] * rScale
+ rBias
, 0.0F
, 1.0F
);
572 for (i
= 0; i
< count
; i
++) {
573 GLuint j
= start
+ i
;
574 tableF
[j
] = CLAMP(tempTab
[i
] * aScale
+ aBias
, 0.0F
, 1.0F
);
577 case GL_LUMINANCE_ALPHA
:
578 for (i
= 0; i
< count
; i
++) {
579 GLuint j
= start
+ i
;
580 tableF
[j
*2+0] = CLAMP(tempTab
[i
*2+0] * rScale
+ rBias
, 0.0F
, 1.0F
);
581 tableF
[j
*2+1] = CLAMP(tempTab
[i
*2+1] * aScale
+ aBias
, 0.0F
, 1.0F
);
585 for (i
= 0; i
< count
; i
++) {
586 GLuint j
= start
+ i
;
587 tableF
[j
*3+0] = CLAMP(tempTab
[i
*3+0] * rScale
+ rBias
, 0.0F
, 1.0F
);
588 tableF
[j
*3+1] = CLAMP(tempTab
[i
*3+1] * gScale
+ gBias
, 0.0F
, 1.0F
);
589 tableF
[j
*3+2] = CLAMP(tempTab
[i
*3+2] * bScale
+ bBias
, 0.0F
, 1.0F
);
593 for (i
= 0; i
< count
; i
++) {
594 GLuint j
= start
+ i
;
595 tableF
[j
*4+0] = CLAMP(tempTab
[i
*4+0] * rScale
+ rBias
, 0.0F
, 1.0F
);
596 tableF
[j
*4+1] = CLAMP(tempTab
[i
*4+1] * gScale
+ gBias
, 0.0F
, 1.0F
);
597 tableF
[j
*4+2] = CLAMP(tempTab
[i
*4+2] * bScale
+ bBias
, 0.0F
, 1.0F
);
598 tableF
[j
*4+3] = CLAMP(tempTab
[i
*4+3] * aScale
+ aBias
, 0.0F
, 1.0F
);
602 gl_problem(ctx
, "Bad format in _mesa_ColorSubTable");
607 if (texObj
|| target
== GL_SHARED_TEXTURE_PALETTE_EXT
) {
608 /* per-texture object palette */
609 if (ctx
->Driver
.UpdateTexturePalette
) {
610 (*ctx
->Driver
.UpdateTexturePalette
)( ctx
, texObj
);
614 ctx
->NewState
|= _NEW_PIXEL
;
621 _mesa_CopyColorTable(GLenum target
, GLenum internalformat
,
622 GLint x
, GLint y
, GLsizei width
)
624 GLchan data
[MAX_WIDTH
][4];
625 GET_CURRENT_CONTEXT(ctx
);
626 ASSERT_OUTSIDE_BEGIN_END_AND_FLUSH(ctx
, "glCopyColorTable");
628 /* Select buffer to read from */
629 (*ctx
->Driver
.SetReadBuffer
)( ctx
, ctx
->ReadBuffer
,
630 ctx
->Pixel
.DriverReadBuffer
);
632 if (width
> MAX_WIDTH
)
635 /* read the data from framebuffer */
636 gl_read_rgba_span( ctx
, ctx
->ReadBuffer
, width
, x
, y
, data
);
638 /* Restore reading from draw buffer (the default) */
639 (*ctx
->Driver
.SetReadBuffer
)( ctx
, ctx
->DrawBuffer
,
640 ctx
->Color
.DriverDrawBuffer
);
642 _mesa_ColorTable(target
, internalformat
, width
,
643 GL_RGBA
, GL_UNSIGNED_BYTE
, data
);
650 _mesa_CopyColorSubTable(GLenum target
, GLsizei start
,
651 GLint x
, GLint y
, GLsizei width
)
653 GLchan data
[MAX_WIDTH
][4];
654 GET_CURRENT_CONTEXT(ctx
);
655 ASSERT_OUTSIDE_BEGIN_END_AND_FLUSH(ctx
, "glCopyColorSubTable");
657 /* Select buffer to read from */
658 (*ctx
->Driver
.SetReadBuffer
)( ctx
, ctx
->ReadBuffer
,
659 ctx
->Pixel
.DriverReadBuffer
);
661 if (width
> MAX_WIDTH
)
664 /* read the data from framebuffer */
665 gl_read_rgba_span( ctx
, ctx
->ReadBuffer
, width
, x
, y
, data
);
667 /* Restore reading from draw buffer (the default) */
668 (*ctx
->Driver
.SetReadBuffer
)( ctx
, ctx
->DrawBuffer
,
669 ctx
->Color
.DriverDrawBuffer
);
671 _mesa_ColorSubTable(target
, start
, width
, GL_RGBA
, GL_UNSIGNED_BYTE
, data
);
677 _mesa_GetColorTable( GLenum target
, GLenum format
,
678 GLenum type
, GLvoid
*data
)
680 GET_CURRENT_CONTEXT(ctx
);
681 struct gl_texture_unit
*texUnit
= &ctx
->Texture
.Unit
[ctx
->Texture
.CurrentUnit
];
682 struct gl_color_table
*table
= NULL
;
683 GLchan rgba
[MAX_COLOR_TABLE_SIZE
][4];
686 ASSERT_OUTSIDE_BEGIN_END(ctx
, "glGetColorTable");
690 table
= &texUnit
->Current1D
->Palette
;
693 table
= &texUnit
->Current2D
->Palette
;
696 table
= &texUnit
->Current3D
->Palette
;
698 case GL_SHARED_TEXTURE_PALETTE_EXT
:
699 table
= &ctx
->Texture
.Palette
;
702 table
= &ctx
->ColorTable
;
704 case GL_POST_CONVOLUTION_COLOR_TABLE
:
705 table
= &ctx
->PostConvolutionColorTable
;
707 case GL_POST_COLOR_MATRIX_COLOR_TABLE
:
708 table
= &ctx
->PostColorMatrixColorTable
;
711 gl_error(ctx
, GL_INVALID_ENUM
, "glGetColorTable(target)");
717 switch (table
->Format
) {
719 if (table
->FloatTable
) {
720 const GLfloat
*tableF
= (const GLfloat
*) table
->Table
;
721 for (i
= 0; i
< table
->Size
; i
++) {
725 rgba
[i
][ACOMP
] = (GLint
) (tableF
[i
] * CHAN_MAXF
);
729 const GLchan
*tableUB
= (const GLchan
*) table
->Table
;
730 for (i
= 0; i
< table
->Size
; i
++) {
734 rgba
[i
][ACOMP
] = tableUB
[i
];
739 if (table
->FloatTable
) {
740 const GLfloat
*tableF
= (const GLfloat
*) table
->Table
;
741 for (i
= 0; i
< table
->Size
; i
++) {
742 rgba
[i
][RCOMP
] = (GLint
) (tableF
[i
] * CHAN_MAXF
);
743 rgba
[i
][GCOMP
] = (GLint
) (tableF
[i
] * CHAN_MAXF
);
744 rgba
[i
][BCOMP
] = (GLint
) (tableF
[i
] * CHAN_MAXF
);
745 rgba
[i
][ACOMP
] = CHAN_MAX
;
749 const GLchan
*tableUB
= (const GLchan
*) table
->Table
;
750 for (i
= 0; i
< table
->Size
; i
++) {
751 rgba
[i
][RCOMP
] = tableUB
[i
];
752 rgba
[i
][GCOMP
] = tableUB
[i
];
753 rgba
[i
][BCOMP
] = tableUB
[i
];
754 rgba
[i
][ACOMP
] = CHAN_MAX
;
758 case GL_LUMINANCE_ALPHA
:
759 if (table
->FloatTable
) {
760 const GLfloat
*tableF
= (const GLfloat
*) table
->Table
;
761 for (i
= 0; i
< table
->Size
; i
++) {
762 rgba
[i
][RCOMP
] = (GLint
) (tableF
[i
*2+0] * CHAN_MAXF
);
763 rgba
[i
][GCOMP
] = (GLint
) (tableF
[i
*2+0] * CHAN_MAXF
);
764 rgba
[i
][BCOMP
] = (GLint
) (tableF
[i
*2+0] * CHAN_MAXF
);
765 rgba
[i
][ACOMP
] = (GLint
) (tableF
[i
*2+1] * CHAN_MAXF
);
769 const GLchan
*tableUB
= (const GLchan
*) table
->Table
;
770 for (i
= 0; i
< table
->Size
; i
++) {
771 rgba
[i
][RCOMP
] = tableUB
[i
*2+0];
772 rgba
[i
][GCOMP
] = tableUB
[i
*2+0];
773 rgba
[i
][BCOMP
] = tableUB
[i
*2+0];
774 rgba
[i
][ACOMP
] = tableUB
[i
*2+1];
779 if (table
->FloatTable
) {
780 const GLfloat
*tableF
= (const GLfloat
*) table
->Table
;
781 for (i
= 0; i
< table
->Size
; i
++) {
782 rgba
[i
][RCOMP
] = (GLint
) (tableF
[i
] * CHAN_MAXF
);
783 rgba
[i
][GCOMP
] = (GLint
) (tableF
[i
] * CHAN_MAXF
);
784 rgba
[i
][BCOMP
] = (GLint
) (tableF
[i
] * CHAN_MAXF
);
785 rgba
[i
][ACOMP
] = (GLint
) (tableF
[i
] * CHAN_MAXF
);
789 const GLchan
*tableUB
= (const GLchan
*) table
->Table
;
790 for (i
= 0; i
< table
->Size
; i
++) {
791 rgba
[i
][RCOMP
] = tableUB
[i
];
792 rgba
[i
][GCOMP
] = tableUB
[i
];
793 rgba
[i
][BCOMP
] = tableUB
[i
];
794 rgba
[i
][ACOMP
] = tableUB
[i
];
799 if (table
->FloatTable
) {
800 const GLfloat
*tableF
= (const GLfloat
*) table
->Table
;
801 for (i
= 0; i
< table
->Size
; i
++) {
802 rgba
[i
][RCOMP
] = (GLint
) (tableF
[i
*3+0] * CHAN_MAXF
);
803 rgba
[i
][GCOMP
] = (GLint
) (tableF
[i
*3+1] * CHAN_MAXF
);
804 rgba
[i
][BCOMP
] = (GLint
) (tableF
[i
*3+2] * CHAN_MAXF
);
805 rgba
[i
][ACOMP
] = CHAN_MAX
;
809 const GLchan
*tableUB
= (const GLchan
*) table
->Table
;
810 for (i
= 0; i
< table
->Size
; i
++) {
811 rgba
[i
][RCOMP
] = tableUB
[i
*3+0];
812 rgba
[i
][GCOMP
] = tableUB
[i
*3+1];
813 rgba
[i
][BCOMP
] = tableUB
[i
*3+2];
814 rgba
[i
][ACOMP
] = CHAN_MAX
;
819 if (table
->FloatTable
) {
820 const GLfloat
*tableF
= (const GLfloat
*) table
->Table
;
821 for (i
= 0; i
< table
->Size
; i
++) {
822 rgba
[i
][RCOMP
] = (GLint
) (tableF
[i
*4+0] * CHAN_MAXF
+ 0.5F
);
823 rgba
[i
][GCOMP
] = (GLint
) (tableF
[i
*4+1] * CHAN_MAXF
+ 0.5F
);
824 rgba
[i
][BCOMP
] = (GLint
) (tableF
[i
*4+2] * CHAN_MAXF
+ 0.5F
);
825 rgba
[i
][ACOMP
] = (GLint
) (tableF
[i
*4+3] * CHAN_MAXF
+ 0.5F
);
829 const GLchan
*tableUB
= (const GLchan
*) table
->Table
;
830 for (i
= 0; i
< table
->Size
; i
++) {
831 rgba
[i
][RCOMP
] = tableUB
[i
*4+0];
832 rgba
[i
][GCOMP
] = tableUB
[i
*4+1];
833 rgba
[i
][BCOMP
] = tableUB
[i
*4+2];
834 rgba
[i
][ACOMP
] = tableUB
[i
*4+3];
839 gl_problem(ctx
, "bad table format in glGetColorTable");
843 _mesa_pack_rgba_span(ctx
, table
->Size
, (const GLchan (*)[]) rgba
,
844 format
, type
, data
, &ctx
->Pack
, GL_FALSE
);
850 _mesa_ColorTableParameterfv(GLenum target
, GLenum pname
, const GLfloat
*params
)
852 GET_CURRENT_CONTEXT(ctx
);
853 ASSERT_OUTSIDE_BEGIN_END(ctx
, "glColorTableParameterfv");
856 case GL_COLOR_TABLE_SGI
:
857 if (pname
== GL_COLOR_TABLE_SCALE_SGI
) {
858 ctx
->Pixel
.ColorTableScale
[0] = params
[0];
859 ctx
->Pixel
.ColorTableScale
[1] = params
[1];
860 ctx
->Pixel
.ColorTableScale
[2] = params
[2];
861 ctx
->Pixel
.ColorTableScale
[3] = params
[3];
863 else if (pname
== GL_COLOR_TABLE_BIAS_SGI
) {
864 ctx
->Pixel
.ColorTableBias
[0] = params
[0];
865 ctx
->Pixel
.ColorTableBias
[1] = params
[1];
866 ctx
->Pixel
.ColorTableBias
[2] = params
[2];
867 ctx
->Pixel
.ColorTableBias
[3] = params
[3];
870 gl_error(ctx
, GL_INVALID_ENUM
, "glColorTableParameterfv(pname)");
874 case GL_POST_CONVOLUTION_COLOR_TABLE_SGI
:
875 if (pname
== GL_COLOR_TABLE_SCALE_SGI
) {
876 ctx
->Pixel
.PCCTscale
[0] = params
[0];
877 ctx
->Pixel
.PCCTscale
[1] = params
[1];
878 ctx
->Pixel
.PCCTscale
[2] = params
[2];
879 ctx
->Pixel
.PCCTscale
[3] = params
[3];
881 else if (pname
== GL_COLOR_TABLE_BIAS_SGI
) {
882 ctx
->Pixel
.PCCTbias
[0] = params
[0];
883 ctx
->Pixel
.PCCTbias
[1] = params
[1];
884 ctx
->Pixel
.PCCTbias
[2] = params
[2];
885 ctx
->Pixel
.PCCTbias
[3] = params
[3];
888 gl_error(ctx
, GL_INVALID_ENUM
, "glColorTableParameterfv(pname)");
892 case GL_POST_COLOR_MATRIX_COLOR_TABLE_SGI
:
893 if (pname
== GL_COLOR_TABLE_SCALE_SGI
) {
894 ctx
->Pixel
.PCMCTscale
[0] = params
[0];
895 ctx
->Pixel
.PCMCTscale
[1] = params
[1];
896 ctx
->Pixel
.PCMCTscale
[2] = params
[2];
897 ctx
->Pixel
.PCMCTscale
[3] = params
[3];
899 else if (pname
== GL_COLOR_TABLE_BIAS_SGI
) {
900 ctx
->Pixel
.PCMCTbias
[0] = params
[0];
901 ctx
->Pixel
.PCMCTbias
[1] = params
[1];
902 ctx
->Pixel
.PCMCTbias
[2] = params
[2];
903 ctx
->Pixel
.PCMCTbias
[3] = params
[3];
906 gl_error(ctx
, GL_INVALID_ENUM
, "glColorTableParameterfv(pname)");
911 gl_error(ctx
, GL_INVALID_ENUM
, "glColorTableParameter(target)");
915 ctx
->NewState
|= _NEW_PIXEL
;
921 _mesa_ColorTableParameteriv(GLenum target
, GLenum pname
, const GLint
*params
)
924 if (pname
== GL_COLOR_TABLE_SGI
||
925 pname
== GL_POST_CONVOLUTION_COLOR_TABLE_SGI
||
926 pname
== GL_POST_COLOR_MATRIX_COLOR_TABLE_SGI
) {
928 fparams
[0] = (GLfloat
) params
[0];
929 fparams
[1] = (GLfloat
) params
[1];
930 fparams
[2] = (GLfloat
) params
[2];
931 fparams
[3] = (GLfloat
) params
[3];
935 fparams
[0] = (GLfloat
) params
[0];
937 _mesa_ColorTableParameterfv(target
, pname
, fparams
);
943 _mesa_GetColorTableParameterfv( GLenum target
, GLenum pname
, GLfloat
*params
)
945 GET_CURRENT_CONTEXT(ctx
);
946 struct gl_texture_unit
*texUnit
= &ctx
->Texture
.Unit
[ctx
->Texture
.CurrentUnit
];
947 struct gl_color_table
*table
= NULL
;
949 ASSERT_OUTSIDE_BEGIN_END(ctx
, "glGetColorTableParameterfv");
953 table
= &texUnit
->Current1D
->Palette
;
956 table
= &texUnit
->Current2D
->Palette
;
959 table
= &texUnit
->Current3D
->Palette
;
961 case GL_PROXY_TEXTURE_1D
:
962 table
= &ctx
->Texture
.Proxy1D
->Palette
;
964 case GL_PROXY_TEXTURE_2D
:
965 table
= &ctx
->Texture
.Proxy2D
->Palette
;
967 case GL_PROXY_TEXTURE_3D
:
968 table
= &ctx
->Texture
.Proxy3D
->Palette
;
970 case GL_SHARED_TEXTURE_PALETTE_EXT
:
971 table
= &ctx
->Texture
.Palette
;
974 table
= &ctx
->ColorTable
;
975 if (pname
== GL_COLOR_TABLE_SCALE_SGI
) {
976 params
[0] = ctx
->Pixel
.ColorTableScale
[0];
977 params
[1] = ctx
->Pixel
.ColorTableScale
[1];
978 params
[2] = ctx
->Pixel
.ColorTableScale
[2];
979 params
[3] = ctx
->Pixel
.ColorTableScale
[3];
982 else if (pname
== GL_COLOR_TABLE_BIAS_SGI
) {
983 params
[0] = ctx
->Pixel
.ColorTableBias
[0];
984 params
[1] = ctx
->Pixel
.ColorTableBias
[1];
985 params
[2] = ctx
->Pixel
.ColorTableBias
[2];
986 params
[3] = ctx
->Pixel
.ColorTableBias
[3];
990 case GL_PROXY_COLOR_TABLE
:
991 table
= &ctx
->ProxyColorTable
;
993 case GL_POST_CONVOLUTION_COLOR_TABLE
:
994 table
= &ctx
->PostConvolutionColorTable
;
995 if (pname
== GL_COLOR_TABLE_SCALE_SGI
) {
996 params
[0] = ctx
->Pixel
.PCCTscale
[0];
997 params
[1] = ctx
->Pixel
.PCCTscale
[1];
998 params
[2] = ctx
->Pixel
.PCCTscale
[2];
999 params
[3] = ctx
->Pixel
.PCCTscale
[3];
1002 else if (pname
== GL_COLOR_TABLE_BIAS_SGI
) {
1003 params
[0] = ctx
->Pixel
.PCCTbias
[0];
1004 params
[1] = ctx
->Pixel
.PCCTbias
[1];
1005 params
[2] = ctx
->Pixel
.PCCTbias
[2];
1006 params
[3] = ctx
->Pixel
.PCCTbias
[3];
1010 case GL_PROXY_POST_CONVOLUTION_COLOR_TABLE
:
1011 table
= &ctx
->ProxyPostConvolutionColorTable
;
1013 case GL_POST_COLOR_MATRIX_COLOR_TABLE
:
1014 table
= &ctx
->PostColorMatrixColorTable
;
1015 if (pname
== GL_COLOR_TABLE_SCALE_SGI
) {
1016 params
[0] = ctx
->Pixel
.PCMCTscale
[0];
1017 params
[1] = ctx
->Pixel
.PCMCTscale
[1];
1018 params
[2] = ctx
->Pixel
.PCMCTscale
[2];
1019 params
[3] = ctx
->Pixel
.PCMCTscale
[3];
1022 else if (pname
== GL_COLOR_TABLE_BIAS_SGI
) {
1023 params
[0] = ctx
->Pixel
.PCMCTbias
[0];
1024 params
[1] = ctx
->Pixel
.PCMCTbias
[1];
1025 params
[2] = ctx
->Pixel
.PCMCTbias
[2];
1026 params
[3] = ctx
->Pixel
.PCMCTbias
[3];
1030 case GL_PROXY_POST_COLOR_MATRIX_COLOR_TABLE
:
1031 table
= &ctx
->ProxyPostColorMatrixColorTable
;
1034 gl_error(ctx
, GL_INVALID_ENUM
, "glGetColorTableParameterfv(target)");
1041 case GL_COLOR_TABLE_FORMAT
:
1042 *params
= table
->IntFormat
;
1044 case GL_COLOR_TABLE_WIDTH
:
1045 *params
= table
->Size
;
1047 case GL_COLOR_TABLE_RED_SIZE
:
1048 *params
= table
->RedSize
;
1050 case GL_COLOR_TABLE_GREEN_SIZE
:
1051 *params
= table
->GreenSize
;
1053 case GL_COLOR_TABLE_BLUE_SIZE
:
1054 *params
= table
->BlueSize
;
1056 case GL_COLOR_TABLE_ALPHA_SIZE
:
1057 *params
= table
->AlphaSize
;
1059 case GL_COLOR_TABLE_LUMINANCE_SIZE
:
1060 *params
= table
->LuminanceSize
;
1062 case GL_COLOR_TABLE_INTENSITY_SIZE
:
1063 *params
= table
->IntensitySize
;
1066 gl_error(ctx
, GL_INVALID_ENUM
, "glGetColorTableParameterfv(pname)" );
1074 _mesa_GetColorTableParameteriv( GLenum target
, GLenum pname
, GLint
*params
)
1076 GET_CURRENT_CONTEXT(ctx
);
1077 struct gl_texture_unit
*texUnit
= &ctx
->Texture
.Unit
[ctx
->Texture
.CurrentUnit
];
1078 struct gl_color_table
*table
= NULL
;
1080 ASSERT_OUTSIDE_BEGIN_END(ctx
, "glGetColorTableParameteriv");
1084 table
= &texUnit
->Current1D
->Palette
;
1087 table
= &texUnit
->Current2D
->Palette
;
1090 table
= &texUnit
->Current3D
->Palette
;
1092 case GL_PROXY_TEXTURE_1D
:
1093 table
= &ctx
->Texture
.Proxy1D
->Palette
;
1095 case GL_PROXY_TEXTURE_2D
:
1096 table
= &ctx
->Texture
.Proxy2D
->Palette
;
1098 case GL_PROXY_TEXTURE_3D
:
1099 table
= &ctx
->Texture
.Proxy3D
->Palette
;
1101 case GL_SHARED_TEXTURE_PALETTE_EXT
:
1102 table
= &ctx
->Texture
.Palette
;
1104 case GL_COLOR_TABLE
:
1105 table
= &ctx
->ColorTable
;
1106 if (pname
== GL_COLOR_TABLE_SCALE_SGI
) {
1107 params
[0] = (GLint
) ctx
->Pixel
.ColorTableScale
[0];
1108 params
[1] = (GLint
) ctx
->Pixel
.ColorTableScale
[1];
1109 params
[2] = (GLint
) ctx
->Pixel
.ColorTableScale
[2];
1110 params
[3] = (GLint
) ctx
->Pixel
.ColorTableScale
[3];
1113 else if (pname
== GL_COLOR_TABLE_BIAS_SGI
) {
1114 params
[0] = (GLint
) ctx
->Pixel
.ColorTableBias
[0];
1115 params
[1] = (GLint
) ctx
->Pixel
.ColorTableBias
[1];
1116 params
[2] = (GLint
) ctx
->Pixel
.ColorTableBias
[2];
1117 params
[3] = (GLint
) ctx
->Pixel
.ColorTableBias
[3];
1121 case GL_PROXY_COLOR_TABLE
:
1122 table
= &ctx
->ProxyColorTable
;
1124 case GL_POST_CONVOLUTION_COLOR_TABLE
:
1125 table
= &ctx
->PostConvolutionColorTable
;
1126 if (pname
== GL_COLOR_TABLE_SCALE_SGI
) {
1127 params
[0] = (GLint
) ctx
->Pixel
.PCCTscale
[0];
1128 params
[1] = (GLint
) ctx
->Pixel
.PCCTscale
[1];
1129 params
[2] = (GLint
) ctx
->Pixel
.PCCTscale
[2];
1130 params
[3] = (GLint
) ctx
->Pixel
.PCCTscale
[3];
1133 else if (pname
== GL_COLOR_TABLE_BIAS_SGI
) {
1134 params
[0] = (GLint
) ctx
->Pixel
.PCCTbias
[0];
1135 params
[1] = (GLint
) ctx
->Pixel
.PCCTbias
[1];
1136 params
[2] = (GLint
) ctx
->Pixel
.PCCTbias
[2];
1137 params
[3] = (GLint
) ctx
->Pixel
.PCCTbias
[3];
1141 case GL_PROXY_POST_CONVOLUTION_COLOR_TABLE
:
1142 table
= &ctx
->ProxyPostConvolutionColorTable
;
1144 case GL_POST_COLOR_MATRIX_COLOR_TABLE
:
1145 table
= &ctx
->PostColorMatrixColorTable
;
1146 if (pname
== GL_COLOR_TABLE_SCALE_SGI
) {
1147 params
[0] = (GLint
) ctx
->Pixel
.PCMCTscale
[0];
1148 params
[1] = (GLint
) ctx
->Pixel
.PCMCTscale
[1];
1149 params
[2] = (GLint
) ctx
->Pixel
.PCMCTscale
[2];
1150 params
[3] = (GLint
) ctx
->Pixel
.PCMCTscale
[3];
1153 else if (pname
== GL_COLOR_TABLE_BIAS_SGI
) {
1154 params
[0] = (GLint
) ctx
->Pixel
.PCMCTbias
[0];
1155 params
[1] = (GLint
) ctx
->Pixel
.PCMCTbias
[1];
1156 params
[2] = (GLint
) ctx
->Pixel
.PCMCTbias
[2];
1157 params
[3] = (GLint
) ctx
->Pixel
.PCMCTbias
[3];
1161 case GL_PROXY_POST_COLOR_MATRIX_COLOR_TABLE
:
1162 table
= &ctx
->ProxyPostColorMatrixColorTable
;
1165 gl_error(ctx
, GL_INVALID_ENUM
, "glGetColorTableParameteriv(target)");
1172 case GL_COLOR_TABLE_FORMAT
:
1173 *params
= table
->IntFormat
;
1175 case GL_COLOR_TABLE_WIDTH
:
1176 *params
= table
->Size
;
1178 case GL_COLOR_TABLE_RED_SIZE
:
1179 *params
= table
->RedSize
;
1181 case GL_COLOR_TABLE_GREEN_SIZE
:
1182 *params
= table
->GreenSize
;
1184 case GL_COLOR_TABLE_BLUE_SIZE
:
1185 *params
= table
->BlueSize
;
1187 case GL_COLOR_TABLE_ALPHA_SIZE
:
1188 *params
= table
->AlphaSize
;
1190 case GL_COLOR_TABLE_LUMINANCE_SIZE
:
1191 *params
= table
->LuminanceSize
;
1193 case GL_COLOR_TABLE_INTENSITY_SIZE
:
1194 *params
= table
->IntensitySize
;
1197 gl_error(ctx
, GL_INVALID_ENUM
, "glGetColorTableParameteriv(pname)" );