blob: ec64446214cf9486db63257952e763564643afae [file] [log] [blame]
Brian Paul4bdcfe52000-04-17 17:57:04 +00001/* $Id: pixel.c,v 1.9 2000/04/17 17:57:04 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:
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;
jtgafb833d1999-08-19 00:55:39 +0000584 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 }
Brian Paul250069d2000-04-08 18:57:45 +0000598
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 }
jtgafb833d1999-08-19 00:55:39 +0000612}
613
614
Brian Paulfbd8f211999-11-11 01:22:25 +0000615void
616_mesa_PixelTransferi( GLenum pname, GLint param )
617{
618 _mesa_PixelTransferf( pname, (GLfloat) param );
619}
620
621
jtgafb833d1999-08-19 00:55:39 +0000622
Brian Paul179870a2000-04-12 18:54:48 +0000623/**********************************************************************/
624/***** Pixel processing functions ******/
625/**********************************************************************/
jtgafb833d1999-08-19 00:55:39 +0000626
627
628/*
Brian Paul3c14ec91999-10-30 08:20:57 +0000629 * Apply scale and bias factors to an array of RGBA pixels.
630 */
Brian Paul250069d2000-04-08 18:57:45 +0000631void
Brian Paul179870a2000-04-12 18:54:48 +0000632_mesa_scale_and_bias_rgba(const GLcontext *ctx, GLuint n, GLfloat rgba[][4])
Brian Paul3c14ec91999-10-30 08:20:57 +0000633{
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/*
Brian Paul3c14ec91999-10-30 08:20:57 +0000670 * Apply pixel mapping to an array of floating point RGBA pixels.
671 */
Brian Paul250069d2000-04-08 18:57:45 +0000672void
Brian Paul179870a2000-04-12 18:54:48 +0000673_mesa_map_rgba( const GLcontext *ctx, GLuint n, GLfloat rgba[][4] )
Brian Paul3c14ec91999-10-30 08:20:57 +0000674{
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/*
Brian Paul250069d2000-04-08 18:57:45 +0000694 * Apply the color matrix and post color matrix scaling and biasing.
695 */
696void
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
Brian Paul250069d2000-04-08 18:57:45 +0000722/*
Brian Paul179870a2000-04-12 18:54:48 +0000723 * Apply a color table lookup to an array of colors.
jtgafb833d1999-08-19 00:55:39 +0000724 */
Brian Paul179870a2000-04-12 18:54:48 +0000725void
726_mesa_lookup_rgba(const struct gl_color_table *table,
727 GLuint n, GLfloat rgba[][4])
jtgafb833d1999-08-19 00:55:39 +0000728{
Brian Paul4bdcfe52000-04-17 17:57:04 +0000729 ASSERT(table->TableType == GL_FLOAT);
730 if (!table->Table)
731 return;
732
Brian Paul179870a2000-04-12 18:54:48 +0000733 switch (table->Format) {
734 case GL_INTENSITY:
Brian Paul4bdcfe52000-04-17 17:57:04 +0000735 /* replace RGBA with I */
736 if (table->TableType == GL_UNSIGNED_BYTE) {
Brian Paul179870a2000-04-12 18:54:48 +0000737 const GLfloat scale = (GLfloat) (table->Size - 1);
Brian Paul4bdcfe52000-04-17 17:57:04 +0000738 const GLubyte *lut = (const GLubyte *) table->Table;
Brian Paul179870a2000-04-12 18:54:48 +0000739 GLuint i;
Brian Paul179870a2000-04-12 18:54:48 +0000740 for (i = 0; i < n; i++) {
741 GLint j = (GLint) (rgba[i][RCOMP] * scale + 0.5F);
Brian Paul4bdcfe52000-04-17 17:57:04 +0000742 GLfloat c = lut[j] * (1.0F / 255.0F);
743 rgba[i][RCOMP] = rgba[i][GCOMP] =
744 rgba[i][BCOMP] = rgba[i][ACOMP] = c;
745 }
746
747 }
748 else {
749 const GLfloat scale = (GLfloat) (table->Size - 1);
750 const GLfloat *lut = (const GLfloat *) table->Table;
751 GLuint i;
752 for (i = 0; i < n; i++) {
753 GLint j = (GLint) (rgba[i][RCOMP] * scale + 0.5F);
754 GLfloat c = lut[j];
Brian Paul179870a2000-04-12 18:54:48 +0000755 rgba[i][RCOMP] = rgba[i][GCOMP] =
756 rgba[i][BCOMP] = rgba[i][ACOMP] = c;
757 }
758 }
759 break;
760 case GL_LUMINANCE:
Brian Paul4bdcfe52000-04-17 17:57:04 +0000761 /* replace RGB with L */
762 if (table->TableType == GL_UNSIGNED_BYTE) {
Brian Paul179870a2000-04-12 18:54:48 +0000763 const GLfloat scale = (GLfloat) (table->Size - 1);
Brian Paul4bdcfe52000-04-17 17:57:04 +0000764 const GLubyte *lut = (const GLubyte *) table->Table;
Brian Paul179870a2000-04-12 18:54:48 +0000765 GLuint i;
Brian Paul179870a2000-04-12 18:54:48 +0000766 for (i = 0; i < n; i++) {
767 GLint j = (GLint) (rgba[i][RCOMP] * scale + 0.5F);
Brian Paul4bdcfe52000-04-17 17:57:04 +0000768 GLfloat c = lut[j] * (1.0F / 255.0F);
769 rgba[i][RCOMP] = rgba[i][GCOMP] = rgba[i][BCOMP] = c;
770 }
771 }
772 else {
773 const GLfloat scale = (GLfloat) (table->Size - 1);
774 const GLfloat *lut = (const GLfloat *) table->Table;
775 GLuint i;
776 for (i = 0; i < n; i++) {
777 GLint j = (GLint) (rgba[i][RCOMP] * scale + 0.5F);
778 GLfloat c = lut[j];
Brian Paul179870a2000-04-12 18:54:48 +0000779 rgba[i][RCOMP] = rgba[i][GCOMP] = rgba[i][BCOMP] = c;
780 }
781 }
782 break;
783 case GL_ALPHA:
Brian Paul4bdcfe52000-04-17 17:57:04 +0000784 /* replace A with A */
785 if (table->TableType == GL_UNSIGNED_BYTE) {
Brian Paul179870a2000-04-12 18:54:48 +0000786 const GLfloat scale = (GLfloat) (table->Size - 1);
Brian Paul4bdcfe52000-04-17 17:57:04 +0000787 const GLubyte *lut = (const GLubyte *) table->Table;
Brian Paul179870a2000-04-12 18:54:48 +0000788 GLuint i;
Brian Paul4bdcfe52000-04-17 17:57:04 +0000789 for (i = 0; i < n; i++) {
790 GLint j = (GLint) (rgba[i][ACOMP] * scale + 0.5F);
791 rgba[i][ACOMP] = lut[j] * (1.0F / 255.0F);
792 }
793 }
794 else {
795 const GLfloat scale = (GLfloat) (table->Size - 1);
796 const GLfloat *lut = (const GLfloat *) table->Table;
797 GLuint i;
Brian Paul179870a2000-04-12 18:54:48 +0000798 for (i = 0; i < n; i++) {
799 GLint j = (GLint) (rgba[i][ACOMP] * scale + 0.5F);
800 rgba[i][ACOMP] = lut[j];
801 }
802 }
803 break;
804 case GL_LUMINANCE_ALPHA:
Brian Paul4bdcfe52000-04-17 17:57:04 +0000805 /* replace RGBA with LLLA */
806 if (table->TableType == GL_UNSIGNED_BYTE) {
Brian Paul179870a2000-04-12 18:54:48 +0000807 const GLfloat scale = (GLfloat) (table->Size - 1);
Brian Paul4bdcfe52000-04-17 17:57:04 +0000808 const GLubyte *lut = (const GLubyte *) table->Table;
Brian Paul179870a2000-04-12 18:54:48 +0000809 GLuint i;
Brian Paul179870a2000-04-12 18:54:48 +0000810 for (i = 0; i < n; i++) {
811 GLint jL = (GLint) (rgba[i][RCOMP] * scale + 0.5F);
812 GLint jA = (GLint) (rgba[i][ACOMP] * scale + 0.5F);
Brian Paul4bdcfe52000-04-17 17:57:04 +0000813 GLfloat luminance = lut[jL * 2 + 0] * (1.0F / 255.0F);
814 GLfloat alpha = lut[jA * 2 + 1] * (1.0F / 255.0F);
815 rgba[i][RCOMP] = rgba[i][GCOMP] = rgba[i][BCOMP] = luminance;
816 rgba[i][ACOMP] = alpha;;
817 }
818 }
819 else {
820 const GLfloat scale = (GLfloat) (table->Size - 1);
821 const GLfloat *lut = (const GLfloat *) table->Table;
822 GLuint i;
823 for (i = 0; i < n; i++) {
824 GLint jL = (GLint) (rgba[i][RCOMP] * scale + 0.5F);
825 GLint jA = (GLint) (rgba[i][ACOMP] * scale + 0.5F);
826 GLfloat luminance = lut[jL * 2 + 0];
827 GLfloat alpha = lut[jA * 2 + 1];
Brian Paul179870a2000-04-12 18:54:48 +0000828 rgba[i][RCOMP] = rgba[i][GCOMP] = rgba[i][BCOMP] = luminance;
829 rgba[i][ACOMP] = alpha;;
830 }
831 }
832 break;
833 case GL_RGB:
Brian Paul4bdcfe52000-04-17 17:57:04 +0000834 /* replace RGB with RGB */
835 if (table->TableType == GL_UNSIGNED_BYTE) {
Brian Paul179870a2000-04-12 18:54:48 +0000836 const GLfloat scale = (GLfloat) (table->Size - 1);
Brian Paul4bdcfe52000-04-17 17:57:04 +0000837 const GLubyte *lut = (const GLubyte *) table->Table;
Brian Paul179870a2000-04-12 18:54:48 +0000838 GLuint i;
Brian Paul4bdcfe52000-04-17 17:57:04 +0000839 for (i = 0; i < n; i++) {
840 GLint jR = (GLint) (rgba[i][RCOMP] * scale + 0.5F);
841 GLint jG = (GLint) (rgba[i][GCOMP] * scale + 0.5F);
842 GLint jB = (GLint) (rgba[i][BCOMP] * scale + 0.5F);
843 rgba[i][RCOMP] = lut[jR * 3 + 0] * (1.0F / 255.0F);
844 rgba[i][GCOMP] = lut[jG * 3 + 1] * (1.0F / 255.0F);
845 rgba[i][BCOMP] = lut[jB * 3 + 2] * (1.0F / 255.0F);
846 }
847 }
848 else {
849 const GLfloat scale = (GLfloat) (table->Size - 1);
850 const GLfloat *lut = (const GLfloat *) table->Table;
851 GLuint i;
Brian Paul179870a2000-04-12 18:54:48 +0000852 for (i = 0; i < n; i++) {
853 GLint jR = (GLint) (rgba[i][RCOMP] * scale + 0.5F);
854 GLint jG = (GLint) (rgba[i][GCOMP] * scale + 0.5F);
855 GLint jB = (GLint) (rgba[i][BCOMP] * scale + 0.5F);
856 rgba[i][RCOMP] = lut[jR * 3 + 0];
857 rgba[i][GCOMP] = lut[jG * 3 + 1];
858 rgba[i][BCOMP] = lut[jB * 3 + 2];
859 }
860 }
861 break;
862 case GL_RGBA:
Brian Paul4bdcfe52000-04-17 17:57:04 +0000863 /* replace RGBA with RGBA */
864 if (table->TableType == GL_UNSIGNED_BYTE) {
Brian Paul179870a2000-04-12 18:54:48 +0000865 const GLfloat scale = (GLfloat) (table->Size - 1);
Brian Paul4bdcfe52000-04-17 17:57:04 +0000866 const GLubyte *lut = (const GLubyte *) table->Table;
Brian Paul179870a2000-04-12 18:54:48 +0000867 GLuint i;
Brian Paul4bdcfe52000-04-17 17:57:04 +0000868 for (i = 0; i < n; i++) {
869 GLint jR = (GLint) (rgba[i][RCOMP] * scale + 0.5F);
870 GLint jG = (GLint) (rgba[i][GCOMP] * scale + 0.5F);
871 GLint jB = (GLint) (rgba[i][BCOMP] * scale + 0.5F);
872 GLint jA = (GLint) (rgba[i][ACOMP] * scale + 0.5F);
873 rgba[i][RCOMP] = lut[jR * 4 + 0] * (1.0F / 255.0F);
874 rgba[i][GCOMP] = lut[jG * 4 + 1] * (1.0F / 255.0F);
875 rgba[i][BCOMP] = lut[jB * 4 + 2] * (1.0F / 255.0F);
876 rgba[i][ACOMP] = lut[jA * 4 + 3] * (1.0F / 255.0F);
877 }
878 }
879 else {
880 const GLfloat scale = (GLfloat) (table->Size - 1);
881 const GLfloat *lut = (const GLfloat *) table->Table;
882 GLuint i;
Brian Paul179870a2000-04-12 18:54:48 +0000883 for (i = 0; i < n; i++) {
884 GLint jR = (GLint) (rgba[i][RCOMP] * scale + 0.5F);
885 GLint jG = (GLint) (rgba[i][GCOMP] * scale + 0.5F);
886 GLint jB = (GLint) (rgba[i][BCOMP] * scale + 0.5F);
887 GLint jA = (GLint) (rgba[i][ACOMP] * scale + 0.5F);
888 rgba[i][RCOMP] = lut[jR * 4 + 0];
889 rgba[i][GCOMP] = lut[jG * 4 + 1];
890 rgba[i][BCOMP] = lut[jB * 4 + 2];
891 rgba[i][ACOMP] = lut[jA * 4 + 3];
892 }
893 }
894 break;
895 default:
896 gl_problem(NULL, "Bad format in _mesa_lookup_rgba");
897 return;
jtgafb833d1999-08-19 00:55:39 +0000898 }
899}
900
901
902
903/*
904 * Apply color index shift and offset to an array of pixels.
905 */
Brian Paul179870a2000-04-12 18:54:48 +0000906void
907_mesa_shift_and_offset_ci( const GLcontext *ctx, GLuint n, GLuint indexes[] )
jtgafb833d1999-08-19 00:55:39 +0000908{
909 GLint shift = ctx->Pixel.IndexShift;
910 GLint offset = ctx->Pixel.IndexOffset;
911 GLuint i;
912 if (shift > 0) {
913 for (i=0;i<n;i++) {
914 indexes[i] = (indexes[i] << shift) + offset;
915 }
916 }
917 else if (shift < 0) {
918 shift = -shift;
919 for (i=0;i<n;i++) {
920 indexes[i] = (indexes[i] >> shift) + offset;
921 }
922 }
923 else {
924 for (i=0;i<n;i++) {
925 indexes[i] = indexes[i] + offset;
926 }
927 }
928}
929
930
931/*
932 * Apply color index mapping to color indexes.
933 */
Brian Paul179870a2000-04-12 18:54:48 +0000934void
935_mesa_map_ci( const GLcontext *ctx, GLuint n, GLuint index[] )
jtgafb833d1999-08-19 00:55:39 +0000936{
937 GLuint mask = ctx->Pixel.MapItoIsize - 1;
938 GLuint i;
939 for (i=0;i<n;i++) {
940 index[i] = ctx->Pixel.MapItoI[ index[i] & mask ];
941 }
942}
943
944
945/*
Brian Paul3c14ec91999-10-30 08:20:57 +0000946 * Map color indexes to rgba values.
jtgafb833d1999-08-19 00:55:39 +0000947 */
Brian Paul179870a2000-04-12 18:54:48 +0000948void
949_mesa_map_ci_to_rgba_ubyte( const GLcontext *ctx, GLuint n,
950 const GLuint index[], GLubyte rgba[][4] )
jtgafb833d1999-08-19 00:55:39 +0000951{
952 GLuint rmask = ctx->Pixel.MapItoRsize - 1;
953 GLuint gmask = ctx->Pixel.MapItoGsize - 1;
954 GLuint bmask = ctx->Pixel.MapItoBsize - 1;
955 GLuint amask = ctx->Pixel.MapItoAsize - 1;
956 const GLubyte *rMap = ctx->Pixel.MapItoR8;
957 const GLubyte *gMap = ctx->Pixel.MapItoG8;
958 const GLubyte *bMap = ctx->Pixel.MapItoB8;
959 const GLubyte *aMap = ctx->Pixel.MapItoA8;
960 GLuint i;
961 for (i=0;i<n;i++) {
962 rgba[i][RCOMP] = rMap[index[i] & rmask];
963 rgba[i][GCOMP] = gMap[index[i] & gmask];
964 rgba[i][BCOMP] = bMap[index[i] & bmask];
965 rgba[i][ACOMP] = aMap[index[i] & amask];
966 }
967}
968
969
970/*
Brian Paul3c14ec91999-10-30 08:20:57 +0000971 * Map color indexes to float rgba values.
972 */
Brian Paul179870a2000-04-12 18:54:48 +0000973void
974_mesa_map_ci_to_rgba( const GLcontext *ctx, GLuint n,
975 const GLuint index[], GLfloat rgba[][4] )
Brian Paul3c14ec91999-10-30 08:20:57 +0000976{
977 GLuint rmask = ctx->Pixel.MapItoRsize - 1;
978 GLuint gmask = ctx->Pixel.MapItoGsize - 1;
979 GLuint bmask = ctx->Pixel.MapItoBsize - 1;
980 GLuint amask = ctx->Pixel.MapItoAsize - 1;
981 const GLfloat *rMap = ctx->Pixel.MapItoR;
982 const GLfloat *gMap = ctx->Pixel.MapItoG;
983 const GLfloat *bMap = ctx->Pixel.MapItoB;
984 const GLfloat *aMap = ctx->Pixel.MapItoA;
985 GLuint i;
986 for (i=0;i<n;i++) {
987 rgba[i][RCOMP] = rMap[index[i] & rmask];
988 rgba[i][GCOMP] = gMap[index[i] & gmask];
989 rgba[i][BCOMP] = bMap[index[i] & bmask];
990 rgba[i][ACOMP] = aMap[index[i] & amask];
991 }
992}
993
994
995/*
jtgafb833d1999-08-19 00:55:39 +0000996 * Map 8-bit color indexes to rgb values.
997 */
Brian Paul179870a2000-04-12 18:54:48 +0000998void
999_mesa_map_ci8_to_rgba( const GLcontext *ctx, GLuint n, const GLubyte index[],
1000 GLubyte rgba[][4] )
jtgafb833d1999-08-19 00:55:39 +00001001{
1002 GLuint rmask = ctx->Pixel.MapItoRsize - 1;
1003 GLuint gmask = ctx->Pixel.MapItoGsize - 1;
1004 GLuint bmask = ctx->Pixel.MapItoBsize - 1;
1005 GLuint amask = ctx->Pixel.MapItoAsize - 1;
1006 const GLubyte *rMap = ctx->Pixel.MapItoR8;
1007 const GLubyte *gMap = ctx->Pixel.MapItoG8;
1008 const GLubyte *bMap = ctx->Pixel.MapItoB8;
1009 const GLubyte *aMap = ctx->Pixel.MapItoA8;
1010 GLuint i;
1011 for (i=0;i<n;i++) {
1012 rgba[i][RCOMP] = rMap[index[i] & rmask];
1013 rgba[i][GCOMP] = gMap[index[i] & gmask];
1014 rgba[i][BCOMP] = bMap[index[i] & bmask];
1015 rgba[i][ACOMP] = aMap[index[i] & amask];
1016 }
1017}
1018
1019
Brian Paul179870a2000-04-12 18:54:48 +00001020void
1021_mesa_shift_and_offset_stencil( const GLcontext *ctx, GLuint n,
1022 GLstencil stencil[] )
jtgafb833d1999-08-19 00:55:39 +00001023{
1024 GLuint i;
1025 GLint shift = ctx->Pixel.IndexShift;
1026 GLint offset = ctx->Pixel.IndexOffset;
1027 if (shift > 0) {
1028 for (i=0;i<n;i++) {
1029 stencil[i] = (stencil[i] << shift) + offset;
1030 }
1031 }
1032 else if (shift < 0) {
1033 shift = -shift;
1034 for (i=0;i<n;i++) {
1035 stencil[i] = (stencil[i] >> shift) + offset;
1036 }
1037 }
1038 else {
1039 for (i=0;i<n;i++) {
1040 stencil[i] = stencil[i] + offset;
1041 }
1042 }
1043
1044}
1045
1046
Brian Paul179870a2000-04-12 18:54:48 +00001047void
1048_mesa_map_stencil( const GLcontext *ctx, GLuint n, GLstencil stencil[] )
jtgafb833d1999-08-19 00:55:39 +00001049{
1050 GLuint mask = ctx->Pixel.MapStoSsize - 1;
1051 GLuint i;
1052 for (i=0;i<n;i++) {
1053 stencil[i] = ctx->Pixel.MapStoS[ stencil[i] & mask ];
1054 }
1055}