1 /* $Id: colortab.c,v 1.36 2001/03/07 05:06:11 brianp Exp $ */
4 * Mesa 3-D graphics library
7 * Copyright (C) 1999-2001 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.
39 #include "swrast/s_span.h" /* XXX SWRAST hack */
45 * Given an internalFormat token passed to glColorTable,
46 * return the corresponding base format.
47 * Return -1 if invalid token.
50 base_colortab_format( GLenum format
)
65 case GL_LUMINANCE_ALPHA
:
66 case GL_LUMINANCE4_ALPHA4
:
67 case GL_LUMINANCE6_ALPHA2
:
68 case GL_LUMINANCE8_ALPHA8
:
69 case GL_LUMINANCE12_ALPHA4
:
70 case GL_LUMINANCE12_ALPHA12
:
71 case GL_LUMINANCE16_ALPHA16
:
72 return GL_LUMINANCE_ALPHA
;
98 return -1; /* error */
104 _mesa_init_colortable( struct gl_color_table
*p
)
106 p
->FloatTable
= GL_FALSE
;
109 p
->IntFormat
= GL_RGBA
;
115 _mesa_free_colortable_data( struct gl_color_table
*p
)
125 * Examine table's format and set the component sizes accordingly.
128 set_component_sizes( struct gl_color_table
*table
)
130 /* XXX what about GLfloat tables? */
131 switch (table
->Format
) {
134 table
->GreenSize
= 0;
136 table
->AlphaSize
= CHAN_BITS
;
137 table
->IntensitySize
= 0;
138 table
->LuminanceSize
= 0;
142 table
->GreenSize
= 0;
144 table
->AlphaSize
= 0;
145 table
->IntensitySize
= 0;
146 table
->LuminanceSize
= CHAN_BITS
;
148 case GL_LUMINANCE_ALPHA
:
150 table
->GreenSize
= 0;
152 table
->AlphaSize
= CHAN_BITS
;
153 table
->IntensitySize
= 0;
154 table
->LuminanceSize
= CHAN_BITS
;
158 table
->GreenSize
= 0;
160 table
->AlphaSize
= 0;
161 table
->IntensitySize
= CHAN_BITS
;
162 table
->LuminanceSize
= 0;
165 table
->RedSize
= CHAN_BITS
;
166 table
->GreenSize
= CHAN_BITS
;
167 table
->BlueSize
= CHAN_BITS
;
168 table
->AlphaSize
= 0;
169 table
->IntensitySize
= 0;
170 table
->LuminanceSize
= 0;
173 table
->RedSize
= CHAN_BITS
;
174 table
->GreenSize
= CHAN_BITS
;
175 table
->BlueSize
= CHAN_BITS
;
176 table
->AlphaSize
= CHAN_BITS
;
177 table
->IntensitySize
= 0;
178 table
->LuminanceSize
= 0;
181 _mesa_problem(NULL
, "unexpected format in set_component_sizes");
188 _mesa_ColorTable( GLenum target
, GLenum internalFormat
,
189 GLsizei width
, GLenum format
, GLenum type
,
192 GET_CURRENT_CONTEXT(ctx
);
193 struct gl_texture_unit
*texUnit
= &ctx
->Texture
.Unit
[ctx
->Texture
.CurrentUnit
];
194 struct gl_texture_object
*texObj
= NULL
;
195 struct gl_color_table
*table
= NULL
;
196 GLboolean proxy
= GL_FALSE
;
198 GLfloat rScale
= 1.0, gScale
= 1.0, bScale
= 1.0, aScale
= 1.0;
199 GLfloat rBias
= 0.0, gBias
= 0.0, bBias
= 0.0, aBias
= 0.0;
200 GLboolean floatTable
= GL_FALSE
;
202 ASSERT_OUTSIDE_BEGIN_END_AND_FLUSH(ctx
); /* too complex */
206 texObj
= texUnit
->Current1D
;
207 table
= &texObj
->Palette
;
210 texObj
= texUnit
->Current2D
;
211 table
= &texObj
->Palette
;
214 texObj
= texUnit
->Current3D
;
215 table
= &texObj
->Palette
;
217 case GL_PROXY_TEXTURE_1D
:
218 texObj
= ctx
->Texture
.Proxy1D
;
219 table
= &texObj
->Palette
;
222 case GL_PROXY_TEXTURE_2D
:
223 texObj
= ctx
->Texture
.Proxy2D
;
224 table
= &texObj
->Palette
;
227 case GL_PROXY_TEXTURE_3D
:
228 texObj
= ctx
->Texture
.Proxy3D
;
229 table
= &texObj
->Palette
;
232 case GL_SHARED_TEXTURE_PALETTE_EXT
:
233 table
= &ctx
->Texture
.Palette
;
236 table
= &ctx
->ColorTable
;
237 floatTable
= GL_TRUE
;
238 rScale
= ctx
->Pixel
.ColorTableScale
[0];
239 gScale
= ctx
->Pixel
.ColorTableScale
[1];
240 bScale
= ctx
->Pixel
.ColorTableScale
[2];
241 aScale
= ctx
->Pixel
.ColorTableScale
[3];
242 rBias
= ctx
->Pixel
.ColorTableBias
[0];
243 gBias
= ctx
->Pixel
.ColorTableBias
[1];
244 bBias
= ctx
->Pixel
.ColorTableBias
[2];
245 aBias
= ctx
->Pixel
.ColorTableBias
[3];
247 case GL_PROXY_COLOR_TABLE
:
248 table
= &ctx
->ProxyColorTable
;
251 case GL_POST_CONVOLUTION_COLOR_TABLE
:
252 table
= &ctx
->PostConvolutionColorTable
;
253 floatTable
= GL_TRUE
;
254 rScale
= ctx
->Pixel
.PCCTscale
[0];
255 gScale
= ctx
->Pixel
.PCCTscale
[1];
256 bScale
= ctx
->Pixel
.PCCTscale
[2];
257 aScale
= ctx
->Pixel
.PCCTscale
[3];
258 rBias
= ctx
->Pixel
.PCCTbias
[0];
259 gBias
= ctx
->Pixel
.PCCTbias
[1];
260 bBias
= ctx
->Pixel
.PCCTbias
[2];
261 aBias
= ctx
->Pixel
.PCCTbias
[3];
263 case GL_PROXY_POST_CONVOLUTION_COLOR_TABLE
:
264 table
= &ctx
->ProxyPostConvolutionColorTable
;
267 case GL_POST_COLOR_MATRIX_COLOR_TABLE
:
268 table
= &ctx
->PostColorMatrixColorTable
;
269 floatTable
= GL_TRUE
;
270 rScale
= ctx
->Pixel
.PCMCTscale
[0];
271 gScale
= ctx
->Pixel
.PCMCTscale
[1];
272 bScale
= ctx
->Pixel
.PCMCTscale
[2];
273 aScale
= ctx
->Pixel
.PCMCTscale
[3];
274 rBias
= ctx
->Pixel
.PCMCTbias
[0];
275 gBias
= ctx
->Pixel
.PCMCTbias
[1];
276 bBias
= ctx
->Pixel
.PCMCTbias
[2];
277 aBias
= ctx
->Pixel
.PCMCTbias
[3];
279 case GL_PROXY_POST_COLOR_MATRIX_COLOR_TABLE
:
280 table
= &ctx
->ProxyPostColorMatrixColorTable
;
284 _mesa_error(ctx
, GL_INVALID_ENUM
, "glColorTable(target)");
290 if (!_mesa_is_legal_format_and_type(format
, type
) ||
291 format
== GL_INTENSITY
) {
292 _mesa_error(ctx
, GL_INVALID_OPERATION
, "glColorTable(format or type)");
296 baseFormat
= base_colortab_format(internalFormat
);
297 if (baseFormat
< 0 || baseFormat
== GL_COLOR_INDEX
) {
298 _mesa_error(ctx
, GL_INVALID_ENUM
, "glColorTable(internalFormat)");
302 if (width
< 0 || (width
!= 0 && _mesa_bitcount(width
) != 1)) {
306 table
->IntFormat
= (GLenum
) 0;
307 table
->Format
= (GLenum
) 0;
311 sprintf(msg
, "glColorTable(width=%d)", width
);
312 _mesa_error(ctx
, GL_INVALID_VALUE
, msg
);
317 if (width
> (GLsizei
) ctx
->Const
.MaxColorTableSize
) {
320 table
->IntFormat
= (GLenum
) 0;
321 table
->Format
= (GLenum
) 0;
324 _mesa_error(ctx
, GL_TABLE_TOO_LARGE
, "glColorTable(width)");
330 table
->IntFormat
= internalFormat
;
331 table
->Format
= (GLenum
) baseFormat
;
332 set_component_sizes(table
);
334 comps
= _mesa_components_in_format(table
->Format
);
335 assert(comps
> 0); /* error should have been caught sooner */
338 /* free old table, if any */
345 GLfloat tempTab
[MAX_COLOR_TABLE_SIZE
* 4];
349 _mesa_unpack_float_color_span(ctx
, width
, table
->Format
,
351 format
, type
, data
, &ctx
->Unpack
,
354 table
->FloatTable
= GL_TRUE
;
355 table
->Table
= MALLOC(comps
* width
* sizeof(GLfloat
));
357 _mesa_error(ctx
, GL_OUT_OF_MEMORY
, "glColorTable");
361 tableF
= (GLfloat
*) table
->Table
;
363 switch (table
->Format
) {
365 for (i
= 0; i
< width
; i
++) {
366 tableF
[i
] = CLAMP(tempTab
[i
] * rScale
+ rBias
, 0.0F
, 1.0F
);
370 for (i
= 0; i
< width
; i
++) {
371 tableF
[i
] = CLAMP(tempTab
[i
] * rScale
+ rBias
, 0.0F
, 1.0F
);
375 for (i
= 0; i
< width
; i
++) {
376 tableF
[i
] = CLAMP(tempTab
[i
] * aScale
+ aBias
, 0.0F
, 1.0F
);
379 case GL_LUMINANCE_ALPHA
:
380 for (i
= 0; i
< width
; i
++) {
381 tableF
[i
*2+0] = CLAMP(tempTab
[i
*2+0] * rScale
+ rBias
, 0.0F
, 1.0F
);
382 tableF
[i
*2+1] = CLAMP(tempTab
[i
*2+1] * aScale
+ aBias
, 0.0F
, 1.0F
);
386 for (i
= 0; i
< width
; i
++) {
387 tableF
[i
*3+0] = CLAMP(tempTab
[i
*3+0] * rScale
+ rBias
, 0.0F
, 1.0F
);
388 tableF
[i
*3+1] = CLAMP(tempTab
[i
*3+1] * gScale
+ gBias
, 0.0F
, 1.0F
);
389 tableF
[i
*3+2] = CLAMP(tempTab
[i
*3+2] * bScale
+ bBias
, 0.0F
, 1.0F
);
393 for (i
= 0; i
< width
; i
++) {
394 tableF
[i
*4+0] = CLAMP(tempTab
[i
*4+0] * rScale
+ rBias
, 0.0F
, 1.0F
);
395 tableF
[i
*4+1] = CLAMP(tempTab
[i
*4+1] * gScale
+ gBias
, 0.0F
, 1.0F
);
396 tableF
[i
*4+2] = CLAMP(tempTab
[i
*4+2] * bScale
+ bBias
, 0.0F
, 1.0F
);
397 tableF
[i
*4+3] = CLAMP(tempTab
[i
*4+3] * aScale
+ aBias
, 0.0F
, 1.0F
);
401 _mesa_problem(ctx
, "Bad format in _mesa_ColorTable");
406 /* store GLchan table */
407 table
->FloatTable
= GL_FALSE
;
408 table
->Table
= MALLOC(comps
* width
* sizeof(GLchan
));
410 _mesa_error(ctx
, GL_OUT_OF_MEMORY
, "glColorTable");
413 _mesa_unpack_chan_color_span(ctx
, width
, table
->Format
,
414 (GLchan
*) table
->Table
, /* dest */
421 if (texObj
|| target
== GL_SHARED_TEXTURE_PALETTE_EXT
) {
422 /* texture object palette, texObj==NULL means the shared palette */
423 if (ctx
->Driver
.UpdateTexturePalette
) {
424 (*ctx
->Driver
.UpdateTexturePalette
)( ctx
, texObj
);
428 ctx
->NewState
|= _NEW_PIXEL
;
434 _mesa_ColorSubTable( GLenum target
, GLsizei start
,
435 GLsizei count
, GLenum format
, GLenum type
,
438 GET_CURRENT_CONTEXT(ctx
);
439 struct gl_texture_unit
*texUnit
= &ctx
->Texture
.Unit
[ctx
->Texture
.CurrentUnit
];
440 struct gl_texture_object
*texObj
= NULL
;
441 struct gl_color_table
*table
= NULL
;
442 GLfloat rScale
= 1.0, gScale
= 1.0, bScale
= 1.0, aScale
= 1.0;
443 GLfloat rBias
= 0.0, gBias
= 0.0, bBias
= 0.0, aBias
= 0.0;
445 ASSERT_OUTSIDE_BEGIN_END_AND_FLUSH(ctx
);
449 texObj
= texUnit
->Current1D
;
450 table
= &texObj
->Palette
;
453 texObj
= texUnit
->Current2D
;
454 table
= &texObj
->Palette
;
457 texObj
= texUnit
->Current3D
;
458 table
= &texObj
->Palette
;
460 case GL_SHARED_TEXTURE_PALETTE_EXT
:
461 table
= &ctx
->Texture
.Palette
;
464 table
= &ctx
->ColorTable
;
465 rScale
= ctx
->Pixel
.ColorTableScale
[0];
466 gScale
= ctx
->Pixel
.ColorTableScale
[1];
467 bScale
= ctx
->Pixel
.ColorTableScale
[2];
468 aScale
= ctx
->Pixel
.ColorTableScale
[3];
469 rBias
= ctx
->Pixel
.ColorTableBias
[0];
470 gBias
= ctx
->Pixel
.ColorTableBias
[1];
471 bBias
= ctx
->Pixel
.ColorTableBias
[2];
472 aBias
= ctx
->Pixel
.ColorTableBias
[3];
474 case GL_POST_CONVOLUTION_COLOR_TABLE
:
475 table
= &ctx
->PostConvolutionColorTable
;
476 rScale
= ctx
->Pixel
.PCCTscale
[0];
477 gScale
= ctx
->Pixel
.PCCTscale
[1];
478 bScale
= ctx
->Pixel
.PCCTscale
[2];
479 aScale
= ctx
->Pixel
.PCCTscale
[3];
480 rBias
= ctx
->Pixel
.PCCTbias
[0];
481 gBias
= ctx
->Pixel
.PCCTbias
[1];
482 bBias
= ctx
->Pixel
.PCCTbias
[2];
483 aBias
= ctx
->Pixel
.PCCTbias
[3];
485 case GL_POST_COLOR_MATRIX_COLOR_TABLE
:
486 table
= &ctx
->PostColorMatrixColorTable
;
487 rScale
= ctx
->Pixel
.PCMCTscale
[0];
488 gScale
= ctx
->Pixel
.PCMCTscale
[1];
489 bScale
= ctx
->Pixel
.PCMCTscale
[2];
490 aScale
= ctx
->Pixel
.PCMCTscale
[3];
491 rBias
= ctx
->Pixel
.PCMCTbias
[0];
492 gBias
= ctx
->Pixel
.PCMCTbias
[1];
493 bBias
= ctx
->Pixel
.PCMCTbias
[2];
494 aBias
= ctx
->Pixel
.PCMCTbias
[3];
497 _mesa_error(ctx
, GL_INVALID_ENUM
, "glColorSubTable(target)");
503 if (!_mesa_is_legal_format_and_type(format
, type
) ||
504 format
== GL_INTENSITY
) {
505 _mesa_error(ctx
, GL_INVALID_OPERATION
, "glColorSubTable(format or type)");
510 _mesa_error(ctx
, GL_INVALID_VALUE
, "glColorSubTable(count)");
514 comps
= _mesa_components_in_format(table
->Format
);
515 assert(comps
> 0); /* error should have been caught sooner */
517 if (start
+ count
> (GLint
) table
->Size
) {
518 _mesa_error(ctx
, GL_INVALID_VALUE
, "glColorSubTable(count)");
523 _mesa_error(ctx
, GL_OUT_OF_MEMORY
, "glColorSubTable");
527 if (!table
->FloatTable
) {
528 GLchan
*dest
= (GLchan
*) table
->Table
+ start
* comps
* sizeof(GLchan
);
529 _mesa_unpack_chan_color_span(ctx
, count
, table
->Format
, dest
,
530 format
, type
, data
, &ctx
->Unpack
, 0);
533 GLfloat tempTab
[MAX_COLOR_TABLE_SIZE
* 4];
537 ASSERT(table
->FloatTable
);
539 _mesa_unpack_float_color_span(ctx
, count
, table
->Format
,
541 format
, type
, data
, &ctx
->Unpack
,
544 tableF
= (GLfloat
*) table
->Table
;
546 switch (table
->Format
) {
548 for (i
= 0; i
< count
; i
++) {
549 GLuint j
= start
+ i
;
550 tableF
[j
] = CLAMP(tempTab
[i
] * rScale
+ rBias
, 0.0F
, 1.0F
);
554 for (i
= 0; i
< count
; i
++) {
555 GLuint j
= start
+ i
;
556 tableF
[j
] = CLAMP(tempTab
[i
] * rScale
+ rBias
, 0.0F
, 1.0F
);
560 for (i
= 0; i
< count
; i
++) {
561 GLuint j
= start
+ i
;
562 tableF
[j
] = CLAMP(tempTab
[i
] * aScale
+ aBias
, 0.0F
, 1.0F
);
565 case GL_LUMINANCE_ALPHA
:
566 for (i
= 0; i
< count
; i
++) {
567 GLuint j
= start
+ i
;
568 tableF
[j
*2+0] = CLAMP(tempTab
[i
*2+0] * rScale
+ rBias
, 0.0F
, 1.0F
);
569 tableF
[j
*2+1] = CLAMP(tempTab
[i
*2+1] * aScale
+ aBias
, 0.0F
, 1.0F
);
573 for (i
= 0; i
< count
; i
++) {
574 GLuint j
= start
+ i
;
575 tableF
[j
*3+0] = CLAMP(tempTab
[i
*3+0] * rScale
+ rBias
, 0.0F
, 1.0F
);
576 tableF
[j
*3+1] = CLAMP(tempTab
[i
*3+1] * gScale
+ gBias
, 0.0F
, 1.0F
);
577 tableF
[j
*3+2] = CLAMP(tempTab
[i
*3+2] * bScale
+ bBias
, 0.0F
, 1.0F
);
581 for (i
= 0; i
< count
; i
++) {
582 GLuint j
= start
+ i
;
583 tableF
[j
*4+0] = CLAMP(tempTab
[i
*4+0] * rScale
+ rBias
, 0.0F
, 1.0F
);
584 tableF
[j
*4+1] = CLAMP(tempTab
[i
*4+1] * gScale
+ gBias
, 0.0F
, 1.0F
);
585 tableF
[j
*4+2] = CLAMP(tempTab
[i
*4+2] * bScale
+ bBias
, 0.0F
, 1.0F
);
586 tableF
[j
*4+3] = CLAMP(tempTab
[i
*4+3] * aScale
+ aBias
, 0.0F
, 1.0F
);
590 _mesa_problem(ctx
, "Bad format in _mesa_ColorSubTable");
595 if (texObj
|| target
== GL_SHARED_TEXTURE_PALETTE_EXT
) {
596 /* per-texture object palette */
597 if (ctx
->Driver
.UpdateTexturePalette
) {
598 (*ctx
->Driver
.UpdateTexturePalette
)( ctx
, texObj
);
602 ctx
->NewState
|= _NEW_PIXEL
;
609 _mesa_CopyColorTable(GLenum target
, GLenum internalformat
,
610 GLint x
, GLint y
, GLsizei width
)
612 GLchan data
[MAX_WIDTH
][4];
613 GET_CURRENT_CONTEXT(ctx
);
614 ASSERT_OUTSIDE_BEGIN_END_AND_FLUSH(ctx
);
616 /* Select buffer to read from */
617 (*ctx
->Driver
.SetReadBuffer
)( ctx
, ctx
->ReadBuffer
,
618 ctx
->Pixel
.DriverReadBuffer
);
620 if (width
> MAX_WIDTH
)
623 /* read the data from framebuffer */
625 _mesa_read_rgba_span( ctx
, ctx
->ReadBuffer
, width
, x
, y
, data
);
628 /* Restore reading from draw buffer (the default) */
629 (*ctx
->Driver
.SetReadBuffer
)( ctx
, ctx
->DrawBuffer
,
630 ctx
->Color
.DriverDrawBuffer
);
632 _mesa_ColorTable(target
, internalformat
, width
,
633 GL_RGBA
, GL_UNSIGNED_BYTE
, data
);
640 _mesa_CopyColorSubTable(GLenum target
, GLsizei start
,
641 GLint x
, GLint y
, GLsizei width
)
643 GLchan data
[MAX_WIDTH
][4];
644 GET_CURRENT_CONTEXT(ctx
);
645 ASSERT_OUTSIDE_BEGIN_END_AND_FLUSH(ctx
);
647 /* Select buffer to read from */
648 (*ctx
->Driver
.SetReadBuffer
)( ctx
, ctx
->ReadBuffer
,
649 ctx
->Pixel
.DriverReadBuffer
);
651 if (width
> MAX_WIDTH
)
654 /* read the data from framebuffer */
656 _mesa_read_rgba_span( ctx
, ctx
->ReadBuffer
, width
, x
, y
, data
);
659 /* Restore reading from draw buffer (the default) */
660 (*ctx
->Driver
.SetReadBuffer
)( ctx
, ctx
->DrawBuffer
,
661 ctx
->Color
.DriverDrawBuffer
);
663 _mesa_ColorSubTable(target
, start
, width
, GL_RGBA
, GL_UNSIGNED_BYTE
, data
);
669 _mesa_GetColorTable( GLenum target
, GLenum format
,
670 GLenum type
, GLvoid
*data
)
672 GET_CURRENT_CONTEXT(ctx
);
673 struct gl_texture_unit
*texUnit
= &ctx
->Texture
.Unit
[ctx
->Texture
.CurrentUnit
];
674 struct gl_color_table
*table
= NULL
;
675 GLchan rgba
[MAX_COLOR_TABLE_SIZE
][4];
676 ASSERT_OUTSIDE_BEGIN_END_AND_FLUSH(ctx
);
679 _mesa_update_state(ctx
);
684 table
= &texUnit
->Current1D
->Palette
;
687 table
= &texUnit
->Current2D
->Palette
;
690 table
= &texUnit
->Current3D
->Palette
;
692 case GL_SHARED_TEXTURE_PALETTE_EXT
:
693 table
= &ctx
->Texture
.Palette
;
696 table
= &ctx
->ColorTable
;
698 case GL_POST_CONVOLUTION_COLOR_TABLE
:
699 table
= &ctx
->PostConvolutionColorTable
;
701 case GL_POST_COLOR_MATRIX_COLOR_TABLE
:
702 table
= &ctx
->PostColorMatrixColorTable
;
705 _mesa_error(ctx
, GL_INVALID_ENUM
, "glGetColorTable(target)");
711 switch (table
->Format
) {
713 if (table
->FloatTable
) {
714 const GLfloat
*tableF
= (const GLfloat
*) table
->Table
;
716 for (i
= 0; i
< table
->Size
; i
++) {
720 rgba
[i
][ACOMP
] = (GLint
) (tableF
[i
] * CHAN_MAXF
);
724 const GLchan
*tableUB
= (const GLchan
*) table
->Table
;
726 for (i
= 0; i
< table
->Size
; i
++) {
730 rgba
[i
][ACOMP
] = tableUB
[i
];
735 if (table
->FloatTable
) {
736 const GLfloat
*tableF
= (const GLfloat
*) table
->Table
;
738 for (i
= 0; i
< table
->Size
; i
++) {
739 rgba
[i
][RCOMP
] = (GLint
) (tableF
[i
] * CHAN_MAXF
);
740 rgba
[i
][GCOMP
] = (GLint
) (tableF
[i
] * CHAN_MAXF
);
741 rgba
[i
][BCOMP
] = (GLint
) (tableF
[i
] * CHAN_MAXF
);
742 rgba
[i
][ACOMP
] = CHAN_MAX
;
746 const GLchan
*tableUB
= (const GLchan
*) table
->Table
;
748 for (i
= 0; i
< table
->Size
; i
++) {
749 rgba
[i
][RCOMP
] = tableUB
[i
];
750 rgba
[i
][GCOMP
] = tableUB
[i
];
751 rgba
[i
][BCOMP
] = tableUB
[i
];
752 rgba
[i
][ACOMP
] = CHAN_MAX
;
756 case GL_LUMINANCE_ALPHA
:
757 if (table
->FloatTable
) {
758 const GLfloat
*tableF
= (const GLfloat
*) table
->Table
;
760 for (i
= 0; i
< table
->Size
; i
++) {
761 rgba
[i
][RCOMP
] = (GLint
) (tableF
[i
*2+0] * CHAN_MAXF
);
762 rgba
[i
][GCOMP
] = (GLint
) (tableF
[i
*2+0] * CHAN_MAXF
);
763 rgba
[i
][BCOMP
] = (GLint
) (tableF
[i
*2+0] * CHAN_MAXF
);
764 rgba
[i
][ACOMP
] = (GLint
) (tableF
[i
*2+1] * CHAN_MAXF
);
768 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
;
782 for (i
= 0; i
< table
->Size
; i
++) {
783 rgba
[i
][RCOMP
] = (GLint
) (tableF
[i
] * CHAN_MAXF
);
784 rgba
[i
][GCOMP
] = (GLint
) (tableF
[i
] * CHAN_MAXF
);
785 rgba
[i
][BCOMP
] = (GLint
) (tableF
[i
] * CHAN_MAXF
);
786 rgba
[i
][ACOMP
] = (GLint
) (tableF
[i
] * CHAN_MAXF
);
790 const GLchan
*tableUB
= (const GLchan
*) table
->Table
;
792 for (i
= 0; i
< table
->Size
; i
++) {
793 rgba
[i
][RCOMP
] = tableUB
[i
];
794 rgba
[i
][GCOMP
] = tableUB
[i
];
795 rgba
[i
][BCOMP
] = tableUB
[i
];
796 rgba
[i
][ACOMP
] = tableUB
[i
];
801 if (table
->FloatTable
) {
802 const GLfloat
*tableF
= (const GLfloat
*) table
->Table
;
804 for (i
= 0; i
< table
->Size
; i
++) {
805 rgba
[i
][RCOMP
] = (GLint
) (tableF
[i
*3+0] * CHAN_MAXF
);
806 rgba
[i
][GCOMP
] = (GLint
) (tableF
[i
*3+1] * CHAN_MAXF
);
807 rgba
[i
][BCOMP
] = (GLint
) (tableF
[i
*3+2] * CHAN_MAXF
);
808 rgba
[i
][ACOMP
] = CHAN_MAX
;
812 const GLchan
*tableUB
= (const GLchan
*) table
->Table
;
814 for (i
= 0; i
< table
->Size
; i
++) {
815 rgba
[i
][RCOMP
] = tableUB
[i
*3+0];
816 rgba
[i
][GCOMP
] = tableUB
[i
*3+1];
817 rgba
[i
][BCOMP
] = tableUB
[i
*3+2];
818 rgba
[i
][ACOMP
] = CHAN_MAX
;
823 if (table
->FloatTable
) {
824 const GLfloat
*tableF
= (const GLfloat
*) table
->Table
;
826 for (i
= 0; i
< table
->Size
; i
++) {
827 rgba
[i
][RCOMP
] = (GLint
) (tableF
[i
*4+0] * CHAN_MAXF
+ 0.5F
);
828 rgba
[i
][GCOMP
] = (GLint
) (tableF
[i
*4+1] * CHAN_MAXF
+ 0.5F
);
829 rgba
[i
][BCOMP
] = (GLint
) (tableF
[i
*4+2] * CHAN_MAXF
+ 0.5F
);
830 rgba
[i
][ACOMP
] = (GLint
) (tableF
[i
*4+3] * CHAN_MAXF
+ 0.5F
);
834 const GLchan
*tableUB
= (const GLchan
*) table
->Table
;
836 for (i
= 0; i
< table
->Size
; i
++) {
837 rgba
[i
][RCOMP
] = tableUB
[i
*4+0];
838 rgba
[i
][GCOMP
] = tableUB
[i
*4+1];
839 rgba
[i
][BCOMP
] = tableUB
[i
*4+2];
840 rgba
[i
][ACOMP
] = tableUB
[i
*4+3];
845 _mesa_problem(ctx
, "bad table format in glGetColorTable");
849 _mesa_pack_rgba_span(ctx
, table
->Size
, (const GLchan (*)[]) rgba
,
850 format
, type
, data
, &ctx
->Pack
, GL_FALSE
);
856 _mesa_ColorTableParameterfv(GLenum target
, GLenum pname
, const GLfloat
*params
)
858 GET_CURRENT_CONTEXT(ctx
);
859 ASSERT_OUTSIDE_BEGIN_END_AND_FLUSH(ctx
);
862 case GL_COLOR_TABLE_SGI
:
863 if (pname
== GL_COLOR_TABLE_SCALE_SGI
) {
864 ctx
->Pixel
.ColorTableScale
[0] = params
[0];
865 ctx
->Pixel
.ColorTableScale
[1] = params
[1];
866 ctx
->Pixel
.ColorTableScale
[2] = params
[2];
867 ctx
->Pixel
.ColorTableScale
[3] = params
[3];
869 else if (pname
== GL_COLOR_TABLE_BIAS_SGI
) {
870 ctx
->Pixel
.ColorTableBias
[0] = params
[0];
871 ctx
->Pixel
.ColorTableBias
[1] = params
[1];
872 ctx
->Pixel
.ColorTableBias
[2] = params
[2];
873 ctx
->Pixel
.ColorTableBias
[3] = params
[3];
876 _mesa_error(ctx
, GL_INVALID_ENUM
, "glColorTableParameterfv(pname)");
880 case GL_POST_CONVOLUTION_COLOR_TABLE_SGI
:
881 if (pname
== GL_COLOR_TABLE_SCALE_SGI
) {
882 ctx
->Pixel
.PCCTscale
[0] = params
[0];
883 ctx
->Pixel
.PCCTscale
[1] = params
[1];
884 ctx
->Pixel
.PCCTscale
[2] = params
[2];
885 ctx
->Pixel
.PCCTscale
[3] = params
[3];
887 else if (pname
== GL_COLOR_TABLE_BIAS_SGI
) {
888 ctx
->Pixel
.PCCTbias
[0] = params
[0];
889 ctx
->Pixel
.PCCTbias
[1] = params
[1];
890 ctx
->Pixel
.PCCTbias
[2] = params
[2];
891 ctx
->Pixel
.PCCTbias
[3] = params
[3];
894 _mesa_error(ctx
, GL_INVALID_ENUM
, "glColorTableParameterfv(pname)");
898 case GL_POST_COLOR_MATRIX_COLOR_TABLE_SGI
:
899 if (pname
== GL_COLOR_TABLE_SCALE_SGI
) {
900 ctx
->Pixel
.PCMCTscale
[0] = params
[0];
901 ctx
->Pixel
.PCMCTscale
[1] = params
[1];
902 ctx
->Pixel
.PCMCTscale
[2] = params
[2];
903 ctx
->Pixel
.PCMCTscale
[3] = params
[3];
905 else if (pname
== GL_COLOR_TABLE_BIAS_SGI
) {
906 ctx
->Pixel
.PCMCTbias
[0] = params
[0];
907 ctx
->Pixel
.PCMCTbias
[1] = params
[1];
908 ctx
->Pixel
.PCMCTbias
[2] = params
[2];
909 ctx
->Pixel
.PCMCTbias
[3] = params
[3];
912 _mesa_error(ctx
, GL_INVALID_ENUM
, "glColorTableParameterfv(pname)");
917 _mesa_error(ctx
, GL_INVALID_ENUM
, "glColorTableParameter(target)");
921 ctx
->NewState
|= _NEW_PIXEL
;
927 _mesa_ColorTableParameteriv(GLenum target
, GLenum pname
, const GLint
*params
)
930 if (pname
== GL_COLOR_TABLE_SGI
||
931 pname
== GL_POST_CONVOLUTION_COLOR_TABLE_SGI
||
932 pname
== GL_POST_COLOR_MATRIX_COLOR_TABLE_SGI
) {
934 fparams
[0] = (GLfloat
) params
[0];
935 fparams
[1] = (GLfloat
) params
[1];
936 fparams
[2] = (GLfloat
) params
[2];
937 fparams
[3] = (GLfloat
) params
[3];
941 fparams
[0] = (GLfloat
) params
[0];
943 _mesa_ColorTableParameterfv(target
, pname
, fparams
);
949 _mesa_GetColorTableParameterfv( GLenum target
, GLenum pname
, GLfloat
*params
)
951 GET_CURRENT_CONTEXT(ctx
);
952 struct gl_texture_unit
*texUnit
= &ctx
->Texture
.Unit
[ctx
->Texture
.CurrentUnit
];
953 struct gl_color_table
*table
= NULL
;
954 ASSERT_OUTSIDE_BEGIN_END(ctx
);
958 table
= &texUnit
->Current1D
->Palette
;
961 table
= &texUnit
->Current2D
->Palette
;
964 table
= &texUnit
->Current3D
->Palette
;
966 case GL_PROXY_TEXTURE_1D
:
967 table
= &ctx
->Texture
.Proxy1D
->Palette
;
969 case GL_PROXY_TEXTURE_2D
:
970 table
= &ctx
->Texture
.Proxy2D
->Palette
;
972 case GL_PROXY_TEXTURE_3D
:
973 table
= &ctx
->Texture
.Proxy3D
->Palette
;
975 case GL_SHARED_TEXTURE_PALETTE_EXT
:
976 table
= &ctx
->Texture
.Palette
;
979 table
= &ctx
->ColorTable
;
980 if (pname
== GL_COLOR_TABLE_SCALE_SGI
) {
981 params
[0] = ctx
->Pixel
.ColorTableScale
[0];
982 params
[1] = ctx
->Pixel
.ColorTableScale
[1];
983 params
[2] = ctx
->Pixel
.ColorTableScale
[2];
984 params
[3] = ctx
->Pixel
.ColorTableScale
[3];
987 else if (pname
== GL_COLOR_TABLE_BIAS_SGI
) {
988 params
[0] = ctx
->Pixel
.ColorTableBias
[0];
989 params
[1] = ctx
->Pixel
.ColorTableBias
[1];
990 params
[2] = ctx
->Pixel
.ColorTableBias
[2];
991 params
[3] = ctx
->Pixel
.ColorTableBias
[3];
995 case GL_PROXY_COLOR_TABLE
:
996 table
= &ctx
->ProxyColorTable
;
998 case GL_POST_CONVOLUTION_COLOR_TABLE
:
999 table
= &ctx
->PostConvolutionColorTable
;
1000 if (pname
== GL_COLOR_TABLE_SCALE_SGI
) {
1001 params
[0] = ctx
->Pixel
.PCCTscale
[0];
1002 params
[1] = ctx
->Pixel
.PCCTscale
[1];
1003 params
[2] = ctx
->Pixel
.PCCTscale
[2];
1004 params
[3] = ctx
->Pixel
.PCCTscale
[3];
1007 else if (pname
== GL_COLOR_TABLE_BIAS_SGI
) {
1008 params
[0] = ctx
->Pixel
.PCCTbias
[0];
1009 params
[1] = ctx
->Pixel
.PCCTbias
[1];
1010 params
[2] = ctx
->Pixel
.PCCTbias
[2];
1011 params
[3] = ctx
->Pixel
.PCCTbias
[3];
1015 case GL_PROXY_POST_CONVOLUTION_COLOR_TABLE
:
1016 table
= &ctx
->ProxyPostConvolutionColorTable
;
1018 case GL_POST_COLOR_MATRIX_COLOR_TABLE
:
1019 table
= &ctx
->PostColorMatrixColorTable
;
1020 if (pname
== GL_COLOR_TABLE_SCALE_SGI
) {
1021 params
[0] = ctx
->Pixel
.PCMCTscale
[0];
1022 params
[1] = ctx
->Pixel
.PCMCTscale
[1];
1023 params
[2] = ctx
->Pixel
.PCMCTscale
[2];
1024 params
[3] = ctx
->Pixel
.PCMCTscale
[3];
1027 else if (pname
== GL_COLOR_TABLE_BIAS_SGI
) {
1028 params
[0] = ctx
->Pixel
.PCMCTbias
[0];
1029 params
[1] = ctx
->Pixel
.PCMCTbias
[1];
1030 params
[2] = ctx
->Pixel
.PCMCTbias
[2];
1031 params
[3] = ctx
->Pixel
.PCMCTbias
[3];
1035 case GL_PROXY_POST_COLOR_MATRIX_COLOR_TABLE
:
1036 table
= &ctx
->ProxyPostColorMatrixColorTable
;
1039 _mesa_error(ctx
, GL_INVALID_ENUM
, "glGetColorTableParameterfv(target)");
1046 case GL_COLOR_TABLE_FORMAT
:
1047 *params
= table
->IntFormat
;
1049 case GL_COLOR_TABLE_WIDTH
:
1050 *params
= table
->Size
;
1052 case GL_COLOR_TABLE_RED_SIZE
:
1053 *params
= table
->RedSize
;
1055 case GL_COLOR_TABLE_GREEN_SIZE
:
1056 *params
= table
->GreenSize
;
1058 case GL_COLOR_TABLE_BLUE_SIZE
:
1059 *params
= table
->BlueSize
;
1061 case GL_COLOR_TABLE_ALPHA_SIZE
:
1062 *params
= table
->AlphaSize
;
1064 case GL_COLOR_TABLE_LUMINANCE_SIZE
:
1065 *params
= table
->LuminanceSize
;
1067 case GL_COLOR_TABLE_INTENSITY_SIZE
:
1068 *params
= table
->IntensitySize
;
1071 _mesa_error(ctx
, GL_INVALID_ENUM
, "glGetColorTableParameterfv(pname)" );
1079 _mesa_GetColorTableParameteriv( GLenum target
, GLenum pname
, GLint
*params
)
1081 GET_CURRENT_CONTEXT(ctx
);
1082 struct gl_texture_unit
*texUnit
= &ctx
->Texture
.Unit
[ctx
->Texture
.CurrentUnit
];
1083 struct gl_color_table
*table
= NULL
;
1084 ASSERT_OUTSIDE_BEGIN_END(ctx
);
1088 table
= &texUnit
->Current1D
->Palette
;
1091 table
= &texUnit
->Current2D
->Palette
;
1094 table
= &texUnit
->Current3D
->Palette
;
1096 case GL_PROXY_TEXTURE_1D
:
1097 table
= &ctx
->Texture
.Proxy1D
->Palette
;
1099 case GL_PROXY_TEXTURE_2D
:
1100 table
= &ctx
->Texture
.Proxy2D
->Palette
;
1102 case GL_PROXY_TEXTURE_3D
:
1103 table
= &ctx
->Texture
.Proxy3D
->Palette
;
1105 case GL_SHARED_TEXTURE_PALETTE_EXT
:
1106 table
= &ctx
->Texture
.Palette
;
1108 case GL_COLOR_TABLE
:
1109 table
= &ctx
->ColorTable
;
1110 if (pname
== GL_COLOR_TABLE_SCALE_SGI
) {
1111 params
[0] = (GLint
) ctx
->Pixel
.ColorTableScale
[0];
1112 params
[1] = (GLint
) ctx
->Pixel
.ColorTableScale
[1];
1113 params
[2] = (GLint
) ctx
->Pixel
.ColorTableScale
[2];
1114 params
[3] = (GLint
) ctx
->Pixel
.ColorTableScale
[3];
1117 else if (pname
== GL_COLOR_TABLE_BIAS_SGI
) {
1118 params
[0] = (GLint
) ctx
->Pixel
.ColorTableBias
[0];
1119 params
[1] = (GLint
) ctx
->Pixel
.ColorTableBias
[1];
1120 params
[2] = (GLint
) ctx
->Pixel
.ColorTableBias
[2];
1121 params
[3] = (GLint
) ctx
->Pixel
.ColorTableBias
[3];
1125 case GL_PROXY_COLOR_TABLE
:
1126 table
= &ctx
->ProxyColorTable
;
1128 case GL_POST_CONVOLUTION_COLOR_TABLE
:
1129 table
= &ctx
->PostConvolutionColorTable
;
1130 if (pname
== GL_COLOR_TABLE_SCALE_SGI
) {
1131 params
[0] = (GLint
) ctx
->Pixel
.PCCTscale
[0];
1132 params
[1] = (GLint
) ctx
->Pixel
.PCCTscale
[1];
1133 params
[2] = (GLint
) ctx
->Pixel
.PCCTscale
[2];
1134 params
[3] = (GLint
) ctx
->Pixel
.PCCTscale
[3];
1137 else if (pname
== GL_COLOR_TABLE_BIAS_SGI
) {
1138 params
[0] = (GLint
) ctx
->Pixel
.PCCTbias
[0];
1139 params
[1] = (GLint
) ctx
->Pixel
.PCCTbias
[1];
1140 params
[2] = (GLint
) ctx
->Pixel
.PCCTbias
[2];
1141 params
[3] = (GLint
) ctx
->Pixel
.PCCTbias
[3];
1145 case GL_PROXY_POST_CONVOLUTION_COLOR_TABLE
:
1146 table
= &ctx
->ProxyPostConvolutionColorTable
;
1148 case GL_POST_COLOR_MATRIX_COLOR_TABLE
:
1149 table
= &ctx
->PostColorMatrixColorTable
;
1150 if (pname
== GL_COLOR_TABLE_SCALE_SGI
) {
1151 params
[0] = (GLint
) ctx
->Pixel
.PCMCTscale
[0];
1152 params
[1] = (GLint
) ctx
->Pixel
.PCMCTscale
[1];
1153 params
[2] = (GLint
) ctx
->Pixel
.PCMCTscale
[2];
1154 params
[3] = (GLint
) ctx
->Pixel
.PCMCTscale
[3];
1157 else if (pname
== GL_COLOR_TABLE_BIAS_SGI
) {
1158 params
[0] = (GLint
) ctx
->Pixel
.PCMCTbias
[0];
1159 params
[1] = (GLint
) ctx
->Pixel
.PCMCTbias
[1];
1160 params
[2] = (GLint
) ctx
->Pixel
.PCMCTbias
[2];
1161 params
[3] = (GLint
) ctx
->Pixel
.PCMCTbias
[3];
1165 case GL_PROXY_POST_COLOR_MATRIX_COLOR_TABLE
:
1166 table
= &ctx
->ProxyPostColorMatrixColorTable
;
1169 _mesa_error(ctx
, GL_INVALID_ENUM
, "glGetColorTableParameteriv(target)");
1176 case GL_COLOR_TABLE_FORMAT
:
1177 *params
= table
->IntFormat
;
1179 case GL_COLOR_TABLE_WIDTH
:
1180 *params
= table
->Size
;
1182 case GL_COLOR_TABLE_RED_SIZE
:
1183 *params
= table
->RedSize
;
1185 case GL_COLOR_TABLE_GREEN_SIZE
:
1186 *params
= table
->GreenSize
;
1188 case GL_COLOR_TABLE_BLUE_SIZE
:
1189 *params
= table
->BlueSize
;
1191 case GL_COLOR_TABLE_ALPHA_SIZE
:
1192 *params
= table
->AlphaSize
;
1194 case GL_COLOR_TABLE_LUMINANCE_SIZE
:
1195 *params
= table
->LuminanceSize
;
1197 case GL_COLOR_TABLE_INTENSITY_SIZE
:
1198 *params
= table
->IntensitySize
;
1201 _mesa_error(ctx
, GL_INVALID_ENUM
, "glGetColorTableParameteriv(pname)" );