eval.c revision afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1c
1afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach/* $Id: eval.c,v 1.1 1999/08/19 00:55:41 jtg Exp $ */
2afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach
3afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach/*
4afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach * Mesa 3-D graphics library
5afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach * Version:  3.1
6afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach *
7afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach * Copyright (C) 1999  Brian Paul   All Rights Reserved.
8afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach *
9afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach * Permission is hereby granted, free of charge, to any person obtaining a
10afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach * copy of this software and associated documentation files (the "Software"),
11afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach * to deal in the Software without restriction, including without limitation
12afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach * the rights to use, copy, modify, merge, publish, distribute, sublicense,
13afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach * and/or sell copies of the Software, and to permit persons to whom the
14afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach * Software is furnished to do so, subject to the following conditions:
15afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach *
16afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach * The above copyright notice and this permission notice shall be included
17afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach * in all copies or substantial portions of the Software.
18afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach *
19afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
20afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
21afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
22afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach * BRIAN PAUL BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN
23afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach * AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
24afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
25afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach */
26afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach
27afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach
28afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach
29afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach
30afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach
31afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach/*
32afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach * eval.c was written by
33afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach * Bernd Barsuhn (bdbarsuh@cip.informatik.uni-erlangen.de) and
34afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach * Volker Weiss (vrweiss@cip.informatik.uni-erlangen.de).
35afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach *
36afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach * My original implementation of evaluators was simplistic and didn't
37afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach * compute surface normal vectors properly.  Bernd and Volker applied
38afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach * used more sophisticated methods to get better results.
39afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach *
40afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach * Thanks guys!
41afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach */
42afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach
43afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach
44afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach#ifdef PC_HEADER
45afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach#include "all.h"
46afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach#else
47afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach#include <math.h>
48afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach#include <stdlib.h>
49afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach#include <string.h>
50afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach#include "context.h"
51afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach#include "eval.h"
52afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach#include "macros.h"
53afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach#include "mmath.h"
54afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach#include "types.h"
55afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach#include "vbcull.h"
56afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach#include "vbfill.h"
57afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach#include "vbxform.h"
58afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach#ifdef XFree86Server
59afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach#include "GL/xf86glx.h"
60afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach#endif
61afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach#endif
62afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach
63afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach
64afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlachstatic GLfloat inv_tab[MAX_EVAL_ORDER];
65afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach
66afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach/*
67afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach * Do one-time initialization for evaluators.
68afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach */
69afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlachvoid gl_init_eval( void )
70afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach{
71afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach  static int init_flag = 0;
72afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach  GLuint i;
73afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach
74afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach  /* Compute a table of nCr (combination) values used by the
75afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach   * Bernstein polynomial generator.
76afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach   */
77afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach
78afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach  /* KW: precompute 1/x for useful x.
79afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach   */
80afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach  if (init_flag==0)
81afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach  {
82afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach     for (i = 1 ; i < MAX_EVAL_ORDER ; i++)
83afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach	inv_tab[i] = 1.0 / i;
84afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach  }
85afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach
86afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach  init_flag = 1;
87afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach}
88afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach
89afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach
90afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach
91afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach/*
92afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach * Horner scheme for Bezier curves
93afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach *
94afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach * Bezier curves can be computed via a Horner scheme.
95afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach * Horner is numerically less stable than the de Casteljau
96afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach * algorithm, but it is faster. For curves of degree n
97afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach * the complexity of Horner is O(n) and de Casteljau is O(n^2).
98afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach * Since stability is not important for displaying curve
99afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach * points I decided to use the Horner scheme.
100afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach *
101afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach * A cubic Bezier curve with control points b0, b1, b2, b3 can be
102afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach * written as
103afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach *
104afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach *        (([3]        [3]     )     [3]       )     [3]
105afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach * c(t) = (([0]*s*b0 + [1]*t*b1)*s + [2]*t^2*b2)*s + [3]*t^2*b3
106afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach *
107afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach *                                           [n]
108afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach * where s=1-t and the binomial coefficients [i]. These can
109afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach * be computed iteratively using the identity:
110afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach *
111afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach * [n]               [n  ]             [n]
112afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach * [i] = (n-i+1)/i * [i-1]     and     [0] = 1
113afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach */
114afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach
115afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach
116afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlachstatic void
117afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlachhorner_bezier_curve(const GLfloat *cp, GLfloat *out, GLfloat t,
118afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                    GLuint dim, GLuint order)
119afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach{
120afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach  GLfloat s, powert;
121afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach  GLuint i, k, bincoeff;
122afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach
123afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach  if(order >= 2)
124afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach  {
125afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach    bincoeff = order-1;
126afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach    s = 1.0-t;
127afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach
128afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach    for(k=0; k<dim; k++)
129afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach      out[k] = s*cp[k] + bincoeff*t*cp[dim+k];
130afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach
131afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach    for(i=2, cp+=2*dim, powert=t*t; i<order; i++, powert*=t, cp +=dim)
132afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach    {
133afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach      bincoeff *= order-i;
134afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach      bincoeff *= inv_tab[i];
135afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach
136afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach      for(k=0; k<dim; k++)
137afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach        out[k] = s*out[k] + bincoeff*powert*cp[k];
138afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach    }
139afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach  }
140afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach  else /* order=1 -> constant curve */
141afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach  {
142afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach    for(k=0; k<dim; k++)
143afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach      out[k] = cp[k];
144afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach  }
145afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach}
146afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach
147afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach/*
148afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach * Tensor product Bezier surfaces
149afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach *
150afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach * Again the Horner scheme is used to compute a point on a
151afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach * TP Bezier surface. First a control polygon for a curve
152afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach * on the surface in one parameter direction is computed,
153afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach * then the point on the curve for the other parameter
154afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach * direction is evaluated.
155afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach *
156afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach * To store the curve control polygon additional storage
157afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach * for max(uorder,vorder) points is needed in the
158afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach * control net cn.
159afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach */
160afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach
161afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlachstatic void
162afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlachhorner_bezier_surf(GLfloat *cn, GLfloat *out, GLfloat u, GLfloat v,
163afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                   GLuint dim, GLuint uorder, GLuint vorder)
164afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach{
165afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach  GLfloat *cp = cn + uorder*vorder*dim;
166afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach  GLuint i, uinc = vorder*dim;
167afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach
168afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach  if(vorder > uorder)
169afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach  {
170afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach    if(uorder >= 2)
171afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach    {
172afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach      GLfloat s, poweru;
173afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach      GLuint j, k, bincoeff;
174afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach
175afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach      /* Compute the control polygon for the surface-curve in u-direction */
176afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach      for(j=0; j<vorder; j++)
177afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach      {
178afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach        GLfloat *ucp = &cn[j*dim];
179afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach
180afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach        /* Each control point is the point for parameter u on a */
181afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach        /* curve defined by the control polygons in u-direction */
182afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach	bincoeff = uorder-1;
183afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach	s = 1.0-u;
184afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach
185afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach	for(k=0; k<dim; k++)
186afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach	  cp[j*dim+k] = s*ucp[k] + bincoeff*u*ucp[uinc+k];
187afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach
188afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach	for(i=2, ucp+=2*uinc, poweru=u*u; i<uorder;
189afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach            i++, poweru*=u, ucp +=uinc)
190afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach	{
191afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach	  bincoeff *= uorder-i;
192afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach          bincoeff *= inv_tab[i];
193afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach
194afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach	  for(k=0; k<dim; k++)
195afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach	    cp[j*dim+k] = s*cp[j*dim+k] + bincoeff*poweru*ucp[k];
196afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach	}
197afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach      }
198afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach
199afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach      /* Evaluate curve point in v */
200afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach      horner_bezier_curve(cp, out, v, dim, vorder);
201afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach    }
202afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach    else /* uorder=1 -> cn defines a curve in v */
203afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach      horner_bezier_curve(cn, out, v, dim, vorder);
204afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach  }
205afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach  else /* vorder <= uorder */
206afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach  {
207afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach    if(vorder > 1)
208afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach    {
209afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach      GLuint i;
210afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach
211afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach      /* Compute the control polygon for the surface-curve in u-direction */
212afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach      for(i=0; i<uorder; i++, cn += uinc)
213afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach      {
214afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach	/* For constant i all cn[i][j] (j=0..vorder) are located */
215afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach	/* on consecutive memory locations, so we can use        */
216afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach	/* horner_bezier_curve to compute the control points     */
217afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach
218afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach	horner_bezier_curve(cn, &cp[i*dim], v, dim, vorder);
219afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach      }
220afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach
221afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach      /* Evaluate curve point in u */
222afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach      horner_bezier_curve(cp, out, u, dim, uorder);
223afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach    }
224afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach    else  /* vorder=1 -> cn defines a curve in u */
225afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach      horner_bezier_curve(cn, out, u, dim, uorder);
226afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach  }
227afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach}
228afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach
229afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach/*
230afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach * The direct de Casteljau algorithm is used when a point on the
231afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach * surface and the tangent directions spanning the tangent plane
232afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach * should be computed (this is needed to compute normals to the
233afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach * surface). In this case the de Casteljau algorithm approach is
234afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach * nicer because a point and the partial derivatives can be computed
235afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach * at the same time. To get the correct tangent length du and dv
236afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach * must be multiplied with the (u2-u1)/uorder-1 and (v2-v1)/vorder-1.
237afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach * Since only the directions are needed, this scaling step is omitted.
238afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach *
239afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach * De Casteljau needs additional storage for uorder*vorder
240afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach * values in the control net cn.
241afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach */
242afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach
243afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlachstatic void
244afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlachde_casteljau_surf(GLfloat *cn, GLfloat *out, GLfloat *du, GLfloat *dv,
245afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                  GLfloat u, GLfloat v, GLuint dim,
246afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                  GLuint uorder, GLuint vorder)
247afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach{
248afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach  GLfloat *dcn = cn + uorder*vorder*dim;
249afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach  GLfloat us = 1.0-u, vs = 1.0-v;
250afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach  GLuint h, i, j, k;
251afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach  GLuint minorder = uorder < vorder ? uorder : vorder;
252afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach  GLuint uinc = vorder*dim;
253afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach  GLuint dcuinc = vorder;
254afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach
255afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach  /* Each component is evaluated separately to save buffer space  */
256afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach  /* This does not drasticaly decrease the performance of the     */
257afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach  /* algorithm. If additional storage for (uorder-1)*(vorder-1)   */
258afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach  /* points would be available, the components could be accessed  */
259afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach  /* in the innermost loop which could lead to less cache misses. */
260afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach
261afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach#define CN(I,J,K) cn[(I)*uinc+(J)*dim+(K)]
262afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach#define DCN(I, J) dcn[(I)*dcuinc+(J)]
263afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach  if(minorder < 3)
264afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach  {
265afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach    if(uorder==vorder)
266afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach    {
267afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach      for(k=0; k<dim; k++)
268afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach      {
269afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach	/* Derivative direction in u */
270afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach	du[k] = vs*(CN(1,0,k) - CN(0,0,k)) +
271afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach	         v*(CN(1,1,k) - CN(0,1,k));
272afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach
273afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach	/* Derivative direction in v */
274afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach	dv[k] = us*(CN(0,1,k) - CN(0,0,k)) +
275afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach	         u*(CN(1,1,k) - CN(1,0,k));
276afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach
277afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach	/* bilinear de Casteljau step */
278afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach        out[k] =  us*(vs*CN(0,0,k) + v*CN(0,1,k)) +
279afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach	           u*(vs*CN(1,0,k) + v*CN(1,1,k));
280afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach      }
281afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach    }
282afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach    else if(minorder == uorder)
283afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach    {
284afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach      for(k=0; k<dim; k++)
285afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach      {
286afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach	/* bilinear de Casteljau step */
287afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach	DCN(1,0) =    CN(1,0,k) -   CN(0,0,k);
288afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach	DCN(0,0) = us*CN(0,0,k) + u*CN(1,0,k);
289afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach
290afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach	for(j=0; j<vorder-1; j++)
291afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach	{
292afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach	  /* for the derivative in u */
293afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach	  DCN(1,j+1) =    CN(1,j+1,k) -   CN(0,j+1,k);
294afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach	  DCN(1,j)   = vs*DCN(1,j)    + v*DCN(1,j+1);
295afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach
296afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach	  /* for the `point' */
297afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach	  DCN(0,j+1) = us*CN(0,j+1,k) + u*CN(1,j+1,k);
298afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach	  DCN(0,j)   = vs*DCN(0,j)    + v*DCN(0,j+1);
299afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach	}
300afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach
301afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach	/* remaining linear de Casteljau steps until the second last step */
302afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach	for(h=minorder; h<vorder-1; h++)
303afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach	  for(j=0; j<vorder-h; j++)
304afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach	  {
305afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach	    /* for the derivative in u */
306afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach	    DCN(1,j) = vs*DCN(1,j) + v*DCN(1,j+1);
307afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach
308afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach	    /* for the `point' */
309afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach	    DCN(0,j) = vs*DCN(0,j) + v*DCN(0,j+1);
310afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach	  }
311afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach
312afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach	/* derivative direction in v */
313afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach	dv[k] = DCN(0,1) - DCN(0,0);
314afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach
315afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach	/* derivative direction in u */
316afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach	du[k] =   vs*DCN(1,0) + v*DCN(1,1);
317afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach
318afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach	/* last linear de Casteljau step */
319afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach	out[k] =  vs*DCN(0,0) + v*DCN(0,1);
320afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach      }
321afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach    }
322afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach    else /* minorder == vorder */
323afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach    {
324afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach      for(k=0; k<dim; k++)
325afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach      {
326afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach	/* bilinear de Casteljau step */
327afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach	DCN(0,1) =    CN(0,1,k) -   CN(0,0,k);
328afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach	DCN(0,0) = vs*CN(0,0,k) + v*CN(0,1,k);
329afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach	for(i=0; i<uorder-1; i++)
330afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach	{
331afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach	  /* for the derivative in v */
332afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach	  DCN(i+1,1) =    CN(i+1,1,k) -   CN(i+1,0,k);
333afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach	  DCN(i,1)   = us*DCN(i,1)    + u*DCN(i+1,1);
334afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach
335afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach	  /* for the `point' */
336afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach	  DCN(i+1,0) = vs*CN(i+1,0,k) + v*CN(i+1,1,k);
337afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach	  DCN(i,0)   = us*DCN(i,0)    + u*DCN(i+1,0);
338afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach	}
339afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach
340afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach	/* remaining linear de Casteljau steps until the second last step */
341afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach	for(h=minorder; h<uorder-1; h++)
342afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach	  for(i=0; i<uorder-h; i++)
343afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach	  {
344afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach	    /* for the derivative in v */
345afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach	    DCN(i,1) = us*DCN(i,1) + u*DCN(i+1,1);
346afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach
347afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach	    /* for the `point' */
348afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach	    DCN(i,0) = us*DCN(i,0) + u*DCN(i+1,0);
349afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach	  }
350afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach
351afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach	/* derivative direction in u */
352afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach	du[k] = DCN(1,0) - DCN(0,0);
353afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach
354afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach	/* derivative direction in v */
355afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach	dv[k] =   us*DCN(0,1) + u*DCN(1,1);
356afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach
357afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach	/* last linear de Casteljau step */
358afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach	out[k] =  us*DCN(0,0) + u*DCN(1,0);
359afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach      }
360afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach    }
361afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach  }
362afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach  else if(uorder == vorder)
363afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach  {
364afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach    for(k=0; k<dim; k++)
365afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach    {
366afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach      /* first bilinear de Casteljau step */
367afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach      for(i=0; i<uorder-1; i++)
368afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach      {
369afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach	DCN(i,0) = us*CN(i,0,k) + u*CN(i+1,0,k);
370afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach	for(j=0; j<vorder-1; j++)
371afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach	{
372afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach	  DCN(i,j+1) = us*CN(i,j+1,k) + u*CN(i+1,j+1,k);
373afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach	  DCN(i,j)   = vs*DCN(i,j)    + v*DCN(i,j+1);
374afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach	}
375afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach      }
376afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach
377afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach      /* remaining bilinear de Casteljau steps until the second last step */
378afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach      for(h=2; h<minorder-1; h++)
379afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach	for(i=0; i<uorder-h; i++)
380afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach	{
381afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach	  DCN(i,0) = us*DCN(i,0) + u*DCN(i+1,0);
382afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach	  for(j=0; j<vorder-h; j++)
383afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach	  {
384afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach	    DCN(i,j+1) = us*DCN(i,j+1) + u*DCN(i+1,j+1);
385afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach	    DCN(i,j)   = vs*DCN(i,j)   + v*DCN(i,j+1);
386afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach	  }
387afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach	}
388afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach
389afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach      /* derivative direction in u */
390afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach      du[k] = vs*(DCN(1,0) - DCN(0,0)) +
391afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach	       v*(DCN(1,1) - DCN(0,1));
392afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach
393afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach      /* derivative direction in v */
394afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach      dv[k] = us*(DCN(0,1) - DCN(0,0)) +
395afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach	       u*(DCN(1,1) - DCN(1,0));
396afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach
397afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach      /* last bilinear de Casteljau step */
398afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach      out[k] =  us*(vs*DCN(0,0) + v*DCN(0,1)) +
399afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach	         u*(vs*DCN(1,0) + v*DCN(1,1));
400afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach    }
401afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach  }
402afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach  else if(minorder == uorder)
403afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach  {
404afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach    for(k=0; k<dim; k++)
405afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach    {
406afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach      /* first bilinear de Casteljau step */
407afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach      for(i=0; i<uorder-1; i++)
408afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach      {
409afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach	DCN(i,0) = us*CN(i,0,k) + u*CN(i+1,0,k);
410afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach	for(j=0; j<vorder-1; j++)
411afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach	{
412afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach	  DCN(i,j+1) = us*CN(i,j+1,k) + u*CN(i+1,j+1,k);
413afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach	  DCN(i,j)   = vs*DCN(i,j)    + v*DCN(i,j+1);
414afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach	}
415afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach      }
416afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach
417afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach      /* remaining bilinear de Casteljau steps until the second last step */
418afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach      for(h=2; h<minorder-1; h++)
419afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach	for(i=0; i<uorder-h; i++)
420afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach	{
421afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach	  DCN(i,0) = us*DCN(i,0) + u*DCN(i+1,0);
422afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach	  for(j=0; j<vorder-h; j++)
423afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach	  {
424afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach	    DCN(i,j+1) = us*DCN(i,j+1) + u*DCN(i+1,j+1);
425afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach	    DCN(i,j)   = vs*DCN(i,j)   + v*DCN(i,j+1);
426afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach	  }
427afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach	}
428afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach
429afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach      /* last bilinear de Casteljau step */
430afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach      DCN(2,0) =    DCN(1,0) -   DCN(0,0);
431afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach      DCN(0,0) = us*DCN(0,0) + u*DCN(1,0);
432afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach      for(j=0; j<vorder-1; j++)
433afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach      {
434afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach	/* for the derivative in u */
435afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach	DCN(2,j+1) =    DCN(1,j+1) -    DCN(0,j+1);
436afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach	DCN(2,j)   = vs*DCN(2,j)    + v*DCN(2,j+1);
437afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach
438afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach	/* for the `point' */
439afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach	DCN(0,j+1) = us*DCN(0,j+1 ) + u*DCN(1,j+1);
440afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach	DCN(0,j)   = vs*DCN(0,j)    + v*DCN(0,j+1);
441afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach      }
442afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach
443afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach      /* remaining linear de Casteljau steps until the second last step */
444afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach      for(h=minorder; h<vorder-1; h++)
445afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach	for(j=0; j<vorder-h; j++)
446afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach	{
447afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach	  /* for the derivative in u */
448afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach	  DCN(2,j) = vs*DCN(2,j) + v*DCN(2,j+1);
449afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach
450afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach	  /* for the `point' */
451afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach	  DCN(0,j) = vs*DCN(0,j) + v*DCN(0,j+1);
452afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach	}
453afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach
454afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach      /* derivative direction in v */
455afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach      dv[k] = DCN(0,1) - DCN(0,0);
456afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach
457afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach      /* derivative direction in u */
458afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach      du[k] =   vs*DCN(2,0) + v*DCN(2,1);
459afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach
460afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach      /* last linear de Casteljau step */
461afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach      out[k] =  vs*DCN(0,0) + v*DCN(0,1);
462afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach    }
463afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach  }
464afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach  else /* minorder == vorder */
465afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach  {
466afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach    for(k=0; k<dim; k++)
467afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach    {
468afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach      /* first bilinear de Casteljau step */
469afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach      for(i=0; i<uorder-1; i++)
470afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach      {
471afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach	DCN(i,0) = us*CN(i,0,k) + u*CN(i+1,0,k);
472afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach	for(j=0; j<vorder-1; j++)
473afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach	{
474afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach	  DCN(i,j+1) = us*CN(i,j+1,k) + u*CN(i+1,j+1,k);
475afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach	  DCN(i,j)   = vs*DCN(i,j)    + v*DCN(i,j+1);
476afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach	}
477afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach      }
478afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach
479afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach      /* remaining bilinear de Casteljau steps until the second last step */
480afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach      for(h=2; h<minorder-1; h++)
481afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach	for(i=0; i<uorder-h; i++)
482afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach	{
483afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach	  DCN(i,0) = us*DCN(i,0) + u*DCN(i+1,0);
484afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach	  for(j=0; j<vorder-h; j++)
485afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach	  {
486afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach	    DCN(i,j+1) = us*DCN(i,j+1) + u*DCN(i+1,j+1);
487afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach	    DCN(i,j)   = vs*DCN(i,j)   + v*DCN(i,j+1);
488afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach	  }
489afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach	}
490afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach
491afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach      /* last bilinear de Casteljau step */
492afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach      DCN(0,2) =    DCN(0,1) -   DCN(0,0);
493afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach      DCN(0,0) = vs*DCN(0,0) + v*DCN(0,1);
494afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach      for(i=0; i<uorder-1; i++)
495afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach      {
496afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach	/* for the derivative in v */
497afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach	DCN(i+1,2) =    DCN(i+1,1)  -   DCN(i+1,0);
498afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach	DCN(i,2)   = us*DCN(i,2)    + u*DCN(i+1,2);
499afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach
500afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach	/* for the `point' */
501afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach	DCN(i+1,0) = vs*DCN(i+1,0)  + v*DCN(i+1,1);
502afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach	DCN(i,0)   = us*DCN(i,0)    + u*DCN(i+1,0);
503afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach      }
504afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach
505afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach      /* remaining linear de Casteljau steps until the second last step */
506afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach      for(h=minorder; h<uorder-1; h++)
507afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach	for(i=0; i<uorder-h; i++)
508afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach	{
509afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach	  /* for the derivative in v */
510afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach	  DCN(i,2) = us*DCN(i,2) + u*DCN(i+1,2);
511afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach
512afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach	  /* for the `point' */
513afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach	  DCN(i,0) = us*DCN(i,0) + u*DCN(i+1,0);
514afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach	}
515afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach
516afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach      /* derivative direction in u */
517afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach      du[k] = DCN(1,0) - DCN(0,0);
518afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach
519afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach      /* derivative direction in v */
520afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach      dv[k] =   us*DCN(0,2) + u*DCN(1,2);
521afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach
522afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach      /* last linear de Casteljau step */
523afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach      out[k] =  us*DCN(0,0) + u*DCN(1,0);
524afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach    }
525afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach  }
526afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach#undef DCN
527afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach#undef CN
528afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach}
529afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach
530afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach/*
531afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach * Return the number of components per control point for any type of
532afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach * evaluator.  Return 0 if bad target.
533afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach */
534afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach
535afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlachstatic GLint components( GLenum target )
536afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach{
537afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach   switch (target) {
538afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach      case GL_MAP1_VERTEX_3:		return 3;
539afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach      case GL_MAP1_VERTEX_4:		return 4;
540afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach      case GL_MAP1_INDEX:		return 1;
541afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach      case GL_MAP1_COLOR_4:		return 4;
542afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach      case GL_MAP1_NORMAL:		return 3;
543afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach      case GL_MAP1_TEXTURE_COORD_1:	return 1;
544afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach      case GL_MAP1_TEXTURE_COORD_2:	return 2;
545afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach      case GL_MAP1_TEXTURE_COORD_3:	return 3;
546afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach      case GL_MAP1_TEXTURE_COORD_4:	return 4;
547afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach      case GL_MAP2_VERTEX_3:		return 3;
548afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach      case GL_MAP2_VERTEX_4:		return 4;
549afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach      case GL_MAP2_INDEX:		return 1;
550afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach      case GL_MAP2_COLOR_4:		return 4;
551afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach      case GL_MAP2_NORMAL:		return 3;
552afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach      case GL_MAP2_TEXTURE_COORD_1:	return 1;
553afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach      case GL_MAP2_TEXTURE_COORD_2:	return 2;
554afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach      case GL_MAP2_TEXTURE_COORD_3:	return 3;
555afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach      case GL_MAP2_TEXTURE_COORD_4:	return 4;
556afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach      default:				return 0;
557afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach   }
558afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach}
559afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach
560afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach
561afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach/**********************************************************************/
562afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach/***            Copy and deallocate control points                  ***/
563afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach/**********************************************************************/
564afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach
565afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach
566afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach/*
567afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach * Copy 1-parametric evaluator control points from user-specified
568afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach * memory space to a buffer of contiguous control points.
569afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach * Input:  see glMap1f for details
570afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach * Return:  pointer to buffer of contiguous control points or NULL if out
571afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach *          of memory.
572afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach */
573afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen GerlachGLfloat *gl_copy_map_points1f( GLenum target,
574afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                               GLint ustride, GLint uorder,
575afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                               const GLfloat *points )
576afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach{
577afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach   GLfloat *buffer, *p;
578afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach   GLint i, k, size = components(target);
579afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach
580afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach   if (!points || size==0) {
581afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach      return NULL;
582afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach   }
583afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach
584afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach   buffer = (GLfloat *) malloc(uorder * size * sizeof(GLfloat));
585afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach
586afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach   if(buffer)
587afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach      for(i=0, p=buffer; i<uorder; i++, points+=ustride)
588afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach	for(k=0; k<size; k++)
589afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach	  *p++ = points[k];
590afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach
591afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach   return buffer;
592afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach}
593afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach
594afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach
595afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach
596afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach/*
597afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach * Same as above but convert doubles to floats.
598afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach */
599afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen GerlachGLfloat *gl_copy_map_points1d( GLenum target,
600afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach			        GLint ustride, GLint uorder,
601afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach			        const GLdouble *points )
602afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach{
603afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach   GLfloat *buffer, *p;
604afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach   GLint i, k, size = components(target);
605afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach
606afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach   if (!points || size==0) {
607afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach      return NULL;
608afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach   }
609afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach
610afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach   buffer = (GLfloat *) malloc(uorder * size * sizeof(GLfloat));
611afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach
612afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach   if(buffer)
613afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach      for(i=0, p=buffer; i<uorder; i++, points+=ustride)
614afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach	for(k=0; k<size; k++)
615afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach	  *p++ = (GLfloat) points[k];
616afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach
617afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach   return buffer;
618afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach}
619afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach
620afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach
621afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach
622afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach/*
623afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach * Copy 2-parametric evaluator control points from user-specified
624afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach * memory space to a buffer of contiguous control points.
625afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach * Additional memory is allocated to be used by the horner and
626afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach * de Casteljau evaluation schemes.
627afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach *
628afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach * Input:  see glMap2f for details
629afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach * Return:  pointer to buffer of contiguous control points or NULL if out
630afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach *          of memory.
631afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach */
632afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen GerlachGLfloat *gl_copy_map_points2f( GLenum target,
633afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach			        GLint ustride, GLint uorder,
634afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach			        GLint vstride, GLint vorder,
635afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach			        const GLfloat *points )
636afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach{
637afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach   GLfloat *buffer, *p;
638afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach   GLint i, j, k, size, dsize, hsize;
639afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach   GLint uinc;
640afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach
641afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach   size = components(target);
642afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach
643afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach   if (!points || size==0) {
644afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach      return NULL;
645afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach   }
646afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach
647afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach   /* max(uorder, vorder) additional points are used in      */
648afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach   /* horner evaluation and uorder*vorder additional */
649afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach   /* values are needed for de Casteljau                     */
650afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach   dsize = (uorder == 2 && vorder == 2)? 0 : uorder*vorder;
651afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach   hsize = (uorder > vorder ? uorder : vorder)*size;
652afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach
653afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach   if(hsize>dsize)
654afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach     buffer = (GLfloat *) malloc((uorder*vorder*size+hsize)*sizeof(GLfloat));
655afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach   else
656afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach     buffer = (GLfloat *) malloc((uorder*vorder*size+dsize)*sizeof(GLfloat));
657afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach
658afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach   /* compute the increment value for the u-loop */
659afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach   uinc = ustride - vorder*vstride;
660afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach
661afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach   if (buffer)
662afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach      for (i=0, p=buffer; i<uorder; i++, points += uinc)
663afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach	 for (j=0; j<vorder; j++, points += vstride)
664afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach	    for (k=0; k<size; k++)
665afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach	       *p++ = points[k];
666afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach
667afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach   return buffer;
668afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach}
669afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach
670afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach
671afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach
672afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach/*
673afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach * Same as above but convert doubles to floats.
674afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach */
675afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen GerlachGLfloat *gl_copy_map_points2d(GLenum target,
676afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                              GLint ustride, GLint uorder,
677afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                              GLint vstride, GLint vorder,
678afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                              const GLdouble *points )
679afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach{
680afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach   GLfloat *buffer, *p;
681afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach   GLint i, j, k, size, hsize, dsize;
682afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach   GLint uinc;
683afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach
684afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach   size = components(target);
685afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach
686afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach   if (!points || size==0) {
687afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach      return NULL;
688afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach   }
689afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach
690afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach   /* max(uorder, vorder) additional points are used in      */
691afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach   /* horner evaluation and uorder*vorder additional */
692afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach   /* values are needed for de Casteljau                     */
693afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach   dsize = (uorder == 2 && vorder == 2)? 0 : uorder*vorder;
694afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach   hsize = (uorder > vorder ? uorder : vorder)*size;
695afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach
696afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach   if(hsize>dsize)
697afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach     buffer = (GLfloat *) malloc((uorder*vorder*size+hsize)*sizeof(GLfloat));
698afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach   else
699afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach     buffer = (GLfloat *) malloc((uorder*vorder*size+dsize)*sizeof(GLfloat));
700afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach
701afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach   /* compute the increment value for the u-loop */
702afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach   uinc = ustride - vorder*vstride;
703afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach
704afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach   if (buffer)
705afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach      for (i=0, p=buffer; i<uorder; i++, points += uinc)
706afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach	 for (j=0; j<vorder; j++, points += vstride)
707afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach	    for (k=0; k<size; k++)
708afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach	       *p++ = (GLfloat) points[k];
709afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach
710afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach   return buffer;
711afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach}
712afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach
713afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach
714afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach/*
715afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach * This function is called by the display list deallocator function to
716afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach * specify that a given set of control points are no longer needed.
717afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach */
718afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlachvoid gl_free_control_points( GLcontext* ctx, GLenum target, GLfloat *data )
719afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach{
720afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach   struct gl_1d_map *map1 = NULL;
721afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach   struct gl_2d_map *map2 = NULL;
722afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach
723afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach   switch (target) {
724afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach      case GL_MAP1_VERTEX_3:
725afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach         map1 = &ctx->EvalMap.Map1Vertex3;
726afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach         break;
727afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach      case GL_MAP1_VERTEX_4:
728afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach         map1 = &ctx->EvalMap.Map1Vertex4;
729afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach	 break;
730afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach      case GL_MAP1_INDEX:
731afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach         map1 = &ctx->EvalMap.Map1Index;
732afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach         break;
733afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach      case GL_MAP1_COLOR_4:
734afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach         map1 = &ctx->EvalMap.Map1Color4;
735afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach         break;
736afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach      case GL_MAP1_NORMAL:
737afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach         map1 = &ctx->EvalMap.Map1Normal;
738afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach	 break;
739afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach      case GL_MAP1_TEXTURE_COORD_1:
740afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach         map1 = &ctx->EvalMap.Map1Texture1;
741afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach	 break;
742afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach      case GL_MAP1_TEXTURE_COORD_2:
743afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach         map1 = &ctx->EvalMap.Map1Texture2;
744afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach	 break;
745afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach      case GL_MAP1_TEXTURE_COORD_3:
746afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach         map1 = &ctx->EvalMap.Map1Texture3;
747afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach	 break;
748afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach      case GL_MAP1_TEXTURE_COORD_4:
749afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach         map1 = &ctx->EvalMap.Map1Texture4;
750afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach	 break;
751afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach      case GL_MAP2_VERTEX_3:
752afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach         map2 = &ctx->EvalMap.Map2Vertex3;
753afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach	 break;
754afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach      case GL_MAP2_VERTEX_4:
755afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach         map2 = &ctx->EvalMap.Map2Vertex4;
756afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach	 break;
757afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach      case GL_MAP2_INDEX:
758afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach         map2 = &ctx->EvalMap.Map2Index;
759afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach	 break;
760afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach      case GL_MAP2_COLOR_4:
761afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach         map2 = &ctx->EvalMap.Map2Color4;
762afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach         break;
763afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach      case GL_MAP2_NORMAL:
764afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach         map2 = &ctx->EvalMap.Map2Normal;
765afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach	 break;
766afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach      case GL_MAP2_TEXTURE_COORD_1:
767afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach         map2 = &ctx->EvalMap.Map2Texture1;
768afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach	 break;
769afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach      case GL_MAP2_TEXTURE_COORD_2:
770afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach         map2 = &ctx->EvalMap.Map2Texture2;
771afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach	 break;
772afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach      case GL_MAP2_TEXTURE_COORD_3:
773afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach         map2 = &ctx->EvalMap.Map2Texture3;
774afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach	 break;
775afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach      case GL_MAP2_TEXTURE_COORD_4:
776afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach         map2 = &ctx->EvalMap.Map2Texture4;
777afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach	 break;
778afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach      default:
779afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach	 gl_error( ctx, GL_INVALID_ENUM, "gl_free_control_points" );
780afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach         return;
781afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach   }
782afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach
783afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach   if (map1) {
784afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach      if (data==map1->Points) {
785afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach         /* The control points in the display list are currently */
786afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach         /* being used so we can mark them as discard-able. */
787afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach         map1->Retain = GL_FALSE;
788afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach      }
789afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach      else {
790afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach         /* The control points in the display list are not currently */
791afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach         /* being used. */
792afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach         free( data );
793afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach      }
794afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach   }
795afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach   if (map2) {
796afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach      if (data==map2->Points) {
797afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach         /* The control points in the display list are currently */
798afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach         /* being used so we can mark them as discard-able. */
799afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach         map2->Retain = GL_FALSE;
800afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach      }
801afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach      else {
802afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach         /* The control points in the display list are not currently */
803afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach         /* being used. */
804afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach         free( data );
805afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach      }
806afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach   }
807afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach
808afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach}
809afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach
810afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach
811afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach
812afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach/**********************************************************************/
813afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach/***                      API entry points                          ***/
814afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach/**********************************************************************/
815afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach
816afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach
817afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach/*
818afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach * Note that the array of control points must be 'unpacked' at this time.
819afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach * Input:  retain - if TRUE, this control point data is also in a display
820afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach *                  list and can't be freed until the list is freed.
821afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach */
822afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlachvoid gl_Map1f( GLcontext* ctx, GLenum target,
823afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach               GLfloat u1, GLfloat u2, GLint stride,
824afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach               GLint order, const GLfloat *points, GLboolean retain )
825afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach{
826afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach   GLint k;
827afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach
828afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach   if (!points) {
829afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach      gl_error( ctx, GL_OUT_OF_MEMORY, "glMap1f" );
830afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach      return;
831afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach   }
832afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach
833afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach   /* may be a new stride after copying control points */
834afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach   stride = components( target );
835afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach
836afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach   ASSERT_OUTSIDE_BEGIN_END_AND_FLUSH(ctx, "glMap1");
837afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach
838afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach   if (u1==u2) {
839afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach      gl_error( ctx, GL_INVALID_VALUE, "glMap1(u1,u2)" );
840afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach      return;
841afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach   }
842afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach
843afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach   if (order<1 || order>MAX_EVAL_ORDER) {
844afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach      gl_error( ctx, GL_INVALID_VALUE, "glMap1(order)" );
845afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach      return;
846afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach   }
847afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach
848afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach   k = components( target );
849afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach   if (k==0) {
850afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach      gl_error( ctx, GL_INVALID_ENUM, "glMap1(target)" );
851afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach   }
852afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach
853afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach   if (stride < k) {
854afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach      gl_error( ctx, GL_INVALID_VALUE, "glMap1(stride)" );
855afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach      return;
856afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach   }
857afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach
858afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach   switch (target) {
859afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach      case GL_MAP1_VERTEX_3:
860afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach         ctx->EvalMap.Map1Vertex3.Order = order;
861afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach	 ctx->EvalMap.Map1Vertex3.u1 = u1;
862afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach	 ctx->EvalMap.Map1Vertex3.u2 = u2;
863afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach	 ctx->EvalMap.Map1Vertex3.du = 1.0 / (u2 - u1);
864afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach	 if (ctx->EvalMap.Map1Vertex3.Points
865afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach             && !ctx->EvalMap.Map1Vertex3.Retain) {
866afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach	    free( ctx->EvalMap.Map1Vertex3.Points );
867afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach	 }
868afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach	 ctx->EvalMap.Map1Vertex3.Points = (GLfloat *) points;
869afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach         ctx->EvalMap.Map1Vertex3.Retain = retain;
870afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach	 break;
871afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach      case GL_MAP1_VERTEX_4:
872afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach         ctx->EvalMap.Map1Vertex4.Order = order;
873afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach	 ctx->EvalMap.Map1Vertex4.u1 = u1;
874afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach	 ctx->EvalMap.Map1Vertex4.u2 = u2;
875afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach	 ctx->EvalMap.Map1Vertex4.du = 1.0 / (u2 - u1);
876afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach	 if (ctx->EvalMap.Map1Vertex4.Points
877afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach             && !ctx->EvalMap.Map1Vertex4.Retain) {
878afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach	    free( ctx->EvalMap.Map1Vertex4.Points );
879afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach	 }
880afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach	 ctx->EvalMap.Map1Vertex4.Points = (GLfloat *) points;
881afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach	 ctx->EvalMap.Map1Vertex4.Retain = retain;
882afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach	 break;
883afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach      case GL_MAP1_INDEX:
884afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach         ctx->EvalMap.Map1Index.Order = order;
885afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach	 ctx->EvalMap.Map1Index.u1 = u1;
886afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach	 ctx->EvalMap.Map1Index.u2 = u2;
887afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach	 ctx->EvalMap.Map1Index.du = 1.0 / (u2 - u1);
888afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach	 if (ctx->EvalMap.Map1Index.Points
889afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach             && !ctx->EvalMap.Map1Index.Retain) {
890afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach	    free( ctx->EvalMap.Map1Index.Points );
891afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach	 }
892afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach	 ctx->EvalMap.Map1Index.Points = (GLfloat *) points;
893afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach	 ctx->EvalMap.Map1Index.Retain = retain;
894afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach	 break;
895afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach      case GL_MAP1_COLOR_4:
896afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach         ctx->EvalMap.Map1Color4.Order = order;
897afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach	 ctx->EvalMap.Map1Color4.u1 = u1;
898afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach	 ctx->EvalMap.Map1Color4.u2 = u2;
899afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach	 ctx->EvalMap.Map1Color4.du = 1.0 / (u2 - u1);
900afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach	 if (ctx->EvalMap.Map1Color4.Points
901afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach             && !ctx->EvalMap.Map1Color4.Retain) {
902afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach	    free( ctx->EvalMap.Map1Color4.Points );
903afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach	 }
904afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach	 ctx->EvalMap.Map1Color4.Points = (GLfloat *) points;
905afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach	 ctx->EvalMap.Map1Color4.Retain = retain;
906afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach	 break;
907afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach      case GL_MAP1_NORMAL:
908afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach         ctx->EvalMap.Map1Normal.Order = order;
909afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach	 ctx->EvalMap.Map1Normal.u1 = u1;
910afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach	 ctx->EvalMap.Map1Normal.u2 = u2;
911afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach	 ctx->EvalMap.Map1Normal.du = 1.0 / (u2 - u1);
912afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach	 if (ctx->EvalMap.Map1Normal.Points
913afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach             && !ctx->EvalMap.Map1Normal.Retain) {
914afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach	    free( ctx->EvalMap.Map1Normal.Points );
915afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach	 }
916afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach	 ctx->EvalMap.Map1Normal.Points = (GLfloat *) points;
917afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach	 ctx->EvalMap.Map1Normal.Retain = retain;
918afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach	 break;
919afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach      case GL_MAP1_TEXTURE_COORD_1:
920afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach         ctx->EvalMap.Map1Texture1.Order = order;
921afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach	 ctx->EvalMap.Map1Texture1.u1 = u1;
922afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach	 ctx->EvalMap.Map1Texture1.u2 = u2;
923afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach	 ctx->EvalMap.Map1Texture1.du = 1.0 / (u2 - u1);
924afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach	 if (ctx->EvalMap.Map1Texture1.Points
925afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach             && !ctx->EvalMap.Map1Texture1.Retain) {
926afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach	    free( ctx->EvalMap.Map1Texture1.Points );
927afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach	 }
928afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach	 ctx->EvalMap.Map1Texture1.Points = (GLfloat *) points;
929afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach	 ctx->EvalMap.Map1Texture1.Retain = retain;
930afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach	 break;
931afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach      case GL_MAP1_TEXTURE_COORD_2:
932afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach         ctx->EvalMap.Map1Texture2.Order = order;
933afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach	 ctx->EvalMap.Map1Texture2.u1 = u1;
934afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach	 ctx->EvalMap.Map1Texture2.u2 = u2;
935afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach	 ctx->EvalMap.Map1Texture2.du = 1.0 / (u2 - u1);
936afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach	 if (ctx->EvalMap.Map1Texture2.Points
937afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach             && !ctx->EvalMap.Map1Texture2.Retain) {
938afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach	    free( ctx->EvalMap.Map1Texture2.Points );
939afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach	 }
940afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach	 ctx->EvalMap.Map1Texture2.Points = (GLfloat *) points;
941afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach	 ctx->EvalMap.Map1Texture2.Retain = retain;
942afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach	 break;
943afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach      case GL_MAP1_TEXTURE_COORD_3:
944afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach         ctx->EvalMap.Map1Texture3.Order = order;
945afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach	 ctx->EvalMap.Map1Texture3.u1 = u1;
946afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach	 ctx->EvalMap.Map1Texture3.u2 = u2;
947afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach	 ctx->EvalMap.Map1Texture3.du = 1.0 / (u2 - u1);
948afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach	 if (ctx->EvalMap.Map1Texture3.Points
949afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach             && !ctx->EvalMap.Map1Texture3.Retain) {
950afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach	    free( ctx->EvalMap.Map1Texture3.Points );
951afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach	 }
952afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach	 ctx->EvalMap.Map1Texture3.Points = (GLfloat *) points;
953afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach	 ctx->EvalMap.Map1Texture3.Retain = retain;
954afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach	 break;
955afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach      case GL_MAP1_TEXTURE_COORD_4:
956afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach         ctx->EvalMap.Map1Texture4.Order = order;
957afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach	 ctx->EvalMap.Map1Texture4.u1 = u1;
958afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach	 ctx->EvalMap.Map1Texture4.u2 = u2;
959afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach	 ctx->EvalMap.Map1Texture4.du = 1.0 / (u2 - u1);
960afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach	 if (ctx->EvalMap.Map1Texture4.Points
961afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach             && !ctx->EvalMap.Map1Texture4.Retain) {
962afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach	    free( ctx->EvalMap.Map1Texture4.Points );
963afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach	 }
964afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach	 ctx->EvalMap.Map1Texture4.Points = (GLfloat *) points;
965afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach	 ctx->EvalMap.Map1Texture4.Retain = retain;
966afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach	 break;
967afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach      default:
968afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach         gl_error( ctx, GL_INVALID_ENUM, "glMap1(target)" );
969afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach   }
970afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach}
971afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach
972afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach
973afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach
974afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach
975afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach/*
976afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach * Note that the array of control points must be 'unpacked' at this time.
977afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach * Input:  retain - if TRUE, this control point data is also in a display
978afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach *                  list and can't be freed until the list is freed.
979afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach */
980afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlachvoid gl_Map2f( GLcontext* ctx, GLenum target,
981afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach	      GLfloat u1, GLfloat u2, GLint ustride, GLint uorder,
982afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach	      GLfloat v1, GLfloat v2, GLint vstride, GLint vorder,
983afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach	      const GLfloat *points, GLboolean retain )
984afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach{
985afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach   GLint k;
986afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach
987afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach   ASSERT_OUTSIDE_BEGIN_END_AND_FLUSH(ctx, "glMap2");
988afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach
989afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach   if (u1==u2) {
990afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach      gl_error( ctx, GL_INVALID_VALUE, "glMap2(u1,u2)" );
991afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach      return;
992afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach   }
993afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach
994afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach   if (v1==v2) {
995afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach      gl_error( ctx, GL_INVALID_VALUE, "glMap2(v1,v2)" );
996afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach      return;
997afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach   }
998afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach
999afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach   if (uorder<1 || uorder>MAX_EVAL_ORDER) {
1000afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach      gl_error( ctx, GL_INVALID_VALUE, "glMap2(uorder)" );
1001afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach      return;
1002afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach   }
1003afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach
1004afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach   if (vorder<1 || vorder>MAX_EVAL_ORDER) {
1005afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach      gl_error( ctx, GL_INVALID_VALUE, "glMap2(vorder)" );
1006afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach      return;
1007afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach   }
1008afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach
1009afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach   k = components( target );
1010afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach   if (k==0) {
1011afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach      gl_error( ctx, GL_INVALID_ENUM, "glMap2(target)" );
1012afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach   }
1013afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach
1014afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach   if (ustride < k) {
1015afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach      gl_error( ctx, GL_INVALID_VALUE, "glMap2(ustride)" );
1016afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach      return;
1017afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach   }
1018afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach   if (vstride < k) {
1019afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach      gl_error( ctx, GL_INVALID_VALUE, "glMap2(vstride)" );
1020afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach      return;
1021afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach   }
1022afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach
1023afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach   switch (target) {
1024afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach      case GL_MAP2_VERTEX_3:
1025afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach         ctx->EvalMap.Map2Vertex3.Uorder = uorder;
1026afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach	 ctx->EvalMap.Map2Vertex3.u1 = u1;
1027afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach	 ctx->EvalMap.Map2Vertex3.u2 = u2;
1028afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach	 ctx->EvalMap.Map2Vertex3.du = 1.0 / (u2 - u1);
1029afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach         ctx->EvalMap.Map2Vertex3.Vorder = vorder;
1030afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach	 ctx->EvalMap.Map2Vertex3.v1 = v1;
1031afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach	 ctx->EvalMap.Map2Vertex3.v2 = v2;
1032afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach	 ctx->EvalMap.Map2Vertex3.dv = 1.0 / (v2 - v1);
1033afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach	 if (ctx->EvalMap.Map2Vertex3.Points
1034afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach             && !ctx->EvalMap.Map2Vertex3.Retain) {
1035afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach	    free( ctx->EvalMap.Map2Vertex3.Points );
1036afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach	 }
1037afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach	 ctx->EvalMap.Map2Vertex3.Retain = retain;
1038afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach	 ctx->EvalMap.Map2Vertex3.Points = (GLfloat *) points;
1039afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach	 break;
1040afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach      case GL_MAP2_VERTEX_4:
1041afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach         ctx->EvalMap.Map2Vertex4.Uorder = uorder;
1042afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach	 ctx->EvalMap.Map2Vertex4.u1 = u1;
1043afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach	 ctx->EvalMap.Map2Vertex4.u2 = u2;
1044afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach	 ctx->EvalMap.Map2Vertex4.du = 1.0 / (u2 - u1);
1045afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach         ctx->EvalMap.Map2Vertex4.Vorder = vorder;
1046afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach	 ctx->EvalMap.Map2Vertex4.v1 = v1;
1047afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach	 ctx->EvalMap.Map2Vertex4.v2 = v2;
1048afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach	 ctx->EvalMap.Map2Vertex4.dv = 1.0 / (v2 - v1);
1049afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach	 if (ctx->EvalMap.Map2Vertex4.Points
1050afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach             && !ctx->EvalMap.Map2Vertex4.Retain) {
1051afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach	    free( ctx->EvalMap.Map2Vertex4.Points );
1052afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach	 }
1053afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach	 ctx->EvalMap.Map2Vertex4.Points = (GLfloat *) points;
1054afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach	 ctx->EvalMap.Map2Vertex4.Retain = retain;
1055afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach	 break;
1056afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach      case GL_MAP2_INDEX:
1057afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach         ctx->EvalMap.Map2Index.Uorder = uorder;
1058afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach	 ctx->EvalMap.Map2Index.u1 = u1;
1059afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach	 ctx->EvalMap.Map2Index.u2 = u2;
1060afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach	 ctx->EvalMap.Map2Index.du = 1.0 / (u2 - u1);
1061afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach         ctx->EvalMap.Map2Index.Vorder = vorder;
1062afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach	 ctx->EvalMap.Map2Index.v1 = v1;
1063afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach	 ctx->EvalMap.Map2Index.v2 = v2;
1064afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach	 ctx->EvalMap.Map2Index.dv = 1.0 / (v2 - v1);
1065afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach	 if (ctx->EvalMap.Map2Index.Points
1066afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach             && !ctx->EvalMap.Map2Index.Retain) {
1067afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach	    free( ctx->EvalMap.Map2Index.Points );
1068afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach	 }
1069afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach	 ctx->EvalMap.Map2Index.Retain = retain;
1070afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach	 ctx->EvalMap.Map2Index.Points = (GLfloat *) points;
1071afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach	 break;
1072afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach      case GL_MAP2_COLOR_4:
1073afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach         ctx->EvalMap.Map2Color4.Uorder = uorder;
1074afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach	 ctx->EvalMap.Map2Color4.u1 = u1;
1075afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach	 ctx->EvalMap.Map2Color4.u2 = u2;
1076afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach	 ctx->EvalMap.Map2Color4.du = 1.0 / (u2 - u1);
1077afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach         ctx->EvalMap.Map2Color4.Vorder = vorder;
1078afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach	 ctx->EvalMap.Map2Color4.v1 = v1;
1079afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach	 ctx->EvalMap.Map2Color4.v2 = v2;
1080afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach	 ctx->EvalMap.Map2Color4.dv = 1.0 / (v2 - v1);
1081afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach	 if (ctx->EvalMap.Map2Color4.Points
1082afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach             && !ctx->EvalMap.Map2Color4.Retain) {
1083afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach	    free( ctx->EvalMap.Map2Color4.Points );
1084afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach	 }
1085afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach	 ctx->EvalMap.Map2Color4.Retain = retain;
1086afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach	 ctx->EvalMap.Map2Color4.Points = (GLfloat *) points;
1087afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach	 break;
1088afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach      case GL_MAP2_NORMAL:
1089afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach         ctx->EvalMap.Map2Normal.Uorder = uorder;
1090afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach	 ctx->EvalMap.Map2Normal.u1 = u1;
1091afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach	 ctx->EvalMap.Map2Normal.u2 = u2;
1092afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach	 ctx->EvalMap.Map2Normal.du = 1.0 / (u2 - u1);
1093afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach         ctx->EvalMap.Map2Normal.Vorder = vorder;
1094afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach	 ctx->EvalMap.Map2Normal.v1 = v1;
1095afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach	 ctx->EvalMap.Map2Normal.v2 = v2;
1096afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach	 ctx->EvalMap.Map2Normal.dv = 1.0 / (v2 - v1);
1097afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach	 if (ctx->EvalMap.Map2Normal.Points
1098afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach             && !ctx->EvalMap.Map2Normal.Retain) {
1099afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach	    free( ctx->EvalMap.Map2Normal.Points );
1100afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach	 }
1101afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach	 ctx->EvalMap.Map2Normal.Retain = retain;
1102afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach	 ctx->EvalMap.Map2Normal.Points = (GLfloat *) points;
1103afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach	 break;
1104afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach      case GL_MAP2_TEXTURE_COORD_1:
1105afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach         ctx->EvalMap.Map2Texture1.Uorder = uorder;
1106afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach	 ctx->EvalMap.Map2Texture1.u1 = u1;
1107afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach	 ctx->EvalMap.Map2Texture1.u2 = u2;
1108afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach	 ctx->EvalMap.Map2Texture1.du = 1.0 / (u2 - u1);
1109afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach         ctx->EvalMap.Map2Texture1.Vorder = vorder;
1110afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach	 ctx->EvalMap.Map2Texture1.v1 = v1;
1111afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach	 ctx->EvalMap.Map2Texture1.v2 = v2;
1112afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach	 ctx->EvalMap.Map2Texture1.dv = 1.0 / (v2 - v1);
1113afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach	 if (ctx->EvalMap.Map2Texture1.Points
1114afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach             && !ctx->EvalMap.Map2Texture1.Retain) {
1115afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach	    free( ctx->EvalMap.Map2Texture1.Points );
1116afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach	 }
1117afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach	 ctx->EvalMap.Map2Texture1.Retain = retain;
1118afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach	 ctx->EvalMap.Map2Texture1.Points = (GLfloat *) points;
1119afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach	 break;
1120afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach      case GL_MAP2_TEXTURE_COORD_2:
1121afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach         ctx->EvalMap.Map2Texture2.Uorder = uorder;
1122afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach	 ctx->EvalMap.Map2Texture2.u1 = u1;
1123afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach	 ctx->EvalMap.Map2Texture2.u2 = u2;
1124afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach	 ctx->EvalMap.Map2Texture2.du = 1.0 / (u2 - u1);
1125afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach         ctx->EvalMap.Map2Texture2.Vorder = vorder;
1126afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach	 ctx->EvalMap.Map2Texture2.v1 = v1;
1127afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach	 ctx->EvalMap.Map2Texture2.v2 = v2;
1128afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach	 ctx->EvalMap.Map2Texture2.dv = 1.0 / (v2 - v1);
1129afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach	 if (ctx->EvalMap.Map2Texture2.Points
1130afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach             && !ctx->EvalMap.Map2Texture2.Retain) {
1131afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach	    free( ctx->EvalMap.Map2Texture2.Points );
1132afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach	 }
1133afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach	 ctx->EvalMap.Map2Texture2.Retain = retain;
1134afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach	 ctx->EvalMap.Map2Texture2.Points = (GLfloat *) points;
1135afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach	 break;
1136afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach      case GL_MAP2_TEXTURE_COORD_3:
1137afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach         ctx->EvalMap.Map2Texture3.Uorder = uorder;
1138afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach	 ctx->EvalMap.Map2Texture3.u1 = u1;
1139afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach	 ctx->EvalMap.Map2Texture3.u2 = u2;
1140afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach	 ctx->EvalMap.Map2Texture3.du = 1.0 / (u2 - u1);
1141afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach         ctx->EvalMap.Map2Texture3.Vorder = vorder;
1142afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach	 ctx->EvalMap.Map2Texture3.v1 = v1;
1143afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach	 ctx->EvalMap.Map2Texture3.v2 = v2;
1144afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach	 ctx->EvalMap.Map2Texture3.dv = 1.0 / (v2 - v1);
1145afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach	 if (ctx->EvalMap.Map2Texture3.Points
1146afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach             && !ctx->EvalMap.Map2Texture3.Retain) {
1147afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach	    free( ctx->EvalMap.Map2Texture3.Points );
1148afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach	 }
1149afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach	 ctx->EvalMap.Map2Texture3.Retain = retain;
1150afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach	 ctx->EvalMap.Map2Texture3.Points = (GLfloat *) points;
1151afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach	 break;
1152afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach      case GL_MAP2_TEXTURE_COORD_4:
1153afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach         ctx->EvalMap.Map2Texture4.Uorder = uorder;
1154afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach	 ctx->EvalMap.Map2Texture4.u1 = u1;
1155afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach	 ctx->EvalMap.Map2Texture4.u2 = u2;
1156afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach	 ctx->EvalMap.Map2Texture4.du = 1.0 / (u2 - u1);
1157afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach         ctx->EvalMap.Map2Texture4.Vorder = vorder;
1158afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach	 ctx->EvalMap.Map2Texture4.v1 = v1;
1159afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach	 ctx->EvalMap.Map2Texture4.v2 = v2;
1160afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach	 ctx->EvalMap.Map2Texture4.dv = 1.0 / (v2 - v1);
1161afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach	 if (ctx->EvalMap.Map2Texture4.Points
1162afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach             && !ctx->EvalMap.Map2Texture4.Retain) {
1163afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach	    free( ctx->EvalMap.Map2Texture4.Points );
1164afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach	 }
1165afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach	 ctx->EvalMap.Map2Texture4.Retain = retain;
1166afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach	 ctx->EvalMap.Map2Texture4.Points = (GLfloat *) points;
1167afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach	 break;
1168afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach      default:
1169afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach         gl_error( ctx, GL_INVALID_ENUM, "glMap2(target)" );
1170afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach   }
1171afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach}
1172afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach
1173afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach
1174afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach
1175afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach
1176afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach
1177afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlachvoid gl_GetMapdv( GLcontext* ctx, GLenum target, GLenum query, GLdouble *v )
1178afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach{
1179afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach   GLint i, n;
1180afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach   GLfloat *data;
1181afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach
1182afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach   switch (query) {
1183afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach      case GL_COEFF:
1184afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach	 switch (target) {
1185afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach	    case GL_MAP1_COLOR_4:
1186afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach	       data = ctx->EvalMap.Map1Color4.Points;
1187afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach	       n = ctx->EvalMap.Map1Color4.Order * 4;
1188afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach	       break;
1189afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach	    case GL_MAP1_INDEX:
1190afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach	       data = ctx->EvalMap.Map1Index.Points;
1191afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach	       n = ctx->EvalMap.Map1Index.Order;
1192afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach	       break;
1193afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach	    case GL_MAP1_NORMAL:
1194afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach	       data = ctx->EvalMap.Map1Normal.Points;
1195afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach	       n = ctx->EvalMap.Map1Normal.Order * 3;
1196afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach	       break;
1197afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach	    case GL_MAP1_TEXTURE_COORD_1:
1198afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach	       data = ctx->EvalMap.Map1Texture1.Points;
1199afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach	       n = ctx->EvalMap.Map1Texture1.Order * 1;
1200afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach	       break;
1201afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach	    case GL_MAP1_TEXTURE_COORD_2:
1202afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach	       data = ctx->EvalMap.Map1Texture2.Points;
1203afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach	       n = ctx->EvalMap.Map1Texture2.Order * 2;
1204afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach	       break;
1205afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach	    case GL_MAP1_TEXTURE_COORD_3:
1206afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach	       data = ctx->EvalMap.Map1Texture3.Points;
1207afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach	       n = ctx->EvalMap.Map1Texture3.Order * 3;
1208afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach	       break;
1209afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach	    case GL_MAP1_TEXTURE_COORD_4:
1210afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach	       data = ctx->EvalMap.Map1Texture4.Points;
1211afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach	       n = ctx->EvalMap.Map1Texture4.Order * 4;
1212afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach	       break;
1213afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach	    case GL_MAP1_VERTEX_3:
1214afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach	       data = ctx->EvalMap.Map1Vertex3.Points;
1215afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach	       n = ctx->EvalMap.Map1Vertex3.Order * 3;
1216afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach	       break;
1217afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach	    case GL_MAP1_VERTEX_4:
1218afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach	       data = ctx->EvalMap.Map1Vertex4.Points;
1219afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach	       n = ctx->EvalMap.Map1Vertex4.Order * 4;
1220afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach	       break;
1221afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach	    case GL_MAP2_COLOR_4:
1222afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach	       data = ctx->EvalMap.Map2Color4.Points;
1223afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach	       n = ctx->EvalMap.Map2Color4.Uorder
1224afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                 * ctx->EvalMap.Map2Color4.Vorder * 4;
1225afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach	       break;
1226afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach	    case GL_MAP2_INDEX:
1227afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach	       data = ctx->EvalMap.Map2Index.Points;
1228afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach	       n = ctx->EvalMap.Map2Index.Uorder
1229afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                 * ctx->EvalMap.Map2Index.Vorder;
1230afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach	       break;
1231afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach	    case GL_MAP2_NORMAL:
1232afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach	       data = ctx->EvalMap.Map2Normal.Points;
1233afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach	       n = ctx->EvalMap.Map2Normal.Uorder
1234afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                 * ctx->EvalMap.Map2Normal.Vorder * 3;
1235afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach	       break;
1236afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach	    case GL_MAP2_TEXTURE_COORD_1:
1237afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach	       data = ctx->EvalMap.Map2Texture1.Points;
1238afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach	       n = ctx->EvalMap.Map2Texture1.Uorder
1239afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                 * ctx->EvalMap.Map2Texture1.Vorder * 1;
1240afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach	       break;
1241afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach	    case GL_MAP2_TEXTURE_COORD_2:
1242afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach	       data = ctx->EvalMap.Map2Texture2.Points;
1243afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach	       n = ctx->EvalMap.Map2Texture2.Uorder
1244afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                 * ctx->EvalMap.Map2Texture2.Vorder * 2;
1245afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach	       break;
1246afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach	    case GL_MAP2_TEXTURE_COORD_3:
1247afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach	       data = ctx->EvalMap.Map2Texture3.Points;
1248afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach	       n = ctx->EvalMap.Map2Texture3.Uorder
1249afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                 * ctx->EvalMap.Map2Texture3.Vorder * 3;
1250afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach	       break;
1251afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach	    case GL_MAP2_TEXTURE_COORD_4:
1252afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach	       data = ctx->EvalMap.Map2Texture4.Points;
1253afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach	       n = ctx->EvalMap.Map2Texture4.Uorder
1254afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                 * ctx->EvalMap.Map2Texture4.Vorder * 4;
1255afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach	       break;
1256afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach	    case GL_MAP2_VERTEX_3:
1257afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach	       data = ctx->EvalMap.Map2Vertex3.Points;
1258afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach	       n = ctx->EvalMap.Map2Vertex3.Uorder
1259afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                 * ctx->EvalMap.Map2Vertex3.Vorder * 3;
1260afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach	       break;
1261afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach	    case GL_MAP2_VERTEX_4:
1262afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach	       data = ctx->EvalMap.Map2Vertex4.Points;
1263afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach	       n = ctx->EvalMap.Map2Vertex4.Uorder
1264afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                 * ctx->EvalMap.Map2Vertex4.Vorder * 4;
1265afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach	       break;
1266afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach	    default:
1267afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach	       gl_error( ctx, GL_INVALID_ENUM, "glGetMapdv(target)" );
1268afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach	       return;
1269afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach	 }
1270afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach	 if (data) {
1271afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach	    for (i=0;i<n;i++) {
1272afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach	       v[i] = data[i];
1273afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach	    }
1274afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach	 }
1275afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach         break;
1276afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach      case GL_ORDER:
1277afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach	 switch (target) {
1278afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach	    case GL_MAP1_COLOR_4:
1279afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach	       *v = ctx->EvalMap.Map1Color4.Order;
1280afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach	       break;
1281afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach	    case GL_MAP1_INDEX:
1282afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach	       *v = ctx->EvalMap.Map1Index.Order;
1283afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach	       break;
1284afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach	    case GL_MAP1_NORMAL:
1285afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach	       *v = ctx->EvalMap.Map1Normal.Order;
1286afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach	       break;
1287afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach	    case GL_MAP1_TEXTURE_COORD_1:
1288afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach	       *v = ctx->EvalMap.Map1Texture1.Order;
1289afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach	       break;
1290afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach	    case GL_MAP1_TEXTURE_COORD_2:
1291afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach	       *v = ctx->EvalMap.Map1Texture2.Order;
1292afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach	       break;
1293afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach	    case GL_MAP1_TEXTURE_COORD_3:
1294afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach	       *v = ctx->EvalMap.Map1Texture3.Order;
1295afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach	       break;
1296afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach	    case GL_MAP1_TEXTURE_COORD_4:
1297afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach	       *v = ctx->EvalMap.Map1Texture4.Order;
1298afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach	       break;
1299afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach	    case GL_MAP1_VERTEX_3:
1300afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach	       *v = ctx->EvalMap.Map1Vertex3.Order;
1301afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach	       break;
1302afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach	    case GL_MAP1_VERTEX_4:
1303afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach	       *v = ctx->EvalMap.Map1Vertex4.Order;
1304afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach	       break;
1305afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach	    case GL_MAP2_COLOR_4:
1306afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach	       v[0] = ctx->EvalMap.Map2Color4.Uorder;
1307afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach	       v[1] = ctx->EvalMap.Map2Color4.Vorder;
1308afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach	       break;
1309afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach	    case GL_MAP2_INDEX:
1310afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach	       v[0] = ctx->EvalMap.Map2Index.Uorder;
1311afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach	       v[1] = ctx->EvalMap.Map2Index.Vorder;
1312afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach	       break;
1313afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach	    case GL_MAP2_NORMAL:
1314afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach	       v[0] = ctx->EvalMap.Map2Normal.Uorder;
1315afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach	       v[1] = ctx->EvalMap.Map2Normal.Vorder;
1316afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach	       break;
1317afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach	    case GL_MAP2_TEXTURE_COORD_1:
1318afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach	       v[0] = ctx->EvalMap.Map2Texture1.Uorder;
1319afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach	       v[1] = ctx->EvalMap.Map2Texture1.Vorder;
1320afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach	       break;
1321afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach	    case GL_MAP2_TEXTURE_COORD_2:
1322afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach	       v[0] = ctx->EvalMap.Map2Texture2.Uorder;
1323afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach	       v[1] = ctx->EvalMap.Map2Texture2.Vorder;
1324afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach	       break;
1325afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach	    case GL_MAP2_TEXTURE_COORD_3:
1326afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach	       v[0] = ctx->EvalMap.Map2Texture3.Uorder;
1327afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach	       v[1] = ctx->EvalMap.Map2Texture3.Vorder;
1328afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach	       break;
1329afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach	    case GL_MAP2_TEXTURE_COORD_4:
1330afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach	       v[0] = ctx->EvalMap.Map2Texture4.Uorder;
1331afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach	       v[1] = ctx->EvalMap.Map2Texture4.Vorder;
1332afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach	       break;
1333afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach	    case GL_MAP2_VERTEX_3:
1334afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach	       v[0] = ctx->EvalMap.Map2Vertex3.Uorder;
1335afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach	       v[1] = ctx->EvalMap.Map2Vertex3.Vorder;
1336afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach	       break;
1337afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach	    case GL_MAP2_VERTEX_4:
1338afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach	       v[0] = ctx->EvalMap.Map2Vertex4.Uorder;
1339afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach	       v[1] = ctx->EvalMap.Map2Vertex4.Vorder;
1340afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach	       break;
1341afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach	    default:
1342afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach	       gl_error( ctx, GL_INVALID_ENUM, "glGetMapdv(target)" );
1343afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach	       return;
1344afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach	 }
1345afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach         break;
1346afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach      case GL_DOMAIN:
1347afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach	 switch (target) {
1348afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach	    case GL_MAP1_COLOR_4:
1349afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach	       v[0] = ctx->EvalMap.Map1Color4.u1;
1350afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach	       v[1] = ctx->EvalMap.Map1Color4.u2;
1351afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach	       break;
1352afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach	    case GL_MAP1_INDEX:
1353afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach	       v[0] = ctx->EvalMap.Map1Index.u1;
1354afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach	       v[1] = ctx->EvalMap.Map1Index.u2;
1355afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach	       break;
1356afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach	    case GL_MAP1_NORMAL:
1357afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach	       v[0] = ctx->EvalMap.Map1Normal.u1;
1358afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach	       v[1] = ctx->EvalMap.Map1Normal.u2;
1359afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach	       break;
1360afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach	    case GL_MAP1_TEXTURE_COORD_1:
1361afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach	       v[0] = ctx->EvalMap.Map1Texture1.u1;
1362afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach	       v[1] = ctx->EvalMap.Map1Texture1.u2;
1363afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach	       break;
1364afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach	    case GL_MAP1_TEXTURE_COORD_2:
1365afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach	       v[0] = ctx->EvalMap.Map1Texture2.u1;
1366afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach	       v[1] = ctx->EvalMap.Map1Texture2.u2;
1367afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach	       break;
1368afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach	    case GL_MAP1_TEXTURE_COORD_3:
1369afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach	       v[0] = ctx->EvalMap.Map1Texture3.u1;
1370afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach	       v[1] = ctx->EvalMap.Map1Texture3.u2;
1371afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach	       break;
1372afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach	    case GL_MAP1_TEXTURE_COORD_4:
1373afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach	       v[0] = ctx->EvalMap.Map1Texture4.u1;
1374afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach	       v[1] = ctx->EvalMap.Map1Texture4.u2;
1375afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach	       break;
1376afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach	    case GL_MAP1_VERTEX_3:
1377afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach	       v[0] = ctx->EvalMap.Map1Vertex3.u1;
1378afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach	       v[1] = ctx->EvalMap.Map1Vertex3.u2;
1379afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach	       break;
1380afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach	    case GL_MAP1_VERTEX_4:
1381afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach	       v[0] = ctx->EvalMap.Map1Vertex4.u1;
1382afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach	       v[1] = ctx->EvalMap.Map1Vertex4.u2;
1383afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach	       break;
1384afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach	    case GL_MAP2_COLOR_4:
1385afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach	       v[0] = ctx->EvalMap.Map2Color4.u1;
1386afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach	       v[1] = ctx->EvalMap.Map2Color4.u2;
1387afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach	       v[2] = ctx->EvalMap.Map2Color4.v1;
1388afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach	       v[3] = ctx->EvalMap.Map2Color4.v2;
1389afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach	       break;
1390afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach	    case GL_MAP2_INDEX:
1391afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach	       v[0] = ctx->EvalMap.Map2Index.u1;
1392afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach	       v[1] = ctx->EvalMap.Map2Index.u2;
1393afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach	       v[2] = ctx->EvalMap.Map2Index.v1;
1394afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach	       v[3] = ctx->EvalMap.Map2Index.v2;
1395afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach	       break;
1396afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach	    case GL_MAP2_NORMAL:
1397afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach	       v[0] = ctx->EvalMap.Map2Normal.u1;
1398afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach	       v[1] = ctx->EvalMap.Map2Normal.u2;
1399afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach	       v[2] = ctx->EvalMap.Map2Normal.v1;
1400afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach	       v[3] = ctx->EvalMap.Map2Normal.v2;
1401afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach	       break;
1402afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach	    case GL_MAP2_TEXTURE_COORD_1:
1403afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach	       v[0] = ctx->EvalMap.Map2Texture1.u1;
1404afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach	       v[1] = ctx->EvalMap.Map2Texture1.u2;
1405afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach	       v[2] = ctx->EvalMap.Map2Texture1.v1;
1406afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach	       v[3] = ctx->EvalMap.Map2Texture1.v2;
1407afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach	       break;
1408afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach	    case GL_MAP2_TEXTURE_COORD_2:
1409afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach	       v[0] = ctx->EvalMap.Map2Texture2.u1;
1410afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach	       v[1] = ctx->EvalMap.Map2Texture2.u2;
1411afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach	       v[2] = ctx->EvalMap.Map2Texture2.v1;
1412afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach	       v[3] = ctx->EvalMap.Map2Texture2.v2;
1413afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach	       break;
1414afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach	    case GL_MAP2_TEXTURE_COORD_3:
1415afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach	       v[0] = ctx->EvalMap.Map2Texture3.u1;
1416afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach	       v[1] = ctx->EvalMap.Map2Texture3.u2;
1417afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach	       v[2] = ctx->EvalMap.Map2Texture3.v1;
1418afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach	       v[3] = ctx->EvalMap.Map2Texture3.v2;
1419afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach	       break;
1420afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach	    case GL_MAP2_TEXTURE_COORD_4:
1421afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach	       v[0] = ctx->EvalMap.Map2Texture4.u1;
1422afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach	       v[1] = ctx->EvalMap.Map2Texture4.u2;
1423afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach	       v[2] = ctx->EvalMap.Map2Texture4.v1;
1424afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach	       v[3] = ctx->EvalMap.Map2Texture4.v2;
1425afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach	       break;
1426afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach	    case GL_MAP2_VERTEX_3:
1427afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach	       v[0] = ctx->EvalMap.Map2Vertex3.u1;
1428afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach	       v[1] = ctx->EvalMap.Map2Vertex3.u2;
1429afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach	       v[2] = ctx->EvalMap.Map2Vertex3.v1;
1430afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach	       v[3] = ctx->EvalMap.Map2Vertex3.v2;
1431afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach	       break;
1432afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach	    case GL_MAP2_VERTEX_4:
1433afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach	       v[0] = ctx->EvalMap.Map2Vertex4.u1;
1434afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach	       v[1] = ctx->EvalMap.Map2Vertex4.u2;
1435afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach	       v[2] = ctx->EvalMap.Map2Vertex4.v1;
1436afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach	       v[3] = ctx->EvalMap.Map2Vertex4.v2;
1437afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach	       break;
1438afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach	    default:
1439afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach	       gl_error( ctx, GL_INVALID_ENUM, "glGetMapdv(target)" );
1440afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach	 }
1441afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach         break;
1442afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach      default:
1443afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach         gl_error( ctx, GL_INVALID_ENUM, "glGetMapdv(query)" );
1444afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach   }
1445afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach}
1446afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach
1447afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach
1448afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlachvoid gl_GetMapfv( GLcontext* ctx, GLenum target, GLenum query, GLfloat *v )
1449afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach{
1450afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach   GLint i, n;
1451afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach   GLfloat *data;
1452afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach
1453afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach   switch (query) {
1454afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach      case GL_COEFF:
1455afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach	 switch (target) {
1456afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach	    case GL_MAP1_COLOR_4:
1457afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach	       data = ctx->EvalMap.Map1Color4.Points;
1458afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach	       n = ctx->EvalMap.Map1Color4.Order * 4;
1459afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach	       break;
1460afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach	    case GL_MAP1_INDEX:
1461afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach	       data = ctx->EvalMap.Map1Index.Points;
1462afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach	       n = ctx->EvalMap.Map1Index.Order;
1463afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach	       break;
1464afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach	    case GL_MAP1_NORMAL:
1465afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach	       data = ctx->EvalMap.Map1Normal.Points;
1466afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach	       n = ctx->EvalMap.Map1Normal.Order * 3;
1467afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach	       break;
1468afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach	    case GL_MAP1_TEXTURE_COORD_1:
1469afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach	       data = ctx->EvalMap.Map1Texture1.Points;
1470afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach	       n = ctx->EvalMap.Map1Texture1.Order * 1;
1471afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach	       break;
1472afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach	    case GL_MAP1_TEXTURE_COORD_2:
1473afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach	       data = ctx->EvalMap.Map1Texture2.Points;
1474afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach	       n = ctx->EvalMap.Map1Texture2.Order * 2;
1475afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach	       break;
1476afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach	    case GL_MAP1_TEXTURE_COORD_3:
1477afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach	       data = ctx->EvalMap.Map1Texture3.Points;
1478afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach	       n = ctx->EvalMap.Map1Texture3.Order * 3;
1479afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach	       break;
1480afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach	    case GL_MAP1_TEXTURE_COORD_4:
1481afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach	       data = ctx->EvalMap.Map1Texture4.Points;
1482afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach	       n = ctx->EvalMap.Map1Texture4.Order * 4;
1483afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach	       break;
1484afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach	    case GL_MAP1_VERTEX_3:
1485afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach	       data = ctx->EvalMap.Map1Vertex3.Points;
1486afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach	       n = ctx->EvalMap.Map1Vertex3.Order * 3;
1487afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach	       break;
1488afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach	    case GL_MAP1_VERTEX_4:
1489afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach	       data = ctx->EvalMap.Map1Vertex4.Points;
1490afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach	       n = ctx->EvalMap.Map1Vertex4.Order * 4;
1491afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach	       break;
1492afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach	    case GL_MAP2_COLOR_4:
1493afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach	       data = ctx->EvalMap.Map2Color4.Points;
1494afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach	       n = ctx->EvalMap.Map2Color4.Uorder
1495afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                 * ctx->EvalMap.Map2Color4.Vorder * 4;
1496afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach	       break;
1497afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach	    case GL_MAP2_INDEX:
1498afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach	       data = ctx->EvalMap.Map2Index.Points;
1499afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach	       n = ctx->EvalMap.Map2Index.Uorder
1500afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                 * ctx->EvalMap.Map2Index.Vorder;
1501afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach	       break;
1502afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach	    case GL_MAP2_NORMAL:
1503afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach	       data = ctx->EvalMap.Map2Normal.Points;
1504afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach	       n = ctx->EvalMap.Map2Normal.Uorder
1505afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                 * ctx->EvalMap.Map2Normal.Vorder * 3;
1506afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach	       break;
1507afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach	    case GL_MAP2_TEXTURE_COORD_1:
1508afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach	       data = ctx->EvalMap.Map2Texture1.Points;
1509afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach	       n = ctx->EvalMap.Map2Texture1.Uorder
1510afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                 * ctx->EvalMap.Map2Texture1.Vorder * 1;
1511afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach	       break;
1512afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach	    case GL_MAP2_TEXTURE_COORD_2:
1513afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach	       data = ctx->EvalMap.Map2Texture2.Points;
1514afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach	       n = ctx->EvalMap.Map2Texture2.Uorder
1515afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                 * ctx->EvalMap.Map2Texture2.Vorder * 2;
1516afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach	       break;
1517afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach	    case GL_MAP2_TEXTURE_COORD_3:
1518afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach	       data = ctx->EvalMap.Map2Texture3.Points;
1519afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach	       n = ctx->EvalMap.Map2Texture3.Uorder
1520afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                 * ctx->EvalMap.Map2Texture3.Vorder * 3;
1521afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach	       break;
1522afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach	    case GL_MAP2_TEXTURE_COORD_4:
1523afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach	       data = ctx->EvalMap.Map2Texture4.Points;
1524afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach	       n = ctx->EvalMap.Map2Texture4.Uorder
1525afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                 * ctx->EvalMap.Map2Texture4.Vorder * 4;
1526afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach	       break;
1527afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach	    case GL_MAP2_VERTEX_3:
1528afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach	       data = ctx->EvalMap.Map2Vertex3.Points;
1529afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach	       n = ctx->EvalMap.Map2Vertex3.Uorder
1530afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                 * ctx->EvalMap.Map2Vertex3.Vorder * 3;
1531afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach	       break;
1532afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach	    case GL_MAP2_VERTEX_4:
1533afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach	       data = ctx->EvalMap.Map2Vertex4.Points;
1534afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach	       n = ctx->EvalMap.Map2Vertex4.Uorder
1535afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                 * ctx->EvalMap.Map2Vertex4.Vorder * 4;
1536afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach	       break;
1537afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach	    default:
1538afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach	       gl_error( ctx, GL_INVALID_ENUM, "glGetMapfv(target)" );
1539afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach	       return;
1540afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach	 }
1541afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach	 if (data) {
1542afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach	    for (i=0;i<n;i++) {
1543afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach	       v[i] = data[i];
1544afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach	    }
1545afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach	 }
1546afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach         break;
1547afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach      case GL_ORDER:
1548afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach	 switch (target) {
1549afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach	    case GL_MAP1_COLOR_4:
1550afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach	       *v = ctx->EvalMap.Map1Color4.Order;
1551afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach	       break;
1552afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach	    case GL_MAP1_INDEX:
1553afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach	       *v = ctx->EvalMap.Map1Index.Order;
1554afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach	       break;
1555afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach	    case GL_MAP1_NORMAL:
1556afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach	       *v = ctx->EvalMap.Map1Normal.Order;
1557afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach	       break;
1558afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach	    case GL_MAP1_TEXTURE_COORD_1:
1559afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach	       *v = ctx->EvalMap.Map1Texture1.Order;
1560afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach	       break;
1561afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach	    case GL_MAP1_TEXTURE_COORD_2:
1562afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach	       *v = ctx->EvalMap.Map1Texture2.Order;
1563afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach	       break;
1564afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach	    case GL_MAP1_TEXTURE_COORD_3:
1565afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach	       *v = ctx->EvalMap.Map1Texture3.Order;
1566afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach	       break;
1567afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach	    case GL_MAP1_TEXTURE_COORD_4:
1568afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach	       *v = ctx->EvalMap.Map1Texture4.Order;
1569afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach	       break;
1570afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach	    case GL_MAP1_VERTEX_3:
1571afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach	       *v = ctx->EvalMap.Map1Vertex3.Order;
1572afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach	       break;
1573afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach	    case GL_MAP1_VERTEX_4:
1574afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach	       *v = ctx->EvalMap.Map1Vertex4.Order;
1575afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach	       break;
1576afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach	    case GL_MAP2_COLOR_4:
1577afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach	       v[0] = ctx->EvalMap.Map2Color4.Uorder;
1578afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach	       v[1] = ctx->EvalMap.Map2Color4.Vorder;
1579afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach	       break;
1580afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach	    case GL_MAP2_INDEX:
1581afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach	       v[0] = ctx->EvalMap.Map2Index.Uorder;
1582afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach	       v[1] = ctx->EvalMap.Map2Index.Vorder;
1583afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach	       break;
1584afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach	    case GL_MAP2_NORMAL:
1585afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach	       v[0] = ctx->EvalMap.Map2Normal.Uorder;
1586afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach	       v[1] = ctx->EvalMap.Map2Normal.Vorder;
1587afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach	       break;
1588afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach	    case GL_MAP2_TEXTURE_COORD_1:
1589afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach	       v[0] = ctx->EvalMap.Map2Texture1.Uorder;
1590afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach	       v[1] = ctx->EvalMap.Map2Texture1.Vorder;
1591afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach	       break;
1592afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach	    case GL_MAP2_TEXTURE_COORD_2:
1593afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach	       v[0] = ctx->EvalMap.Map2Texture2.Uorder;
1594afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach	       v[1] = ctx->EvalMap.Map2Texture2.Vorder;
1595afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach	       break;
1596afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach	    case GL_MAP2_TEXTURE_COORD_3:
1597afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach	       v[0] = ctx->EvalMap.Map2Texture3.Uorder;
1598afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach	       v[1] = ctx->EvalMap.Map2Texture3.Vorder;
1599afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach	       break;
1600afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach	    case GL_MAP2_TEXTURE_COORD_4:
1601afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach	       v[0] = ctx->EvalMap.Map2Texture4.Uorder;
1602afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach	       v[1] = ctx->EvalMap.Map2Texture4.Vorder;
1603afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach	       break;
1604afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach	    case GL_MAP2_VERTEX_3:
1605afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach	       v[0] = ctx->EvalMap.Map2Vertex3.Uorder;
1606afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach	       v[1] = ctx->EvalMap.Map2Vertex3.Vorder;
1607afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach	       break;
1608afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach	    case GL_MAP2_VERTEX_4:
1609afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach	       v[0] = ctx->EvalMap.Map2Vertex4.Uorder;
1610afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach	       v[1] = ctx->EvalMap.Map2Vertex4.Vorder;
1611afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach	       break;
1612afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach	    default:
1613afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach	       gl_error( ctx, GL_INVALID_ENUM, "glGetMapfv(target)" );
1614afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach	       return;
1615afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach	 }
1616afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach         break;
1617afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach      case GL_DOMAIN:
1618afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach	 switch (target) {
1619afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach	    case GL_MAP1_COLOR_4:
1620afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach	       v[0] = ctx->EvalMap.Map1Color4.u1;
1621afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach	       v[1] = ctx->EvalMap.Map1Color4.u2;
1622afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach	       break;
1623afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach	    case GL_MAP1_INDEX:
1624afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach	       v[0] = ctx->EvalMap.Map1Index.u1;
1625afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach	       v[1] = ctx->EvalMap.Map1Index.u2;
1626afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach	       break;
1627afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach	    case GL_MAP1_NORMAL:
1628afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach	       v[0] = ctx->EvalMap.Map1Normal.u1;
1629afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach	       v[1] = ctx->EvalMap.Map1Normal.u2;
1630afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach	       break;
1631afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach	    case GL_MAP1_TEXTURE_COORD_1:
1632afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach	       v[0] = ctx->EvalMap.Map1Texture1.u1;
1633afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach	       v[1] = ctx->EvalMap.Map1Texture1.u2;
1634afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach	       break;
1635afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach	    case GL_MAP1_TEXTURE_COORD_2:
1636afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach	       v[0] = ctx->EvalMap.Map1Texture2.u1;
1637afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach	       v[1] = ctx->EvalMap.Map1Texture2.u2;
1638afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach	       break;
1639afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach	    case GL_MAP1_TEXTURE_COORD_3:
1640afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach	       v[0] = ctx->EvalMap.Map1Texture3.u1;
1641afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach	       v[1] = ctx->EvalMap.Map1Texture3.u2;
1642afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach	       break;
1643afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach	    case GL_MAP1_TEXTURE_COORD_4:
1644afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach	       v[0] = ctx->EvalMap.Map1Texture4.u1;
1645afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach	       v[1] = ctx->EvalMap.Map1Texture4.u2;
1646afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach	       break;
1647afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach	    case GL_MAP1_VERTEX_3:
1648afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach	       v[0] = ctx->EvalMap.Map1Vertex3.u1;
1649afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach	       v[1] = ctx->EvalMap.Map1Vertex3.u2;
1650afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach	       break;
1651afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach	    case GL_MAP1_VERTEX_4:
1652afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach	       v[0] = ctx->EvalMap.Map1Vertex4.u1;
1653afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach	       v[1] = ctx->EvalMap.Map1Vertex4.u2;
1654afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach	       break;
1655afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach	    case GL_MAP2_COLOR_4:
1656afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach	       v[0] = ctx->EvalMap.Map2Color4.u1;
1657afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach	       v[1] = ctx->EvalMap.Map2Color4.u2;
1658afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach	       v[2] = ctx->EvalMap.Map2Color4.v1;
1659afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach	       v[3] = ctx->EvalMap.Map2Color4.v2;
1660afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach	       break;
1661afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach	    case GL_MAP2_INDEX:
1662afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach	       v[0] = ctx->EvalMap.Map2Index.u1;
1663afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach	       v[1] = ctx->EvalMap.Map2Index.u2;
1664afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach	       v[2] = ctx->EvalMap.Map2Index.v1;
1665afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach	       v[3] = ctx->EvalMap.Map2Index.v2;
1666afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach	       break;
1667afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach	    case GL_MAP2_NORMAL:
1668afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach	       v[0] = ctx->EvalMap.Map2Normal.u1;
1669afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach	       v[1] = ctx->EvalMap.Map2Normal.u2;
1670afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach	       v[2] = ctx->EvalMap.Map2Normal.v1;
1671afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach	       v[3] = ctx->EvalMap.Map2Normal.v2;
1672afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach	       break;
1673afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach	    case GL_MAP2_TEXTURE_COORD_1:
1674afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach	       v[0] = ctx->EvalMap.Map2Texture1.u1;
1675afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach	       v[1] = ctx->EvalMap.Map2Texture1.u2;
1676afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach	       v[2] = ctx->EvalMap.Map2Texture1.v1;
1677afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach	       v[3] = ctx->EvalMap.Map2Texture1.v2;
1678afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach	       break;
1679afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach	    case GL_MAP2_TEXTURE_COORD_2:
1680afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach	       v[0] = ctx->EvalMap.Map2Texture2.u1;
1681afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach	       v[1] = ctx->EvalMap.Map2Texture2.u2;
1682afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach	       v[2] = ctx->EvalMap.Map2Texture2.v1;
1683afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach	       v[3] = ctx->EvalMap.Map2Texture2.v2;
1684afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach	       break;
1685afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach	    case GL_MAP2_TEXTURE_COORD_3:
1686afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach	       v[0] = ctx->EvalMap.Map2Texture3.u1;
1687afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach	       v[1] = ctx->EvalMap.Map2Texture3.u2;
1688afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach	       v[2] = ctx->EvalMap.Map2Texture3.v1;
1689afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach	       v[3] = ctx->EvalMap.Map2Texture3.v2;
1690afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach	       break;
1691afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach	    case GL_MAP2_TEXTURE_COORD_4:
1692afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach	       v[0] = ctx->EvalMap.Map2Texture4.u1;
1693afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach	       v[1] = ctx->EvalMap.Map2Texture4.u2;
1694afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach	       v[2] = ctx->EvalMap.Map2Texture4.v1;
1695afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach	       v[3] = ctx->EvalMap.Map2Texture4.v2;
1696afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach	       break;
1697afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach	    case GL_MAP2_VERTEX_3:
1698afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach	       v[0] = ctx->EvalMap.Map2Vertex3.u1;
1699afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach	       v[1] = ctx->EvalMap.Map2Vertex3.u2;
1700afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach	       v[2] = ctx->EvalMap.Map2Vertex3.v1;
1701afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach	       v[3] = ctx->EvalMap.Map2Vertex3.v2;
1702afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach	       break;
1703afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach	    case GL_MAP2_VERTEX_4:
1704afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach	       v[0] = ctx->EvalMap.Map2Vertex4.u1;
1705afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach	       v[1] = ctx->EvalMap.Map2Vertex4.u2;
1706afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach	       v[2] = ctx->EvalMap.Map2Vertex4.v1;
1707afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach	       v[3] = ctx->EvalMap.Map2Vertex4.v2;
1708afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach	       break;
1709afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach	    default:
1710afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach	       gl_error( ctx, GL_INVALID_ENUM, "glGetMapfv(target)" );
1711afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach	 }
1712afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach         break;
1713afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach      default:
1714afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach         gl_error( ctx, GL_INVALID_ENUM, "glGetMapfv(query)" );
1715afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach   }
1716afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach}
1717afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach
1718afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach
1719afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlachvoid gl_GetMapiv( GLcontext* ctx, GLenum target, GLenum query, GLint *v )
1720afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach{
1721afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach   GLuint i, n;
1722afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach   GLfloat *data;
1723afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach
1724afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach   switch (query) {
1725afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach      case GL_COEFF:
1726afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach	 switch (target) {
1727afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach	    case GL_MAP1_COLOR_4:
1728afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach	       data = ctx->EvalMap.Map1Color4.Points;
1729afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach	       n = ctx->EvalMap.Map1Color4.Order * 4;
1730afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach	       break;
1731afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach	    case GL_MAP1_INDEX:
1732afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach	       data = ctx->EvalMap.Map1Index.Points;
1733afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach	       n = ctx->EvalMap.Map1Index.Order;
1734afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach	       break;
1735afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach	    case GL_MAP1_NORMAL:
1736afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach	       data = ctx->EvalMap.Map1Normal.Points;
1737afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach	       n = ctx->EvalMap.Map1Normal.Order * 3;
1738afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach	       break;
1739afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach	    case GL_MAP1_TEXTURE_COORD_1:
1740afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach	       data = ctx->EvalMap.Map1Texture1.Points;
1741afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach	       n = ctx->EvalMap.Map1Texture1.Order * 1;
1742afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach	       break;
1743afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach	    case GL_MAP1_TEXTURE_COORD_2:
1744afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach	       data = ctx->EvalMap.Map1Texture2.Points;
1745afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach	       n = ctx->EvalMap.Map1Texture2.Order * 2;
1746afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach	       break;
1747afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach	    case GL_MAP1_TEXTURE_COORD_3:
1748afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach	       data = ctx->EvalMap.Map1Texture3.Points;
1749afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach	       n = ctx->EvalMap.Map1Texture3.Order * 3;
1750afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach	       break;
1751afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach	    case GL_MAP1_TEXTURE_COORD_4:
1752afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach	       data = ctx->EvalMap.Map1Texture4.Points;
1753afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach	       n = ctx->EvalMap.Map1Texture4.Order * 4;
1754afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach	       break;
1755afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach	    case GL_MAP1_VERTEX_3:
1756afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach	       data = ctx->EvalMap.Map1Vertex3.Points;
1757afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach	       n = ctx->EvalMap.Map1Vertex3.Order * 3;
1758afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach	       break;
1759afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach	    case GL_MAP1_VERTEX_4:
1760afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach	       data = ctx->EvalMap.Map1Vertex4.Points;
1761afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach	       n = ctx->EvalMap.Map1Vertex4.Order * 4;
1762afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach	       break;
1763afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach	    case GL_MAP2_COLOR_4:
1764afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach	       data = ctx->EvalMap.Map2Color4.Points;
1765afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach	       n = ctx->EvalMap.Map2Color4.Uorder
1766afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                 * ctx->EvalMap.Map2Color4.Vorder * 4;
1767afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach	       break;
1768afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach	    case GL_MAP2_INDEX:
1769afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach	       data = ctx->EvalMap.Map2Index.Points;
1770afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach	       n = ctx->EvalMap.Map2Index.Uorder
1771afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                 * ctx->EvalMap.Map2Index.Vorder;
1772afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach	       break;
1773afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach	    case GL_MAP2_NORMAL:
1774afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach	       data = ctx->EvalMap.Map2Normal.Points;
1775afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach	       n = ctx->EvalMap.Map2Normal.Uorder
1776afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                 * ctx->EvalMap.Map2Normal.Vorder * 3;
1777afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach	       break;
1778afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach	    case GL_MAP2_TEXTURE_COORD_1:
1779afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach	       data = ctx->EvalMap.Map2Texture1.Points;
1780afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach	       n = ctx->EvalMap.Map2Texture1.Uorder
1781afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                 * ctx->EvalMap.Map2Texture1.Vorder * 1;
1782afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach	       break;
1783afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach	    case GL_MAP2_TEXTURE_COORD_2:
1784afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach	       data = ctx->EvalMap.Map2Texture2.Points;
1785afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach	       n = ctx->EvalMap.Map2Texture2.Uorder
1786afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                 * ctx->EvalMap.Map2Texture2.Vorder * 2;
1787afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach	       break;
1788afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach	    case GL_MAP2_TEXTURE_COORD_3:
1789afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach	       data = ctx->EvalMap.Map2Texture3.Points;
1790afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach	       n = ctx->EvalMap.Map2Texture3.Uorder
1791afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                 * ctx->EvalMap.Map2Texture3.Vorder * 3;
1792afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach	       break;
1793afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach	    case GL_MAP2_TEXTURE_COORD_4:
1794afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach	       data = ctx->EvalMap.Map2Texture4.Points;
1795afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach	       n = ctx->EvalMap.Map2Texture4.Uorder
1796afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                 * ctx->EvalMap.Map2Texture4.Vorder * 4;
1797afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach	       break;
1798afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach	    case GL_MAP2_VERTEX_3:
1799afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach	       data = ctx->EvalMap.Map2Vertex3.Points;
1800afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach	       n = ctx->EvalMap.Map2Vertex3.Uorder
1801afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                 * ctx->EvalMap.Map2Vertex3.Vorder * 3;
1802afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach	       break;
1803afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach	    case GL_MAP2_VERTEX_4:
1804afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach	       data = ctx->EvalMap.Map2Vertex4.Points;
1805afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach	       n = ctx->EvalMap.Map2Vertex4.Uorder
1806afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                 * ctx->EvalMap.Map2Vertex4.Vorder * 4;
1807afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach	       break;
1808afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach	    default:
1809afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach	       gl_error( ctx, GL_INVALID_ENUM, "glGetMapiv(target)" );
1810afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach	       return;
1811afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach	 }
1812afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach	 if (data) {
1813afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach	    for (i=0;i<n;i++) {
1814afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach	       v[i] = ROUNDF(data[i]);
1815afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach	    }
1816afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach	 }
1817afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach         break;
1818afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach      case GL_ORDER:
1819afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach	 switch (target) {
1820afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach	    case GL_MAP1_COLOR_4:
1821afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach	       *v = ctx->EvalMap.Map1Color4.Order;
1822afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach	       break;
1823afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach	    case GL_MAP1_INDEX:
1824afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach	       *v = ctx->EvalMap.Map1Index.Order;
1825afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach	       break;
1826afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach	    case GL_MAP1_NORMAL:
1827afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach	       *v = ctx->EvalMap.Map1Normal.Order;
1828afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach	       break;
1829afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach	    case GL_MAP1_TEXTURE_COORD_1:
1830afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach	       *v = ctx->EvalMap.Map1Texture1.Order;
1831afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach	       break;
1832afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach	    case GL_MAP1_TEXTURE_COORD_2:
1833afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach	       *v = ctx->EvalMap.Map1Texture2.Order;
1834afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach	       break;
1835afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach	    case GL_MAP1_TEXTURE_COORD_3:
1836afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach	       *v = ctx->EvalMap.Map1Texture3.Order;
1837afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach	       break;
1838afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach	    case GL_MAP1_TEXTURE_COORD_4:
1839afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach	       *v = ctx->EvalMap.Map1Texture4.Order;
1840afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach	       break;
1841afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach	    case GL_MAP1_VERTEX_3:
1842afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach	       *v = ctx->EvalMap.Map1Vertex3.Order;
1843afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach	       break;
1844afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach	    case GL_MAP1_VERTEX_4:
1845afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach	       *v = ctx->EvalMap.Map1Vertex4.Order;
1846afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach	       break;
1847afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach	    case GL_MAP2_COLOR_4:
1848afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach	       v[0] = ctx->EvalMap.Map2Color4.Uorder;
1849afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach	       v[1] = ctx->EvalMap.Map2Color4.Vorder;
1850afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach	       break;
1851afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach	    case GL_MAP2_INDEX:
1852afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach	       v[0] = ctx->EvalMap.Map2Index.Uorder;
1853afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach	       v[1] = ctx->EvalMap.Map2Index.Vorder;
1854afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach	       break;
1855afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach	    case GL_MAP2_NORMAL:
1856afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach	       v[0] = ctx->EvalMap.Map2Normal.Uorder;
1857afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach	       v[1] = ctx->EvalMap.Map2Normal.Vorder;
1858afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach	       break;
1859afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach	    case GL_MAP2_TEXTURE_COORD_1:
1860afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach	       v[0] = ctx->EvalMap.Map2Texture1.Uorder;
1861afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach	       v[1] = ctx->EvalMap.Map2Texture1.Vorder;
1862afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach	       break;
1863afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach	    case GL_MAP2_TEXTURE_COORD_2:
1864afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach	       v[0] = ctx->EvalMap.Map2Texture2.Uorder;
1865afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach	       v[1] = ctx->EvalMap.Map2Texture2.Vorder;
1866afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach	       break;
1867afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach	    case GL_MAP2_TEXTURE_COORD_3:
1868afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach	       v[0] = ctx->EvalMap.Map2Texture3.Uorder;
1869afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach	       v[1] = ctx->EvalMap.Map2Texture3.Vorder;
1870afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach	       break;
1871afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach	    case GL_MAP2_TEXTURE_COORD_4:
1872afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach	       v[0] = ctx->EvalMap.Map2Texture4.Uorder;
1873afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach	       v[1] = ctx->EvalMap.Map2Texture4.Vorder;
1874afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach	       break;
1875afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach	    case GL_MAP2_VERTEX_3:
1876afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach	       v[0] = ctx->EvalMap.Map2Vertex3.Uorder;
1877afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach	       v[1] = ctx->EvalMap.Map2Vertex3.Vorder;
1878afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach	       break;
1879afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach	    case GL_MAP2_VERTEX_4:
1880afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach	       v[0] = ctx->EvalMap.Map2Vertex4.Uorder;
1881afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach	       v[1] = ctx->EvalMap.Map2Vertex4.Vorder;
1882afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach	       break;
1883afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach	    default:
1884afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach	       gl_error( ctx, GL_INVALID_ENUM, "glGetMapiv(target)" );
1885afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach	       return;
1886afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach	 }
1887afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach         break;
1888afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach      case GL_DOMAIN:
1889afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach	 switch (target) {
1890afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach	    case GL_MAP1_COLOR_4:
1891afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach	       v[0] = ROUNDF(ctx->EvalMap.Map1Color4.u1);
1892afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach	       v[1] = ROUNDF(ctx->EvalMap.Map1Color4.u2);
1893afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach	       break;
1894afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach	    case GL_MAP1_INDEX:
1895afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach	       v[0] = ROUNDF(ctx->EvalMap.Map1Index.u1);
1896afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach	       v[1] = ROUNDF(ctx->EvalMap.Map1Index.u2);
1897afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach	       break;
1898afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach	    case GL_MAP1_NORMAL:
1899afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach	       v[0] = ROUNDF(ctx->EvalMap.Map1Normal.u1);
1900afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach	       v[1] = ROUNDF(ctx->EvalMap.Map1Normal.u2);
1901afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach	       break;
1902afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach	    case GL_MAP1_TEXTURE_COORD_1:
1903afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach	       v[0] = ROUNDF(ctx->EvalMap.Map1Texture1.u1);
1904afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach	       v[1] = ROUNDF(ctx->EvalMap.Map1Texture1.u2);
1905afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach	       break;
1906afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach	    case GL_MAP1_TEXTURE_COORD_2:
1907afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach	       v[0] = ROUNDF(ctx->EvalMap.Map1Texture2.u1);
1908afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach	       v[1] = ROUNDF(ctx->EvalMap.Map1Texture2.u2);
1909afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach	       break;
1910afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach	    case GL_MAP1_TEXTURE_COORD_3:
1911afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach	       v[0] = ROUNDF(ctx->EvalMap.Map1Texture3.u1);
1912afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach	       v[1] = ROUNDF(ctx->EvalMap.Map1Texture3.u2);
1913afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach	       break;
1914afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach	    case GL_MAP1_TEXTURE_COORD_4:
1915afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach	       v[0] = ROUNDF(ctx->EvalMap.Map1Texture4.u1);
1916afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach	       v[1] = ROUNDF(ctx->EvalMap.Map1Texture4.u2);
1917afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach	       break;
1918afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach	    case GL_MAP1_VERTEX_3:
1919afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach	       v[0] = ROUNDF(ctx->EvalMap.Map1Vertex3.u1);
1920afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach	       v[1] = ROUNDF(ctx->EvalMap.Map1Vertex3.u2);
1921afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach	       break;
1922afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach	    case GL_MAP1_VERTEX_4:
1923afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach	       v[0] = ROUNDF(ctx->EvalMap.Map1Vertex4.u1);
1924afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach	       v[1] = ROUNDF(ctx->EvalMap.Map1Vertex4.u2);
1925afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach	       break;
1926afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach	    case GL_MAP2_COLOR_4:
1927afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach	       v[0] = ROUNDF(ctx->EvalMap.Map2Color4.u1);
1928afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach	       v[1] = ROUNDF(ctx->EvalMap.Map2Color4.u2);
1929afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach	       v[2] = ROUNDF(ctx->EvalMap.Map2Color4.v1);
1930afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach	       v[3] = ROUNDF(ctx->EvalMap.Map2Color4.v2);
1931afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach	       break;
1932afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach	    case GL_MAP2_INDEX:
1933afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach	       v[0] = ROUNDF(ctx->EvalMap.Map2Index.u1);
1934afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach	       v[1] = ROUNDF(ctx->EvalMap.Map2Index.u2);
1935afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach	       v[2] = ROUNDF(ctx->EvalMap.Map2Index.v1);
1936afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach	       v[3] = ROUNDF(ctx->EvalMap.Map2Index.v2);
1937afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach	       break;
1938afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach	    case GL_MAP2_NORMAL:
1939afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach	       v[0] = ROUNDF(ctx->EvalMap.Map2Normal.u1);
1940afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach	       v[1] = ROUNDF(ctx->EvalMap.Map2Normal.u2);
1941afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach	       v[2] = ROUNDF(ctx->EvalMap.Map2Normal.v1);
1942afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach	       v[3] = ROUNDF(ctx->EvalMap.Map2Normal.v2);
1943afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach	       break;
1944afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach	    case GL_MAP2_TEXTURE_COORD_1:
1945afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach	       v[0] = ROUNDF(ctx->EvalMap.Map2Texture1.u1);
1946afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach	       v[1] = ROUNDF(ctx->EvalMap.Map2Texture1.u2);
1947afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach	       v[2] = ROUNDF(ctx->EvalMap.Map2Texture1.v1);
1948afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach	       v[3] = ROUNDF(ctx->EvalMap.Map2Texture1.v2);
1949afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach	       break;
1950afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach	    case GL_MAP2_TEXTURE_COORD_2:
1951afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach	       v[0] = ROUNDF(ctx->EvalMap.Map2Texture2.u1);
1952afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach	       v[1] = ROUNDF(ctx->EvalMap.Map2Texture2.u2);
1953afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach	       v[2] = ROUNDF(ctx->EvalMap.Map2Texture2.v1);
1954afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach	       v[3] = ROUNDF(ctx->EvalMap.Map2Texture2.v2);
1955afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach	       break;
1956afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach	    case GL_MAP2_TEXTURE_COORD_3:
1957afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach	       v[0] = ROUNDF(ctx->EvalMap.Map2Texture3.u1);
1958afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach	       v[1] = ROUNDF(ctx->EvalMap.Map2Texture3.u2);
1959afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach	       v[2] = ROUNDF(ctx->EvalMap.Map2Texture3.v1);
1960afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach	       v[3] = ROUNDF(ctx->EvalMap.Map2Texture3.v2);
1961afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach	       break;
1962afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach	    case GL_MAP2_TEXTURE_COORD_4:
1963afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach	       v[0] = ROUNDF(ctx->EvalMap.Map2Texture4.u1);
1964afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach	       v[1] = ROUNDF(ctx->EvalMap.Map2Texture4.u2);
1965afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach	       v[2] = ROUNDF(ctx->EvalMap.Map2Texture4.v1);
1966afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach	       v[3] = ROUNDF(ctx->EvalMap.Map2Texture4.v2);
1967afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach	       break;
1968afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach	    case GL_MAP2_VERTEX_3:
1969afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach	       v[0] = ROUNDF(ctx->EvalMap.Map2Vertex3.u1);
1970afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach	       v[1] = ROUNDF(ctx->EvalMap.Map2Vertex3.u2);
1971afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach	       v[2] = ROUNDF(ctx->EvalMap.Map2Vertex3.v1);
1972afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach	       v[3] = ROUNDF(ctx->EvalMap.Map2Vertex3.v2);
1973afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach	       break;
1974afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach	    case GL_MAP2_VERTEX_4:
1975afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach	       v[0] = ROUNDF(ctx->EvalMap.Map2Vertex4.u1);
1976afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach	       v[1] = ROUNDF(ctx->EvalMap.Map2Vertex4.u2);
1977afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach	       v[2] = ROUNDF(ctx->EvalMap.Map2Vertex4.v1);
1978afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach	       v[3] = ROUNDF(ctx->EvalMap.Map2Vertex4.v2);
1979afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach	       break;
1980afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach	    default:
1981afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach	       gl_error( ctx, GL_INVALID_ENUM, "glGetMapiv(target)" );
1982afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach	 }
1983afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach         break;
1984afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach      default:
1985afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach         gl_error( ctx, GL_INVALID_ENUM, "glGetMapiv(query)" );
1986afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach   }
1987afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach}
1988afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach
1989afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach
1990afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach
1991afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlachvoid eval_points1( GLfloat outcoord[][4],
1992afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach		   GLfloat coord[][4],
1993afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach		   const GLuint *flags,
1994afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach		   GLfloat du, GLfloat u1 )
1995afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach{
1996afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach   GLuint i;
1997afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach   for (i = VB_START ; !(flags[i] & VERT_END_VB) ; i++)
1998afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach      if (flags[i] & VERT_EVAL_P1)
1999afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach	 outcoord[i][0] = coord[i][0] * du + u1;
2000afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach      else if (flags[i] & VERT_EVAL_ANY) {
2001afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach	 outcoord[i][0] = coord[i][0];
2002afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach	 outcoord[i][1] = coord[i][1];
2003afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach      }
2004afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach}
2005afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach
2006afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlachvoid eval_points2( GLfloat outcoord[][4],
2007afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach		   GLfloat coord[][4],
2008afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach		   const GLuint *flags,
2009afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach		   GLfloat du, GLfloat u1,
2010afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach		   GLfloat dv, GLfloat v1 )
2011afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach{
2012afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach   GLuint i;
2013afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach   for (i = VB_START ; !(flags[i] & VERT_END_VB) ; i++)
2014afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach      if (flags[i] & VERT_EVAL_P2) {
2015afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach	 outcoord[i][0] = coord[i][0] * du + u1;
2016afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach	 outcoord[i][1] = coord[i][1] * dv + v1;
2017afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach      } else if (flags[i] & VERT_EVAL_ANY) {
2018afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach	 outcoord[i][0] = coord[i][0];
2019afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach	 outcoord[i][1] = coord[i][1];
2020afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach      }
2021afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach}
2022afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach
2023afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach
2024afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlachstatic const GLubyte dirty_flags[5] = {
2025afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach   0,				/* not possible */
2026afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach   VEC_DIRTY_0,
2027afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach   VEC_DIRTY_1,
2028afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach   VEC_DIRTY_2,
2029afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach   VEC_DIRTY_3
2030afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach};
2031afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach
2032afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach
2033afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen GerlachGLvector4f *eval1_4f( GLvector4f *dest,
2034afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach		      GLfloat coord[][4],
2035afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach		      const GLuint *flags,
2036afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach		      GLuint dimension,
2037afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach		      struct gl_1d_map *map )
2038afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach{
2039afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach   const GLfloat u1 = map->u1;
2040afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach   const GLfloat du = map->du;
2041afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach   GLfloat (*to)[4] = dest->data;
2042afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach   GLuint i;
2043afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach
2044afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach   for (i = VB_START ; !(flags[i] & VERT_END_VB) ; i++)
2045afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach      if (flags[i] & (VERT_EVAL_C1|VERT_EVAL_P1)) {
2046afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach	 GLfloat u = (coord[i][0] - u1) * du;
2047afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach	 ASSIGN_4V(to[i], 0,0,0,1);
2048afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach	 horner_bezier_curve(map->Points, to[i], u, dimension, map->Order);
2049afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach      }
2050afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach
2051afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach   dest->count = i;
2052afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach   dest->size = MAX2(dest->size, dimension);
2053afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach   dest->flags |= dirty_flags[dimension];
2054afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach   return dest;
2055afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach}
2056afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach
2057afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach
2058afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen GerlachGLvector1ui *eval1_1ui( GLvector1ui *dest,
2059afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach		       GLfloat coord[][4],
2060afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach		       const GLuint *flags,
2061afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach		       struct gl_1d_map *map )
2062afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach{
2063afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach   const GLfloat u1 = map->u1;
2064afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach   const GLfloat du = map->du;
2065afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach   GLuint *to = dest->data;
2066afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach   GLuint i;
2067afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach
2068afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach   for (i = VB_START ; !(flags[i] & VERT_END_VB) ; i++)
2069afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach      if (flags[i] & (VERT_EVAL_C1|VERT_EVAL_P1)) {
2070afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach	 GLfloat u = (coord[i][0] - u1) * du;
2071afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach	 GLfloat tmp;
2072afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach	 horner_bezier_curve(map->Points, &tmp, u, 1, map->Order);
2073afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach	 to[i] = (GLuint) (GLint) tmp;
2074afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach      }
2075afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach
2076afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach   dest->count = i;
2077afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach   return dest;
2078afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach}
2079afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach
2080afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen GerlachGLvector3f *eval1_norm( GLvector3f *dest,
2081afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach			GLfloat coord[][4],
2082afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach			GLuint *flags, /* not const */
2083afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach			struct gl_1d_map *map )
2084afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach{
2085afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach   const GLfloat u1 = map->u1;
2086afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach   const GLfloat du = map->du;
2087afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach   GLfloat (*to)[3] = dest->data;
2088afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach   GLuint i;
2089afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach
2090afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach   for (i = VB_START ; !(flags[i] & VERT_END_VB) ; i++)
2091afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach      if (flags[i] & (VERT_EVAL_C1|VERT_EVAL_P1)) {
2092afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach	 GLfloat u = (coord[i][0] - u1) * du;
2093afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach	 horner_bezier_curve(map->Points, to[i], u, 3, map->Order);
2094afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach	 flags[i+1] |= VERT_NORM; /* reset */
2095afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach      }
2096afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach
2097afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach   dest->count = i;
2098afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach   return dest;
2099afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach}
2100afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach
2101afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen GerlachGLvector4ub *eval1_color( GLvector4ub *dest,
2102afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach			  GLfloat coord[][4],
2103afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach			  GLuint *flags, /* not const */
2104afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach			  struct gl_1d_map *map )
2105afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach{
2106afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach   const GLfloat u1 = map->u1;
2107afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach   const GLfloat du = map->du;
2108afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach   GLubyte (*to)[4] = dest->data;
2109afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach   GLuint i;
2110afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach
2111afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach   for (i = VB_START ; !(flags[i] & VERT_END_VB) ; i++)
2112afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach      if (flags[i] & (VERT_EVAL_C1|VERT_EVAL_P1)) {
2113afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach	 GLfloat u = (coord[i][0] - u1) * du;
2114afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach	 GLfloat fcolor[4];
2115afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach	 horner_bezier_curve(map->Points, fcolor, u, 4, map->Order);
2116afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach	 FLOAT_RGBA_TO_UBYTE_RGBA(to[i], fcolor);
2117afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach	 flags[i+1] |= VERT_RGBA; /* reset */
2118afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach      }
2119afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach
2120afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach   dest->count = i;
2121afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach   return dest;
2122afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach}
2123afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach
2124afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach
2125afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach
2126afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach
2127afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen GerlachGLvector4f *eval2_obj_norm( GLvector4f *obj_ptr,
2128afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach			    GLvector3f *norm_ptr,
2129afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach			    GLfloat coord[][4],
2130afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach			    GLuint *flags,
2131afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach			    GLuint dimension,
2132afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach			    struct gl_2d_map *map )
2133afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach{
2134afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach   const GLfloat u1 = map->u1;
2135afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach   const GLfloat du = map->du;
2136afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach   const GLfloat v1 = map->v1;
2137afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach   const GLfloat dv = map->dv;
2138afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach   GLfloat (*obj)[4] = obj_ptr->data;
2139afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach   GLfloat (*normal)[3] = norm_ptr->data;
2140afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach   GLuint i;
2141afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach
2142afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach   for (i = VB_START ; !(flags[i] & VERT_END_VB) ; i++)
2143afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach      if (flags[i] & (VERT_EVAL_C2|VERT_EVAL_P2)) {
2144afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach	 GLfloat u = (coord[i][0] - u1) * du;
2145afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach	 GLfloat v = (coord[i][1] - v1) * dv;
2146afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach	 GLfloat du[4], dv[4];
2147afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach
2148afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach	 ASSIGN_4V(obj[i], 0,0,0,1);
2149afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach	 de_casteljau_surf(map->Points, obj[i], du, dv, u, v, dimension,
2150afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach			   map->Uorder, map->Vorder);
2151afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach
2152afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach	 CROSS3(normal[i], du, dv);
2153afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach	 NORMALIZE_3FV(normal[i]);
2154afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach	 flags[i+1] |= VERT_NORM;
2155afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach      }
2156afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach
2157afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach   obj_ptr->count = i;
2158afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach   obj_ptr->size = MAX2(obj_ptr->size, dimension);
2159afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach   obj_ptr->flags |= dirty_flags[dimension];
2160afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach   return obj_ptr;
2161afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach}
2162afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach
2163afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach
2164afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen GerlachGLvector4f *eval2_4f( GLvector4f *dest,
2165afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach		      GLfloat coord[][4],
2166afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach		      const GLuint *flags,
2167afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach		      GLuint dimension,
2168afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach		      struct gl_2d_map *map )
2169afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach{
2170afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach   const GLfloat u1 = map->u1;
2171afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach   const GLfloat du = map->du;
2172afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach   const GLfloat v1 = map->v1;
2173afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach   const GLfloat dv = map->dv;
2174afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach   GLfloat (*to)[4] = dest->data;
2175afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach   GLuint i;
2176afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach
2177afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach   for (i = VB_START ; !(flags[i] & VERT_END_VB) ; i++)
2178afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach      if (flags[i] & (VERT_EVAL_C2|VERT_EVAL_P2)) {
2179afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach	 GLfloat u = (coord[i][0] - u1) * du;
2180afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach	 GLfloat v = (coord[i][1] - v1) * dv;
2181afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach	 horner_bezier_surf(map->Points, to[i], u, v, dimension,
2182afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach			    map->Uorder, map->Vorder);
2183afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach      }
2184afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach
2185afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach   dest->count = i;
2186afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach   dest->size = MAX2(dest->size, dimension);
2187afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach   dest->flags |= dirty_flags[dimension];
2188afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach   return dest;
2189afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach}
2190afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach
2191afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach
2192afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen GerlachGLvector3f *eval2_norm( GLvector3f *dest,
2193afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach			GLfloat coord[][4],
2194afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach			GLuint *flags,
2195afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach			struct gl_2d_map *map )
2196afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach{
2197afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach   const GLfloat u1 = map->u1;
2198afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach   const GLfloat du = map->du;
2199afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach   const GLfloat v1 = map->v1;
2200afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach   const GLfloat dv = map->dv;
2201afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach   GLfloat (*to)[3] = dest->data;
2202afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach   GLuint i;
2203afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach
2204afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach   for (i = VB_START ; !(flags[i] & VERT_END_VB) ; i++)
2205afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach      if (flags[i] & (VERT_EVAL_C2|VERT_EVAL_P2)) {
2206afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach	 GLfloat u = (coord[i][0] - u1) * du;
2207afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach	 GLfloat v = (coord[i][1] - v1) * dv;
2208afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach	 horner_bezier_surf(map->Points, to[i], u, v, 3,
2209afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach			    map->Uorder, map->Vorder);
2210afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach 	 flags[i+1] |= VERT_NORM; /* reset */
2211afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach     }
2212afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach
2213afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach   dest->count = i;
2214afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach   return dest;
2215afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach}
2216afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach
2217afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach
2218afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen GerlachGLvector1ui *eval2_1ui( GLvector1ui *dest,
2219afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach		       GLfloat coord[][4],
2220afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach		       const GLuint *flags,
2221afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach		       struct gl_2d_map *map )
2222afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach{
2223afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach   const GLfloat u1 = map->u1;
2224afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach   const GLfloat du = map->du;
2225afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach   const GLfloat v1 = map->v1;
2226afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach   const GLfloat dv = map->dv;
2227afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach   GLuint *to = dest->data;
2228afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach   GLuint i;
2229afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach
2230afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach   for (i = VB_START ; !(flags[i] & VERT_END_VB) ; i++)
2231afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach      if (flags[i] & (VERT_EVAL_C2|VERT_EVAL_P2)) {
2232afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach	 GLfloat u = (coord[i][0] - u1) * du;
2233afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach	 GLfloat v = (coord[i][1] - v1) * dv;
2234afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach	 GLfloat tmp;
2235afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach	 horner_bezier_surf(map->Points, &tmp, u, v, 1,
2236afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach			    map->Uorder, map->Vorder);
2237afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach
2238afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach	 to[i] = (GLuint) (GLint) tmp;
2239afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach      }
2240afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach
2241afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach   dest->count = i;
2242afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach   return dest;
2243afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach}
2244afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach
2245afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach
2246afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach
2247afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen GerlachGLvector4ub *eval2_color( GLvector4ub *dest,
2248afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach			  GLfloat coord[][4],
2249afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach			  GLuint *flags,
2250afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach			  struct gl_2d_map *map )
2251afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach{
2252afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach   const GLfloat u1 = map->u1;
2253afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach   const GLfloat du = map->du;
2254afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach   const GLfloat v1 = map->v1;
2255afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach   const GLfloat dv = map->dv;
2256afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach   GLubyte (*to)[4] = dest->data;
2257afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach   GLuint i;
2258afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach
2259afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach   for (i = VB_START ; !(flags[i] & VERT_END_VB) ; i++)
2260afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach      if (flags[i] & (VERT_EVAL_C2|VERT_EVAL_P2)) {
2261afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach	 GLfloat u = (coord[i][0] - u1) * du;
2262afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach	 GLfloat v = (coord[i][1] - v1) * dv;
2263afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach	 GLfloat fcolor[4];
2264afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach	 horner_bezier_surf(map->Points, fcolor, u, v, 4,
2265afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach			    map->Uorder, map->Vorder);
2266afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach	 FLOAT_RGBA_TO_UBYTE_RGBA(to[i], fcolor);
2267afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach	 flags[i+1] |= VERT_RGBA; /* reset */
2268afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach      }
2269afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach
2270afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach   dest->count = i;
2271afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach   return dest;
2272afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach}
2273afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach
2274afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach
2275afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen GerlachGLvector4f *copy_4f( GLvector4f *out, CONST GLvector4f *in,
2276afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach		     const GLuint *flags)
2277afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach{
2278afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach   GLfloat (*to)[4] = out->data;
2279afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach   GLfloat (*from)[4] = in->data;
2280afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach   GLuint i;
2281afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach
2282afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach   for ( i = VB_START ; !(flags[i] & VERT_END_VB) ; i++)
2283afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach      if (!(flags[i] & VERT_EVAL_ANY))
2284afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach	 COPY_4FV( to[i], from[i] );
2285afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach
2286afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach   return out;
2287afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach}
2288afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach
2289afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen GerlachGLvector3f *copy_3f( GLvector3f *out, CONST GLvector3f *in,
2290afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach		     const GLuint *flags)
2291afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach{
2292afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach   GLfloat (*to)[3] = out->data;
2293afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach   GLfloat (*from)[3] = in->data;
2294afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach   GLuint i;
2295afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach
2296afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach   for ( i = VB_START ; !(flags[i] & VERT_END_VB) ; i++)
2297afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach      if (!(flags[i] & VERT_EVAL_ANY))
2298afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach	 COPY_3V( to[i], from[i] );
2299afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach
2300afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach   return out;
2301afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach}
2302afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach
2303afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen GerlachGLvector4ub *copy_4ub( GLvector4ub *out, CONST GLvector4ub *in,
2304afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach		       const GLuint *flags )
2305afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach{
2306afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach   GLubyte (*to)[4] = out->data;
2307afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach   GLubyte (*from)[4] = in->data;
2308afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach   GLuint i;
2309afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach
2310afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach   for ( i = VB_START ; !(flags[i] & VERT_END_VB) ; i++)
2311afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach      if (!(flags[i] & VERT_EVAL_ANY))
2312afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach	 COPY_4UBV( to[i], from[i] );
2313afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach
2314afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach   return out;
2315afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach}
2316afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach
2317afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen GerlachGLvector1ui *copy_1ui( GLvector1ui *out, CONST GLvector1ui *in,
2318afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach		       const GLuint *flags )
2319afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach{
2320afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach   GLuint *to = out->data;
2321afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach   CONST GLuint *from = in->data;
2322afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach   GLuint i;
2323afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach
2324afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach   for ( i = VB_START ; !(flags[i] & VERT_END_VB) ; i++)
2325afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach      if (!(flags[i] & VERT_EVAL_ANY))
2326afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach	 to[i] = from[i];
2327afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach
2328afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach   return out;
2329afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach}
2330afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach
2331afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach
2332afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach/* KW: Rewrote this to perform eval on a whole buffer at once.
2333afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach *     Only evaluates active data items, and avoids scribbling
2334afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach *     the source buffer if we are running from a display list.
2335afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach *
2336afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach *     If the user (in this case looser) sends eval coordinates
2337afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach *     or runs a display list containing eval coords with no
2338afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach *     vertex maps enabled, we have to either copy all non-eval
2339afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach *     data to a new buffer, or find a way of working around
2340afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach *     the eval data.  I choose the second option.
2341afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach *
2342afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach * KW: This code not reached by cva - use IM to access storage.
2343afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach */
2344afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlachvoid gl_eval_vb( struct vertex_buffer *VB )
2345afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach{
2346afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach   struct immediate *IM = VB->IM;
2347afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach   GLcontext *ctx = VB->ctx;
2348afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach   GLuint req = ctx->CVA.elt.inputs;
2349afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach   GLfloat (*coord)[4] = VB->ObjPtr->data;
2350afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach   GLuint *flags = VB->Flag;
2351afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach   GLuint new_flags = 0;
2352afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach
2353afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach
2354afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach   GLuint any_eval1 = VB->OrFlag & (VERT_EVAL_C1|VERT_EVAL_P1);
2355afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach   GLuint any_eval2 = VB->OrFlag & (VERT_EVAL_C2|VERT_EVAL_P2);
2356afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach   GLuint all_eval = VB->AndFlag & VERT_EVAL_ANY;
2357afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach
2358afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach   /* Handle the degenerate cases.
2359afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach    */
2360afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach   if (any_eval1 && !ctx->Eval.Map1Vertex4 && !ctx->Eval.Map1Vertex3) {
2361afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach      VB->PurgeFlags |= (VERT_EVAL_C1|VERT_EVAL_P1);
2362afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach      VB->EarlyCull = 0;
2363afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach      any_eval1 = GL_FALSE;
2364afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach   }
2365afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach
2366afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach   if (any_eval2 && !ctx->Eval.Map2Vertex4 && !ctx->Eval.Map2Vertex3) {
2367afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach      VB->PurgeFlags |= (VERT_EVAL_C2|VERT_EVAL_P2);
2368afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach      VB->EarlyCull = 0;
2369afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach      any_eval2 = GL_FALSE;
2370afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach   }
2371afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach
2372afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach   /* KW: This really is a degenerate case - doing this disables
2373afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach    * culling, and causes dummy values for the missing vertices to be
2374afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach    * transformed and clip tested.  It also forces the individual
2375afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach    * cliptesting of each primitive in vb_render.  I wish there was a
2376afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach    * nice alternative, but I can't say I want to put effort into
2377afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach    * optimizing such a bad usage of the library - I'd much rather
2378afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach    * work on useful changes.
2379afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach    */
2380afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach   if (VB->PurgeFlags) {
2381afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach      if (!any_eval1 && !any_eval2 && all_eval) VB->Count = VB_START;
2382afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach      gl_purge_vertices( VB );
2383afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach      if (!any_eval1 && !any_eval2) return;
2384afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach   } else
2385afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach      VB->IndirectCount = VB->Count;
2386afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach
2387afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach   /* Translate points into coords.
2388afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach    */
2389afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach   if (any_eval1 && (VB->OrFlag & VERT_EVAL_P1))
2390afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach   {
2391afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach      eval_points1( IM->Obj, coord, flags,
2392afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach		    ctx->Eval.MapGrid1du,
2393afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach		    ctx->Eval.MapGrid1u1);
2394afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach
2395afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach      coord = IM->Obj;
2396afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach   }
2397afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach
2398afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach   if (any_eval2 && (VB->OrFlag & VERT_EVAL_P2))
2399afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach   {
2400afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach      eval_points2( IM->Obj, coord, flags,
2401afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach		    ctx->Eval.MapGrid2du,
2402afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach		    ctx->Eval.MapGrid2u1,
2403afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach		    ctx->Eval.MapGrid2dv,
2404afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach		    ctx->Eval.MapGrid2v1 );
2405afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach
2406afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach      coord = IM->Obj;
2407afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach   }
2408afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach
2409afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach   /* Perform the evaluations on active data elements.
2410afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach    */
2411afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach   if (req & VERT_INDEX)
2412afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach   {
2413afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach      GLvector1ui  *in_index = VB->IndexPtr;
2414afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach      GLvector1ui  *out_index = &IM->v.Index;
2415afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach
2416afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach      if (ctx->Eval.Map1Index && any_eval1)
2417afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach	 VB->IndexPtr = eval1_1ui( out_index, coord, flags,
2418afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach				   &ctx->EvalMap.Map1Index );
2419afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach
2420afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach      if (ctx->Eval.Map2Index && any_eval2)
2421afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach	 VB->IndexPtr = eval2_1ui( out_index, coord, flags,
2422afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach				   &ctx->EvalMap.Map2Index );
2423afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach
2424afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach      if (VB->IndexPtr != in_index) {
2425afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach	 new_flags |= VERT_INDEX;
2426afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach	 if (!all_eval)
2427afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach	    VB->IndexPtr = copy_1ui( out_index, in_index, flags );
2428afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach      }
2429afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach   }
2430afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach
2431afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach   if (req & VERT_RGBA)
2432afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach   {
2433afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach      GLvector4ub  *in_color = VB->ColorPtr;
2434afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach      GLvector4ub  *out_color = &IM->v.Color;
2435afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach
2436afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach      if (ctx->Eval.Map1Color4 && any_eval1)
2437afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach	 VB->ColorPtr = eval1_color( out_color, coord, flags,
2438afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach				   &ctx->EvalMap.Map1Color4 );
2439afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach
2440afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach      if (ctx->Eval.Map2Color4 && any_eval2)
2441afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach	 VB->ColorPtr = eval2_color( out_color, coord, flags,
2442afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach				     &ctx->EvalMap.Map2Color4 );
2443afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach
2444afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach      if (VB->ColorPtr != in_color) {
2445afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach	 new_flags |= VERT_RGBA;
2446afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach	 if (!all_eval)
2447afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach	    VB->ColorPtr = copy_4ub( out_color, in_color, flags );
2448afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach      }
2449afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach
2450afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach      VB->Color[0] = VB->Color[1] = VB->ColorPtr;
2451afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach   }
2452afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach
2453afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach
2454afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach   if (req & VERT_NORM)
2455afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach   {
2456afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach      GLvector3f  *in_normal = VB->NormalPtr;
2457afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach      GLvector3f  *out_normal = &IM->v.Normal;
2458afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach
2459afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach      if (ctx->Eval.Map1Normal && any_eval1)
2460afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach	 VB->NormalPtr = eval1_norm( out_normal, coord, flags,
2461afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach				     &ctx->EvalMap.Map1Normal );
2462afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach
2463afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach      if (ctx->Eval.Map2Normal && any_eval2)
2464afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach	 VB->NormalPtr = eval2_norm( out_normal, coord, flags,
2465afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach				     &ctx->EvalMap.Map2Normal );
2466afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach
2467afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach      if (VB->NormalPtr != in_normal) {
2468afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach	 new_flags |= VERT_NORM;
2469afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach	 if (!all_eval)
2470afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach	    VB->NormalPtr = copy_3f( out_normal, in_normal, flags );
2471afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach      }
2472afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach   }
2473afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach
2474afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach
2475afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach   if (req & VERT_TEX_ANY(0))
2476afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach   {
2477afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach      GLvector4f *tc = VB->TexCoordPtr[0];
2478afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach      GLvector4f *in = tc;
2479afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach      GLvector4f *out = &IM->v.TexCoord[0];
2480afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach
2481afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach      if (any_eval1) {
2482afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach	 if (ctx->Eval.Map1TextureCoord4)
2483afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach	    tc = eval1_4f( out, coord, flags, 4, &ctx->EvalMap.Map1Texture4);
2484afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach	 else if (ctx->Eval.Map1TextureCoord3)
2485afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach	    tc = eval1_4f( out, coord, flags, 3, &ctx->EvalMap.Map1Texture3);
2486afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach	 else if (ctx->Eval.Map1TextureCoord2)
2487afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach	    tc = eval1_4f( out, coord, flags, 2, &ctx->EvalMap.Map1Texture2);
2488afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach	 else if (ctx->Eval.Map1TextureCoord1)
2489afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach	    tc = eval1_4f( out, coord, flags, 1, &ctx->EvalMap.Map1Texture1);
2490afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach      }
2491afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach
2492afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach      if (any_eval2) {
2493afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach	 if (ctx->Eval.Map2TextureCoord4)
2494afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach	    tc = eval2_4f( out, coord, flags, 4, &ctx->EvalMap.Map2Texture4);
2495afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach	 else if (ctx->Eval.Map2TextureCoord3)
2496afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach	    tc = eval2_4f( out, coord, flags, 3, &ctx->EvalMap.Map2Texture3);
2497afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach	 else if (ctx->Eval.Map2TextureCoord2)
2498afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach	    tc = eval2_4f( out, coord, flags, 2, &ctx->EvalMap.Map2Texture2);
2499afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach	 else if (ctx->Eval.Map2TextureCoord1)
2500afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach	    tc = eval2_4f( out, coord, flags, 1, &ctx->EvalMap.Map2Texture1);
2501afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach      }
2502afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach
2503afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach      if (tc != in) {
2504afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach	 new_flags |= VERT_TEX_ANY(0); /* fix for sizes.. */
2505afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach	 if (!all_eval)
2506afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach	    tc = copy_4f( out, in, flags );
2507afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach      }
2508afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach
2509afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach      VB->TexCoordPtr[0] = tc;
2510afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach   }
2511afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach
2512afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach
2513afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach   {
2514afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach      GLvector4f *in = VB->ObjPtr;
2515afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach      GLvector4f *out = &IM->v.Obj;
2516afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach      GLvector4f *obj = in;
2517afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach
2518afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach      if (any_eval1) {
2519afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach	 if (ctx->Eval.Map1Vertex4)
2520afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach	    obj = eval1_4f( out, coord, flags, 4, &ctx->EvalMap.Map1Vertex4);
2521afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach	 else
2522afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach	    obj = eval1_4f( out, coord, flags, 3, &ctx->EvalMap.Map1Vertex3);
2523afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach      }
2524afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach
2525afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach      if (any_eval2) {
2526afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach	 if (ctx->Eval.Map2Vertex4)
2527afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach	 {
2528afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach	    if (ctx->Eval.AutoNormal && (req & VERT_NORM))
2529afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach	       obj = eval2_obj_norm( out, VB->NormalPtr, coord, flags, 4,
2530afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach				    &ctx->EvalMap.Map2Vertex4 );
2531afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach	    else
2532afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach	       obj = eval2_4f( out, coord, flags, 4,
2533afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach			       &ctx->EvalMap.Map2Vertex4);
2534afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach	 }
2535afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach	 else if (ctx->Eval.Map2Vertex3)
2536afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach	 {
2537afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach	    if (ctx->Eval.AutoNormal && (req & VERT_NORM))
2538afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach	       obj = eval2_obj_norm( out, VB->NormalPtr, coord, flags, 3,
2539afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach				    &ctx->EvalMap.Map2Vertex3 );
2540afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach	    else
2541afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach	       obj = eval2_4f( out, coord, flags, 3,
2542afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach			       &ctx->EvalMap.Map2Vertex3 );
2543afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach	 }
2544afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach      }
2545afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach
2546afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach      if (obj != in && !all_eval)
2547afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach	 obj = copy_4f( out, in, flags );
2548afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach
2549afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach      VB->ObjPtr = obj;
2550afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach   }
2551afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach
2552afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach   if (new_flags) {
2553afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach      GLuint *oldflags = VB->Flag;
2554afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach      GLuint *flags = VB->Flag = VB->EvaluatedFlags;
2555afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach      GLuint i;
2556afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach      GLuint count = VB->Count;
2557afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach
2558afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach      if (!flags) {
2559afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach	 VB->EvaluatedFlags = (GLuint *)malloc(VB->Size * sizeof(GLuint));
2560afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach	 flags = VB->Flag = VB->EvaluatedFlags;
2561afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach      }
2562afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach
2563afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach      if (all_eval) {
2564afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach	 for (i = 0 ; i < count ; i++)
2565afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach	    flags[i] = oldflags[i] | new_flags;
2566afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach	 VB->AndFlag |= new_flags;
2567afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach      } else {
2568afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach	 GLuint andflag = ~0;
2569afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach	 for (i = 0 ; i < count ; i++) {
2570afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach	    if (oldflags[i] & VERT_EVAL_ANY)
2571afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach	       flags[i] = oldflags[i] | new_flags;
2572afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach	    andflag &= flags[i];
2573afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach	 }
2574afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach	 VB->AndFlag = andflag;
2575afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach      }
2576afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach   }
2577afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach}
2578afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach
2579afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach
2580afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlachvoid gl_MapGrid1f( GLcontext* ctx, GLint un, GLfloat u1, GLfloat u2 )
2581afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach{
2582afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach   ASSERT_OUTSIDE_BEGIN_END_AND_FLUSH(ctx, "glMapGrid1f");
2583afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach
2584afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach   if (un<1) {
2585afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach      gl_error( ctx, GL_INVALID_VALUE, "glMapGrid1f" );
2586afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach      return;
2587afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach   }
2588afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach   ctx->Eval.MapGrid1un = un;
2589afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach   ctx->Eval.MapGrid1u1 = u1;
2590afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach   ctx->Eval.MapGrid1u2 = u2;
2591afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach   ctx->Eval.MapGrid1du = (u2 - u1) / (GLfloat) un;
2592afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach}
2593afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach
2594afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach
2595afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlachvoid gl_MapGrid2f( GLcontext* ctx, GLint un, GLfloat u1, GLfloat u2,
2596afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach		  GLint vn, GLfloat v1, GLfloat v2 )
2597afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach{
2598afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach   ASSERT_OUTSIDE_BEGIN_END_AND_FLUSH(ctx, "glMapGrid2f");
2599afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach   if (un<1) {
2600afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach      gl_error( ctx, GL_INVALID_VALUE, "glMapGrid2f(un)" );
2601afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach      return;
2602afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach   }
2603afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach   if (vn<1) {
2604afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach      gl_error( ctx, GL_INVALID_VALUE, "glMapGrid2f(vn)" );
2605afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach      return;
2606afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach   }
2607afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach   ctx->Eval.MapGrid2un = un;
2608afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach   ctx->Eval.MapGrid2u1 = u1;
2609afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach   ctx->Eval.MapGrid2u2 = u2;
2610afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach   ctx->Eval.MapGrid2du = (u2 - u1) / (GLfloat) un;
2611afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach   ctx->Eval.MapGrid2vn = vn;
2612afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach   ctx->Eval.MapGrid2v1 = v1;
2613afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach   ctx->Eval.MapGrid2v2 = v2;
2614afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach   ctx->Eval.MapGrid2dv = (v2 - v1) / (GLfloat) vn;
2615afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach}
2616afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach
2617afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach
2618afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach
2619afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlachvoid gl_EvalMesh1( GLcontext* ctx, GLenum mode, GLint i1, GLint i2 )
2620afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach{
2621afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach   GLint i;
2622afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach   GLfloat u, du;
2623afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach   GLenum prim;
2624afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach
2625afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach   ASSERT_OUTSIDE_BEGIN_END_AND_FLUSH(ctx, "glEvalMesh1");
2626afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach
2627afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach   switch (mode) {
2628afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach      case GL_POINT:
2629afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach         prim = GL_POINTS;
2630afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach         break;
2631afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach      case GL_LINE:
2632afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach         prim = GL_LINE_STRIP;
2633afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach         break;
2634afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach      default:
2635afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach         gl_error( ctx, GL_INVALID_ENUM, "glEvalMesh1(mode)" );
2636afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach         return;
2637afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach   }
2638afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach
2639afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach   /* No effect if vertex maps disabled.
2640afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach    */
2641afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach   if (!ctx->Eval.Map1Vertex4 && !ctx->Eval.Map1Vertex3)
2642afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach      return;
2643afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach
2644afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach   du = ctx->Eval.MapGrid1du;
2645afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach   u = ctx->Eval.MapGrid1u1 + i1 * du;
2646afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach
2647afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach   /* KW: Could short-circuit this to avoid the immediate mechanism.
2648afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach    */
2649afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach   RESET_IMMEDIATE(ctx);
2650afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach
2651afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach   gl_Begin( ctx, prim );
2652afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach   for (i=i1;i<=i2;i++,u+=du) {
2653afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach      gl_EvalCoord1f( ctx, u );
2654afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach   }
2655afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach   gl_End(ctx);
2656afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach}
2657afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach
2658afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach
2659afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach
2660afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlachvoid gl_EvalMesh2( GLcontext* ctx,
2661afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach		   GLenum mode,
2662afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach		   GLint i1, GLint i2,
2663afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach		   GLint j1, GLint j2 )
2664afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach{
2665afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach   GLint i, j;
2666afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach   GLfloat u, du, v, dv, v1, u1;
2667afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach
2668afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach   ASSERT_OUTSIDE_BEGIN_END_AND_FLUSH(ctx, "glEvalMesh2");
2669afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach
2670afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach   /* No effect if vertex maps disabled.
2671afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach    */
2672afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach   if (!ctx->Eval.Map2Vertex4 && !ctx->Eval.Map2Vertex3)
2673afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach      return;
2674afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach
2675afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach   du = ctx->Eval.MapGrid2du;
2676afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach   dv = ctx->Eval.MapGrid2dv;
2677afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach   v1 = ctx->Eval.MapGrid2v1 + j1 * dv;
2678afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach   u1 = ctx->Eval.MapGrid2u1 + i1 * du;
2679afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach
2680afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach   RESET_IMMEDIATE(ctx);
2681afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach
2682afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach   switch (mode) {
2683afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach   case GL_POINT:
2684afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach      gl_Begin( ctx, GL_POINTS );
2685afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach      for (v=v1,j=j1;j<=j2;j++,v+=dv) {
2686afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach	 for (u=u1,i=i1;i<=i2;i++,u+=du) {
2687afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach	    gl_EvalCoord2f( ctx, u, v );
2688afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach	 }
2689afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach      }
2690afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach      gl_End(ctx);
2691afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach      break;
2692afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach   case GL_LINE:
2693afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach      for (v=v1,j=j1;j<=j2;j++,v+=dv) {
2694afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach	 gl_Begin( ctx, GL_LINE_STRIP );
2695afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach	 for (u=u1,i=i1;i<=i2;i++,u+=du) {
2696afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach	    gl_EvalCoord2f( ctx, u, v );
2697afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach	 }
2698afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach	 gl_End(ctx);
2699afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach      }
2700afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach      for (u=u1,i=i1;i<=i2;i++,u+=du) {
2701afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach	 gl_Begin( ctx, GL_LINE_STRIP );
2702afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach	 for (v=v1,j=j1;j<=j2;j++,v+=dv) {
2703afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach	    gl_EvalCoord2f( ctx, u, v );
2704afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach	 }
2705afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach	 gl_End(ctx);
2706afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach      }
2707afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach      break;
2708afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach   case GL_FILL:
2709afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach      for (v=v1,j=j1;j<j2;j++,v+=dv) {
2710afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach	 /* NOTE: a quad strip can't be used because the four */
2711afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach	 /* can't be guaranteed to be coplanar! */
2712afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach	 gl_Begin( ctx, GL_TRIANGLE_STRIP );
2713afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach	 for (u=u1,i=i1;i<=i2;i++,u+=du) {
2714afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach	    gl_EvalCoord2f( ctx, u, v );
2715afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach	    gl_EvalCoord2f( ctx, u, v+dv );
2716afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach	 }
2717afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach	 gl_End(ctx);
2718afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach      }
2719afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach      break;
2720afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach   default:
2721afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach      gl_error( ctx, GL_INVALID_ENUM, "glEvalMesh2(mode)" );
2722afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach      return;
2723afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach   }
2724afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach}
2725afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach
2726