1*61046927SAndroid Build Coastguard Worker /*
2*61046927SAndroid Build Coastguard Worker * Mesa 3-D graphics library
3*61046927SAndroid Build Coastguard Worker *
4*61046927SAndroid Build Coastguard Worker * Copyright (C) 1999-2008 Brian Paul All Rights Reserved.
5*61046927SAndroid Build Coastguard Worker *
6*61046927SAndroid Build Coastguard Worker * Permission is hereby granted, free of charge, to any person obtaining a
7*61046927SAndroid Build Coastguard Worker * copy of this software and associated documentation files (the "Software"),
8*61046927SAndroid Build Coastguard Worker * to deal in the Software without restriction, including without limitation
9*61046927SAndroid Build Coastguard Worker * the rights to use, copy, modify, merge, publish, distribute, sublicense,
10*61046927SAndroid Build Coastguard Worker * and/or sell copies of the Software, and to permit persons to whom the
11*61046927SAndroid Build Coastguard Worker * Software is furnished to do so, subject to the following conditions:
12*61046927SAndroid Build Coastguard Worker *
13*61046927SAndroid Build Coastguard Worker * The above copyright notice and this permission notice shall be included
14*61046927SAndroid Build Coastguard Worker * in all copies or substantial portions of the Software.
15*61046927SAndroid Build Coastguard Worker *
16*61046927SAndroid Build Coastguard Worker * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
17*61046927SAndroid Build Coastguard Worker * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
18*61046927SAndroid Build Coastguard Worker * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
19*61046927SAndroid Build Coastguard Worker * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR
20*61046927SAndroid Build Coastguard Worker * OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
21*61046927SAndroid Build Coastguard Worker * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
22*61046927SAndroid Build Coastguard Worker * OTHER DEALINGS IN THE SOFTWARE.
23*61046927SAndroid Build Coastguard Worker */
24*61046927SAndroid Build Coastguard Worker
25*61046927SAndroid Build Coastguard Worker
26*61046927SAndroid Build Coastguard Worker /**
27*61046927SAndroid Build Coastguard Worker * \file pixel.c
28*61046927SAndroid Build Coastguard Worker * Pixel transfer functions (glPixelZoom, glPixelMap, glPixelTransfer)
29*61046927SAndroid Build Coastguard Worker */
30*61046927SAndroid Build Coastguard Worker
31*61046927SAndroid Build Coastguard Worker #include "util/glheader.h"
32*61046927SAndroid Build Coastguard Worker #include "bufferobj.h"
33*61046927SAndroid Build Coastguard Worker #include "context.h"
34*61046927SAndroid Build Coastguard Worker #include "macros.h"
35*61046927SAndroid Build Coastguard Worker #include "pixel.h"
36*61046927SAndroid Build Coastguard Worker #include "pbo.h"
37*61046927SAndroid Build Coastguard Worker #include "mtypes.h"
38*61046927SAndroid Build Coastguard Worker #include "api_exec_decl.h"
39*61046927SAndroid Build Coastguard Worker
40*61046927SAndroid Build Coastguard Worker #include <math.h>
41*61046927SAndroid Build Coastguard Worker
42*61046927SAndroid Build Coastguard Worker /**********************************************************************/
43*61046927SAndroid Build Coastguard Worker /***** glPixelZoom *****/
44*61046927SAndroid Build Coastguard Worker /**********************************************************************/
45*61046927SAndroid Build Coastguard Worker
46*61046927SAndroid Build Coastguard Worker void GLAPIENTRY
_mesa_PixelZoom(GLfloat xfactor,GLfloat yfactor)47*61046927SAndroid Build Coastguard Worker _mesa_PixelZoom( GLfloat xfactor, GLfloat yfactor )
48*61046927SAndroid Build Coastguard Worker {
49*61046927SAndroid Build Coastguard Worker GET_CURRENT_CONTEXT(ctx);
50*61046927SAndroid Build Coastguard Worker
51*61046927SAndroid Build Coastguard Worker if (ctx->Pixel.ZoomX == xfactor &&
52*61046927SAndroid Build Coastguard Worker ctx->Pixel.ZoomY == yfactor)
53*61046927SAndroid Build Coastguard Worker return;
54*61046927SAndroid Build Coastguard Worker
55*61046927SAndroid Build Coastguard Worker FLUSH_VERTICES(ctx, _NEW_PIXEL, GL_PIXEL_MODE_BIT);
56*61046927SAndroid Build Coastguard Worker ctx->Pixel.ZoomX = xfactor;
57*61046927SAndroid Build Coastguard Worker ctx->Pixel.ZoomY = yfactor;
58*61046927SAndroid Build Coastguard Worker }
59*61046927SAndroid Build Coastguard Worker
60*61046927SAndroid Build Coastguard Worker
61*61046927SAndroid Build Coastguard Worker
62*61046927SAndroid Build Coastguard Worker /**********************************************************************/
63*61046927SAndroid Build Coastguard Worker /***** glPixelMap *****/
64*61046927SAndroid Build Coastguard Worker /**********************************************************************/
65*61046927SAndroid Build Coastguard Worker
66*61046927SAndroid Build Coastguard Worker /**
67*61046927SAndroid Build Coastguard Worker * Return pointer to a pixelmap by name.
68*61046927SAndroid Build Coastguard Worker */
69*61046927SAndroid Build Coastguard Worker static struct gl_pixelmap *
get_pixelmap(struct gl_context * ctx,GLenum map)70*61046927SAndroid Build Coastguard Worker get_pixelmap(struct gl_context *ctx, GLenum map)
71*61046927SAndroid Build Coastguard Worker {
72*61046927SAndroid Build Coastguard Worker switch (map) {
73*61046927SAndroid Build Coastguard Worker case GL_PIXEL_MAP_I_TO_I:
74*61046927SAndroid Build Coastguard Worker return &ctx->PixelMaps.ItoI;
75*61046927SAndroid Build Coastguard Worker case GL_PIXEL_MAP_S_TO_S:
76*61046927SAndroid Build Coastguard Worker return &ctx->PixelMaps.StoS;
77*61046927SAndroid Build Coastguard Worker case GL_PIXEL_MAP_I_TO_R:
78*61046927SAndroid Build Coastguard Worker return &ctx->PixelMaps.ItoR;
79*61046927SAndroid Build Coastguard Worker case GL_PIXEL_MAP_I_TO_G:
80*61046927SAndroid Build Coastguard Worker return &ctx->PixelMaps.ItoG;
81*61046927SAndroid Build Coastguard Worker case GL_PIXEL_MAP_I_TO_B:
82*61046927SAndroid Build Coastguard Worker return &ctx->PixelMaps.ItoB;
83*61046927SAndroid Build Coastguard Worker case GL_PIXEL_MAP_I_TO_A:
84*61046927SAndroid Build Coastguard Worker return &ctx->PixelMaps.ItoA;
85*61046927SAndroid Build Coastguard Worker case GL_PIXEL_MAP_R_TO_R:
86*61046927SAndroid Build Coastguard Worker return &ctx->PixelMaps.RtoR;
87*61046927SAndroid Build Coastguard Worker case GL_PIXEL_MAP_G_TO_G:
88*61046927SAndroid Build Coastguard Worker return &ctx->PixelMaps.GtoG;
89*61046927SAndroid Build Coastguard Worker case GL_PIXEL_MAP_B_TO_B:
90*61046927SAndroid Build Coastguard Worker return &ctx->PixelMaps.BtoB;
91*61046927SAndroid Build Coastguard Worker case GL_PIXEL_MAP_A_TO_A:
92*61046927SAndroid Build Coastguard Worker return &ctx->PixelMaps.AtoA;
93*61046927SAndroid Build Coastguard Worker default:
94*61046927SAndroid Build Coastguard Worker return NULL;
95*61046927SAndroid Build Coastguard Worker }
96*61046927SAndroid Build Coastguard Worker }
97*61046927SAndroid Build Coastguard Worker
98*61046927SAndroid Build Coastguard Worker
99*61046927SAndroid Build Coastguard Worker /**
100*61046927SAndroid Build Coastguard Worker * Helper routine used by the other _mesa_PixelMap() functions.
101*61046927SAndroid Build Coastguard Worker */
102*61046927SAndroid Build Coastguard Worker static void
store_pixelmap(struct gl_context * ctx,GLenum map,GLsizei mapsize,const GLfloat * values)103*61046927SAndroid Build Coastguard Worker store_pixelmap(struct gl_context *ctx, GLenum map, GLsizei mapsize,
104*61046927SAndroid Build Coastguard Worker const GLfloat *values)
105*61046927SAndroid Build Coastguard Worker {
106*61046927SAndroid Build Coastguard Worker GLint i;
107*61046927SAndroid Build Coastguard Worker struct gl_pixelmap *pm = get_pixelmap(ctx, map);
108*61046927SAndroid Build Coastguard Worker if (!pm) {
109*61046927SAndroid Build Coastguard Worker _mesa_error(ctx, GL_INVALID_ENUM, "glPixelMap(map)");
110*61046927SAndroid Build Coastguard Worker return;
111*61046927SAndroid Build Coastguard Worker }
112*61046927SAndroid Build Coastguard Worker
113*61046927SAndroid Build Coastguard Worker switch (map) {
114*61046927SAndroid Build Coastguard Worker case GL_PIXEL_MAP_S_TO_S:
115*61046927SAndroid Build Coastguard Worker /* special case */
116*61046927SAndroid Build Coastguard Worker ctx->PixelMaps.StoS.Size = mapsize;
117*61046927SAndroid Build Coastguard Worker for (i = 0; i < mapsize; i++) {
118*61046927SAndroid Build Coastguard Worker ctx->PixelMaps.StoS.Map[i] = roundf(values[i]);
119*61046927SAndroid Build Coastguard Worker }
120*61046927SAndroid Build Coastguard Worker break;
121*61046927SAndroid Build Coastguard Worker case GL_PIXEL_MAP_I_TO_I:
122*61046927SAndroid Build Coastguard Worker /* special case */
123*61046927SAndroid Build Coastguard Worker ctx->PixelMaps.ItoI.Size = mapsize;
124*61046927SAndroid Build Coastguard Worker for (i = 0; i < mapsize; i++) {
125*61046927SAndroid Build Coastguard Worker ctx->PixelMaps.ItoI.Map[i] = values[i];
126*61046927SAndroid Build Coastguard Worker }
127*61046927SAndroid Build Coastguard Worker break;
128*61046927SAndroid Build Coastguard Worker default:
129*61046927SAndroid Build Coastguard Worker /* general case */
130*61046927SAndroid Build Coastguard Worker pm->Size = mapsize;
131*61046927SAndroid Build Coastguard Worker for (i = 0; i < mapsize; i++) {
132*61046927SAndroid Build Coastguard Worker GLfloat val = CLAMP(values[i], 0.0F, 1.0F);
133*61046927SAndroid Build Coastguard Worker pm->Map[i] = val;
134*61046927SAndroid Build Coastguard Worker }
135*61046927SAndroid Build Coastguard Worker }
136*61046927SAndroid Build Coastguard Worker }
137*61046927SAndroid Build Coastguard Worker
138*61046927SAndroid Build Coastguard Worker
139*61046927SAndroid Build Coastguard Worker /**
140*61046927SAndroid Build Coastguard Worker * Convenience wrapper for _mesa_validate_pbo_access() for gl[Get]PixelMap().
141*61046927SAndroid Build Coastguard Worker */
142*61046927SAndroid Build Coastguard Worker static GLboolean
validate_pbo_access(struct gl_context * ctx,struct gl_pixelstore_attrib * pack,GLsizei mapsize,GLenum format,GLenum type,GLsizei clientMemSize,const GLvoid * ptr)143*61046927SAndroid Build Coastguard Worker validate_pbo_access(struct gl_context *ctx,
144*61046927SAndroid Build Coastguard Worker struct gl_pixelstore_attrib *pack, GLsizei mapsize,
145*61046927SAndroid Build Coastguard Worker GLenum format, GLenum type, GLsizei clientMemSize,
146*61046927SAndroid Build Coastguard Worker const GLvoid *ptr)
147*61046927SAndroid Build Coastguard Worker {
148*61046927SAndroid Build Coastguard Worker GLboolean ok;
149*61046927SAndroid Build Coastguard Worker
150*61046927SAndroid Build Coastguard Worker /* Note, need to use DefaultPacking and Unpack's buffer object */
151*61046927SAndroid Build Coastguard Worker _mesa_reference_buffer_object(ctx,
152*61046927SAndroid Build Coastguard Worker &ctx->DefaultPacking.BufferObj,
153*61046927SAndroid Build Coastguard Worker pack->BufferObj);
154*61046927SAndroid Build Coastguard Worker
155*61046927SAndroid Build Coastguard Worker ok = _mesa_validate_pbo_access(1, &ctx->DefaultPacking, mapsize, 1, 1,
156*61046927SAndroid Build Coastguard Worker format, type, clientMemSize, ptr);
157*61046927SAndroid Build Coastguard Worker
158*61046927SAndroid Build Coastguard Worker /* restore */
159*61046927SAndroid Build Coastguard Worker _mesa_reference_buffer_object(ctx,
160*61046927SAndroid Build Coastguard Worker &ctx->DefaultPacking.BufferObj, NULL);
161*61046927SAndroid Build Coastguard Worker
162*61046927SAndroid Build Coastguard Worker if (!ok) {
163*61046927SAndroid Build Coastguard Worker if (pack->BufferObj) {
164*61046927SAndroid Build Coastguard Worker _mesa_error(ctx, GL_INVALID_OPERATION,
165*61046927SAndroid Build Coastguard Worker "gl[Get]PixelMap*v(out of bounds PBO access)");
166*61046927SAndroid Build Coastguard Worker } else {
167*61046927SAndroid Build Coastguard Worker _mesa_error(ctx, GL_INVALID_OPERATION,
168*61046927SAndroid Build Coastguard Worker "glGetnPixelMap*vARB(out of bounds access:"
169*61046927SAndroid Build Coastguard Worker " bufSize (%d) is too small)", clientMemSize);
170*61046927SAndroid Build Coastguard Worker }
171*61046927SAndroid Build Coastguard Worker }
172*61046927SAndroid Build Coastguard Worker return ok;
173*61046927SAndroid Build Coastguard Worker }
174*61046927SAndroid Build Coastguard Worker
175*61046927SAndroid Build Coastguard Worker
176*61046927SAndroid Build Coastguard Worker void GLAPIENTRY
_mesa_PixelMapfv(GLenum map,GLsizei mapsize,const GLfloat * values)177*61046927SAndroid Build Coastguard Worker _mesa_PixelMapfv( GLenum map, GLsizei mapsize, const GLfloat *values )
178*61046927SAndroid Build Coastguard Worker {
179*61046927SAndroid Build Coastguard Worker GET_CURRENT_CONTEXT(ctx);
180*61046927SAndroid Build Coastguard Worker
181*61046927SAndroid Build Coastguard Worker /* XXX someday, test against ctx->Const.MaxPixelMapTableSize */
182*61046927SAndroid Build Coastguard Worker if (mapsize < 1 || mapsize > MAX_PIXEL_MAP_TABLE) {
183*61046927SAndroid Build Coastguard Worker _mesa_error( ctx, GL_INVALID_VALUE, "glPixelMapfv(mapsize)" );
184*61046927SAndroid Build Coastguard Worker return;
185*61046927SAndroid Build Coastguard Worker }
186*61046927SAndroid Build Coastguard Worker
187*61046927SAndroid Build Coastguard Worker if (map >= GL_PIXEL_MAP_S_TO_S && map <= GL_PIXEL_MAP_I_TO_A) {
188*61046927SAndroid Build Coastguard Worker /* test that mapsize is a power of two */
189*61046927SAndroid Build Coastguard Worker if (!util_is_power_of_two_or_zero(mapsize)) {
190*61046927SAndroid Build Coastguard Worker _mesa_error( ctx, GL_INVALID_VALUE, "glPixelMapfv(mapsize)" );
191*61046927SAndroid Build Coastguard Worker return;
192*61046927SAndroid Build Coastguard Worker }
193*61046927SAndroid Build Coastguard Worker }
194*61046927SAndroid Build Coastguard Worker
195*61046927SAndroid Build Coastguard Worker FLUSH_VERTICES(ctx, _NEW_PIXEL, 0);
196*61046927SAndroid Build Coastguard Worker
197*61046927SAndroid Build Coastguard Worker if (!validate_pbo_access(ctx, &ctx->Unpack, mapsize, GL_INTENSITY,
198*61046927SAndroid Build Coastguard Worker GL_FLOAT, INT_MAX, values)) {
199*61046927SAndroid Build Coastguard Worker return;
200*61046927SAndroid Build Coastguard Worker }
201*61046927SAndroid Build Coastguard Worker
202*61046927SAndroid Build Coastguard Worker values = (const GLfloat *) _mesa_map_pbo_source(ctx, &ctx->Unpack, values);
203*61046927SAndroid Build Coastguard Worker if (!values) {
204*61046927SAndroid Build Coastguard Worker if (ctx->Unpack.BufferObj) {
205*61046927SAndroid Build Coastguard Worker _mesa_error(ctx, GL_INVALID_OPERATION,
206*61046927SAndroid Build Coastguard Worker "glPixelMapfv(PBO is mapped)");
207*61046927SAndroid Build Coastguard Worker }
208*61046927SAndroid Build Coastguard Worker return;
209*61046927SAndroid Build Coastguard Worker }
210*61046927SAndroid Build Coastguard Worker
211*61046927SAndroid Build Coastguard Worker store_pixelmap(ctx, map, mapsize, values);
212*61046927SAndroid Build Coastguard Worker
213*61046927SAndroid Build Coastguard Worker _mesa_unmap_pbo_source(ctx, &ctx->Unpack);
214*61046927SAndroid Build Coastguard Worker }
215*61046927SAndroid Build Coastguard Worker
216*61046927SAndroid Build Coastguard Worker
217*61046927SAndroid Build Coastguard Worker void GLAPIENTRY
_mesa_PixelMapuiv(GLenum map,GLsizei mapsize,const GLuint * values)218*61046927SAndroid Build Coastguard Worker _mesa_PixelMapuiv(GLenum map, GLsizei mapsize, const GLuint *values )
219*61046927SAndroid Build Coastguard Worker {
220*61046927SAndroid Build Coastguard Worker GLfloat fvalues[MAX_PIXEL_MAP_TABLE];
221*61046927SAndroid Build Coastguard Worker GET_CURRENT_CONTEXT(ctx);
222*61046927SAndroid Build Coastguard Worker
223*61046927SAndroid Build Coastguard Worker if (mapsize < 1 || mapsize > MAX_PIXEL_MAP_TABLE) {
224*61046927SAndroid Build Coastguard Worker _mesa_error( ctx, GL_INVALID_VALUE, "glPixelMapuiv(mapsize)" );
225*61046927SAndroid Build Coastguard Worker return;
226*61046927SAndroid Build Coastguard Worker }
227*61046927SAndroid Build Coastguard Worker
228*61046927SAndroid Build Coastguard Worker if (map >= GL_PIXEL_MAP_S_TO_S && map <= GL_PIXEL_MAP_I_TO_A) {
229*61046927SAndroid Build Coastguard Worker /* test that mapsize is a power of two */
230*61046927SAndroid Build Coastguard Worker if (!util_is_power_of_two_or_zero(mapsize)) {
231*61046927SAndroid Build Coastguard Worker _mesa_error( ctx, GL_INVALID_VALUE, "glPixelMapuiv(mapsize)" );
232*61046927SAndroid Build Coastguard Worker return;
233*61046927SAndroid Build Coastguard Worker }
234*61046927SAndroid Build Coastguard Worker }
235*61046927SAndroid Build Coastguard Worker
236*61046927SAndroid Build Coastguard Worker FLUSH_VERTICES(ctx, _NEW_PIXEL, 0);
237*61046927SAndroid Build Coastguard Worker
238*61046927SAndroid Build Coastguard Worker if (!validate_pbo_access(ctx, &ctx->Unpack, mapsize, GL_INTENSITY,
239*61046927SAndroid Build Coastguard Worker GL_UNSIGNED_INT, INT_MAX, values)) {
240*61046927SAndroid Build Coastguard Worker return;
241*61046927SAndroid Build Coastguard Worker }
242*61046927SAndroid Build Coastguard Worker
243*61046927SAndroid Build Coastguard Worker values = (const GLuint *) _mesa_map_pbo_source(ctx, &ctx->Unpack, values);
244*61046927SAndroid Build Coastguard Worker if (!values) {
245*61046927SAndroid Build Coastguard Worker if (ctx->Unpack.BufferObj) {
246*61046927SAndroid Build Coastguard Worker _mesa_error(ctx, GL_INVALID_OPERATION,
247*61046927SAndroid Build Coastguard Worker "glPixelMapuiv(PBO is mapped)");
248*61046927SAndroid Build Coastguard Worker }
249*61046927SAndroid Build Coastguard Worker return;
250*61046927SAndroid Build Coastguard Worker }
251*61046927SAndroid Build Coastguard Worker
252*61046927SAndroid Build Coastguard Worker /* convert to floats */
253*61046927SAndroid Build Coastguard Worker if (map == GL_PIXEL_MAP_I_TO_I || map == GL_PIXEL_MAP_S_TO_S) {
254*61046927SAndroid Build Coastguard Worker GLint i;
255*61046927SAndroid Build Coastguard Worker for (i = 0; i < mapsize; i++) {
256*61046927SAndroid Build Coastguard Worker fvalues[i] = (GLfloat) values[i];
257*61046927SAndroid Build Coastguard Worker }
258*61046927SAndroid Build Coastguard Worker }
259*61046927SAndroid Build Coastguard Worker else {
260*61046927SAndroid Build Coastguard Worker GLint i;
261*61046927SAndroid Build Coastguard Worker for (i = 0; i < mapsize; i++) {
262*61046927SAndroid Build Coastguard Worker fvalues[i] = UINT_TO_FLOAT( values[i] );
263*61046927SAndroid Build Coastguard Worker }
264*61046927SAndroid Build Coastguard Worker }
265*61046927SAndroid Build Coastguard Worker
266*61046927SAndroid Build Coastguard Worker _mesa_unmap_pbo_source(ctx, &ctx->Unpack);
267*61046927SAndroid Build Coastguard Worker
268*61046927SAndroid Build Coastguard Worker store_pixelmap(ctx, map, mapsize, fvalues);
269*61046927SAndroid Build Coastguard Worker }
270*61046927SAndroid Build Coastguard Worker
271*61046927SAndroid Build Coastguard Worker
272*61046927SAndroid Build Coastguard Worker void GLAPIENTRY
_mesa_PixelMapusv(GLenum map,GLsizei mapsize,const GLushort * values)273*61046927SAndroid Build Coastguard Worker _mesa_PixelMapusv(GLenum map, GLsizei mapsize, const GLushort *values )
274*61046927SAndroid Build Coastguard Worker {
275*61046927SAndroid Build Coastguard Worker GLfloat fvalues[MAX_PIXEL_MAP_TABLE];
276*61046927SAndroid Build Coastguard Worker GET_CURRENT_CONTEXT(ctx);
277*61046927SAndroid Build Coastguard Worker
278*61046927SAndroid Build Coastguard Worker if (mapsize < 1 || mapsize > MAX_PIXEL_MAP_TABLE) {
279*61046927SAndroid Build Coastguard Worker _mesa_error( ctx, GL_INVALID_VALUE, "glPixelMapusv(mapsize)" );
280*61046927SAndroid Build Coastguard Worker return;
281*61046927SAndroid Build Coastguard Worker }
282*61046927SAndroid Build Coastguard Worker
283*61046927SAndroid Build Coastguard Worker if (map >= GL_PIXEL_MAP_S_TO_S && map <= GL_PIXEL_MAP_I_TO_A) {
284*61046927SAndroid Build Coastguard Worker /* test that mapsize is a power of two */
285*61046927SAndroid Build Coastguard Worker if (!util_is_power_of_two_or_zero(mapsize)) {
286*61046927SAndroid Build Coastguard Worker _mesa_error( ctx, GL_INVALID_VALUE, "glPixelMapusv(mapsize)" );
287*61046927SAndroid Build Coastguard Worker return;
288*61046927SAndroid Build Coastguard Worker }
289*61046927SAndroid Build Coastguard Worker }
290*61046927SAndroid Build Coastguard Worker
291*61046927SAndroid Build Coastguard Worker FLUSH_VERTICES(ctx, _NEW_PIXEL, 0);
292*61046927SAndroid Build Coastguard Worker
293*61046927SAndroid Build Coastguard Worker if (!validate_pbo_access(ctx, &ctx->Unpack, mapsize, GL_INTENSITY,
294*61046927SAndroid Build Coastguard Worker GL_UNSIGNED_SHORT, INT_MAX, values)) {
295*61046927SAndroid Build Coastguard Worker return;
296*61046927SAndroid Build Coastguard Worker }
297*61046927SAndroid Build Coastguard Worker
298*61046927SAndroid Build Coastguard Worker values = (const GLushort *) _mesa_map_pbo_source(ctx, &ctx->Unpack, values);
299*61046927SAndroid Build Coastguard Worker if (!values) {
300*61046927SAndroid Build Coastguard Worker if (ctx->Unpack.BufferObj) {
301*61046927SAndroid Build Coastguard Worker _mesa_error(ctx, GL_INVALID_OPERATION,
302*61046927SAndroid Build Coastguard Worker "glPixelMapusv(PBO is mapped)");
303*61046927SAndroid Build Coastguard Worker }
304*61046927SAndroid Build Coastguard Worker return;
305*61046927SAndroid Build Coastguard Worker }
306*61046927SAndroid Build Coastguard Worker
307*61046927SAndroid Build Coastguard Worker /* convert to floats */
308*61046927SAndroid Build Coastguard Worker if (map == GL_PIXEL_MAP_I_TO_I || map == GL_PIXEL_MAP_S_TO_S) {
309*61046927SAndroid Build Coastguard Worker GLint i;
310*61046927SAndroid Build Coastguard Worker for (i = 0; i < mapsize; i++) {
311*61046927SAndroid Build Coastguard Worker fvalues[i] = (GLfloat) values[i];
312*61046927SAndroid Build Coastguard Worker }
313*61046927SAndroid Build Coastguard Worker }
314*61046927SAndroid Build Coastguard Worker else {
315*61046927SAndroid Build Coastguard Worker GLint i;
316*61046927SAndroid Build Coastguard Worker for (i = 0; i < mapsize; i++) {
317*61046927SAndroid Build Coastguard Worker fvalues[i] = USHORT_TO_FLOAT( values[i] );
318*61046927SAndroid Build Coastguard Worker }
319*61046927SAndroid Build Coastguard Worker }
320*61046927SAndroid Build Coastguard Worker
321*61046927SAndroid Build Coastguard Worker _mesa_unmap_pbo_source(ctx, &ctx->Unpack);
322*61046927SAndroid Build Coastguard Worker
323*61046927SAndroid Build Coastguard Worker store_pixelmap(ctx, map, mapsize, fvalues);
324*61046927SAndroid Build Coastguard Worker }
325*61046927SAndroid Build Coastguard Worker
326*61046927SAndroid Build Coastguard Worker
327*61046927SAndroid Build Coastguard Worker void GLAPIENTRY
_mesa_GetnPixelMapfvARB(GLenum map,GLsizei bufSize,GLfloat * values)328*61046927SAndroid Build Coastguard Worker _mesa_GetnPixelMapfvARB( GLenum map, GLsizei bufSize, GLfloat *values )
329*61046927SAndroid Build Coastguard Worker {
330*61046927SAndroid Build Coastguard Worker GET_CURRENT_CONTEXT(ctx);
331*61046927SAndroid Build Coastguard Worker GLint mapsize, i;
332*61046927SAndroid Build Coastguard Worker const struct gl_pixelmap *pm;
333*61046927SAndroid Build Coastguard Worker
334*61046927SAndroid Build Coastguard Worker pm = get_pixelmap(ctx, map);
335*61046927SAndroid Build Coastguard Worker if (!pm) {
336*61046927SAndroid Build Coastguard Worker _mesa_error(ctx, GL_INVALID_ENUM, "glGetPixelMapfv(map)");
337*61046927SAndroid Build Coastguard Worker return;
338*61046927SAndroid Build Coastguard Worker }
339*61046927SAndroid Build Coastguard Worker
340*61046927SAndroid Build Coastguard Worker mapsize = pm->Size;
341*61046927SAndroid Build Coastguard Worker
342*61046927SAndroid Build Coastguard Worker if (!validate_pbo_access(ctx, &ctx->Pack, mapsize, GL_INTENSITY,
343*61046927SAndroid Build Coastguard Worker GL_FLOAT, bufSize, values)) {
344*61046927SAndroid Build Coastguard Worker return;
345*61046927SAndroid Build Coastguard Worker }
346*61046927SAndroid Build Coastguard Worker
347*61046927SAndroid Build Coastguard Worker if (ctx->Pack.BufferObj)
348*61046927SAndroid Build Coastguard Worker ctx->Pack.BufferObj->UsageHistory |= USAGE_PIXEL_PACK_BUFFER;
349*61046927SAndroid Build Coastguard Worker
350*61046927SAndroid Build Coastguard Worker values = (GLfloat *) _mesa_map_pbo_dest(ctx, &ctx->Pack, values);
351*61046927SAndroid Build Coastguard Worker if (!values) {
352*61046927SAndroid Build Coastguard Worker if (ctx->Pack.BufferObj) {
353*61046927SAndroid Build Coastguard Worker _mesa_error(ctx, GL_INVALID_OPERATION,
354*61046927SAndroid Build Coastguard Worker "glGetPixelMapfv(PBO is mapped)");
355*61046927SAndroid Build Coastguard Worker }
356*61046927SAndroid Build Coastguard Worker return;
357*61046927SAndroid Build Coastguard Worker }
358*61046927SAndroid Build Coastguard Worker
359*61046927SAndroid Build Coastguard Worker if (map == GL_PIXEL_MAP_S_TO_S) {
360*61046927SAndroid Build Coastguard Worker /* special case */
361*61046927SAndroid Build Coastguard Worker for (i = 0; i < mapsize; i++) {
362*61046927SAndroid Build Coastguard Worker values[i] = (GLfloat) ctx->PixelMaps.StoS.Map[i];
363*61046927SAndroid Build Coastguard Worker }
364*61046927SAndroid Build Coastguard Worker }
365*61046927SAndroid Build Coastguard Worker else {
366*61046927SAndroid Build Coastguard Worker memcpy(values, pm->Map, mapsize * sizeof(GLfloat));
367*61046927SAndroid Build Coastguard Worker }
368*61046927SAndroid Build Coastguard Worker
369*61046927SAndroid Build Coastguard Worker _mesa_unmap_pbo_dest(ctx, &ctx->Pack);
370*61046927SAndroid Build Coastguard Worker }
371*61046927SAndroid Build Coastguard Worker
372*61046927SAndroid Build Coastguard Worker
373*61046927SAndroid Build Coastguard Worker void GLAPIENTRY
_mesa_GetPixelMapfv(GLenum map,GLfloat * values)374*61046927SAndroid Build Coastguard Worker _mesa_GetPixelMapfv( GLenum map, GLfloat *values )
375*61046927SAndroid Build Coastguard Worker {
376*61046927SAndroid Build Coastguard Worker _mesa_GetnPixelMapfvARB(map, INT_MAX, values);
377*61046927SAndroid Build Coastguard Worker }
378*61046927SAndroid Build Coastguard Worker
379*61046927SAndroid Build Coastguard Worker void GLAPIENTRY
_mesa_GetnPixelMapuivARB(GLenum map,GLsizei bufSize,GLuint * values)380*61046927SAndroid Build Coastguard Worker _mesa_GetnPixelMapuivARB( GLenum map, GLsizei bufSize, GLuint *values )
381*61046927SAndroid Build Coastguard Worker {
382*61046927SAndroid Build Coastguard Worker GET_CURRENT_CONTEXT(ctx);
383*61046927SAndroid Build Coastguard Worker GLint mapsize, i;
384*61046927SAndroid Build Coastguard Worker const struct gl_pixelmap *pm;
385*61046927SAndroid Build Coastguard Worker
386*61046927SAndroid Build Coastguard Worker pm = get_pixelmap(ctx, map);
387*61046927SAndroid Build Coastguard Worker if (!pm) {
388*61046927SAndroid Build Coastguard Worker _mesa_error(ctx, GL_INVALID_ENUM, "glGetPixelMapuiv(map)");
389*61046927SAndroid Build Coastguard Worker return;
390*61046927SAndroid Build Coastguard Worker }
391*61046927SAndroid Build Coastguard Worker
392*61046927SAndroid Build Coastguard Worker mapsize = pm->Size;
393*61046927SAndroid Build Coastguard Worker
394*61046927SAndroid Build Coastguard Worker if (!validate_pbo_access(ctx, &ctx->Pack, mapsize, GL_INTENSITY,
395*61046927SAndroid Build Coastguard Worker GL_UNSIGNED_INT, bufSize, values)) {
396*61046927SAndroid Build Coastguard Worker return;
397*61046927SAndroid Build Coastguard Worker }
398*61046927SAndroid Build Coastguard Worker
399*61046927SAndroid Build Coastguard Worker if (ctx->Pack.BufferObj)
400*61046927SAndroid Build Coastguard Worker ctx->Pack.BufferObj->UsageHistory |= USAGE_PIXEL_PACK_BUFFER;
401*61046927SAndroid Build Coastguard Worker
402*61046927SAndroid Build Coastguard Worker values = (GLuint *) _mesa_map_pbo_dest(ctx, &ctx->Pack, values);
403*61046927SAndroid Build Coastguard Worker if (!values) {
404*61046927SAndroid Build Coastguard Worker if (ctx->Pack.BufferObj) {
405*61046927SAndroid Build Coastguard Worker _mesa_error(ctx, GL_INVALID_OPERATION,
406*61046927SAndroid Build Coastguard Worker "glGetPixelMapuiv(PBO is mapped)");
407*61046927SAndroid Build Coastguard Worker }
408*61046927SAndroid Build Coastguard Worker return;
409*61046927SAndroid Build Coastguard Worker }
410*61046927SAndroid Build Coastguard Worker
411*61046927SAndroid Build Coastguard Worker if (map == GL_PIXEL_MAP_S_TO_S) {
412*61046927SAndroid Build Coastguard Worker /* special case */
413*61046927SAndroid Build Coastguard Worker memcpy(values, ctx->PixelMaps.StoS.Map, mapsize * sizeof(GLint));
414*61046927SAndroid Build Coastguard Worker }
415*61046927SAndroid Build Coastguard Worker else {
416*61046927SAndroid Build Coastguard Worker for (i = 0; i < mapsize; i++) {
417*61046927SAndroid Build Coastguard Worker values[i] = FLOAT_TO_UINT( pm->Map[i] );
418*61046927SAndroid Build Coastguard Worker }
419*61046927SAndroid Build Coastguard Worker }
420*61046927SAndroid Build Coastguard Worker
421*61046927SAndroid Build Coastguard Worker _mesa_unmap_pbo_dest(ctx, &ctx->Pack);
422*61046927SAndroid Build Coastguard Worker }
423*61046927SAndroid Build Coastguard Worker
424*61046927SAndroid Build Coastguard Worker
425*61046927SAndroid Build Coastguard Worker void GLAPIENTRY
_mesa_GetPixelMapuiv(GLenum map,GLuint * values)426*61046927SAndroid Build Coastguard Worker _mesa_GetPixelMapuiv( GLenum map, GLuint *values )
427*61046927SAndroid Build Coastguard Worker {
428*61046927SAndroid Build Coastguard Worker _mesa_GetnPixelMapuivARB(map, INT_MAX, values);
429*61046927SAndroid Build Coastguard Worker }
430*61046927SAndroid Build Coastguard Worker
431*61046927SAndroid Build Coastguard Worker void GLAPIENTRY
_mesa_GetnPixelMapusvARB(GLenum map,GLsizei bufSize,GLushort * values)432*61046927SAndroid Build Coastguard Worker _mesa_GetnPixelMapusvARB( GLenum map, GLsizei bufSize, GLushort *values )
433*61046927SAndroid Build Coastguard Worker {
434*61046927SAndroid Build Coastguard Worker GET_CURRENT_CONTEXT(ctx);
435*61046927SAndroid Build Coastguard Worker GLint mapsize, i;
436*61046927SAndroid Build Coastguard Worker const struct gl_pixelmap *pm;
437*61046927SAndroid Build Coastguard Worker
438*61046927SAndroid Build Coastguard Worker pm = get_pixelmap(ctx, map);
439*61046927SAndroid Build Coastguard Worker if (!pm) {
440*61046927SAndroid Build Coastguard Worker _mesa_error(ctx, GL_INVALID_ENUM, "glGetPixelMapusv(map)");
441*61046927SAndroid Build Coastguard Worker return;
442*61046927SAndroid Build Coastguard Worker }
443*61046927SAndroid Build Coastguard Worker
444*61046927SAndroid Build Coastguard Worker mapsize = pm->Size;
445*61046927SAndroid Build Coastguard Worker
446*61046927SAndroid Build Coastguard Worker if (!validate_pbo_access(ctx, &ctx->Pack, mapsize, GL_INTENSITY,
447*61046927SAndroid Build Coastguard Worker GL_UNSIGNED_SHORT, bufSize, values)) {
448*61046927SAndroid Build Coastguard Worker return;
449*61046927SAndroid Build Coastguard Worker }
450*61046927SAndroid Build Coastguard Worker
451*61046927SAndroid Build Coastguard Worker if (ctx->Pack.BufferObj)
452*61046927SAndroid Build Coastguard Worker ctx->Pack.BufferObj->UsageHistory |= USAGE_PIXEL_PACK_BUFFER;
453*61046927SAndroid Build Coastguard Worker
454*61046927SAndroid Build Coastguard Worker values = (GLushort *) _mesa_map_pbo_dest(ctx, &ctx->Pack, values);
455*61046927SAndroid Build Coastguard Worker if (!values) {
456*61046927SAndroid Build Coastguard Worker if (ctx->Pack.BufferObj) {
457*61046927SAndroid Build Coastguard Worker _mesa_error(ctx, GL_INVALID_OPERATION,
458*61046927SAndroid Build Coastguard Worker "glGetPixelMapusv(PBO is mapped)");
459*61046927SAndroid Build Coastguard Worker }
460*61046927SAndroid Build Coastguard Worker return;
461*61046927SAndroid Build Coastguard Worker }
462*61046927SAndroid Build Coastguard Worker
463*61046927SAndroid Build Coastguard Worker switch (map) {
464*61046927SAndroid Build Coastguard Worker /* special cases */
465*61046927SAndroid Build Coastguard Worker case GL_PIXEL_MAP_I_TO_I:
466*61046927SAndroid Build Coastguard Worker for (i = 0; i < mapsize; i++) {
467*61046927SAndroid Build Coastguard Worker values[i] = (GLushort) CLAMP(ctx->PixelMaps.ItoI.Map[i], 0.0F, 65535.0F);
468*61046927SAndroid Build Coastguard Worker }
469*61046927SAndroid Build Coastguard Worker break;
470*61046927SAndroid Build Coastguard Worker case GL_PIXEL_MAP_S_TO_S:
471*61046927SAndroid Build Coastguard Worker for (i = 0; i < mapsize; i++) {
472*61046927SAndroid Build Coastguard Worker values[i] = (GLushort) CLAMP(ctx->PixelMaps.StoS.Map[i], 0.0F, 65535.0F);
473*61046927SAndroid Build Coastguard Worker }
474*61046927SAndroid Build Coastguard Worker break;
475*61046927SAndroid Build Coastguard Worker default:
476*61046927SAndroid Build Coastguard Worker for (i = 0; i < mapsize; i++) {
477*61046927SAndroid Build Coastguard Worker CLAMPED_FLOAT_TO_USHORT(values[i], pm->Map[i] );
478*61046927SAndroid Build Coastguard Worker }
479*61046927SAndroid Build Coastguard Worker }
480*61046927SAndroid Build Coastguard Worker
481*61046927SAndroid Build Coastguard Worker _mesa_unmap_pbo_dest(ctx, &ctx->Pack);
482*61046927SAndroid Build Coastguard Worker }
483*61046927SAndroid Build Coastguard Worker
484*61046927SAndroid Build Coastguard Worker
485*61046927SAndroid Build Coastguard Worker void GLAPIENTRY
_mesa_GetPixelMapusv(GLenum map,GLushort * values)486*61046927SAndroid Build Coastguard Worker _mesa_GetPixelMapusv( GLenum map, GLushort *values )
487*61046927SAndroid Build Coastguard Worker {
488*61046927SAndroid Build Coastguard Worker _mesa_GetnPixelMapusvARB(map, INT_MAX, values);
489*61046927SAndroid Build Coastguard Worker }
490*61046927SAndroid Build Coastguard Worker
491*61046927SAndroid Build Coastguard Worker
492*61046927SAndroid Build Coastguard Worker /**********************************************************************/
493*61046927SAndroid Build Coastguard Worker /***** glPixelTransfer *****/
494*61046927SAndroid Build Coastguard Worker /**********************************************************************/
495*61046927SAndroid Build Coastguard Worker
496*61046927SAndroid Build Coastguard Worker
497*61046927SAndroid Build Coastguard Worker /*
498*61046927SAndroid Build Coastguard Worker * Implements glPixelTransfer[fi] whether called immediately or from a
499*61046927SAndroid Build Coastguard Worker * display list.
500*61046927SAndroid Build Coastguard Worker */
501*61046927SAndroid Build Coastguard Worker void GLAPIENTRY
_mesa_PixelTransferf(GLenum pname,GLfloat param)502*61046927SAndroid Build Coastguard Worker _mesa_PixelTransferf( GLenum pname, GLfloat param )
503*61046927SAndroid Build Coastguard Worker {
504*61046927SAndroid Build Coastguard Worker GET_CURRENT_CONTEXT(ctx);
505*61046927SAndroid Build Coastguard Worker
506*61046927SAndroid Build Coastguard Worker switch (pname) {
507*61046927SAndroid Build Coastguard Worker case GL_MAP_COLOR:
508*61046927SAndroid Build Coastguard Worker if (ctx->Pixel.MapColorFlag == (param ? GL_TRUE : GL_FALSE))
509*61046927SAndroid Build Coastguard Worker return;
510*61046927SAndroid Build Coastguard Worker FLUSH_VERTICES(ctx, _NEW_PIXEL, GL_PIXEL_MODE_BIT);
511*61046927SAndroid Build Coastguard Worker ctx->Pixel.MapColorFlag = param ? GL_TRUE : GL_FALSE;
512*61046927SAndroid Build Coastguard Worker break;
513*61046927SAndroid Build Coastguard Worker case GL_MAP_STENCIL:
514*61046927SAndroid Build Coastguard Worker if (ctx->Pixel.MapStencilFlag == (param ? GL_TRUE : GL_FALSE))
515*61046927SAndroid Build Coastguard Worker return;
516*61046927SAndroid Build Coastguard Worker FLUSH_VERTICES(ctx, _NEW_PIXEL, GL_PIXEL_MODE_BIT);
517*61046927SAndroid Build Coastguard Worker ctx->Pixel.MapStencilFlag = param ? GL_TRUE : GL_FALSE;
518*61046927SAndroid Build Coastguard Worker break;
519*61046927SAndroid Build Coastguard Worker case GL_INDEX_SHIFT:
520*61046927SAndroid Build Coastguard Worker if (ctx->Pixel.IndexShift == (GLint) param)
521*61046927SAndroid Build Coastguard Worker return;
522*61046927SAndroid Build Coastguard Worker FLUSH_VERTICES(ctx, _NEW_PIXEL, GL_PIXEL_MODE_BIT);
523*61046927SAndroid Build Coastguard Worker ctx->Pixel.IndexShift = (GLint) param;
524*61046927SAndroid Build Coastguard Worker break;
525*61046927SAndroid Build Coastguard Worker case GL_INDEX_OFFSET:
526*61046927SAndroid Build Coastguard Worker if (ctx->Pixel.IndexOffset == (GLint) param)
527*61046927SAndroid Build Coastguard Worker return;
528*61046927SAndroid Build Coastguard Worker FLUSH_VERTICES(ctx, _NEW_PIXEL, GL_PIXEL_MODE_BIT);
529*61046927SAndroid Build Coastguard Worker ctx->Pixel.IndexOffset = (GLint) param;
530*61046927SAndroid Build Coastguard Worker break;
531*61046927SAndroid Build Coastguard Worker case GL_RED_SCALE:
532*61046927SAndroid Build Coastguard Worker if (ctx->Pixel.RedScale == param)
533*61046927SAndroid Build Coastguard Worker return;
534*61046927SAndroid Build Coastguard Worker FLUSH_VERTICES(ctx, _NEW_PIXEL, GL_PIXEL_MODE_BIT);
535*61046927SAndroid Build Coastguard Worker ctx->Pixel.RedScale = param;
536*61046927SAndroid Build Coastguard Worker break;
537*61046927SAndroid Build Coastguard Worker case GL_RED_BIAS:
538*61046927SAndroid Build Coastguard Worker if (ctx->Pixel.RedBias == param)
539*61046927SAndroid Build Coastguard Worker return;
540*61046927SAndroid Build Coastguard Worker FLUSH_VERTICES(ctx, _NEW_PIXEL, GL_PIXEL_MODE_BIT);
541*61046927SAndroid Build Coastguard Worker ctx->Pixel.RedBias = param;
542*61046927SAndroid Build Coastguard Worker break;
543*61046927SAndroid Build Coastguard Worker case GL_GREEN_SCALE:
544*61046927SAndroid Build Coastguard Worker if (ctx->Pixel.GreenScale == param)
545*61046927SAndroid Build Coastguard Worker return;
546*61046927SAndroid Build Coastguard Worker FLUSH_VERTICES(ctx, _NEW_PIXEL, GL_PIXEL_MODE_BIT);
547*61046927SAndroid Build Coastguard Worker ctx->Pixel.GreenScale = param;
548*61046927SAndroid Build Coastguard Worker break;
549*61046927SAndroid Build Coastguard Worker case GL_GREEN_BIAS:
550*61046927SAndroid Build Coastguard Worker if (ctx->Pixel.GreenBias == param)
551*61046927SAndroid Build Coastguard Worker return;
552*61046927SAndroid Build Coastguard Worker FLUSH_VERTICES(ctx, _NEW_PIXEL, GL_PIXEL_MODE_BIT);
553*61046927SAndroid Build Coastguard Worker ctx->Pixel.GreenBias = param;
554*61046927SAndroid Build Coastguard Worker break;
555*61046927SAndroid Build Coastguard Worker case GL_BLUE_SCALE:
556*61046927SAndroid Build Coastguard Worker if (ctx->Pixel.BlueScale == param)
557*61046927SAndroid Build Coastguard Worker return;
558*61046927SAndroid Build Coastguard Worker FLUSH_VERTICES(ctx, _NEW_PIXEL, GL_PIXEL_MODE_BIT);
559*61046927SAndroid Build Coastguard Worker ctx->Pixel.BlueScale = param;
560*61046927SAndroid Build Coastguard Worker break;
561*61046927SAndroid Build Coastguard Worker case GL_BLUE_BIAS:
562*61046927SAndroid Build Coastguard Worker if (ctx->Pixel.BlueBias == param)
563*61046927SAndroid Build Coastguard Worker return;
564*61046927SAndroid Build Coastguard Worker FLUSH_VERTICES(ctx, _NEW_PIXEL, GL_PIXEL_MODE_BIT);
565*61046927SAndroid Build Coastguard Worker ctx->Pixel.BlueBias = param;
566*61046927SAndroid Build Coastguard Worker break;
567*61046927SAndroid Build Coastguard Worker case GL_ALPHA_SCALE:
568*61046927SAndroid Build Coastguard Worker if (ctx->Pixel.AlphaScale == param)
569*61046927SAndroid Build Coastguard Worker return;
570*61046927SAndroid Build Coastguard Worker FLUSH_VERTICES(ctx, _NEW_PIXEL, GL_PIXEL_MODE_BIT);
571*61046927SAndroid Build Coastguard Worker ctx->Pixel.AlphaScale = param;
572*61046927SAndroid Build Coastguard Worker break;
573*61046927SAndroid Build Coastguard Worker case GL_ALPHA_BIAS:
574*61046927SAndroid Build Coastguard Worker if (ctx->Pixel.AlphaBias == param)
575*61046927SAndroid Build Coastguard Worker return;
576*61046927SAndroid Build Coastguard Worker FLUSH_VERTICES(ctx, _NEW_PIXEL, GL_PIXEL_MODE_BIT);
577*61046927SAndroid Build Coastguard Worker ctx->Pixel.AlphaBias = param;
578*61046927SAndroid Build Coastguard Worker break;
579*61046927SAndroid Build Coastguard Worker case GL_DEPTH_SCALE:
580*61046927SAndroid Build Coastguard Worker if (ctx->Pixel.DepthScale == param)
581*61046927SAndroid Build Coastguard Worker return;
582*61046927SAndroid Build Coastguard Worker FLUSH_VERTICES(ctx, _NEW_PIXEL, GL_PIXEL_MODE_BIT);
583*61046927SAndroid Build Coastguard Worker ctx->Pixel.DepthScale = param;
584*61046927SAndroid Build Coastguard Worker break;
585*61046927SAndroid Build Coastguard Worker case GL_DEPTH_BIAS:
586*61046927SAndroid Build Coastguard Worker if (ctx->Pixel.DepthBias == param)
587*61046927SAndroid Build Coastguard Worker return;
588*61046927SAndroid Build Coastguard Worker FLUSH_VERTICES(ctx, _NEW_PIXEL, GL_PIXEL_MODE_BIT);
589*61046927SAndroid Build Coastguard Worker ctx->Pixel.DepthBias = param;
590*61046927SAndroid Build Coastguard Worker break;
591*61046927SAndroid Build Coastguard Worker default:
592*61046927SAndroid Build Coastguard Worker _mesa_error( ctx, GL_INVALID_ENUM, "glPixelTransfer(pname)" );
593*61046927SAndroid Build Coastguard Worker return;
594*61046927SAndroid Build Coastguard Worker }
595*61046927SAndroid Build Coastguard Worker }
596*61046927SAndroid Build Coastguard Worker
597*61046927SAndroid Build Coastguard Worker
598*61046927SAndroid Build Coastguard Worker void GLAPIENTRY
_mesa_PixelTransferi(GLenum pname,GLint param)599*61046927SAndroid Build Coastguard Worker _mesa_PixelTransferi( GLenum pname, GLint param )
600*61046927SAndroid Build Coastguard Worker {
601*61046927SAndroid Build Coastguard Worker _mesa_PixelTransferf( pname, (GLfloat) param );
602*61046927SAndroid Build Coastguard Worker }
603*61046927SAndroid Build Coastguard Worker
604*61046927SAndroid Build Coastguard Worker
605*61046927SAndroid Build Coastguard Worker
606*61046927SAndroid Build Coastguard Worker /**********************************************************************/
607*61046927SAndroid Build Coastguard Worker /***** State Management *****/
608*61046927SAndroid Build Coastguard Worker /**********************************************************************/
609*61046927SAndroid Build Coastguard Worker
610*61046927SAndroid Build Coastguard Worker
611*61046927SAndroid Build Coastguard Worker /**
612*61046927SAndroid Build Coastguard Worker * Update mesa pixel transfer derived state to indicate which operations are
613*61046927SAndroid Build Coastguard Worker * enabled.
614*61046927SAndroid Build Coastguard Worker */
615*61046927SAndroid Build Coastguard Worker void
_mesa_update_pixel(struct gl_context * ctx)616*61046927SAndroid Build Coastguard Worker _mesa_update_pixel( struct gl_context *ctx )
617*61046927SAndroid Build Coastguard Worker {
618*61046927SAndroid Build Coastguard Worker GLuint mask = 0;
619*61046927SAndroid Build Coastguard Worker
620*61046927SAndroid Build Coastguard Worker if (ctx->Pixel.RedScale != 1.0F || ctx->Pixel.RedBias != 0.0F ||
621*61046927SAndroid Build Coastguard Worker ctx->Pixel.GreenScale != 1.0F || ctx->Pixel.GreenBias != 0.0F ||
622*61046927SAndroid Build Coastguard Worker ctx->Pixel.BlueScale != 1.0F || ctx->Pixel.BlueBias != 0.0F ||
623*61046927SAndroid Build Coastguard Worker ctx->Pixel.AlphaScale != 1.0F || ctx->Pixel.AlphaBias != 0.0F)
624*61046927SAndroid Build Coastguard Worker mask |= IMAGE_SCALE_BIAS_BIT;
625*61046927SAndroid Build Coastguard Worker
626*61046927SAndroid Build Coastguard Worker if (ctx->Pixel.IndexShift || ctx->Pixel.IndexOffset)
627*61046927SAndroid Build Coastguard Worker mask |= IMAGE_SHIFT_OFFSET_BIT;
628*61046927SAndroid Build Coastguard Worker
629*61046927SAndroid Build Coastguard Worker if (ctx->Pixel.MapColorFlag)
630*61046927SAndroid Build Coastguard Worker mask |= IMAGE_MAP_COLOR_BIT;
631*61046927SAndroid Build Coastguard Worker
632*61046927SAndroid Build Coastguard Worker ctx->_ImageTransferState = mask;
633*61046927SAndroid Build Coastguard Worker }
634*61046927SAndroid Build Coastguard Worker
635*61046927SAndroid Build Coastguard Worker
636*61046927SAndroid Build Coastguard Worker /**********************************************************************/
637*61046927SAndroid Build Coastguard Worker /***** Initialization *****/
638*61046927SAndroid Build Coastguard Worker /**********************************************************************/
639*61046927SAndroid Build Coastguard Worker
640*61046927SAndroid Build Coastguard Worker static void
init_pixelmap(struct gl_pixelmap * map)641*61046927SAndroid Build Coastguard Worker init_pixelmap(struct gl_pixelmap *map)
642*61046927SAndroid Build Coastguard Worker {
643*61046927SAndroid Build Coastguard Worker map->Size = 1;
644*61046927SAndroid Build Coastguard Worker map->Map[0] = 0.0;
645*61046927SAndroid Build Coastguard Worker }
646*61046927SAndroid Build Coastguard Worker
647*61046927SAndroid Build Coastguard Worker
648*61046927SAndroid Build Coastguard Worker /**
649*61046927SAndroid Build Coastguard Worker * Initialize the context's PIXEL attribute group.
650*61046927SAndroid Build Coastguard Worker */
651*61046927SAndroid Build Coastguard Worker void
_mesa_init_pixel(struct gl_context * ctx)652*61046927SAndroid Build Coastguard Worker _mesa_init_pixel( struct gl_context *ctx )
653*61046927SAndroid Build Coastguard Worker {
654*61046927SAndroid Build Coastguard Worker /* Pixel group */
655*61046927SAndroid Build Coastguard Worker ctx->Pixel.RedBias = 0.0;
656*61046927SAndroid Build Coastguard Worker ctx->Pixel.RedScale = 1.0;
657*61046927SAndroid Build Coastguard Worker ctx->Pixel.GreenBias = 0.0;
658*61046927SAndroid Build Coastguard Worker ctx->Pixel.GreenScale = 1.0;
659*61046927SAndroid Build Coastguard Worker ctx->Pixel.BlueBias = 0.0;
660*61046927SAndroid Build Coastguard Worker ctx->Pixel.BlueScale = 1.0;
661*61046927SAndroid Build Coastguard Worker ctx->Pixel.AlphaBias = 0.0;
662*61046927SAndroid Build Coastguard Worker ctx->Pixel.AlphaScale = 1.0;
663*61046927SAndroid Build Coastguard Worker ctx->Pixel.DepthBias = 0.0;
664*61046927SAndroid Build Coastguard Worker ctx->Pixel.DepthScale = 1.0;
665*61046927SAndroid Build Coastguard Worker ctx->Pixel.IndexOffset = 0;
666*61046927SAndroid Build Coastguard Worker ctx->Pixel.IndexShift = 0;
667*61046927SAndroid Build Coastguard Worker ctx->Pixel.ZoomX = 1.0;
668*61046927SAndroid Build Coastguard Worker ctx->Pixel.ZoomY = 1.0;
669*61046927SAndroid Build Coastguard Worker ctx->Pixel.MapColorFlag = GL_FALSE;
670*61046927SAndroid Build Coastguard Worker ctx->Pixel.MapStencilFlag = GL_FALSE;
671*61046927SAndroid Build Coastguard Worker init_pixelmap(&ctx->PixelMaps.StoS);
672*61046927SAndroid Build Coastguard Worker init_pixelmap(&ctx->PixelMaps.ItoI);
673*61046927SAndroid Build Coastguard Worker init_pixelmap(&ctx->PixelMaps.ItoR);
674*61046927SAndroid Build Coastguard Worker init_pixelmap(&ctx->PixelMaps.ItoG);
675*61046927SAndroid Build Coastguard Worker init_pixelmap(&ctx->PixelMaps.ItoB);
676*61046927SAndroid Build Coastguard Worker init_pixelmap(&ctx->PixelMaps.ItoA);
677*61046927SAndroid Build Coastguard Worker init_pixelmap(&ctx->PixelMaps.RtoR);
678*61046927SAndroid Build Coastguard Worker init_pixelmap(&ctx->PixelMaps.GtoG);
679*61046927SAndroid Build Coastguard Worker init_pixelmap(&ctx->PixelMaps.BtoB);
680*61046927SAndroid Build Coastguard Worker init_pixelmap(&ctx->PixelMaps.AtoA);
681*61046927SAndroid Build Coastguard Worker
682*61046927SAndroid Build Coastguard Worker if (ctx->Visual.doubleBufferMode) {
683*61046927SAndroid Build Coastguard Worker ctx->Pixel.ReadBuffer = GL_BACK;
684*61046927SAndroid Build Coastguard Worker }
685*61046927SAndroid Build Coastguard Worker else {
686*61046927SAndroid Build Coastguard Worker ctx->Pixel.ReadBuffer = GL_FRONT;
687*61046927SAndroid Build Coastguard Worker }
688*61046927SAndroid Build Coastguard Worker
689*61046927SAndroid Build Coastguard Worker /* Miscellaneous */
690*61046927SAndroid Build Coastguard Worker ctx->_ImageTransferState = 0;
691*61046927SAndroid Build Coastguard Worker }
692