eval.c revision 22144ab7552f0799bcfca506bf4ffa7f70a06649
1/* $Id: eval.c,v 1.19 2001/03/12 00:48:37 gareth Exp $ */
2
3/*
4 * Mesa 3-D graphics library
5 * Version:  3.5
6 *
7 * Copyright (C) 1999-2001  Brian Paul   All Rights Reserved.
8 *
9 * Permission is hereby granted, free of charge, to any person obtaining a
10 * copy of this software and associated documentation files (the "Software"),
11 * to deal in the Software without restriction, including without limitation
12 * the rights to use, copy, modify, merge, publish, distribute, sublicense,
13 * and/or sell copies of the Software, and to permit persons to whom the
14 * Software is furnished to do so, subject to the following conditions:
15 *
16 * The above copyright notice and this permission notice shall be included
17 * in all copies or substantial portions of the Software.
18 *
19 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
20 * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
21 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
22 * BRIAN PAUL BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN
23 * AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
24 * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
25 */
26
27
28/*
29 * eval.c was written by
30 * Bernd Barsuhn (bdbarsuh@cip.informatik.uni-erlangen.de) and
31 * Volker Weiss (vrweiss@cip.informatik.uni-erlangen.de).
32 *
33 * My original implementation of evaluators was simplistic and didn't
34 * compute surface normal vectors properly.  Bernd and Volker applied
35 * used more sophisticated methods to get better results.
36 *
37 * Thanks guys!
38 */
39
40
41#ifdef PC_HEADER
42#include "all.h"
43#else
44#include "glheader.h"
45#include "colormac.h"
46#include "context.h"
47#include "eval.h"
48#include "macros.h"
49#include "mem.h"
50#include "mmath.h"
51#include "mtypes.h"
52#endif
53
54
55/*
56 * Return the number of components per control point for any type of
57 * evaluator.  Return 0 if bad target.
58 * See table 5.1 in the OpenGL 1.2 spec.
59 */
60GLuint _mesa_evaluator_components( GLenum target )
61{
62   switch (target) {
63      case GL_MAP1_VERTEX_3:		return 3;
64      case GL_MAP1_VERTEX_4:		return 4;
65      case GL_MAP1_INDEX:		return 1;
66      case GL_MAP1_COLOR_4:		return 4;
67      case GL_MAP1_NORMAL:		return 3;
68      case GL_MAP1_TEXTURE_COORD_1:	return 1;
69      case GL_MAP1_TEXTURE_COORD_2:	return 2;
70      case GL_MAP1_TEXTURE_COORD_3:	return 3;
71      case GL_MAP1_TEXTURE_COORD_4:	return 4;
72      case GL_MAP2_VERTEX_3:		return 3;
73      case GL_MAP2_VERTEX_4:		return 4;
74      case GL_MAP2_INDEX:		return 1;
75      case GL_MAP2_COLOR_4:		return 4;
76      case GL_MAP2_NORMAL:		return 3;
77      case GL_MAP2_TEXTURE_COORD_1:	return 1;
78      case GL_MAP2_TEXTURE_COORD_2:	return 2;
79      case GL_MAP2_TEXTURE_COORD_3:	return 3;
80      case GL_MAP2_TEXTURE_COORD_4:	return 4;
81      default:				return 0;
82   }
83}
84
85
86/**********************************************************************/
87/***            Copy and deallocate control points                  ***/
88/**********************************************************************/
89
90
91/*
92 * Copy 1-parametric evaluator control points from user-specified
93 * memory space to a buffer of contiguous control points.
94 * Input:  see glMap1f for details
95 * Return:  pointer to buffer of contiguous control points or NULL if out
96 *          of memory.
97 */
98GLfloat *_mesa_copy_map_points1f( GLenum target, GLint ustride, GLint uorder,
99                               const GLfloat *points )
100{
101   GLfloat *buffer, *p;
102   GLint i, k, size = _mesa_evaluator_components(target);
103
104   if (!points || size==0) {
105      return NULL;
106   }
107
108   buffer = (GLfloat *) MALLOC(uorder * size * sizeof(GLfloat));
109
110   if(buffer)
111      for(i=0, p=buffer; i<uorder; i++, points+=ustride)
112	for(k=0; k<size; k++)
113	  *p++ = points[k];
114
115   return buffer;
116}
117
118
119
120/*
121 * Same as above but convert doubles to floats.
122 */
123GLfloat *_mesa_copy_map_points1d( GLenum target, GLint ustride, GLint uorder,
124                               const GLdouble *points )
125{
126   GLfloat *buffer, *p;
127   GLint i, k, size = _mesa_evaluator_components(target);
128
129   if (!points || size==0) {
130      return NULL;
131   }
132
133   buffer = (GLfloat *) MALLOC(uorder * size * sizeof(GLfloat));
134
135   if(buffer)
136      for(i=0, p=buffer; i<uorder; i++, points+=ustride)
137	for(k=0; k<size; k++)
138	  *p++ = (GLfloat) points[k];
139
140   return buffer;
141}
142
143
144
145/*
146 * Copy 2-parametric evaluator control points from user-specified
147 * memory space to a buffer of contiguous control points.
148 * Additional memory is allocated to be used by the horner and
149 * de Casteljau evaluation schemes.
150 *
151 * Input:  see glMap2f for details
152 * Return:  pointer to buffer of contiguous control points or NULL if out
153 *          of memory.
154 */
155GLfloat *_mesa_copy_map_points2f( GLenum target,
156                               GLint ustride, GLint uorder,
157                               GLint vstride, GLint vorder,
158                               const GLfloat *points )
159{
160   GLfloat *buffer, *p;
161   GLint i, j, k, size, dsize, hsize;
162   GLint uinc;
163
164   size = _mesa_evaluator_components(target);
165
166   if (!points || size==0) {
167      return NULL;
168   }
169
170   /* max(uorder, vorder) additional points are used in      */
171   /* horner evaluation and uorder*vorder additional */
172   /* values are needed for de Casteljau                     */
173   dsize = (uorder == 2 && vorder == 2)? 0 : uorder*vorder;
174   hsize = (uorder > vorder ? uorder : vorder)*size;
175
176   if(hsize>dsize)
177     buffer = (GLfloat *) MALLOC((uorder*vorder*size+hsize)*sizeof(GLfloat));
178   else
179     buffer = (GLfloat *) MALLOC((uorder*vorder*size+dsize)*sizeof(GLfloat));
180
181   /* compute the increment value for the u-loop */
182   uinc = ustride - vorder*vstride;
183
184   if (buffer)
185      for (i=0, p=buffer; i<uorder; i++, points += uinc)
186	 for (j=0; j<vorder; j++, points += vstride)
187	    for (k=0; k<size; k++)
188	       *p++ = points[k];
189
190   return buffer;
191}
192
193
194
195/*
196 * Same as above but convert doubles to floats.
197 */
198GLfloat *_mesa_copy_map_points2d(GLenum target,
199                              GLint ustride, GLint uorder,
200                              GLint vstride, GLint vorder,
201                              const GLdouble *points )
202{
203   GLfloat *buffer, *p;
204   GLint i, j, k, size, hsize, dsize;
205   GLint uinc;
206
207   size = _mesa_evaluator_components(target);
208
209   if (!points || size==0) {
210      return NULL;
211   }
212
213   /* max(uorder, vorder) additional points are used in      */
214   /* horner evaluation and uorder*vorder additional */
215   /* values are needed for de Casteljau                     */
216   dsize = (uorder == 2 && vorder == 2)? 0 : uorder*vorder;
217   hsize = (uorder > vorder ? uorder : vorder)*size;
218
219   if(hsize>dsize)
220     buffer = (GLfloat *) MALLOC((uorder*vorder*size+hsize)*sizeof(GLfloat));
221   else
222     buffer = (GLfloat *) MALLOC((uorder*vorder*size+dsize)*sizeof(GLfloat));
223
224   /* compute the increment value for the u-loop */
225   uinc = ustride - vorder*vstride;
226
227   if (buffer)
228      for (i=0, p=buffer; i<uorder; i++, points += uinc)
229	 for (j=0; j<vorder; j++, points += vstride)
230	    for (k=0; k<size; k++)
231	       *p++ = (GLfloat) points[k];
232
233   return buffer;
234}
235
236
237
238
239/**********************************************************************/
240/***                      API entry points                          ***/
241/**********************************************************************/
242
243
244/*
245 * This does the work of glMap1[fd].
246 */
247static void
248map1(GLenum target, GLfloat u1, GLfloat u2, GLint ustride,
249     GLint uorder, const GLvoid *points, GLenum type )
250{
251   GET_CURRENT_CONTEXT(ctx);
252   GLint k;
253   GLfloat *pnts;
254   struct gl_1d_map *map = 0;
255   ASSERT_OUTSIDE_BEGIN_END(ctx);
256
257   assert(type == GL_FLOAT || type == GL_DOUBLE);
258
259   if (u1 == u2) {
260      _mesa_error( ctx, GL_INVALID_VALUE, "glMap1(u1,u2)" );
261      return;
262   }
263   if (uorder < 1 || uorder > MAX_EVAL_ORDER) {
264      _mesa_error( ctx, GL_INVALID_VALUE, "glMap1(order)" );
265      return;
266   }
267   if (!points) {
268      _mesa_error( ctx, GL_INVALID_VALUE, "glMap1(points)" );
269      return;
270   }
271
272   k = _mesa_evaluator_components( target );
273   if (k == 0) {
274      _mesa_error( ctx, GL_INVALID_ENUM, "glMap1(target)" );
275   }
276
277   if (ustride < k) {
278      _mesa_error( ctx, GL_INVALID_VALUE, "glMap1(stride)" );
279      return;
280   }
281
282   switch (target) {
283      case GL_MAP1_VERTEX_3:
284         map = &ctx->EvalMap.Map1Vertex3;
285	 break;
286      case GL_MAP1_VERTEX_4:
287         map = &ctx->EvalMap.Map1Vertex4;
288	 break;
289      case GL_MAP1_INDEX:
290         map = &ctx->EvalMap.Map1Index;
291	 break;
292      case GL_MAP1_COLOR_4:
293         map = &ctx->EvalMap.Map1Color4;
294	 break;
295      case GL_MAP1_NORMAL:
296         map = &ctx->EvalMap.Map1Normal;
297	 break;
298      case GL_MAP1_TEXTURE_COORD_1:
299         map = &ctx->EvalMap.Map1Texture1;
300	 break;
301      case GL_MAP1_TEXTURE_COORD_2:
302         map = &ctx->EvalMap.Map1Texture2;
303	 break;
304      case GL_MAP1_TEXTURE_COORD_3:
305         map = &ctx->EvalMap.Map1Texture3;
306	 break;
307      case GL_MAP1_TEXTURE_COORD_4:
308         map = &ctx->EvalMap.Map1Texture4;
309	 break;
310      default:
311         _mesa_error( ctx, GL_INVALID_ENUM, "glMap1(target)" );
312	 return;
313   }
314
315   /* make copy of the control points */
316   if (type == GL_FLOAT)
317      pnts = _mesa_copy_map_points1f(target, ustride, uorder, (GLfloat*) points);
318   else
319      pnts = _mesa_copy_map_points1d(target, ustride, uorder, (GLdouble*) points);
320
321
322   FLUSH_VERTICES(ctx, _NEW_EVAL);
323   map->Order = uorder;
324   map->u1 = u1;
325   map->u2 = u2;
326   map->du = 1.0 / (u2 - u1);
327   if (map->Points)
328      FREE( map->Points );
329   map->Points = pnts;
330}
331
332
333
334void
335_mesa_Map1f( GLenum target, GLfloat u1, GLfloat u2, GLint stride,
336             GLint order, const GLfloat *points )
337{
338   map1(target, u1, u2, stride, order, points, GL_FLOAT);
339}
340
341
342void
343_mesa_Map1d( GLenum target, GLdouble u1, GLdouble u2, GLint stride,
344             GLint order, const GLdouble *points )
345{
346   map1(target, u1, u2, stride, order, points, GL_DOUBLE);
347}
348
349
350static void
351map2( GLenum target, GLfloat u1, GLfloat u2, GLint ustride, GLint uorder,
352      GLfloat v1, GLfloat v2, GLint vstride, GLint vorder,
353      const GLvoid *points, GLenum type )
354{
355   GET_CURRENT_CONTEXT(ctx);
356   GLint k;
357   GLfloat *pnts;
358   struct gl_2d_map *map = 0;
359   ASSERT_OUTSIDE_BEGIN_END(ctx);
360
361   if (u1==u2) {
362      _mesa_error( ctx, GL_INVALID_VALUE, "glMap2(u1,u2)" );
363      return;
364   }
365
366   if (v1==v2) {
367      _mesa_error( ctx, GL_INVALID_VALUE, "glMap2(v1,v2)" );
368      return;
369   }
370
371   if (uorder<1 || uorder>MAX_EVAL_ORDER) {
372      _mesa_error( ctx, GL_INVALID_VALUE, "glMap2(uorder)" );
373      return;
374   }
375
376   if (vorder<1 || vorder>MAX_EVAL_ORDER) {
377      _mesa_error( ctx, GL_INVALID_VALUE, "glMap2(vorder)" );
378      return;
379   }
380
381   k = _mesa_evaluator_components( target );
382   if (k==0) {
383      _mesa_error( ctx, GL_INVALID_ENUM, "glMap2(target)" );
384   }
385
386   if (ustride < k) {
387      _mesa_error( ctx, GL_INVALID_VALUE, "glMap2(ustride)" );
388      return;
389   }
390   if (vstride < k) {
391      _mesa_error( ctx, GL_INVALID_VALUE, "glMap2(vstride)" );
392      return;
393   }
394
395   switch (target) {
396      case GL_MAP2_VERTEX_3:
397         map = &ctx->EvalMap.Map2Vertex3;
398	 break;
399      case GL_MAP2_VERTEX_4:
400         map = &ctx->EvalMap.Map2Vertex4;
401	 break;
402      case GL_MAP2_INDEX:
403         map = &ctx->EvalMap.Map2Index;
404	 break;
405      case GL_MAP2_COLOR_4:
406         map = &ctx->EvalMap.Map2Color4;
407	 break;
408      case GL_MAP2_NORMAL:
409         map = &ctx->EvalMap.Map2Normal;
410	 break;
411      case GL_MAP2_TEXTURE_COORD_1:
412         map = &ctx->EvalMap.Map2Texture1;
413	 break;
414      case GL_MAP2_TEXTURE_COORD_2:
415         map = &ctx->EvalMap.Map2Texture2;
416	 break;
417      case GL_MAP2_TEXTURE_COORD_3:
418         map = &ctx->EvalMap.Map2Texture3;
419	 break;
420      case GL_MAP2_TEXTURE_COORD_4:
421         map = &ctx->EvalMap.Map2Texture4;
422	 break;
423      default:
424         _mesa_error( ctx, GL_INVALID_ENUM, "glMap2(target)" );
425	 return;
426   }
427
428   /* make copy of the control points */
429   if (type == GL_FLOAT)
430      pnts = _mesa_copy_map_points2f(target, ustride, uorder,
431                                  vstride, vorder, (GLfloat*) points);
432   else
433      pnts = _mesa_copy_map_points2d(target, ustride, uorder,
434                                  vstride, vorder, (GLdouble*) points);
435
436
437   FLUSH_VERTICES(ctx, _NEW_EVAL);
438   map->Uorder = uorder;
439   map->u1 = u1;
440   map->u2 = u2;
441   map->du = 1.0 / (u2 - u1);
442   map->Vorder = vorder;
443   map->v1 = v1;
444   map->v2 = v2;
445   map->dv = 1.0 / (v2 - v1);
446   if (map->Points)
447      FREE( map->Points );
448   map->Points = pnts;
449}
450
451
452void
453_mesa_Map2f( GLenum target,
454             GLfloat u1, GLfloat u2, GLint ustride, GLint uorder,
455             GLfloat v1, GLfloat v2, GLint vstride, GLint vorder,
456             const GLfloat *points)
457{
458   map2(target, u1, u2, ustride, uorder, v1, v2, vstride, vorder,
459        points, GL_FLOAT);
460}
461
462
463void
464_mesa_Map2d( GLenum target,
465             GLdouble u1, GLdouble u2, GLint ustride, GLint uorder,
466             GLdouble v1, GLdouble v2, GLint vstride, GLint vorder,
467             const GLdouble *points )
468{
469   map2(target, u1, u2, ustride, uorder, v1, v2, vstride, vorder,
470        points, GL_DOUBLE);
471}
472
473
474
475void
476_mesa_GetMapdv( GLenum target, GLenum query, GLdouble *v )
477{
478   GET_CURRENT_CONTEXT(ctx);
479   GLint i, n;
480   GLfloat *data;
481   ASSERT_OUTSIDE_BEGIN_END(ctx);
482
483   switch (query) {
484      case GL_COEFF:
485	 switch (target) {
486	    case GL_MAP1_COLOR_4:
487	       data = ctx->EvalMap.Map1Color4.Points;
488	       n = ctx->EvalMap.Map1Color4.Order * 4;
489	       break;
490	    case GL_MAP1_INDEX:
491	       data = ctx->EvalMap.Map1Index.Points;
492	       n = ctx->EvalMap.Map1Index.Order;
493	       break;
494	    case GL_MAP1_NORMAL:
495	       data = ctx->EvalMap.Map1Normal.Points;
496	       n = ctx->EvalMap.Map1Normal.Order * 3;
497	       break;
498	    case GL_MAP1_TEXTURE_COORD_1:
499	       data = ctx->EvalMap.Map1Texture1.Points;
500	       n = ctx->EvalMap.Map1Texture1.Order * 1;
501	       break;
502	    case GL_MAP1_TEXTURE_COORD_2:
503	       data = ctx->EvalMap.Map1Texture2.Points;
504	       n = ctx->EvalMap.Map1Texture2.Order * 2;
505	       break;
506	    case GL_MAP1_TEXTURE_COORD_3:
507	       data = ctx->EvalMap.Map1Texture3.Points;
508	       n = ctx->EvalMap.Map1Texture3.Order * 3;
509	       break;
510	    case GL_MAP1_TEXTURE_COORD_4:
511	       data = ctx->EvalMap.Map1Texture4.Points;
512	       n = ctx->EvalMap.Map1Texture4.Order * 4;
513	       break;
514	    case GL_MAP1_VERTEX_3:
515	       data = ctx->EvalMap.Map1Vertex3.Points;
516	       n = ctx->EvalMap.Map1Vertex3.Order * 3;
517	       break;
518	    case GL_MAP1_VERTEX_4:
519	       data = ctx->EvalMap.Map1Vertex4.Points;
520	       n = ctx->EvalMap.Map1Vertex4.Order * 4;
521	       break;
522	    case GL_MAP2_COLOR_4:
523	       data = ctx->EvalMap.Map2Color4.Points;
524	       n = ctx->EvalMap.Map2Color4.Uorder
525                 * ctx->EvalMap.Map2Color4.Vorder * 4;
526	       break;
527	    case GL_MAP2_INDEX:
528	       data = ctx->EvalMap.Map2Index.Points;
529	       n = ctx->EvalMap.Map2Index.Uorder
530                 * ctx->EvalMap.Map2Index.Vorder;
531	       break;
532	    case GL_MAP2_NORMAL:
533	       data = ctx->EvalMap.Map2Normal.Points;
534	       n = ctx->EvalMap.Map2Normal.Uorder
535                 * ctx->EvalMap.Map2Normal.Vorder * 3;
536	       break;
537	    case GL_MAP2_TEXTURE_COORD_1:
538	       data = ctx->EvalMap.Map2Texture1.Points;
539	       n = ctx->EvalMap.Map2Texture1.Uorder
540                 * ctx->EvalMap.Map2Texture1.Vorder * 1;
541	       break;
542	    case GL_MAP2_TEXTURE_COORD_2:
543	       data = ctx->EvalMap.Map2Texture2.Points;
544	       n = ctx->EvalMap.Map2Texture2.Uorder
545                 * ctx->EvalMap.Map2Texture2.Vorder * 2;
546	       break;
547	    case GL_MAP2_TEXTURE_COORD_3:
548	       data = ctx->EvalMap.Map2Texture3.Points;
549	       n = ctx->EvalMap.Map2Texture3.Uorder
550                 * ctx->EvalMap.Map2Texture3.Vorder * 3;
551	       break;
552	    case GL_MAP2_TEXTURE_COORD_4:
553	       data = ctx->EvalMap.Map2Texture4.Points;
554	       n = ctx->EvalMap.Map2Texture4.Uorder
555                 * ctx->EvalMap.Map2Texture4.Vorder * 4;
556	       break;
557	    case GL_MAP2_VERTEX_3:
558	       data = ctx->EvalMap.Map2Vertex3.Points;
559	       n = ctx->EvalMap.Map2Vertex3.Uorder
560                 * ctx->EvalMap.Map2Vertex3.Vorder * 3;
561	       break;
562	    case GL_MAP2_VERTEX_4:
563	       data = ctx->EvalMap.Map2Vertex4.Points;
564	       n = ctx->EvalMap.Map2Vertex4.Uorder
565                 * ctx->EvalMap.Map2Vertex4.Vorder * 4;
566	       break;
567	    default:
568	       _mesa_error( ctx, GL_INVALID_ENUM, "glGetMapdv(target)" );
569	       return;
570	 }
571	 if (data) {
572	    for (i=0;i<n;i++) {
573	       v[i] = data[i];
574	    }
575	 }
576         break;
577      case GL_ORDER:
578	 switch (target) {
579	    case GL_MAP1_COLOR_4:
580	       *v = ctx->EvalMap.Map1Color4.Order;
581	       break;
582	    case GL_MAP1_INDEX:
583	       *v = ctx->EvalMap.Map1Index.Order;
584	       break;
585	    case GL_MAP1_NORMAL:
586	       *v = ctx->EvalMap.Map1Normal.Order;
587	       break;
588	    case GL_MAP1_TEXTURE_COORD_1:
589	       *v = ctx->EvalMap.Map1Texture1.Order;
590	       break;
591	    case GL_MAP1_TEXTURE_COORD_2:
592	       *v = ctx->EvalMap.Map1Texture2.Order;
593	       break;
594	    case GL_MAP1_TEXTURE_COORD_3:
595	       *v = ctx->EvalMap.Map1Texture3.Order;
596	       break;
597	    case GL_MAP1_TEXTURE_COORD_4:
598	       *v = ctx->EvalMap.Map1Texture4.Order;
599	       break;
600	    case GL_MAP1_VERTEX_3:
601	       *v = ctx->EvalMap.Map1Vertex3.Order;
602	       break;
603	    case GL_MAP1_VERTEX_4:
604	       *v = ctx->EvalMap.Map1Vertex4.Order;
605	       break;
606	    case GL_MAP2_COLOR_4:
607	       v[0] = ctx->EvalMap.Map2Color4.Uorder;
608	       v[1] = ctx->EvalMap.Map2Color4.Vorder;
609	       break;
610	    case GL_MAP2_INDEX:
611	       v[0] = ctx->EvalMap.Map2Index.Uorder;
612	       v[1] = ctx->EvalMap.Map2Index.Vorder;
613	       break;
614	    case GL_MAP2_NORMAL:
615	       v[0] = ctx->EvalMap.Map2Normal.Uorder;
616	       v[1] = ctx->EvalMap.Map2Normal.Vorder;
617	       break;
618	    case GL_MAP2_TEXTURE_COORD_1:
619	       v[0] = ctx->EvalMap.Map2Texture1.Uorder;
620	       v[1] = ctx->EvalMap.Map2Texture1.Vorder;
621	       break;
622	    case GL_MAP2_TEXTURE_COORD_2:
623	       v[0] = ctx->EvalMap.Map2Texture2.Uorder;
624	       v[1] = ctx->EvalMap.Map2Texture2.Vorder;
625	       break;
626	    case GL_MAP2_TEXTURE_COORD_3:
627	       v[0] = ctx->EvalMap.Map2Texture3.Uorder;
628	       v[1] = ctx->EvalMap.Map2Texture3.Vorder;
629	       break;
630	    case GL_MAP2_TEXTURE_COORD_4:
631	       v[0] = ctx->EvalMap.Map2Texture4.Uorder;
632	       v[1] = ctx->EvalMap.Map2Texture4.Vorder;
633	       break;
634	    case GL_MAP2_VERTEX_3:
635	       v[0] = ctx->EvalMap.Map2Vertex3.Uorder;
636	       v[1] = ctx->EvalMap.Map2Vertex3.Vorder;
637	       break;
638	    case GL_MAP2_VERTEX_4:
639	       v[0] = ctx->EvalMap.Map2Vertex4.Uorder;
640	       v[1] = ctx->EvalMap.Map2Vertex4.Vorder;
641	       break;
642	    default:
643	       _mesa_error( ctx, GL_INVALID_ENUM, "glGetMapdv(target)" );
644	       return;
645	 }
646         break;
647      case GL_DOMAIN:
648	 switch (target) {
649	    case GL_MAP1_COLOR_4:
650	       v[0] = ctx->EvalMap.Map1Color4.u1;
651	       v[1] = ctx->EvalMap.Map1Color4.u2;
652	       break;
653	    case GL_MAP1_INDEX:
654	       v[0] = ctx->EvalMap.Map1Index.u1;
655	       v[1] = ctx->EvalMap.Map1Index.u2;
656	       break;
657	    case GL_MAP1_NORMAL:
658	       v[0] = ctx->EvalMap.Map1Normal.u1;
659	       v[1] = ctx->EvalMap.Map1Normal.u2;
660	       break;
661	    case GL_MAP1_TEXTURE_COORD_1:
662	       v[0] = ctx->EvalMap.Map1Texture1.u1;
663	       v[1] = ctx->EvalMap.Map1Texture1.u2;
664	       break;
665	    case GL_MAP1_TEXTURE_COORD_2:
666	       v[0] = ctx->EvalMap.Map1Texture2.u1;
667	       v[1] = ctx->EvalMap.Map1Texture2.u2;
668	       break;
669	    case GL_MAP1_TEXTURE_COORD_3:
670	       v[0] = ctx->EvalMap.Map1Texture3.u1;
671	       v[1] = ctx->EvalMap.Map1Texture3.u2;
672	       break;
673	    case GL_MAP1_TEXTURE_COORD_4:
674	       v[0] = ctx->EvalMap.Map1Texture4.u1;
675	       v[1] = ctx->EvalMap.Map1Texture4.u2;
676	       break;
677	    case GL_MAP1_VERTEX_3:
678	       v[0] = ctx->EvalMap.Map1Vertex3.u1;
679	       v[1] = ctx->EvalMap.Map1Vertex3.u2;
680	       break;
681	    case GL_MAP1_VERTEX_4:
682	       v[0] = ctx->EvalMap.Map1Vertex4.u1;
683	       v[1] = ctx->EvalMap.Map1Vertex4.u2;
684	       break;
685	    case GL_MAP2_COLOR_4:
686	       v[0] = ctx->EvalMap.Map2Color4.u1;
687	       v[1] = ctx->EvalMap.Map2Color4.u2;
688	       v[2] = ctx->EvalMap.Map2Color4.v1;
689	       v[3] = ctx->EvalMap.Map2Color4.v2;
690	       break;
691	    case GL_MAP2_INDEX:
692	       v[0] = ctx->EvalMap.Map2Index.u1;
693	       v[1] = ctx->EvalMap.Map2Index.u2;
694	       v[2] = ctx->EvalMap.Map2Index.v1;
695	       v[3] = ctx->EvalMap.Map2Index.v2;
696	       break;
697	    case GL_MAP2_NORMAL:
698	       v[0] = ctx->EvalMap.Map2Normal.u1;
699	       v[1] = ctx->EvalMap.Map2Normal.u2;
700	       v[2] = ctx->EvalMap.Map2Normal.v1;
701	       v[3] = ctx->EvalMap.Map2Normal.v2;
702	       break;
703	    case GL_MAP2_TEXTURE_COORD_1:
704	       v[0] = ctx->EvalMap.Map2Texture1.u1;
705	       v[1] = ctx->EvalMap.Map2Texture1.u2;
706	       v[2] = ctx->EvalMap.Map2Texture1.v1;
707	       v[3] = ctx->EvalMap.Map2Texture1.v2;
708	       break;
709	    case GL_MAP2_TEXTURE_COORD_2:
710	       v[0] = ctx->EvalMap.Map2Texture2.u1;
711	       v[1] = ctx->EvalMap.Map2Texture2.u2;
712	       v[2] = ctx->EvalMap.Map2Texture2.v1;
713	       v[3] = ctx->EvalMap.Map2Texture2.v2;
714	       break;
715	    case GL_MAP2_TEXTURE_COORD_3:
716	       v[0] = ctx->EvalMap.Map2Texture3.u1;
717	       v[1] = ctx->EvalMap.Map2Texture3.u2;
718	       v[2] = ctx->EvalMap.Map2Texture3.v1;
719	       v[3] = ctx->EvalMap.Map2Texture3.v2;
720	       break;
721	    case GL_MAP2_TEXTURE_COORD_4:
722	       v[0] = ctx->EvalMap.Map2Texture4.u1;
723	       v[1] = ctx->EvalMap.Map2Texture4.u2;
724	       v[2] = ctx->EvalMap.Map2Texture4.v1;
725	       v[3] = ctx->EvalMap.Map2Texture4.v2;
726	       break;
727	    case GL_MAP2_VERTEX_3:
728	       v[0] = ctx->EvalMap.Map2Vertex3.u1;
729	       v[1] = ctx->EvalMap.Map2Vertex3.u2;
730	       v[2] = ctx->EvalMap.Map2Vertex3.v1;
731	       v[3] = ctx->EvalMap.Map2Vertex3.v2;
732	       break;
733	    case GL_MAP2_VERTEX_4:
734	       v[0] = ctx->EvalMap.Map2Vertex4.u1;
735	       v[1] = ctx->EvalMap.Map2Vertex4.u2;
736	       v[2] = ctx->EvalMap.Map2Vertex4.v1;
737	       v[3] = ctx->EvalMap.Map2Vertex4.v2;
738	       break;
739	    default:
740	       _mesa_error( ctx, GL_INVALID_ENUM, "glGetMapdv(target)" );
741	 }
742         break;
743      default:
744         _mesa_error( ctx, GL_INVALID_ENUM, "glGetMapdv(query)" );
745   }
746}
747
748
749void
750_mesa_GetMapfv( GLenum target, GLenum query, GLfloat *v )
751{
752   GET_CURRENT_CONTEXT(ctx);
753   GLint i, n;
754   GLfloat *data;
755   ASSERT_OUTSIDE_BEGIN_END(ctx);
756
757   switch (query) {
758      case GL_COEFF:
759	 switch (target) {
760	    case GL_MAP1_COLOR_4:
761	       data = ctx->EvalMap.Map1Color4.Points;
762	       n = ctx->EvalMap.Map1Color4.Order * 4;
763	       break;
764	    case GL_MAP1_INDEX:
765	       data = ctx->EvalMap.Map1Index.Points;
766	       n = ctx->EvalMap.Map1Index.Order;
767	       break;
768	    case GL_MAP1_NORMAL:
769	       data = ctx->EvalMap.Map1Normal.Points;
770	       n = ctx->EvalMap.Map1Normal.Order * 3;
771	       break;
772	    case GL_MAP1_TEXTURE_COORD_1:
773	       data = ctx->EvalMap.Map1Texture1.Points;
774	       n = ctx->EvalMap.Map1Texture1.Order * 1;
775	       break;
776	    case GL_MAP1_TEXTURE_COORD_2:
777	       data = ctx->EvalMap.Map1Texture2.Points;
778	       n = ctx->EvalMap.Map1Texture2.Order * 2;
779	       break;
780	    case GL_MAP1_TEXTURE_COORD_3:
781	       data = ctx->EvalMap.Map1Texture3.Points;
782	       n = ctx->EvalMap.Map1Texture3.Order * 3;
783	       break;
784	    case GL_MAP1_TEXTURE_COORD_4:
785	       data = ctx->EvalMap.Map1Texture4.Points;
786	       n = ctx->EvalMap.Map1Texture4.Order * 4;
787	       break;
788	    case GL_MAP1_VERTEX_3:
789	       data = ctx->EvalMap.Map1Vertex3.Points;
790	       n = ctx->EvalMap.Map1Vertex3.Order * 3;
791	       break;
792	    case GL_MAP1_VERTEX_4:
793	       data = ctx->EvalMap.Map1Vertex4.Points;
794	       n = ctx->EvalMap.Map1Vertex4.Order * 4;
795	       break;
796	    case GL_MAP2_COLOR_4:
797	       data = ctx->EvalMap.Map2Color4.Points;
798	       n = ctx->EvalMap.Map2Color4.Uorder
799                 * ctx->EvalMap.Map2Color4.Vorder * 4;
800	       break;
801	    case GL_MAP2_INDEX:
802	       data = ctx->EvalMap.Map2Index.Points;
803	       n = ctx->EvalMap.Map2Index.Uorder
804                 * ctx->EvalMap.Map2Index.Vorder;
805	       break;
806	    case GL_MAP2_NORMAL:
807	       data = ctx->EvalMap.Map2Normal.Points;
808	       n = ctx->EvalMap.Map2Normal.Uorder
809                 * ctx->EvalMap.Map2Normal.Vorder * 3;
810	       break;
811	    case GL_MAP2_TEXTURE_COORD_1:
812	       data = ctx->EvalMap.Map2Texture1.Points;
813	       n = ctx->EvalMap.Map2Texture1.Uorder
814                 * ctx->EvalMap.Map2Texture1.Vorder * 1;
815	       break;
816	    case GL_MAP2_TEXTURE_COORD_2:
817	       data = ctx->EvalMap.Map2Texture2.Points;
818	       n = ctx->EvalMap.Map2Texture2.Uorder
819                 * ctx->EvalMap.Map2Texture2.Vorder * 2;
820	       break;
821	    case GL_MAP2_TEXTURE_COORD_3:
822	       data = ctx->EvalMap.Map2Texture3.Points;
823	       n = ctx->EvalMap.Map2Texture3.Uorder
824                 * ctx->EvalMap.Map2Texture3.Vorder * 3;
825	       break;
826	    case GL_MAP2_TEXTURE_COORD_4:
827	       data = ctx->EvalMap.Map2Texture4.Points;
828	       n = ctx->EvalMap.Map2Texture4.Uorder
829                 * ctx->EvalMap.Map2Texture4.Vorder * 4;
830	       break;
831	    case GL_MAP2_VERTEX_3:
832	       data = ctx->EvalMap.Map2Vertex3.Points;
833	       n = ctx->EvalMap.Map2Vertex3.Uorder
834                 * ctx->EvalMap.Map2Vertex3.Vorder * 3;
835	       break;
836	    case GL_MAP2_VERTEX_4:
837	       data = ctx->EvalMap.Map2Vertex4.Points;
838	       n = ctx->EvalMap.Map2Vertex4.Uorder
839                 * ctx->EvalMap.Map2Vertex4.Vorder * 4;
840	       break;
841	    default:
842	       _mesa_error( ctx, GL_INVALID_ENUM, "glGetMapfv(target)" );
843	       return;
844	 }
845	 if (data) {
846	    for (i=0;i<n;i++) {
847	       v[i] = data[i];
848	    }
849	 }
850         break;
851      case GL_ORDER:
852	 switch (target) {
853	    case GL_MAP1_COLOR_4:
854	       *v = ctx->EvalMap.Map1Color4.Order;
855	       break;
856	    case GL_MAP1_INDEX:
857	       *v = ctx->EvalMap.Map1Index.Order;
858	       break;
859	    case GL_MAP1_NORMAL:
860	       *v = ctx->EvalMap.Map1Normal.Order;
861	       break;
862	    case GL_MAP1_TEXTURE_COORD_1:
863	       *v = ctx->EvalMap.Map1Texture1.Order;
864	       break;
865	    case GL_MAP1_TEXTURE_COORD_2:
866	       *v = ctx->EvalMap.Map1Texture2.Order;
867	       break;
868	    case GL_MAP1_TEXTURE_COORD_3:
869	       *v = ctx->EvalMap.Map1Texture3.Order;
870	       break;
871	    case GL_MAP1_TEXTURE_COORD_4:
872	       *v = ctx->EvalMap.Map1Texture4.Order;
873	       break;
874	    case GL_MAP1_VERTEX_3:
875	       *v = ctx->EvalMap.Map1Vertex3.Order;
876	       break;
877	    case GL_MAP1_VERTEX_4:
878	       *v = ctx->EvalMap.Map1Vertex4.Order;
879	       break;
880	    case GL_MAP2_COLOR_4:
881	       v[0] = ctx->EvalMap.Map2Color4.Uorder;
882	       v[1] = ctx->EvalMap.Map2Color4.Vorder;
883	       break;
884	    case GL_MAP2_INDEX:
885	       v[0] = ctx->EvalMap.Map2Index.Uorder;
886	       v[1] = ctx->EvalMap.Map2Index.Vorder;
887	       break;
888	    case GL_MAP2_NORMAL:
889	       v[0] = ctx->EvalMap.Map2Normal.Uorder;
890	       v[1] = ctx->EvalMap.Map2Normal.Vorder;
891	       break;
892	    case GL_MAP2_TEXTURE_COORD_1:
893	       v[0] = ctx->EvalMap.Map2Texture1.Uorder;
894	       v[1] = ctx->EvalMap.Map2Texture1.Vorder;
895	       break;
896	    case GL_MAP2_TEXTURE_COORD_2:
897	       v[0] = ctx->EvalMap.Map2Texture2.Uorder;
898	       v[1] = ctx->EvalMap.Map2Texture2.Vorder;
899	       break;
900	    case GL_MAP2_TEXTURE_COORD_3:
901	       v[0] = ctx->EvalMap.Map2Texture3.Uorder;
902	       v[1] = ctx->EvalMap.Map2Texture3.Vorder;
903	       break;
904	    case GL_MAP2_TEXTURE_COORD_4:
905	       v[0] = ctx->EvalMap.Map2Texture4.Uorder;
906	       v[1] = ctx->EvalMap.Map2Texture4.Vorder;
907	       break;
908	    case GL_MAP2_VERTEX_3:
909	       v[0] = ctx->EvalMap.Map2Vertex3.Uorder;
910	       v[1] = ctx->EvalMap.Map2Vertex3.Vorder;
911	       break;
912	    case GL_MAP2_VERTEX_4:
913	       v[0] = ctx->EvalMap.Map2Vertex4.Uorder;
914	       v[1] = ctx->EvalMap.Map2Vertex4.Vorder;
915	       break;
916	    default:
917	       _mesa_error( ctx, GL_INVALID_ENUM, "glGetMapfv(target)" );
918	       return;
919	 }
920         break;
921      case GL_DOMAIN:
922	 switch (target) {
923	    case GL_MAP1_COLOR_4:
924	       v[0] = ctx->EvalMap.Map1Color4.u1;
925	       v[1] = ctx->EvalMap.Map1Color4.u2;
926	       break;
927	    case GL_MAP1_INDEX:
928	       v[0] = ctx->EvalMap.Map1Index.u1;
929	       v[1] = ctx->EvalMap.Map1Index.u2;
930	       break;
931	    case GL_MAP1_NORMAL:
932	       v[0] = ctx->EvalMap.Map1Normal.u1;
933	       v[1] = ctx->EvalMap.Map1Normal.u2;
934	       break;
935	    case GL_MAP1_TEXTURE_COORD_1:
936	       v[0] = ctx->EvalMap.Map1Texture1.u1;
937	       v[1] = ctx->EvalMap.Map1Texture1.u2;
938	       break;
939	    case GL_MAP1_TEXTURE_COORD_2:
940	       v[0] = ctx->EvalMap.Map1Texture2.u1;
941	       v[1] = ctx->EvalMap.Map1Texture2.u2;
942	       break;
943	    case GL_MAP1_TEXTURE_COORD_3:
944	       v[0] = ctx->EvalMap.Map1Texture3.u1;
945	       v[1] = ctx->EvalMap.Map1Texture3.u2;
946	       break;
947	    case GL_MAP1_TEXTURE_COORD_4:
948	       v[0] = ctx->EvalMap.Map1Texture4.u1;
949	       v[1] = ctx->EvalMap.Map1Texture4.u2;
950	       break;
951	    case GL_MAP1_VERTEX_3:
952	       v[0] = ctx->EvalMap.Map1Vertex3.u1;
953	       v[1] = ctx->EvalMap.Map1Vertex3.u2;
954	       break;
955	    case GL_MAP1_VERTEX_4:
956	       v[0] = ctx->EvalMap.Map1Vertex4.u1;
957	       v[1] = ctx->EvalMap.Map1Vertex4.u2;
958	       break;
959	    case GL_MAP2_COLOR_4:
960	       v[0] = ctx->EvalMap.Map2Color4.u1;
961	       v[1] = ctx->EvalMap.Map2Color4.u2;
962	       v[2] = ctx->EvalMap.Map2Color4.v1;
963	       v[3] = ctx->EvalMap.Map2Color4.v2;
964	       break;
965	    case GL_MAP2_INDEX:
966	       v[0] = ctx->EvalMap.Map2Index.u1;
967	       v[1] = ctx->EvalMap.Map2Index.u2;
968	       v[2] = ctx->EvalMap.Map2Index.v1;
969	       v[3] = ctx->EvalMap.Map2Index.v2;
970	       break;
971	    case GL_MAP2_NORMAL:
972	       v[0] = ctx->EvalMap.Map2Normal.u1;
973	       v[1] = ctx->EvalMap.Map2Normal.u2;
974	       v[2] = ctx->EvalMap.Map2Normal.v1;
975	       v[3] = ctx->EvalMap.Map2Normal.v2;
976	       break;
977	    case GL_MAP2_TEXTURE_COORD_1:
978	       v[0] = ctx->EvalMap.Map2Texture1.u1;
979	       v[1] = ctx->EvalMap.Map2Texture1.u2;
980	       v[2] = ctx->EvalMap.Map2Texture1.v1;
981	       v[3] = ctx->EvalMap.Map2Texture1.v2;
982	       break;
983	    case GL_MAP2_TEXTURE_COORD_2:
984	       v[0] = ctx->EvalMap.Map2Texture2.u1;
985	       v[1] = ctx->EvalMap.Map2Texture2.u2;
986	       v[2] = ctx->EvalMap.Map2Texture2.v1;
987	       v[3] = ctx->EvalMap.Map2Texture2.v2;
988	       break;
989	    case GL_MAP2_TEXTURE_COORD_3:
990	       v[0] = ctx->EvalMap.Map2Texture3.u1;
991	       v[1] = ctx->EvalMap.Map2Texture3.u2;
992	       v[2] = ctx->EvalMap.Map2Texture3.v1;
993	       v[3] = ctx->EvalMap.Map2Texture3.v2;
994	       break;
995	    case GL_MAP2_TEXTURE_COORD_4:
996	       v[0] = ctx->EvalMap.Map2Texture4.u1;
997	       v[1] = ctx->EvalMap.Map2Texture4.u2;
998	       v[2] = ctx->EvalMap.Map2Texture4.v1;
999	       v[3] = ctx->EvalMap.Map2Texture4.v2;
1000	       break;
1001	    case GL_MAP2_VERTEX_3:
1002	       v[0] = ctx->EvalMap.Map2Vertex3.u1;
1003	       v[1] = ctx->EvalMap.Map2Vertex3.u2;
1004	       v[2] = ctx->EvalMap.Map2Vertex3.v1;
1005	       v[3] = ctx->EvalMap.Map2Vertex3.v2;
1006	       break;
1007	    case GL_MAP2_VERTEX_4:
1008	       v[0] = ctx->EvalMap.Map2Vertex4.u1;
1009	       v[1] = ctx->EvalMap.Map2Vertex4.u2;
1010	       v[2] = ctx->EvalMap.Map2Vertex4.v1;
1011	       v[3] = ctx->EvalMap.Map2Vertex4.v2;
1012	       break;
1013	    default:
1014	       _mesa_error( ctx, GL_INVALID_ENUM, "glGetMapfv(target)" );
1015	 }
1016         break;
1017      default:
1018         _mesa_error( ctx, GL_INVALID_ENUM, "glGetMapfv(query)" );
1019   }
1020}
1021
1022
1023void
1024_mesa_GetMapiv( GLenum target, GLenum query, GLint *v )
1025{
1026   GET_CURRENT_CONTEXT(ctx);
1027   GLuint i, n;
1028   GLfloat *data;
1029   ASSERT_OUTSIDE_BEGIN_END(ctx);
1030
1031   switch (query) {
1032      case GL_COEFF:
1033	 switch (target) {
1034	    case GL_MAP1_COLOR_4:
1035	       data = ctx->EvalMap.Map1Color4.Points;
1036	       n = ctx->EvalMap.Map1Color4.Order * 4;
1037	       break;
1038	    case GL_MAP1_INDEX:
1039	       data = ctx->EvalMap.Map1Index.Points;
1040	       n = ctx->EvalMap.Map1Index.Order;
1041	       break;
1042	    case GL_MAP1_NORMAL:
1043	       data = ctx->EvalMap.Map1Normal.Points;
1044	       n = ctx->EvalMap.Map1Normal.Order * 3;
1045	       break;
1046	    case GL_MAP1_TEXTURE_COORD_1:
1047	       data = ctx->EvalMap.Map1Texture1.Points;
1048	       n = ctx->EvalMap.Map1Texture1.Order * 1;
1049	       break;
1050	    case GL_MAP1_TEXTURE_COORD_2:
1051	       data = ctx->EvalMap.Map1Texture2.Points;
1052	       n = ctx->EvalMap.Map1Texture2.Order * 2;
1053	       break;
1054	    case GL_MAP1_TEXTURE_COORD_3:
1055	       data = ctx->EvalMap.Map1Texture3.Points;
1056	       n = ctx->EvalMap.Map1Texture3.Order * 3;
1057	       break;
1058	    case GL_MAP1_TEXTURE_COORD_4:
1059	       data = ctx->EvalMap.Map1Texture4.Points;
1060	       n = ctx->EvalMap.Map1Texture4.Order * 4;
1061	       break;
1062	    case GL_MAP1_VERTEX_3:
1063	       data = ctx->EvalMap.Map1Vertex3.Points;
1064	       n = ctx->EvalMap.Map1Vertex3.Order * 3;
1065	       break;
1066	    case GL_MAP1_VERTEX_4:
1067	       data = ctx->EvalMap.Map1Vertex4.Points;
1068	       n = ctx->EvalMap.Map1Vertex4.Order * 4;
1069	       break;
1070	    case GL_MAP2_COLOR_4:
1071	       data = ctx->EvalMap.Map2Color4.Points;
1072	       n = ctx->EvalMap.Map2Color4.Uorder
1073                 * ctx->EvalMap.Map2Color4.Vorder * 4;
1074	       break;
1075	    case GL_MAP2_INDEX:
1076	       data = ctx->EvalMap.Map2Index.Points;
1077	       n = ctx->EvalMap.Map2Index.Uorder
1078                 * ctx->EvalMap.Map2Index.Vorder;
1079	       break;
1080	    case GL_MAP2_NORMAL:
1081	       data = ctx->EvalMap.Map2Normal.Points;
1082	       n = ctx->EvalMap.Map2Normal.Uorder
1083                 * ctx->EvalMap.Map2Normal.Vorder * 3;
1084	       break;
1085	    case GL_MAP2_TEXTURE_COORD_1:
1086	       data = ctx->EvalMap.Map2Texture1.Points;
1087	       n = ctx->EvalMap.Map2Texture1.Uorder
1088                 * ctx->EvalMap.Map2Texture1.Vorder * 1;
1089	       break;
1090	    case GL_MAP2_TEXTURE_COORD_2:
1091	       data = ctx->EvalMap.Map2Texture2.Points;
1092	       n = ctx->EvalMap.Map2Texture2.Uorder
1093                 * ctx->EvalMap.Map2Texture2.Vorder * 2;
1094	       break;
1095	    case GL_MAP2_TEXTURE_COORD_3:
1096	       data = ctx->EvalMap.Map2Texture3.Points;
1097	       n = ctx->EvalMap.Map2Texture3.Uorder
1098                 * ctx->EvalMap.Map2Texture3.Vorder * 3;
1099	       break;
1100	    case GL_MAP2_TEXTURE_COORD_4:
1101	       data = ctx->EvalMap.Map2Texture4.Points;
1102	       n = ctx->EvalMap.Map2Texture4.Uorder
1103                 * ctx->EvalMap.Map2Texture4.Vorder * 4;
1104	       break;
1105	    case GL_MAP2_VERTEX_3:
1106	       data = ctx->EvalMap.Map2Vertex3.Points;
1107	       n = ctx->EvalMap.Map2Vertex3.Uorder
1108                 * ctx->EvalMap.Map2Vertex3.Vorder * 3;
1109	       break;
1110	    case GL_MAP2_VERTEX_4:
1111	       data = ctx->EvalMap.Map2Vertex4.Points;
1112	       n = ctx->EvalMap.Map2Vertex4.Uorder
1113                 * ctx->EvalMap.Map2Vertex4.Vorder * 4;
1114	       break;
1115	    default:
1116	       _mesa_error( ctx, GL_INVALID_ENUM, "glGetMapiv(target)" );
1117	       return;
1118	 }
1119	 if (data) {
1120	    for (i=0;i<n;i++) {
1121	       v[i] = ROUNDF(data[i]);
1122	    }
1123	 }
1124         break;
1125      case GL_ORDER:
1126	 switch (target) {
1127	    case GL_MAP1_COLOR_4:
1128	       *v = ctx->EvalMap.Map1Color4.Order;
1129	       break;
1130	    case GL_MAP1_INDEX:
1131	       *v = ctx->EvalMap.Map1Index.Order;
1132	       break;
1133	    case GL_MAP1_NORMAL:
1134	       *v = ctx->EvalMap.Map1Normal.Order;
1135	       break;
1136	    case GL_MAP1_TEXTURE_COORD_1:
1137	       *v = ctx->EvalMap.Map1Texture1.Order;
1138	       break;
1139	    case GL_MAP1_TEXTURE_COORD_2:
1140	       *v = ctx->EvalMap.Map1Texture2.Order;
1141	       break;
1142	    case GL_MAP1_TEXTURE_COORD_3:
1143	       *v = ctx->EvalMap.Map1Texture3.Order;
1144	       break;
1145	    case GL_MAP1_TEXTURE_COORD_4:
1146	       *v = ctx->EvalMap.Map1Texture4.Order;
1147	       break;
1148	    case GL_MAP1_VERTEX_3:
1149	       *v = ctx->EvalMap.Map1Vertex3.Order;
1150	       break;
1151	    case GL_MAP1_VERTEX_4:
1152	       *v = ctx->EvalMap.Map1Vertex4.Order;
1153	       break;
1154	    case GL_MAP2_COLOR_4:
1155	       v[0] = ctx->EvalMap.Map2Color4.Uorder;
1156	       v[1] = ctx->EvalMap.Map2Color4.Vorder;
1157	       break;
1158	    case GL_MAP2_INDEX:
1159	       v[0] = ctx->EvalMap.Map2Index.Uorder;
1160	       v[1] = ctx->EvalMap.Map2Index.Vorder;
1161	       break;
1162	    case GL_MAP2_NORMAL:
1163	       v[0] = ctx->EvalMap.Map2Normal.Uorder;
1164	       v[1] = ctx->EvalMap.Map2Normal.Vorder;
1165	       break;
1166	    case GL_MAP2_TEXTURE_COORD_1:
1167	       v[0] = ctx->EvalMap.Map2Texture1.Uorder;
1168	       v[1] = ctx->EvalMap.Map2Texture1.Vorder;
1169	       break;
1170	    case GL_MAP2_TEXTURE_COORD_2:
1171	       v[0] = ctx->EvalMap.Map2Texture2.Uorder;
1172	       v[1] = ctx->EvalMap.Map2Texture2.Vorder;
1173	       break;
1174	    case GL_MAP2_TEXTURE_COORD_3:
1175	       v[0] = ctx->EvalMap.Map2Texture3.Uorder;
1176	       v[1] = ctx->EvalMap.Map2Texture3.Vorder;
1177	       break;
1178	    case GL_MAP2_TEXTURE_COORD_4:
1179	       v[0] = ctx->EvalMap.Map2Texture4.Uorder;
1180	       v[1] = ctx->EvalMap.Map2Texture4.Vorder;
1181	       break;
1182	    case GL_MAP2_VERTEX_3:
1183	       v[0] = ctx->EvalMap.Map2Vertex3.Uorder;
1184	       v[1] = ctx->EvalMap.Map2Vertex3.Vorder;
1185	       break;
1186	    case GL_MAP2_VERTEX_4:
1187	       v[0] = ctx->EvalMap.Map2Vertex4.Uorder;
1188	       v[1] = ctx->EvalMap.Map2Vertex4.Vorder;
1189	       break;
1190	    default:
1191	       _mesa_error( ctx, GL_INVALID_ENUM, "glGetMapiv(target)" );
1192	       return;
1193	 }
1194         break;
1195      case GL_DOMAIN:
1196	 switch (target) {
1197	    case GL_MAP1_COLOR_4:
1198	       v[0] = ROUNDF(ctx->EvalMap.Map1Color4.u1);
1199	       v[1] = ROUNDF(ctx->EvalMap.Map1Color4.u2);
1200	       break;
1201	    case GL_MAP1_INDEX:
1202	       v[0] = ROUNDF(ctx->EvalMap.Map1Index.u1);
1203	       v[1] = ROUNDF(ctx->EvalMap.Map1Index.u2);
1204	       break;
1205	    case GL_MAP1_NORMAL:
1206	       v[0] = ROUNDF(ctx->EvalMap.Map1Normal.u1);
1207	       v[1] = ROUNDF(ctx->EvalMap.Map1Normal.u2);
1208	       break;
1209	    case GL_MAP1_TEXTURE_COORD_1:
1210	       v[0] = ROUNDF(ctx->EvalMap.Map1Texture1.u1);
1211	       v[1] = ROUNDF(ctx->EvalMap.Map1Texture1.u2);
1212	       break;
1213	    case GL_MAP1_TEXTURE_COORD_2:
1214	       v[0] = ROUNDF(ctx->EvalMap.Map1Texture2.u1);
1215	       v[1] = ROUNDF(ctx->EvalMap.Map1Texture2.u2);
1216	       break;
1217	    case GL_MAP1_TEXTURE_COORD_3:
1218	       v[0] = ROUNDF(ctx->EvalMap.Map1Texture3.u1);
1219	       v[1] = ROUNDF(ctx->EvalMap.Map1Texture3.u2);
1220	       break;
1221	    case GL_MAP1_TEXTURE_COORD_4:
1222	       v[0] = ROUNDF(ctx->EvalMap.Map1Texture4.u1);
1223	       v[1] = ROUNDF(ctx->EvalMap.Map1Texture4.u2);
1224	       break;
1225	    case GL_MAP1_VERTEX_3:
1226	       v[0] = ROUNDF(ctx->EvalMap.Map1Vertex3.u1);
1227	       v[1] = ROUNDF(ctx->EvalMap.Map1Vertex3.u2);
1228	       break;
1229	    case GL_MAP1_VERTEX_4:
1230	       v[0] = ROUNDF(ctx->EvalMap.Map1Vertex4.u1);
1231	       v[1] = ROUNDF(ctx->EvalMap.Map1Vertex4.u2);
1232	       break;
1233	    case GL_MAP2_COLOR_4:
1234	       v[0] = ROUNDF(ctx->EvalMap.Map2Color4.u1);
1235	       v[1] = ROUNDF(ctx->EvalMap.Map2Color4.u2);
1236	       v[2] = ROUNDF(ctx->EvalMap.Map2Color4.v1);
1237	       v[3] = ROUNDF(ctx->EvalMap.Map2Color4.v2);
1238	       break;
1239	    case GL_MAP2_INDEX:
1240	       v[0] = ROUNDF(ctx->EvalMap.Map2Index.u1);
1241	       v[1] = ROUNDF(ctx->EvalMap.Map2Index.u2);
1242	       v[2] = ROUNDF(ctx->EvalMap.Map2Index.v1);
1243	       v[3] = ROUNDF(ctx->EvalMap.Map2Index.v2);
1244	       break;
1245	    case GL_MAP2_NORMAL:
1246	       v[0] = ROUNDF(ctx->EvalMap.Map2Normal.u1);
1247	       v[1] = ROUNDF(ctx->EvalMap.Map2Normal.u2);
1248	       v[2] = ROUNDF(ctx->EvalMap.Map2Normal.v1);
1249	       v[3] = ROUNDF(ctx->EvalMap.Map2Normal.v2);
1250	       break;
1251	    case GL_MAP2_TEXTURE_COORD_1:
1252	       v[0] = ROUNDF(ctx->EvalMap.Map2Texture1.u1);
1253	       v[1] = ROUNDF(ctx->EvalMap.Map2Texture1.u2);
1254	       v[2] = ROUNDF(ctx->EvalMap.Map2Texture1.v1);
1255	       v[3] = ROUNDF(ctx->EvalMap.Map2Texture1.v2);
1256	       break;
1257	    case GL_MAP2_TEXTURE_COORD_2:
1258	       v[0] = ROUNDF(ctx->EvalMap.Map2Texture2.u1);
1259	       v[1] = ROUNDF(ctx->EvalMap.Map2Texture2.u2);
1260	       v[2] = ROUNDF(ctx->EvalMap.Map2Texture2.v1);
1261	       v[3] = ROUNDF(ctx->EvalMap.Map2Texture2.v2);
1262	       break;
1263	    case GL_MAP2_TEXTURE_COORD_3:
1264	       v[0] = ROUNDF(ctx->EvalMap.Map2Texture3.u1);
1265	       v[1] = ROUNDF(ctx->EvalMap.Map2Texture3.u2);
1266	       v[2] = ROUNDF(ctx->EvalMap.Map2Texture3.v1);
1267	       v[3] = ROUNDF(ctx->EvalMap.Map2Texture3.v2);
1268	       break;
1269	    case GL_MAP2_TEXTURE_COORD_4:
1270	       v[0] = ROUNDF(ctx->EvalMap.Map2Texture4.u1);
1271	       v[1] = ROUNDF(ctx->EvalMap.Map2Texture4.u2);
1272	       v[2] = ROUNDF(ctx->EvalMap.Map2Texture4.v1);
1273	       v[3] = ROUNDF(ctx->EvalMap.Map2Texture4.v2);
1274	       break;
1275	    case GL_MAP2_VERTEX_3:
1276	       v[0] = ROUNDF(ctx->EvalMap.Map2Vertex3.u1);
1277	       v[1] = ROUNDF(ctx->EvalMap.Map2Vertex3.u2);
1278	       v[2] = ROUNDF(ctx->EvalMap.Map2Vertex3.v1);
1279	       v[3] = ROUNDF(ctx->EvalMap.Map2Vertex3.v2);
1280	       break;
1281	    case GL_MAP2_VERTEX_4:
1282	       v[0] = ROUNDF(ctx->EvalMap.Map2Vertex4.u1);
1283	       v[1] = ROUNDF(ctx->EvalMap.Map2Vertex4.u2);
1284	       v[2] = ROUNDF(ctx->EvalMap.Map2Vertex4.v1);
1285	       v[3] = ROUNDF(ctx->EvalMap.Map2Vertex4.v2);
1286	       break;
1287	    default:
1288	       _mesa_error( ctx, GL_INVALID_ENUM, "glGetMapiv(target)" );
1289	 }
1290         break;
1291      default:
1292         _mesa_error( ctx, GL_INVALID_ENUM, "glGetMapiv(query)" );
1293   }
1294}
1295
1296
1297
1298void
1299_mesa_MapGrid1f( GLint un, GLfloat u1, GLfloat u2 )
1300{
1301   GET_CURRENT_CONTEXT(ctx);
1302   ASSERT_OUTSIDE_BEGIN_END(ctx);
1303
1304   if (un<1) {
1305      _mesa_error( ctx, GL_INVALID_VALUE, "glMapGrid1f" );
1306      return;
1307   }
1308   FLUSH_VERTICES(ctx, _NEW_EVAL);
1309   ctx->Eval.MapGrid1un = un;
1310   ctx->Eval.MapGrid1u1 = u1;
1311   ctx->Eval.MapGrid1u2 = u2;
1312   ctx->Eval.MapGrid1du = (u2 - u1) / (GLfloat) un;
1313}
1314
1315
1316void
1317_mesa_MapGrid1d( GLint un, GLdouble u1, GLdouble u2 )
1318{
1319   _mesa_MapGrid1f( un, u1, u2 );
1320}
1321
1322
1323void
1324_mesa_MapGrid2f( GLint un, GLfloat u1, GLfloat u2,
1325                 GLint vn, GLfloat v1, GLfloat v2 )
1326{
1327   GET_CURRENT_CONTEXT(ctx);
1328   ASSERT_OUTSIDE_BEGIN_END(ctx);
1329
1330   if (un<1) {
1331      _mesa_error( ctx, GL_INVALID_VALUE, "glMapGrid2f(un)" );
1332      return;
1333   }
1334   if (vn<1) {
1335      _mesa_error( ctx, GL_INVALID_VALUE, "glMapGrid2f(vn)" );
1336      return;
1337   }
1338
1339   FLUSH_VERTICES(ctx, _NEW_EVAL);
1340   ctx->Eval.MapGrid2un = un;
1341   ctx->Eval.MapGrid2u1 = u1;
1342   ctx->Eval.MapGrid2u2 = u2;
1343   ctx->Eval.MapGrid2du = (u2 - u1) / (GLfloat) un;
1344   ctx->Eval.MapGrid2vn = vn;
1345   ctx->Eval.MapGrid2v1 = v1;
1346   ctx->Eval.MapGrid2v2 = v2;
1347   ctx->Eval.MapGrid2dv = (v2 - v1) / (GLfloat) vn;
1348}
1349
1350
1351void
1352_mesa_MapGrid2d( GLint un, GLdouble u1, GLdouble u2,
1353                 GLint vn, GLdouble v1, GLdouble v2 )
1354{
1355   _mesa_MapGrid2f( un, u1, u2, vn, v1, v2 );
1356}
1357