blob: 7ae50a771653731a22ed93b5a96d73ec00c022fc [file] [log] [blame]
Brian Paul3c634522002-10-24 23:57:19 +00001/* $Id: pixel.c,v 1.37 2002/10/24 23:57:21 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 Paulba643a22000-10-28 18:34:48 +0000888 ASSERT(table->FloatTable);
Brian Paul8753b1c2001-02-27 16:42:01 +0000889 if (!table->Table || table->Size == 0)
Brian Paul4bdcfe52000-04-17 17:57:04 +0000890 return;
891
Brian Paul179870a2000-04-12 18:54:48 +0000892 switch (table->Format) {
893 case GL_INTENSITY:
Brian Paul4bdcfe52000-04-17 17:57:04 +0000894 /* replace RGBA with I */
Brian Paulba643a22000-10-28 18:34:48 +0000895 if (!table->FloatTable) {
Brian Paulf6e0e922001-05-23 23:55:01 +0000896 const GLint max = table->Size - 1;
897 const GLfloat scale = (GLfloat) max;
Brian Paul699bc7b2000-10-29 18:12:14 +0000898 const GLchan *lut = (const GLchan *) table->Table;
Brian Paul179870a2000-04-12 18:54:48 +0000899 GLuint i;
Brian Paul179870a2000-04-12 18:54:48 +0000900 for (i = 0; i < n; i++) {
Brian Paul33143302001-04-10 15:25:45 +0000901 GLint j = IROUND(rgba[i][RCOMP] * scale);
Brian Paulf6e0e922001-05-23 23:55:01 +0000902 GLfloat c = CHAN_TO_FLOAT(lut[CLAMP(j, 0, 1)]);
Brian Paul4bdcfe52000-04-17 17:57:04 +0000903 rgba[i][RCOMP] = rgba[i][GCOMP] =
904 rgba[i][BCOMP] = rgba[i][ACOMP] = c;
905 }
906
907 }
908 else {
Brian Paulf6e0e922001-05-23 23:55:01 +0000909 const GLint max = table->Size - 1;
910 const GLfloat scale = (GLfloat) max;
Brian Paul4bdcfe52000-04-17 17:57:04 +0000911 const GLfloat *lut = (const GLfloat *) table->Table;
912 GLuint i;
913 for (i = 0; i < n; i++) {
Brian Paul33143302001-04-10 15:25:45 +0000914 GLint j = IROUND(rgba[i][RCOMP] * scale);
Brian Paulf6e0e922001-05-23 23:55:01 +0000915 GLfloat c = lut[CLAMP(j, 0, max)];
Brian Paul179870a2000-04-12 18:54:48 +0000916 rgba[i][RCOMP] = rgba[i][GCOMP] =
917 rgba[i][BCOMP] = rgba[i][ACOMP] = c;
918 }
919 }
920 break;
921 case GL_LUMINANCE:
Brian Paul4bdcfe52000-04-17 17:57:04 +0000922 /* replace RGB with L */
Brian Paulba643a22000-10-28 18:34:48 +0000923 if (!table->FloatTable) {
Brian Paulf6e0e922001-05-23 23:55:01 +0000924 const GLint max = table->Size - 1;
925 const GLfloat scale = (GLfloat) max;
Brian Paul699bc7b2000-10-29 18:12:14 +0000926 const GLchan *lut = (const GLchan *) table->Table;
Brian Paul179870a2000-04-12 18:54:48 +0000927 GLuint i;
Brian Paul179870a2000-04-12 18:54:48 +0000928 for (i = 0; i < n; i++) {
Brian Paul33143302001-04-10 15:25:45 +0000929 GLint j = IROUND(rgba[i][RCOMP] * scale);
Brian Paulf6e0e922001-05-23 23:55:01 +0000930 GLfloat c = CHAN_TO_FLOAT(lut[CLAMP(j, 0, max)]);
Brian Paul4bdcfe52000-04-17 17:57:04 +0000931 rgba[i][RCOMP] = rgba[i][GCOMP] = rgba[i][BCOMP] = c;
932 }
933 }
934 else {
Brian Paulf6e0e922001-05-23 23:55:01 +0000935 const GLint max = table->Size - 1;
936 const GLfloat scale = (GLfloat) max;
Brian Paul4bdcfe52000-04-17 17:57:04 +0000937 const GLfloat *lut = (const GLfloat *) table->Table;
938 GLuint i;
939 for (i = 0; i < n; i++) {
Brian Paul33143302001-04-10 15:25:45 +0000940 GLint j = IROUND(rgba[i][RCOMP] * scale);
Brian Paulf6e0e922001-05-23 23:55:01 +0000941 GLfloat c = lut[CLAMP(j, 0, max)];
Brian Paul179870a2000-04-12 18:54:48 +0000942 rgba[i][RCOMP] = rgba[i][GCOMP] = rgba[i][BCOMP] = c;
943 }
944 }
945 break;
946 case GL_ALPHA:
Brian Paul4bdcfe52000-04-17 17:57:04 +0000947 /* replace A with A */
Brian Paulba643a22000-10-28 18:34:48 +0000948 if (!table->FloatTable) {
Brian Paulf6e0e922001-05-23 23:55:01 +0000949 const GLint max = table->Size - 1;
950 const GLfloat scale = (GLfloat) max;
Brian Paul699bc7b2000-10-29 18:12:14 +0000951 const GLchan *lut = (const GLchan *) table->Table;
Brian Paul179870a2000-04-12 18:54:48 +0000952 GLuint i;
Brian Paul4bdcfe52000-04-17 17:57:04 +0000953 for (i = 0; i < n; i++) {
Brian Paul33143302001-04-10 15:25:45 +0000954 GLint j = IROUND(rgba[i][ACOMP] * scale);
Brian Paulf6e0e922001-05-23 23:55:01 +0000955 rgba[i][ACOMP] = CHAN_TO_FLOAT(lut[CLAMP(j, 0, max)]);
Brian Paul4bdcfe52000-04-17 17:57:04 +0000956 }
957 }
958 else {
Brian Paulf6e0e922001-05-23 23:55:01 +0000959 const GLint max = table->Size - 1;
960 const GLfloat scale = (GLfloat) max;
Brian Paul4bdcfe52000-04-17 17:57:04 +0000961 const GLfloat *lut = (const GLfloat *) table->Table;
962 GLuint i;
Brian Paul179870a2000-04-12 18:54:48 +0000963 for (i = 0; i < n; i++) {
Brian Paul33143302001-04-10 15:25:45 +0000964 GLint j = IROUND(rgba[i][ACOMP] * scale);
Brian Paulf6e0e922001-05-23 23:55:01 +0000965 rgba[i][ACOMP] = lut[CLAMP(j, 0, max)];
Brian Paul179870a2000-04-12 18:54:48 +0000966 }
967 }
968 break;
969 case GL_LUMINANCE_ALPHA:
Brian Paul4bdcfe52000-04-17 17:57:04 +0000970 /* replace RGBA with LLLA */
Brian Paulba643a22000-10-28 18:34:48 +0000971 if (!table->FloatTable) {
Brian Paulf6e0e922001-05-23 23:55:01 +0000972 const GLint max = table->Size - 1;
973 const GLfloat scale = (GLfloat) max;
Brian Paul699bc7b2000-10-29 18:12:14 +0000974 const GLchan *lut = (const GLchan *) table->Table;
Brian Paul179870a2000-04-12 18:54:48 +0000975 GLuint i;
Brian Paul179870a2000-04-12 18:54:48 +0000976 for (i = 0; i < n; i++) {
Brian Paul33143302001-04-10 15:25:45 +0000977 GLint jL = IROUND(rgba[i][RCOMP] * scale);
978 GLint jA = IROUND(rgba[i][ACOMP] * scale);
Brian Paulf6e0e922001-05-23 23:55:01 +0000979 GLfloat luminance, alpha;
980 jL = CLAMP(jL, 0, max);
981 jA = CLAMP(jA, 0, max);
982 luminance = CHAN_TO_FLOAT(lut[jL * 2 + 0]);
983 alpha = CHAN_TO_FLOAT(lut[jA * 2 + 1]);
Brian Paul4bdcfe52000-04-17 17:57:04 +0000984 rgba[i][RCOMP] = rgba[i][GCOMP] = rgba[i][BCOMP] = luminance;
985 rgba[i][ACOMP] = alpha;;
986 }
987 }
988 else {
Brian Paulf6e0e922001-05-23 23:55:01 +0000989 const GLint max = table->Size - 1;
990 const GLfloat scale = (GLfloat) max;
Brian Paul4bdcfe52000-04-17 17:57:04 +0000991 const GLfloat *lut = (const GLfloat *) table->Table;
992 GLuint i;
993 for (i = 0; i < n; i++) {
Brian Paul33143302001-04-10 15:25:45 +0000994 GLint jL = IROUND(rgba[i][RCOMP] * scale);
995 GLint jA = IROUND(rgba[i][ACOMP] * scale);
Brian Paulf6e0e922001-05-23 23:55:01 +0000996 GLfloat luminance, alpha;
997 jL = CLAMP(jL, 0, max);
998 jA = CLAMP(jA, 0, max);
999 luminance = lut[jL * 2 + 0];
1000 alpha = lut[jA * 2 + 1];
Brian Paul179870a2000-04-12 18:54:48 +00001001 rgba[i][RCOMP] = rgba[i][GCOMP] = rgba[i][BCOMP] = luminance;
1002 rgba[i][ACOMP] = alpha;;
1003 }
1004 }
1005 break;
1006 case GL_RGB:
Brian Paul4bdcfe52000-04-17 17:57:04 +00001007 /* replace RGB with RGB */
Brian Paulba643a22000-10-28 18:34:48 +00001008 if (!table->FloatTable) {
Brian Paulf6e0e922001-05-23 23:55:01 +00001009 const GLint max = table->Size - 1;
1010 const GLfloat scale = (GLfloat) max;
Brian Paul699bc7b2000-10-29 18:12:14 +00001011 const GLchan *lut = (const GLchan *) table->Table;
Brian Paul179870a2000-04-12 18:54:48 +00001012 GLuint i;
Brian Paul4bdcfe52000-04-17 17:57:04 +00001013 for (i = 0; i < n; i++) {
Brian Paul33143302001-04-10 15:25:45 +00001014 GLint jR = IROUND(rgba[i][RCOMP] * scale);
1015 GLint jG = IROUND(rgba[i][GCOMP] * scale);
1016 GLint jB = IROUND(rgba[i][BCOMP] * scale);
Brian Paulf6e0e922001-05-23 23:55:01 +00001017 jR = CLAMP(jR, 0, max);
1018 jG = CLAMP(jG, 0, max);
1019 jB = CLAMP(jB, 0, max);
Brian Paul699bc7b2000-10-29 18:12:14 +00001020 rgba[i][RCOMP] = CHAN_TO_FLOAT(lut[jR * 3 + 0]);
1021 rgba[i][GCOMP] = CHAN_TO_FLOAT(lut[jG * 3 + 1]);
1022 rgba[i][BCOMP] = CHAN_TO_FLOAT(lut[jB * 3 + 2]);
Brian Paul4bdcfe52000-04-17 17:57:04 +00001023 }
1024 }
1025 else {
Brian Paulf6e0e922001-05-23 23:55:01 +00001026 const GLint max = table->Size - 1;
1027 const GLfloat scale = (GLfloat) max;
Brian Paul4bdcfe52000-04-17 17:57:04 +00001028 const GLfloat *lut = (const GLfloat *) table->Table;
1029 GLuint i;
Brian Paul179870a2000-04-12 18:54:48 +00001030 for (i = 0; i < n; i++) {
Brian Paul33143302001-04-10 15:25:45 +00001031 GLint jR = IROUND(rgba[i][RCOMP] * scale);
1032 GLint jG = IROUND(rgba[i][GCOMP] * scale);
1033 GLint jB = IROUND(rgba[i][BCOMP] * scale);
Brian Paulf6e0e922001-05-23 23:55:01 +00001034 jR = CLAMP(jR, 0, max);
1035 jG = CLAMP(jG, 0, max);
1036 jB = CLAMP(jB, 0, max);
Brian Paul179870a2000-04-12 18:54:48 +00001037 rgba[i][RCOMP] = lut[jR * 3 + 0];
1038 rgba[i][GCOMP] = lut[jG * 3 + 1];
1039 rgba[i][BCOMP] = lut[jB * 3 + 2];
1040 }
1041 }
1042 break;
1043 case GL_RGBA:
Brian Paul4bdcfe52000-04-17 17:57:04 +00001044 /* replace RGBA with RGBA */
Brian Paulba643a22000-10-28 18:34:48 +00001045 if (!table->FloatTable) {
Brian Paulf6e0e922001-05-23 23:55:01 +00001046 const GLint max = table->Size - 1;
1047 const GLfloat scale = (GLfloat) max;
Brian Paul699bc7b2000-10-29 18:12:14 +00001048 const GLchan *lut = (const GLchan *) table->Table;
Brian Paul179870a2000-04-12 18:54:48 +00001049 GLuint i;
Brian Paul4bdcfe52000-04-17 17:57:04 +00001050 for (i = 0; i < n; i++) {
Brian Paul33143302001-04-10 15:25:45 +00001051 GLint jR = IROUND(rgba[i][RCOMP] * scale);
1052 GLint jG = IROUND(rgba[i][GCOMP] * scale);
1053 GLint jB = IROUND(rgba[i][BCOMP] * scale);
1054 GLint jA = IROUND(rgba[i][ACOMP] * scale);
Brian Paulf6e0e922001-05-23 23:55:01 +00001055 jR = CLAMP(jR, 0, max);
1056 jG = CLAMP(jG, 0, max);
1057 jB = CLAMP(jB, 0, max);
1058 jA = CLAMP(jA, 0, max);
Brian Paul699bc7b2000-10-29 18:12:14 +00001059 rgba[i][RCOMP] = CHAN_TO_FLOAT(lut[jR * 4 + 0]);
1060 rgba[i][GCOMP] = CHAN_TO_FLOAT(lut[jG * 4 + 1]);
1061 rgba[i][BCOMP] = CHAN_TO_FLOAT(lut[jB * 4 + 2]);
1062 rgba[i][ACOMP] = CHAN_TO_FLOAT(lut[jA * 4 + 3]);
Brian Paul4bdcfe52000-04-17 17:57:04 +00001063 }
1064 }
1065 else {
Brian Paulf6e0e922001-05-23 23:55:01 +00001066 const GLint max = table->Size - 1;
1067 const GLfloat scale = (GLfloat) max;
Brian Paul4bdcfe52000-04-17 17:57:04 +00001068 const GLfloat *lut = (const GLfloat *) table->Table;
1069 GLuint i;
Brian Paul179870a2000-04-12 18:54:48 +00001070 for (i = 0; i < n; i++) {
Brian Paul33143302001-04-10 15:25:45 +00001071 GLint jR = IROUND(rgba[i][RCOMP] * scale);
1072 GLint jG = IROUND(rgba[i][GCOMP] * scale);
1073 GLint jB = IROUND(rgba[i][BCOMP] * scale);
1074 GLint jA = IROUND(rgba[i][ACOMP] * scale);
Brian Paulf6e0e922001-05-23 23:55:01 +00001075 jR = CLAMP(jR, 0, max);
1076 jG = CLAMP(jG, 0, max);
1077 jB = CLAMP(jB, 0, max);
1078 jA = CLAMP(jA, 0, max);
Brian Paul179870a2000-04-12 18:54:48 +00001079 rgba[i][RCOMP] = lut[jR * 4 + 0];
1080 rgba[i][GCOMP] = lut[jG * 4 + 1];
1081 rgba[i][BCOMP] = lut[jB * 4 + 2];
1082 rgba[i][ACOMP] = lut[jA * 4 + 3];
1083 }
1084 }
1085 break;
1086 default:
Brian Paul08836342001-03-03 20:33:27 +00001087 _mesa_problem(NULL, "Bad format in _mesa_lookup_rgba");
Brian Paul179870a2000-04-12 18:54:48 +00001088 return;
jtgafb833d1999-08-19 00:55:39 +00001089 }
1090}
1091
1092
1093
1094/*
1095 * Apply color index shift and offset to an array of pixels.
1096 */
Brian Paul179870a2000-04-12 18:54:48 +00001097void
1098_mesa_shift_and_offset_ci( const GLcontext *ctx, GLuint n, GLuint indexes[] )
jtgafb833d1999-08-19 00:55:39 +00001099{
1100 GLint shift = ctx->Pixel.IndexShift;
1101 GLint offset = ctx->Pixel.IndexOffset;
1102 GLuint i;
1103 if (shift > 0) {
1104 for (i=0;i<n;i++) {
1105 indexes[i] = (indexes[i] << shift) + offset;
1106 }
1107 }
1108 else if (shift < 0) {
1109 shift = -shift;
1110 for (i=0;i<n;i++) {
1111 indexes[i] = (indexes[i] >> shift) + offset;
1112 }
1113 }
1114 else {
1115 for (i=0;i<n;i++) {
1116 indexes[i] = indexes[i] + offset;
1117 }
1118 }
1119}
1120
1121
1122/*
1123 * Apply color index mapping to color indexes.
1124 */
Brian Paul179870a2000-04-12 18:54:48 +00001125void
1126_mesa_map_ci( const GLcontext *ctx, GLuint n, GLuint index[] )
jtgafb833d1999-08-19 00:55:39 +00001127{
1128 GLuint mask = ctx->Pixel.MapItoIsize - 1;
1129 GLuint i;
1130 for (i=0;i<n;i++) {
1131 index[i] = ctx->Pixel.MapItoI[ index[i] & mask ];
1132 }
1133}
1134
1135
1136/*
Brian Paul3c14ec91999-10-30 08:20:57 +00001137 * Map color indexes to rgba values.
jtgafb833d1999-08-19 00:55:39 +00001138 */
Brian Paul179870a2000-04-12 18:54:48 +00001139void
Brian Paul699bc7b2000-10-29 18:12:14 +00001140_mesa_map_ci_to_rgba_chan( const GLcontext *ctx, GLuint n,
1141 const GLuint index[], GLchan rgba[][4] )
jtgafb833d1999-08-19 00:55:39 +00001142{
Brian Paul699bc7b2000-10-29 18:12:14 +00001143#if CHAN_BITS == 8
jtgafb833d1999-08-19 00:55:39 +00001144 GLuint rmask = ctx->Pixel.MapItoRsize - 1;
1145 GLuint gmask = ctx->Pixel.MapItoGsize - 1;
1146 GLuint bmask = ctx->Pixel.MapItoBsize - 1;
1147 GLuint amask = ctx->Pixel.MapItoAsize - 1;
1148 const GLubyte *rMap = ctx->Pixel.MapItoR8;
1149 const GLubyte *gMap = ctx->Pixel.MapItoG8;
1150 const GLubyte *bMap = ctx->Pixel.MapItoB8;
1151 const GLubyte *aMap = ctx->Pixel.MapItoA8;
1152 GLuint i;
1153 for (i=0;i<n;i++) {
1154 rgba[i][RCOMP] = rMap[index[i] & rmask];
1155 rgba[i][GCOMP] = gMap[index[i] & gmask];
1156 rgba[i][BCOMP] = bMap[index[i] & bmask];
1157 rgba[i][ACOMP] = aMap[index[i] & amask];
1158 }
Brian Paul699bc7b2000-10-29 18:12:14 +00001159#else
1160 GLuint rmask = ctx->Pixel.MapItoRsize - 1;
1161 GLuint gmask = ctx->Pixel.MapItoGsize - 1;
1162 GLuint bmask = ctx->Pixel.MapItoBsize - 1;
1163 GLuint amask = ctx->Pixel.MapItoAsize - 1;
1164 const GLfloat *rMap = ctx->Pixel.MapItoR;
1165 const GLfloat *gMap = ctx->Pixel.MapItoG;
1166 const GLfloat *bMap = ctx->Pixel.MapItoB;
1167 const GLfloat *aMap = ctx->Pixel.MapItoA;
1168 GLuint i;
1169 for (i=0;i<n;i++) {
Brian Paul6532db92001-01-03 15:59:30 +00001170 CLAMPED_FLOAT_TO_CHAN(rgba[i][RCOMP], rMap[index[i] & rmask]);
1171 CLAMPED_FLOAT_TO_CHAN(rgba[i][GCOMP], gMap[index[i] & gmask]);
1172 CLAMPED_FLOAT_TO_CHAN(rgba[i][BCOMP], bMap[index[i] & bmask]);
1173 CLAMPED_FLOAT_TO_CHAN(rgba[i][ACOMP], aMap[index[i] & amask]);
Brian Paul699bc7b2000-10-29 18:12:14 +00001174 }
1175#endif
jtgafb833d1999-08-19 00:55:39 +00001176}
1177
1178
1179/*
Brian Paul3c14ec91999-10-30 08:20:57 +00001180 * Map color indexes to float rgba values.
1181 */
Brian Paul179870a2000-04-12 18:54:48 +00001182void
1183_mesa_map_ci_to_rgba( const GLcontext *ctx, GLuint n,
1184 const GLuint index[], GLfloat rgba[][4] )
Brian Paul3c14ec91999-10-30 08:20:57 +00001185{
1186 GLuint rmask = ctx->Pixel.MapItoRsize - 1;
1187 GLuint gmask = ctx->Pixel.MapItoGsize - 1;
1188 GLuint bmask = ctx->Pixel.MapItoBsize - 1;
1189 GLuint amask = ctx->Pixel.MapItoAsize - 1;
1190 const GLfloat *rMap = ctx->Pixel.MapItoR;
1191 const GLfloat *gMap = ctx->Pixel.MapItoG;
1192 const GLfloat *bMap = ctx->Pixel.MapItoB;
1193 const GLfloat *aMap = ctx->Pixel.MapItoA;
1194 GLuint i;
1195 for (i=0;i<n;i++) {
1196 rgba[i][RCOMP] = rMap[index[i] & rmask];
1197 rgba[i][GCOMP] = gMap[index[i] & gmask];
1198 rgba[i][BCOMP] = bMap[index[i] & bmask];
1199 rgba[i][ACOMP] = aMap[index[i] & amask];
1200 }
1201}
1202
1203
1204/*
jtgafb833d1999-08-19 00:55:39 +00001205 * Map 8-bit color indexes to rgb values.
1206 */
Brian Paul179870a2000-04-12 18:54:48 +00001207void
1208_mesa_map_ci8_to_rgba( const GLcontext *ctx, GLuint n, const GLubyte index[],
Brian Paul699bc7b2000-10-29 18:12:14 +00001209 GLchan rgba[][4] )
jtgafb833d1999-08-19 00:55:39 +00001210{
Brian Paul699bc7b2000-10-29 18:12:14 +00001211#if CHAN_BITS == 8
jtgafb833d1999-08-19 00:55:39 +00001212 GLuint rmask = ctx->Pixel.MapItoRsize - 1;
1213 GLuint gmask = ctx->Pixel.MapItoGsize - 1;
1214 GLuint bmask = ctx->Pixel.MapItoBsize - 1;
1215 GLuint amask = ctx->Pixel.MapItoAsize - 1;
1216 const GLubyte *rMap = ctx->Pixel.MapItoR8;
1217 const GLubyte *gMap = ctx->Pixel.MapItoG8;
1218 const GLubyte *bMap = ctx->Pixel.MapItoB8;
1219 const GLubyte *aMap = ctx->Pixel.MapItoA8;
1220 GLuint i;
1221 for (i=0;i<n;i++) {
1222 rgba[i][RCOMP] = rMap[index[i] & rmask];
1223 rgba[i][GCOMP] = gMap[index[i] & gmask];
1224 rgba[i][BCOMP] = bMap[index[i] & bmask];
1225 rgba[i][ACOMP] = aMap[index[i] & amask];
1226 }
Brian Paul699bc7b2000-10-29 18:12:14 +00001227#else
1228 GLuint rmask = ctx->Pixel.MapItoRsize - 1;
1229 GLuint gmask = ctx->Pixel.MapItoGsize - 1;
1230 GLuint bmask = ctx->Pixel.MapItoBsize - 1;
1231 GLuint amask = ctx->Pixel.MapItoAsize - 1;
Brian Paul9499e012000-10-30 16:32:42 +00001232 const GLfloat *rMap = ctx->Pixel.MapItoR;
1233 const GLfloat *gMap = ctx->Pixel.MapItoG;
1234 const GLfloat *bMap = ctx->Pixel.MapItoB;
1235 const GLfloat *aMap = ctx->Pixel.MapItoA;
Brian Paul699bc7b2000-10-29 18:12:14 +00001236 GLuint i;
1237 for (i=0;i<n;i++) {
Brian Paul6532db92001-01-03 15:59:30 +00001238 CLAMPED_FLOAT_TO_CHAN(rgba[i][RCOMP], rMap[index[i] & rmask]);
1239 CLAMPED_FLOAT_TO_CHAN(rgba[i][GCOMP], gMap[index[i] & gmask]);
1240 CLAMPED_FLOAT_TO_CHAN(rgba[i][BCOMP], bMap[index[i] & bmask]);
1241 CLAMPED_FLOAT_TO_CHAN(rgba[i][ACOMP], aMap[index[i] & amask]);
Brian Paul699bc7b2000-10-29 18:12:14 +00001242 }
1243#endif
jtgafb833d1999-08-19 00:55:39 +00001244}
1245
1246
Brian Paul179870a2000-04-12 18:54:48 +00001247void
1248_mesa_shift_and_offset_stencil( const GLcontext *ctx, GLuint n,
1249 GLstencil stencil[] )
jtgafb833d1999-08-19 00:55:39 +00001250{
1251 GLuint i;
1252 GLint shift = ctx->Pixel.IndexShift;
1253 GLint offset = ctx->Pixel.IndexOffset;
1254 if (shift > 0) {
1255 for (i=0;i<n;i++) {
1256 stencil[i] = (stencil[i] << shift) + offset;
1257 }
1258 }
1259 else if (shift < 0) {
1260 shift = -shift;
1261 for (i=0;i<n;i++) {
1262 stencil[i] = (stencil[i] >> shift) + offset;
1263 }
1264 }
1265 else {
1266 for (i=0;i<n;i++) {
1267 stencil[i] = stencil[i] + offset;
1268 }
1269 }
1270
1271}
1272
1273
Brian Paul179870a2000-04-12 18:54:48 +00001274void
1275_mesa_map_stencil( const GLcontext *ctx, GLuint n, GLstencil stencil[] )
jtgafb833d1999-08-19 00:55:39 +00001276{
1277 GLuint mask = ctx->Pixel.MapStoSsize - 1;
1278 GLuint i;
1279 for (i=0;i<n;i++) {
1280 stencil[i] = ctx->Pixel.MapStoS[ stencil[i] & mask ];
1281 }
1282}
Brian Paul062bc072000-12-13 00:46:21 +00001283
1284
1285
1286/*
1287 * This function converts an array of GLchan colors to GLfloat colors.
1288 * Most importantly, it undoes the non-uniform quantization of pixel
1289 * values introduced when we convert shallow (< 8 bit) pixel values
1290 * to GLubytes in the ctx->Driver.ReadRGBASpan() functions.
1291 * This fixes a number of OpenGL conformance failures when running on
1292 * 16bpp displays, for example.
1293 */
1294void
1295_mesa_chan_to_float_span(const GLcontext *ctx, GLuint n,
1296 CONST GLchan rgba[][4], GLfloat rgbaf[][4])
1297{
Brian Paulf431a3f2001-07-13 20:07:37 +00001298#if CHAN_TYPE == GL_FLOAT
1299 MEMCPY(rgbaf, rgba, n * 4 * sizeof(GLfloat));
1300#else
Brian Paulb6bcae52001-01-23 23:39:36 +00001301 const GLuint rShift = CHAN_BITS - ctx->Visual.redBits;
1302 const GLuint gShift = CHAN_BITS - ctx->Visual.greenBits;
1303 const GLuint bShift = CHAN_BITS - ctx->Visual.blueBits;
Brian Paul062bc072000-12-13 00:46:21 +00001304 GLuint aShift;
Karl Schultz94a6ec82001-09-18 16:16:21 +00001305 const GLfloat rScale = 1.0F / (GLfloat) ((1 << ctx->Visual.redBits ) - 1);
1306 const GLfloat gScale = 1.0F / (GLfloat) ((1 << ctx->Visual.greenBits) - 1);
1307 const GLfloat bScale = 1.0F / (GLfloat) ((1 << ctx->Visual.blueBits ) - 1);
Brian Paul062bc072000-12-13 00:46:21 +00001308 GLfloat aScale;
1309 GLuint i;
1310
Brian Paulb6bcae52001-01-23 23:39:36 +00001311 if (ctx->Visual.alphaBits > 0) {
1312 aShift = CHAN_BITS - ctx->Visual.alphaBits;
Karl Schultz94a6ec82001-09-18 16:16:21 +00001313 aScale = 1.0F / (GLfloat) ((1 << ctx->Visual.alphaBits) - 1);
Brian Paul062bc072000-12-13 00:46:21 +00001314 }
1315 else {
1316 aShift = 0;
1317 aScale = 1.0F / CHAN_MAXF;
1318 }
1319
1320 for (i = 0; i < n; i++) {
1321 const GLint r = rgba[i][RCOMP] >> rShift;
1322 const GLint g = rgba[i][GCOMP] >> gShift;
1323 const GLint b = rgba[i][BCOMP] >> bShift;
1324 const GLint a = rgba[i][ACOMP] >> aShift;
1325 rgbaf[i][RCOMP] = (GLfloat) r * rScale;
1326 rgbaf[i][GCOMP] = (GLfloat) g * gScale;
1327 rgbaf[i][BCOMP] = (GLfloat) b * bScale;
1328 rgbaf[i][ACOMP] = (GLfloat) a * aScale;
1329 }
Brian Paulf431a3f2001-07-13 20:07:37 +00001330#endif
Brian Paul062bc072000-12-13 00:46:21 +00001331}