blob: 316c357af190f294d68b0902b63b25145fc3302a [file] [log] [blame]
jtgafb833d1999-08-19 00:55:39 +00001/* $Id: pixel.c,v 1.1 1999/08/19 00:55:41 jtg Exp $ */
2
3/*
4 * Mesa 3-D graphics library
5 * Version: 3.1
6 *
7 * Copyright (C) 1999 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
29
30
31/*
32 * glPixelStore, glPixelTransfer, glPixelMap, glPixelZoom, etc.
33 */
34
35
36#ifdef PC_HEADER
37#include "all.h"
38#else
39#include <assert.h>
40#include <stdio.h>
41#include <stdlib.h>
42#include "context.h"
43#include "macros.h"
44#include "pixel.h"
45#include "types.h"
46#ifdef XFree86Server
47#include "GL/xf86glx.h"
48#endif
49#endif
50
51
52
53/**********************************************************************/
54/***** glPixelZoom *****/
55/**********************************************************************/
56
57
58
59void gl_PixelZoom( GLcontext *ctx, GLfloat xfactor, GLfloat yfactor )
60{
61 ASSERT_OUTSIDE_BEGIN_END_AND_FLUSH(ctx, "glPixelZoom");
62
63 ctx->Pixel.ZoomX = xfactor;
64 ctx->Pixel.ZoomY = yfactor;
65}
66
67
68
69/**********************************************************************/
70/***** glPixelStore *****/
71/**********************************************************************/
72
73
74void gl_PixelStorei( GLcontext *ctx, GLenum pname, GLint param )
75{
76 /* NOTE: this call can't be compiled into the display list */
77
78 ASSERT_OUTSIDE_BEGIN_END_AND_FLUSH(ctx, "glPixelStore");
79
80
81 switch (pname) {
82 case GL_PACK_SWAP_BYTES:
83 ctx->Pack.SwapBytes = param ? GL_TRUE : GL_FALSE;
84 break;
85 case GL_PACK_LSB_FIRST:
86 ctx->Pack.LsbFirst = param ? GL_TRUE : GL_FALSE;
87 break;
88 case GL_PACK_ROW_LENGTH:
89 if (param<0) {
90 gl_error( ctx, GL_INVALID_VALUE, "glPixelStore(param)" );
91 }
92 else {
93 ctx->Pack.RowLength = param;
94 }
95 break;
96 case GL_PACK_IMAGE_HEIGHT:
97 if (param<0)
98 gl_error( ctx, GL_INVALID_VALUE, "glPixelStore(param)" );
99 else
100 ctx->Pack.ImageHeight = param;
101 break;
102 case GL_PACK_SKIP_PIXELS:
103 if (param<0) {
104 gl_error( ctx, GL_INVALID_VALUE, "glPixelStore(param)" );
105 }
106 else {
107 ctx->Pack.SkipPixels = param;
108 }
109 break;
110 case GL_PACK_SKIP_ROWS:
111 if (param<0) {
112 gl_error( ctx, GL_INVALID_VALUE, "glPixelStore(param)" );
113 }
114 else {
115 ctx->Pack.SkipRows = param;
116 }
117 break;
118 case GL_PACK_ALIGNMENT:
119 if (param==1 || param==2 || param==4 || param==8) {
120 ctx->Pack.Alignment = param;
121 }
122 else {
123 gl_error( ctx, GL_INVALID_VALUE, "glPixelStore(param)" );
124 }
125 break;
126 case GL_UNPACK_SWAP_BYTES:
127 ctx->Unpack.SwapBytes = param ? GL_TRUE : GL_FALSE;
128 break;
129 case GL_UNPACK_LSB_FIRST:
130 ctx->Unpack.LsbFirst = param ? GL_TRUE : GL_FALSE;
131 break;
132 case GL_UNPACK_ROW_LENGTH:
133 if (param<0) {
134 gl_error( ctx, GL_INVALID_VALUE, "glPixelStore(param)" );
135 }
136 else {
137 ctx->Unpack.RowLength = param;
138 }
139 break;
140 case GL_UNPACK_IMAGE_HEIGHT:
141 if (param<0)
142 gl_error( ctx, GL_INVALID_VALUE, "glPixelStore(param)" );
143 else
144 ctx->Unpack.ImageHeight = param;
145 break;
146 case GL_UNPACK_SKIP_PIXELS:
147 if (param<0) {
148 gl_error( ctx, GL_INVALID_VALUE, "glPixelStore(param)" );
149 }
150 else {
151 ctx->Unpack.SkipPixels = param;
152 }
153 break;
154 case GL_UNPACK_SKIP_ROWS:
155 if (param<0) {
156 gl_error( ctx, GL_INVALID_VALUE, "glPixelStore(param)" );
157 }
158 else {
159 ctx->Unpack.SkipRows = param;
160 }
161 break;
162 case GL_UNPACK_ALIGNMENT:
163 if (param==1 || param==2 || param==4 || param==8) {
164 ctx->Unpack.Alignment = param;
165 }
166 else {
167 gl_error( ctx, GL_INVALID_VALUE, "glPixelStore" );
168 }
169 break;
170 default:
171 gl_error( ctx, GL_INVALID_ENUM, "glPixelStore" );
172 }
173}
174
175
176
177
178
179/**********************************************************************/
180/***** glPixelMap *****/
181/**********************************************************************/
182
183
184
185void gl_PixelMapfv( GLcontext *ctx,
186 GLenum map, GLint mapsize, const GLfloat *values )
187{
188 GLint i;
189
190 ASSERT_OUTSIDE_BEGIN_END_AND_FLUSH(ctx, "glPixelMapfv");
191
192
193 if (mapsize<0 || mapsize>MAX_PIXEL_MAP_TABLE) {
194 gl_error( ctx, GL_INVALID_VALUE, "glPixelMapfv(mapsize)" );
195 return;
196 }
197
198 if (map>=GL_PIXEL_MAP_S_TO_S && map<=GL_PIXEL_MAP_I_TO_A) {
199 /* test that mapsize is a power of two */
200 GLuint p;
201 GLboolean ok = GL_FALSE;
202 for (p=1; p<=MAX_PIXEL_MAP_TABLE; p=p<<1) {
203 if ( (p&mapsize) == p ) {
204 ok = GL_TRUE;
205 break;
206 }
207 }
208 if (!ok) {
209 gl_error( ctx, GL_INVALID_VALUE, "glPixelMapfv(mapsize)" );
210 return;
211 }
212 }
213
214 switch (map) {
215 case GL_PIXEL_MAP_S_TO_S:
216 ctx->Pixel.MapStoSsize = mapsize;
217 for (i=0;i<mapsize;i++) {
218 ctx->Pixel.MapStoS[i] = (GLint) values[i];
219 }
220 break;
221 case GL_PIXEL_MAP_I_TO_I:
222 ctx->Pixel.MapItoIsize = mapsize;
223 for (i=0;i<mapsize;i++) {
224 ctx->Pixel.MapItoI[i] = (GLint) values[i];
225 }
226 break;
227 case GL_PIXEL_MAP_I_TO_R:
228 ctx->Pixel.MapItoRsize = mapsize;
229 for (i=0;i<mapsize;i++) {
230 GLfloat val = CLAMP( values[i], 0.0, 1.0 );
231 ctx->Pixel.MapItoR[i] = val;
232 ctx->Pixel.MapItoR8[i] = (GLint) (val * 255.0F);
233 }
234 break;
235 case GL_PIXEL_MAP_I_TO_G:
236 ctx->Pixel.MapItoGsize = mapsize;
237 for (i=0;i<mapsize;i++) {
238 GLfloat val = CLAMP( values[i], 0.0, 1.0 );
239 ctx->Pixel.MapItoG[i] = val;
240 ctx->Pixel.MapItoG8[i] = (GLint) (val * 255.0F);
241 }
242 break;
243 case GL_PIXEL_MAP_I_TO_B:
244 ctx->Pixel.MapItoBsize = mapsize;
245 for (i=0;i<mapsize;i++) {
246 GLfloat val = CLAMP( values[i], 0.0, 1.0 );
247 ctx->Pixel.MapItoB[i] = val;
248 ctx->Pixel.MapItoB8[i] = (GLint) (val * 255.0F);
249 }
250 break;
251 case GL_PIXEL_MAP_I_TO_A:
252 ctx->Pixel.MapItoAsize = mapsize;
253 for (i=0;i<mapsize;i++) {
254 GLfloat val = CLAMP( values[i], 0.0, 1.0 );
255 ctx->Pixel.MapItoA[i] = val;
256 ctx->Pixel.MapItoA8[i] = (GLint) (val * 255.0F);
257 }
258 break;
259 case GL_PIXEL_MAP_R_TO_R:
260 ctx->Pixel.MapRtoRsize = mapsize;
261 for (i=0;i<mapsize;i++) {
262 ctx->Pixel.MapRtoR[i] = CLAMP( values[i], 0.0, 1.0 );
263 }
264 break;
265 case GL_PIXEL_MAP_G_TO_G:
266 ctx->Pixel.MapGtoGsize = mapsize;
267 for (i=0;i<mapsize;i++) {
268 ctx->Pixel.MapGtoG[i] = CLAMP( values[i], 0.0, 1.0 );
269 }
270 break;
271 case GL_PIXEL_MAP_B_TO_B:
272 ctx->Pixel.MapBtoBsize = mapsize;
273 for (i=0;i<mapsize;i++) {
274 ctx->Pixel.MapBtoB[i] = CLAMP( values[i], 0.0, 1.0 );
275 }
276 break;
277 case GL_PIXEL_MAP_A_TO_A:
278 ctx->Pixel.MapAtoAsize = mapsize;
279 for (i=0;i<mapsize;i++) {
280 ctx->Pixel.MapAtoA[i] = CLAMP( values[i], 0.0, 1.0 );
281 }
282 break;
283 default:
284 gl_error( ctx, GL_INVALID_ENUM, "glPixelMapfv(map)" );
285 }
286}
287
288
289
290
291
292void gl_GetPixelMapfv( GLcontext *ctx, GLenum map, GLfloat *values )
293{
294 GLint i;
295
296 ASSERT_OUTSIDE_BEGIN_END(ctx, "glGetPixelMapfv");
297
298 switch (map) {
299 case GL_PIXEL_MAP_I_TO_I:
300 for (i=0;i<ctx->Pixel.MapItoIsize;i++) {
301 values[i] = (GLfloat) ctx->Pixel.MapItoI[i];
302 }
303 break;
304 case GL_PIXEL_MAP_S_TO_S:
305 for (i=0;i<ctx->Pixel.MapStoSsize;i++) {
306 values[i] = (GLfloat) ctx->Pixel.MapStoS[i];
307 }
308 break;
309 case GL_PIXEL_MAP_I_TO_R:
310 MEMCPY(values,ctx->Pixel.MapItoR,ctx->Pixel.MapItoRsize*sizeof(GLfloat));
311 break;
312 case GL_PIXEL_MAP_I_TO_G:
313 MEMCPY(values,ctx->Pixel.MapItoG,ctx->Pixel.MapItoGsize*sizeof(GLfloat));
314 break;
315 case GL_PIXEL_MAP_I_TO_B:
316 MEMCPY(values,ctx->Pixel.MapItoB,ctx->Pixel.MapItoBsize*sizeof(GLfloat));
317 break;
318 case GL_PIXEL_MAP_I_TO_A:
319 MEMCPY(values,ctx->Pixel.MapItoA,ctx->Pixel.MapItoAsize*sizeof(GLfloat));
320 break;
321 case GL_PIXEL_MAP_R_TO_R:
322 MEMCPY(values,ctx->Pixel.MapRtoR,ctx->Pixel.MapRtoRsize*sizeof(GLfloat));
323 break;
324 case GL_PIXEL_MAP_G_TO_G:
325 MEMCPY(values,ctx->Pixel.MapGtoG,ctx->Pixel.MapGtoGsize*sizeof(GLfloat));
326 break;
327 case GL_PIXEL_MAP_B_TO_B:
328 MEMCPY(values,ctx->Pixel.MapBtoB,ctx->Pixel.MapBtoBsize*sizeof(GLfloat));
329 break;
330 case GL_PIXEL_MAP_A_TO_A:
331 MEMCPY(values,ctx->Pixel.MapAtoA,ctx->Pixel.MapAtoAsize*sizeof(GLfloat));
332 break;
333 default:
334 gl_error( ctx, GL_INVALID_ENUM, "glGetPixelMapfv" );
335 }
336}
337
338
339void gl_GetPixelMapuiv( GLcontext *ctx, GLenum map, GLuint *values )
340{
341 GLint i;
342
343 ASSERT_OUTSIDE_BEGIN_END(ctx, "glGetPixelMapfv");
344
345 switch (map) {
346 case GL_PIXEL_MAP_I_TO_I:
347 MEMCPY(values, ctx->Pixel.MapItoI, ctx->Pixel.MapItoIsize*sizeof(GLint));
348 break;
349 case GL_PIXEL_MAP_S_TO_S:
350 MEMCPY(values, ctx->Pixel.MapStoS, ctx->Pixel.MapStoSsize*sizeof(GLint));
351 break;
352 case GL_PIXEL_MAP_I_TO_R:
353 for (i=0;i<ctx->Pixel.MapItoRsize;i++) {
354 values[i] = FLOAT_TO_UINT( ctx->Pixel.MapItoR[i] );
355 }
356 break;
357 case GL_PIXEL_MAP_I_TO_G:
358 for (i=0;i<ctx->Pixel.MapItoGsize;i++) {
359 values[i] = FLOAT_TO_UINT( ctx->Pixel.MapItoG[i] );
360 }
361 break;
362 case GL_PIXEL_MAP_I_TO_B:
363 for (i=0;i<ctx->Pixel.MapItoBsize;i++) {
364 values[i] = FLOAT_TO_UINT( ctx->Pixel.MapItoB[i] );
365 }
366 break;
367 case GL_PIXEL_MAP_I_TO_A:
368 for (i=0;i<ctx->Pixel.MapItoAsize;i++) {
369 values[i] = FLOAT_TO_UINT( ctx->Pixel.MapItoA[i] );
370 }
371 break;
372 case GL_PIXEL_MAP_R_TO_R:
373 for (i=0;i<ctx->Pixel.MapRtoRsize;i++) {
374 values[i] = FLOAT_TO_UINT( ctx->Pixel.MapRtoR[i] );
375 }
376 break;
377 case GL_PIXEL_MAP_G_TO_G:
378 for (i=0;i<ctx->Pixel.MapGtoGsize;i++) {
379 values[i] = FLOAT_TO_UINT( ctx->Pixel.MapGtoG[i] );
380 }
381 break;
382 case GL_PIXEL_MAP_B_TO_B:
383 for (i=0;i<ctx->Pixel.MapBtoBsize;i++) {
384 values[i] = FLOAT_TO_UINT( ctx->Pixel.MapBtoB[i] );
385 }
386 break;
387 case GL_PIXEL_MAP_A_TO_A:
388 for (i=0;i<ctx->Pixel.MapAtoAsize;i++) {
389 values[i] = FLOAT_TO_UINT( ctx->Pixel.MapAtoA[i] );
390 }
391 break;
392 default:
393 gl_error( ctx, GL_INVALID_ENUM, "glGetPixelMapfv" );
394 }
395}
396
397
398void gl_GetPixelMapusv( GLcontext *ctx, GLenum map, GLushort *values )
399{
400 GLint i;
401
402 ASSERT_OUTSIDE_BEGIN_END(ctx, "glGetPixelMapfv");
403
404 switch (map) {
405 case GL_PIXEL_MAP_I_TO_I:
406 for (i=0;i<ctx->Pixel.MapItoIsize;i++) {
407 values[i] = (GLushort) ctx->Pixel.MapItoI[i];
408 }
409 break;
410 case GL_PIXEL_MAP_S_TO_S:
411 for (i=0;i<ctx->Pixel.MapStoSsize;i++) {
412 values[i] = (GLushort) ctx->Pixel.MapStoS[i];
413 }
414 break;
415 case GL_PIXEL_MAP_I_TO_R:
416 for (i=0;i<ctx->Pixel.MapItoRsize;i++) {
417 values[i] = FLOAT_TO_USHORT( ctx->Pixel.MapItoR[i] );
418 }
419 break;
420 case GL_PIXEL_MAP_I_TO_G:
421 for (i=0;i<ctx->Pixel.MapItoGsize;i++) {
422 values[i] = FLOAT_TO_USHORT( ctx->Pixel.MapItoG[i] );
423 }
424 break;
425 case GL_PIXEL_MAP_I_TO_B:
426 for (i=0;i<ctx->Pixel.MapItoBsize;i++) {
427 values[i] = FLOAT_TO_USHORT( ctx->Pixel.MapItoB[i] );
428 }
429 break;
430 case GL_PIXEL_MAP_I_TO_A:
431 for (i=0;i<ctx->Pixel.MapItoAsize;i++) {
432 values[i] = FLOAT_TO_USHORT( ctx->Pixel.MapItoA[i] );
433 }
434 break;
435 case GL_PIXEL_MAP_R_TO_R:
436 for (i=0;i<ctx->Pixel.MapRtoRsize;i++) {
437 values[i] = FLOAT_TO_USHORT( ctx->Pixel.MapRtoR[i] );
438 }
439 break;
440 case GL_PIXEL_MAP_G_TO_G:
441 for (i=0;i<ctx->Pixel.MapGtoGsize;i++) {
442 values[i] = FLOAT_TO_USHORT( ctx->Pixel.MapGtoG[i] );
443 }
444 break;
445 case GL_PIXEL_MAP_B_TO_B:
446 for (i=0;i<ctx->Pixel.MapBtoBsize;i++) {
447 values[i] = FLOAT_TO_USHORT( ctx->Pixel.MapBtoB[i] );
448 }
449 break;
450 case GL_PIXEL_MAP_A_TO_A:
451 for (i=0;i<ctx->Pixel.MapAtoAsize;i++) {
452 values[i] = FLOAT_TO_USHORT( ctx->Pixel.MapAtoA[i] );
453 }
454 break;
455 default:
456 gl_error( ctx, GL_INVALID_ENUM, "glGetPixelMapfv" );
457 }
458}
459
460
461
462/**********************************************************************/
463/***** glPixelTransfer *****/
464/**********************************************************************/
465
466
467/*
468 * Implements glPixelTransfer[fi] whether called immediately or from a
469 * display list.
470 */
471void gl_PixelTransferf( GLcontext *ctx, GLenum pname, GLfloat param )
472{
473 ASSERT_OUTSIDE_BEGIN_END_AND_FLUSH(ctx, "glPixelTransfer");
474
475
476 switch (pname) {
477 case GL_MAP_COLOR:
478 ctx->Pixel.MapColorFlag = param ? GL_TRUE : GL_FALSE;
479 break;
480 case GL_MAP_STENCIL:
481 ctx->Pixel.MapStencilFlag = param ? GL_TRUE : GL_FALSE;
482 break;
483 case GL_INDEX_SHIFT:
484 ctx->Pixel.IndexShift = (GLint) param;
485 break;
486 case GL_INDEX_OFFSET:
487 ctx->Pixel.IndexOffset = (GLint) param;
488 break;
489 case GL_RED_SCALE:
490 ctx->Pixel.RedScale = param;
491 break;
492 case GL_RED_BIAS:
493 ctx->Pixel.RedBias = param;
494 break;
495 case GL_GREEN_SCALE:
496 ctx->Pixel.GreenScale = param;
497 break;
498 case GL_GREEN_BIAS:
499 ctx->Pixel.GreenBias = param;
500 break;
501 case GL_BLUE_SCALE:
502 ctx->Pixel.BlueScale = param;
503 break;
504 case GL_BLUE_BIAS:
505 ctx->Pixel.BlueBias = param;
506 break;
507 case GL_ALPHA_SCALE:
508 ctx->Pixel.AlphaScale = param;
509 break;
510 case GL_ALPHA_BIAS:
511 ctx->Pixel.AlphaBias = param;
512 break;
513 case GL_DEPTH_SCALE:
514 ctx->Pixel.DepthScale = param;
515 break;
516 case GL_DEPTH_BIAS:
517 ctx->Pixel.DepthBias = param;
518 break;
519 default:
520 gl_error( ctx, GL_INVALID_ENUM, "glPixelTransfer(pname)" );
521 return;
522 }
523
524 if (ctx->Pixel.RedScale!=1.0F || ctx->Pixel.RedBias!=0.0F ||
525 ctx->Pixel.GreenScale!=1.0F || ctx->Pixel.GreenBias!=0.0F ||
526 ctx->Pixel.BlueScale!=1.0F || ctx->Pixel.BlueBias!=0.0F ||
527 ctx->Pixel.AlphaScale!=1.0F || ctx->Pixel.AlphaBias!=0.0F) {
528 ctx->Pixel.ScaleOrBiasRGBA = GL_TRUE;
529 }
530 else {
531 ctx->Pixel.ScaleOrBiasRGBA = GL_FALSE;
532 }
533}
534
535
536
537
538/*
539 * Pixel processing functions
540 */
541
542
543/*
544 * Apply scale and bias factors to an array of RGBA pixels.
545 */
546void gl_scale_and_bias_color( const GLcontext *ctx, GLuint n,
547 GLfloat red[], GLfloat green[],
548 GLfloat blue[], GLfloat alpha[] )
549{
550 GLuint i;
551 for (i=0;i<n;i++) {
552 GLfloat r = red[i] * ctx->Pixel.RedScale + ctx->Pixel.RedBias;
553 GLfloat g = green[i] * ctx->Pixel.GreenScale + ctx->Pixel.GreenBias;
554 GLfloat b = blue[i] * ctx->Pixel.BlueScale + ctx->Pixel.BlueBias;
555 GLfloat a = alpha[i] * ctx->Pixel.AlphaScale + ctx->Pixel.AlphaBias;
556 red[i] = CLAMP( r, 0.0F, 1.0F );
557 green[i] = CLAMP( g, 0.0F, 1.0F );
558 blue[i] = CLAMP( b, 0.0F, 1.0F );
559 alpha[i] = CLAMP( a, 0.0F, 1.0F );
560 }
561}
562
563
564/*
565 * Apply scale and bias factors to an array of RGBA pixels.
566 */
567void gl_scale_and_bias_rgba( const GLcontext *ctx, GLuint n, GLubyte rgba[][4] )
568{
569 GLfloat rbias = ctx->Pixel.RedBias * 255.0F;
570 GLfloat gbias = ctx->Pixel.GreenBias * 255.0F;
571 GLfloat bbias = ctx->Pixel.BlueBias * 255.0F;
572 GLfloat abias = ctx->Pixel.AlphaBias * 255.0F;
573 GLuint i;
574 for (i=0;i<n;i++) {
575 GLint r = (GLint) (rgba[i][RCOMP] * ctx->Pixel.RedScale + rbias);
576 GLint g = (GLint) (rgba[i][GCOMP] * ctx->Pixel.GreenScale + gbias);
577 GLint b = (GLint) (rgba[i][BCOMP] * ctx->Pixel.BlueScale + bbias);
578 GLint a = (GLint) (rgba[i][ACOMP] * ctx->Pixel.AlphaScale + abias);
579 rgba[i][RCOMP] = CLAMP( r, 0, 255 );
580 rgba[i][GCOMP] = CLAMP( g, 0, 255 );
581 rgba[i][BCOMP] = CLAMP( b, 0, 255 );
582 rgba[i][ACOMP] = CLAMP( a, 0, 255 );
583 }
584}
585
586
587/*
588 * Apply pixel mapping to an array of RGBA pixels.
589 */
590void gl_map_rgba( const GLcontext *ctx, GLuint n, GLubyte rgba[][4] )
591{
592 GLfloat rscale = (ctx->Pixel.MapRtoRsize - 1) / 255.0F;
593 GLfloat gscale = (ctx->Pixel.MapGtoGsize - 1) / 255.0F;
594 GLfloat bscale = (ctx->Pixel.MapBtoBsize - 1) / 255.0F;
595 GLfloat ascale = (ctx->Pixel.MapAtoAsize - 1) / 255.0F;
596 GLuint i;
597 for (i=0;i<n;i++) {
598 GLint ir = (GLint) (rgba[i][RCOMP] * rscale);
599 GLint ig = (GLint) (rgba[i][GCOMP] * gscale);
600 GLint ib = (GLint) (rgba[i][BCOMP] * bscale);
601 GLint ia = (GLint) (rgba[i][ACOMP] * ascale);
602 rgba[i][RCOMP] = (GLint) (ctx->Pixel.MapRtoR[ir] * 255.0F);
603 rgba[i][GCOMP] = (GLint) (ctx->Pixel.MapGtoG[ig] * 255.0F);
604 rgba[i][BCOMP] = (GLint) (ctx->Pixel.MapBtoB[ib] * 255.0F);
605 rgba[i][ACOMP] = (GLint) (ctx->Pixel.MapAtoA[ia] * 255.0F);
606 }
607}
608
609
610/*
611 * Apply pixel mapping to an array of RGBA pixels.
612 */
613void gl_map_color( const GLcontext *ctx, GLuint n,
614 GLfloat red[], GLfloat green[],
615 GLfloat blue[], GLfloat alpha[] )
616{
617 GLfloat rscale = ctx->Pixel.MapRtoRsize-1;
618 GLfloat gscale = ctx->Pixel.MapGtoGsize-1;
619 GLfloat bscale = ctx->Pixel.MapBtoBsize-1;
620 GLfloat ascale = ctx->Pixel.MapAtoAsize-1;
621 GLuint i;
622 for (i=0;i<n;i++) {
623 red[i] = ctx->Pixel.MapRtoR[ (GLint) (red[i] * rscale) ];
624 green[i] = ctx->Pixel.MapGtoG[ (GLint) (green[i] * gscale) ];
625 blue[i] = ctx->Pixel.MapBtoB[ (GLint) (blue[i] * bscale) ];
626 alpha[i] = ctx->Pixel.MapAtoA[ (GLint) (alpha[i] * ascale) ];
627 }
628}
629
630
631
632/*
633 * Apply color index shift and offset to an array of pixels.
634 */
635void gl_shift_and_offset_ci( const GLcontext *ctx, GLuint n, GLuint indexes[] )
636{
637 GLint shift = ctx->Pixel.IndexShift;
638 GLint offset = ctx->Pixel.IndexOffset;
639 GLuint i;
640 if (shift > 0) {
641 for (i=0;i<n;i++) {
642 indexes[i] = (indexes[i] << shift) + offset;
643 }
644 }
645 else if (shift < 0) {
646 shift = -shift;
647 for (i=0;i<n;i++) {
648 indexes[i] = (indexes[i] >> shift) + offset;
649 }
650 }
651 else {
652 for (i=0;i<n;i++) {
653 indexes[i] = indexes[i] + offset;
654 }
655 }
656}
657
658
659/*
660 * Apply color index mapping to color indexes.
661 */
662void gl_map_ci( const GLcontext *ctx, GLuint n, GLuint index[] )
663{
664 GLuint mask = ctx->Pixel.MapItoIsize - 1;
665 GLuint i;
666 for (i=0;i<n;i++) {
667 index[i] = ctx->Pixel.MapItoI[ index[i] & mask ];
668 }
669}
670
671
672/*
673 * Map color indexes to rgb values.
674 */
675void gl_map_ci_to_rgba( const GLcontext *ctx, GLuint n, const GLuint index[],
676 GLubyte rgba[][4] )
677{
678 GLuint rmask = ctx->Pixel.MapItoRsize - 1;
679 GLuint gmask = ctx->Pixel.MapItoGsize - 1;
680 GLuint bmask = ctx->Pixel.MapItoBsize - 1;
681 GLuint amask = ctx->Pixel.MapItoAsize - 1;
682 const GLubyte *rMap = ctx->Pixel.MapItoR8;
683 const GLubyte *gMap = ctx->Pixel.MapItoG8;
684 const GLubyte *bMap = ctx->Pixel.MapItoB8;
685 const GLubyte *aMap = ctx->Pixel.MapItoA8;
686 GLuint i;
687 for (i=0;i<n;i++) {
688 rgba[i][RCOMP] = rMap[index[i] & rmask];
689 rgba[i][GCOMP] = gMap[index[i] & gmask];
690 rgba[i][BCOMP] = bMap[index[i] & bmask];
691 rgba[i][ACOMP] = aMap[index[i] & amask];
692 }
693}
694
695
696/*
697 * Map 8-bit color indexes to rgb values.
698 */
699void gl_map_ci8_to_rgba( const GLcontext *ctx, GLuint n, const GLubyte index[],
700 GLubyte rgba[][4] )
701{
702 GLuint rmask = ctx->Pixel.MapItoRsize - 1;
703 GLuint gmask = ctx->Pixel.MapItoGsize - 1;
704 GLuint bmask = ctx->Pixel.MapItoBsize - 1;
705 GLuint amask = ctx->Pixel.MapItoAsize - 1;
706 const GLubyte *rMap = ctx->Pixel.MapItoR8;
707 const GLubyte *gMap = ctx->Pixel.MapItoG8;
708 const GLubyte *bMap = ctx->Pixel.MapItoB8;
709 const GLubyte *aMap = ctx->Pixel.MapItoA8;
710 GLuint i;
711 for (i=0;i<n;i++) {
712 rgba[i][RCOMP] = rMap[index[i] & rmask];
713 rgba[i][GCOMP] = gMap[index[i] & gmask];
714 rgba[i][BCOMP] = bMap[index[i] & bmask];
715 rgba[i][ACOMP] = aMap[index[i] & amask];
716 }
717}
718
719
720void gl_map_ci_to_color( const GLcontext *ctx, GLuint n, const GLuint index[],
721 GLfloat r[], GLfloat g[],
722 GLfloat b[], GLfloat a[] )
723{
724 GLuint rmask = ctx->Pixel.MapItoRsize - 1;
725 GLuint gmask = ctx->Pixel.MapItoGsize - 1;
726 GLuint bmask = ctx->Pixel.MapItoBsize - 1;
727 GLuint amask = ctx->Pixel.MapItoAsize - 1;
728 GLuint i;
729 for (i=0;i<n;i++) {
730 r[i] = ctx->Pixel.MapItoR[index[i] & rmask];
731 g[i] = ctx->Pixel.MapItoG[index[i] & gmask];
732 b[i] = ctx->Pixel.MapItoB[index[i] & bmask];
733 a[i] = ctx->Pixel.MapItoA[index[i] & amask];
734 }
735}
736
737
738
739void gl_shift_and_offset_stencil( const GLcontext *ctx, GLuint n,
740 GLstencil stencil[] )
741{
742 GLuint i;
743 GLint shift = ctx->Pixel.IndexShift;
744 GLint offset = ctx->Pixel.IndexOffset;
745 if (shift > 0) {
746 for (i=0;i<n;i++) {
747 stencil[i] = (stencil[i] << shift) + offset;
748 }
749 }
750 else if (shift < 0) {
751 shift = -shift;
752 for (i=0;i<n;i++) {
753 stencil[i] = (stencil[i] >> shift) + offset;
754 }
755 }
756 else {
757 for (i=0;i<n;i++) {
758 stencil[i] = stencil[i] + offset;
759 }
760 }
761
762}
763
764
765
766void gl_map_stencil( const GLcontext *ctx, GLuint n, GLstencil stencil[] )
767{
768 GLuint mask = ctx->Pixel.MapStoSsize - 1;
769 GLuint i;
770 for (i=0;i<n;i++) {
771 stencil[i] = ctx->Pixel.MapStoS[ stencil[i] & mask ];
772 }
773}
774