1*61046927SAndroid Build Coastguard Worker
2*61046927SAndroid Build Coastguard Worker /*
3*61046927SAndroid Build Coastguard Worker * Mesa 3-D graphics library
4*61046927SAndroid Build Coastguard Worker *
5*61046927SAndroid Build Coastguard Worker * Copyright (C) 1999-2003 Brian Paul All Rights Reserved.
6*61046927SAndroid Build Coastguard Worker *
7*61046927SAndroid Build Coastguard Worker * Permission is hereby granted, free of charge, to any person obtaining a
8*61046927SAndroid Build Coastguard Worker * copy of this software and associated documentation files (the "Software"),
9*61046927SAndroid Build Coastguard Worker * to deal in the Software without restriction, including without limitation
10*61046927SAndroid Build Coastguard Worker * the rights to use, copy, modify, merge, publish, distribute, sublicense,
11*61046927SAndroid Build Coastguard Worker * and/or sell copies of the Software, and to permit persons to whom the
12*61046927SAndroid Build Coastguard Worker * Software is furnished to do so, subject to the following conditions:
13*61046927SAndroid Build Coastguard Worker *
14*61046927SAndroid Build Coastguard Worker * The above copyright notice and this permission notice shall be included
15*61046927SAndroid Build Coastguard Worker * in all copies or substantial portions of the Software.
16*61046927SAndroid Build Coastguard Worker *
17*61046927SAndroid Build Coastguard Worker * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
18*61046927SAndroid Build Coastguard Worker * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
19*61046927SAndroid Build Coastguard Worker * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
20*61046927SAndroid Build Coastguard Worker * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR
21*61046927SAndroid Build Coastguard Worker * OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
22*61046927SAndroid Build Coastguard Worker * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
23*61046927SAndroid Build Coastguard Worker * OTHER DEALINGS IN THE SOFTWARE.
24*61046927SAndroid Build Coastguard Worker */
25*61046927SAndroid Build Coastguard Worker
26*61046927SAndroid Build Coastguard Worker
27*61046927SAndroid Build Coastguard Worker /*
28*61046927SAndroid Build Coastguard Worker * eval.c was written by
29*61046927SAndroid Build Coastguard Worker * Bernd Barsuhn ([email protected]) and
30*61046927SAndroid Build Coastguard Worker * Volker Weiss ([email protected]).
31*61046927SAndroid Build Coastguard Worker *
32*61046927SAndroid Build Coastguard Worker * My original implementation of evaluators was simplistic and didn't
33*61046927SAndroid Build Coastguard Worker * compute surface normal vectors properly. Bernd and Volker applied
34*61046927SAndroid Build Coastguard Worker * used more sophisticated methods to get better results.
35*61046927SAndroid Build Coastguard Worker *
36*61046927SAndroid Build Coastguard Worker * Thanks guys!
37*61046927SAndroid Build Coastguard Worker */
38*61046927SAndroid Build Coastguard Worker
39*61046927SAndroid Build Coastguard Worker
40*61046927SAndroid Build Coastguard Worker #include "util/glheader.h"
41*61046927SAndroid Build Coastguard Worker #include "context.h"
42*61046927SAndroid Build Coastguard Worker #include "eval.h"
43*61046927SAndroid Build Coastguard Worker #include "macros.h"
44*61046927SAndroid Build Coastguard Worker #include "mtypes.h"
45*61046927SAndroid Build Coastguard Worker #include "main/dispatch.h"
46*61046927SAndroid Build Coastguard Worker #include "api_exec_decl.h"
47*61046927SAndroid Build Coastguard Worker
48*61046927SAndroid Build Coastguard Worker
49*61046927SAndroid Build Coastguard Worker /*
50*61046927SAndroid Build Coastguard Worker * Return the number of components per control point for any type of
51*61046927SAndroid Build Coastguard Worker * evaluator. Return 0 if bad target.
52*61046927SAndroid Build Coastguard Worker * See table 5.1 in the OpenGL 1.2 spec.
53*61046927SAndroid Build Coastguard Worker */
_mesa_evaluator_components(GLenum target)54*61046927SAndroid Build Coastguard Worker GLuint _mesa_evaluator_components( GLenum target )
55*61046927SAndroid Build Coastguard Worker {
56*61046927SAndroid Build Coastguard Worker switch (target) {
57*61046927SAndroid Build Coastguard Worker case GL_MAP1_VERTEX_3: return 3;
58*61046927SAndroid Build Coastguard Worker case GL_MAP1_VERTEX_4: return 4;
59*61046927SAndroid Build Coastguard Worker case GL_MAP1_INDEX: return 1;
60*61046927SAndroid Build Coastguard Worker case GL_MAP1_COLOR_4: return 4;
61*61046927SAndroid Build Coastguard Worker case GL_MAP1_NORMAL: return 3;
62*61046927SAndroid Build Coastguard Worker case GL_MAP1_TEXTURE_COORD_1: return 1;
63*61046927SAndroid Build Coastguard Worker case GL_MAP1_TEXTURE_COORD_2: return 2;
64*61046927SAndroid Build Coastguard Worker case GL_MAP1_TEXTURE_COORD_3: return 3;
65*61046927SAndroid Build Coastguard Worker case GL_MAP1_TEXTURE_COORD_4: return 4;
66*61046927SAndroid Build Coastguard Worker case GL_MAP2_VERTEX_3: return 3;
67*61046927SAndroid Build Coastguard Worker case GL_MAP2_VERTEX_4: return 4;
68*61046927SAndroid Build Coastguard Worker case GL_MAP2_INDEX: return 1;
69*61046927SAndroid Build Coastguard Worker case GL_MAP2_COLOR_4: return 4;
70*61046927SAndroid Build Coastguard Worker case GL_MAP2_NORMAL: return 3;
71*61046927SAndroid Build Coastguard Worker case GL_MAP2_TEXTURE_COORD_1: return 1;
72*61046927SAndroid Build Coastguard Worker case GL_MAP2_TEXTURE_COORD_2: return 2;
73*61046927SAndroid Build Coastguard Worker case GL_MAP2_TEXTURE_COORD_3: return 3;
74*61046927SAndroid Build Coastguard Worker case GL_MAP2_TEXTURE_COORD_4: return 4;
75*61046927SAndroid Build Coastguard Worker default: break;
76*61046927SAndroid Build Coastguard Worker }
77*61046927SAndroid Build Coastguard Worker
78*61046927SAndroid Build Coastguard Worker return 0;
79*61046927SAndroid Build Coastguard Worker }
80*61046927SAndroid Build Coastguard Worker
81*61046927SAndroid Build Coastguard Worker
82*61046927SAndroid Build Coastguard Worker /*
83*61046927SAndroid Build Coastguard Worker * Return pointer to the gl_1d_map struct for the named target.
84*61046927SAndroid Build Coastguard Worker */
85*61046927SAndroid Build Coastguard Worker static struct gl_1d_map *
get_1d_map(struct gl_context * ctx,GLenum target)86*61046927SAndroid Build Coastguard Worker get_1d_map( struct gl_context *ctx, GLenum target )
87*61046927SAndroid Build Coastguard Worker {
88*61046927SAndroid Build Coastguard Worker switch (target) {
89*61046927SAndroid Build Coastguard Worker case GL_MAP1_VERTEX_3:
90*61046927SAndroid Build Coastguard Worker return &ctx->EvalMap.Map1Vertex3;
91*61046927SAndroid Build Coastguard Worker case GL_MAP1_VERTEX_4:
92*61046927SAndroid Build Coastguard Worker return &ctx->EvalMap.Map1Vertex4;
93*61046927SAndroid Build Coastguard Worker case GL_MAP1_INDEX:
94*61046927SAndroid Build Coastguard Worker return &ctx->EvalMap.Map1Index;
95*61046927SAndroid Build Coastguard Worker case GL_MAP1_COLOR_4:
96*61046927SAndroid Build Coastguard Worker return &ctx->EvalMap.Map1Color4;
97*61046927SAndroid Build Coastguard Worker case GL_MAP1_NORMAL:
98*61046927SAndroid Build Coastguard Worker return &ctx->EvalMap.Map1Normal;
99*61046927SAndroid Build Coastguard Worker case GL_MAP1_TEXTURE_COORD_1:
100*61046927SAndroid Build Coastguard Worker return &ctx->EvalMap.Map1Texture1;
101*61046927SAndroid Build Coastguard Worker case GL_MAP1_TEXTURE_COORD_2:
102*61046927SAndroid Build Coastguard Worker return &ctx->EvalMap.Map1Texture2;
103*61046927SAndroid Build Coastguard Worker case GL_MAP1_TEXTURE_COORD_3:
104*61046927SAndroid Build Coastguard Worker return &ctx->EvalMap.Map1Texture3;
105*61046927SAndroid Build Coastguard Worker case GL_MAP1_TEXTURE_COORD_4:
106*61046927SAndroid Build Coastguard Worker return &ctx->EvalMap.Map1Texture4;
107*61046927SAndroid Build Coastguard Worker default:
108*61046927SAndroid Build Coastguard Worker return NULL;
109*61046927SAndroid Build Coastguard Worker }
110*61046927SAndroid Build Coastguard Worker }
111*61046927SAndroid Build Coastguard Worker
112*61046927SAndroid Build Coastguard Worker
113*61046927SAndroid Build Coastguard Worker /*
114*61046927SAndroid Build Coastguard Worker * Return pointer to the gl_2d_map struct for the named target.
115*61046927SAndroid Build Coastguard Worker */
116*61046927SAndroid Build Coastguard Worker static struct gl_2d_map *
get_2d_map(struct gl_context * ctx,GLenum target)117*61046927SAndroid Build Coastguard Worker get_2d_map( struct gl_context *ctx, GLenum target )
118*61046927SAndroid Build Coastguard Worker {
119*61046927SAndroid Build Coastguard Worker switch (target) {
120*61046927SAndroid Build Coastguard Worker case GL_MAP2_VERTEX_3:
121*61046927SAndroid Build Coastguard Worker return &ctx->EvalMap.Map2Vertex3;
122*61046927SAndroid Build Coastguard Worker case GL_MAP2_VERTEX_4:
123*61046927SAndroid Build Coastguard Worker return &ctx->EvalMap.Map2Vertex4;
124*61046927SAndroid Build Coastguard Worker case GL_MAP2_INDEX:
125*61046927SAndroid Build Coastguard Worker return &ctx->EvalMap.Map2Index;
126*61046927SAndroid Build Coastguard Worker case GL_MAP2_COLOR_4:
127*61046927SAndroid Build Coastguard Worker return &ctx->EvalMap.Map2Color4;
128*61046927SAndroid Build Coastguard Worker case GL_MAP2_NORMAL:
129*61046927SAndroid Build Coastguard Worker return &ctx->EvalMap.Map2Normal;
130*61046927SAndroid Build Coastguard Worker case GL_MAP2_TEXTURE_COORD_1:
131*61046927SAndroid Build Coastguard Worker return &ctx->EvalMap.Map2Texture1;
132*61046927SAndroid Build Coastguard Worker case GL_MAP2_TEXTURE_COORD_2:
133*61046927SAndroid Build Coastguard Worker return &ctx->EvalMap.Map2Texture2;
134*61046927SAndroid Build Coastguard Worker case GL_MAP2_TEXTURE_COORD_3:
135*61046927SAndroid Build Coastguard Worker return &ctx->EvalMap.Map2Texture3;
136*61046927SAndroid Build Coastguard Worker case GL_MAP2_TEXTURE_COORD_4:
137*61046927SAndroid Build Coastguard Worker return &ctx->EvalMap.Map2Texture4;
138*61046927SAndroid Build Coastguard Worker default:
139*61046927SAndroid Build Coastguard Worker return NULL;
140*61046927SAndroid Build Coastguard Worker }
141*61046927SAndroid Build Coastguard Worker }
142*61046927SAndroid Build Coastguard Worker
143*61046927SAndroid Build Coastguard Worker
144*61046927SAndroid Build Coastguard Worker /**********************************************************************/
145*61046927SAndroid Build Coastguard Worker /*** Copy and deallocate control points ***/
146*61046927SAndroid Build Coastguard Worker /**********************************************************************/
147*61046927SAndroid Build Coastguard Worker
148*61046927SAndroid Build Coastguard Worker
149*61046927SAndroid Build Coastguard Worker /*
150*61046927SAndroid Build Coastguard Worker * Copy 1-parametric evaluator control points from user-specified
151*61046927SAndroid Build Coastguard Worker * memory space to a buffer of contiguous control points.
152*61046927SAndroid Build Coastguard Worker * \param see glMap1f for details
153*61046927SAndroid Build Coastguard Worker * \return pointer to buffer of contiguous control points or NULL if out
154*61046927SAndroid Build Coastguard Worker * of memory.
155*61046927SAndroid Build Coastguard Worker */
_mesa_copy_map_points1f(GLenum target,GLint ustride,GLint uorder,const GLfloat * points)156*61046927SAndroid Build Coastguard Worker GLfloat *_mesa_copy_map_points1f( GLenum target, GLint ustride, GLint uorder,
157*61046927SAndroid Build Coastguard Worker const GLfloat *points )
158*61046927SAndroid Build Coastguard Worker {
159*61046927SAndroid Build Coastguard Worker GLfloat *buffer, *p;
160*61046927SAndroid Build Coastguard Worker GLint i, k, size = _mesa_evaluator_components(target);
161*61046927SAndroid Build Coastguard Worker
162*61046927SAndroid Build Coastguard Worker if (!points || !size)
163*61046927SAndroid Build Coastguard Worker return NULL;
164*61046927SAndroid Build Coastguard Worker
165*61046927SAndroid Build Coastguard Worker buffer = malloc(uorder * size * sizeof(GLfloat));
166*61046927SAndroid Build Coastguard Worker
167*61046927SAndroid Build Coastguard Worker if (buffer)
168*61046927SAndroid Build Coastguard Worker for (i = 0, p = buffer; i < uorder; i++, points += ustride)
169*61046927SAndroid Build Coastguard Worker for (k = 0; k < size; k++)
170*61046927SAndroid Build Coastguard Worker *p++ = points[k];
171*61046927SAndroid Build Coastguard Worker
172*61046927SAndroid Build Coastguard Worker return buffer;
173*61046927SAndroid Build Coastguard Worker }
174*61046927SAndroid Build Coastguard Worker
175*61046927SAndroid Build Coastguard Worker
176*61046927SAndroid Build Coastguard Worker
177*61046927SAndroid Build Coastguard Worker /*
178*61046927SAndroid Build Coastguard Worker * Same as above but convert doubles to floats.
179*61046927SAndroid Build Coastguard Worker */
_mesa_copy_map_points1d(GLenum target,GLint ustride,GLint uorder,const GLdouble * points)180*61046927SAndroid Build Coastguard Worker GLfloat *_mesa_copy_map_points1d( GLenum target, GLint ustride, GLint uorder,
181*61046927SAndroid Build Coastguard Worker const GLdouble *points )
182*61046927SAndroid Build Coastguard Worker {
183*61046927SAndroid Build Coastguard Worker GLfloat *buffer, *p;
184*61046927SAndroid Build Coastguard Worker GLint i, k, size = _mesa_evaluator_components(target);
185*61046927SAndroid Build Coastguard Worker
186*61046927SAndroid Build Coastguard Worker if (!points || !size)
187*61046927SAndroid Build Coastguard Worker return NULL;
188*61046927SAndroid Build Coastguard Worker
189*61046927SAndroid Build Coastguard Worker buffer = malloc(uorder * size * sizeof(GLfloat));
190*61046927SAndroid Build Coastguard Worker
191*61046927SAndroid Build Coastguard Worker if (buffer)
192*61046927SAndroid Build Coastguard Worker for (i = 0, p = buffer; i < uorder; i++, points += ustride)
193*61046927SAndroid Build Coastguard Worker for (k = 0; k < size; k++)
194*61046927SAndroid Build Coastguard Worker *p++ = (GLfloat) points[k];
195*61046927SAndroid Build Coastguard Worker
196*61046927SAndroid Build Coastguard Worker return buffer;
197*61046927SAndroid Build Coastguard Worker }
198*61046927SAndroid Build Coastguard Worker
199*61046927SAndroid Build Coastguard Worker
200*61046927SAndroid Build Coastguard Worker
201*61046927SAndroid Build Coastguard Worker /*
202*61046927SAndroid Build Coastguard Worker * Copy 2-parametric evaluator control points from user-specified
203*61046927SAndroid Build Coastguard Worker * memory space to a buffer of contiguous control points.
204*61046927SAndroid Build Coastguard Worker * Additional memory is allocated to be used by the horner and
205*61046927SAndroid Build Coastguard Worker * de Casteljau evaluation schemes.
206*61046927SAndroid Build Coastguard Worker *
207*61046927SAndroid Build Coastguard Worker * \param see glMap2f for details
208*61046927SAndroid Build Coastguard Worker * \return pointer to buffer of contiguous control points or NULL if out
209*61046927SAndroid Build Coastguard Worker * of memory.
210*61046927SAndroid Build Coastguard Worker */
_mesa_copy_map_points2f(GLenum target,GLint ustride,GLint uorder,GLint vstride,GLint vorder,const GLfloat * points)211*61046927SAndroid Build Coastguard Worker GLfloat *_mesa_copy_map_points2f( GLenum target,
212*61046927SAndroid Build Coastguard Worker GLint ustride, GLint uorder,
213*61046927SAndroid Build Coastguard Worker GLint vstride, GLint vorder,
214*61046927SAndroid Build Coastguard Worker const GLfloat *points )
215*61046927SAndroid Build Coastguard Worker {
216*61046927SAndroid Build Coastguard Worker GLfloat *buffer, *p;
217*61046927SAndroid Build Coastguard Worker GLint i, j, k, size, dsize, hsize;
218*61046927SAndroid Build Coastguard Worker GLint uinc;
219*61046927SAndroid Build Coastguard Worker
220*61046927SAndroid Build Coastguard Worker size = _mesa_evaluator_components(target);
221*61046927SAndroid Build Coastguard Worker
222*61046927SAndroid Build Coastguard Worker if (!points || size==0) {
223*61046927SAndroid Build Coastguard Worker return NULL;
224*61046927SAndroid Build Coastguard Worker }
225*61046927SAndroid Build Coastguard Worker
226*61046927SAndroid Build Coastguard Worker /* max(uorder, vorder) additional points are used in */
227*61046927SAndroid Build Coastguard Worker /* horner evaluation and uorder*vorder additional */
228*61046927SAndroid Build Coastguard Worker /* values are needed for de Casteljau */
229*61046927SAndroid Build Coastguard Worker dsize = (uorder == 2 && vorder == 2)? 0 : uorder*vorder;
230*61046927SAndroid Build Coastguard Worker hsize = (uorder > vorder ? uorder : vorder)*size;
231*61046927SAndroid Build Coastguard Worker
232*61046927SAndroid Build Coastguard Worker if(hsize>dsize)
233*61046927SAndroid Build Coastguard Worker buffer = malloc((uorder*vorder*size+hsize)*sizeof(GLfloat));
234*61046927SAndroid Build Coastguard Worker else
235*61046927SAndroid Build Coastguard Worker buffer = malloc((uorder*vorder*size+dsize)*sizeof(GLfloat));
236*61046927SAndroid Build Coastguard Worker
237*61046927SAndroid Build Coastguard Worker /* compute the increment value for the u-loop */
238*61046927SAndroid Build Coastguard Worker uinc = ustride - vorder*vstride;
239*61046927SAndroid Build Coastguard Worker
240*61046927SAndroid Build Coastguard Worker if (buffer)
241*61046927SAndroid Build Coastguard Worker for (i=0, p=buffer; i<uorder; i++, points += uinc)
242*61046927SAndroid Build Coastguard Worker for (j=0; j<vorder; j++, points += vstride)
243*61046927SAndroid Build Coastguard Worker for (k=0; k<size; k++)
244*61046927SAndroid Build Coastguard Worker *p++ = points[k];
245*61046927SAndroid Build Coastguard Worker
246*61046927SAndroid Build Coastguard Worker return buffer;
247*61046927SAndroid Build Coastguard Worker }
248*61046927SAndroid Build Coastguard Worker
249*61046927SAndroid Build Coastguard Worker
250*61046927SAndroid Build Coastguard Worker
251*61046927SAndroid Build Coastguard Worker /*
252*61046927SAndroid Build Coastguard Worker * Same as above but convert doubles to floats.
253*61046927SAndroid Build Coastguard Worker */
_mesa_copy_map_points2d(GLenum target,GLint ustride,GLint uorder,GLint vstride,GLint vorder,const GLdouble * points)254*61046927SAndroid Build Coastguard Worker GLfloat *_mesa_copy_map_points2d(GLenum target,
255*61046927SAndroid Build Coastguard Worker GLint ustride, GLint uorder,
256*61046927SAndroid Build Coastguard Worker GLint vstride, GLint vorder,
257*61046927SAndroid Build Coastguard Worker const GLdouble *points )
258*61046927SAndroid Build Coastguard Worker {
259*61046927SAndroid Build Coastguard Worker GLfloat *buffer, *p;
260*61046927SAndroid Build Coastguard Worker GLint i, j, k, size, hsize, dsize;
261*61046927SAndroid Build Coastguard Worker GLint uinc;
262*61046927SAndroid Build Coastguard Worker
263*61046927SAndroid Build Coastguard Worker size = _mesa_evaluator_components(target);
264*61046927SAndroid Build Coastguard Worker
265*61046927SAndroid Build Coastguard Worker if (!points || size==0) {
266*61046927SAndroid Build Coastguard Worker return NULL;
267*61046927SAndroid Build Coastguard Worker }
268*61046927SAndroid Build Coastguard Worker
269*61046927SAndroid Build Coastguard Worker /* max(uorder, vorder) additional points are used in */
270*61046927SAndroid Build Coastguard Worker /* horner evaluation and uorder*vorder additional */
271*61046927SAndroid Build Coastguard Worker /* values are needed for de Casteljau */
272*61046927SAndroid Build Coastguard Worker dsize = (uorder == 2 && vorder == 2)? 0 : uorder*vorder;
273*61046927SAndroid Build Coastguard Worker hsize = (uorder > vorder ? uorder : vorder)*size;
274*61046927SAndroid Build Coastguard Worker
275*61046927SAndroid Build Coastguard Worker if(hsize>dsize)
276*61046927SAndroid Build Coastguard Worker buffer = malloc((uorder*vorder*size+hsize)*sizeof(GLfloat));
277*61046927SAndroid Build Coastguard Worker else
278*61046927SAndroid Build Coastguard Worker buffer = malloc((uorder*vorder*size+dsize)*sizeof(GLfloat));
279*61046927SAndroid Build Coastguard Worker
280*61046927SAndroid Build Coastguard Worker /* compute the increment value for the u-loop */
281*61046927SAndroid Build Coastguard Worker uinc = ustride - vorder*vstride;
282*61046927SAndroid Build Coastguard Worker
283*61046927SAndroid Build Coastguard Worker if (buffer)
284*61046927SAndroid Build Coastguard Worker for (i=0, p=buffer; i<uorder; i++, points += uinc)
285*61046927SAndroid Build Coastguard Worker for (j=0; j<vorder; j++, points += vstride)
286*61046927SAndroid Build Coastguard Worker for (k=0; k<size; k++)
287*61046927SAndroid Build Coastguard Worker *p++ = (GLfloat) points[k];
288*61046927SAndroid Build Coastguard Worker
289*61046927SAndroid Build Coastguard Worker return buffer;
290*61046927SAndroid Build Coastguard Worker }
291*61046927SAndroid Build Coastguard Worker
292*61046927SAndroid Build Coastguard Worker
293*61046927SAndroid Build Coastguard Worker
294*61046927SAndroid Build Coastguard Worker
295*61046927SAndroid Build Coastguard Worker /**********************************************************************/
296*61046927SAndroid Build Coastguard Worker /*** API entry points ***/
297*61046927SAndroid Build Coastguard Worker /**********************************************************************/
298*61046927SAndroid Build Coastguard Worker
299*61046927SAndroid Build Coastguard Worker
300*61046927SAndroid Build Coastguard Worker /*
301*61046927SAndroid Build Coastguard Worker * This does the work of glMap1[fd].
302*61046927SAndroid Build Coastguard Worker */
303*61046927SAndroid Build Coastguard Worker static void
map1(GLenum target,GLfloat u1,GLfloat u2,GLint ustride,GLint uorder,const GLvoid * points,GLenum type)304*61046927SAndroid Build Coastguard Worker map1(GLenum target, GLfloat u1, GLfloat u2, GLint ustride,
305*61046927SAndroid Build Coastguard Worker GLint uorder, const GLvoid *points, GLenum type )
306*61046927SAndroid Build Coastguard Worker {
307*61046927SAndroid Build Coastguard Worker GET_CURRENT_CONTEXT(ctx);
308*61046927SAndroid Build Coastguard Worker GLint k;
309*61046927SAndroid Build Coastguard Worker GLfloat *pnts;
310*61046927SAndroid Build Coastguard Worker struct gl_1d_map *map = NULL;
311*61046927SAndroid Build Coastguard Worker
312*61046927SAndroid Build Coastguard Worker assert(type == GL_FLOAT || type == GL_DOUBLE);
313*61046927SAndroid Build Coastguard Worker
314*61046927SAndroid Build Coastguard Worker if (u1 == u2) {
315*61046927SAndroid Build Coastguard Worker _mesa_error( ctx, GL_INVALID_VALUE, "glMap1(u1,u2)" );
316*61046927SAndroid Build Coastguard Worker return;
317*61046927SAndroid Build Coastguard Worker }
318*61046927SAndroid Build Coastguard Worker if (uorder < 1 || uorder > MAX_EVAL_ORDER) {
319*61046927SAndroid Build Coastguard Worker _mesa_error( ctx, GL_INVALID_VALUE, "glMap1(order)" );
320*61046927SAndroid Build Coastguard Worker return;
321*61046927SAndroid Build Coastguard Worker }
322*61046927SAndroid Build Coastguard Worker if (!points) {
323*61046927SAndroid Build Coastguard Worker _mesa_error( ctx, GL_INVALID_VALUE, "glMap1(points)" );
324*61046927SAndroid Build Coastguard Worker return;
325*61046927SAndroid Build Coastguard Worker }
326*61046927SAndroid Build Coastguard Worker
327*61046927SAndroid Build Coastguard Worker k = _mesa_evaluator_components( target );
328*61046927SAndroid Build Coastguard Worker if (k == 0) {
329*61046927SAndroid Build Coastguard Worker _mesa_error( ctx, GL_INVALID_ENUM, "glMap1(target)" );
330*61046927SAndroid Build Coastguard Worker return;
331*61046927SAndroid Build Coastguard Worker }
332*61046927SAndroid Build Coastguard Worker
333*61046927SAndroid Build Coastguard Worker if (ustride < k) {
334*61046927SAndroid Build Coastguard Worker _mesa_error( ctx, GL_INVALID_VALUE, "glMap1(stride)" );
335*61046927SAndroid Build Coastguard Worker return;
336*61046927SAndroid Build Coastguard Worker }
337*61046927SAndroid Build Coastguard Worker
338*61046927SAndroid Build Coastguard Worker if (ctx->Texture.CurrentUnit != 0) {
339*61046927SAndroid Build Coastguard Worker /* See OpenGL 1.2.1 spec, section F.2.13 */
340*61046927SAndroid Build Coastguard Worker _mesa_error( ctx, GL_INVALID_OPERATION, "glMap2(ACTIVE_TEXTURE != 0)" );
341*61046927SAndroid Build Coastguard Worker return;
342*61046927SAndroid Build Coastguard Worker }
343*61046927SAndroid Build Coastguard Worker
344*61046927SAndroid Build Coastguard Worker map = get_1d_map(ctx, target);
345*61046927SAndroid Build Coastguard Worker if (!map) {
346*61046927SAndroid Build Coastguard Worker _mesa_error( ctx, GL_INVALID_ENUM, "glMap1(target)" );
347*61046927SAndroid Build Coastguard Worker return;
348*61046927SAndroid Build Coastguard Worker }
349*61046927SAndroid Build Coastguard Worker
350*61046927SAndroid Build Coastguard Worker /* make copy of the control points */
351*61046927SAndroid Build Coastguard Worker if (type == GL_FLOAT)
352*61046927SAndroid Build Coastguard Worker pnts = _mesa_copy_map_points1f(target, ustride, uorder, (GLfloat*) points);
353*61046927SAndroid Build Coastguard Worker else
354*61046927SAndroid Build Coastguard Worker pnts = _mesa_copy_map_points1d(target, ustride, uorder, (GLdouble*) points);
355*61046927SAndroid Build Coastguard Worker
356*61046927SAndroid Build Coastguard Worker
357*61046927SAndroid Build Coastguard Worker FLUSH_VERTICES(ctx, 0, GL_EVAL_BIT);
358*61046927SAndroid Build Coastguard Worker vbo_exec_update_eval_maps(ctx);
359*61046927SAndroid Build Coastguard Worker map->Order = uorder;
360*61046927SAndroid Build Coastguard Worker map->u1 = u1;
361*61046927SAndroid Build Coastguard Worker map->u2 = u2;
362*61046927SAndroid Build Coastguard Worker map->du = 1.0F / (u2 - u1);
363*61046927SAndroid Build Coastguard Worker free(map->Points);
364*61046927SAndroid Build Coastguard Worker map->Points = pnts;
365*61046927SAndroid Build Coastguard Worker }
366*61046927SAndroid Build Coastguard Worker
367*61046927SAndroid Build Coastguard Worker
368*61046927SAndroid Build Coastguard Worker
369*61046927SAndroid Build Coastguard Worker void GLAPIENTRY
_mesa_Map1f(GLenum target,GLfloat u1,GLfloat u2,GLint stride,GLint order,const GLfloat * points)370*61046927SAndroid Build Coastguard Worker _mesa_Map1f( GLenum target, GLfloat u1, GLfloat u2, GLint stride,
371*61046927SAndroid Build Coastguard Worker GLint order, const GLfloat *points )
372*61046927SAndroid Build Coastguard Worker {
373*61046927SAndroid Build Coastguard Worker map1(target, u1, u2, stride, order, points, GL_FLOAT);
374*61046927SAndroid Build Coastguard Worker }
375*61046927SAndroid Build Coastguard Worker
376*61046927SAndroid Build Coastguard Worker
377*61046927SAndroid Build Coastguard Worker void GLAPIENTRY
_mesa_Map1d(GLenum target,GLdouble u1,GLdouble u2,GLint stride,GLint order,const GLdouble * points)378*61046927SAndroid Build Coastguard Worker _mesa_Map1d( GLenum target, GLdouble u1, GLdouble u2, GLint stride,
379*61046927SAndroid Build Coastguard Worker GLint order, const GLdouble *points )
380*61046927SAndroid Build Coastguard Worker {
381*61046927SAndroid Build Coastguard Worker map1(target, (GLfloat) u1, (GLfloat) u2, stride, order, points, GL_DOUBLE);
382*61046927SAndroid Build Coastguard Worker }
383*61046927SAndroid Build Coastguard Worker
384*61046927SAndroid Build Coastguard Worker
385*61046927SAndroid Build Coastguard Worker static void
map2(GLenum target,GLfloat u1,GLfloat u2,GLint ustride,GLint uorder,GLfloat v1,GLfloat v2,GLint vstride,GLint vorder,const GLvoid * points,GLenum type)386*61046927SAndroid Build Coastguard Worker map2( GLenum target, GLfloat u1, GLfloat u2, GLint ustride, GLint uorder,
387*61046927SAndroid Build Coastguard Worker GLfloat v1, GLfloat v2, GLint vstride, GLint vorder,
388*61046927SAndroid Build Coastguard Worker const GLvoid *points, GLenum type )
389*61046927SAndroid Build Coastguard Worker {
390*61046927SAndroid Build Coastguard Worker GET_CURRENT_CONTEXT(ctx);
391*61046927SAndroid Build Coastguard Worker GLint k;
392*61046927SAndroid Build Coastguard Worker GLfloat *pnts;
393*61046927SAndroid Build Coastguard Worker struct gl_2d_map *map = NULL;
394*61046927SAndroid Build Coastguard Worker
395*61046927SAndroid Build Coastguard Worker assert(type == GL_FLOAT || type == GL_DOUBLE);
396*61046927SAndroid Build Coastguard Worker
397*61046927SAndroid Build Coastguard Worker if (u1==u2) {
398*61046927SAndroid Build Coastguard Worker _mesa_error( ctx, GL_INVALID_VALUE, "glMap2(u1,u2)" );
399*61046927SAndroid Build Coastguard Worker return;
400*61046927SAndroid Build Coastguard Worker }
401*61046927SAndroid Build Coastguard Worker
402*61046927SAndroid Build Coastguard Worker if (v1==v2) {
403*61046927SAndroid Build Coastguard Worker _mesa_error( ctx, GL_INVALID_VALUE, "glMap2(v1,v2)" );
404*61046927SAndroid Build Coastguard Worker return;
405*61046927SAndroid Build Coastguard Worker }
406*61046927SAndroid Build Coastguard Worker
407*61046927SAndroid Build Coastguard Worker if (uorder<1 || uorder>MAX_EVAL_ORDER) {
408*61046927SAndroid Build Coastguard Worker _mesa_error( ctx, GL_INVALID_VALUE, "glMap2(uorder)" );
409*61046927SAndroid Build Coastguard Worker return;
410*61046927SAndroid Build Coastguard Worker }
411*61046927SAndroid Build Coastguard Worker
412*61046927SAndroid Build Coastguard Worker if (vorder<1 || vorder>MAX_EVAL_ORDER) {
413*61046927SAndroid Build Coastguard Worker _mesa_error( ctx, GL_INVALID_VALUE, "glMap2(vorder)" );
414*61046927SAndroid Build Coastguard Worker return;
415*61046927SAndroid Build Coastguard Worker }
416*61046927SAndroid Build Coastguard Worker
417*61046927SAndroid Build Coastguard Worker k = _mesa_evaluator_components( target );
418*61046927SAndroid Build Coastguard Worker if (k==0) {
419*61046927SAndroid Build Coastguard Worker _mesa_error( ctx, GL_INVALID_ENUM, "glMap2(target)" );
420*61046927SAndroid Build Coastguard Worker return;
421*61046927SAndroid Build Coastguard Worker }
422*61046927SAndroid Build Coastguard Worker
423*61046927SAndroid Build Coastguard Worker if (ustride < k) {
424*61046927SAndroid Build Coastguard Worker _mesa_error( ctx, GL_INVALID_VALUE, "glMap2(ustride)" );
425*61046927SAndroid Build Coastguard Worker return;
426*61046927SAndroid Build Coastguard Worker }
427*61046927SAndroid Build Coastguard Worker if (vstride < k) {
428*61046927SAndroid Build Coastguard Worker _mesa_error( ctx, GL_INVALID_VALUE, "glMap2(vstride)" );
429*61046927SAndroid Build Coastguard Worker return;
430*61046927SAndroid Build Coastguard Worker }
431*61046927SAndroid Build Coastguard Worker
432*61046927SAndroid Build Coastguard Worker if (ctx->Texture.CurrentUnit != 0) {
433*61046927SAndroid Build Coastguard Worker /* See OpenGL 1.2.1 spec, section F.2.13 */
434*61046927SAndroid Build Coastguard Worker _mesa_error( ctx, GL_INVALID_OPERATION, "glMap2(ACTIVE_TEXTURE != 0)" );
435*61046927SAndroid Build Coastguard Worker return;
436*61046927SAndroid Build Coastguard Worker }
437*61046927SAndroid Build Coastguard Worker
438*61046927SAndroid Build Coastguard Worker map = get_2d_map(ctx, target);
439*61046927SAndroid Build Coastguard Worker if (!map) {
440*61046927SAndroid Build Coastguard Worker _mesa_error( ctx, GL_INVALID_ENUM, "glMap2(target)" );
441*61046927SAndroid Build Coastguard Worker return;
442*61046927SAndroid Build Coastguard Worker }
443*61046927SAndroid Build Coastguard Worker
444*61046927SAndroid Build Coastguard Worker /* make copy of the control points */
445*61046927SAndroid Build Coastguard Worker if (type == GL_FLOAT)
446*61046927SAndroid Build Coastguard Worker pnts = _mesa_copy_map_points2f(target, ustride, uorder,
447*61046927SAndroid Build Coastguard Worker vstride, vorder, (GLfloat*) points);
448*61046927SAndroid Build Coastguard Worker else
449*61046927SAndroid Build Coastguard Worker pnts = _mesa_copy_map_points2d(target, ustride, uorder,
450*61046927SAndroid Build Coastguard Worker vstride, vorder, (GLdouble*) points);
451*61046927SAndroid Build Coastguard Worker
452*61046927SAndroid Build Coastguard Worker
453*61046927SAndroid Build Coastguard Worker FLUSH_VERTICES(ctx, 0, GL_EVAL_BIT);
454*61046927SAndroid Build Coastguard Worker vbo_exec_update_eval_maps(ctx);
455*61046927SAndroid Build Coastguard Worker map->Uorder = uorder;
456*61046927SAndroid Build Coastguard Worker map->u1 = u1;
457*61046927SAndroid Build Coastguard Worker map->u2 = u2;
458*61046927SAndroid Build Coastguard Worker map->du = 1.0F / (u2 - u1);
459*61046927SAndroid Build Coastguard Worker map->Vorder = vorder;
460*61046927SAndroid Build Coastguard Worker map->v1 = v1;
461*61046927SAndroid Build Coastguard Worker map->v2 = v2;
462*61046927SAndroid Build Coastguard Worker map->dv = 1.0F / (v2 - v1);
463*61046927SAndroid Build Coastguard Worker free(map->Points);
464*61046927SAndroid Build Coastguard Worker map->Points = pnts;
465*61046927SAndroid Build Coastguard Worker }
466*61046927SAndroid Build Coastguard Worker
467*61046927SAndroid Build Coastguard Worker
468*61046927SAndroid Build Coastguard Worker void GLAPIENTRY
_mesa_Map2f(GLenum target,GLfloat u1,GLfloat u2,GLint ustride,GLint uorder,GLfloat v1,GLfloat v2,GLint vstride,GLint vorder,const GLfloat * points)469*61046927SAndroid Build Coastguard Worker _mesa_Map2f( GLenum target,
470*61046927SAndroid Build Coastguard Worker GLfloat u1, GLfloat u2, GLint ustride, GLint uorder,
471*61046927SAndroid Build Coastguard Worker GLfloat v1, GLfloat v2, GLint vstride, GLint vorder,
472*61046927SAndroid Build Coastguard Worker const GLfloat *points)
473*61046927SAndroid Build Coastguard Worker {
474*61046927SAndroid Build Coastguard Worker map2(target, u1, u2, ustride, uorder, v1, v2, vstride, vorder,
475*61046927SAndroid Build Coastguard Worker points, GL_FLOAT);
476*61046927SAndroid Build Coastguard Worker }
477*61046927SAndroid Build Coastguard Worker
478*61046927SAndroid Build Coastguard Worker
479*61046927SAndroid Build Coastguard Worker void GLAPIENTRY
_mesa_Map2d(GLenum target,GLdouble u1,GLdouble u2,GLint ustride,GLint uorder,GLdouble v1,GLdouble v2,GLint vstride,GLint vorder,const GLdouble * points)480*61046927SAndroid Build Coastguard Worker _mesa_Map2d( GLenum target,
481*61046927SAndroid Build Coastguard Worker GLdouble u1, GLdouble u2, GLint ustride, GLint uorder,
482*61046927SAndroid Build Coastguard Worker GLdouble v1, GLdouble v2, GLint vstride, GLint vorder,
483*61046927SAndroid Build Coastguard Worker const GLdouble *points )
484*61046927SAndroid Build Coastguard Worker {
485*61046927SAndroid Build Coastguard Worker map2(target, (GLfloat) u1, (GLfloat) u2, ustride, uorder,
486*61046927SAndroid Build Coastguard Worker (GLfloat) v1, (GLfloat) v2, vstride, vorder, points, GL_DOUBLE);
487*61046927SAndroid Build Coastguard Worker }
488*61046927SAndroid Build Coastguard Worker
489*61046927SAndroid Build Coastguard Worker
490*61046927SAndroid Build Coastguard Worker
491*61046927SAndroid Build Coastguard Worker void GLAPIENTRY
_mesa_GetnMapdvARB(GLenum target,GLenum query,GLsizei bufSize,GLdouble * v)492*61046927SAndroid Build Coastguard Worker _mesa_GetnMapdvARB( GLenum target, GLenum query, GLsizei bufSize, GLdouble *v )
493*61046927SAndroid Build Coastguard Worker {
494*61046927SAndroid Build Coastguard Worker GET_CURRENT_CONTEXT(ctx);
495*61046927SAndroid Build Coastguard Worker struct gl_1d_map *map1d;
496*61046927SAndroid Build Coastguard Worker struct gl_2d_map *map2d;
497*61046927SAndroid Build Coastguard Worker GLint i, n;
498*61046927SAndroid Build Coastguard Worker GLfloat *data;
499*61046927SAndroid Build Coastguard Worker GLuint comps;
500*61046927SAndroid Build Coastguard Worker GLsizei numBytes;
501*61046927SAndroid Build Coastguard Worker
502*61046927SAndroid Build Coastguard Worker comps = _mesa_evaluator_components(target);
503*61046927SAndroid Build Coastguard Worker if (!comps) {
504*61046927SAndroid Build Coastguard Worker _mesa_error( ctx, GL_INVALID_ENUM, "glGetMapdv(target)" );
505*61046927SAndroid Build Coastguard Worker return;
506*61046927SAndroid Build Coastguard Worker }
507*61046927SAndroid Build Coastguard Worker
508*61046927SAndroid Build Coastguard Worker map1d = get_1d_map(ctx, target);
509*61046927SAndroid Build Coastguard Worker map2d = get_2d_map(ctx, target);
510*61046927SAndroid Build Coastguard Worker assert(map1d || map2d);
511*61046927SAndroid Build Coastguard Worker
512*61046927SAndroid Build Coastguard Worker switch (query) {
513*61046927SAndroid Build Coastguard Worker case GL_COEFF:
514*61046927SAndroid Build Coastguard Worker if (map1d) {
515*61046927SAndroid Build Coastguard Worker data = map1d->Points;
516*61046927SAndroid Build Coastguard Worker n = map1d->Order * comps;
517*61046927SAndroid Build Coastguard Worker }
518*61046927SAndroid Build Coastguard Worker else {
519*61046927SAndroid Build Coastguard Worker data = map2d->Points;
520*61046927SAndroid Build Coastguard Worker n = map2d->Uorder * map2d->Vorder * comps;
521*61046927SAndroid Build Coastguard Worker }
522*61046927SAndroid Build Coastguard Worker if (data) {
523*61046927SAndroid Build Coastguard Worker numBytes = n * sizeof *v;
524*61046927SAndroid Build Coastguard Worker if (bufSize < numBytes)
525*61046927SAndroid Build Coastguard Worker goto overflow;
526*61046927SAndroid Build Coastguard Worker for (i=0;i<n;i++) {
527*61046927SAndroid Build Coastguard Worker v[i] = data[i];
528*61046927SAndroid Build Coastguard Worker }
529*61046927SAndroid Build Coastguard Worker }
530*61046927SAndroid Build Coastguard Worker break;
531*61046927SAndroid Build Coastguard Worker case GL_ORDER:
532*61046927SAndroid Build Coastguard Worker if (map1d) {
533*61046927SAndroid Build Coastguard Worker numBytes = 1 * sizeof *v;
534*61046927SAndroid Build Coastguard Worker if (bufSize < numBytes)
535*61046927SAndroid Build Coastguard Worker goto overflow;
536*61046927SAndroid Build Coastguard Worker v[0] = (GLdouble) map1d->Order;
537*61046927SAndroid Build Coastguard Worker }
538*61046927SAndroid Build Coastguard Worker else {
539*61046927SAndroid Build Coastguard Worker numBytes = 2 * sizeof *v;
540*61046927SAndroid Build Coastguard Worker if (bufSize < numBytes)
541*61046927SAndroid Build Coastguard Worker goto overflow;
542*61046927SAndroid Build Coastguard Worker v[0] = (GLdouble) map2d->Uorder;
543*61046927SAndroid Build Coastguard Worker v[1] = (GLdouble) map2d->Vorder;
544*61046927SAndroid Build Coastguard Worker }
545*61046927SAndroid Build Coastguard Worker break;
546*61046927SAndroid Build Coastguard Worker case GL_DOMAIN:
547*61046927SAndroid Build Coastguard Worker if (map1d) {
548*61046927SAndroid Build Coastguard Worker numBytes = 2 * sizeof *v;
549*61046927SAndroid Build Coastguard Worker if (bufSize < numBytes)
550*61046927SAndroid Build Coastguard Worker goto overflow;
551*61046927SAndroid Build Coastguard Worker v[0] = (GLdouble) map1d->u1;
552*61046927SAndroid Build Coastguard Worker v[1] = (GLdouble) map1d->u2;
553*61046927SAndroid Build Coastguard Worker }
554*61046927SAndroid Build Coastguard Worker else {
555*61046927SAndroid Build Coastguard Worker numBytes = 4 * sizeof *v;
556*61046927SAndroid Build Coastguard Worker if (bufSize < numBytes)
557*61046927SAndroid Build Coastguard Worker goto overflow;
558*61046927SAndroid Build Coastguard Worker v[0] = (GLdouble) map2d->u1;
559*61046927SAndroid Build Coastguard Worker v[1] = (GLdouble) map2d->u2;
560*61046927SAndroid Build Coastguard Worker v[2] = (GLdouble) map2d->v1;
561*61046927SAndroid Build Coastguard Worker v[3] = (GLdouble) map2d->v2;
562*61046927SAndroid Build Coastguard Worker }
563*61046927SAndroid Build Coastguard Worker break;
564*61046927SAndroid Build Coastguard Worker default:
565*61046927SAndroid Build Coastguard Worker _mesa_error( ctx, GL_INVALID_ENUM, "glGetMapdv(query)" );
566*61046927SAndroid Build Coastguard Worker }
567*61046927SAndroid Build Coastguard Worker return;
568*61046927SAndroid Build Coastguard Worker
569*61046927SAndroid Build Coastguard Worker overflow:
570*61046927SAndroid Build Coastguard Worker _mesa_error( ctx, GL_INVALID_OPERATION,
571*61046927SAndroid Build Coastguard Worker "glGetnMapdvARB(out of bounds: bufSize is %d,"
572*61046927SAndroid Build Coastguard Worker " but %d bytes are required)", bufSize, numBytes );
573*61046927SAndroid Build Coastguard Worker }
574*61046927SAndroid Build Coastguard Worker
575*61046927SAndroid Build Coastguard Worker void GLAPIENTRY
_mesa_GetMapdv(GLenum target,GLenum query,GLdouble * v)576*61046927SAndroid Build Coastguard Worker _mesa_GetMapdv( GLenum target, GLenum query, GLdouble *v )
577*61046927SAndroid Build Coastguard Worker {
578*61046927SAndroid Build Coastguard Worker _mesa_GetnMapdvARB(target, query, INT_MAX, v);
579*61046927SAndroid Build Coastguard Worker }
580*61046927SAndroid Build Coastguard Worker
581*61046927SAndroid Build Coastguard Worker void GLAPIENTRY
_mesa_GetnMapfvARB(GLenum target,GLenum query,GLsizei bufSize,GLfloat * v)582*61046927SAndroid Build Coastguard Worker _mesa_GetnMapfvARB( GLenum target, GLenum query, GLsizei bufSize, GLfloat *v )
583*61046927SAndroid Build Coastguard Worker {
584*61046927SAndroid Build Coastguard Worker GET_CURRENT_CONTEXT(ctx);
585*61046927SAndroid Build Coastguard Worker struct gl_1d_map *map1d;
586*61046927SAndroid Build Coastguard Worker struct gl_2d_map *map2d;
587*61046927SAndroid Build Coastguard Worker GLint i, n;
588*61046927SAndroid Build Coastguard Worker GLfloat *data;
589*61046927SAndroid Build Coastguard Worker GLuint comps;
590*61046927SAndroid Build Coastguard Worker GLsizei numBytes;
591*61046927SAndroid Build Coastguard Worker
592*61046927SAndroid Build Coastguard Worker comps = _mesa_evaluator_components(target);
593*61046927SAndroid Build Coastguard Worker if (!comps) {
594*61046927SAndroid Build Coastguard Worker _mesa_error( ctx, GL_INVALID_ENUM, "glGetMapfv(target)" );
595*61046927SAndroid Build Coastguard Worker return;
596*61046927SAndroid Build Coastguard Worker }
597*61046927SAndroid Build Coastguard Worker
598*61046927SAndroid Build Coastguard Worker map1d = get_1d_map(ctx, target);
599*61046927SAndroid Build Coastguard Worker map2d = get_2d_map(ctx, target);
600*61046927SAndroid Build Coastguard Worker assert(map1d || map2d);
601*61046927SAndroid Build Coastguard Worker
602*61046927SAndroid Build Coastguard Worker switch (query) {
603*61046927SAndroid Build Coastguard Worker case GL_COEFF:
604*61046927SAndroid Build Coastguard Worker if (map1d) {
605*61046927SAndroid Build Coastguard Worker data = map1d->Points;
606*61046927SAndroid Build Coastguard Worker n = map1d->Order * comps;
607*61046927SAndroid Build Coastguard Worker }
608*61046927SAndroid Build Coastguard Worker else {
609*61046927SAndroid Build Coastguard Worker data = map2d->Points;
610*61046927SAndroid Build Coastguard Worker n = map2d->Uorder * map2d->Vorder * comps;
611*61046927SAndroid Build Coastguard Worker }
612*61046927SAndroid Build Coastguard Worker if (data) {
613*61046927SAndroid Build Coastguard Worker numBytes = n * sizeof *v;
614*61046927SAndroid Build Coastguard Worker if (bufSize < numBytes)
615*61046927SAndroid Build Coastguard Worker goto overflow;
616*61046927SAndroid Build Coastguard Worker for (i=0;i<n;i++) {
617*61046927SAndroid Build Coastguard Worker v[i] = data[i];
618*61046927SAndroid Build Coastguard Worker }
619*61046927SAndroid Build Coastguard Worker }
620*61046927SAndroid Build Coastguard Worker break;
621*61046927SAndroid Build Coastguard Worker case GL_ORDER:
622*61046927SAndroid Build Coastguard Worker if (map1d) {
623*61046927SAndroid Build Coastguard Worker numBytes = 1 * sizeof *v;
624*61046927SAndroid Build Coastguard Worker if (bufSize < numBytes)
625*61046927SAndroid Build Coastguard Worker goto overflow;
626*61046927SAndroid Build Coastguard Worker v[0] = (GLfloat) map1d->Order;
627*61046927SAndroid Build Coastguard Worker }
628*61046927SAndroid Build Coastguard Worker else {
629*61046927SAndroid Build Coastguard Worker numBytes = 2 * sizeof *v;
630*61046927SAndroid Build Coastguard Worker if (bufSize < numBytes)
631*61046927SAndroid Build Coastguard Worker goto overflow;
632*61046927SAndroid Build Coastguard Worker v[0] = (GLfloat) map2d->Uorder;
633*61046927SAndroid Build Coastguard Worker v[1] = (GLfloat) map2d->Vorder;
634*61046927SAndroid Build Coastguard Worker }
635*61046927SAndroid Build Coastguard Worker break;
636*61046927SAndroid Build Coastguard Worker case GL_DOMAIN:
637*61046927SAndroid Build Coastguard Worker if (map1d) {
638*61046927SAndroid Build Coastguard Worker numBytes = 2 * sizeof *v;
639*61046927SAndroid Build Coastguard Worker if (bufSize < numBytes)
640*61046927SAndroid Build Coastguard Worker goto overflow;
641*61046927SAndroid Build Coastguard Worker v[0] = map1d->u1;
642*61046927SAndroid Build Coastguard Worker v[1] = map1d->u2;
643*61046927SAndroid Build Coastguard Worker }
644*61046927SAndroid Build Coastguard Worker else {
645*61046927SAndroid Build Coastguard Worker numBytes = 4 * sizeof *v;
646*61046927SAndroid Build Coastguard Worker if (bufSize < numBytes)
647*61046927SAndroid Build Coastguard Worker goto overflow;
648*61046927SAndroid Build Coastguard Worker v[0] = map2d->u1;
649*61046927SAndroid Build Coastguard Worker v[1] = map2d->u2;
650*61046927SAndroid Build Coastguard Worker v[2] = map2d->v1;
651*61046927SAndroid Build Coastguard Worker v[3] = map2d->v2;
652*61046927SAndroid Build Coastguard Worker }
653*61046927SAndroid Build Coastguard Worker break;
654*61046927SAndroid Build Coastguard Worker default:
655*61046927SAndroid Build Coastguard Worker _mesa_error( ctx, GL_INVALID_ENUM, "glGetMapfv(query)" );
656*61046927SAndroid Build Coastguard Worker }
657*61046927SAndroid Build Coastguard Worker return;
658*61046927SAndroid Build Coastguard Worker
659*61046927SAndroid Build Coastguard Worker overflow:
660*61046927SAndroid Build Coastguard Worker _mesa_error( ctx, GL_INVALID_OPERATION,
661*61046927SAndroid Build Coastguard Worker "glGetnMapfvARB(out of bounds: bufSize is %d,"
662*61046927SAndroid Build Coastguard Worker " but %d bytes are required)", bufSize, numBytes );
663*61046927SAndroid Build Coastguard Worker }
664*61046927SAndroid Build Coastguard Worker
665*61046927SAndroid Build Coastguard Worker
666*61046927SAndroid Build Coastguard Worker void GLAPIENTRY
_mesa_GetMapfv(GLenum target,GLenum query,GLfloat * v)667*61046927SAndroid Build Coastguard Worker _mesa_GetMapfv( GLenum target, GLenum query, GLfloat *v )
668*61046927SAndroid Build Coastguard Worker {
669*61046927SAndroid Build Coastguard Worker _mesa_GetnMapfvARB(target, query, INT_MAX, v);
670*61046927SAndroid Build Coastguard Worker }
671*61046927SAndroid Build Coastguard Worker
672*61046927SAndroid Build Coastguard Worker
673*61046927SAndroid Build Coastguard Worker void GLAPIENTRY
_mesa_GetnMapivARB(GLenum target,GLenum query,GLsizei bufSize,GLint * v)674*61046927SAndroid Build Coastguard Worker _mesa_GetnMapivARB( GLenum target, GLenum query, GLsizei bufSize, GLint *v )
675*61046927SAndroid Build Coastguard Worker {
676*61046927SAndroid Build Coastguard Worker GET_CURRENT_CONTEXT(ctx);
677*61046927SAndroid Build Coastguard Worker struct gl_1d_map *map1d;
678*61046927SAndroid Build Coastguard Worker struct gl_2d_map *map2d;
679*61046927SAndroid Build Coastguard Worker GLuint i, n;
680*61046927SAndroid Build Coastguard Worker GLfloat *data;
681*61046927SAndroid Build Coastguard Worker GLuint comps;
682*61046927SAndroid Build Coastguard Worker GLsizei numBytes;
683*61046927SAndroid Build Coastguard Worker
684*61046927SAndroid Build Coastguard Worker comps = _mesa_evaluator_components(target);
685*61046927SAndroid Build Coastguard Worker if (!comps) {
686*61046927SAndroid Build Coastguard Worker _mesa_error( ctx, GL_INVALID_ENUM, "glGetMapiv(target)" );
687*61046927SAndroid Build Coastguard Worker return;
688*61046927SAndroid Build Coastguard Worker }
689*61046927SAndroid Build Coastguard Worker
690*61046927SAndroid Build Coastguard Worker map1d = get_1d_map(ctx, target);
691*61046927SAndroid Build Coastguard Worker map2d = get_2d_map(ctx, target);
692*61046927SAndroid Build Coastguard Worker assert(map1d || map2d);
693*61046927SAndroid Build Coastguard Worker
694*61046927SAndroid Build Coastguard Worker switch (query) {
695*61046927SAndroid Build Coastguard Worker case GL_COEFF:
696*61046927SAndroid Build Coastguard Worker if (map1d) {
697*61046927SAndroid Build Coastguard Worker data = map1d->Points;
698*61046927SAndroid Build Coastguard Worker n = map1d->Order * comps;
699*61046927SAndroid Build Coastguard Worker }
700*61046927SAndroid Build Coastguard Worker else {
701*61046927SAndroid Build Coastguard Worker data = map2d->Points;
702*61046927SAndroid Build Coastguard Worker n = map2d->Uorder * map2d->Vorder * comps;
703*61046927SAndroid Build Coastguard Worker }
704*61046927SAndroid Build Coastguard Worker if (data) {
705*61046927SAndroid Build Coastguard Worker numBytes = n * sizeof *v;
706*61046927SAndroid Build Coastguard Worker if (bufSize < numBytes)
707*61046927SAndroid Build Coastguard Worker goto overflow;
708*61046927SAndroid Build Coastguard Worker for (i=0;i<n;i++) {
709*61046927SAndroid Build Coastguard Worker v[i] = lroundf(data[i]);
710*61046927SAndroid Build Coastguard Worker }
711*61046927SAndroid Build Coastguard Worker }
712*61046927SAndroid Build Coastguard Worker break;
713*61046927SAndroid Build Coastguard Worker case GL_ORDER:
714*61046927SAndroid Build Coastguard Worker if (map1d) {
715*61046927SAndroid Build Coastguard Worker numBytes = 1 * sizeof *v;
716*61046927SAndroid Build Coastguard Worker if (bufSize < numBytes)
717*61046927SAndroid Build Coastguard Worker goto overflow;
718*61046927SAndroid Build Coastguard Worker v[0] = map1d->Order;
719*61046927SAndroid Build Coastguard Worker }
720*61046927SAndroid Build Coastguard Worker else {
721*61046927SAndroid Build Coastguard Worker numBytes = 2 * sizeof *v;
722*61046927SAndroid Build Coastguard Worker if (bufSize < numBytes)
723*61046927SAndroid Build Coastguard Worker goto overflow;
724*61046927SAndroid Build Coastguard Worker v[0] = map2d->Uorder;
725*61046927SAndroid Build Coastguard Worker v[1] = map2d->Vorder;
726*61046927SAndroid Build Coastguard Worker }
727*61046927SAndroid Build Coastguard Worker break;
728*61046927SAndroid Build Coastguard Worker case GL_DOMAIN:
729*61046927SAndroid Build Coastguard Worker if (map1d) {
730*61046927SAndroid Build Coastguard Worker numBytes = 2 * sizeof *v;
731*61046927SAndroid Build Coastguard Worker if (bufSize < numBytes)
732*61046927SAndroid Build Coastguard Worker goto overflow;
733*61046927SAndroid Build Coastguard Worker v[0] = lroundf(map1d->u1);
734*61046927SAndroid Build Coastguard Worker v[1] = lroundf(map1d->u2);
735*61046927SAndroid Build Coastguard Worker }
736*61046927SAndroid Build Coastguard Worker else {
737*61046927SAndroid Build Coastguard Worker numBytes = 4 * sizeof *v;
738*61046927SAndroid Build Coastguard Worker if (bufSize < numBytes)
739*61046927SAndroid Build Coastguard Worker goto overflow;
740*61046927SAndroid Build Coastguard Worker v[0] = lroundf(map2d->u1);
741*61046927SAndroid Build Coastguard Worker v[1] = lroundf(map2d->u2);
742*61046927SAndroid Build Coastguard Worker v[2] = lroundf(map2d->v1);
743*61046927SAndroid Build Coastguard Worker v[3] = lroundf(map2d->v2);
744*61046927SAndroid Build Coastguard Worker }
745*61046927SAndroid Build Coastguard Worker break;
746*61046927SAndroid Build Coastguard Worker default:
747*61046927SAndroid Build Coastguard Worker _mesa_error( ctx, GL_INVALID_ENUM, "glGetMapiv(query)" );
748*61046927SAndroid Build Coastguard Worker }
749*61046927SAndroid Build Coastguard Worker return;
750*61046927SAndroid Build Coastguard Worker
751*61046927SAndroid Build Coastguard Worker overflow:
752*61046927SAndroid Build Coastguard Worker _mesa_error( ctx, GL_INVALID_OPERATION,
753*61046927SAndroid Build Coastguard Worker "glGetnMapivARB(out of bounds: bufSize is %d,"
754*61046927SAndroid Build Coastguard Worker " but %d bytes are required)", bufSize, numBytes );
755*61046927SAndroid Build Coastguard Worker }
756*61046927SAndroid Build Coastguard Worker
757*61046927SAndroid Build Coastguard Worker
758*61046927SAndroid Build Coastguard Worker void GLAPIENTRY
_mesa_GetMapiv(GLenum target,GLenum query,GLint * v)759*61046927SAndroid Build Coastguard Worker _mesa_GetMapiv( GLenum target, GLenum query, GLint *v )
760*61046927SAndroid Build Coastguard Worker {
761*61046927SAndroid Build Coastguard Worker _mesa_GetnMapivARB(target, query, INT_MAX, v);
762*61046927SAndroid Build Coastguard Worker }
763*61046927SAndroid Build Coastguard Worker
764*61046927SAndroid Build Coastguard Worker
765*61046927SAndroid Build Coastguard Worker void GLAPIENTRY
_mesa_MapGrid1f(GLint un,GLfloat u1,GLfloat u2)766*61046927SAndroid Build Coastguard Worker _mesa_MapGrid1f( GLint un, GLfloat u1, GLfloat u2 )
767*61046927SAndroid Build Coastguard Worker {
768*61046927SAndroid Build Coastguard Worker GET_CURRENT_CONTEXT(ctx);
769*61046927SAndroid Build Coastguard Worker
770*61046927SAndroid Build Coastguard Worker if (un<1) {
771*61046927SAndroid Build Coastguard Worker _mesa_error( ctx, GL_INVALID_VALUE, "glMapGrid1f" );
772*61046927SAndroid Build Coastguard Worker return;
773*61046927SAndroid Build Coastguard Worker }
774*61046927SAndroid Build Coastguard Worker FLUSH_VERTICES(ctx, 0, GL_EVAL_BIT);
775*61046927SAndroid Build Coastguard Worker vbo_exec_update_eval_maps(ctx);
776*61046927SAndroid Build Coastguard Worker ctx->Eval.MapGrid1un = un;
777*61046927SAndroid Build Coastguard Worker ctx->Eval.MapGrid1u1 = u1;
778*61046927SAndroid Build Coastguard Worker ctx->Eval.MapGrid1u2 = u2;
779*61046927SAndroid Build Coastguard Worker ctx->Eval.MapGrid1du = (u2 - u1) / (GLfloat) un;
780*61046927SAndroid Build Coastguard Worker }
781*61046927SAndroid Build Coastguard Worker
782*61046927SAndroid Build Coastguard Worker
783*61046927SAndroid Build Coastguard Worker void GLAPIENTRY
_mesa_MapGrid1d(GLint un,GLdouble u1,GLdouble u2)784*61046927SAndroid Build Coastguard Worker _mesa_MapGrid1d( GLint un, GLdouble u1, GLdouble u2 )
785*61046927SAndroid Build Coastguard Worker {
786*61046927SAndroid Build Coastguard Worker _mesa_MapGrid1f( un, (GLfloat) u1, (GLfloat) u2 );
787*61046927SAndroid Build Coastguard Worker }
788*61046927SAndroid Build Coastguard Worker
789*61046927SAndroid Build Coastguard Worker
790*61046927SAndroid Build Coastguard Worker void GLAPIENTRY
_mesa_MapGrid2f(GLint un,GLfloat u1,GLfloat u2,GLint vn,GLfloat v1,GLfloat v2)791*61046927SAndroid Build Coastguard Worker _mesa_MapGrid2f( GLint un, GLfloat u1, GLfloat u2,
792*61046927SAndroid Build Coastguard Worker GLint vn, GLfloat v1, GLfloat v2 )
793*61046927SAndroid Build Coastguard Worker {
794*61046927SAndroid Build Coastguard Worker GET_CURRENT_CONTEXT(ctx);
795*61046927SAndroid Build Coastguard Worker
796*61046927SAndroid Build Coastguard Worker if (un<1) {
797*61046927SAndroid Build Coastguard Worker _mesa_error( ctx, GL_INVALID_VALUE, "glMapGrid2f(un)" );
798*61046927SAndroid Build Coastguard Worker return;
799*61046927SAndroid Build Coastguard Worker }
800*61046927SAndroid Build Coastguard Worker if (vn<1) {
801*61046927SAndroid Build Coastguard Worker _mesa_error( ctx, GL_INVALID_VALUE, "glMapGrid2f(vn)" );
802*61046927SAndroid Build Coastguard Worker return;
803*61046927SAndroid Build Coastguard Worker }
804*61046927SAndroid Build Coastguard Worker
805*61046927SAndroid Build Coastguard Worker FLUSH_VERTICES(ctx, 0, GL_EVAL_BIT);
806*61046927SAndroid Build Coastguard Worker vbo_exec_update_eval_maps(ctx);
807*61046927SAndroid Build Coastguard Worker ctx->Eval.MapGrid2un = un;
808*61046927SAndroid Build Coastguard Worker ctx->Eval.MapGrid2u1 = u1;
809*61046927SAndroid Build Coastguard Worker ctx->Eval.MapGrid2u2 = u2;
810*61046927SAndroid Build Coastguard Worker ctx->Eval.MapGrid2du = (u2 - u1) / (GLfloat) un;
811*61046927SAndroid Build Coastguard Worker ctx->Eval.MapGrid2vn = vn;
812*61046927SAndroid Build Coastguard Worker ctx->Eval.MapGrid2v1 = v1;
813*61046927SAndroid Build Coastguard Worker ctx->Eval.MapGrid2v2 = v2;
814*61046927SAndroid Build Coastguard Worker ctx->Eval.MapGrid2dv = (v2 - v1) / (GLfloat) vn;
815*61046927SAndroid Build Coastguard Worker }
816*61046927SAndroid Build Coastguard Worker
817*61046927SAndroid Build Coastguard Worker
818*61046927SAndroid Build Coastguard Worker void GLAPIENTRY
_mesa_MapGrid2d(GLint un,GLdouble u1,GLdouble u2,GLint vn,GLdouble v1,GLdouble v2)819*61046927SAndroid Build Coastguard Worker _mesa_MapGrid2d( GLint un, GLdouble u1, GLdouble u2,
820*61046927SAndroid Build Coastguard Worker GLint vn, GLdouble v1, GLdouble v2 )
821*61046927SAndroid Build Coastguard Worker {
822*61046927SAndroid Build Coastguard Worker _mesa_MapGrid2f( un, (GLfloat) u1, (GLfloat) u2,
823*61046927SAndroid Build Coastguard Worker vn, (GLfloat) v1, (GLfloat) v2 );
824*61046927SAndroid Build Coastguard Worker }
825*61046927SAndroid Build Coastguard Worker
826*61046927SAndroid Build Coastguard Worker
827*61046927SAndroid Build Coastguard Worker /**********************************************************************/
828*61046927SAndroid Build Coastguard Worker /***** Initialization *****/
829*61046927SAndroid Build Coastguard Worker /**********************************************************************/
830*61046927SAndroid Build Coastguard Worker
831*61046927SAndroid Build Coastguard Worker /**
832*61046927SAndroid Build Coastguard Worker * Initialize a 1-D evaluator map.
833*61046927SAndroid Build Coastguard Worker */
834*61046927SAndroid Build Coastguard Worker static void
init_1d_map(struct gl_1d_map * map,int n,const float * initial)835*61046927SAndroid Build Coastguard Worker init_1d_map( struct gl_1d_map *map, int n, const float *initial )
836*61046927SAndroid Build Coastguard Worker {
837*61046927SAndroid Build Coastguard Worker map->Order = 1;
838*61046927SAndroid Build Coastguard Worker map->u1 = 0.0;
839*61046927SAndroid Build Coastguard Worker map->u2 = 1.0;
840*61046927SAndroid Build Coastguard Worker map->Points = malloc(n * sizeof(GLfloat));
841*61046927SAndroid Build Coastguard Worker if (map->Points) {
842*61046927SAndroid Build Coastguard Worker GLint i;
843*61046927SAndroid Build Coastguard Worker for (i=0;i<n;i++)
844*61046927SAndroid Build Coastguard Worker map->Points[i] = initial[i];
845*61046927SAndroid Build Coastguard Worker }
846*61046927SAndroid Build Coastguard Worker }
847*61046927SAndroid Build Coastguard Worker
848*61046927SAndroid Build Coastguard Worker
849*61046927SAndroid Build Coastguard Worker /**
850*61046927SAndroid Build Coastguard Worker * Initialize a 2-D evaluator map
851*61046927SAndroid Build Coastguard Worker */
852*61046927SAndroid Build Coastguard Worker static void
init_2d_map(struct gl_2d_map * map,int n,const float * initial)853*61046927SAndroid Build Coastguard Worker init_2d_map( struct gl_2d_map *map, int n, const float *initial )
854*61046927SAndroid Build Coastguard Worker {
855*61046927SAndroid Build Coastguard Worker map->Uorder = 1;
856*61046927SAndroid Build Coastguard Worker map->Vorder = 1;
857*61046927SAndroid Build Coastguard Worker map->u1 = 0.0;
858*61046927SAndroid Build Coastguard Worker map->u2 = 1.0;
859*61046927SAndroid Build Coastguard Worker map->v1 = 0.0;
860*61046927SAndroid Build Coastguard Worker map->v2 = 1.0;
861*61046927SAndroid Build Coastguard Worker map->Points = malloc(n * sizeof(GLfloat));
862*61046927SAndroid Build Coastguard Worker if (map->Points) {
863*61046927SAndroid Build Coastguard Worker GLint i;
864*61046927SAndroid Build Coastguard Worker for (i=0;i<n;i++)
865*61046927SAndroid Build Coastguard Worker map->Points[i] = initial[i];
866*61046927SAndroid Build Coastguard Worker }
867*61046927SAndroid Build Coastguard Worker }
868*61046927SAndroid Build Coastguard Worker
869*61046927SAndroid Build Coastguard Worker
_mesa_init_eval(struct gl_context * ctx)870*61046927SAndroid Build Coastguard Worker void _mesa_init_eval( struct gl_context *ctx )
871*61046927SAndroid Build Coastguard Worker {
872*61046927SAndroid Build Coastguard Worker /* Evaluators group */
873*61046927SAndroid Build Coastguard Worker ctx->Eval.Map1Color4 = GL_FALSE;
874*61046927SAndroid Build Coastguard Worker ctx->Eval.Map1Index = GL_FALSE;
875*61046927SAndroid Build Coastguard Worker ctx->Eval.Map1Normal = GL_FALSE;
876*61046927SAndroid Build Coastguard Worker ctx->Eval.Map1TextureCoord1 = GL_FALSE;
877*61046927SAndroid Build Coastguard Worker ctx->Eval.Map1TextureCoord2 = GL_FALSE;
878*61046927SAndroid Build Coastguard Worker ctx->Eval.Map1TextureCoord3 = GL_FALSE;
879*61046927SAndroid Build Coastguard Worker ctx->Eval.Map1TextureCoord4 = GL_FALSE;
880*61046927SAndroid Build Coastguard Worker ctx->Eval.Map1Vertex3 = GL_FALSE;
881*61046927SAndroid Build Coastguard Worker ctx->Eval.Map1Vertex4 = GL_FALSE;
882*61046927SAndroid Build Coastguard Worker ctx->Eval.Map2Color4 = GL_FALSE;
883*61046927SAndroid Build Coastguard Worker ctx->Eval.Map2Index = GL_FALSE;
884*61046927SAndroid Build Coastguard Worker ctx->Eval.Map2Normal = GL_FALSE;
885*61046927SAndroid Build Coastguard Worker ctx->Eval.Map2TextureCoord1 = GL_FALSE;
886*61046927SAndroid Build Coastguard Worker ctx->Eval.Map2TextureCoord2 = GL_FALSE;
887*61046927SAndroid Build Coastguard Worker ctx->Eval.Map2TextureCoord3 = GL_FALSE;
888*61046927SAndroid Build Coastguard Worker ctx->Eval.Map2TextureCoord4 = GL_FALSE;
889*61046927SAndroid Build Coastguard Worker ctx->Eval.Map2Vertex3 = GL_FALSE;
890*61046927SAndroid Build Coastguard Worker ctx->Eval.Map2Vertex4 = GL_FALSE;
891*61046927SAndroid Build Coastguard Worker ctx->Eval.AutoNormal = GL_FALSE;
892*61046927SAndroid Build Coastguard Worker ctx->Eval.MapGrid1un = 1;
893*61046927SAndroid Build Coastguard Worker ctx->Eval.MapGrid1u1 = 0.0;
894*61046927SAndroid Build Coastguard Worker ctx->Eval.MapGrid1u2 = 1.0;
895*61046927SAndroid Build Coastguard Worker ctx->Eval.MapGrid2un = 1;
896*61046927SAndroid Build Coastguard Worker ctx->Eval.MapGrid2vn = 1;
897*61046927SAndroid Build Coastguard Worker ctx->Eval.MapGrid2u1 = 0.0;
898*61046927SAndroid Build Coastguard Worker ctx->Eval.MapGrid2u2 = 1.0;
899*61046927SAndroid Build Coastguard Worker ctx->Eval.MapGrid2v1 = 0.0;
900*61046927SAndroid Build Coastguard Worker ctx->Eval.MapGrid2v2 = 1.0;
901*61046927SAndroid Build Coastguard Worker
902*61046927SAndroid Build Coastguard Worker /* Evaluator data */
903*61046927SAndroid Build Coastguard Worker {
904*61046927SAndroid Build Coastguard Worker static GLfloat vertex[4] = { 0.0, 0.0, 0.0, 1.0 };
905*61046927SAndroid Build Coastguard Worker static GLfloat normal[3] = { 0.0, 0.0, 1.0 };
906*61046927SAndroid Build Coastguard Worker static GLfloat index[1] = { 1.0 };
907*61046927SAndroid Build Coastguard Worker static GLfloat color[4] = { 1.0, 1.0, 1.0, 1.0 };
908*61046927SAndroid Build Coastguard Worker static GLfloat texcoord[4] = { 0.0, 0.0, 0.0, 1.0 };
909*61046927SAndroid Build Coastguard Worker
910*61046927SAndroid Build Coastguard Worker init_1d_map( &ctx->EvalMap.Map1Vertex3, 3, vertex );
911*61046927SAndroid Build Coastguard Worker init_1d_map( &ctx->EvalMap.Map1Vertex4, 4, vertex );
912*61046927SAndroid Build Coastguard Worker init_1d_map( &ctx->EvalMap.Map1Index, 1, index );
913*61046927SAndroid Build Coastguard Worker init_1d_map( &ctx->EvalMap.Map1Color4, 4, color );
914*61046927SAndroid Build Coastguard Worker init_1d_map( &ctx->EvalMap.Map1Normal, 3, normal );
915*61046927SAndroid Build Coastguard Worker init_1d_map( &ctx->EvalMap.Map1Texture1, 1, texcoord );
916*61046927SAndroid Build Coastguard Worker init_1d_map( &ctx->EvalMap.Map1Texture2, 2, texcoord );
917*61046927SAndroid Build Coastguard Worker init_1d_map( &ctx->EvalMap.Map1Texture3, 3, texcoord );
918*61046927SAndroid Build Coastguard Worker init_1d_map( &ctx->EvalMap.Map1Texture4, 4, texcoord );
919*61046927SAndroid Build Coastguard Worker
920*61046927SAndroid Build Coastguard Worker init_2d_map( &ctx->EvalMap.Map2Vertex3, 3, vertex );
921*61046927SAndroid Build Coastguard Worker init_2d_map( &ctx->EvalMap.Map2Vertex4, 4, vertex );
922*61046927SAndroid Build Coastguard Worker init_2d_map( &ctx->EvalMap.Map2Index, 1, index );
923*61046927SAndroid Build Coastguard Worker init_2d_map( &ctx->EvalMap.Map2Color4, 4, color );
924*61046927SAndroid Build Coastguard Worker init_2d_map( &ctx->EvalMap.Map2Normal, 3, normal );
925*61046927SAndroid Build Coastguard Worker init_2d_map( &ctx->EvalMap.Map2Texture1, 1, texcoord );
926*61046927SAndroid Build Coastguard Worker init_2d_map( &ctx->EvalMap.Map2Texture2, 2, texcoord );
927*61046927SAndroid Build Coastguard Worker init_2d_map( &ctx->EvalMap.Map2Texture3, 3, texcoord );
928*61046927SAndroid Build Coastguard Worker init_2d_map( &ctx->EvalMap.Map2Texture4, 4, texcoord );
929*61046927SAndroid Build Coastguard Worker }
930*61046927SAndroid Build Coastguard Worker }
931*61046927SAndroid Build Coastguard Worker
932*61046927SAndroid Build Coastguard Worker
_mesa_free_eval_data(struct gl_context * ctx)933*61046927SAndroid Build Coastguard Worker void _mesa_free_eval_data( struct gl_context *ctx )
934*61046927SAndroid Build Coastguard Worker {
935*61046927SAndroid Build Coastguard Worker /* Free evaluator data */
936*61046927SAndroid Build Coastguard Worker free(ctx->EvalMap.Map1Vertex3.Points);
937*61046927SAndroid Build Coastguard Worker free(ctx->EvalMap.Map1Vertex4.Points);
938*61046927SAndroid Build Coastguard Worker free(ctx->EvalMap.Map1Index.Points);
939*61046927SAndroid Build Coastguard Worker free(ctx->EvalMap.Map1Color4.Points);
940*61046927SAndroid Build Coastguard Worker free(ctx->EvalMap.Map1Normal.Points);
941*61046927SAndroid Build Coastguard Worker free(ctx->EvalMap.Map1Texture1.Points);
942*61046927SAndroid Build Coastguard Worker free(ctx->EvalMap.Map1Texture2.Points);
943*61046927SAndroid Build Coastguard Worker free(ctx->EvalMap.Map1Texture3.Points);
944*61046927SAndroid Build Coastguard Worker free(ctx->EvalMap.Map1Texture4.Points);
945*61046927SAndroid Build Coastguard Worker
946*61046927SAndroid Build Coastguard Worker free(ctx->EvalMap.Map2Vertex3.Points);
947*61046927SAndroid Build Coastguard Worker free(ctx->EvalMap.Map2Vertex4.Points);
948*61046927SAndroid Build Coastguard Worker free(ctx->EvalMap.Map2Index.Points);
949*61046927SAndroid Build Coastguard Worker free(ctx->EvalMap.Map2Color4.Points);
950*61046927SAndroid Build Coastguard Worker free(ctx->EvalMap.Map2Normal.Points);
951*61046927SAndroid Build Coastguard Worker free(ctx->EvalMap.Map2Texture1.Points);
952*61046927SAndroid Build Coastguard Worker free(ctx->EvalMap.Map2Texture2.Points);
953*61046927SAndroid Build Coastguard Worker free(ctx->EvalMap.Map2Texture3.Points);
954*61046927SAndroid Build Coastguard Worker free(ctx->EvalMap.Map2Texture4.Points);
955*61046927SAndroid Build Coastguard Worker }
956