blob: cec1982ca3dbe4a3e44c24a0da6c514c30aba2e0 [file] [log] [blame]
Brian Paul7cac85d2003-01-26 14:34:56 +00001/* $Id: pixel.c,v 1.38 2003/01/26 14:34:56 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
Brian Paulfbd8f211999-11-11 01:22:25 +000027#include "glheader.h"
Brian Paul3c634522002-10-24 23:57:19 +000028#include "imports.h"
Brian Paulc893a012000-10-28 20:41:13 +000029#include "colormac.h"
jtgafb833d1999-08-19 00:55:39 +000030#include "context.h"
31#include "macros.h"
32#include "pixel.h"
Jouk Jansen5e3bc0c2000-11-22 07:32:16 +000033#include "mtypes.h"
jtgafb833d1999-08-19 00:55:39 +000034
35
36/**********************************************************************/
37/***** glPixelZoom *****/
38/**********************************************************************/
39
40
41
Brian Paulfbd8f211999-11-11 01:22:25 +000042void
43_mesa_PixelZoom( GLfloat xfactor, GLfloat yfactor )
jtgafb833d1999-08-19 00:55:39 +000044{
Brian Paulfbd8f211999-11-11 01:22:25 +000045 GET_CURRENT_CONTEXT(ctx);
jtgafb833d1999-08-19 00:55:39 +000046
Keith Whitwellcab974c2000-12-26 05:09:27 +000047 if (ctx->Pixel.ZoomX == xfactor &&
48 ctx->Pixel.ZoomY == yfactor)
49 return;
50
51 FLUSH_VERTICES(ctx, _NEW_PIXEL);
jtgafb833d1999-08-19 00:55:39 +000052 ctx->Pixel.ZoomX = xfactor;
53 ctx->Pixel.ZoomY = yfactor;
54}
55
56
57
58/**********************************************************************/
59/***** glPixelStore *****/
60/**********************************************************************/
61
62
Brian Paulfbd8f211999-11-11 01:22:25 +000063void
64_mesa_PixelStorei( GLenum pname, GLint param )
jtgafb833d1999-08-19 00:55:39 +000065{
66 /* NOTE: this call can't be compiled into the display list */
Brian Paulfbd8f211999-11-11 01:22:25 +000067 GET_CURRENT_CONTEXT(ctx);
Keith Whitwellcab974c2000-12-26 05:09:27 +000068 ASSERT_OUTSIDE_BEGIN_END(ctx);
jtgafb833d1999-08-19 00:55:39 +000069
jtgafb833d1999-08-19 00:55:39 +000070 switch (pname) {
71 case GL_PACK_SWAP_BYTES:
Gareth Hughes22144ab2001-03-12 00:48:37 +000072 if (param == (GLint)ctx->Pack.SwapBytes)
Keith Whitwellcab974c2000-12-26 05:09:27 +000073 return;
74 FLUSH_VERTICES(ctx, _NEW_PACKUNPACK);
jtgafb833d1999-08-19 00:55:39 +000075 ctx->Pack.SwapBytes = param ? GL_TRUE : GL_FALSE;
76 break;
77 case GL_PACK_LSB_FIRST:
Gareth Hughes22144ab2001-03-12 00:48:37 +000078 if (param == (GLint)ctx->Pack.LsbFirst)
Keith Whitwellcab974c2000-12-26 05:09:27 +000079 return;
80 FLUSH_VERTICES(ctx, _NEW_PACKUNPACK);
jtgafb833d1999-08-19 00:55:39 +000081 ctx->Pack.LsbFirst = param ? GL_TRUE : GL_FALSE;
82 break;
83 case GL_PACK_ROW_LENGTH:
84 if (param<0) {
Brian Paul08836342001-03-03 20:33:27 +000085 _mesa_error( ctx, GL_INVALID_VALUE, "glPixelStore(param)" );
Keith Whitwellcab974c2000-12-26 05:09:27 +000086 return;
jtgafb833d1999-08-19 00:55:39 +000087 }
Keith Whitwellcab974c2000-12-26 05:09:27 +000088 if (ctx->Pack.RowLength == param)
89 return;
90 FLUSH_VERTICES(ctx, _NEW_PACKUNPACK);
91 ctx->Pack.RowLength = param;
jtgafb833d1999-08-19 00:55:39 +000092 break;
93 case GL_PACK_IMAGE_HEIGHT:
Keith Whitwellcab974c2000-12-26 05:09:27 +000094 if (param<0) {
Brian Paul08836342001-03-03 20:33:27 +000095 _mesa_error( ctx, GL_INVALID_VALUE, "glPixelStore(param)" );
Keith Whitwellcab974c2000-12-26 05:09:27 +000096 return;
97 }
98 if (ctx->Pack.ImageHeight == param)
99 return;
100 FLUSH_VERTICES(ctx, _NEW_PACKUNPACK);
101 ctx->Pack.ImageHeight = param;
jtgafb833d1999-08-19 00:55:39 +0000102 break;
103 case GL_PACK_SKIP_PIXELS:
104 if (param<0) {
Brian Paul08836342001-03-03 20:33:27 +0000105 _mesa_error( ctx, GL_INVALID_VALUE, "glPixelStore(param)" );
Keith Whitwellcab974c2000-12-26 05:09:27 +0000106 return;
jtgafb833d1999-08-19 00:55:39 +0000107 }
Keith Whitwellcab974c2000-12-26 05:09:27 +0000108 if (ctx->Pack.SkipPixels == param)
109 return;
110 FLUSH_VERTICES(ctx, _NEW_PACKUNPACK);
111 ctx->Pack.SkipPixels = param;
jtgafb833d1999-08-19 00:55:39 +0000112 break;
113 case GL_PACK_SKIP_ROWS:
114 if (param<0) {
Brian Paul08836342001-03-03 20:33:27 +0000115 _mesa_error( ctx, GL_INVALID_VALUE, "glPixelStore(param)" );
Keith Whitwellcab974c2000-12-26 05:09:27 +0000116 return;
jtgafb833d1999-08-19 00:55:39 +0000117 }
Keith Whitwellcab974c2000-12-26 05:09:27 +0000118 if (ctx->Pack.SkipRows == param)
119 return;
120 FLUSH_VERTICES(ctx, _NEW_PACKUNPACK);
121 ctx->Pack.SkipRows = param;
jtgafb833d1999-08-19 00:55:39 +0000122 break;
Brian Paula5b66332000-10-19 20:09:47 +0000123 case GL_PACK_SKIP_IMAGES:
124 if (param<0) {
Brian Paul08836342001-03-03 20:33:27 +0000125 _mesa_error( ctx, GL_INVALID_VALUE, "glPixelStore(param)" );
Keith Whitwellcab974c2000-12-26 05:09:27 +0000126 return;
Brian Paula5b66332000-10-19 20:09:47 +0000127 }
Keith Whitwellcab974c2000-12-26 05:09:27 +0000128 if (ctx->Pack.SkipImages == param)
129 return;
130 FLUSH_VERTICES(ctx, _NEW_PACKUNPACK);
131 ctx->Pack.SkipImages = param;
Brian Paula5b66332000-10-19 20:09:47 +0000132 break;
jtgafb833d1999-08-19 00:55:39 +0000133 case GL_PACK_ALIGNMENT:
Keith Whitwellcab974c2000-12-26 05:09:27 +0000134 if (param!=1 && param!=2 && param!=4 && param!=8) {
Brian Paul08836342001-03-03 20:33:27 +0000135 _mesa_error( ctx, GL_INVALID_VALUE, "glPixelStore(param)" );
Keith Whitwellcab974c2000-12-26 05:09:27 +0000136 return;
jtgafb833d1999-08-19 00:55:39 +0000137 }
Keith Whitwellcab974c2000-12-26 05:09:27 +0000138 if (ctx->Pack.Alignment == param)
139 return;
140 FLUSH_VERTICES(ctx, _NEW_PACKUNPACK);
141 ctx->Pack.Alignment = param;
jtgafb833d1999-08-19 00:55:39 +0000142 break;
Brian Paul551b65f2002-09-21 17:34:56 +0000143 case GL_PACK_INVERT_MESA:
144 if (!ctx->Extensions.MESA_pack_invert) {
145 _mesa_error( ctx, GL_INVALID_ENUM, "glPixelstore(pname)" );
146 return;
147 }
148 if (ctx->Pack.Invert == param)
149 return;
150 FLUSH_VERTICES(ctx, _NEW_PACKUNPACK);
151 ctx->Pack.Invert = param;
152 break;
153
jtgafb833d1999-08-19 00:55:39 +0000154 case GL_UNPACK_SWAP_BYTES:
Gareth Hughes22144ab2001-03-12 00:48:37 +0000155 if (param == (GLint)ctx->Unpack.SwapBytes)
Keith Whitwellcab974c2000-12-26 05:09:27 +0000156 return;
157 if ((GLint)ctx->Unpack.SwapBytes == param)
158 return;
159 FLUSH_VERTICES(ctx, _NEW_PACKUNPACK);
jtgafb833d1999-08-19 00:55:39 +0000160 ctx->Unpack.SwapBytes = param ? GL_TRUE : GL_FALSE;
161 break;
162 case GL_UNPACK_LSB_FIRST:
Gareth Hughes22144ab2001-03-12 00:48:37 +0000163 if (param == (GLint)ctx->Unpack.LsbFirst)
Keith Whitwellcab974c2000-12-26 05:09:27 +0000164 return;
165 if ((GLint)ctx->Unpack.LsbFirst == param)
166 return;
167 FLUSH_VERTICES(ctx, _NEW_PACKUNPACK);
jtgafb833d1999-08-19 00:55:39 +0000168 ctx->Unpack.LsbFirst = param ? GL_TRUE : GL_FALSE;
169 break;
170 case GL_UNPACK_ROW_LENGTH:
171 if (param<0) {
Brian Paul08836342001-03-03 20:33:27 +0000172 _mesa_error( ctx, GL_INVALID_VALUE, "glPixelStore(param)" );
Keith Whitwellcab974c2000-12-26 05:09:27 +0000173 return;
jtgafb833d1999-08-19 00:55:39 +0000174 }
Keith Whitwellcab974c2000-12-26 05:09:27 +0000175 if (ctx->Unpack.RowLength == param)
176 return;
177 FLUSH_VERTICES(ctx, _NEW_PACKUNPACK);
178 ctx->Unpack.RowLength = param;
jtgafb833d1999-08-19 00:55:39 +0000179 break;
180 case GL_UNPACK_IMAGE_HEIGHT:
Keith Whitwellcab974c2000-12-26 05:09:27 +0000181 if (param<0) {
Brian Paul08836342001-03-03 20:33:27 +0000182 _mesa_error( ctx, GL_INVALID_VALUE, "glPixelStore(param)" );
Keith Whitwellcab974c2000-12-26 05:09:27 +0000183 return;
184 }
185 if (ctx->Unpack.ImageHeight == param)
186 return;
187
188 FLUSH_VERTICES(ctx, _NEW_PACKUNPACK);
189 ctx->Unpack.ImageHeight = param;
jtgafb833d1999-08-19 00:55:39 +0000190 break;
191 case GL_UNPACK_SKIP_PIXELS:
192 if (param<0) {
Brian Paul08836342001-03-03 20:33:27 +0000193 _mesa_error( ctx, GL_INVALID_VALUE, "glPixelStore(param)" );
Keith Whitwellcab974c2000-12-26 05:09:27 +0000194 return;
jtgafb833d1999-08-19 00:55:39 +0000195 }
Keith Whitwellcab974c2000-12-26 05:09:27 +0000196 if (ctx->Unpack.SkipPixels == param)
197 return;
198 FLUSH_VERTICES(ctx, _NEW_PACKUNPACK);
199 ctx->Unpack.SkipPixels = param;
jtgafb833d1999-08-19 00:55:39 +0000200 break;
201 case GL_UNPACK_SKIP_ROWS:
202 if (param<0) {
Brian Paul08836342001-03-03 20:33:27 +0000203 _mesa_error( ctx, GL_INVALID_VALUE, "glPixelStore(param)" );
Keith Whitwellcab974c2000-12-26 05:09:27 +0000204 return;
jtgafb833d1999-08-19 00:55:39 +0000205 }
Keith Whitwellcab974c2000-12-26 05:09:27 +0000206 if (ctx->Unpack.SkipRows == param)
207 return;
208 FLUSH_VERTICES(ctx, _NEW_PACKUNPACK);
209 ctx->Unpack.SkipRows = param;
jtgafb833d1999-08-19 00:55:39 +0000210 break;
Brian Paula5b66332000-10-19 20:09:47 +0000211 case GL_UNPACK_SKIP_IMAGES:
212 if (param < 0) {
Brian Paul08836342001-03-03 20:33:27 +0000213 _mesa_error( ctx, GL_INVALID_VALUE, "glPixelStore(param)" );
Keith Whitwellcab974c2000-12-26 05:09:27 +0000214 return;
Brian Paula5b66332000-10-19 20:09:47 +0000215 }
Keith Whitwellcab974c2000-12-26 05:09:27 +0000216 if (ctx->Unpack.SkipImages == param)
217 return;
218 FLUSH_VERTICES(ctx, _NEW_PACKUNPACK);
219 ctx->Unpack.SkipImages = param;
Brian Paula5b66332000-10-19 20:09:47 +0000220 break;
jtgafb833d1999-08-19 00:55:39 +0000221 case GL_UNPACK_ALIGNMENT:
Keith Whitwellcab974c2000-12-26 05:09:27 +0000222 if (param!=1 && param!=2 && param!=4 && param!=8) {
Brian Paul08836342001-03-03 20:33:27 +0000223 _mesa_error( ctx, GL_INVALID_VALUE, "glPixelStore" );
Keith Whitwellcab974c2000-12-26 05:09:27 +0000224 return;
jtgafb833d1999-08-19 00:55:39 +0000225 }
Keith Whitwellcab974c2000-12-26 05:09:27 +0000226 if (ctx->Unpack.Alignment == param)
227 return;
228 FLUSH_VERTICES(ctx, _NEW_PACKUNPACK);
229 ctx->Unpack.Alignment = param;
jtgafb833d1999-08-19 00:55:39 +0000230 break;
Brian Paulc5b99502002-09-21 16:51:25 +0000231 case GL_UNPACK_CLIENT_STORAGE_APPLE:
232 if (param == (GLint)ctx->Unpack.ClientStorage)
233 return;
234 FLUSH_VERTICES(ctx, _NEW_PACKUNPACK);
235 ctx->Unpack.ClientStorage = param ? GL_TRUE : GL_FALSE;
236 break;
jtgafb833d1999-08-19 00:55:39 +0000237 default:
Brian Paul08836342001-03-03 20:33:27 +0000238 _mesa_error( ctx, GL_INVALID_ENUM, "glPixelStore" );
Keith Whitwellcab974c2000-12-26 05:09:27 +0000239 return;
jtgafb833d1999-08-19 00:55:39 +0000240 }
241}
242
243
Brian Paulfbd8f211999-11-11 01:22:25 +0000244void
245_mesa_PixelStoref( GLenum pname, GLfloat param )
246{
247 _mesa_PixelStorei( pname, (GLint) param );
248}
jtgafb833d1999-08-19 00:55:39 +0000249
250
251
252/**********************************************************************/
253/***** glPixelMap *****/
254/**********************************************************************/
255
256
257
Brian Paulfbd8f211999-11-11 01:22:25 +0000258void
259_mesa_PixelMapfv( GLenum map, GLint mapsize, const GLfloat *values )
jtgafb833d1999-08-19 00:55:39 +0000260{
261 GLint i;
Brian Paulfbd8f211999-11-11 01:22:25 +0000262 GET_CURRENT_CONTEXT(ctx);
Keith Whitwellcab974c2000-12-26 05:09:27 +0000263 ASSERT_OUTSIDE_BEGIN_END(ctx);
jtgafb833d1999-08-19 00:55:39 +0000264
Brian Pauldf7bd4b2002-04-24 20:11:20 +0000265 if (mapsize < 1 || mapsize > MAX_PIXEL_MAP_TABLE) {
Brian Paul08836342001-03-03 20:33:27 +0000266 _mesa_error( ctx, GL_INVALID_VALUE, "glPixelMapfv(mapsize)" );
jtgafb833d1999-08-19 00:55:39 +0000267 return;
268 }
269
Brian Pauldf7bd4b2002-04-24 20:11:20 +0000270 if (map >= GL_PIXEL_MAP_S_TO_S && map <= GL_PIXEL_MAP_I_TO_A) {
jtgafb833d1999-08-19 00:55:39 +0000271 /* test that mapsize is a power of two */
Brian Paulaecfb512001-12-04 23:45:31 +0000272 if (_mesa_bitcount((GLuint) mapsize) != 1) {
Brian Paul08836342001-03-03 20:33:27 +0000273 _mesa_error( ctx, GL_INVALID_VALUE, "glPixelMapfv(mapsize)" );
jtgafb833d1999-08-19 00:55:39 +0000274 return;
275 }
276 }
277
Keith Whitwellcab974c2000-12-26 05:09:27 +0000278 FLUSH_VERTICES(ctx, _NEW_PIXEL);
279
jtgafb833d1999-08-19 00:55:39 +0000280 switch (map) {
281 case GL_PIXEL_MAP_S_TO_S:
282 ctx->Pixel.MapStoSsize = mapsize;
283 for (i=0;i<mapsize;i++) {
284 ctx->Pixel.MapStoS[i] = (GLint) values[i];
285 }
286 break;
287 case GL_PIXEL_MAP_I_TO_I:
288 ctx->Pixel.MapItoIsize = mapsize;
289 for (i=0;i<mapsize;i++) {
290 ctx->Pixel.MapItoI[i] = (GLint) values[i];
291 }
292 break;
293 case GL_PIXEL_MAP_I_TO_R:
294 ctx->Pixel.MapItoRsize = mapsize;
295 for (i=0;i<mapsize;i++) {
Karl Schultz94a6ec82001-09-18 16:16:21 +0000296 GLfloat val = CLAMP( values[i], 0.0F, 1.0F );
jtgafb833d1999-08-19 00:55:39 +0000297 ctx->Pixel.MapItoR[i] = val;
298 ctx->Pixel.MapItoR8[i] = (GLint) (val * 255.0F);
299 }
300 break;
301 case GL_PIXEL_MAP_I_TO_G:
302 ctx->Pixel.MapItoGsize = mapsize;
303 for (i=0;i<mapsize;i++) {
Karl Schultz94a6ec82001-09-18 16:16:21 +0000304 GLfloat val = CLAMP( values[i], 0.0F, 1.0F );
jtgafb833d1999-08-19 00:55:39 +0000305 ctx->Pixel.MapItoG[i] = val;
306 ctx->Pixel.MapItoG8[i] = (GLint) (val * 255.0F);
307 }
308 break;
309 case GL_PIXEL_MAP_I_TO_B:
310 ctx->Pixel.MapItoBsize = mapsize;
311 for (i=0;i<mapsize;i++) {
Karl Schultz94a6ec82001-09-18 16:16:21 +0000312 GLfloat val = CLAMP( values[i], 0.0F, 1.0F );
jtgafb833d1999-08-19 00:55:39 +0000313 ctx->Pixel.MapItoB[i] = val;
314 ctx->Pixel.MapItoB8[i] = (GLint) (val * 255.0F);
315 }
316 break;
317 case GL_PIXEL_MAP_I_TO_A:
318 ctx->Pixel.MapItoAsize = mapsize;
319 for (i=0;i<mapsize;i++) {
Karl Schultz94a6ec82001-09-18 16:16:21 +0000320 GLfloat val = CLAMP( values[i], 0.0F, 1.0F );
jtgafb833d1999-08-19 00:55:39 +0000321 ctx->Pixel.MapItoA[i] = val;
322 ctx->Pixel.MapItoA8[i] = (GLint) (val * 255.0F);
323 }
324 break;
325 case GL_PIXEL_MAP_R_TO_R:
326 ctx->Pixel.MapRtoRsize = mapsize;
327 for (i=0;i<mapsize;i++) {
Karl Schultz94a6ec82001-09-18 16:16:21 +0000328 ctx->Pixel.MapRtoR[i] = CLAMP( values[i], 0.0F, 1.0F );
jtgafb833d1999-08-19 00:55:39 +0000329 }
330 break;
331 case GL_PIXEL_MAP_G_TO_G:
332 ctx->Pixel.MapGtoGsize = mapsize;
333 for (i=0;i<mapsize;i++) {
Karl Schultz94a6ec82001-09-18 16:16:21 +0000334 ctx->Pixel.MapGtoG[i] = CLAMP( values[i], 0.0F, 1.0F );
jtgafb833d1999-08-19 00:55:39 +0000335 }
336 break;
337 case GL_PIXEL_MAP_B_TO_B:
338 ctx->Pixel.MapBtoBsize = mapsize;
339 for (i=0;i<mapsize;i++) {
Karl Schultz94a6ec82001-09-18 16:16:21 +0000340 ctx->Pixel.MapBtoB[i] = CLAMP( values[i], 0.0F, 1.0F );
jtgafb833d1999-08-19 00:55:39 +0000341 }
342 break;
343 case GL_PIXEL_MAP_A_TO_A:
344 ctx->Pixel.MapAtoAsize = mapsize;
345 for (i=0;i<mapsize;i++) {
Karl Schultz94a6ec82001-09-18 16:16:21 +0000346 ctx->Pixel.MapAtoA[i] = CLAMP( values[i], 0.0F, 1.0F );
jtgafb833d1999-08-19 00:55:39 +0000347 }
348 break;
349 default:
Brian Paul08836342001-03-03 20:33:27 +0000350 _mesa_error( ctx, GL_INVALID_ENUM, "glPixelMapfv(map)" );
jtgafb833d1999-08-19 00:55:39 +0000351 }
352}
353
354
355
Brian Paulfbd8f211999-11-11 01:22:25 +0000356void
357_mesa_PixelMapuiv(GLenum map, GLint mapsize, const GLuint *values )
jtgafb833d1999-08-19 00:55:39 +0000358{
Brian Paulaecfb512001-12-04 23:45:31 +0000359 const GLint n = MIN2(mapsize, MAX_PIXEL_MAP_TABLE);
Brian Paulfbd8f211999-11-11 01:22:25 +0000360 GLfloat fvalues[MAX_PIXEL_MAP_TABLE];
361 GLint i;
362 if (map==GL_PIXEL_MAP_I_TO_I || map==GL_PIXEL_MAP_S_TO_S) {
Brian Paulaecfb512001-12-04 23:45:31 +0000363 for (i=0;i<n;i++) {
Brian Paulfbd8f211999-11-11 01:22:25 +0000364 fvalues[i] = (GLfloat) values[i];
365 }
366 }
367 else {
Brian Paulaecfb512001-12-04 23:45:31 +0000368 for (i=0;i<n;i++) {
Brian Paulfbd8f211999-11-11 01:22:25 +0000369 fvalues[i] = UINT_TO_FLOAT( values[i] );
370 }
371 }
372 _mesa_PixelMapfv(map, mapsize, fvalues);
373}
374
375
376
377void
378_mesa_PixelMapusv(GLenum map, GLint mapsize, const GLushort *values )
379{
Brian Paulaecfb512001-12-04 23:45:31 +0000380 const GLint n = MIN2(mapsize, MAX_PIXEL_MAP_TABLE);
Brian Paulfbd8f211999-11-11 01:22:25 +0000381 GLfloat fvalues[MAX_PIXEL_MAP_TABLE];
382 GLint i;
383 if (map==GL_PIXEL_MAP_I_TO_I || map==GL_PIXEL_MAP_S_TO_S) {
Brian Paulaecfb512001-12-04 23:45:31 +0000384 for (i=0;i<n;i++) {
Brian Paulfbd8f211999-11-11 01:22:25 +0000385 fvalues[i] = (GLfloat) values[i];
386 }
387 }
388 else {
Brian Paulaecfb512001-12-04 23:45:31 +0000389 for (i=0;i<n;i++) {
Brian Paulfbd8f211999-11-11 01:22:25 +0000390 fvalues[i] = USHORT_TO_FLOAT( values[i] );
391 }
392 }
393 _mesa_PixelMapfv(map, mapsize, fvalues);
394}
395
396
397
398void
399_mesa_GetPixelMapfv( GLenum map, GLfloat *values )
400{
401 GET_CURRENT_CONTEXT(ctx);
jtgafb833d1999-08-19 00:55:39 +0000402 GLint i;
Keith Whitwellcab974c2000-12-26 05:09:27 +0000403 ASSERT_OUTSIDE_BEGIN_END(ctx);
jtgafb833d1999-08-19 00:55:39 +0000404
405 switch (map) {
406 case GL_PIXEL_MAP_I_TO_I:
407 for (i=0;i<ctx->Pixel.MapItoIsize;i++) {
408 values[i] = (GLfloat) ctx->Pixel.MapItoI[i];
409 }
410 break;
411 case GL_PIXEL_MAP_S_TO_S:
412 for (i=0;i<ctx->Pixel.MapStoSsize;i++) {
413 values[i] = (GLfloat) ctx->Pixel.MapStoS[i];
414 }
415 break;
416 case GL_PIXEL_MAP_I_TO_R:
417 MEMCPY(values,ctx->Pixel.MapItoR,ctx->Pixel.MapItoRsize*sizeof(GLfloat));
418 break;
419 case GL_PIXEL_MAP_I_TO_G:
420 MEMCPY(values,ctx->Pixel.MapItoG,ctx->Pixel.MapItoGsize*sizeof(GLfloat));
421 break;
422 case GL_PIXEL_MAP_I_TO_B:
423 MEMCPY(values,ctx->Pixel.MapItoB,ctx->Pixel.MapItoBsize*sizeof(GLfloat));
424 break;
425 case GL_PIXEL_MAP_I_TO_A:
426 MEMCPY(values,ctx->Pixel.MapItoA,ctx->Pixel.MapItoAsize*sizeof(GLfloat));
427 break;
428 case GL_PIXEL_MAP_R_TO_R:
429 MEMCPY(values,ctx->Pixel.MapRtoR,ctx->Pixel.MapRtoRsize*sizeof(GLfloat));
430 break;
431 case GL_PIXEL_MAP_G_TO_G:
432 MEMCPY(values,ctx->Pixel.MapGtoG,ctx->Pixel.MapGtoGsize*sizeof(GLfloat));
433 break;
434 case GL_PIXEL_MAP_B_TO_B:
435 MEMCPY(values,ctx->Pixel.MapBtoB,ctx->Pixel.MapBtoBsize*sizeof(GLfloat));
436 break;
437 case GL_PIXEL_MAP_A_TO_A:
438 MEMCPY(values,ctx->Pixel.MapAtoA,ctx->Pixel.MapAtoAsize*sizeof(GLfloat));
439 break;
440 default:
Brian Paul08836342001-03-03 20:33:27 +0000441 _mesa_error( ctx, GL_INVALID_ENUM, "glGetPixelMapfv" );
jtgafb833d1999-08-19 00:55:39 +0000442 }
443}
444
445
Brian Paulfbd8f211999-11-11 01:22:25 +0000446void
447_mesa_GetPixelMapuiv( GLenum map, GLuint *values )
jtgafb833d1999-08-19 00:55:39 +0000448{
Brian Paulfbd8f211999-11-11 01:22:25 +0000449 GET_CURRENT_CONTEXT(ctx);
jtgafb833d1999-08-19 00:55:39 +0000450 GLint i;
Keith Whitwellcab974c2000-12-26 05:09:27 +0000451 ASSERT_OUTSIDE_BEGIN_END(ctx);
jtgafb833d1999-08-19 00:55:39 +0000452
453 switch (map) {
454 case GL_PIXEL_MAP_I_TO_I:
455 MEMCPY(values, ctx->Pixel.MapItoI, ctx->Pixel.MapItoIsize*sizeof(GLint));
456 break;
457 case GL_PIXEL_MAP_S_TO_S:
458 MEMCPY(values, ctx->Pixel.MapStoS, ctx->Pixel.MapStoSsize*sizeof(GLint));
459 break;
460 case GL_PIXEL_MAP_I_TO_R:
461 for (i=0;i<ctx->Pixel.MapItoRsize;i++) {
462 values[i] = FLOAT_TO_UINT( ctx->Pixel.MapItoR[i] );
463 }
464 break;
465 case GL_PIXEL_MAP_I_TO_G:
466 for (i=0;i<ctx->Pixel.MapItoGsize;i++) {
467 values[i] = FLOAT_TO_UINT( ctx->Pixel.MapItoG[i] );
468 }
469 break;
470 case GL_PIXEL_MAP_I_TO_B:
471 for (i=0;i<ctx->Pixel.MapItoBsize;i++) {
472 values[i] = FLOAT_TO_UINT( ctx->Pixel.MapItoB[i] );
473 }
474 break;
475 case GL_PIXEL_MAP_I_TO_A:
476 for (i=0;i<ctx->Pixel.MapItoAsize;i++) {
477 values[i] = FLOAT_TO_UINT( ctx->Pixel.MapItoA[i] );
478 }
479 break;
480 case GL_PIXEL_MAP_R_TO_R:
481 for (i=0;i<ctx->Pixel.MapRtoRsize;i++) {
482 values[i] = FLOAT_TO_UINT( ctx->Pixel.MapRtoR[i] );
483 }
484 break;
485 case GL_PIXEL_MAP_G_TO_G:
486 for (i=0;i<ctx->Pixel.MapGtoGsize;i++) {
487 values[i] = FLOAT_TO_UINT( ctx->Pixel.MapGtoG[i] );
488 }
489 break;
490 case GL_PIXEL_MAP_B_TO_B:
491 for (i=0;i<ctx->Pixel.MapBtoBsize;i++) {
492 values[i] = FLOAT_TO_UINT( ctx->Pixel.MapBtoB[i] );
493 }
494 break;
495 case GL_PIXEL_MAP_A_TO_A:
496 for (i=0;i<ctx->Pixel.MapAtoAsize;i++) {
497 values[i] = FLOAT_TO_UINT( ctx->Pixel.MapAtoA[i] );
498 }
499 break;
500 default:
Brian Paul08836342001-03-03 20:33:27 +0000501 _mesa_error( ctx, GL_INVALID_ENUM, "glGetPixelMapfv" );
jtgafb833d1999-08-19 00:55:39 +0000502 }
503}
504
505
Brian Paulfbd8f211999-11-11 01:22:25 +0000506void
507_mesa_GetPixelMapusv( GLenum map, GLushort *values )
jtgafb833d1999-08-19 00:55:39 +0000508{
Brian Paulfbd8f211999-11-11 01:22:25 +0000509 GET_CURRENT_CONTEXT(ctx);
jtgafb833d1999-08-19 00:55:39 +0000510 GLint i;
Keith Whitwellcab974c2000-12-26 05:09:27 +0000511 ASSERT_OUTSIDE_BEGIN_END(ctx);
jtgafb833d1999-08-19 00:55:39 +0000512
513 switch (map) {
514 case GL_PIXEL_MAP_I_TO_I:
515 for (i=0;i<ctx->Pixel.MapItoIsize;i++) {
516 values[i] = (GLushort) ctx->Pixel.MapItoI[i];
517 }
518 break;
519 case GL_PIXEL_MAP_S_TO_S:
520 for (i=0;i<ctx->Pixel.MapStoSsize;i++) {
521 values[i] = (GLushort) ctx->Pixel.MapStoS[i];
522 }
523 break;
524 case GL_PIXEL_MAP_I_TO_R:
525 for (i=0;i<ctx->Pixel.MapItoRsize;i++) {
526 values[i] = FLOAT_TO_USHORT( ctx->Pixel.MapItoR[i] );
527 }
528 break;
529 case GL_PIXEL_MAP_I_TO_G:
530 for (i=0;i<ctx->Pixel.MapItoGsize;i++) {
531 values[i] = FLOAT_TO_USHORT( ctx->Pixel.MapItoG[i] );
532 }
533 break;
534 case GL_PIXEL_MAP_I_TO_B:
535 for (i=0;i<ctx->Pixel.MapItoBsize;i++) {
536 values[i] = FLOAT_TO_USHORT( ctx->Pixel.MapItoB[i] );
537 }
538 break;
539 case GL_PIXEL_MAP_I_TO_A:
540 for (i=0;i<ctx->Pixel.MapItoAsize;i++) {
541 values[i] = FLOAT_TO_USHORT( ctx->Pixel.MapItoA[i] );
542 }
543 break;
544 case GL_PIXEL_MAP_R_TO_R:
545 for (i=0;i<ctx->Pixel.MapRtoRsize;i++) {
546 values[i] = FLOAT_TO_USHORT( ctx->Pixel.MapRtoR[i] );
547 }
548 break;
549 case GL_PIXEL_MAP_G_TO_G:
550 for (i=0;i<ctx->Pixel.MapGtoGsize;i++) {
551 values[i] = FLOAT_TO_USHORT( ctx->Pixel.MapGtoG[i] );
552 }
553 break;
554 case GL_PIXEL_MAP_B_TO_B:
555 for (i=0;i<ctx->Pixel.MapBtoBsize;i++) {
556 values[i] = FLOAT_TO_USHORT( ctx->Pixel.MapBtoB[i] );
557 }
558 break;
559 case GL_PIXEL_MAP_A_TO_A:
560 for (i=0;i<ctx->Pixel.MapAtoAsize;i++) {
561 values[i] = FLOAT_TO_USHORT( ctx->Pixel.MapAtoA[i] );
562 }
563 break;
564 default:
Brian Paul08836342001-03-03 20:33:27 +0000565 _mesa_error( ctx, GL_INVALID_ENUM, "glGetPixelMapfv" );
jtgafb833d1999-08-19 00:55:39 +0000566 }
567}
568
569
570
571/**********************************************************************/
572/***** glPixelTransfer *****/
573/**********************************************************************/
574
575
576/*
577 * Implements glPixelTransfer[fi] whether called immediately or from a
578 * display list.
579 */
Brian Paulfbd8f211999-11-11 01:22:25 +0000580void
581_mesa_PixelTransferf( GLenum pname, GLfloat param )
jtgafb833d1999-08-19 00:55:39 +0000582{
Brian Paulfbd8f211999-11-11 01:22:25 +0000583 GET_CURRENT_CONTEXT(ctx);
Keith Whitwellcab974c2000-12-26 05:09:27 +0000584 ASSERT_OUTSIDE_BEGIN_END(ctx);
jtgafb833d1999-08-19 00:55:39 +0000585
586 switch (pname) {
587 case GL_MAP_COLOR:
Brian Paulf431a3f2001-07-13 20:07:37 +0000588 if (ctx->Pixel.MapColorFlag == (param ? GL_TRUE : GL_FALSE))
Keith Whitwellcab974c2000-12-26 05:09:27 +0000589 return;
590 FLUSH_VERTICES(ctx, _NEW_PIXEL);
jtgafb833d1999-08-19 00:55:39 +0000591 ctx->Pixel.MapColorFlag = param ? GL_TRUE : GL_FALSE;
592 break;
593 case GL_MAP_STENCIL:
Brian Paulf431a3f2001-07-13 20:07:37 +0000594 if (ctx->Pixel.MapStencilFlag == (param ? GL_TRUE : GL_FALSE))
Keith Whitwellcab974c2000-12-26 05:09:27 +0000595 return;
596 FLUSH_VERTICES(ctx, _NEW_PIXEL);
jtgafb833d1999-08-19 00:55:39 +0000597 ctx->Pixel.MapStencilFlag = param ? GL_TRUE : GL_FALSE;
598 break;
599 case GL_INDEX_SHIFT:
Keith Whitwellcab974c2000-12-26 05:09:27 +0000600 if (ctx->Pixel.IndexShift == (GLint) param)
601 return;
602 FLUSH_VERTICES(ctx, _NEW_PIXEL);
jtgafb833d1999-08-19 00:55:39 +0000603 ctx->Pixel.IndexShift = (GLint) param;
604 break;
605 case GL_INDEX_OFFSET:
Keith Whitwellcab974c2000-12-26 05:09:27 +0000606 if (ctx->Pixel.IndexOffset == (GLint) param)
607 return;
608 FLUSH_VERTICES(ctx, _NEW_PIXEL);
jtgafb833d1999-08-19 00:55:39 +0000609 ctx->Pixel.IndexOffset = (GLint) param;
610 break;
611 case GL_RED_SCALE:
Keith Whitwellcab974c2000-12-26 05:09:27 +0000612 if (ctx->Pixel.RedScale == param)
613 return;
614 FLUSH_VERTICES(ctx, _NEW_PIXEL);
jtgafb833d1999-08-19 00:55:39 +0000615 ctx->Pixel.RedScale = param;
616 break;
617 case GL_RED_BIAS:
Keith Whitwellcab974c2000-12-26 05:09:27 +0000618 if (ctx->Pixel.RedBias == param)
619 return;
620 FLUSH_VERTICES(ctx, _NEW_PIXEL);
jtgafb833d1999-08-19 00:55:39 +0000621 ctx->Pixel.RedBias = param;
622 break;
623 case GL_GREEN_SCALE:
Keith Whitwellcab974c2000-12-26 05:09:27 +0000624 if (ctx->Pixel.GreenScale == param)
625 return;
626 FLUSH_VERTICES(ctx, _NEW_PIXEL);
jtgafb833d1999-08-19 00:55:39 +0000627 ctx->Pixel.GreenScale = param;
628 break;
629 case GL_GREEN_BIAS:
Keith Whitwellcab974c2000-12-26 05:09:27 +0000630 if (ctx->Pixel.GreenBias == param)
631 return;
632 FLUSH_VERTICES(ctx, _NEW_PIXEL);
jtgafb833d1999-08-19 00:55:39 +0000633 ctx->Pixel.GreenBias = param;
634 break;
635 case GL_BLUE_SCALE:
Keith Whitwellcab974c2000-12-26 05:09:27 +0000636 if (ctx->Pixel.BlueScale == param)
637 return;
638 FLUSH_VERTICES(ctx, _NEW_PIXEL);
jtgafb833d1999-08-19 00:55:39 +0000639 ctx->Pixel.BlueScale = param;
640 break;
641 case GL_BLUE_BIAS:
Keith Whitwellcab974c2000-12-26 05:09:27 +0000642 if (ctx->Pixel.BlueBias == param)
643 return;
644 FLUSH_VERTICES(ctx, _NEW_PIXEL);
jtgafb833d1999-08-19 00:55:39 +0000645 ctx->Pixel.BlueBias = param;
646 break;
647 case GL_ALPHA_SCALE:
Keith Whitwellcab974c2000-12-26 05:09:27 +0000648 if (ctx->Pixel.AlphaScale == param)
649 return;
650 FLUSH_VERTICES(ctx, _NEW_PIXEL);
jtgafb833d1999-08-19 00:55:39 +0000651 ctx->Pixel.AlphaScale = param;
652 break;
653 case GL_ALPHA_BIAS:
Keith Whitwellcab974c2000-12-26 05:09:27 +0000654 if (ctx->Pixel.AlphaBias == param)
655 return;
656 FLUSH_VERTICES(ctx, _NEW_PIXEL);
jtgafb833d1999-08-19 00:55:39 +0000657 ctx->Pixel.AlphaBias = param;
658 break;
659 case GL_DEPTH_SCALE:
Keith Whitwellcab974c2000-12-26 05:09:27 +0000660 if (ctx->Pixel.DepthScale == param)
661 return;
662 FLUSH_VERTICES(ctx, _NEW_PIXEL);
jtgafb833d1999-08-19 00:55:39 +0000663 ctx->Pixel.DepthScale = param;
664 break;
665 case GL_DEPTH_BIAS:
Keith Whitwellcab974c2000-12-26 05:09:27 +0000666 if (ctx->Pixel.DepthBias == param)
667 return;
668 FLUSH_VERTICES(ctx, _NEW_PIXEL);
jtgafb833d1999-08-19 00:55:39 +0000669 ctx->Pixel.DepthBias = param;
670 break;
Brian Paul250069d2000-04-08 18:57:45 +0000671 case GL_POST_COLOR_MATRIX_RED_SCALE:
Keith Whitwellcab974c2000-12-26 05:09:27 +0000672 if (ctx->Pixel.PostColorMatrixScale[0] == param)
673 return;
674 FLUSH_VERTICES(ctx, _NEW_PIXEL);
Brian Paul82b02f02000-05-07 20:37:40 +0000675 ctx->Pixel.PostColorMatrixScale[0] = param;
Brian Paul250069d2000-04-08 18:57:45 +0000676 break;
677 case GL_POST_COLOR_MATRIX_RED_BIAS:
Keith Whitwellcab974c2000-12-26 05:09:27 +0000678 if (ctx->Pixel.PostColorMatrixBias[0] == param)
679 return;
680 FLUSH_VERTICES(ctx, _NEW_PIXEL);
Brian Paul82b02f02000-05-07 20:37:40 +0000681 ctx->Pixel.PostColorMatrixBias[0] = param;
Brian Paul250069d2000-04-08 18:57:45 +0000682 break;
683 case GL_POST_COLOR_MATRIX_GREEN_SCALE:
Keith Whitwellcab974c2000-12-26 05:09:27 +0000684 if (ctx->Pixel.PostColorMatrixScale[1] == param)
685 return;
686 FLUSH_VERTICES(ctx, _NEW_PIXEL);
Brian Paul82b02f02000-05-07 20:37:40 +0000687 ctx->Pixel.PostColorMatrixScale[1] = param;
Brian Paul250069d2000-04-08 18:57:45 +0000688 break;
689 case GL_POST_COLOR_MATRIX_GREEN_BIAS:
Keith Whitwellcab974c2000-12-26 05:09:27 +0000690 if (ctx->Pixel.PostColorMatrixBias[1] == param)
691 return;
692 FLUSH_VERTICES(ctx, _NEW_PIXEL);
Brian Paul82b02f02000-05-07 20:37:40 +0000693 ctx->Pixel.PostColorMatrixBias[1] = param;
Brian Paul250069d2000-04-08 18:57:45 +0000694 break;
695 case GL_POST_COLOR_MATRIX_BLUE_SCALE:
Keith Whitwellcab974c2000-12-26 05:09:27 +0000696 if (ctx->Pixel.PostColorMatrixScale[2] == param)
697 return;
698 FLUSH_VERTICES(ctx, _NEW_PIXEL);
Brian Paul82b02f02000-05-07 20:37:40 +0000699 ctx->Pixel.PostColorMatrixScale[2] = param;
Brian Paul250069d2000-04-08 18:57:45 +0000700 break;
701 case GL_POST_COLOR_MATRIX_BLUE_BIAS:
Keith Whitwellcab974c2000-12-26 05:09:27 +0000702 if (ctx->Pixel.PostColorMatrixBias[2] == param)
703 return;
704 FLUSH_VERTICES(ctx, _NEW_PIXEL);
Brian Paul82b02f02000-05-07 20:37:40 +0000705 ctx->Pixel.PostColorMatrixBias[2] = param;
Brian Paul250069d2000-04-08 18:57:45 +0000706 break;
707 case GL_POST_COLOR_MATRIX_ALPHA_SCALE:
Keith Whitwellcab974c2000-12-26 05:09:27 +0000708 if (ctx->Pixel.PostColorMatrixScale[3] == param)
709 return;
710 FLUSH_VERTICES(ctx, _NEW_PIXEL);
Brian Paul82b02f02000-05-07 20:37:40 +0000711 ctx->Pixel.PostColorMatrixScale[3] = param;
Brian Paul250069d2000-04-08 18:57:45 +0000712 break;
713 case GL_POST_COLOR_MATRIX_ALPHA_BIAS:
Keith Whitwellcab974c2000-12-26 05:09:27 +0000714 if (ctx->Pixel.PostColorMatrixBias[3] == param)
715 return;
716 FLUSH_VERTICES(ctx, _NEW_PIXEL);
Brian Paul82b02f02000-05-07 20:37:40 +0000717 ctx->Pixel.PostColorMatrixBias[3] = param;
718 break;
719 case GL_POST_CONVOLUTION_RED_SCALE:
Keith Whitwellcab974c2000-12-26 05:09:27 +0000720 if (ctx->Pixel.PostConvolutionScale[0] == param)
721 return;
722 FLUSH_VERTICES(ctx, _NEW_PIXEL);
Brian Paul82b02f02000-05-07 20:37:40 +0000723 ctx->Pixel.PostConvolutionScale[0] = param;
724 break;
725 case GL_POST_CONVOLUTION_RED_BIAS:
Keith Whitwellcab974c2000-12-26 05:09:27 +0000726 if (ctx->Pixel.PostConvolutionBias[0] == param)
727 return;
728 FLUSH_VERTICES(ctx, _NEW_PIXEL);
Brian Paul82b02f02000-05-07 20:37:40 +0000729 ctx->Pixel.PostConvolutionBias[0] = param;
730 break;
731 case GL_POST_CONVOLUTION_GREEN_SCALE:
Keith Whitwellcab974c2000-12-26 05:09:27 +0000732 if (ctx->Pixel.PostConvolutionScale[1] == param)
733 return;
734 FLUSH_VERTICES(ctx, _NEW_PIXEL);
Brian Paul82b02f02000-05-07 20:37:40 +0000735 ctx->Pixel.PostConvolutionScale[1] = param;
736 break;
737 case GL_POST_CONVOLUTION_GREEN_BIAS:
Keith Whitwellcab974c2000-12-26 05:09:27 +0000738 if (ctx->Pixel.PostConvolutionBias[1] == param)
739 return;
740 FLUSH_VERTICES(ctx, _NEW_PIXEL);
Brian Paul82b02f02000-05-07 20:37:40 +0000741 ctx->Pixel.PostConvolutionBias[1] = param;
742 break;
743 case GL_POST_CONVOLUTION_BLUE_SCALE:
Keith Whitwellcab974c2000-12-26 05:09:27 +0000744 if (ctx->Pixel.PostConvolutionScale[2] == param)
745 return;
746 FLUSH_VERTICES(ctx, _NEW_PIXEL);
Brian Paul82b02f02000-05-07 20:37:40 +0000747 ctx->Pixel.PostConvolutionScale[2] = param;
748 break;
749 case GL_POST_CONVOLUTION_BLUE_BIAS:
Keith Whitwellcab974c2000-12-26 05:09:27 +0000750 if (ctx->Pixel.PostConvolutionBias[2] == param)
751 return;
752 FLUSH_VERTICES(ctx, _NEW_PIXEL);
Brian Paul82b02f02000-05-07 20:37:40 +0000753 ctx->Pixel.PostConvolutionBias[2] = param;
754 break;
755 case GL_POST_CONVOLUTION_ALPHA_SCALE:
Keith Whitwellcab974c2000-12-26 05:09:27 +0000756 if (ctx->Pixel.PostConvolutionScale[2] == param)
757 return;
758 FLUSH_VERTICES(ctx, _NEW_PIXEL);
Brian Paul82b02f02000-05-07 20:37:40 +0000759 ctx->Pixel.PostConvolutionScale[2] = param;
760 break;
761 case GL_POST_CONVOLUTION_ALPHA_BIAS:
Keith Whitwellcab974c2000-12-26 05:09:27 +0000762 if (ctx->Pixel.PostConvolutionBias[2] == param)
763 return;
764 FLUSH_VERTICES(ctx, _NEW_PIXEL);
Brian Paul82b02f02000-05-07 20:37:40 +0000765 ctx->Pixel.PostConvolutionBias[2] = param;
Brian Paul250069d2000-04-08 18:57:45 +0000766 break;
jtgafb833d1999-08-19 00:55:39 +0000767 default:
Brian Paul08836342001-03-03 20:33:27 +0000768 _mesa_error( ctx, GL_INVALID_ENUM, "glPixelTransfer(pname)" );
jtgafb833d1999-08-19 00:55:39 +0000769 return;
770 }
jtgafb833d1999-08-19 00:55:39 +0000771}
772
773
Brian Paulfbd8f211999-11-11 01:22:25 +0000774void
775_mesa_PixelTransferi( GLenum pname, GLint param )
776{
777 _mesa_PixelTransferf( pname, (GLfloat) param );
778}
779
780
jtgafb833d1999-08-19 00:55:39 +0000781
Brian Paul179870a2000-04-12 18:54:48 +0000782/**********************************************************************/
783/***** Pixel processing functions ******/
784/**********************************************************************/
jtgafb833d1999-08-19 00:55:39 +0000785
786
787/*
Brian Paul3c14ec91999-10-30 08:20:57 +0000788 * Apply scale and bias factors to an array of RGBA pixels.
789 */
Brian Paul250069d2000-04-08 18:57:45 +0000790void
Brian Paul45015e42000-11-28 00:07:51 +0000791_mesa_scale_and_bias_rgba(const GLcontext *ctx, GLuint n, GLfloat rgba[][4],
792 GLfloat rScale, GLfloat gScale,
793 GLfloat bScale, GLfloat aScale,
794 GLfloat rBias, GLfloat gBias,
795 GLfloat bBias, GLfloat aBias)
Brian Paul3c14ec91999-10-30 08:20:57 +0000796{
Brian Paul45015e42000-11-28 00:07:51 +0000797 if (rScale != 1.0 || rBias != 0.0) {
Brian Paul3c14ec91999-10-30 08:20:57 +0000798 GLuint i;
799 for (i = 0; i < n; i++) {
Brian Paul45015e42000-11-28 00:07:51 +0000800 rgba[i][RCOMP] = rgba[i][RCOMP] * rScale + rBias;
Brian Paul3c14ec91999-10-30 08:20:57 +0000801 }
802 }
Brian Paul45015e42000-11-28 00:07:51 +0000803 if (gScale != 1.0 || gBias != 0.0) {
Brian Paul3c14ec91999-10-30 08:20:57 +0000804 GLuint i;
805 for (i = 0; i < n; i++) {
Brian Paul45015e42000-11-28 00:07:51 +0000806 rgba[i][GCOMP] = rgba[i][GCOMP] * gScale + gBias;
Brian Paul3c14ec91999-10-30 08:20:57 +0000807 }
808 }
Brian Paul45015e42000-11-28 00:07:51 +0000809 if (bScale != 1.0 || bBias != 0.0) {
Brian Paul3c14ec91999-10-30 08:20:57 +0000810 GLuint i;
811 for (i = 0; i < n; i++) {
Brian Paul45015e42000-11-28 00:07:51 +0000812 rgba[i][BCOMP] = rgba[i][BCOMP] * bScale + bBias;
Brian Paul3c14ec91999-10-30 08:20:57 +0000813 }
814 }
Brian Paul45015e42000-11-28 00:07:51 +0000815 if (aScale != 1.0 || aBias != 0.0) {
Brian Paul3c14ec91999-10-30 08:20:57 +0000816 GLuint i;
817 for (i = 0; i < n; i++) {
Brian Paul45015e42000-11-28 00:07:51 +0000818 rgba[i][ACOMP] = rgba[i][ACOMP] * aScale + aBias;
Brian Paul3c14ec91999-10-30 08:20:57 +0000819 }
820 }
821}
822
823
824/*
Brian Paul3c14ec91999-10-30 08:20:57 +0000825 * Apply pixel mapping to an array of floating point RGBA pixels.
826 */
Brian Paul250069d2000-04-08 18:57:45 +0000827void
Brian Paul179870a2000-04-12 18:54:48 +0000828_mesa_map_rgba( const GLcontext *ctx, GLuint n, GLfloat rgba[][4] )
Brian Paul3c14ec91999-10-30 08:20:57 +0000829{
Karl Schultz94a6ec82001-09-18 16:16:21 +0000830 const GLfloat rscale = (GLfloat) (ctx->Pixel.MapRtoRsize - 1);
831 const GLfloat gscale = (GLfloat) (ctx->Pixel.MapGtoGsize - 1);
832 const GLfloat bscale = (GLfloat) (ctx->Pixel.MapBtoBsize - 1);
833 const GLfloat ascale = (GLfloat) (ctx->Pixel.MapAtoAsize - 1);
Brian Paul3c14ec91999-10-30 08:20:57 +0000834 const GLfloat *rMap = ctx->Pixel.MapRtoR;
835 const GLfloat *gMap = ctx->Pixel.MapGtoG;
836 const GLfloat *bMap = ctx->Pixel.MapBtoB;
837 const GLfloat *aMap = ctx->Pixel.MapAtoA;
838 GLuint i;
839 for (i=0;i<n;i++) {
Brian Paulf6e0e922001-05-23 23:55:01 +0000840 GLfloat r = CLAMP(rgba[i][RCOMP], 0.0F, 1.0F);
841 GLfloat g = CLAMP(rgba[i][GCOMP], 0.0F, 1.0F);
842 GLfloat b = CLAMP(rgba[i][BCOMP], 0.0F, 1.0F);
843 GLfloat a = CLAMP(rgba[i][ACOMP], 0.0F, 1.0F);
844 rgba[i][RCOMP] = rMap[IROUND(r * rscale)];
845 rgba[i][GCOMP] = gMap[IROUND(g * gscale)];
846 rgba[i][BCOMP] = bMap[IROUND(b * bscale)];
847 rgba[i][ACOMP] = aMap[IROUND(a * ascale)];
Brian Paul3c14ec91999-10-30 08:20:57 +0000848 }
849}
850
851
852/*
Brian Paul250069d2000-04-08 18:57:45 +0000853 * Apply the color matrix and post color matrix scaling and biasing.
854 */
855void
856_mesa_transform_rgba(const GLcontext *ctx, GLuint n, GLfloat rgba[][4])
857{
Brian Paul82b02f02000-05-07 20:37:40 +0000858 const GLfloat rs = ctx->Pixel.PostColorMatrixScale[0];
859 const GLfloat rb = ctx->Pixel.PostColorMatrixBias[0];
860 const GLfloat gs = ctx->Pixel.PostColorMatrixScale[1];
861 const GLfloat gb = ctx->Pixel.PostColorMatrixBias[1];
862 const GLfloat bs = ctx->Pixel.PostColorMatrixScale[2];
863 const GLfloat bb = ctx->Pixel.PostColorMatrixBias[2];
864 const GLfloat as = ctx->Pixel.PostColorMatrixScale[3];
865 const GLfloat ab = ctx->Pixel.PostColorMatrixBias[3];
Brian Paul30f51ae2001-12-18 04:06:44 +0000866 const GLfloat *m = ctx->ColorMatrixStack.Top->m;
Brian Paul250069d2000-04-08 18:57:45 +0000867 GLuint i;
868 for (i = 0; i < n; i++) {
869 const GLfloat r = rgba[i][RCOMP];
870 const GLfloat g = rgba[i][GCOMP];
871 const GLfloat b = rgba[i][BCOMP];
872 const GLfloat a = rgba[i][ACOMP];
873 rgba[i][RCOMP] = (m[0] * r + m[4] * g + m[ 8] * b + m[12] * a) * rs + rb;
874 rgba[i][GCOMP] = (m[1] * r + m[5] * g + m[ 9] * b + m[13] * a) * gs + gb;
875 rgba[i][BCOMP] = (m[2] * r + m[6] * g + m[10] * b + m[14] * a) * bs + bb;
876 rgba[i][ACOMP] = (m[3] * r + m[7] * g + m[11] * b + m[15] * a) * as + ab;
877 }
878}
879
880
Brian Paul250069d2000-04-08 18:57:45 +0000881/*
Brian Paul179870a2000-04-12 18:54:48 +0000882 * Apply a color table lookup to an array of colors.
jtgafb833d1999-08-19 00:55:39 +0000883 */
Brian Paul179870a2000-04-12 18:54:48 +0000884void
885_mesa_lookup_rgba(const struct gl_color_table *table,
886 GLuint n, GLfloat rgba[][4])
jtgafb833d1999-08-19 00:55:39 +0000887{
Brian Paul8753b1c2001-02-27 16:42:01 +0000888 if (!table->Table || table->Size == 0)
Brian Paul4bdcfe52000-04-17 17:57:04 +0000889 return;
890
Brian Paul179870a2000-04-12 18:54:48 +0000891 switch (table->Format) {
892 case GL_INTENSITY:
Brian Paul4bdcfe52000-04-17 17:57:04 +0000893 /* replace RGBA with I */
Brian Paulba643a22000-10-28 18:34:48 +0000894 if (!table->FloatTable) {
Brian Paulf6e0e922001-05-23 23:55:01 +0000895 const GLint max = table->Size - 1;
896 const GLfloat scale = (GLfloat) max;
Brian Paul699bc7b2000-10-29 18:12:14 +0000897 const GLchan *lut = (const GLchan *) table->Table;
Brian Paul179870a2000-04-12 18:54:48 +0000898 GLuint i;
Brian Paul179870a2000-04-12 18:54:48 +0000899 for (i = 0; i < n; i++) {
Brian Paul33143302001-04-10 15:25:45 +0000900 GLint j = IROUND(rgba[i][RCOMP] * scale);
Brian Paul7cac85d2003-01-26 14:34:56 +0000901 GLfloat c = CHAN_TO_FLOAT(lut[CLAMP(j, 0, max)]);
Brian Paul4bdcfe52000-04-17 17:57:04 +0000902 rgba[i][RCOMP] = rgba[i][GCOMP] =
903 rgba[i][BCOMP] = rgba[i][ACOMP] = c;
904 }
Brian Paul4bdcfe52000-04-17 17:57:04 +0000905 }
906 else {
Brian Paulf6e0e922001-05-23 23:55:01 +0000907 const GLint max = table->Size - 1;
908 const GLfloat scale = (GLfloat) max;
Brian Paul4bdcfe52000-04-17 17:57:04 +0000909 const GLfloat *lut = (const GLfloat *) table->Table;
910 GLuint i;
911 for (i = 0; i < n; i++) {
Brian Paul33143302001-04-10 15:25:45 +0000912 GLint j = IROUND(rgba[i][RCOMP] * scale);
Brian Paulf6e0e922001-05-23 23:55:01 +0000913 GLfloat c = lut[CLAMP(j, 0, max)];
Brian Paul179870a2000-04-12 18:54:48 +0000914 rgba[i][RCOMP] = rgba[i][GCOMP] =
915 rgba[i][BCOMP] = rgba[i][ACOMP] = c;
916 }
917 }
918 break;
919 case GL_LUMINANCE:
Brian Paul4bdcfe52000-04-17 17:57:04 +0000920 /* replace RGB with L */
Brian Paulba643a22000-10-28 18:34:48 +0000921 if (!table->FloatTable) {
Brian Paulf6e0e922001-05-23 23:55:01 +0000922 const GLint max = table->Size - 1;
923 const GLfloat scale = (GLfloat) max;
Brian Paul699bc7b2000-10-29 18:12:14 +0000924 const GLchan *lut = (const GLchan *) table->Table;
Brian Paul179870a2000-04-12 18:54:48 +0000925 GLuint i;
Brian Paul179870a2000-04-12 18:54:48 +0000926 for (i = 0; i < n; i++) {
Brian Paul33143302001-04-10 15:25:45 +0000927 GLint j = IROUND(rgba[i][RCOMP] * scale);
Brian Paulf6e0e922001-05-23 23:55:01 +0000928 GLfloat c = CHAN_TO_FLOAT(lut[CLAMP(j, 0, max)]);
Brian Paul4bdcfe52000-04-17 17:57:04 +0000929 rgba[i][RCOMP] = rgba[i][GCOMP] = rgba[i][BCOMP] = c;
930 }
931 }
932 else {
Brian Paulf6e0e922001-05-23 23:55:01 +0000933 const GLint max = table->Size - 1;
934 const GLfloat scale = (GLfloat) max;
Brian Paul4bdcfe52000-04-17 17:57:04 +0000935 const GLfloat *lut = (const GLfloat *) table->Table;
936 GLuint i;
937 for (i = 0; i < n; i++) {
Brian Paul33143302001-04-10 15:25:45 +0000938 GLint j = IROUND(rgba[i][RCOMP] * scale);
Brian Paulf6e0e922001-05-23 23:55:01 +0000939 GLfloat c = lut[CLAMP(j, 0, max)];
Brian Paul179870a2000-04-12 18:54:48 +0000940 rgba[i][RCOMP] = rgba[i][GCOMP] = rgba[i][BCOMP] = c;
941 }
942 }
943 break;
944 case GL_ALPHA:
Brian Paul4bdcfe52000-04-17 17:57:04 +0000945 /* replace A with A */
Brian Paulba643a22000-10-28 18:34:48 +0000946 if (!table->FloatTable) {
Brian Paulf6e0e922001-05-23 23:55:01 +0000947 const GLint max = table->Size - 1;
948 const GLfloat scale = (GLfloat) max;
Brian Paul699bc7b2000-10-29 18:12:14 +0000949 const GLchan *lut = (const GLchan *) table->Table;
Brian Paul179870a2000-04-12 18:54:48 +0000950 GLuint i;
Brian Paul4bdcfe52000-04-17 17:57:04 +0000951 for (i = 0; i < n; i++) {
Brian Paul33143302001-04-10 15:25:45 +0000952 GLint j = IROUND(rgba[i][ACOMP] * scale);
Brian Paulf6e0e922001-05-23 23:55:01 +0000953 rgba[i][ACOMP] = CHAN_TO_FLOAT(lut[CLAMP(j, 0, max)]);
Brian Paul4bdcfe52000-04-17 17:57:04 +0000954 }
955 }
956 else {
Brian Paulf6e0e922001-05-23 23:55:01 +0000957 const GLint max = table->Size - 1;
958 const GLfloat scale = (GLfloat) max;
Brian Paul4bdcfe52000-04-17 17:57:04 +0000959 const GLfloat *lut = (const GLfloat *) table->Table;
960 GLuint i;
Brian Paul179870a2000-04-12 18:54:48 +0000961 for (i = 0; i < n; i++) {
Brian Paul33143302001-04-10 15:25:45 +0000962 GLint j = IROUND(rgba[i][ACOMP] * scale);
Brian Paulf6e0e922001-05-23 23:55:01 +0000963 rgba[i][ACOMP] = lut[CLAMP(j, 0, max)];
Brian Paul179870a2000-04-12 18:54:48 +0000964 }
965 }
966 break;
967 case GL_LUMINANCE_ALPHA:
Brian Paul4bdcfe52000-04-17 17:57:04 +0000968 /* replace RGBA with LLLA */
Brian Paulba643a22000-10-28 18:34:48 +0000969 if (!table->FloatTable) {
Brian Paulf6e0e922001-05-23 23:55:01 +0000970 const GLint max = table->Size - 1;
971 const GLfloat scale = (GLfloat) max;
Brian Paul699bc7b2000-10-29 18:12:14 +0000972 const GLchan *lut = (const GLchan *) table->Table;
Brian Paul179870a2000-04-12 18:54:48 +0000973 GLuint i;
Brian Paul179870a2000-04-12 18:54:48 +0000974 for (i = 0; i < n; i++) {
Brian Paul33143302001-04-10 15:25:45 +0000975 GLint jL = IROUND(rgba[i][RCOMP] * scale);
976 GLint jA = IROUND(rgba[i][ACOMP] * scale);
Brian Paulf6e0e922001-05-23 23:55:01 +0000977 GLfloat luminance, alpha;
978 jL = CLAMP(jL, 0, max);
979 jA = CLAMP(jA, 0, max);
980 luminance = CHAN_TO_FLOAT(lut[jL * 2 + 0]);
981 alpha = CHAN_TO_FLOAT(lut[jA * 2 + 1]);
Brian Paul4bdcfe52000-04-17 17:57:04 +0000982 rgba[i][RCOMP] = rgba[i][GCOMP] = rgba[i][BCOMP] = luminance;
983 rgba[i][ACOMP] = alpha;;
984 }
985 }
986 else {
Brian Paulf6e0e922001-05-23 23:55:01 +0000987 const GLint max = table->Size - 1;
988 const GLfloat scale = (GLfloat) max;
Brian Paul4bdcfe52000-04-17 17:57:04 +0000989 const GLfloat *lut = (const GLfloat *) table->Table;
990 GLuint i;
991 for (i = 0; i < n; i++) {
Brian Paul33143302001-04-10 15:25:45 +0000992 GLint jL = IROUND(rgba[i][RCOMP] * scale);
993 GLint jA = IROUND(rgba[i][ACOMP] * scale);
Brian Paulf6e0e922001-05-23 23:55:01 +0000994 GLfloat luminance, alpha;
995 jL = CLAMP(jL, 0, max);
996 jA = CLAMP(jA, 0, max);
997 luminance = lut[jL * 2 + 0];
998 alpha = lut[jA * 2 + 1];
Brian Paul179870a2000-04-12 18:54:48 +0000999 rgba[i][RCOMP] = rgba[i][GCOMP] = rgba[i][BCOMP] = luminance;
1000 rgba[i][ACOMP] = alpha;;
1001 }
1002 }
1003 break;
1004 case GL_RGB:
Brian Paul4bdcfe52000-04-17 17:57:04 +00001005 /* replace RGB with RGB */
Brian Paulba643a22000-10-28 18:34:48 +00001006 if (!table->FloatTable) {
Brian Paulf6e0e922001-05-23 23:55:01 +00001007 const GLint max = table->Size - 1;
1008 const GLfloat scale = (GLfloat) max;
Brian Paul699bc7b2000-10-29 18:12:14 +00001009 const GLchan *lut = (const GLchan *) table->Table;
Brian Paul179870a2000-04-12 18:54:48 +00001010 GLuint i;
Brian Paul4bdcfe52000-04-17 17:57:04 +00001011 for (i = 0; i < n; i++) {
Brian Paul33143302001-04-10 15:25:45 +00001012 GLint jR = IROUND(rgba[i][RCOMP] * scale);
1013 GLint jG = IROUND(rgba[i][GCOMP] * scale);
1014 GLint jB = IROUND(rgba[i][BCOMP] * scale);
Brian Paulf6e0e922001-05-23 23:55:01 +00001015 jR = CLAMP(jR, 0, max);
1016 jG = CLAMP(jG, 0, max);
1017 jB = CLAMP(jB, 0, max);
Brian Paul699bc7b2000-10-29 18:12:14 +00001018 rgba[i][RCOMP] = CHAN_TO_FLOAT(lut[jR * 3 + 0]);
1019 rgba[i][GCOMP] = CHAN_TO_FLOAT(lut[jG * 3 + 1]);
1020 rgba[i][BCOMP] = CHAN_TO_FLOAT(lut[jB * 3 + 2]);
Brian Paul4bdcfe52000-04-17 17:57:04 +00001021 }
1022 }
1023 else {
Brian Paulf6e0e922001-05-23 23:55:01 +00001024 const GLint max = table->Size - 1;
1025 const GLfloat scale = (GLfloat) max;
Brian Paul4bdcfe52000-04-17 17:57:04 +00001026 const GLfloat *lut = (const GLfloat *) table->Table;
1027 GLuint i;
Brian Paul179870a2000-04-12 18:54:48 +00001028 for (i = 0; i < n; i++) {
Brian Paul33143302001-04-10 15:25:45 +00001029 GLint jR = IROUND(rgba[i][RCOMP] * scale);
1030 GLint jG = IROUND(rgba[i][GCOMP] * scale);
1031 GLint jB = IROUND(rgba[i][BCOMP] * scale);
Brian Paulf6e0e922001-05-23 23:55:01 +00001032 jR = CLAMP(jR, 0, max);
1033 jG = CLAMP(jG, 0, max);
1034 jB = CLAMP(jB, 0, max);
Brian Paul179870a2000-04-12 18:54:48 +00001035 rgba[i][RCOMP] = lut[jR * 3 + 0];
1036 rgba[i][GCOMP] = lut[jG * 3 + 1];
1037 rgba[i][BCOMP] = lut[jB * 3 + 2];
1038 }
1039 }
1040 break;
1041 case GL_RGBA:
Brian Paul4bdcfe52000-04-17 17:57:04 +00001042 /* replace RGBA with RGBA */
Brian Paulba643a22000-10-28 18:34:48 +00001043 if (!table->FloatTable) {
Brian Paulf6e0e922001-05-23 23:55:01 +00001044 const GLint max = table->Size - 1;
1045 const GLfloat scale = (GLfloat) max;
Brian Paul699bc7b2000-10-29 18:12:14 +00001046 const GLchan *lut = (const GLchan *) table->Table;
Brian Paul179870a2000-04-12 18:54:48 +00001047 GLuint i;
Brian Paul4bdcfe52000-04-17 17:57:04 +00001048 for (i = 0; i < n; i++) {
Brian Paul33143302001-04-10 15:25:45 +00001049 GLint jR = IROUND(rgba[i][RCOMP] * scale);
1050 GLint jG = IROUND(rgba[i][GCOMP] * scale);
1051 GLint jB = IROUND(rgba[i][BCOMP] * scale);
1052 GLint jA = IROUND(rgba[i][ACOMP] * scale);
Brian Paulf6e0e922001-05-23 23:55:01 +00001053 jR = CLAMP(jR, 0, max);
1054 jG = CLAMP(jG, 0, max);
1055 jB = CLAMP(jB, 0, max);
1056 jA = CLAMP(jA, 0, max);
Brian Paul699bc7b2000-10-29 18:12:14 +00001057 rgba[i][RCOMP] = CHAN_TO_FLOAT(lut[jR * 4 + 0]);
1058 rgba[i][GCOMP] = CHAN_TO_FLOAT(lut[jG * 4 + 1]);
1059 rgba[i][BCOMP] = CHAN_TO_FLOAT(lut[jB * 4 + 2]);
1060 rgba[i][ACOMP] = CHAN_TO_FLOAT(lut[jA * 4 + 3]);
Brian Paul4bdcfe52000-04-17 17:57:04 +00001061 }
1062 }
1063 else {
Brian Paulf6e0e922001-05-23 23:55:01 +00001064 const GLint max = table->Size - 1;
1065 const GLfloat scale = (GLfloat) max;
Brian Paul4bdcfe52000-04-17 17:57:04 +00001066 const GLfloat *lut = (const GLfloat *) table->Table;
1067 GLuint i;
Brian Paul179870a2000-04-12 18:54:48 +00001068 for (i = 0; i < n; i++) {
Brian Paul33143302001-04-10 15:25:45 +00001069 GLint jR = IROUND(rgba[i][RCOMP] * scale);
1070 GLint jG = IROUND(rgba[i][GCOMP] * scale);
1071 GLint jB = IROUND(rgba[i][BCOMP] * scale);
1072 GLint jA = IROUND(rgba[i][ACOMP] * scale);
Brian Paulf6e0e922001-05-23 23:55:01 +00001073 jR = CLAMP(jR, 0, max);
1074 jG = CLAMP(jG, 0, max);
1075 jB = CLAMP(jB, 0, max);
1076 jA = CLAMP(jA, 0, max);
Brian Paul179870a2000-04-12 18:54:48 +00001077 rgba[i][RCOMP] = lut[jR * 4 + 0];
1078 rgba[i][GCOMP] = lut[jG * 4 + 1];
1079 rgba[i][BCOMP] = lut[jB * 4 + 2];
1080 rgba[i][ACOMP] = lut[jA * 4 + 3];
1081 }
1082 }
1083 break;
1084 default:
Brian Paul08836342001-03-03 20:33:27 +00001085 _mesa_problem(NULL, "Bad format in _mesa_lookup_rgba");
Brian Paul179870a2000-04-12 18:54:48 +00001086 return;
jtgafb833d1999-08-19 00:55:39 +00001087 }
1088}
1089
1090
1091
1092/*
1093 * Apply color index shift and offset to an array of pixels.
1094 */
Brian Paul179870a2000-04-12 18:54:48 +00001095void
1096_mesa_shift_and_offset_ci( const GLcontext *ctx, GLuint n, GLuint indexes[] )
jtgafb833d1999-08-19 00:55:39 +00001097{
1098 GLint shift = ctx->Pixel.IndexShift;
1099 GLint offset = ctx->Pixel.IndexOffset;
1100 GLuint i;
1101 if (shift > 0) {
1102 for (i=0;i<n;i++) {
1103 indexes[i] = (indexes[i] << shift) + offset;
1104 }
1105 }
1106 else if (shift < 0) {
1107 shift = -shift;
1108 for (i=0;i<n;i++) {
1109 indexes[i] = (indexes[i] >> shift) + offset;
1110 }
1111 }
1112 else {
1113 for (i=0;i<n;i++) {
1114 indexes[i] = indexes[i] + offset;
1115 }
1116 }
1117}
1118
1119
1120/*
1121 * Apply color index mapping to color indexes.
1122 */
Brian Paul179870a2000-04-12 18:54:48 +00001123void
1124_mesa_map_ci( const GLcontext *ctx, GLuint n, GLuint index[] )
jtgafb833d1999-08-19 00:55:39 +00001125{
1126 GLuint mask = ctx->Pixel.MapItoIsize - 1;
1127 GLuint i;
1128 for (i=0;i<n;i++) {
1129 index[i] = ctx->Pixel.MapItoI[ index[i] & mask ];
1130 }
1131}
1132
1133
1134/*
Brian Paul3c14ec91999-10-30 08:20:57 +00001135 * Map color indexes to rgba values.
jtgafb833d1999-08-19 00:55:39 +00001136 */
Brian Paul179870a2000-04-12 18:54:48 +00001137void
Brian Paul699bc7b2000-10-29 18:12:14 +00001138_mesa_map_ci_to_rgba_chan( const GLcontext *ctx, GLuint n,
1139 const GLuint index[], GLchan rgba[][4] )
jtgafb833d1999-08-19 00:55:39 +00001140{
Brian Paul699bc7b2000-10-29 18:12:14 +00001141#if CHAN_BITS == 8
jtgafb833d1999-08-19 00:55:39 +00001142 GLuint rmask = ctx->Pixel.MapItoRsize - 1;
1143 GLuint gmask = ctx->Pixel.MapItoGsize - 1;
1144 GLuint bmask = ctx->Pixel.MapItoBsize - 1;
1145 GLuint amask = ctx->Pixel.MapItoAsize - 1;
1146 const GLubyte *rMap = ctx->Pixel.MapItoR8;
1147 const GLubyte *gMap = ctx->Pixel.MapItoG8;
1148 const GLubyte *bMap = ctx->Pixel.MapItoB8;
1149 const GLubyte *aMap = ctx->Pixel.MapItoA8;
1150 GLuint i;
1151 for (i=0;i<n;i++) {
1152 rgba[i][RCOMP] = rMap[index[i] & rmask];
1153 rgba[i][GCOMP] = gMap[index[i] & gmask];
1154 rgba[i][BCOMP] = bMap[index[i] & bmask];
1155 rgba[i][ACOMP] = aMap[index[i] & amask];
1156 }
Brian Paul699bc7b2000-10-29 18:12:14 +00001157#else
1158 GLuint rmask = ctx->Pixel.MapItoRsize - 1;
1159 GLuint gmask = ctx->Pixel.MapItoGsize - 1;
1160 GLuint bmask = ctx->Pixel.MapItoBsize - 1;
1161 GLuint amask = ctx->Pixel.MapItoAsize - 1;
1162 const GLfloat *rMap = ctx->Pixel.MapItoR;
1163 const GLfloat *gMap = ctx->Pixel.MapItoG;
1164 const GLfloat *bMap = ctx->Pixel.MapItoB;
1165 const GLfloat *aMap = ctx->Pixel.MapItoA;
1166 GLuint i;
1167 for (i=0;i<n;i++) {
Brian Paul6532db92001-01-03 15:59:30 +00001168 CLAMPED_FLOAT_TO_CHAN(rgba[i][RCOMP], rMap[index[i] & rmask]);
1169 CLAMPED_FLOAT_TO_CHAN(rgba[i][GCOMP], gMap[index[i] & gmask]);
1170 CLAMPED_FLOAT_TO_CHAN(rgba[i][BCOMP], bMap[index[i] & bmask]);
1171 CLAMPED_FLOAT_TO_CHAN(rgba[i][ACOMP], aMap[index[i] & amask]);
Brian Paul699bc7b2000-10-29 18:12:14 +00001172 }
1173#endif
jtgafb833d1999-08-19 00:55:39 +00001174}
1175
1176
1177/*
Brian Paul3c14ec91999-10-30 08:20:57 +00001178 * Map color indexes to float rgba values.
1179 */
Brian Paul179870a2000-04-12 18:54:48 +00001180void
1181_mesa_map_ci_to_rgba( const GLcontext *ctx, GLuint n,
1182 const GLuint index[], GLfloat rgba[][4] )
Brian Paul3c14ec91999-10-30 08:20:57 +00001183{
1184 GLuint rmask = ctx->Pixel.MapItoRsize - 1;
1185 GLuint gmask = ctx->Pixel.MapItoGsize - 1;
1186 GLuint bmask = ctx->Pixel.MapItoBsize - 1;
1187 GLuint amask = ctx->Pixel.MapItoAsize - 1;
1188 const GLfloat *rMap = ctx->Pixel.MapItoR;
1189 const GLfloat *gMap = ctx->Pixel.MapItoG;
1190 const GLfloat *bMap = ctx->Pixel.MapItoB;
1191 const GLfloat *aMap = ctx->Pixel.MapItoA;
1192 GLuint i;
1193 for (i=0;i<n;i++) {
1194 rgba[i][RCOMP] = rMap[index[i] & rmask];
1195 rgba[i][GCOMP] = gMap[index[i] & gmask];
1196 rgba[i][BCOMP] = bMap[index[i] & bmask];
1197 rgba[i][ACOMP] = aMap[index[i] & amask];
1198 }
1199}
1200
1201
1202/*
jtgafb833d1999-08-19 00:55:39 +00001203 * Map 8-bit color indexes to rgb values.
1204 */
Brian Paul179870a2000-04-12 18:54:48 +00001205void
1206_mesa_map_ci8_to_rgba( const GLcontext *ctx, GLuint n, const GLubyte index[],
Brian Paul699bc7b2000-10-29 18:12:14 +00001207 GLchan rgba[][4] )
jtgafb833d1999-08-19 00:55:39 +00001208{
Brian Paul699bc7b2000-10-29 18:12:14 +00001209#if CHAN_BITS == 8
jtgafb833d1999-08-19 00:55:39 +00001210 GLuint rmask = ctx->Pixel.MapItoRsize - 1;
1211 GLuint gmask = ctx->Pixel.MapItoGsize - 1;
1212 GLuint bmask = ctx->Pixel.MapItoBsize - 1;
1213 GLuint amask = ctx->Pixel.MapItoAsize - 1;
1214 const GLubyte *rMap = ctx->Pixel.MapItoR8;
1215 const GLubyte *gMap = ctx->Pixel.MapItoG8;
1216 const GLubyte *bMap = ctx->Pixel.MapItoB8;
1217 const GLubyte *aMap = ctx->Pixel.MapItoA8;
1218 GLuint i;
1219 for (i=0;i<n;i++) {
1220 rgba[i][RCOMP] = rMap[index[i] & rmask];
1221 rgba[i][GCOMP] = gMap[index[i] & gmask];
1222 rgba[i][BCOMP] = bMap[index[i] & bmask];
1223 rgba[i][ACOMP] = aMap[index[i] & amask];
1224 }
Brian Paul699bc7b2000-10-29 18:12:14 +00001225#else
1226 GLuint rmask = ctx->Pixel.MapItoRsize - 1;
1227 GLuint gmask = ctx->Pixel.MapItoGsize - 1;
1228 GLuint bmask = ctx->Pixel.MapItoBsize - 1;
1229 GLuint amask = ctx->Pixel.MapItoAsize - 1;
Brian Paul9499e012000-10-30 16:32:42 +00001230 const GLfloat *rMap = ctx->Pixel.MapItoR;
1231 const GLfloat *gMap = ctx->Pixel.MapItoG;
1232 const GLfloat *bMap = ctx->Pixel.MapItoB;
1233 const GLfloat *aMap = ctx->Pixel.MapItoA;
Brian Paul699bc7b2000-10-29 18:12:14 +00001234 GLuint i;
1235 for (i=0;i<n;i++) {
Brian Paul6532db92001-01-03 15:59:30 +00001236 CLAMPED_FLOAT_TO_CHAN(rgba[i][RCOMP], rMap[index[i] & rmask]);
1237 CLAMPED_FLOAT_TO_CHAN(rgba[i][GCOMP], gMap[index[i] & gmask]);
1238 CLAMPED_FLOAT_TO_CHAN(rgba[i][BCOMP], bMap[index[i] & bmask]);
1239 CLAMPED_FLOAT_TO_CHAN(rgba[i][ACOMP], aMap[index[i] & amask]);
Brian Paul699bc7b2000-10-29 18:12:14 +00001240 }
1241#endif
jtgafb833d1999-08-19 00:55:39 +00001242}
1243
1244
Brian Paul179870a2000-04-12 18:54:48 +00001245void
1246_mesa_shift_and_offset_stencil( const GLcontext *ctx, GLuint n,
1247 GLstencil stencil[] )
jtgafb833d1999-08-19 00:55:39 +00001248{
1249 GLuint i;
1250 GLint shift = ctx->Pixel.IndexShift;
1251 GLint offset = ctx->Pixel.IndexOffset;
1252 if (shift > 0) {
1253 for (i=0;i<n;i++) {
1254 stencil[i] = (stencil[i] << shift) + offset;
1255 }
1256 }
1257 else if (shift < 0) {
1258 shift = -shift;
1259 for (i=0;i<n;i++) {
1260 stencil[i] = (stencil[i] >> shift) + offset;
1261 }
1262 }
1263 else {
1264 for (i=0;i<n;i++) {
1265 stencil[i] = stencil[i] + offset;
1266 }
1267 }
1268
1269}
1270
1271
Brian Paul179870a2000-04-12 18:54:48 +00001272void
1273_mesa_map_stencil( const GLcontext *ctx, GLuint n, GLstencil stencil[] )
jtgafb833d1999-08-19 00:55:39 +00001274{
1275 GLuint mask = ctx->Pixel.MapStoSsize - 1;
1276 GLuint i;
1277 for (i=0;i<n;i++) {
1278 stencil[i] = ctx->Pixel.MapStoS[ stencil[i] & mask ];
1279 }
1280}
Brian Paul062bc072000-12-13 00:46:21 +00001281
1282
1283
1284/*
1285 * This function converts an array of GLchan colors to GLfloat colors.
1286 * Most importantly, it undoes the non-uniform quantization of pixel
1287 * values introduced when we convert shallow (< 8 bit) pixel values
1288 * to GLubytes in the ctx->Driver.ReadRGBASpan() functions.
1289 * This fixes a number of OpenGL conformance failures when running on
1290 * 16bpp displays, for example.
1291 */
1292void
1293_mesa_chan_to_float_span(const GLcontext *ctx, GLuint n,
1294 CONST GLchan rgba[][4], GLfloat rgbaf[][4])
1295{
Brian Paulf431a3f2001-07-13 20:07:37 +00001296#if CHAN_TYPE == GL_FLOAT
1297 MEMCPY(rgbaf, rgba, n * 4 * sizeof(GLfloat));
1298#else
Brian Paulb6bcae52001-01-23 23:39:36 +00001299 const GLuint rShift = CHAN_BITS - ctx->Visual.redBits;
1300 const GLuint gShift = CHAN_BITS - ctx->Visual.greenBits;
1301 const GLuint bShift = CHAN_BITS - ctx->Visual.blueBits;
Brian Paul062bc072000-12-13 00:46:21 +00001302 GLuint aShift;
Karl Schultz94a6ec82001-09-18 16:16:21 +00001303 const GLfloat rScale = 1.0F / (GLfloat) ((1 << ctx->Visual.redBits ) - 1);
1304 const GLfloat gScale = 1.0F / (GLfloat) ((1 << ctx->Visual.greenBits) - 1);
1305 const GLfloat bScale = 1.0F / (GLfloat) ((1 << ctx->Visual.blueBits ) - 1);
Brian Paul062bc072000-12-13 00:46:21 +00001306 GLfloat aScale;
1307 GLuint i;
1308
Brian Paulb6bcae52001-01-23 23:39:36 +00001309 if (ctx->Visual.alphaBits > 0) {
1310 aShift = CHAN_BITS - ctx->Visual.alphaBits;
Karl Schultz94a6ec82001-09-18 16:16:21 +00001311 aScale = 1.0F / (GLfloat) ((1 << ctx->Visual.alphaBits) - 1);
Brian Paul062bc072000-12-13 00:46:21 +00001312 }
1313 else {
1314 aShift = 0;
1315 aScale = 1.0F / CHAN_MAXF;
1316 }
1317
1318 for (i = 0; i < n; i++) {
1319 const GLint r = rgba[i][RCOMP] >> rShift;
1320 const GLint g = rgba[i][GCOMP] >> gShift;
1321 const GLint b = rgba[i][BCOMP] >> bShift;
1322 const GLint a = rgba[i][ACOMP] >> aShift;
1323 rgbaf[i][RCOMP] = (GLfloat) r * rScale;
1324 rgbaf[i][GCOMP] = (GLfloat) g * gScale;
1325 rgbaf[i][BCOMP] = (GLfloat) b * bScale;
1326 rgbaf[i][ACOMP] = (GLfloat) a * aScale;
1327 }
Brian Paulf431a3f2001-07-13 20:07:37 +00001328#endif
Brian Paul062bc072000-12-13 00:46:21 +00001329}