blob: 8c839b894c48eeab62eae29adb552b6733462a3a [file] [log] [blame]
Brian Paulfa4525e2000-08-21 14:22:24 +00001/* $Id: pixel.c,v 1.12 2000/08/21 14:22:24 brianp Exp $ */
jtgafb833d1999-08-19 00:55:39 +00002
3/*
4 * Mesa 3-D graphics library
Brian Paulfbd8f211999-11-11 01:22:25 +00005 * Version: 3.3
jtgafb833d1999-08-19 00:55:39 +00006 *
Brian Paul179870a2000-04-12 18:54:48 +00007 * Copyright (C) 1999-2000 Brian Paul All Rights Reserved.
jtgafb833d1999-08-19 00:55:39 +00008 *
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
jtgafb833d1999-08-19 00:55:39 +000028#ifdef PC_HEADER
29#include "all.h"
30#else
Brian Paulfbd8f211999-11-11 01:22:25 +000031#include "glheader.h"
jtgafb833d1999-08-19 00:55:39 +000032#include "context.h"
33#include "macros.h"
Brian Paulfbd8f211999-11-11 01:22:25 +000034#include "mem.h"
jtgafb833d1999-08-19 00:55:39 +000035#include "pixel.h"
36#include "types.h"
jtgafb833d1999-08-19 00:55:39 +000037#endif
38
39
40
41/**********************************************************************/
42/***** glPixelZoom *****/
43/**********************************************************************/
44
45
46
Brian Paulfbd8f211999-11-11 01:22:25 +000047void
48_mesa_PixelZoom( GLfloat xfactor, GLfloat yfactor )
jtgafb833d1999-08-19 00:55:39 +000049{
Brian Paulfbd8f211999-11-11 01:22:25 +000050 GET_CURRENT_CONTEXT(ctx);
jtgafb833d1999-08-19 00:55:39 +000051 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
Brian Paulfbd8f211999-11-11 01:22:25 +000064void
65_mesa_PixelStorei( GLenum pname, GLint param )
jtgafb833d1999-08-19 00:55:39 +000066{
67 /* NOTE: this call can't be compiled into the display list */
Brian Paulfbd8f211999-11-11 01:22:25 +000068 GET_CURRENT_CONTEXT(ctx);
jtgafb833d1999-08-19 00:55:39 +000069 ASSERT_OUTSIDE_BEGIN_END_AND_FLUSH(ctx, "glPixelStore");
70
jtgafb833d1999-08-19 00:55:39 +000071 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
Brian Paulfbd8f211999-11-11 01:22:25 +0000166void
167_mesa_PixelStoref( GLenum pname, GLfloat param )
168{
169 _mesa_PixelStorei( pname, (GLint) param );
170}
jtgafb833d1999-08-19 00:55:39 +0000171
172
173
174/**********************************************************************/
175/***** glPixelMap *****/
176/**********************************************************************/
177
178
179
Brian Paulfbd8f211999-11-11 01:22:25 +0000180void
181_mesa_PixelMapfv( GLenum map, GLint mapsize, const GLfloat *values )
jtgafb833d1999-08-19 00:55:39 +0000182{
183 GLint i;
Brian Paulfbd8f211999-11-11 01:22:25 +0000184 GET_CURRENT_CONTEXT(ctx);
jtgafb833d1999-08-19 00:55:39 +0000185 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
Brian Paulfbd8f211999-11-11 01:22:25 +0000285void
286_mesa_PixelMapuiv(GLenum map, GLint mapsize, const GLuint *values )
jtgafb833d1999-08-19 00:55:39 +0000287{
Brian Paulfbd8f211999-11-11 01:22:25 +0000288 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
305void
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
325void
326_mesa_GetPixelMapfv( GLenum map, GLfloat *values )
327{
328 GET_CURRENT_CONTEXT(ctx);
jtgafb833d1999-08-19 00:55:39 +0000329 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
Brian Paulfbd8f211999-11-11 01:22:25 +0000374void
375_mesa_GetPixelMapuiv( GLenum map, GLuint *values )
jtgafb833d1999-08-19 00:55:39 +0000376{
Brian Paulfbd8f211999-11-11 01:22:25 +0000377 GET_CURRENT_CONTEXT(ctx);
jtgafb833d1999-08-19 00:55:39 +0000378 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
Brian Paulfbd8f211999-11-11 01:22:25 +0000435void
436_mesa_GetPixelMapusv( GLenum map, GLushort *values )
jtgafb833d1999-08-19 00:55:39 +0000437{
Brian Paulfbd8f211999-11-11 01:22:25 +0000438 GET_CURRENT_CONTEXT(ctx);
jtgafb833d1999-08-19 00:55:39 +0000439 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 */
Brian Paulfbd8f211999-11-11 01:22:25 +0000510void
511_mesa_PixelTransferf( GLenum pname, GLfloat param )
jtgafb833d1999-08-19 00:55:39 +0000512{
Brian Paulfbd8f211999-11-11 01:22:25 +0000513 GET_CURRENT_CONTEXT(ctx);
jtgafb833d1999-08-19 00:55:39 +0000514 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;
Brian Paul250069d2000-04-08 18:57:45 +0000560 case GL_POST_COLOR_MATRIX_RED_SCALE:
Brian Paul82b02f02000-05-07 20:37:40 +0000561 ctx->Pixel.PostColorMatrixScale[0] = param;
Brian Paul250069d2000-04-08 18:57:45 +0000562 break;
563 case GL_POST_COLOR_MATRIX_RED_BIAS:
Brian Paul82b02f02000-05-07 20:37:40 +0000564 ctx->Pixel.PostColorMatrixBias[0] = param;
Brian Paul250069d2000-04-08 18:57:45 +0000565 break;
566 case GL_POST_COLOR_MATRIX_GREEN_SCALE:
Brian Paul82b02f02000-05-07 20:37:40 +0000567 ctx->Pixel.PostColorMatrixScale[1] = param;
Brian Paul250069d2000-04-08 18:57:45 +0000568 break;
569 case GL_POST_COLOR_MATRIX_GREEN_BIAS:
Brian Paul82b02f02000-05-07 20:37:40 +0000570 ctx->Pixel.PostColorMatrixBias[1] = param;
Brian Paul250069d2000-04-08 18:57:45 +0000571 break;
572 case GL_POST_COLOR_MATRIX_BLUE_SCALE:
Brian Paul82b02f02000-05-07 20:37:40 +0000573 ctx->Pixel.PostColorMatrixScale[2] = param;
Brian Paul250069d2000-04-08 18:57:45 +0000574 break;
575 case GL_POST_COLOR_MATRIX_BLUE_BIAS:
Brian Paul82b02f02000-05-07 20:37:40 +0000576 ctx->Pixel.PostColorMatrixBias[2] = param;
Brian Paul250069d2000-04-08 18:57:45 +0000577 break;
578 case GL_POST_COLOR_MATRIX_ALPHA_SCALE:
Brian Paul82b02f02000-05-07 20:37:40 +0000579 ctx->Pixel.PostColorMatrixScale[3] = param;
Brian Paul250069d2000-04-08 18:57:45 +0000580 break;
581 case GL_POST_COLOR_MATRIX_ALPHA_BIAS:
Brian Paul82b02f02000-05-07 20:37:40 +0000582 ctx->Pixel.PostColorMatrixBias[3] = param;
583 break;
584 case GL_POST_CONVOLUTION_RED_SCALE:
585 ctx->Pixel.PostConvolutionScale[0] = param;
586 break;
587 case GL_POST_CONVOLUTION_RED_BIAS:
588 ctx->Pixel.PostConvolutionBias[0] = param;
589 break;
590 case GL_POST_CONVOLUTION_GREEN_SCALE:
591 ctx->Pixel.PostConvolutionScale[1] = param;
592 break;
593 case GL_POST_CONVOLUTION_GREEN_BIAS:
594 ctx->Pixel.PostConvolutionBias[1] = param;
595 break;
596 case GL_POST_CONVOLUTION_BLUE_SCALE:
597 ctx->Pixel.PostConvolutionScale[2] = param;
598 break;
599 case GL_POST_CONVOLUTION_BLUE_BIAS:
600 ctx->Pixel.PostConvolutionBias[2] = param;
601 break;
602 case GL_POST_CONVOLUTION_ALPHA_SCALE:
603 ctx->Pixel.PostConvolutionScale[2] = param;
604 break;
605 case GL_POST_CONVOLUTION_ALPHA_BIAS:
606 ctx->Pixel.PostConvolutionBias[2] = param;
Brian Paul250069d2000-04-08 18:57:45 +0000607 break;
jtgafb833d1999-08-19 00:55:39 +0000608 default:
609 gl_error( ctx, GL_INVALID_ENUM, "glPixelTransfer(pname)" );
610 return;
611 }
612
Brian Paulfa4525e2000-08-21 14:22:24 +0000613 /* signal to recompute the bitmask */
614 ctx->ImageTransferState = UPDATE_IMAGE_TRANSFER_STATE;
jtgafb833d1999-08-19 00:55:39 +0000615}
616
617
Brian Paulfbd8f211999-11-11 01:22:25 +0000618void
619_mesa_PixelTransferi( GLenum pname, GLint param )
620{
621 _mesa_PixelTransferf( pname, (GLfloat) param );
622}
623
624
jtgafb833d1999-08-19 00:55:39 +0000625
Brian Paul179870a2000-04-12 18:54:48 +0000626/**********************************************************************/
627/***** Pixel processing functions ******/
628/**********************************************************************/
jtgafb833d1999-08-19 00:55:39 +0000629
630
631/*
Brian Paul3c14ec91999-10-30 08:20:57 +0000632 * Apply scale and bias factors to an array of RGBA pixels.
633 */
Brian Paul250069d2000-04-08 18:57:45 +0000634void
Brian Paul179870a2000-04-12 18:54:48 +0000635_mesa_scale_and_bias_rgba(const GLcontext *ctx, GLuint n, GLfloat rgba[][4])
Brian Paul3c14ec91999-10-30 08:20:57 +0000636{
637 if (ctx->Pixel.RedScale != 1.0 || ctx->Pixel.RedBias != 0.0) {
638 const GLfloat scale = ctx->Pixel.RedScale;
639 const GLfloat bias = ctx->Pixel.RedBias;
640 GLuint i;
641 for (i = 0; i < n; i++) {
642 rgba[i][RCOMP] = rgba[i][RCOMP] * scale + bias;
643 }
644 }
645 if (ctx->Pixel.GreenScale != 1.0 || ctx->Pixel.GreenBias != 0.0) {
646 const GLfloat scale = ctx->Pixel.GreenScale;
647 const GLfloat bias = ctx->Pixel.GreenBias;
648 GLuint i;
649 for (i = 0; i < n; i++) {
650 rgba[i][GCOMP] = rgba[i][GCOMP] * scale + bias;
651 }
652 }
653 if (ctx->Pixel.BlueScale != 1.0 || ctx->Pixel.BlueBias != 0.0) {
654 const GLfloat scale = ctx->Pixel.BlueScale;
655 const GLfloat bias = ctx->Pixel.BlueBias;
656 GLuint i;
657 for (i = 0; i < n; i++) {
658 rgba[i][BCOMP] = rgba[i][BCOMP] * scale + bias;
659 }
660 }
661 if (ctx->Pixel.AlphaScale != 1.0 || ctx->Pixel.AlphaBias != 0.0) {
662 const GLfloat scale = ctx->Pixel.AlphaScale;
663 const GLfloat bias = ctx->Pixel.AlphaBias;
664 GLuint i;
665 for (i = 0; i < n; i++) {
666 rgba[i][ACOMP] = rgba[i][ACOMP] * scale + bias;
667 }
668 }
669}
670
671
672/*
Brian Paul3c14ec91999-10-30 08:20:57 +0000673 * Apply pixel mapping to an array of floating point RGBA pixels.
674 */
Brian Paul250069d2000-04-08 18:57:45 +0000675void
Brian Paul179870a2000-04-12 18:54:48 +0000676_mesa_map_rgba( const GLcontext *ctx, GLuint n, GLfloat rgba[][4] )
Brian Paul3c14ec91999-10-30 08:20:57 +0000677{
678 const GLfloat rscale = ctx->Pixel.MapRtoRsize - 1;
679 const GLfloat gscale = ctx->Pixel.MapGtoGsize - 1;
680 const GLfloat bscale = ctx->Pixel.MapBtoBsize - 1;
681 const GLfloat ascale = ctx->Pixel.MapAtoAsize - 1;
682 const GLfloat *rMap = ctx->Pixel.MapRtoR;
683 const GLfloat *gMap = ctx->Pixel.MapGtoG;
684 const GLfloat *bMap = ctx->Pixel.MapBtoB;
685 const GLfloat *aMap = ctx->Pixel.MapAtoA;
686 GLuint i;
687 for (i=0;i<n;i++) {
688 rgba[i][RCOMP] = rMap[(GLint) (rgba[i][RCOMP] * rscale + 0.5F)];
689 rgba[i][GCOMP] = gMap[(GLint) (rgba[i][GCOMP] * gscale + 0.5F)];
690 rgba[i][BCOMP] = bMap[(GLint) (rgba[i][BCOMP] * bscale + 0.5F)];
691 rgba[i][ACOMP] = aMap[(GLint) (rgba[i][ACOMP] * ascale + 0.5F)];
692 }
693}
694
695
696/*
Brian Paul250069d2000-04-08 18:57:45 +0000697 * Apply the color matrix and post color matrix scaling and biasing.
698 */
699void
700_mesa_transform_rgba(const GLcontext *ctx, GLuint n, GLfloat rgba[][4])
701{
Brian Paul82b02f02000-05-07 20:37:40 +0000702 const GLfloat rs = ctx->Pixel.PostColorMatrixScale[0];
703 const GLfloat rb = ctx->Pixel.PostColorMatrixBias[0];
704 const GLfloat gs = ctx->Pixel.PostColorMatrixScale[1];
705 const GLfloat gb = ctx->Pixel.PostColorMatrixBias[1];
706 const GLfloat bs = ctx->Pixel.PostColorMatrixScale[2];
707 const GLfloat bb = ctx->Pixel.PostColorMatrixBias[2];
708 const GLfloat as = ctx->Pixel.PostColorMatrixScale[3];
709 const GLfloat ab = ctx->Pixel.PostColorMatrixBias[3];
Brian Paul250069d2000-04-08 18:57:45 +0000710 const GLfloat *m = ctx->ColorMatrix.m;
711 GLuint i;
712 for (i = 0; i < n; i++) {
713 const GLfloat r = rgba[i][RCOMP];
714 const GLfloat g = rgba[i][GCOMP];
715 const GLfloat b = rgba[i][BCOMP];
716 const GLfloat a = rgba[i][ACOMP];
717 rgba[i][RCOMP] = (m[0] * r + m[4] * g + m[ 8] * b + m[12] * a) * rs + rb;
718 rgba[i][GCOMP] = (m[1] * r + m[5] * g + m[ 9] * b + m[13] * a) * gs + gb;
719 rgba[i][BCOMP] = (m[2] * r + m[6] * g + m[10] * b + m[14] * a) * bs + bb;
720 rgba[i][ACOMP] = (m[3] * r + m[7] * g + m[11] * b + m[15] * a) * as + ab;
721 }
722}
723
724
Brian Paul250069d2000-04-08 18:57:45 +0000725/*
Brian Paul179870a2000-04-12 18:54:48 +0000726 * Apply a color table lookup to an array of colors.
jtgafb833d1999-08-19 00:55:39 +0000727 */
Brian Paul179870a2000-04-12 18:54:48 +0000728void
729_mesa_lookup_rgba(const struct gl_color_table *table,
730 GLuint n, GLfloat rgba[][4])
jtgafb833d1999-08-19 00:55:39 +0000731{
Brian Paul4bdcfe52000-04-17 17:57:04 +0000732 ASSERT(table->TableType == GL_FLOAT);
733 if (!table->Table)
734 return;
735
Brian Paul179870a2000-04-12 18:54:48 +0000736 switch (table->Format) {
737 case GL_INTENSITY:
Brian Paul4bdcfe52000-04-17 17:57:04 +0000738 /* replace RGBA with I */
739 if (table->TableType == GL_UNSIGNED_BYTE) {
Brian Paul179870a2000-04-12 18:54:48 +0000740 const GLfloat scale = (GLfloat) (table->Size - 1);
Brian Paul4bdcfe52000-04-17 17:57:04 +0000741 const GLubyte *lut = (const GLubyte *) table->Table;
Brian Paul179870a2000-04-12 18:54:48 +0000742 GLuint i;
Brian Paul179870a2000-04-12 18:54:48 +0000743 for (i = 0; i < n; i++) {
744 GLint j = (GLint) (rgba[i][RCOMP] * scale + 0.5F);
Brian Paul4bdcfe52000-04-17 17:57:04 +0000745 GLfloat c = lut[j] * (1.0F / 255.0F);
746 rgba[i][RCOMP] = rgba[i][GCOMP] =
747 rgba[i][BCOMP] = rgba[i][ACOMP] = c;
748 }
749
750 }
751 else {
752 const GLfloat scale = (GLfloat) (table->Size - 1);
753 const GLfloat *lut = (const GLfloat *) table->Table;
754 GLuint i;
755 for (i = 0; i < n; i++) {
756 GLint j = (GLint) (rgba[i][RCOMP] * scale + 0.5F);
757 GLfloat c = lut[j];
Brian Paul179870a2000-04-12 18:54:48 +0000758 rgba[i][RCOMP] = rgba[i][GCOMP] =
759 rgba[i][BCOMP] = rgba[i][ACOMP] = c;
760 }
761 }
762 break;
763 case GL_LUMINANCE:
Brian Paul4bdcfe52000-04-17 17:57:04 +0000764 /* replace RGB with L */
765 if (table->TableType == GL_UNSIGNED_BYTE) {
Brian Paul179870a2000-04-12 18:54:48 +0000766 const GLfloat scale = (GLfloat) (table->Size - 1);
Brian Paul4bdcfe52000-04-17 17:57:04 +0000767 const GLubyte *lut = (const GLubyte *) table->Table;
Brian Paul179870a2000-04-12 18:54:48 +0000768 GLuint i;
Brian Paul179870a2000-04-12 18:54:48 +0000769 for (i = 0; i < n; i++) {
770 GLint j = (GLint) (rgba[i][RCOMP] * scale + 0.5F);
Brian Paul4bdcfe52000-04-17 17:57:04 +0000771 GLfloat c = lut[j] * (1.0F / 255.0F);
772 rgba[i][RCOMP] = rgba[i][GCOMP] = rgba[i][BCOMP] = c;
773 }
774 }
775 else {
776 const GLfloat scale = (GLfloat) (table->Size - 1);
777 const GLfloat *lut = (const GLfloat *) table->Table;
778 GLuint i;
779 for (i = 0; i < n; i++) {
780 GLint j = (GLint) (rgba[i][RCOMP] * scale + 0.5F);
781 GLfloat c = lut[j];
Brian Paul179870a2000-04-12 18:54:48 +0000782 rgba[i][RCOMP] = rgba[i][GCOMP] = rgba[i][BCOMP] = c;
783 }
784 }
785 break;
786 case GL_ALPHA:
Brian Paul4bdcfe52000-04-17 17:57:04 +0000787 /* replace A with A */
788 if (table->TableType == GL_UNSIGNED_BYTE) {
Brian Paul179870a2000-04-12 18:54:48 +0000789 const GLfloat scale = (GLfloat) (table->Size - 1);
Brian Paul4bdcfe52000-04-17 17:57:04 +0000790 const GLubyte *lut = (const GLubyte *) table->Table;
Brian Paul179870a2000-04-12 18:54:48 +0000791 GLuint i;
Brian Paul4bdcfe52000-04-17 17:57:04 +0000792 for (i = 0; i < n; i++) {
793 GLint j = (GLint) (rgba[i][ACOMP] * scale + 0.5F);
794 rgba[i][ACOMP] = lut[j] * (1.0F / 255.0F);
795 }
796 }
797 else {
798 const GLfloat scale = (GLfloat) (table->Size - 1);
799 const GLfloat *lut = (const GLfloat *) table->Table;
800 GLuint i;
Brian Paul179870a2000-04-12 18:54:48 +0000801 for (i = 0; i < n; i++) {
802 GLint j = (GLint) (rgba[i][ACOMP] * scale + 0.5F);
803 rgba[i][ACOMP] = lut[j];
804 }
805 }
806 break;
807 case GL_LUMINANCE_ALPHA:
Brian Paul4bdcfe52000-04-17 17:57:04 +0000808 /* replace RGBA with LLLA */
809 if (table->TableType == GL_UNSIGNED_BYTE) {
Brian Paul179870a2000-04-12 18:54:48 +0000810 const GLfloat scale = (GLfloat) (table->Size - 1);
Brian Paul4bdcfe52000-04-17 17:57:04 +0000811 const GLubyte *lut = (const GLubyte *) table->Table;
Brian Paul179870a2000-04-12 18:54:48 +0000812 GLuint i;
Brian Paul179870a2000-04-12 18:54:48 +0000813 for (i = 0; i < n; i++) {
814 GLint jL = (GLint) (rgba[i][RCOMP] * scale + 0.5F);
815 GLint jA = (GLint) (rgba[i][ACOMP] * scale + 0.5F);
Brian Paul4bdcfe52000-04-17 17:57:04 +0000816 GLfloat luminance = lut[jL * 2 + 0] * (1.0F / 255.0F);
817 GLfloat alpha = lut[jA * 2 + 1] * (1.0F / 255.0F);
818 rgba[i][RCOMP] = rgba[i][GCOMP] = rgba[i][BCOMP] = luminance;
819 rgba[i][ACOMP] = alpha;;
820 }
821 }
822 else {
823 const GLfloat scale = (GLfloat) (table->Size - 1);
824 const GLfloat *lut = (const GLfloat *) table->Table;
825 GLuint i;
826 for (i = 0; i < n; i++) {
827 GLint jL = (GLint) (rgba[i][RCOMP] * scale + 0.5F);
828 GLint jA = (GLint) (rgba[i][ACOMP] * scale + 0.5F);
829 GLfloat luminance = lut[jL * 2 + 0];
830 GLfloat alpha = lut[jA * 2 + 1];
Brian Paul179870a2000-04-12 18:54:48 +0000831 rgba[i][RCOMP] = rgba[i][GCOMP] = rgba[i][BCOMP] = luminance;
832 rgba[i][ACOMP] = alpha;;
833 }
834 }
835 break;
836 case GL_RGB:
Brian Paul4bdcfe52000-04-17 17:57:04 +0000837 /* replace RGB with RGB */
838 if (table->TableType == GL_UNSIGNED_BYTE) {
Brian Paul179870a2000-04-12 18:54:48 +0000839 const GLfloat scale = (GLfloat) (table->Size - 1);
Brian Paul4bdcfe52000-04-17 17:57:04 +0000840 const GLubyte *lut = (const GLubyte *) table->Table;
Brian Paul179870a2000-04-12 18:54:48 +0000841 GLuint i;
Brian Paul4bdcfe52000-04-17 17:57:04 +0000842 for (i = 0; i < n; i++) {
843 GLint jR = (GLint) (rgba[i][RCOMP] * scale + 0.5F);
844 GLint jG = (GLint) (rgba[i][GCOMP] * scale + 0.5F);
845 GLint jB = (GLint) (rgba[i][BCOMP] * scale + 0.5F);
846 rgba[i][RCOMP] = lut[jR * 3 + 0] * (1.0F / 255.0F);
847 rgba[i][GCOMP] = lut[jG * 3 + 1] * (1.0F / 255.0F);
848 rgba[i][BCOMP] = lut[jB * 3 + 2] * (1.0F / 255.0F);
849 }
850 }
851 else {
852 const GLfloat scale = (GLfloat) (table->Size - 1);
853 const GLfloat *lut = (const GLfloat *) table->Table;
854 GLuint i;
Brian Paul179870a2000-04-12 18:54:48 +0000855 for (i = 0; i < n; i++) {
856 GLint jR = (GLint) (rgba[i][RCOMP] * scale + 0.5F);
857 GLint jG = (GLint) (rgba[i][GCOMP] * scale + 0.5F);
858 GLint jB = (GLint) (rgba[i][BCOMP] * scale + 0.5F);
859 rgba[i][RCOMP] = lut[jR * 3 + 0];
860 rgba[i][GCOMP] = lut[jG * 3 + 1];
861 rgba[i][BCOMP] = lut[jB * 3 + 2];
862 }
863 }
864 break;
865 case GL_RGBA:
Brian Paul4bdcfe52000-04-17 17:57:04 +0000866 /* replace RGBA with RGBA */
867 if (table->TableType == GL_UNSIGNED_BYTE) {
Brian Paul179870a2000-04-12 18:54:48 +0000868 const GLfloat scale = (GLfloat) (table->Size - 1);
Brian Paul4bdcfe52000-04-17 17:57:04 +0000869 const GLubyte *lut = (const GLubyte *) table->Table;
Brian Paul179870a2000-04-12 18:54:48 +0000870 GLuint i;
Brian Paul4bdcfe52000-04-17 17:57:04 +0000871 for (i = 0; i < n; i++) {
872 GLint jR = (GLint) (rgba[i][RCOMP] * scale + 0.5F);
873 GLint jG = (GLint) (rgba[i][GCOMP] * scale + 0.5F);
874 GLint jB = (GLint) (rgba[i][BCOMP] * scale + 0.5F);
875 GLint jA = (GLint) (rgba[i][ACOMP] * scale + 0.5F);
876 rgba[i][RCOMP] = lut[jR * 4 + 0] * (1.0F / 255.0F);
877 rgba[i][GCOMP] = lut[jG * 4 + 1] * (1.0F / 255.0F);
878 rgba[i][BCOMP] = lut[jB * 4 + 2] * (1.0F / 255.0F);
879 rgba[i][ACOMP] = lut[jA * 4 + 3] * (1.0F / 255.0F);
880 }
881 }
882 else {
883 const GLfloat scale = (GLfloat) (table->Size - 1);
884 const GLfloat *lut = (const GLfloat *) table->Table;
885 GLuint i;
Brian Paul179870a2000-04-12 18:54:48 +0000886 for (i = 0; i < n; i++) {
887 GLint jR = (GLint) (rgba[i][RCOMP] * scale + 0.5F);
888 GLint jG = (GLint) (rgba[i][GCOMP] * scale + 0.5F);
889 GLint jB = (GLint) (rgba[i][BCOMP] * scale + 0.5F);
890 GLint jA = (GLint) (rgba[i][ACOMP] * scale + 0.5F);
891 rgba[i][RCOMP] = lut[jR * 4 + 0];
892 rgba[i][GCOMP] = lut[jG * 4 + 1];
893 rgba[i][BCOMP] = lut[jB * 4 + 2];
894 rgba[i][ACOMP] = lut[jA * 4 + 3];
895 }
896 }
897 break;
898 default:
899 gl_problem(NULL, "Bad format in _mesa_lookup_rgba");
900 return;
jtgafb833d1999-08-19 00:55:39 +0000901 }
902}
903
904
905
906/*
907 * Apply color index shift and offset to an array of pixels.
908 */
Brian Paul179870a2000-04-12 18:54:48 +0000909void
910_mesa_shift_and_offset_ci( const GLcontext *ctx, GLuint n, GLuint indexes[] )
jtgafb833d1999-08-19 00:55:39 +0000911{
912 GLint shift = ctx->Pixel.IndexShift;
913 GLint offset = ctx->Pixel.IndexOffset;
914 GLuint i;
915 if (shift > 0) {
916 for (i=0;i<n;i++) {
917 indexes[i] = (indexes[i] << shift) + offset;
918 }
919 }
920 else if (shift < 0) {
921 shift = -shift;
922 for (i=0;i<n;i++) {
923 indexes[i] = (indexes[i] >> shift) + offset;
924 }
925 }
926 else {
927 for (i=0;i<n;i++) {
928 indexes[i] = indexes[i] + offset;
929 }
930 }
931}
932
933
934/*
935 * Apply color index mapping to color indexes.
936 */
Brian Paul179870a2000-04-12 18:54:48 +0000937void
938_mesa_map_ci( const GLcontext *ctx, GLuint n, GLuint index[] )
jtgafb833d1999-08-19 00:55:39 +0000939{
940 GLuint mask = ctx->Pixel.MapItoIsize - 1;
941 GLuint i;
942 for (i=0;i<n;i++) {
943 index[i] = ctx->Pixel.MapItoI[ index[i] & mask ];
944 }
945}
946
947
948/*
Brian Paul3c14ec91999-10-30 08:20:57 +0000949 * Map color indexes to rgba values.
jtgafb833d1999-08-19 00:55:39 +0000950 */
Brian Paul179870a2000-04-12 18:54:48 +0000951void
952_mesa_map_ci_to_rgba_ubyte( const GLcontext *ctx, GLuint n,
953 const GLuint index[], GLubyte rgba[][4] )
jtgafb833d1999-08-19 00:55:39 +0000954{
955 GLuint rmask = ctx->Pixel.MapItoRsize - 1;
956 GLuint gmask = ctx->Pixel.MapItoGsize - 1;
957 GLuint bmask = ctx->Pixel.MapItoBsize - 1;
958 GLuint amask = ctx->Pixel.MapItoAsize - 1;
959 const GLubyte *rMap = ctx->Pixel.MapItoR8;
960 const GLubyte *gMap = ctx->Pixel.MapItoG8;
961 const GLubyte *bMap = ctx->Pixel.MapItoB8;
962 const GLubyte *aMap = ctx->Pixel.MapItoA8;
963 GLuint i;
964 for (i=0;i<n;i++) {
965 rgba[i][RCOMP] = rMap[index[i] & rmask];
966 rgba[i][GCOMP] = gMap[index[i] & gmask];
967 rgba[i][BCOMP] = bMap[index[i] & bmask];
968 rgba[i][ACOMP] = aMap[index[i] & amask];
969 }
970}
971
972
973/*
Brian Paul3c14ec91999-10-30 08:20:57 +0000974 * Map color indexes to float rgba values.
975 */
Brian Paul179870a2000-04-12 18:54:48 +0000976void
977_mesa_map_ci_to_rgba( const GLcontext *ctx, GLuint n,
978 const GLuint index[], GLfloat rgba[][4] )
Brian Paul3c14ec91999-10-30 08:20:57 +0000979{
980 GLuint rmask = ctx->Pixel.MapItoRsize - 1;
981 GLuint gmask = ctx->Pixel.MapItoGsize - 1;
982 GLuint bmask = ctx->Pixel.MapItoBsize - 1;
983 GLuint amask = ctx->Pixel.MapItoAsize - 1;
984 const GLfloat *rMap = ctx->Pixel.MapItoR;
985 const GLfloat *gMap = ctx->Pixel.MapItoG;
986 const GLfloat *bMap = ctx->Pixel.MapItoB;
987 const GLfloat *aMap = ctx->Pixel.MapItoA;
988 GLuint i;
989 for (i=0;i<n;i++) {
990 rgba[i][RCOMP] = rMap[index[i] & rmask];
991 rgba[i][GCOMP] = gMap[index[i] & gmask];
992 rgba[i][BCOMP] = bMap[index[i] & bmask];
993 rgba[i][ACOMP] = aMap[index[i] & amask];
994 }
995}
996
997
998/*
jtgafb833d1999-08-19 00:55:39 +0000999 * Map 8-bit color indexes to rgb values.
1000 */
Brian Paul179870a2000-04-12 18:54:48 +00001001void
1002_mesa_map_ci8_to_rgba( const GLcontext *ctx, GLuint n, const GLubyte index[],
1003 GLubyte rgba[][4] )
jtgafb833d1999-08-19 00:55:39 +00001004{
1005 GLuint rmask = ctx->Pixel.MapItoRsize - 1;
1006 GLuint gmask = ctx->Pixel.MapItoGsize - 1;
1007 GLuint bmask = ctx->Pixel.MapItoBsize - 1;
1008 GLuint amask = ctx->Pixel.MapItoAsize - 1;
1009 const GLubyte *rMap = ctx->Pixel.MapItoR8;
1010 const GLubyte *gMap = ctx->Pixel.MapItoG8;
1011 const GLubyte *bMap = ctx->Pixel.MapItoB8;
1012 const GLubyte *aMap = ctx->Pixel.MapItoA8;
1013 GLuint i;
1014 for (i=0;i<n;i++) {
1015 rgba[i][RCOMP] = rMap[index[i] & rmask];
1016 rgba[i][GCOMP] = gMap[index[i] & gmask];
1017 rgba[i][BCOMP] = bMap[index[i] & bmask];
1018 rgba[i][ACOMP] = aMap[index[i] & amask];
1019 }
1020}
1021
1022
Brian Paul179870a2000-04-12 18:54:48 +00001023void
1024_mesa_shift_and_offset_stencil( const GLcontext *ctx, GLuint n,
1025 GLstencil stencil[] )
jtgafb833d1999-08-19 00:55:39 +00001026{
1027 GLuint i;
1028 GLint shift = ctx->Pixel.IndexShift;
1029 GLint offset = ctx->Pixel.IndexOffset;
1030 if (shift > 0) {
1031 for (i=0;i<n;i++) {
1032 stencil[i] = (stencil[i] << shift) + offset;
1033 }
1034 }
1035 else if (shift < 0) {
1036 shift = -shift;
1037 for (i=0;i<n;i++) {
1038 stencil[i] = (stencil[i] >> shift) + offset;
1039 }
1040 }
1041 else {
1042 for (i=0;i<n;i++) {
1043 stencil[i] = stencil[i] + offset;
1044 }
1045 }
1046
1047}
1048
1049
Brian Paul179870a2000-04-12 18:54:48 +00001050void
1051_mesa_map_stencil( const GLcontext *ctx, GLuint n, GLstencil stencil[] )
jtgafb833d1999-08-19 00:55:39 +00001052{
1053 GLuint mask = ctx->Pixel.MapStoSsize - 1;
1054 GLuint i;
1055 for (i=0;i<n;i++) {
1056 stencil[i] = ctx->Pixel.MapStoS[ stencil[i] & mask ];
1057 }
1058}