work on GL_SGI_color_table
[mesa.git] / src / mesa / main / pixel.c
1 /* $Id: pixel.c,v 1.8 2000/04/17 15:13:53 brianp Exp $ */
2
3 /*
4 * Mesa 3-D graphics library
5 * Version: 3.3
6 *
7 * Copyright (C) 1999-2000 Brian Paul All Rights Reserved.
8 *
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:
15 *
16 * The above copyright notice and this permission notice shall be included
17 * in all copies or substantial portions of the Software.
18 *
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.
25 */
26
27
28 #ifdef PC_HEADER
29 #include "all.h"
30 #else
31 #include "glheader.h"
32 #include "context.h"
33 #include "macros.h"
34 #include "mem.h"
35 #include "pixel.h"
36 #include "types.h"
37 #endif
38
39
40
41 /**********************************************************************/
42 /***** glPixelZoom *****/
43 /**********************************************************************/
44
45
46
47 void
48 _mesa_PixelZoom( GLfloat xfactor, GLfloat yfactor )
49 {
50 GET_CURRENT_CONTEXT(ctx);
51 ASSERT_OUTSIDE_BEGIN_END_AND_FLUSH(ctx, "glPixelZoom");
52
53 ctx->Pixel.ZoomX = xfactor;
54 ctx->Pixel.ZoomY = yfactor;
55 }
56
57
58
59 /**********************************************************************/
60 /***** glPixelStore *****/
61 /**********************************************************************/
62
63
64 void
65 _mesa_PixelStorei( GLenum pname, GLint param )
66 {
67 /* NOTE: this call can't be compiled into the display list */
68 GET_CURRENT_CONTEXT(ctx);
69 ASSERT_OUTSIDE_BEGIN_END_AND_FLUSH(ctx, "glPixelStore");
70
71 switch (pname) {
72 case GL_PACK_SWAP_BYTES:
73 ctx->Pack.SwapBytes = param ? GL_TRUE : GL_FALSE;
74 break;
75 case GL_PACK_LSB_FIRST:
76 ctx->Pack.LsbFirst = param ? GL_TRUE : GL_FALSE;
77 break;
78 case GL_PACK_ROW_LENGTH:
79 if (param<0) {
80 gl_error( ctx, GL_INVALID_VALUE, "glPixelStore(param)" );
81 }
82 else {
83 ctx->Pack.RowLength = param;
84 }
85 break;
86 case GL_PACK_IMAGE_HEIGHT:
87 if (param<0)
88 gl_error( ctx, GL_INVALID_VALUE, "glPixelStore(param)" );
89 else
90 ctx->Pack.ImageHeight = param;
91 break;
92 case GL_PACK_SKIP_PIXELS:
93 if (param<0) {
94 gl_error( ctx, GL_INVALID_VALUE, "glPixelStore(param)" );
95 }
96 else {
97 ctx->Pack.SkipPixels = param;
98 }
99 break;
100 case GL_PACK_SKIP_ROWS:
101 if (param<0) {
102 gl_error( ctx, GL_INVALID_VALUE, "glPixelStore(param)" );
103 }
104 else {
105 ctx->Pack.SkipRows = param;
106 }
107 break;
108 case GL_PACK_ALIGNMENT:
109 if (param==1 || param==2 || param==4 || param==8) {
110 ctx->Pack.Alignment = param;
111 }
112 else {
113 gl_error( ctx, GL_INVALID_VALUE, "glPixelStore(param)" );
114 }
115 break;
116 case GL_UNPACK_SWAP_BYTES:
117 ctx->Unpack.SwapBytes = param ? GL_TRUE : GL_FALSE;
118 break;
119 case GL_UNPACK_LSB_FIRST:
120 ctx->Unpack.LsbFirst = param ? GL_TRUE : GL_FALSE;
121 break;
122 case GL_UNPACK_ROW_LENGTH:
123 if (param<0) {
124 gl_error( ctx, GL_INVALID_VALUE, "glPixelStore(param)" );
125 }
126 else {
127 ctx->Unpack.RowLength = param;
128 }
129 break;
130 case GL_UNPACK_IMAGE_HEIGHT:
131 if (param<0)
132 gl_error( ctx, GL_INVALID_VALUE, "glPixelStore(param)" );
133 else
134 ctx->Unpack.ImageHeight = param;
135 break;
136 case GL_UNPACK_SKIP_PIXELS:
137 if (param<0) {
138 gl_error( ctx, GL_INVALID_VALUE, "glPixelStore(param)" );
139 }
140 else {
141 ctx->Unpack.SkipPixels = param;
142 }
143 break;
144 case GL_UNPACK_SKIP_ROWS:
145 if (param<0) {
146 gl_error( ctx, GL_INVALID_VALUE, "glPixelStore(param)" );
147 }
148 else {
149 ctx->Unpack.SkipRows = param;
150 }
151 break;
152 case GL_UNPACK_ALIGNMENT:
153 if (param==1 || param==2 || param==4 || param==8) {
154 ctx->Unpack.Alignment = param;
155 }
156 else {
157 gl_error( ctx, GL_INVALID_VALUE, "glPixelStore" );
158 }
159 break;
160 default:
161 gl_error( ctx, GL_INVALID_ENUM, "glPixelStore" );
162 }
163 }
164
165
166 void
167 _mesa_PixelStoref( GLenum pname, GLfloat param )
168 {
169 _mesa_PixelStorei( pname, (GLint) param );
170 }
171
172
173
174 /**********************************************************************/
175 /***** glPixelMap *****/
176 /**********************************************************************/
177
178
179
180 void
181 _mesa_PixelMapfv( GLenum map, GLint mapsize, const GLfloat *values )
182 {
183 GLint i;
184 GET_CURRENT_CONTEXT(ctx);
185 ASSERT_OUTSIDE_BEGIN_END_AND_FLUSH(ctx, "glPixelMapfv");
186
187
188 if (mapsize<0 || mapsize>MAX_PIXEL_MAP_TABLE) {
189 gl_error( ctx, GL_INVALID_VALUE, "glPixelMapfv(mapsize)" );
190 return;
191 }
192
193 if (map>=GL_PIXEL_MAP_S_TO_S && map<=GL_PIXEL_MAP_I_TO_A) {
194 /* test that mapsize is a power of two */
195 GLuint p;
196 GLboolean ok = GL_FALSE;
197 for (p=1; p<=MAX_PIXEL_MAP_TABLE; p=p<<1) {
198 if ( (p&mapsize) == p ) {
199 ok = GL_TRUE;
200 break;
201 }
202 }
203 if (!ok) {
204 gl_error( ctx, GL_INVALID_VALUE, "glPixelMapfv(mapsize)" );
205 return;
206 }
207 }
208
209 switch (map) {
210 case GL_PIXEL_MAP_S_TO_S:
211 ctx->Pixel.MapStoSsize = mapsize;
212 for (i=0;i<mapsize;i++) {
213 ctx->Pixel.MapStoS[i] = (GLint) values[i];
214 }
215 break;
216 case GL_PIXEL_MAP_I_TO_I:
217 ctx->Pixel.MapItoIsize = mapsize;
218 for (i=0;i<mapsize;i++) {
219 ctx->Pixel.MapItoI[i] = (GLint) values[i];
220 }
221 break;
222 case GL_PIXEL_MAP_I_TO_R:
223 ctx->Pixel.MapItoRsize = mapsize;
224 for (i=0;i<mapsize;i++) {
225 GLfloat val = CLAMP( values[i], 0.0, 1.0 );
226 ctx->Pixel.MapItoR[i] = val;
227 ctx->Pixel.MapItoR8[i] = (GLint) (val * 255.0F);
228 }
229 break;
230 case GL_PIXEL_MAP_I_TO_G:
231 ctx->Pixel.MapItoGsize = mapsize;
232 for (i=0;i<mapsize;i++) {
233 GLfloat val = CLAMP( values[i], 0.0, 1.0 );
234 ctx->Pixel.MapItoG[i] = val;
235 ctx->Pixel.MapItoG8[i] = (GLint) (val * 255.0F);
236 }
237 break;
238 case GL_PIXEL_MAP_I_TO_B:
239 ctx->Pixel.MapItoBsize = mapsize;
240 for (i=0;i<mapsize;i++) {
241 GLfloat val = CLAMP( values[i], 0.0, 1.0 );
242 ctx->Pixel.MapItoB[i] = val;
243 ctx->Pixel.MapItoB8[i] = (GLint) (val * 255.0F);
244 }
245 break;
246 case GL_PIXEL_MAP_I_TO_A:
247 ctx->Pixel.MapItoAsize = mapsize;
248 for (i=0;i<mapsize;i++) {
249 GLfloat val = CLAMP( values[i], 0.0, 1.0 );
250 ctx->Pixel.MapItoA[i] = val;
251 ctx->Pixel.MapItoA8[i] = (GLint) (val * 255.0F);
252 }
253 break;
254 case GL_PIXEL_MAP_R_TO_R:
255 ctx->Pixel.MapRtoRsize = mapsize;
256 for (i=0;i<mapsize;i++) {
257 ctx->Pixel.MapRtoR[i] = CLAMP( values[i], 0.0, 1.0 );
258 }
259 break;
260 case GL_PIXEL_MAP_G_TO_G:
261 ctx->Pixel.MapGtoGsize = mapsize;
262 for (i=0;i<mapsize;i++) {
263 ctx->Pixel.MapGtoG[i] = CLAMP( values[i], 0.0, 1.0 );
264 }
265 break;
266 case GL_PIXEL_MAP_B_TO_B:
267 ctx->Pixel.MapBtoBsize = mapsize;
268 for (i=0;i<mapsize;i++) {
269 ctx->Pixel.MapBtoB[i] = CLAMP( values[i], 0.0, 1.0 );
270 }
271 break;
272 case GL_PIXEL_MAP_A_TO_A:
273 ctx->Pixel.MapAtoAsize = mapsize;
274 for (i=0;i<mapsize;i++) {
275 ctx->Pixel.MapAtoA[i] = CLAMP( values[i], 0.0, 1.0 );
276 }
277 break;
278 default:
279 gl_error( ctx, GL_INVALID_ENUM, "glPixelMapfv(map)" );
280 }
281 }
282
283
284
285 void
286 _mesa_PixelMapuiv(GLenum map, GLint mapsize, const GLuint *values )
287 {
288 GLfloat fvalues[MAX_PIXEL_MAP_TABLE];
289 GLint i;
290 if (map==GL_PIXEL_MAP_I_TO_I || map==GL_PIXEL_MAP_S_TO_S) {
291 for (i=0;i<mapsize;i++) {
292 fvalues[i] = (GLfloat) values[i];
293 }
294 }
295 else {
296 for (i=0;i<mapsize;i++) {
297 fvalues[i] = UINT_TO_FLOAT( values[i] );
298 }
299 }
300 _mesa_PixelMapfv(map, mapsize, fvalues);
301 }
302
303
304
305 void
306 _mesa_PixelMapusv(GLenum map, GLint mapsize, const GLushort *values )
307 {
308 GLfloat fvalues[MAX_PIXEL_MAP_TABLE];
309 GLint i;
310 if (map==GL_PIXEL_MAP_I_TO_I || map==GL_PIXEL_MAP_S_TO_S) {
311 for (i=0;i<mapsize;i++) {
312 fvalues[i] = (GLfloat) values[i];
313 }
314 }
315 else {
316 for (i=0;i<mapsize;i++) {
317 fvalues[i] = USHORT_TO_FLOAT( values[i] );
318 }
319 }
320 _mesa_PixelMapfv(map, mapsize, fvalues);
321 }
322
323
324
325 void
326 _mesa_GetPixelMapfv( GLenum map, GLfloat *values )
327 {
328 GET_CURRENT_CONTEXT(ctx);
329 GLint i;
330
331 ASSERT_OUTSIDE_BEGIN_END(ctx, "glGetPixelMapfv");
332
333 switch (map) {
334 case GL_PIXEL_MAP_I_TO_I:
335 for (i=0;i<ctx->Pixel.MapItoIsize;i++) {
336 values[i] = (GLfloat) ctx->Pixel.MapItoI[i];
337 }
338 break;
339 case GL_PIXEL_MAP_S_TO_S:
340 for (i=0;i<ctx->Pixel.MapStoSsize;i++) {
341 values[i] = (GLfloat) ctx->Pixel.MapStoS[i];
342 }
343 break;
344 case GL_PIXEL_MAP_I_TO_R:
345 MEMCPY(values,ctx->Pixel.MapItoR,ctx->Pixel.MapItoRsize*sizeof(GLfloat));
346 break;
347 case GL_PIXEL_MAP_I_TO_G:
348 MEMCPY(values,ctx->Pixel.MapItoG,ctx->Pixel.MapItoGsize*sizeof(GLfloat));
349 break;
350 case GL_PIXEL_MAP_I_TO_B:
351 MEMCPY(values,ctx->Pixel.MapItoB,ctx->Pixel.MapItoBsize*sizeof(GLfloat));
352 break;
353 case GL_PIXEL_MAP_I_TO_A:
354 MEMCPY(values,ctx->Pixel.MapItoA,ctx->Pixel.MapItoAsize*sizeof(GLfloat));
355 break;
356 case GL_PIXEL_MAP_R_TO_R:
357 MEMCPY(values,ctx->Pixel.MapRtoR,ctx->Pixel.MapRtoRsize*sizeof(GLfloat));
358 break;
359 case GL_PIXEL_MAP_G_TO_G:
360 MEMCPY(values,ctx->Pixel.MapGtoG,ctx->Pixel.MapGtoGsize*sizeof(GLfloat));
361 break;
362 case GL_PIXEL_MAP_B_TO_B:
363 MEMCPY(values,ctx->Pixel.MapBtoB,ctx->Pixel.MapBtoBsize*sizeof(GLfloat));
364 break;
365 case GL_PIXEL_MAP_A_TO_A:
366 MEMCPY(values,ctx->Pixel.MapAtoA,ctx->Pixel.MapAtoAsize*sizeof(GLfloat));
367 break;
368 default:
369 gl_error( ctx, GL_INVALID_ENUM, "glGetPixelMapfv" );
370 }
371 }
372
373
374 void
375 _mesa_GetPixelMapuiv( GLenum map, GLuint *values )
376 {
377 GET_CURRENT_CONTEXT(ctx);
378 GLint i;
379
380 ASSERT_OUTSIDE_BEGIN_END(ctx, "glGetPixelMapfv");
381
382 switch (map) {
383 case GL_PIXEL_MAP_I_TO_I:
384 MEMCPY(values, ctx->Pixel.MapItoI, ctx->Pixel.MapItoIsize*sizeof(GLint));
385 break;
386 case GL_PIXEL_MAP_S_TO_S:
387 MEMCPY(values, ctx->Pixel.MapStoS, ctx->Pixel.MapStoSsize*sizeof(GLint));
388 break;
389 case GL_PIXEL_MAP_I_TO_R:
390 for (i=0;i<ctx->Pixel.MapItoRsize;i++) {
391 values[i] = FLOAT_TO_UINT( ctx->Pixel.MapItoR[i] );
392 }
393 break;
394 case GL_PIXEL_MAP_I_TO_G:
395 for (i=0;i<ctx->Pixel.MapItoGsize;i++) {
396 values[i] = FLOAT_TO_UINT( ctx->Pixel.MapItoG[i] );
397 }
398 break;
399 case GL_PIXEL_MAP_I_TO_B:
400 for (i=0;i<ctx->Pixel.MapItoBsize;i++) {
401 values[i] = FLOAT_TO_UINT( ctx->Pixel.MapItoB[i] );
402 }
403 break;
404 case GL_PIXEL_MAP_I_TO_A:
405 for (i=0;i<ctx->Pixel.MapItoAsize;i++) {
406 values[i] = FLOAT_TO_UINT( ctx->Pixel.MapItoA[i] );
407 }
408 break;
409 case GL_PIXEL_MAP_R_TO_R:
410 for (i=0;i<ctx->Pixel.MapRtoRsize;i++) {
411 values[i] = FLOAT_TO_UINT( ctx->Pixel.MapRtoR[i] );
412 }
413 break;
414 case GL_PIXEL_MAP_G_TO_G:
415 for (i=0;i<ctx->Pixel.MapGtoGsize;i++) {
416 values[i] = FLOAT_TO_UINT( ctx->Pixel.MapGtoG[i] );
417 }
418 break;
419 case GL_PIXEL_MAP_B_TO_B:
420 for (i=0;i<ctx->Pixel.MapBtoBsize;i++) {
421 values[i] = FLOAT_TO_UINT( ctx->Pixel.MapBtoB[i] );
422 }
423 break;
424 case GL_PIXEL_MAP_A_TO_A:
425 for (i=0;i<ctx->Pixel.MapAtoAsize;i++) {
426 values[i] = FLOAT_TO_UINT( ctx->Pixel.MapAtoA[i] );
427 }
428 break;
429 default:
430 gl_error( ctx, GL_INVALID_ENUM, "glGetPixelMapfv" );
431 }
432 }
433
434
435 void
436 _mesa_GetPixelMapusv( GLenum map, GLushort *values )
437 {
438 GET_CURRENT_CONTEXT(ctx);
439 GLint i;
440
441 ASSERT_OUTSIDE_BEGIN_END(ctx, "glGetPixelMapfv");
442
443 switch (map) {
444 case GL_PIXEL_MAP_I_TO_I:
445 for (i=0;i<ctx->Pixel.MapItoIsize;i++) {
446 values[i] = (GLushort) ctx->Pixel.MapItoI[i];
447 }
448 break;
449 case GL_PIXEL_MAP_S_TO_S:
450 for (i=0;i<ctx->Pixel.MapStoSsize;i++) {
451 values[i] = (GLushort) ctx->Pixel.MapStoS[i];
452 }
453 break;
454 case GL_PIXEL_MAP_I_TO_R:
455 for (i=0;i<ctx->Pixel.MapItoRsize;i++) {
456 values[i] = FLOAT_TO_USHORT( ctx->Pixel.MapItoR[i] );
457 }
458 break;
459 case GL_PIXEL_MAP_I_TO_G:
460 for (i=0;i<ctx->Pixel.MapItoGsize;i++) {
461 values[i] = FLOAT_TO_USHORT( ctx->Pixel.MapItoG[i] );
462 }
463 break;
464 case GL_PIXEL_MAP_I_TO_B:
465 for (i=0;i<ctx->Pixel.MapItoBsize;i++) {
466 values[i] = FLOAT_TO_USHORT( ctx->Pixel.MapItoB[i] );
467 }
468 break;
469 case GL_PIXEL_MAP_I_TO_A:
470 for (i=0;i<ctx->Pixel.MapItoAsize;i++) {
471 values[i] = FLOAT_TO_USHORT( ctx->Pixel.MapItoA[i] );
472 }
473 break;
474 case GL_PIXEL_MAP_R_TO_R:
475 for (i=0;i<ctx->Pixel.MapRtoRsize;i++) {
476 values[i] = FLOAT_TO_USHORT( ctx->Pixel.MapRtoR[i] );
477 }
478 break;
479 case GL_PIXEL_MAP_G_TO_G:
480 for (i=0;i<ctx->Pixel.MapGtoGsize;i++) {
481 values[i] = FLOAT_TO_USHORT( ctx->Pixel.MapGtoG[i] );
482 }
483 break;
484 case GL_PIXEL_MAP_B_TO_B:
485 for (i=0;i<ctx->Pixel.MapBtoBsize;i++) {
486 values[i] = FLOAT_TO_USHORT( ctx->Pixel.MapBtoB[i] );
487 }
488 break;
489 case GL_PIXEL_MAP_A_TO_A:
490 for (i=0;i<ctx->Pixel.MapAtoAsize;i++) {
491 values[i] = FLOAT_TO_USHORT( ctx->Pixel.MapAtoA[i] );
492 }
493 break;
494 default:
495 gl_error( ctx, GL_INVALID_ENUM, "glGetPixelMapfv" );
496 }
497 }
498
499
500
501 /**********************************************************************/
502 /***** glPixelTransfer *****/
503 /**********************************************************************/
504
505
506 /*
507 * Implements glPixelTransfer[fi] whether called immediately or from a
508 * display list.
509 */
510 void
511 _mesa_PixelTransferf( GLenum pname, GLfloat param )
512 {
513 GET_CURRENT_CONTEXT(ctx);
514 ASSERT_OUTSIDE_BEGIN_END_AND_FLUSH(ctx, "glPixelTransfer");
515
516
517 switch (pname) {
518 case GL_MAP_COLOR:
519 ctx->Pixel.MapColorFlag = param ? GL_TRUE : GL_FALSE;
520 break;
521 case GL_MAP_STENCIL:
522 ctx->Pixel.MapStencilFlag = param ? GL_TRUE : GL_FALSE;
523 break;
524 case GL_INDEX_SHIFT:
525 ctx->Pixel.IndexShift = (GLint) param;
526 break;
527 case GL_INDEX_OFFSET:
528 ctx->Pixel.IndexOffset = (GLint) param;
529 break;
530 case GL_RED_SCALE:
531 ctx->Pixel.RedScale = param;
532 break;
533 case GL_RED_BIAS:
534 ctx->Pixel.RedBias = param;
535 break;
536 case GL_GREEN_SCALE:
537 ctx->Pixel.GreenScale = param;
538 break;
539 case GL_GREEN_BIAS:
540 ctx->Pixel.GreenBias = param;
541 break;
542 case GL_BLUE_SCALE:
543 ctx->Pixel.BlueScale = param;
544 break;
545 case GL_BLUE_BIAS:
546 ctx->Pixel.BlueBias = param;
547 break;
548 case GL_ALPHA_SCALE:
549 ctx->Pixel.AlphaScale = param;
550 break;
551 case GL_ALPHA_BIAS:
552 ctx->Pixel.AlphaBias = param;
553 break;
554 case GL_DEPTH_SCALE:
555 ctx->Pixel.DepthScale = param;
556 break;
557 case GL_DEPTH_BIAS:
558 ctx->Pixel.DepthBias = param;
559 break;
560 case GL_POST_COLOR_MATRIX_RED_SCALE:
561 ctx->Pixel.PostColorMatrixRedScale = param;
562 break;
563 case GL_POST_COLOR_MATRIX_RED_BIAS:
564 ctx->Pixel.PostColorMatrixRedBias = param;
565 break;
566 case GL_POST_COLOR_MATRIX_GREEN_SCALE:
567 ctx->Pixel.PostColorMatrixGreenScale = param;
568 break;
569 case GL_POST_COLOR_MATRIX_GREEN_BIAS:
570 ctx->Pixel.PostColorMatrixGreenBias = param;
571 break;
572 case GL_POST_COLOR_MATRIX_BLUE_SCALE:
573 ctx->Pixel.PostColorMatrixBlueScale = param;
574 break;
575 case GL_POST_COLOR_MATRIX_BLUE_BIAS:
576 ctx->Pixel.PostColorMatrixBlueBias = param;
577 break;
578 case GL_POST_COLOR_MATRIX_ALPHA_SCALE:
579 ctx->Pixel.PostColorMatrixAlphaScale = param;
580 break;
581 case GL_POST_COLOR_MATRIX_ALPHA_BIAS:
582 ctx->Pixel.PostColorMatrixAlphaBias = param;
583 break;
584 default:
585 gl_error( ctx, GL_INVALID_ENUM, "glPixelTransfer(pname)" );
586 return;
587 }
588
589 if (ctx->Pixel.RedScale!=1.0F || ctx->Pixel.RedBias!=0.0F ||
590 ctx->Pixel.GreenScale!=1.0F || ctx->Pixel.GreenBias!=0.0F ||
591 ctx->Pixel.BlueScale!=1.0F || ctx->Pixel.BlueBias!=0.0F ||
592 ctx->Pixel.AlphaScale!=1.0F || ctx->Pixel.AlphaBias!=0.0F) {
593 ctx->Pixel.ScaleOrBiasRGBA = GL_TRUE;
594 }
595 else {
596 ctx->Pixel.ScaleOrBiasRGBA = GL_FALSE;
597 }
598
599 if (ctx->Pixel.PostColorMatrixRedScale!=1.0F ||
600 ctx->Pixel.PostColorMatrixRedBias!=0.0F ||
601 ctx->Pixel.PostColorMatrixGreenScale!=1.0F ||
602 ctx->Pixel.PostColorMatrixGreenBias!=0.0F ||
603 ctx->Pixel.PostColorMatrixBlueScale!=1.0F ||
604 ctx->Pixel.PostColorMatrixBlueBias!=0.0F ||
605 ctx->Pixel.PostColorMatrixAlphaScale!=1.0F ||
606 ctx->Pixel.PostColorMatrixAlphaBias!=0.0F) {
607 ctx->Pixel.ScaleOrBiasRGBApcm = GL_TRUE;
608 }
609 else {
610 ctx->Pixel.ScaleOrBiasRGBApcm = GL_FALSE;
611 }
612 }
613
614
615 void
616 _mesa_PixelTransferi( GLenum pname, GLint param )
617 {
618 _mesa_PixelTransferf( pname, (GLfloat) param );
619 }
620
621
622
623 /**********************************************************************/
624 /***** Pixel processing functions ******/
625 /**********************************************************************/
626
627
628 /*
629 * Apply scale and bias factors to an array of RGBA pixels.
630 */
631 void
632 _mesa_scale_and_bias_rgba(const GLcontext *ctx, GLuint n, GLfloat rgba[][4])
633 {
634 if (ctx->Pixel.RedScale != 1.0 || ctx->Pixel.RedBias != 0.0) {
635 const GLfloat scale = ctx->Pixel.RedScale;
636 const GLfloat bias = ctx->Pixel.RedBias;
637 GLuint i;
638 for (i = 0; i < n; i++) {
639 rgba[i][RCOMP] = rgba[i][RCOMP] * scale + bias;
640 }
641 }
642 if (ctx->Pixel.GreenScale != 1.0 || ctx->Pixel.GreenBias != 0.0) {
643 const GLfloat scale = ctx->Pixel.GreenScale;
644 const GLfloat bias = ctx->Pixel.GreenBias;
645 GLuint i;
646 for (i = 0; i < n; i++) {
647 rgba[i][GCOMP] = rgba[i][GCOMP] * scale + bias;
648 }
649 }
650 if (ctx->Pixel.BlueScale != 1.0 || ctx->Pixel.BlueBias != 0.0) {
651 const GLfloat scale = ctx->Pixel.BlueScale;
652 const GLfloat bias = ctx->Pixel.BlueBias;
653 GLuint i;
654 for (i = 0; i < n; i++) {
655 rgba[i][BCOMP] = rgba[i][BCOMP] * scale + bias;
656 }
657 }
658 if (ctx->Pixel.AlphaScale != 1.0 || ctx->Pixel.AlphaBias != 0.0) {
659 const GLfloat scale = ctx->Pixel.AlphaScale;
660 const GLfloat bias = ctx->Pixel.AlphaBias;
661 GLuint i;
662 for (i = 0; i < n; i++) {
663 rgba[i][ACOMP] = rgba[i][ACOMP] * scale + bias;
664 }
665 }
666 }
667
668
669 /*
670 * Apply pixel mapping to an array of floating point RGBA pixels.
671 */
672 void
673 _mesa_map_rgba( const GLcontext *ctx, GLuint n, GLfloat rgba[][4] )
674 {
675 const GLfloat rscale = ctx->Pixel.MapRtoRsize - 1;
676 const GLfloat gscale = ctx->Pixel.MapGtoGsize - 1;
677 const GLfloat bscale = ctx->Pixel.MapBtoBsize - 1;
678 const GLfloat ascale = ctx->Pixel.MapAtoAsize - 1;
679 const GLfloat *rMap = ctx->Pixel.MapRtoR;
680 const GLfloat *gMap = ctx->Pixel.MapGtoG;
681 const GLfloat *bMap = ctx->Pixel.MapBtoB;
682 const GLfloat *aMap = ctx->Pixel.MapAtoA;
683 GLuint i;
684 for (i=0;i<n;i++) {
685 rgba[i][RCOMP] = rMap[(GLint) (rgba[i][RCOMP] * rscale + 0.5F)];
686 rgba[i][GCOMP] = gMap[(GLint) (rgba[i][GCOMP] * gscale + 0.5F)];
687 rgba[i][BCOMP] = bMap[(GLint) (rgba[i][BCOMP] * bscale + 0.5F)];
688 rgba[i][ACOMP] = aMap[(GLint) (rgba[i][ACOMP] * ascale + 0.5F)];
689 }
690 }
691
692
693 /*
694 * Apply the color matrix and post color matrix scaling and biasing.
695 */
696 void
697 _mesa_transform_rgba(const GLcontext *ctx, GLuint n, GLfloat rgba[][4])
698 {
699 const GLfloat rs = ctx->Pixel.PostColorMatrixRedScale;
700 const GLfloat rb = ctx->Pixel.PostColorMatrixRedBias;
701 const GLfloat gs = ctx->Pixel.PostColorMatrixGreenScale;
702 const GLfloat gb = ctx->Pixel.PostColorMatrixGreenBias;
703 const GLfloat bs = ctx->Pixel.PostColorMatrixBlueScale;
704 const GLfloat bb = ctx->Pixel.PostColorMatrixBlueBias;
705 const GLfloat as = ctx->Pixel.PostColorMatrixAlphaScale;
706 const GLfloat ab = ctx->Pixel.PostColorMatrixAlphaBias;
707 const GLfloat *m = ctx->ColorMatrix.m;
708 GLuint i;
709 for (i = 0; i < n; i++) {
710 const GLfloat r = rgba[i][RCOMP];
711 const GLfloat g = rgba[i][GCOMP];
712 const GLfloat b = rgba[i][BCOMP];
713 const GLfloat a = rgba[i][ACOMP];
714 rgba[i][RCOMP] = (m[0] * r + m[4] * g + m[ 8] * b + m[12] * a) * rs + rb;
715 rgba[i][GCOMP] = (m[1] * r + m[5] * g + m[ 9] * b + m[13] * a) * gs + gb;
716 rgba[i][BCOMP] = (m[2] * r + m[6] * g + m[10] * b + m[14] * a) * bs + bb;
717 rgba[i][ACOMP] = (m[3] * r + m[7] * g + m[11] * b + m[15] * a) * as + ab;
718 }
719 }
720
721
722 /*
723 * Apply a color table lookup to an array of colors.
724 */
725 void
726 _mesa_lookup_rgba(const struct gl_color_table *table,
727 GLuint n, GLfloat rgba[][4])
728 {
729 switch (table->Format) {
730 case GL_INTENSITY:
731 {
732 const GLfloat scale = (GLfloat) (table->Size - 1);
733 const GLfloat *lut = table->TableF;
734 GLuint i;
735 /* replace RGBA with I */
736 for (i = 0; i < n; i++) {
737 GLint j = (GLint) (rgba[i][RCOMP] * scale + 0.5F);
738 GLubyte c = lut[j];
739 rgba[i][RCOMP] = rgba[i][GCOMP] =
740 rgba[i][BCOMP] = rgba[i][ACOMP] = c;
741 }
742 }
743 break;
744 case GL_LUMINANCE:
745 {
746 const GLfloat scale = (GLfloat) (table->Size - 1);
747 const GLfloat *lut = table->TableF;
748 GLuint i;
749 /* replace RGB with L */
750 for (i = 0; i < n; i++) {
751 GLint j = (GLint) (rgba[i][RCOMP] * scale + 0.5F);
752 GLubyte c = lut[j];
753 rgba[i][RCOMP] = rgba[i][GCOMP] = rgba[i][BCOMP] = c;
754 }
755 }
756 break;
757 case GL_ALPHA:
758 {
759 const GLfloat scale = (GLfloat) (table->Size - 1);
760 const GLfloat *lut = table->TableF;
761 GLuint i;
762 /* replace A with A */
763 for (i = 0; i < n; i++) {
764 GLint j = (GLint) (rgba[i][ACOMP] * scale + 0.5F);
765 rgba[i][ACOMP] = lut[j];
766 }
767 }
768 break;
769 case GL_LUMINANCE_ALPHA:
770 {
771 const GLfloat scale = (GLfloat) (table->Size - 1);
772 const GLfloat *lut = table->TableF;
773 GLuint i;
774 /* replace RGBA with LLLA */
775 for (i = 0; i < n; i++) {
776 GLint jL = (GLint) (rgba[i][RCOMP] * scale + 0.5F);
777 GLint jA = (GLint) (rgba[i][ACOMP] * scale + 0.5F);
778 GLubyte luminance = lut[jL * 2 + 0];
779 GLubyte alpha = lut[jA * 2 + 1];
780 rgba[i][RCOMP] = rgba[i][GCOMP] = rgba[i][BCOMP] = luminance;
781 rgba[i][ACOMP] = alpha;;
782 }
783 }
784 break;
785 case GL_RGB:
786 {
787 const GLfloat scale = (GLfloat) (table->Size - 1);
788 const GLfloat *lut = table->TableF;
789 GLuint i;
790 /* replace RGB with RGB */
791 for (i = 0; i < n; i++) {
792 GLint jR = (GLint) (rgba[i][RCOMP] * scale + 0.5F);
793 GLint jG = (GLint) (rgba[i][GCOMP] * scale + 0.5F);
794 GLint jB = (GLint) (rgba[i][BCOMP] * scale + 0.5F);
795 rgba[i][RCOMP] = lut[jR * 3 + 0];
796 rgba[i][GCOMP] = lut[jG * 3 + 1];
797 rgba[i][BCOMP] = lut[jB * 3 + 2];
798 }
799 }
800 break;
801 case GL_RGBA:
802 {
803 const GLfloat scale = (GLfloat) (table->Size - 1);
804 const GLfloat *lut = table->TableF;
805 GLuint i;
806 /* replace RGBA with RGBA */
807 for (i = 0; i < n; i++) {
808 GLint jR = (GLint) (rgba[i][RCOMP] * scale + 0.5F);
809 GLint jG = (GLint) (rgba[i][GCOMP] * scale + 0.5F);
810 GLint jB = (GLint) (rgba[i][BCOMP] * scale + 0.5F);
811 GLint jA = (GLint) (rgba[i][ACOMP] * scale + 0.5F);
812 rgba[i][RCOMP] = lut[jR * 4 + 0];
813 rgba[i][GCOMP] = lut[jG * 4 + 1];
814 rgba[i][BCOMP] = lut[jB * 4 + 2];
815 rgba[i][ACOMP] = lut[jA * 4 + 3];
816 }
817 }
818 break;
819 default:
820 gl_problem(NULL, "Bad format in _mesa_lookup_rgba");
821 return;
822 }
823 }
824
825
826
827 /*
828 * Apply color index shift and offset to an array of pixels.
829 */
830 void
831 _mesa_shift_and_offset_ci( const GLcontext *ctx, GLuint n, GLuint indexes[] )
832 {
833 GLint shift = ctx->Pixel.IndexShift;
834 GLint offset = ctx->Pixel.IndexOffset;
835 GLuint i;
836 if (shift > 0) {
837 for (i=0;i<n;i++) {
838 indexes[i] = (indexes[i] << shift) + offset;
839 }
840 }
841 else if (shift < 0) {
842 shift = -shift;
843 for (i=0;i<n;i++) {
844 indexes[i] = (indexes[i] >> shift) + offset;
845 }
846 }
847 else {
848 for (i=0;i<n;i++) {
849 indexes[i] = indexes[i] + offset;
850 }
851 }
852 }
853
854
855 /*
856 * Apply color index mapping to color indexes.
857 */
858 void
859 _mesa_map_ci( const GLcontext *ctx, GLuint n, GLuint index[] )
860 {
861 GLuint mask = ctx->Pixel.MapItoIsize - 1;
862 GLuint i;
863 for (i=0;i<n;i++) {
864 index[i] = ctx->Pixel.MapItoI[ index[i] & mask ];
865 }
866 }
867
868
869 /*
870 * Map color indexes to rgba values.
871 */
872 void
873 _mesa_map_ci_to_rgba_ubyte( const GLcontext *ctx, GLuint n,
874 const GLuint index[], GLubyte rgba[][4] )
875 {
876 GLuint rmask = ctx->Pixel.MapItoRsize - 1;
877 GLuint gmask = ctx->Pixel.MapItoGsize - 1;
878 GLuint bmask = ctx->Pixel.MapItoBsize - 1;
879 GLuint amask = ctx->Pixel.MapItoAsize - 1;
880 const GLubyte *rMap = ctx->Pixel.MapItoR8;
881 const GLubyte *gMap = ctx->Pixel.MapItoG8;
882 const GLubyte *bMap = ctx->Pixel.MapItoB8;
883 const GLubyte *aMap = ctx->Pixel.MapItoA8;
884 GLuint i;
885 for (i=0;i<n;i++) {
886 rgba[i][RCOMP] = rMap[index[i] & rmask];
887 rgba[i][GCOMP] = gMap[index[i] & gmask];
888 rgba[i][BCOMP] = bMap[index[i] & bmask];
889 rgba[i][ACOMP] = aMap[index[i] & amask];
890 }
891 }
892
893
894 /*
895 * Map color indexes to float rgba values.
896 */
897 void
898 _mesa_map_ci_to_rgba( const GLcontext *ctx, GLuint n,
899 const GLuint index[], GLfloat rgba[][4] )
900 {
901 GLuint rmask = ctx->Pixel.MapItoRsize - 1;
902 GLuint gmask = ctx->Pixel.MapItoGsize - 1;
903 GLuint bmask = ctx->Pixel.MapItoBsize - 1;
904 GLuint amask = ctx->Pixel.MapItoAsize - 1;
905 const GLfloat *rMap = ctx->Pixel.MapItoR;
906 const GLfloat *gMap = ctx->Pixel.MapItoG;
907 const GLfloat *bMap = ctx->Pixel.MapItoB;
908 const GLfloat *aMap = ctx->Pixel.MapItoA;
909 GLuint i;
910 for (i=0;i<n;i++) {
911 rgba[i][RCOMP] = rMap[index[i] & rmask];
912 rgba[i][GCOMP] = gMap[index[i] & gmask];
913 rgba[i][BCOMP] = bMap[index[i] & bmask];
914 rgba[i][ACOMP] = aMap[index[i] & amask];
915 }
916 }
917
918
919 /*
920 * Map 8-bit color indexes to rgb values.
921 */
922 void
923 _mesa_map_ci8_to_rgba( const GLcontext *ctx, GLuint n, const GLubyte index[],
924 GLubyte rgba[][4] )
925 {
926 GLuint rmask = ctx->Pixel.MapItoRsize - 1;
927 GLuint gmask = ctx->Pixel.MapItoGsize - 1;
928 GLuint bmask = ctx->Pixel.MapItoBsize - 1;
929 GLuint amask = ctx->Pixel.MapItoAsize - 1;
930 const GLubyte *rMap = ctx->Pixel.MapItoR8;
931 const GLubyte *gMap = ctx->Pixel.MapItoG8;
932 const GLubyte *bMap = ctx->Pixel.MapItoB8;
933 const GLubyte *aMap = ctx->Pixel.MapItoA8;
934 GLuint i;
935 for (i=0;i<n;i++) {
936 rgba[i][RCOMP] = rMap[index[i] & rmask];
937 rgba[i][GCOMP] = gMap[index[i] & gmask];
938 rgba[i][BCOMP] = bMap[index[i] & bmask];
939 rgba[i][ACOMP] = aMap[index[i] & amask];
940 }
941 }
942
943
944 void
945 _mesa_shift_and_offset_stencil( const GLcontext *ctx, GLuint n,
946 GLstencil stencil[] )
947 {
948 GLuint i;
949 GLint shift = ctx->Pixel.IndexShift;
950 GLint offset = ctx->Pixel.IndexOffset;
951 if (shift > 0) {
952 for (i=0;i<n;i++) {
953 stencil[i] = (stencil[i] << shift) + offset;
954 }
955 }
956 else if (shift < 0) {
957 shift = -shift;
958 for (i=0;i<n;i++) {
959 stencil[i] = (stencil[i] >> shift) + offset;
960 }
961 }
962 else {
963 for (i=0;i<n;i++) {
964 stencil[i] = stencil[i] + offset;
965 }
966 }
967
968 }
969
970
971 void
972 _mesa_map_stencil( const GLcontext *ctx, GLuint n, GLstencil stencil[] )
973 {
974 GLuint mask = ctx->Pixel.MapStoSsize - 1;
975 GLuint i;
976 for (i=0;i<n;i++) {
977 stencil[i] = ctx->Pixel.MapStoS[ stencil[i] & mask ];
978 }
979 }