blob: 852215730479ee8f3124d6de253b014ca8bc045b [file] [log] [blame]
Brian Paulc5b99502002-09-21 16:51:25 +00001/* $Id: pixel.c,v 1.35 2002/09/21 16:51:25 brianp Exp $ */
jtgafb833d1999-08-19 00:55:39 +00002
3/*
4 * Mesa 3-D graphics library
Brian Paulaecfb512001-12-04 23:45:31 +00005 * Version: 4.1
Jouk Jansen5e3bc0c2000-11-22 07:32:16 +00006 *
Brian Pauldf7bd4b2002-04-24 20:11:20 +00007 * Copyright (C) 1999-2002 Brian Paul All Rights Reserved.
Jouk Jansen5e3bc0c2000-11-22 07:32:16 +00008 *
jtgafb833d1999-08-19 00:55:39 +00009 * 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:
Jouk Jansen5e3bc0c2000-11-22 07:32:16 +000015 *
jtgafb833d1999-08-19 00:55:39 +000016 * The above copyright notice and this permission notice shall be included
17 * in all copies or substantial portions of the Software.
Jouk Jansen5e3bc0c2000-11-22 07:32:16 +000018 *
jtgafb833d1999-08-19 00:55:39 +000019 * 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"
Brian Paulc893a012000-10-28 20:41:13 +000032#include "colormac.h"
jtgafb833d1999-08-19 00:55:39 +000033#include "context.h"
34#include "macros.h"
Brian Paulfbd8f211999-11-11 01:22:25 +000035#include "mem.h"
jtgafb833d1999-08-19 00:55:39 +000036#include "pixel.h"
Jouk Jansen5e3bc0c2000-11-22 07:32:16 +000037#include "mtypes.h"
jtgafb833d1999-08-19 00:55:39 +000038#endif
39
40
41
42/**********************************************************************/
43/***** glPixelZoom *****/
44/**********************************************************************/
45
46
47
Brian Paulfbd8f211999-11-11 01:22:25 +000048void
49_mesa_PixelZoom( GLfloat xfactor, GLfloat yfactor )
jtgafb833d1999-08-19 00:55:39 +000050{
Brian Paulfbd8f211999-11-11 01:22:25 +000051 GET_CURRENT_CONTEXT(ctx);
jtgafb833d1999-08-19 00:55:39 +000052
Keith Whitwellcab974c2000-12-26 05:09:27 +000053 if (ctx->Pixel.ZoomX == xfactor &&
54 ctx->Pixel.ZoomY == yfactor)
55 return;
56
57 FLUSH_VERTICES(ctx, _NEW_PIXEL);
jtgafb833d1999-08-19 00:55:39 +000058 ctx->Pixel.ZoomX = xfactor;
59 ctx->Pixel.ZoomY = yfactor;
60}
61
62
63
64/**********************************************************************/
65/***** glPixelStore *****/
66/**********************************************************************/
67
68
Brian Paulfbd8f211999-11-11 01:22:25 +000069void
70_mesa_PixelStorei( GLenum pname, GLint param )
jtgafb833d1999-08-19 00:55:39 +000071{
72 /* NOTE: this call can't be compiled into the display list */
Brian Paulfbd8f211999-11-11 01:22:25 +000073 GET_CURRENT_CONTEXT(ctx);
Keith Whitwellcab974c2000-12-26 05:09:27 +000074 ASSERT_OUTSIDE_BEGIN_END(ctx);
jtgafb833d1999-08-19 00:55:39 +000075
jtgafb833d1999-08-19 00:55:39 +000076 switch (pname) {
77 case GL_PACK_SWAP_BYTES:
Gareth Hughes22144ab2001-03-12 00:48:37 +000078 if (param == (GLint)ctx->Pack.SwapBytes)
Keith Whitwellcab974c2000-12-26 05:09:27 +000079 return;
80 FLUSH_VERTICES(ctx, _NEW_PACKUNPACK);
jtgafb833d1999-08-19 00:55:39 +000081 ctx->Pack.SwapBytes = param ? GL_TRUE : GL_FALSE;
82 break;
83 case GL_PACK_LSB_FIRST:
Gareth Hughes22144ab2001-03-12 00:48:37 +000084 if (param == (GLint)ctx->Pack.LsbFirst)
Keith Whitwellcab974c2000-12-26 05:09:27 +000085 return;
86 FLUSH_VERTICES(ctx, _NEW_PACKUNPACK);
jtgafb833d1999-08-19 00:55:39 +000087 ctx->Pack.LsbFirst = param ? GL_TRUE : GL_FALSE;
88 break;
89 case GL_PACK_ROW_LENGTH:
90 if (param<0) {
Brian Paul08836342001-03-03 20:33:27 +000091 _mesa_error( ctx, GL_INVALID_VALUE, "glPixelStore(param)" );
Keith Whitwellcab974c2000-12-26 05:09:27 +000092 return;
jtgafb833d1999-08-19 00:55:39 +000093 }
Keith Whitwellcab974c2000-12-26 05:09:27 +000094 if (ctx->Pack.RowLength == param)
95 return;
96 FLUSH_VERTICES(ctx, _NEW_PACKUNPACK);
97 ctx->Pack.RowLength = param;
jtgafb833d1999-08-19 00:55:39 +000098 break;
99 case GL_PACK_IMAGE_HEIGHT:
Keith Whitwellcab974c2000-12-26 05:09:27 +0000100 if (param<0) {
Brian Paul08836342001-03-03 20:33:27 +0000101 _mesa_error( ctx, GL_INVALID_VALUE, "glPixelStore(param)" );
Keith Whitwellcab974c2000-12-26 05:09:27 +0000102 return;
103 }
104 if (ctx->Pack.ImageHeight == param)
105 return;
106 FLUSH_VERTICES(ctx, _NEW_PACKUNPACK);
107 ctx->Pack.ImageHeight = param;
jtgafb833d1999-08-19 00:55:39 +0000108 break;
109 case GL_PACK_SKIP_PIXELS:
110 if (param<0) {
Brian Paul08836342001-03-03 20:33:27 +0000111 _mesa_error( ctx, GL_INVALID_VALUE, "glPixelStore(param)" );
Keith Whitwellcab974c2000-12-26 05:09:27 +0000112 return;
jtgafb833d1999-08-19 00:55:39 +0000113 }
Keith Whitwellcab974c2000-12-26 05:09:27 +0000114 if (ctx->Pack.SkipPixels == param)
115 return;
116 FLUSH_VERTICES(ctx, _NEW_PACKUNPACK);
117 ctx->Pack.SkipPixels = param;
jtgafb833d1999-08-19 00:55:39 +0000118 break;
119 case GL_PACK_SKIP_ROWS:
120 if (param<0) {
Brian Paul08836342001-03-03 20:33:27 +0000121 _mesa_error( ctx, GL_INVALID_VALUE, "glPixelStore(param)" );
Keith Whitwellcab974c2000-12-26 05:09:27 +0000122 return;
jtgafb833d1999-08-19 00:55:39 +0000123 }
Keith Whitwellcab974c2000-12-26 05:09:27 +0000124 if (ctx->Pack.SkipRows == param)
125 return;
126 FLUSH_VERTICES(ctx, _NEW_PACKUNPACK);
127 ctx->Pack.SkipRows = param;
jtgafb833d1999-08-19 00:55:39 +0000128 break;
Brian Paula5b66332000-10-19 20:09:47 +0000129 case GL_PACK_SKIP_IMAGES:
130 if (param<0) {
Brian Paul08836342001-03-03 20:33:27 +0000131 _mesa_error( ctx, GL_INVALID_VALUE, "glPixelStore(param)" );
Keith Whitwellcab974c2000-12-26 05:09:27 +0000132 return;
Brian Paula5b66332000-10-19 20:09:47 +0000133 }
Keith Whitwellcab974c2000-12-26 05:09:27 +0000134 if (ctx->Pack.SkipImages == param)
135 return;
136 FLUSH_VERTICES(ctx, _NEW_PACKUNPACK);
137 ctx->Pack.SkipImages = param;
Brian Paula5b66332000-10-19 20:09:47 +0000138 break;
jtgafb833d1999-08-19 00:55:39 +0000139 case GL_PACK_ALIGNMENT:
Keith Whitwellcab974c2000-12-26 05:09:27 +0000140 if (param!=1 && param!=2 && param!=4 && param!=8) {
Brian Paul08836342001-03-03 20:33:27 +0000141 _mesa_error( ctx, GL_INVALID_VALUE, "glPixelStore(param)" );
Keith Whitwellcab974c2000-12-26 05:09:27 +0000142 return;
jtgafb833d1999-08-19 00:55:39 +0000143 }
Keith Whitwellcab974c2000-12-26 05:09:27 +0000144 if (ctx->Pack.Alignment == param)
145 return;
146 FLUSH_VERTICES(ctx, _NEW_PACKUNPACK);
147 ctx->Pack.Alignment = param;
jtgafb833d1999-08-19 00:55:39 +0000148 break;
149 case GL_UNPACK_SWAP_BYTES:
Gareth Hughes22144ab2001-03-12 00:48:37 +0000150 if (param == (GLint)ctx->Unpack.SwapBytes)
Keith Whitwellcab974c2000-12-26 05:09:27 +0000151 return;
152 if ((GLint)ctx->Unpack.SwapBytes == param)
153 return;
154 FLUSH_VERTICES(ctx, _NEW_PACKUNPACK);
jtgafb833d1999-08-19 00:55:39 +0000155 ctx->Unpack.SwapBytes = param ? GL_TRUE : GL_FALSE;
156 break;
157 case GL_UNPACK_LSB_FIRST:
Gareth Hughes22144ab2001-03-12 00:48:37 +0000158 if (param == (GLint)ctx->Unpack.LsbFirst)
Keith Whitwellcab974c2000-12-26 05:09:27 +0000159 return;
160 if ((GLint)ctx->Unpack.LsbFirst == param)
161 return;
162 FLUSH_VERTICES(ctx, _NEW_PACKUNPACK);
jtgafb833d1999-08-19 00:55:39 +0000163 ctx->Unpack.LsbFirst = param ? GL_TRUE : GL_FALSE;
164 break;
165 case GL_UNPACK_ROW_LENGTH:
166 if (param<0) {
Brian Paul08836342001-03-03 20:33:27 +0000167 _mesa_error( ctx, GL_INVALID_VALUE, "glPixelStore(param)" );
Keith Whitwellcab974c2000-12-26 05:09:27 +0000168 return;
jtgafb833d1999-08-19 00:55:39 +0000169 }
Keith Whitwellcab974c2000-12-26 05:09:27 +0000170 if (ctx->Unpack.RowLength == param)
171 return;
172 FLUSH_VERTICES(ctx, _NEW_PACKUNPACK);
173 ctx->Unpack.RowLength = param;
jtgafb833d1999-08-19 00:55:39 +0000174 break;
175 case GL_UNPACK_IMAGE_HEIGHT:
Keith Whitwellcab974c2000-12-26 05:09:27 +0000176 if (param<0) {
Brian Paul08836342001-03-03 20:33:27 +0000177 _mesa_error( ctx, GL_INVALID_VALUE, "glPixelStore(param)" );
Keith Whitwellcab974c2000-12-26 05:09:27 +0000178 return;
179 }
180 if (ctx->Unpack.ImageHeight == param)
181 return;
182
183 FLUSH_VERTICES(ctx, _NEW_PACKUNPACK);
184 ctx->Unpack.ImageHeight = param;
jtgafb833d1999-08-19 00:55:39 +0000185 break;
186 case GL_UNPACK_SKIP_PIXELS:
187 if (param<0) {
Brian Paul08836342001-03-03 20:33:27 +0000188 _mesa_error( ctx, GL_INVALID_VALUE, "glPixelStore(param)" );
Keith Whitwellcab974c2000-12-26 05:09:27 +0000189 return;
jtgafb833d1999-08-19 00:55:39 +0000190 }
Keith Whitwellcab974c2000-12-26 05:09:27 +0000191 if (ctx->Unpack.SkipPixels == param)
192 return;
193 FLUSH_VERTICES(ctx, _NEW_PACKUNPACK);
194 ctx->Unpack.SkipPixels = param;
jtgafb833d1999-08-19 00:55:39 +0000195 break;
196 case GL_UNPACK_SKIP_ROWS:
197 if (param<0) {
Brian Paul08836342001-03-03 20:33:27 +0000198 _mesa_error( ctx, GL_INVALID_VALUE, "glPixelStore(param)" );
Keith Whitwellcab974c2000-12-26 05:09:27 +0000199 return;
jtgafb833d1999-08-19 00:55:39 +0000200 }
Keith Whitwellcab974c2000-12-26 05:09:27 +0000201 if (ctx->Unpack.SkipRows == param)
202 return;
203 FLUSH_VERTICES(ctx, _NEW_PACKUNPACK);
204 ctx->Unpack.SkipRows = param;
jtgafb833d1999-08-19 00:55:39 +0000205 break;
Brian Paula5b66332000-10-19 20:09:47 +0000206 case GL_UNPACK_SKIP_IMAGES:
207 if (param < 0) {
Brian Paul08836342001-03-03 20:33:27 +0000208 _mesa_error( ctx, GL_INVALID_VALUE, "glPixelStore(param)" );
Keith Whitwellcab974c2000-12-26 05:09:27 +0000209 return;
Brian Paula5b66332000-10-19 20:09:47 +0000210 }
Keith Whitwellcab974c2000-12-26 05:09:27 +0000211 if (ctx->Unpack.SkipImages == param)
212 return;
213 FLUSH_VERTICES(ctx, _NEW_PACKUNPACK);
214 ctx->Unpack.SkipImages = param;
Brian Paula5b66332000-10-19 20:09:47 +0000215 break;
jtgafb833d1999-08-19 00:55:39 +0000216 case GL_UNPACK_ALIGNMENT:
Keith Whitwellcab974c2000-12-26 05:09:27 +0000217 if (param!=1 && param!=2 && param!=4 && param!=8) {
Brian Paul08836342001-03-03 20:33:27 +0000218 _mesa_error( ctx, GL_INVALID_VALUE, "glPixelStore" );
Keith Whitwellcab974c2000-12-26 05:09:27 +0000219 return;
jtgafb833d1999-08-19 00:55:39 +0000220 }
Keith Whitwellcab974c2000-12-26 05:09:27 +0000221 if (ctx->Unpack.Alignment == param)
222 return;
223 FLUSH_VERTICES(ctx, _NEW_PACKUNPACK);
224 ctx->Unpack.Alignment = param;
jtgafb833d1999-08-19 00:55:39 +0000225 break;
Brian Paulc5b99502002-09-21 16:51:25 +0000226 case GL_UNPACK_CLIENT_STORAGE_APPLE:
227 if (param == (GLint)ctx->Unpack.ClientStorage)
228 return;
229 FLUSH_VERTICES(ctx, _NEW_PACKUNPACK);
230 ctx->Unpack.ClientStorage = param ? GL_TRUE : GL_FALSE;
231 break;
jtgafb833d1999-08-19 00:55:39 +0000232 default:
Brian Paul08836342001-03-03 20:33:27 +0000233 _mesa_error( ctx, GL_INVALID_ENUM, "glPixelStore" );
Keith Whitwellcab974c2000-12-26 05:09:27 +0000234 return;
jtgafb833d1999-08-19 00:55:39 +0000235 }
236}
237
238
Brian Paulfbd8f211999-11-11 01:22:25 +0000239void
240_mesa_PixelStoref( GLenum pname, GLfloat param )
241{
242 _mesa_PixelStorei( pname, (GLint) param );
243}
jtgafb833d1999-08-19 00:55:39 +0000244
245
246
247/**********************************************************************/
248/***** glPixelMap *****/
249/**********************************************************************/
250
251
252
Brian Paulfbd8f211999-11-11 01:22:25 +0000253void
254_mesa_PixelMapfv( GLenum map, GLint mapsize, const GLfloat *values )
jtgafb833d1999-08-19 00:55:39 +0000255{
256 GLint i;
Brian Paulfbd8f211999-11-11 01:22:25 +0000257 GET_CURRENT_CONTEXT(ctx);
Keith Whitwellcab974c2000-12-26 05:09:27 +0000258 ASSERT_OUTSIDE_BEGIN_END(ctx);
jtgafb833d1999-08-19 00:55:39 +0000259
Brian Pauldf7bd4b2002-04-24 20:11:20 +0000260 if (mapsize < 1 || mapsize > MAX_PIXEL_MAP_TABLE) {
Brian Paul08836342001-03-03 20:33:27 +0000261 _mesa_error( ctx, GL_INVALID_VALUE, "glPixelMapfv(mapsize)" );
jtgafb833d1999-08-19 00:55:39 +0000262 return;
263 }
264
Brian Pauldf7bd4b2002-04-24 20:11:20 +0000265 if (map >= GL_PIXEL_MAP_S_TO_S && map <= GL_PIXEL_MAP_I_TO_A) {
jtgafb833d1999-08-19 00:55:39 +0000266 /* test that mapsize is a power of two */
Brian Paulaecfb512001-12-04 23:45:31 +0000267 if (_mesa_bitcount((GLuint) mapsize) != 1) {
Brian Paul08836342001-03-03 20:33:27 +0000268 _mesa_error( ctx, GL_INVALID_VALUE, "glPixelMapfv(mapsize)" );
jtgafb833d1999-08-19 00:55:39 +0000269 return;
270 }
271 }
272
Keith Whitwellcab974c2000-12-26 05:09:27 +0000273 FLUSH_VERTICES(ctx, _NEW_PIXEL);
274
jtgafb833d1999-08-19 00:55:39 +0000275 switch (map) {
276 case GL_PIXEL_MAP_S_TO_S:
277 ctx->Pixel.MapStoSsize = mapsize;
278 for (i=0;i<mapsize;i++) {
279 ctx->Pixel.MapStoS[i] = (GLint) values[i];
280 }
281 break;
282 case GL_PIXEL_MAP_I_TO_I:
283 ctx->Pixel.MapItoIsize = mapsize;
284 for (i=0;i<mapsize;i++) {
285 ctx->Pixel.MapItoI[i] = (GLint) values[i];
286 }
287 break;
288 case GL_PIXEL_MAP_I_TO_R:
289 ctx->Pixel.MapItoRsize = mapsize;
290 for (i=0;i<mapsize;i++) {
Karl Schultz94a6ec82001-09-18 16:16:21 +0000291 GLfloat val = CLAMP( values[i], 0.0F, 1.0F );
jtgafb833d1999-08-19 00:55:39 +0000292 ctx->Pixel.MapItoR[i] = val;
293 ctx->Pixel.MapItoR8[i] = (GLint) (val * 255.0F);
294 }
295 break;
296 case GL_PIXEL_MAP_I_TO_G:
297 ctx->Pixel.MapItoGsize = mapsize;
298 for (i=0;i<mapsize;i++) {
Karl Schultz94a6ec82001-09-18 16:16:21 +0000299 GLfloat val = CLAMP( values[i], 0.0F, 1.0F );
jtgafb833d1999-08-19 00:55:39 +0000300 ctx->Pixel.MapItoG[i] = val;
301 ctx->Pixel.MapItoG8[i] = (GLint) (val * 255.0F);
302 }
303 break;
304 case GL_PIXEL_MAP_I_TO_B:
305 ctx->Pixel.MapItoBsize = mapsize;
306 for (i=0;i<mapsize;i++) {
Karl Schultz94a6ec82001-09-18 16:16:21 +0000307 GLfloat val = CLAMP( values[i], 0.0F, 1.0F );
jtgafb833d1999-08-19 00:55:39 +0000308 ctx->Pixel.MapItoB[i] = val;
309 ctx->Pixel.MapItoB8[i] = (GLint) (val * 255.0F);
310 }
311 break;
312 case GL_PIXEL_MAP_I_TO_A:
313 ctx->Pixel.MapItoAsize = mapsize;
314 for (i=0;i<mapsize;i++) {
Karl Schultz94a6ec82001-09-18 16:16:21 +0000315 GLfloat val = CLAMP( values[i], 0.0F, 1.0F );
jtgafb833d1999-08-19 00:55:39 +0000316 ctx->Pixel.MapItoA[i] = val;
317 ctx->Pixel.MapItoA8[i] = (GLint) (val * 255.0F);
318 }
319 break;
320 case GL_PIXEL_MAP_R_TO_R:
321 ctx->Pixel.MapRtoRsize = mapsize;
322 for (i=0;i<mapsize;i++) {
Karl Schultz94a6ec82001-09-18 16:16:21 +0000323 ctx->Pixel.MapRtoR[i] = CLAMP( values[i], 0.0F, 1.0F );
jtgafb833d1999-08-19 00:55:39 +0000324 }
325 break;
326 case GL_PIXEL_MAP_G_TO_G:
327 ctx->Pixel.MapGtoGsize = mapsize;
328 for (i=0;i<mapsize;i++) {
Karl Schultz94a6ec82001-09-18 16:16:21 +0000329 ctx->Pixel.MapGtoG[i] = CLAMP( values[i], 0.0F, 1.0F );
jtgafb833d1999-08-19 00:55:39 +0000330 }
331 break;
332 case GL_PIXEL_MAP_B_TO_B:
333 ctx->Pixel.MapBtoBsize = mapsize;
334 for (i=0;i<mapsize;i++) {
Karl Schultz94a6ec82001-09-18 16:16:21 +0000335 ctx->Pixel.MapBtoB[i] = CLAMP( values[i], 0.0F, 1.0F );
jtgafb833d1999-08-19 00:55:39 +0000336 }
337 break;
338 case GL_PIXEL_MAP_A_TO_A:
339 ctx->Pixel.MapAtoAsize = mapsize;
340 for (i=0;i<mapsize;i++) {
Karl Schultz94a6ec82001-09-18 16:16:21 +0000341 ctx->Pixel.MapAtoA[i] = CLAMP( values[i], 0.0F, 1.0F );
jtgafb833d1999-08-19 00:55:39 +0000342 }
343 break;
344 default:
Brian Paul08836342001-03-03 20:33:27 +0000345 _mesa_error( ctx, GL_INVALID_ENUM, "glPixelMapfv(map)" );
jtgafb833d1999-08-19 00:55:39 +0000346 }
347}
348
349
350
Brian Paulfbd8f211999-11-11 01:22:25 +0000351void
352_mesa_PixelMapuiv(GLenum map, GLint mapsize, const GLuint *values )
jtgafb833d1999-08-19 00:55:39 +0000353{
Brian Paulaecfb512001-12-04 23:45:31 +0000354 const GLint n = MIN2(mapsize, MAX_PIXEL_MAP_TABLE);
Brian Paulfbd8f211999-11-11 01:22:25 +0000355 GLfloat fvalues[MAX_PIXEL_MAP_TABLE];
356 GLint i;
357 if (map==GL_PIXEL_MAP_I_TO_I || map==GL_PIXEL_MAP_S_TO_S) {
Brian Paulaecfb512001-12-04 23:45:31 +0000358 for (i=0;i<n;i++) {
Brian Paulfbd8f211999-11-11 01:22:25 +0000359 fvalues[i] = (GLfloat) values[i];
360 }
361 }
362 else {
Brian Paulaecfb512001-12-04 23:45:31 +0000363 for (i=0;i<n;i++) {
Brian Paulfbd8f211999-11-11 01:22:25 +0000364 fvalues[i] = UINT_TO_FLOAT( values[i] );
365 }
366 }
367 _mesa_PixelMapfv(map, mapsize, fvalues);
368}
369
370
371
372void
373_mesa_PixelMapusv(GLenum map, GLint mapsize, const GLushort *values )
374{
Brian Paulaecfb512001-12-04 23:45:31 +0000375 const GLint n = MIN2(mapsize, MAX_PIXEL_MAP_TABLE);
Brian Paulfbd8f211999-11-11 01:22:25 +0000376 GLfloat fvalues[MAX_PIXEL_MAP_TABLE];
377 GLint i;
378 if (map==GL_PIXEL_MAP_I_TO_I || map==GL_PIXEL_MAP_S_TO_S) {
Brian Paulaecfb512001-12-04 23:45:31 +0000379 for (i=0;i<n;i++) {
Brian Paulfbd8f211999-11-11 01:22:25 +0000380 fvalues[i] = (GLfloat) values[i];
381 }
382 }
383 else {
Brian Paulaecfb512001-12-04 23:45:31 +0000384 for (i=0;i<n;i++) {
Brian Paulfbd8f211999-11-11 01:22:25 +0000385 fvalues[i] = USHORT_TO_FLOAT( values[i] );
386 }
387 }
388 _mesa_PixelMapfv(map, mapsize, fvalues);
389}
390
391
392
393void
394_mesa_GetPixelMapfv( GLenum map, GLfloat *values )
395{
396 GET_CURRENT_CONTEXT(ctx);
jtgafb833d1999-08-19 00:55:39 +0000397 GLint i;
Keith Whitwellcab974c2000-12-26 05:09:27 +0000398 ASSERT_OUTSIDE_BEGIN_END(ctx);
jtgafb833d1999-08-19 00:55:39 +0000399
400 switch (map) {
401 case GL_PIXEL_MAP_I_TO_I:
402 for (i=0;i<ctx->Pixel.MapItoIsize;i++) {
403 values[i] = (GLfloat) ctx->Pixel.MapItoI[i];
404 }
405 break;
406 case GL_PIXEL_MAP_S_TO_S:
407 for (i=0;i<ctx->Pixel.MapStoSsize;i++) {
408 values[i] = (GLfloat) ctx->Pixel.MapStoS[i];
409 }
410 break;
411 case GL_PIXEL_MAP_I_TO_R:
412 MEMCPY(values,ctx->Pixel.MapItoR,ctx->Pixel.MapItoRsize*sizeof(GLfloat));
413 break;
414 case GL_PIXEL_MAP_I_TO_G:
415 MEMCPY(values,ctx->Pixel.MapItoG,ctx->Pixel.MapItoGsize*sizeof(GLfloat));
416 break;
417 case GL_PIXEL_MAP_I_TO_B:
418 MEMCPY(values,ctx->Pixel.MapItoB,ctx->Pixel.MapItoBsize*sizeof(GLfloat));
419 break;
420 case GL_PIXEL_MAP_I_TO_A:
421 MEMCPY(values,ctx->Pixel.MapItoA,ctx->Pixel.MapItoAsize*sizeof(GLfloat));
422 break;
423 case GL_PIXEL_MAP_R_TO_R:
424 MEMCPY(values,ctx->Pixel.MapRtoR,ctx->Pixel.MapRtoRsize*sizeof(GLfloat));
425 break;
426 case GL_PIXEL_MAP_G_TO_G:
427 MEMCPY(values,ctx->Pixel.MapGtoG,ctx->Pixel.MapGtoGsize*sizeof(GLfloat));
428 break;
429 case GL_PIXEL_MAP_B_TO_B:
430 MEMCPY(values,ctx->Pixel.MapBtoB,ctx->Pixel.MapBtoBsize*sizeof(GLfloat));
431 break;
432 case GL_PIXEL_MAP_A_TO_A:
433 MEMCPY(values,ctx->Pixel.MapAtoA,ctx->Pixel.MapAtoAsize*sizeof(GLfloat));
434 break;
435 default:
Brian Paul08836342001-03-03 20:33:27 +0000436 _mesa_error( ctx, GL_INVALID_ENUM, "glGetPixelMapfv" );
jtgafb833d1999-08-19 00:55:39 +0000437 }
438}
439
440
Brian Paulfbd8f211999-11-11 01:22:25 +0000441void
442_mesa_GetPixelMapuiv( GLenum map, GLuint *values )
jtgafb833d1999-08-19 00:55:39 +0000443{
Brian Paulfbd8f211999-11-11 01:22:25 +0000444 GET_CURRENT_CONTEXT(ctx);
jtgafb833d1999-08-19 00:55:39 +0000445 GLint i;
Keith Whitwellcab974c2000-12-26 05:09:27 +0000446 ASSERT_OUTSIDE_BEGIN_END(ctx);
jtgafb833d1999-08-19 00:55:39 +0000447
448 switch (map) {
449 case GL_PIXEL_MAP_I_TO_I:
450 MEMCPY(values, ctx->Pixel.MapItoI, ctx->Pixel.MapItoIsize*sizeof(GLint));
451 break;
452 case GL_PIXEL_MAP_S_TO_S:
453 MEMCPY(values, ctx->Pixel.MapStoS, ctx->Pixel.MapStoSsize*sizeof(GLint));
454 break;
455 case GL_PIXEL_MAP_I_TO_R:
456 for (i=0;i<ctx->Pixel.MapItoRsize;i++) {
457 values[i] = FLOAT_TO_UINT( ctx->Pixel.MapItoR[i] );
458 }
459 break;
460 case GL_PIXEL_MAP_I_TO_G:
461 for (i=0;i<ctx->Pixel.MapItoGsize;i++) {
462 values[i] = FLOAT_TO_UINT( ctx->Pixel.MapItoG[i] );
463 }
464 break;
465 case GL_PIXEL_MAP_I_TO_B:
466 for (i=0;i<ctx->Pixel.MapItoBsize;i++) {
467 values[i] = FLOAT_TO_UINT( ctx->Pixel.MapItoB[i] );
468 }
469 break;
470 case GL_PIXEL_MAP_I_TO_A:
471 for (i=0;i<ctx->Pixel.MapItoAsize;i++) {
472 values[i] = FLOAT_TO_UINT( ctx->Pixel.MapItoA[i] );
473 }
474 break;
475 case GL_PIXEL_MAP_R_TO_R:
476 for (i=0;i<ctx->Pixel.MapRtoRsize;i++) {
477 values[i] = FLOAT_TO_UINT( ctx->Pixel.MapRtoR[i] );
478 }
479 break;
480 case GL_PIXEL_MAP_G_TO_G:
481 for (i=0;i<ctx->Pixel.MapGtoGsize;i++) {
482 values[i] = FLOAT_TO_UINT( ctx->Pixel.MapGtoG[i] );
483 }
484 break;
485 case GL_PIXEL_MAP_B_TO_B:
486 for (i=0;i<ctx->Pixel.MapBtoBsize;i++) {
487 values[i] = FLOAT_TO_UINT( ctx->Pixel.MapBtoB[i] );
488 }
489 break;
490 case GL_PIXEL_MAP_A_TO_A:
491 for (i=0;i<ctx->Pixel.MapAtoAsize;i++) {
492 values[i] = FLOAT_TO_UINT( ctx->Pixel.MapAtoA[i] );
493 }
494 break;
495 default:
Brian Paul08836342001-03-03 20:33:27 +0000496 _mesa_error( ctx, GL_INVALID_ENUM, "glGetPixelMapfv" );
jtgafb833d1999-08-19 00:55:39 +0000497 }
498}
499
500
Brian Paulfbd8f211999-11-11 01:22:25 +0000501void
502_mesa_GetPixelMapusv( GLenum map, GLushort *values )
jtgafb833d1999-08-19 00:55:39 +0000503{
Brian Paulfbd8f211999-11-11 01:22:25 +0000504 GET_CURRENT_CONTEXT(ctx);
jtgafb833d1999-08-19 00:55:39 +0000505 GLint i;
Keith Whitwellcab974c2000-12-26 05:09:27 +0000506 ASSERT_OUTSIDE_BEGIN_END(ctx);
jtgafb833d1999-08-19 00:55:39 +0000507
508 switch (map) {
509 case GL_PIXEL_MAP_I_TO_I:
510 for (i=0;i<ctx->Pixel.MapItoIsize;i++) {
511 values[i] = (GLushort) ctx->Pixel.MapItoI[i];
512 }
513 break;
514 case GL_PIXEL_MAP_S_TO_S:
515 for (i=0;i<ctx->Pixel.MapStoSsize;i++) {
516 values[i] = (GLushort) ctx->Pixel.MapStoS[i];
517 }
518 break;
519 case GL_PIXEL_MAP_I_TO_R:
520 for (i=0;i<ctx->Pixel.MapItoRsize;i++) {
521 values[i] = FLOAT_TO_USHORT( ctx->Pixel.MapItoR[i] );
522 }
523 break;
524 case GL_PIXEL_MAP_I_TO_G:
525 for (i=0;i<ctx->Pixel.MapItoGsize;i++) {
526 values[i] = FLOAT_TO_USHORT( ctx->Pixel.MapItoG[i] );
527 }
528 break;
529 case GL_PIXEL_MAP_I_TO_B:
530 for (i=0;i<ctx->Pixel.MapItoBsize;i++) {
531 values[i] = FLOAT_TO_USHORT( ctx->Pixel.MapItoB[i] );
532 }
533 break;
534 case GL_PIXEL_MAP_I_TO_A:
535 for (i=0;i<ctx->Pixel.MapItoAsize;i++) {
536 values[i] = FLOAT_TO_USHORT( ctx->Pixel.MapItoA[i] );
537 }
538 break;
539 case GL_PIXEL_MAP_R_TO_R:
540 for (i=0;i<ctx->Pixel.MapRtoRsize;i++) {
541 values[i] = FLOAT_TO_USHORT( ctx->Pixel.MapRtoR[i] );
542 }
543 break;
544 case GL_PIXEL_MAP_G_TO_G:
545 for (i=0;i<ctx->Pixel.MapGtoGsize;i++) {
546 values[i] = FLOAT_TO_USHORT( ctx->Pixel.MapGtoG[i] );
547 }
548 break;
549 case GL_PIXEL_MAP_B_TO_B:
550 for (i=0;i<ctx->Pixel.MapBtoBsize;i++) {
551 values[i] = FLOAT_TO_USHORT( ctx->Pixel.MapBtoB[i] );
552 }
553 break;
554 case GL_PIXEL_MAP_A_TO_A:
555 for (i=0;i<ctx->Pixel.MapAtoAsize;i++) {
556 values[i] = FLOAT_TO_USHORT( ctx->Pixel.MapAtoA[i] );
557 }
558 break;
559 default:
Brian Paul08836342001-03-03 20:33:27 +0000560 _mesa_error( ctx, GL_INVALID_ENUM, "glGetPixelMapfv" );
jtgafb833d1999-08-19 00:55:39 +0000561 }
562}
563
564
565
566/**********************************************************************/
567/***** glPixelTransfer *****/
568/**********************************************************************/
569
570
571/*
572 * Implements glPixelTransfer[fi] whether called immediately or from a
573 * display list.
574 */
Brian Paulfbd8f211999-11-11 01:22:25 +0000575void
576_mesa_PixelTransferf( GLenum pname, GLfloat param )
jtgafb833d1999-08-19 00:55:39 +0000577{
Brian Paulfbd8f211999-11-11 01:22:25 +0000578 GET_CURRENT_CONTEXT(ctx);
Keith Whitwellcab974c2000-12-26 05:09:27 +0000579 ASSERT_OUTSIDE_BEGIN_END(ctx);
jtgafb833d1999-08-19 00:55:39 +0000580
581 switch (pname) {
582 case GL_MAP_COLOR:
Brian Paulf431a3f2001-07-13 20:07:37 +0000583 if (ctx->Pixel.MapColorFlag == (param ? GL_TRUE : GL_FALSE))
Keith Whitwellcab974c2000-12-26 05:09:27 +0000584 return;
585 FLUSH_VERTICES(ctx, _NEW_PIXEL);
jtgafb833d1999-08-19 00:55:39 +0000586 ctx->Pixel.MapColorFlag = param ? GL_TRUE : GL_FALSE;
587 break;
588 case GL_MAP_STENCIL:
Brian Paulf431a3f2001-07-13 20:07:37 +0000589 if (ctx->Pixel.MapStencilFlag == (param ? GL_TRUE : GL_FALSE))
Keith Whitwellcab974c2000-12-26 05:09:27 +0000590 return;
591 FLUSH_VERTICES(ctx, _NEW_PIXEL);
jtgafb833d1999-08-19 00:55:39 +0000592 ctx->Pixel.MapStencilFlag = param ? GL_TRUE : GL_FALSE;
593 break;
594 case GL_INDEX_SHIFT:
Keith Whitwellcab974c2000-12-26 05:09:27 +0000595 if (ctx->Pixel.IndexShift == (GLint) param)
596 return;
597 FLUSH_VERTICES(ctx, _NEW_PIXEL);
jtgafb833d1999-08-19 00:55:39 +0000598 ctx->Pixel.IndexShift = (GLint) param;
599 break;
600 case GL_INDEX_OFFSET:
Keith Whitwellcab974c2000-12-26 05:09:27 +0000601 if (ctx->Pixel.IndexOffset == (GLint) param)
602 return;
603 FLUSH_VERTICES(ctx, _NEW_PIXEL);
jtgafb833d1999-08-19 00:55:39 +0000604 ctx->Pixel.IndexOffset = (GLint) param;
605 break;
606 case GL_RED_SCALE:
Keith Whitwellcab974c2000-12-26 05:09:27 +0000607 if (ctx->Pixel.RedScale == param)
608 return;
609 FLUSH_VERTICES(ctx, _NEW_PIXEL);
jtgafb833d1999-08-19 00:55:39 +0000610 ctx->Pixel.RedScale = param;
611 break;
612 case GL_RED_BIAS:
Keith Whitwellcab974c2000-12-26 05:09:27 +0000613 if (ctx->Pixel.RedBias == param)
614 return;
615 FLUSH_VERTICES(ctx, _NEW_PIXEL);
jtgafb833d1999-08-19 00:55:39 +0000616 ctx->Pixel.RedBias = param;
617 break;
618 case GL_GREEN_SCALE:
Keith Whitwellcab974c2000-12-26 05:09:27 +0000619 if (ctx->Pixel.GreenScale == param)
620 return;
621 FLUSH_VERTICES(ctx, _NEW_PIXEL);
jtgafb833d1999-08-19 00:55:39 +0000622 ctx->Pixel.GreenScale = param;
623 break;
624 case GL_GREEN_BIAS:
Keith Whitwellcab974c2000-12-26 05:09:27 +0000625 if (ctx->Pixel.GreenBias == param)
626 return;
627 FLUSH_VERTICES(ctx, _NEW_PIXEL);
jtgafb833d1999-08-19 00:55:39 +0000628 ctx->Pixel.GreenBias = param;
629 break;
630 case GL_BLUE_SCALE:
Keith Whitwellcab974c2000-12-26 05:09:27 +0000631 if (ctx->Pixel.BlueScale == param)
632 return;
633 FLUSH_VERTICES(ctx, _NEW_PIXEL);
jtgafb833d1999-08-19 00:55:39 +0000634 ctx->Pixel.BlueScale = param;
635 break;
636 case GL_BLUE_BIAS:
Keith Whitwellcab974c2000-12-26 05:09:27 +0000637 if (ctx->Pixel.BlueBias == param)
638 return;
639 FLUSH_VERTICES(ctx, _NEW_PIXEL);
jtgafb833d1999-08-19 00:55:39 +0000640 ctx->Pixel.BlueBias = param;
641 break;
642 case GL_ALPHA_SCALE:
Keith Whitwellcab974c2000-12-26 05:09:27 +0000643 if (ctx->Pixel.AlphaScale == param)
644 return;
645 FLUSH_VERTICES(ctx, _NEW_PIXEL);
jtgafb833d1999-08-19 00:55:39 +0000646 ctx->Pixel.AlphaScale = param;
647 break;
648 case GL_ALPHA_BIAS:
Keith Whitwellcab974c2000-12-26 05:09:27 +0000649 if (ctx->Pixel.AlphaBias == param)
650 return;
651 FLUSH_VERTICES(ctx, _NEW_PIXEL);
jtgafb833d1999-08-19 00:55:39 +0000652 ctx->Pixel.AlphaBias = param;
653 break;
654 case GL_DEPTH_SCALE:
Keith Whitwellcab974c2000-12-26 05:09:27 +0000655 if (ctx->Pixel.DepthScale == param)
656 return;
657 FLUSH_VERTICES(ctx, _NEW_PIXEL);
jtgafb833d1999-08-19 00:55:39 +0000658 ctx->Pixel.DepthScale = param;
659 break;
660 case GL_DEPTH_BIAS:
Keith Whitwellcab974c2000-12-26 05:09:27 +0000661 if (ctx->Pixel.DepthBias == param)
662 return;
663 FLUSH_VERTICES(ctx, _NEW_PIXEL);
jtgafb833d1999-08-19 00:55:39 +0000664 ctx->Pixel.DepthBias = param;
665 break;
Brian Paul250069d2000-04-08 18:57:45 +0000666 case GL_POST_COLOR_MATRIX_RED_SCALE:
Keith Whitwellcab974c2000-12-26 05:09:27 +0000667 if (ctx->Pixel.PostColorMatrixScale[0] == param)
668 return;
669 FLUSH_VERTICES(ctx, _NEW_PIXEL);
Brian Paul82b02f02000-05-07 20:37:40 +0000670 ctx->Pixel.PostColorMatrixScale[0] = param;
Brian Paul250069d2000-04-08 18:57:45 +0000671 break;
672 case GL_POST_COLOR_MATRIX_RED_BIAS:
Keith Whitwellcab974c2000-12-26 05:09:27 +0000673 if (ctx->Pixel.PostColorMatrixBias[0] == param)
674 return;
675 FLUSH_VERTICES(ctx, _NEW_PIXEL);
Brian Paul82b02f02000-05-07 20:37:40 +0000676 ctx->Pixel.PostColorMatrixBias[0] = param;
Brian Paul250069d2000-04-08 18:57:45 +0000677 break;
678 case GL_POST_COLOR_MATRIX_GREEN_SCALE:
Keith Whitwellcab974c2000-12-26 05:09:27 +0000679 if (ctx->Pixel.PostColorMatrixScale[1] == param)
680 return;
681 FLUSH_VERTICES(ctx, _NEW_PIXEL);
Brian Paul82b02f02000-05-07 20:37:40 +0000682 ctx->Pixel.PostColorMatrixScale[1] = param;
Brian Paul250069d2000-04-08 18:57:45 +0000683 break;
684 case GL_POST_COLOR_MATRIX_GREEN_BIAS:
Keith Whitwellcab974c2000-12-26 05:09:27 +0000685 if (ctx->Pixel.PostColorMatrixBias[1] == param)
686 return;
687 FLUSH_VERTICES(ctx, _NEW_PIXEL);
Brian Paul82b02f02000-05-07 20:37:40 +0000688 ctx->Pixel.PostColorMatrixBias[1] = param;
Brian Paul250069d2000-04-08 18:57:45 +0000689 break;
690 case GL_POST_COLOR_MATRIX_BLUE_SCALE:
Keith Whitwellcab974c2000-12-26 05:09:27 +0000691 if (ctx->Pixel.PostColorMatrixScale[2] == param)
692 return;
693 FLUSH_VERTICES(ctx, _NEW_PIXEL);
Brian Paul82b02f02000-05-07 20:37:40 +0000694 ctx->Pixel.PostColorMatrixScale[2] = param;
Brian Paul250069d2000-04-08 18:57:45 +0000695 break;
696 case GL_POST_COLOR_MATRIX_BLUE_BIAS:
Keith Whitwellcab974c2000-12-26 05:09:27 +0000697 if (ctx->Pixel.PostColorMatrixBias[2] == param)
698 return;
699 FLUSH_VERTICES(ctx, _NEW_PIXEL);
Brian Paul82b02f02000-05-07 20:37:40 +0000700 ctx->Pixel.PostColorMatrixBias[2] = param;
Brian Paul250069d2000-04-08 18:57:45 +0000701 break;
702 case GL_POST_COLOR_MATRIX_ALPHA_SCALE:
Keith Whitwellcab974c2000-12-26 05:09:27 +0000703 if (ctx->Pixel.PostColorMatrixScale[3] == param)
704 return;
705 FLUSH_VERTICES(ctx, _NEW_PIXEL);
Brian Paul82b02f02000-05-07 20:37:40 +0000706 ctx->Pixel.PostColorMatrixScale[3] = param;
Brian Paul250069d2000-04-08 18:57:45 +0000707 break;
708 case GL_POST_COLOR_MATRIX_ALPHA_BIAS:
Keith Whitwellcab974c2000-12-26 05:09:27 +0000709 if (ctx->Pixel.PostColorMatrixBias[3] == param)
710 return;
711 FLUSH_VERTICES(ctx, _NEW_PIXEL);
Brian Paul82b02f02000-05-07 20:37:40 +0000712 ctx->Pixel.PostColorMatrixBias[3] = param;
713 break;
714 case GL_POST_CONVOLUTION_RED_SCALE:
Keith Whitwellcab974c2000-12-26 05:09:27 +0000715 if (ctx->Pixel.PostConvolutionScale[0] == param)
716 return;
717 FLUSH_VERTICES(ctx, _NEW_PIXEL);
Brian Paul82b02f02000-05-07 20:37:40 +0000718 ctx->Pixel.PostConvolutionScale[0] = param;
719 break;
720 case GL_POST_CONVOLUTION_RED_BIAS:
Keith Whitwellcab974c2000-12-26 05:09:27 +0000721 if (ctx->Pixel.PostConvolutionBias[0] == param)
722 return;
723 FLUSH_VERTICES(ctx, _NEW_PIXEL);
Brian Paul82b02f02000-05-07 20:37:40 +0000724 ctx->Pixel.PostConvolutionBias[0] = param;
725 break;
726 case GL_POST_CONVOLUTION_GREEN_SCALE:
Keith Whitwellcab974c2000-12-26 05:09:27 +0000727 if (ctx->Pixel.PostConvolutionScale[1] == param)
728 return;
729 FLUSH_VERTICES(ctx, _NEW_PIXEL);
Brian Paul82b02f02000-05-07 20:37:40 +0000730 ctx->Pixel.PostConvolutionScale[1] = param;
731 break;
732 case GL_POST_CONVOLUTION_GREEN_BIAS:
Keith Whitwellcab974c2000-12-26 05:09:27 +0000733 if (ctx->Pixel.PostConvolutionBias[1] == param)
734 return;
735 FLUSH_VERTICES(ctx, _NEW_PIXEL);
Brian Paul82b02f02000-05-07 20:37:40 +0000736 ctx->Pixel.PostConvolutionBias[1] = param;
737 break;
738 case GL_POST_CONVOLUTION_BLUE_SCALE:
Keith Whitwellcab974c2000-12-26 05:09:27 +0000739 if (ctx->Pixel.PostConvolutionScale[2] == param)
740 return;
741 FLUSH_VERTICES(ctx, _NEW_PIXEL);
Brian Paul82b02f02000-05-07 20:37:40 +0000742 ctx->Pixel.PostConvolutionScale[2] = param;
743 break;
744 case GL_POST_CONVOLUTION_BLUE_BIAS:
Keith Whitwellcab974c2000-12-26 05:09:27 +0000745 if (ctx->Pixel.PostConvolutionBias[2] == param)
746 return;
747 FLUSH_VERTICES(ctx, _NEW_PIXEL);
Brian Paul82b02f02000-05-07 20:37:40 +0000748 ctx->Pixel.PostConvolutionBias[2] = param;
749 break;
750 case GL_POST_CONVOLUTION_ALPHA_SCALE:
Keith Whitwellcab974c2000-12-26 05:09:27 +0000751 if (ctx->Pixel.PostConvolutionScale[2] == param)
752 return;
753 FLUSH_VERTICES(ctx, _NEW_PIXEL);
Brian Paul82b02f02000-05-07 20:37:40 +0000754 ctx->Pixel.PostConvolutionScale[2] = param;
755 break;
756 case GL_POST_CONVOLUTION_ALPHA_BIAS:
Keith Whitwellcab974c2000-12-26 05:09:27 +0000757 if (ctx->Pixel.PostConvolutionBias[2] == param)
758 return;
759 FLUSH_VERTICES(ctx, _NEW_PIXEL);
Brian Paul82b02f02000-05-07 20:37:40 +0000760 ctx->Pixel.PostConvolutionBias[2] = param;
Brian Paul250069d2000-04-08 18:57:45 +0000761 break;
jtgafb833d1999-08-19 00:55:39 +0000762 default:
Brian Paul08836342001-03-03 20:33:27 +0000763 _mesa_error( ctx, GL_INVALID_ENUM, "glPixelTransfer(pname)" );
jtgafb833d1999-08-19 00:55:39 +0000764 return;
765 }
jtgafb833d1999-08-19 00:55:39 +0000766}
767
768
Brian Paulfbd8f211999-11-11 01:22:25 +0000769void
770_mesa_PixelTransferi( GLenum pname, GLint param )
771{
772 _mesa_PixelTransferf( pname, (GLfloat) param );
773}
774
775
jtgafb833d1999-08-19 00:55:39 +0000776
Brian Paul179870a2000-04-12 18:54:48 +0000777/**********************************************************************/
778/***** Pixel processing functions ******/
779/**********************************************************************/
jtgafb833d1999-08-19 00:55:39 +0000780
781
782/*
Brian Paul3c14ec91999-10-30 08:20:57 +0000783 * Apply scale and bias factors to an array of RGBA pixels.
784 */
Brian Paul250069d2000-04-08 18:57:45 +0000785void
Brian Paul45015e42000-11-28 00:07:51 +0000786_mesa_scale_and_bias_rgba(const GLcontext *ctx, GLuint n, GLfloat rgba[][4],
787 GLfloat rScale, GLfloat gScale,
788 GLfloat bScale, GLfloat aScale,
789 GLfloat rBias, GLfloat gBias,
790 GLfloat bBias, GLfloat aBias)
Brian Paul3c14ec91999-10-30 08:20:57 +0000791{
Brian Paul45015e42000-11-28 00:07:51 +0000792 if (rScale != 1.0 || rBias != 0.0) {
Brian Paul3c14ec91999-10-30 08:20:57 +0000793 GLuint i;
794 for (i = 0; i < n; i++) {
Brian Paul45015e42000-11-28 00:07:51 +0000795 rgba[i][RCOMP] = rgba[i][RCOMP] * rScale + rBias;
Brian Paul3c14ec91999-10-30 08:20:57 +0000796 }
797 }
Brian Paul45015e42000-11-28 00:07:51 +0000798 if (gScale != 1.0 || gBias != 0.0) {
Brian Paul3c14ec91999-10-30 08:20:57 +0000799 GLuint i;
800 for (i = 0; i < n; i++) {
Brian Paul45015e42000-11-28 00:07:51 +0000801 rgba[i][GCOMP] = rgba[i][GCOMP] * gScale + gBias;
Brian Paul3c14ec91999-10-30 08:20:57 +0000802 }
803 }
Brian Paul45015e42000-11-28 00:07:51 +0000804 if (bScale != 1.0 || bBias != 0.0) {
Brian Paul3c14ec91999-10-30 08:20:57 +0000805 GLuint i;
806 for (i = 0; i < n; i++) {
Brian Paul45015e42000-11-28 00:07:51 +0000807 rgba[i][BCOMP] = rgba[i][BCOMP] * bScale + bBias;
Brian Paul3c14ec91999-10-30 08:20:57 +0000808 }
809 }
Brian Paul45015e42000-11-28 00:07:51 +0000810 if (aScale != 1.0 || aBias != 0.0) {
Brian Paul3c14ec91999-10-30 08:20:57 +0000811 GLuint i;
812 for (i = 0; i < n; i++) {
Brian Paul45015e42000-11-28 00:07:51 +0000813 rgba[i][ACOMP] = rgba[i][ACOMP] * aScale + aBias;
Brian Paul3c14ec91999-10-30 08:20:57 +0000814 }
815 }
816}
817
818
819/*
Brian Paul3c14ec91999-10-30 08:20:57 +0000820 * Apply pixel mapping to an array of floating point RGBA pixels.
821 */
Brian Paul250069d2000-04-08 18:57:45 +0000822void
Brian Paul179870a2000-04-12 18:54:48 +0000823_mesa_map_rgba( const GLcontext *ctx, GLuint n, GLfloat rgba[][4] )
Brian Paul3c14ec91999-10-30 08:20:57 +0000824{
Karl Schultz94a6ec82001-09-18 16:16:21 +0000825 const GLfloat rscale = (GLfloat) (ctx->Pixel.MapRtoRsize - 1);
826 const GLfloat gscale = (GLfloat) (ctx->Pixel.MapGtoGsize - 1);
827 const GLfloat bscale = (GLfloat) (ctx->Pixel.MapBtoBsize - 1);
828 const GLfloat ascale = (GLfloat) (ctx->Pixel.MapAtoAsize - 1);
Brian Paul3c14ec91999-10-30 08:20:57 +0000829 const GLfloat *rMap = ctx->Pixel.MapRtoR;
830 const GLfloat *gMap = ctx->Pixel.MapGtoG;
831 const GLfloat *bMap = ctx->Pixel.MapBtoB;
832 const GLfloat *aMap = ctx->Pixel.MapAtoA;
833 GLuint i;
834 for (i=0;i<n;i++) {
Brian Paulf6e0e922001-05-23 23:55:01 +0000835 GLfloat r = CLAMP(rgba[i][RCOMP], 0.0F, 1.0F);
836 GLfloat g = CLAMP(rgba[i][GCOMP], 0.0F, 1.0F);
837 GLfloat b = CLAMP(rgba[i][BCOMP], 0.0F, 1.0F);
838 GLfloat a = CLAMP(rgba[i][ACOMP], 0.0F, 1.0F);
839 rgba[i][RCOMP] = rMap[IROUND(r * rscale)];
840 rgba[i][GCOMP] = gMap[IROUND(g * gscale)];
841 rgba[i][BCOMP] = bMap[IROUND(b * bscale)];
842 rgba[i][ACOMP] = aMap[IROUND(a * ascale)];
Brian Paul3c14ec91999-10-30 08:20:57 +0000843 }
844}
845
846
847/*
Brian Paul250069d2000-04-08 18:57:45 +0000848 * Apply the color matrix and post color matrix scaling and biasing.
849 */
850void
851_mesa_transform_rgba(const GLcontext *ctx, GLuint n, GLfloat rgba[][4])
852{
Brian Paul82b02f02000-05-07 20:37:40 +0000853 const GLfloat rs = ctx->Pixel.PostColorMatrixScale[0];
854 const GLfloat rb = ctx->Pixel.PostColorMatrixBias[0];
855 const GLfloat gs = ctx->Pixel.PostColorMatrixScale[1];
856 const GLfloat gb = ctx->Pixel.PostColorMatrixBias[1];
857 const GLfloat bs = ctx->Pixel.PostColorMatrixScale[2];
858 const GLfloat bb = ctx->Pixel.PostColorMatrixBias[2];
859 const GLfloat as = ctx->Pixel.PostColorMatrixScale[3];
860 const GLfloat ab = ctx->Pixel.PostColorMatrixBias[3];
Brian Paul30f51ae2001-12-18 04:06:44 +0000861 const GLfloat *m = ctx->ColorMatrixStack.Top->m;
Brian Paul250069d2000-04-08 18:57:45 +0000862 GLuint i;
863 for (i = 0; i < n; i++) {
864 const GLfloat r = rgba[i][RCOMP];
865 const GLfloat g = rgba[i][GCOMP];
866 const GLfloat b = rgba[i][BCOMP];
867 const GLfloat a = rgba[i][ACOMP];
868 rgba[i][RCOMP] = (m[0] * r + m[4] * g + m[ 8] * b + m[12] * a) * rs + rb;
869 rgba[i][GCOMP] = (m[1] * r + m[5] * g + m[ 9] * b + m[13] * a) * gs + gb;
870 rgba[i][BCOMP] = (m[2] * r + m[6] * g + m[10] * b + m[14] * a) * bs + bb;
871 rgba[i][ACOMP] = (m[3] * r + m[7] * g + m[11] * b + m[15] * a) * as + ab;
872 }
873}
874
875
Brian Paul250069d2000-04-08 18:57:45 +0000876/*
Brian Paul179870a2000-04-12 18:54:48 +0000877 * Apply a color table lookup to an array of colors.
jtgafb833d1999-08-19 00:55:39 +0000878 */
Brian Paul179870a2000-04-12 18:54:48 +0000879void
880_mesa_lookup_rgba(const struct gl_color_table *table,
881 GLuint n, GLfloat rgba[][4])
jtgafb833d1999-08-19 00:55:39 +0000882{
Brian Paulba643a22000-10-28 18:34:48 +0000883 ASSERT(table->FloatTable);
Brian Paul8753b1c2001-02-27 16:42:01 +0000884 if (!table->Table || table->Size == 0)
Brian Paul4bdcfe52000-04-17 17:57:04 +0000885 return;
886
Brian Paul179870a2000-04-12 18:54:48 +0000887 switch (table->Format) {
888 case GL_INTENSITY:
Brian Paul4bdcfe52000-04-17 17:57:04 +0000889 /* replace RGBA with I */
Brian Paulba643a22000-10-28 18:34:48 +0000890 if (!table->FloatTable) {
Brian Paulf6e0e922001-05-23 23:55:01 +0000891 const GLint max = table->Size - 1;
892 const GLfloat scale = (GLfloat) max;
Brian Paul699bc7b2000-10-29 18:12:14 +0000893 const GLchan *lut = (const GLchan *) table->Table;
Brian Paul179870a2000-04-12 18:54:48 +0000894 GLuint i;
Brian Paul179870a2000-04-12 18:54:48 +0000895 for (i = 0; i < n; i++) {
Brian Paul33143302001-04-10 15:25:45 +0000896 GLint j = IROUND(rgba[i][RCOMP] * scale);
Brian Paulf6e0e922001-05-23 23:55:01 +0000897 GLfloat c = CHAN_TO_FLOAT(lut[CLAMP(j, 0, 1)]);
Brian Paul4bdcfe52000-04-17 17:57:04 +0000898 rgba[i][RCOMP] = rgba[i][GCOMP] =
899 rgba[i][BCOMP] = rgba[i][ACOMP] = c;
900 }
901
902 }
903 else {
Brian Paulf6e0e922001-05-23 23:55:01 +0000904 const GLint max = table->Size - 1;
905 const GLfloat scale = (GLfloat) max;
Brian Paul4bdcfe52000-04-17 17:57:04 +0000906 const GLfloat *lut = (const GLfloat *) table->Table;
907 GLuint i;
908 for (i = 0; i < n; i++) {
Brian Paul33143302001-04-10 15:25:45 +0000909 GLint j = IROUND(rgba[i][RCOMP] * scale);
Brian Paulf6e0e922001-05-23 23:55:01 +0000910 GLfloat c = lut[CLAMP(j, 0, max)];
Brian Paul179870a2000-04-12 18:54:48 +0000911 rgba[i][RCOMP] = rgba[i][GCOMP] =
912 rgba[i][BCOMP] = rgba[i][ACOMP] = c;
913 }
914 }
915 break;
916 case GL_LUMINANCE:
Brian Paul4bdcfe52000-04-17 17:57:04 +0000917 /* replace RGB with L */
Brian Paulba643a22000-10-28 18:34:48 +0000918 if (!table->FloatTable) {
Brian Paulf6e0e922001-05-23 23:55:01 +0000919 const GLint max = table->Size - 1;
920 const GLfloat scale = (GLfloat) max;
Brian Paul699bc7b2000-10-29 18:12:14 +0000921 const GLchan *lut = (const GLchan *) table->Table;
Brian Paul179870a2000-04-12 18:54:48 +0000922 GLuint i;
Brian Paul179870a2000-04-12 18:54:48 +0000923 for (i = 0; i < n; i++) {
Brian Paul33143302001-04-10 15:25:45 +0000924 GLint j = IROUND(rgba[i][RCOMP] * scale);
Brian Paulf6e0e922001-05-23 23:55:01 +0000925 GLfloat c = CHAN_TO_FLOAT(lut[CLAMP(j, 0, max)]);
Brian Paul4bdcfe52000-04-17 17:57:04 +0000926 rgba[i][RCOMP] = rgba[i][GCOMP] = rgba[i][BCOMP] = c;
927 }
928 }
929 else {
Brian Paulf6e0e922001-05-23 23:55:01 +0000930 const GLint max = table->Size - 1;
931 const GLfloat scale = (GLfloat) max;
Brian Paul4bdcfe52000-04-17 17:57:04 +0000932 const GLfloat *lut = (const GLfloat *) table->Table;
933 GLuint i;
934 for (i = 0; i < n; i++) {
Brian Paul33143302001-04-10 15:25:45 +0000935 GLint j = IROUND(rgba[i][RCOMP] * scale);
Brian Paulf6e0e922001-05-23 23:55:01 +0000936 GLfloat c = lut[CLAMP(j, 0, max)];
Brian Paul179870a2000-04-12 18:54:48 +0000937 rgba[i][RCOMP] = rgba[i][GCOMP] = rgba[i][BCOMP] = c;
938 }
939 }
940 break;
941 case GL_ALPHA:
Brian Paul4bdcfe52000-04-17 17:57:04 +0000942 /* replace A with A */
Brian Paulba643a22000-10-28 18:34:48 +0000943 if (!table->FloatTable) {
Brian Paulf6e0e922001-05-23 23:55:01 +0000944 const GLint max = table->Size - 1;
945 const GLfloat scale = (GLfloat) max;
Brian Paul699bc7b2000-10-29 18:12:14 +0000946 const GLchan *lut = (const GLchan *) table->Table;
Brian Paul179870a2000-04-12 18:54:48 +0000947 GLuint i;
Brian Paul4bdcfe52000-04-17 17:57:04 +0000948 for (i = 0; i < n; i++) {
Brian Paul33143302001-04-10 15:25:45 +0000949 GLint j = IROUND(rgba[i][ACOMP] * scale);
Brian Paulf6e0e922001-05-23 23:55:01 +0000950 rgba[i][ACOMP] = CHAN_TO_FLOAT(lut[CLAMP(j, 0, max)]);
Brian Paul4bdcfe52000-04-17 17:57:04 +0000951 }
952 }
953 else {
Brian Paulf6e0e922001-05-23 23:55:01 +0000954 const GLint max = table->Size - 1;
955 const GLfloat scale = (GLfloat) max;
Brian Paul4bdcfe52000-04-17 17:57:04 +0000956 const GLfloat *lut = (const GLfloat *) table->Table;
957 GLuint i;
Brian Paul179870a2000-04-12 18:54:48 +0000958 for (i = 0; i < n; i++) {
Brian Paul33143302001-04-10 15:25:45 +0000959 GLint j = IROUND(rgba[i][ACOMP] * scale);
Brian Paulf6e0e922001-05-23 23:55:01 +0000960 rgba[i][ACOMP] = lut[CLAMP(j, 0, max)];
Brian Paul179870a2000-04-12 18:54:48 +0000961 }
962 }
963 break;
964 case GL_LUMINANCE_ALPHA:
Brian Paul4bdcfe52000-04-17 17:57:04 +0000965 /* replace RGBA with LLLA */
Brian Paulba643a22000-10-28 18:34:48 +0000966 if (!table->FloatTable) {
Brian Paulf6e0e922001-05-23 23:55:01 +0000967 const GLint max = table->Size - 1;
968 const GLfloat scale = (GLfloat) max;
Brian Paul699bc7b2000-10-29 18:12:14 +0000969 const GLchan *lut = (const GLchan *) table->Table;
Brian Paul179870a2000-04-12 18:54:48 +0000970 GLuint i;
Brian Paul179870a2000-04-12 18:54:48 +0000971 for (i = 0; i < n; i++) {
Brian Paul33143302001-04-10 15:25:45 +0000972 GLint jL = IROUND(rgba[i][RCOMP] * scale);
973 GLint jA = IROUND(rgba[i][ACOMP] * scale);
Brian Paulf6e0e922001-05-23 23:55:01 +0000974 GLfloat luminance, alpha;
975 jL = CLAMP(jL, 0, max);
976 jA = CLAMP(jA, 0, max);
977 luminance = CHAN_TO_FLOAT(lut[jL * 2 + 0]);
978 alpha = CHAN_TO_FLOAT(lut[jA * 2 + 1]);
Brian Paul4bdcfe52000-04-17 17:57:04 +0000979 rgba[i][RCOMP] = rgba[i][GCOMP] = rgba[i][BCOMP] = luminance;
980 rgba[i][ACOMP] = alpha;;
981 }
982 }
983 else {
Brian Paulf6e0e922001-05-23 23:55:01 +0000984 const GLint max = table->Size - 1;
985 const GLfloat scale = (GLfloat) max;
Brian Paul4bdcfe52000-04-17 17:57:04 +0000986 const GLfloat *lut = (const GLfloat *) table->Table;
987 GLuint i;
988 for (i = 0; i < n; i++) {
Brian Paul33143302001-04-10 15:25:45 +0000989 GLint jL = IROUND(rgba[i][RCOMP] * scale);
990 GLint jA = IROUND(rgba[i][ACOMP] * scale);
Brian Paulf6e0e922001-05-23 23:55:01 +0000991 GLfloat luminance, alpha;
992 jL = CLAMP(jL, 0, max);
993 jA = CLAMP(jA, 0, max);
994 luminance = lut[jL * 2 + 0];
995 alpha = lut[jA * 2 + 1];
Brian Paul179870a2000-04-12 18:54:48 +0000996 rgba[i][RCOMP] = rgba[i][GCOMP] = rgba[i][BCOMP] = luminance;
997 rgba[i][ACOMP] = alpha;;
998 }
999 }
1000 break;
1001 case GL_RGB:
Brian Paul4bdcfe52000-04-17 17:57:04 +00001002 /* replace RGB with RGB */
Brian Paulba643a22000-10-28 18:34:48 +00001003 if (!table->FloatTable) {
Brian Paulf6e0e922001-05-23 23:55:01 +00001004 const GLint max = table->Size - 1;
1005 const GLfloat scale = (GLfloat) max;
Brian Paul699bc7b2000-10-29 18:12:14 +00001006 const GLchan *lut = (const GLchan *) table->Table;
Brian Paul179870a2000-04-12 18:54:48 +00001007 GLuint i;
Brian Paul4bdcfe52000-04-17 17:57:04 +00001008 for (i = 0; i < n; i++) {
Brian Paul33143302001-04-10 15:25:45 +00001009 GLint jR = IROUND(rgba[i][RCOMP] * scale);
1010 GLint jG = IROUND(rgba[i][GCOMP] * scale);
1011 GLint jB = IROUND(rgba[i][BCOMP] * scale);
Brian Paulf6e0e922001-05-23 23:55:01 +00001012 jR = CLAMP(jR, 0, max);
1013 jG = CLAMP(jG, 0, max);
1014 jB = CLAMP(jB, 0, max);
Brian Paul699bc7b2000-10-29 18:12:14 +00001015 rgba[i][RCOMP] = CHAN_TO_FLOAT(lut[jR * 3 + 0]);
1016 rgba[i][GCOMP] = CHAN_TO_FLOAT(lut[jG * 3 + 1]);
1017 rgba[i][BCOMP] = CHAN_TO_FLOAT(lut[jB * 3 + 2]);
Brian Paul4bdcfe52000-04-17 17:57:04 +00001018 }
1019 }
1020 else {
Brian Paulf6e0e922001-05-23 23:55:01 +00001021 const GLint max = table->Size - 1;
1022 const GLfloat scale = (GLfloat) max;
Brian Paul4bdcfe52000-04-17 17:57:04 +00001023 const GLfloat *lut = (const GLfloat *) table->Table;
1024 GLuint i;
Brian Paul179870a2000-04-12 18:54:48 +00001025 for (i = 0; i < n; i++) {
Brian Paul33143302001-04-10 15:25:45 +00001026 GLint jR = IROUND(rgba[i][RCOMP] * scale);
1027 GLint jG = IROUND(rgba[i][GCOMP] * scale);
1028 GLint jB = IROUND(rgba[i][BCOMP] * scale);
Brian Paulf6e0e922001-05-23 23:55:01 +00001029 jR = CLAMP(jR, 0, max);
1030 jG = CLAMP(jG, 0, max);
1031 jB = CLAMP(jB, 0, max);
Brian Paul179870a2000-04-12 18:54:48 +00001032 rgba[i][RCOMP] = lut[jR * 3 + 0];
1033 rgba[i][GCOMP] = lut[jG * 3 + 1];
1034 rgba[i][BCOMP] = lut[jB * 3 + 2];
1035 }
1036 }
1037 break;
1038 case GL_RGBA:
Brian Paul4bdcfe52000-04-17 17:57:04 +00001039 /* replace RGBA with RGBA */
Brian Paulba643a22000-10-28 18:34:48 +00001040 if (!table->FloatTable) {
Brian Paulf6e0e922001-05-23 23:55:01 +00001041 const GLint max = table->Size - 1;
1042 const GLfloat scale = (GLfloat) max;
Brian Paul699bc7b2000-10-29 18:12:14 +00001043 const GLchan *lut = (const GLchan *) table->Table;
Brian Paul179870a2000-04-12 18:54:48 +00001044 GLuint i;
Brian Paul4bdcfe52000-04-17 17:57:04 +00001045 for (i = 0; i < n; i++) {
Brian Paul33143302001-04-10 15:25:45 +00001046 GLint jR = IROUND(rgba[i][RCOMP] * scale);
1047 GLint jG = IROUND(rgba[i][GCOMP] * scale);
1048 GLint jB = IROUND(rgba[i][BCOMP] * scale);
1049 GLint jA = IROUND(rgba[i][ACOMP] * scale);
Brian Paulf6e0e922001-05-23 23:55:01 +00001050 jR = CLAMP(jR, 0, max);
1051 jG = CLAMP(jG, 0, max);
1052 jB = CLAMP(jB, 0, max);
1053 jA = CLAMP(jA, 0, max);
Brian Paul699bc7b2000-10-29 18:12:14 +00001054 rgba[i][RCOMP] = CHAN_TO_FLOAT(lut[jR * 4 + 0]);
1055 rgba[i][GCOMP] = CHAN_TO_FLOAT(lut[jG * 4 + 1]);
1056 rgba[i][BCOMP] = CHAN_TO_FLOAT(lut[jB * 4 + 2]);
1057 rgba[i][ACOMP] = CHAN_TO_FLOAT(lut[jA * 4 + 3]);
Brian Paul4bdcfe52000-04-17 17:57:04 +00001058 }
1059 }
1060 else {
Brian Paulf6e0e922001-05-23 23:55:01 +00001061 const GLint max = table->Size - 1;
1062 const GLfloat scale = (GLfloat) max;
Brian Paul4bdcfe52000-04-17 17:57:04 +00001063 const GLfloat *lut = (const GLfloat *) table->Table;
1064 GLuint i;
Brian Paul179870a2000-04-12 18:54:48 +00001065 for (i = 0; i < n; i++) {
Brian Paul33143302001-04-10 15:25:45 +00001066 GLint jR = IROUND(rgba[i][RCOMP] * scale);
1067 GLint jG = IROUND(rgba[i][GCOMP] * scale);
1068 GLint jB = IROUND(rgba[i][BCOMP] * scale);
1069 GLint jA = IROUND(rgba[i][ACOMP] * scale);
Brian Paulf6e0e922001-05-23 23:55:01 +00001070 jR = CLAMP(jR, 0, max);
1071 jG = CLAMP(jG, 0, max);
1072 jB = CLAMP(jB, 0, max);
1073 jA = CLAMP(jA, 0, max);
Brian Paul179870a2000-04-12 18:54:48 +00001074 rgba[i][RCOMP] = lut[jR * 4 + 0];
1075 rgba[i][GCOMP] = lut[jG * 4 + 1];
1076 rgba[i][BCOMP] = lut[jB * 4 + 2];
1077 rgba[i][ACOMP] = lut[jA * 4 + 3];
1078 }
1079 }
1080 break;
1081 default:
Brian Paul08836342001-03-03 20:33:27 +00001082 _mesa_problem(NULL, "Bad format in _mesa_lookup_rgba");
Brian Paul179870a2000-04-12 18:54:48 +00001083 return;
jtgafb833d1999-08-19 00:55:39 +00001084 }
1085}
1086
1087
1088
1089/*
1090 * Apply color index shift and offset to an array of pixels.
1091 */
Brian Paul179870a2000-04-12 18:54:48 +00001092void
1093_mesa_shift_and_offset_ci( const GLcontext *ctx, GLuint n, GLuint indexes[] )
jtgafb833d1999-08-19 00:55:39 +00001094{
1095 GLint shift = ctx->Pixel.IndexShift;
1096 GLint offset = ctx->Pixel.IndexOffset;
1097 GLuint i;
1098 if (shift > 0) {
1099 for (i=0;i<n;i++) {
1100 indexes[i] = (indexes[i] << shift) + offset;
1101 }
1102 }
1103 else if (shift < 0) {
1104 shift = -shift;
1105 for (i=0;i<n;i++) {
1106 indexes[i] = (indexes[i] >> shift) + offset;
1107 }
1108 }
1109 else {
1110 for (i=0;i<n;i++) {
1111 indexes[i] = indexes[i] + offset;
1112 }
1113 }
1114}
1115
1116
1117/*
1118 * Apply color index mapping to color indexes.
1119 */
Brian Paul179870a2000-04-12 18:54:48 +00001120void
1121_mesa_map_ci( const GLcontext *ctx, GLuint n, GLuint index[] )
jtgafb833d1999-08-19 00:55:39 +00001122{
1123 GLuint mask = ctx->Pixel.MapItoIsize - 1;
1124 GLuint i;
1125 for (i=0;i<n;i++) {
1126 index[i] = ctx->Pixel.MapItoI[ index[i] & mask ];
1127 }
1128}
1129
1130
1131/*
Brian Paul3c14ec91999-10-30 08:20:57 +00001132 * Map color indexes to rgba values.
jtgafb833d1999-08-19 00:55:39 +00001133 */
Brian Paul179870a2000-04-12 18:54:48 +00001134void
Brian Paul699bc7b2000-10-29 18:12:14 +00001135_mesa_map_ci_to_rgba_chan( const GLcontext *ctx, GLuint n,
1136 const GLuint index[], GLchan rgba[][4] )
jtgafb833d1999-08-19 00:55:39 +00001137{
Brian Paul699bc7b2000-10-29 18:12:14 +00001138#if CHAN_BITS == 8
jtgafb833d1999-08-19 00:55:39 +00001139 GLuint rmask = ctx->Pixel.MapItoRsize - 1;
1140 GLuint gmask = ctx->Pixel.MapItoGsize - 1;
1141 GLuint bmask = ctx->Pixel.MapItoBsize - 1;
1142 GLuint amask = ctx->Pixel.MapItoAsize - 1;
1143 const GLubyte *rMap = ctx->Pixel.MapItoR8;
1144 const GLubyte *gMap = ctx->Pixel.MapItoG8;
1145 const GLubyte *bMap = ctx->Pixel.MapItoB8;
1146 const GLubyte *aMap = ctx->Pixel.MapItoA8;
1147 GLuint i;
1148 for (i=0;i<n;i++) {
1149 rgba[i][RCOMP] = rMap[index[i] & rmask];
1150 rgba[i][GCOMP] = gMap[index[i] & gmask];
1151 rgba[i][BCOMP] = bMap[index[i] & bmask];
1152 rgba[i][ACOMP] = aMap[index[i] & amask];
1153 }
Brian Paul699bc7b2000-10-29 18:12:14 +00001154#else
1155 GLuint rmask = ctx->Pixel.MapItoRsize - 1;
1156 GLuint gmask = ctx->Pixel.MapItoGsize - 1;
1157 GLuint bmask = ctx->Pixel.MapItoBsize - 1;
1158 GLuint amask = ctx->Pixel.MapItoAsize - 1;
1159 const GLfloat *rMap = ctx->Pixel.MapItoR;
1160 const GLfloat *gMap = ctx->Pixel.MapItoG;
1161 const GLfloat *bMap = ctx->Pixel.MapItoB;
1162 const GLfloat *aMap = ctx->Pixel.MapItoA;
1163 GLuint i;
1164 for (i=0;i<n;i++) {
Brian Paul6532db92001-01-03 15:59:30 +00001165 CLAMPED_FLOAT_TO_CHAN(rgba[i][RCOMP], rMap[index[i] & rmask]);
1166 CLAMPED_FLOAT_TO_CHAN(rgba[i][GCOMP], gMap[index[i] & gmask]);
1167 CLAMPED_FLOAT_TO_CHAN(rgba[i][BCOMP], bMap[index[i] & bmask]);
1168 CLAMPED_FLOAT_TO_CHAN(rgba[i][ACOMP], aMap[index[i] & amask]);
Brian Paul699bc7b2000-10-29 18:12:14 +00001169 }
1170#endif
jtgafb833d1999-08-19 00:55:39 +00001171}
1172
1173
1174/*
Brian Paul3c14ec91999-10-30 08:20:57 +00001175 * Map color indexes to float rgba values.
1176 */
Brian Paul179870a2000-04-12 18:54:48 +00001177void
1178_mesa_map_ci_to_rgba( const GLcontext *ctx, GLuint n,
1179 const GLuint index[], GLfloat rgba[][4] )
Brian Paul3c14ec91999-10-30 08:20:57 +00001180{
1181 GLuint rmask = ctx->Pixel.MapItoRsize - 1;
1182 GLuint gmask = ctx->Pixel.MapItoGsize - 1;
1183 GLuint bmask = ctx->Pixel.MapItoBsize - 1;
1184 GLuint amask = ctx->Pixel.MapItoAsize - 1;
1185 const GLfloat *rMap = ctx->Pixel.MapItoR;
1186 const GLfloat *gMap = ctx->Pixel.MapItoG;
1187 const GLfloat *bMap = ctx->Pixel.MapItoB;
1188 const GLfloat *aMap = ctx->Pixel.MapItoA;
1189 GLuint i;
1190 for (i=0;i<n;i++) {
1191 rgba[i][RCOMP] = rMap[index[i] & rmask];
1192 rgba[i][GCOMP] = gMap[index[i] & gmask];
1193 rgba[i][BCOMP] = bMap[index[i] & bmask];
1194 rgba[i][ACOMP] = aMap[index[i] & amask];
1195 }
1196}
1197
1198
1199/*
jtgafb833d1999-08-19 00:55:39 +00001200 * Map 8-bit color indexes to rgb values.
1201 */
Brian Paul179870a2000-04-12 18:54:48 +00001202void
1203_mesa_map_ci8_to_rgba( const GLcontext *ctx, GLuint n, const GLubyte index[],
Brian Paul699bc7b2000-10-29 18:12:14 +00001204 GLchan rgba[][4] )
jtgafb833d1999-08-19 00:55:39 +00001205{
Brian Paul699bc7b2000-10-29 18:12:14 +00001206#if CHAN_BITS == 8
jtgafb833d1999-08-19 00:55:39 +00001207 GLuint rmask = ctx->Pixel.MapItoRsize - 1;
1208 GLuint gmask = ctx->Pixel.MapItoGsize - 1;
1209 GLuint bmask = ctx->Pixel.MapItoBsize - 1;
1210 GLuint amask = ctx->Pixel.MapItoAsize - 1;
1211 const GLubyte *rMap = ctx->Pixel.MapItoR8;
1212 const GLubyte *gMap = ctx->Pixel.MapItoG8;
1213 const GLubyte *bMap = ctx->Pixel.MapItoB8;
1214 const GLubyte *aMap = ctx->Pixel.MapItoA8;
1215 GLuint i;
1216 for (i=0;i<n;i++) {
1217 rgba[i][RCOMP] = rMap[index[i] & rmask];
1218 rgba[i][GCOMP] = gMap[index[i] & gmask];
1219 rgba[i][BCOMP] = bMap[index[i] & bmask];
1220 rgba[i][ACOMP] = aMap[index[i] & amask];
1221 }
Brian Paul699bc7b2000-10-29 18:12:14 +00001222#else
1223 GLuint rmask = ctx->Pixel.MapItoRsize - 1;
1224 GLuint gmask = ctx->Pixel.MapItoGsize - 1;
1225 GLuint bmask = ctx->Pixel.MapItoBsize - 1;
1226 GLuint amask = ctx->Pixel.MapItoAsize - 1;
Brian Paul9499e012000-10-30 16:32:42 +00001227 const GLfloat *rMap = ctx->Pixel.MapItoR;
1228 const GLfloat *gMap = ctx->Pixel.MapItoG;
1229 const GLfloat *bMap = ctx->Pixel.MapItoB;
1230 const GLfloat *aMap = ctx->Pixel.MapItoA;
Brian Paul699bc7b2000-10-29 18:12:14 +00001231 GLuint i;
1232 for (i=0;i<n;i++) {
Brian Paul6532db92001-01-03 15:59:30 +00001233 CLAMPED_FLOAT_TO_CHAN(rgba[i][RCOMP], rMap[index[i] & rmask]);
1234 CLAMPED_FLOAT_TO_CHAN(rgba[i][GCOMP], gMap[index[i] & gmask]);
1235 CLAMPED_FLOAT_TO_CHAN(rgba[i][BCOMP], bMap[index[i] & bmask]);
1236 CLAMPED_FLOAT_TO_CHAN(rgba[i][ACOMP], aMap[index[i] & amask]);
Brian Paul699bc7b2000-10-29 18:12:14 +00001237 }
1238#endif
jtgafb833d1999-08-19 00:55:39 +00001239}
1240
1241
Brian Paul179870a2000-04-12 18:54:48 +00001242void
1243_mesa_shift_and_offset_stencil( const GLcontext *ctx, GLuint n,
1244 GLstencil stencil[] )
jtgafb833d1999-08-19 00:55:39 +00001245{
1246 GLuint i;
1247 GLint shift = ctx->Pixel.IndexShift;
1248 GLint offset = ctx->Pixel.IndexOffset;
1249 if (shift > 0) {
1250 for (i=0;i<n;i++) {
1251 stencil[i] = (stencil[i] << shift) + offset;
1252 }
1253 }
1254 else if (shift < 0) {
1255 shift = -shift;
1256 for (i=0;i<n;i++) {
1257 stencil[i] = (stencil[i] >> shift) + offset;
1258 }
1259 }
1260 else {
1261 for (i=0;i<n;i++) {
1262 stencil[i] = stencil[i] + offset;
1263 }
1264 }
1265
1266}
1267
1268
Brian Paul179870a2000-04-12 18:54:48 +00001269void
1270_mesa_map_stencil( const GLcontext *ctx, GLuint n, GLstencil stencil[] )
jtgafb833d1999-08-19 00:55:39 +00001271{
1272 GLuint mask = ctx->Pixel.MapStoSsize - 1;
1273 GLuint i;
1274 for (i=0;i<n;i++) {
1275 stencil[i] = ctx->Pixel.MapStoS[ stencil[i] & mask ];
1276 }
1277}
Brian Paul062bc072000-12-13 00:46:21 +00001278
1279
1280
1281/*
1282 * This function converts an array of GLchan colors to GLfloat colors.
1283 * Most importantly, it undoes the non-uniform quantization of pixel
1284 * values introduced when we convert shallow (< 8 bit) pixel values
1285 * to GLubytes in the ctx->Driver.ReadRGBASpan() functions.
1286 * This fixes a number of OpenGL conformance failures when running on
1287 * 16bpp displays, for example.
1288 */
1289void
1290_mesa_chan_to_float_span(const GLcontext *ctx, GLuint n,
1291 CONST GLchan rgba[][4], GLfloat rgbaf[][4])
1292{
Brian Paulf431a3f2001-07-13 20:07:37 +00001293#if CHAN_TYPE == GL_FLOAT
1294 MEMCPY(rgbaf, rgba, n * 4 * sizeof(GLfloat));
1295#else
Brian Paulb6bcae52001-01-23 23:39:36 +00001296 const GLuint rShift = CHAN_BITS - ctx->Visual.redBits;
1297 const GLuint gShift = CHAN_BITS - ctx->Visual.greenBits;
1298 const GLuint bShift = CHAN_BITS - ctx->Visual.blueBits;
Brian Paul062bc072000-12-13 00:46:21 +00001299 GLuint aShift;
Karl Schultz94a6ec82001-09-18 16:16:21 +00001300 const GLfloat rScale = 1.0F / (GLfloat) ((1 << ctx->Visual.redBits ) - 1);
1301 const GLfloat gScale = 1.0F / (GLfloat) ((1 << ctx->Visual.greenBits) - 1);
1302 const GLfloat bScale = 1.0F / (GLfloat) ((1 << ctx->Visual.blueBits ) - 1);
Brian Paul062bc072000-12-13 00:46:21 +00001303 GLfloat aScale;
1304 GLuint i;
1305
Brian Paulb6bcae52001-01-23 23:39:36 +00001306 if (ctx->Visual.alphaBits > 0) {
1307 aShift = CHAN_BITS - ctx->Visual.alphaBits;
Karl Schultz94a6ec82001-09-18 16:16:21 +00001308 aScale = 1.0F / (GLfloat) ((1 << ctx->Visual.alphaBits) - 1);
Brian Paul062bc072000-12-13 00:46:21 +00001309 }
1310 else {
1311 aShift = 0;
1312 aScale = 1.0F / CHAN_MAXF;
1313 }
1314
1315 for (i = 0; i < n; i++) {
1316 const GLint r = rgba[i][RCOMP] >> rShift;
1317 const GLint g = rgba[i][GCOMP] >> gShift;
1318 const GLint b = rgba[i][BCOMP] >> bShift;
1319 const GLint a = rgba[i][ACOMP] >> aShift;
1320 rgbaf[i][RCOMP] = (GLfloat) r * rScale;
1321 rgbaf[i][GCOMP] = (GLfloat) g * gScale;
1322 rgbaf[i][BCOMP] = (GLfloat) b * bScale;
1323 rgbaf[i][ACOMP] = (GLfloat) a * aScale;
1324 }
Brian Paulf431a3f2001-07-13 20:07:37 +00001325#endif
Brian Paul062bc072000-12-13 00:46:21 +00001326}