eval.c revision e2053d16901732f4947c702cdc5ef72993d8d130
1e2053d16901732f4947c702cdc5ef72993d8d130Brian Paul/* $Id: eval.c,v 1.23 2002/01/05 21:58:42 brianp Exp $ */
2afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach
3afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach/*
4afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach * Mesa 3-D graphics library
5bc42c19f22c3b719712529d86faea818f34150a2Brian Paul * Version:  4.1
65e3bc0c2a2bcdf59949410f94c9b705fc1281ce8Jouk Jansen *
7bc42c19f22c3b719712529d86faea818f34150a2Brian Paul * Copyright (C) 1999-2002  Brian Paul   All Rights Reserved.
85e3bc0c2a2bcdf59949410f94c9b705fc1281ce8Jouk Jansen *
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:
155e3bc0c2a2bcdf59949410f94c9b705fc1281ce8Jouk Jansen *
16afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach * The above copyright notice and this permission notice shall be included
17afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach * in all copies or substantial portions of the Software.
185e3bc0c2a2bcdf59949410f94c9b705fc1281ce8Jouk Jansen *
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 * eval.c was written by
30afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach * Bernd Barsuhn (bdbarsuh@cip.informatik.uni-erlangen.de) and
31afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach * Volker Weiss (vrweiss@cip.informatik.uni-erlangen.de).
32afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach *
33afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach * My original implementation of evaluators was simplistic and didn't
34afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach * compute surface normal vectors properly.  Bernd and Volker applied
35afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach * used more sophisticated methods to get better results.
36afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach *
37afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach * Thanks guys!
38afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach */
39afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach
40afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach
41afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach#ifdef PC_HEADER
42afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach#include "all.h"
43afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach#else
44fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul#include "glheader.h"
45c893a015d8a50a38cd3f727d99835e7e7e2ccea9Brian Paul#include "colormac.h"
46afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach#include "context.h"
47afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach#include "eval.h"
48afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach#include "macros.h"
49fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul#include "mem.h"
50afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach#include "mmath.h"
515e3bc0c2a2bcdf59949410f94c9b705fc1281ce8Jouk Jansen#include "mtypes.h"
52afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach#endif
53afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach
54afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach
55afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach/*
56afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach * Return the number of components per control point for any type of
57afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach * evaluator.  Return 0 if bad target.
58fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul * See table 5.1 in the OpenGL 1.2 spec.
59afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach */
60fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian PaulGLuint _mesa_evaluator_components( GLenum target )
61afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach{
62afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach   switch (target) {
63afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach      case GL_MAP1_VERTEX_3:		return 3;
64afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach      case GL_MAP1_VERTEX_4:		return 4;
65afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach      case GL_MAP1_INDEX:		return 1;
66afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach      case GL_MAP1_COLOR_4:		return 4;
67afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach      case GL_MAP1_NORMAL:		return 3;
68afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach      case GL_MAP1_TEXTURE_COORD_1:	return 1;
69afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach      case GL_MAP1_TEXTURE_COORD_2:	return 2;
70afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach      case GL_MAP1_TEXTURE_COORD_3:	return 3;
71afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach      case GL_MAP1_TEXTURE_COORD_4:	return 4;
72afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach      case GL_MAP2_VERTEX_3:		return 3;
73afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach      case GL_MAP2_VERTEX_4:		return 4;
74afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach      case GL_MAP2_INDEX:		return 1;
75afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach      case GL_MAP2_COLOR_4:		return 4;
76afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach      case GL_MAP2_NORMAL:		return 3;
77afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach      case GL_MAP2_TEXTURE_COORD_1:	return 1;
78afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach      case GL_MAP2_TEXTURE_COORD_2:	return 2;
79afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach      case GL_MAP2_TEXTURE_COORD_3:	return 3;
80afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach      case GL_MAP2_TEXTURE_COORD_4:	return 4;
81bc42c19f22c3b719712529d86faea818f34150a2Brian Paul      default:				break;
82bc42c19f22c3b719712529d86faea818f34150a2Brian Paul   }
83bc42c19f22c3b719712529d86faea818f34150a2Brian Paul
84bc42c19f22c3b719712529d86faea818f34150a2Brian Paul   /* XXX need to check for the vertex program extension
85bc42c19f22c3b719712529d86faea818f34150a2Brian Paul   if (!ctx->Extensions.NV_vertex_program)
86bc42c19f22c3b719712529d86faea818f34150a2Brian Paul      return 0;
87bc42c19f22c3b719712529d86faea818f34150a2Brian Paul   */
88bc42c19f22c3b719712529d86faea818f34150a2Brian Paul
89bc42c19f22c3b719712529d86faea818f34150a2Brian Paul   if (target >= GL_MAP1_VERTEX_ATTRIB0_4_NV &&
90bc42c19f22c3b719712529d86faea818f34150a2Brian Paul       target <= GL_MAP1_VERTEX_ATTRIB15_4_NV)
91bc42c19f22c3b719712529d86faea818f34150a2Brian Paul      return 4;
92bc42c19f22c3b719712529d86faea818f34150a2Brian Paul
93bc42c19f22c3b719712529d86faea818f34150a2Brian Paul   if (target >= GL_MAP2_VERTEX_ATTRIB0_4_NV &&
94bc42c19f22c3b719712529d86faea818f34150a2Brian Paul       target <= GL_MAP2_VERTEX_ATTRIB15_4_NV)
95bc42c19f22c3b719712529d86faea818f34150a2Brian Paul      return 4;
96bc42c19f22c3b719712529d86faea818f34150a2Brian Paul
97bc42c19f22c3b719712529d86faea818f34150a2Brian Paul   return 0;
98bc42c19f22c3b719712529d86faea818f34150a2Brian Paul}
99bc42c19f22c3b719712529d86faea818f34150a2Brian Paul
100bc42c19f22c3b719712529d86faea818f34150a2Brian Paul
101bc42c19f22c3b719712529d86faea818f34150a2Brian Paul/*
102bc42c19f22c3b719712529d86faea818f34150a2Brian Paul * Return pointer to the gl_1d_map struct for the named target.
103bc42c19f22c3b719712529d86faea818f34150a2Brian Paul */
104bc42c19f22c3b719712529d86faea818f34150a2Brian Paulstatic struct gl_1d_map *
105bc42c19f22c3b719712529d86faea818f34150a2Brian Paulget_1d_map( GLcontext *ctx, GLenum target )
106bc42c19f22c3b719712529d86faea818f34150a2Brian Paul{
107bc42c19f22c3b719712529d86faea818f34150a2Brian Paul   switch (target) {
108bc42c19f22c3b719712529d86faea818f34150a2Brian Paul      case GL_MAP1_VERTEX_3:
109bc42c19f22c3b719712529d86faea818f34150a2Brian Paul         return &ctx->EvalMap.Map1Vertex3;
110bc42c19f22c3b719712529d86faea818f34150a2Brian Paul      case GL_MAP1_VERTEX_4:
111bc42c19f22c3b719712529d86faea818f34150a2Brian Paul         return &ctx->EvalMap.Map1Vertex4;
112bc42c19f22c3b719712529d86faea818f34150a2Brian Paul      case GL_MAP1_INDEX:
113bc42c19f22c3b719712529d86faea818f34150a2Brian Paul         return &ctx->EvalMap.Map1Index;
114bc42c19f22c3b719712529d86faea818f34150a2Brian Paul      case GL_MAP1_COLOR_4:
115bc42c19f22c3b719712529d86faea818f34150a2Brian Paul         return &ctx->EvalMap.Map1Color4;
116bc42c19f22c3b719712529d86faea818f34150a2Brian Paul      case GL_MAP1_NORMAL:
117bc42c19f22c3b719712529d86faea818f34150a2Brian Paul         return &ctx->EvalMap.Map1Normal;
118bc42c19f22c3b719712529d86faea818f34150a2Brian Paul      case GL_MAP1_TEXTURE_COORD_1:
119bc42c19f22c3b719712529d86faea818f34150a2Brian Paul         return &ctx->EvalMap.Map1Texture1;
120bc42c19f22c3b719712529d86faea818f34150a2Brian Paul      case GL_MAP1_TEXTURE_COORD_2:
121bc42c19f22c3b719712529d86faea818f34150a2Brian Paul         return &ctx->EvalMap.Map1Texture2;
122bc42c19f22c3b719712529d86faea818f34150a2Brian Paul      case GL_MAP1_TEXTURE_COORD_3:
123bc42c19f22c3b719712529d86faea818f34150a2Brian Paul         return &ctx->EvalMap.Map1Texture3;
124bc42c19f22c3b719712529d86faea818f34150a2Brian Paul      case GL_MAP1_TEXTURE_COORD_4:
125bc42c19f22c3b719712529d86faea818f34150a2Brian Paul         return &ctx->EvalMap.Map1Texture4;
126bc42c19f22c3b719712529d86faea818f34150a2Brian Paul      case GL_MAP1_VERTEX_ATTRIB0_4_NV:
127bc42c19f22c3b719712529d86faea818f34150a2Brian Paul      case GL_MAP1_VERTEX_ATTRIB1_4_NV:
128bc42c19f22c3b719712529d86faea818f34150a2Brian Paul      case GL_MAP1_VERTEX_ATTRIB2_4_NV:
129bc42c19f22c3b719712529d86faea818f34150a2Brian Paul      case GL_MAP1_VERTEX_ATTRIB3_4_NV:
130bc42c19f22c3b719712529d86faea818f34150a2Brian Paul      case GL_MAP1_VERTEX_ATTRIB4_4_NV:
131bc42c19f22c3b719712529d86faea818f34150a2Brian Paul      case GL_MAP1_VERTEX_ATTRIB5_4_NV:
132bc42c19f22c3b719712529d86faea818f34150a2Brian Paul      case GL_MAP1_VERTEX_ATTRIB6_4_NV:
133bc42c19f22c3b719712529d86faea818f34150a2Brian Paul      case GL_MAP1_VERTEX_ATTRIB7_4_NV:
134bc42c19f22c3b719712529d86faea818f34150a2Brian Paul      case GL_MAP1_VERTEX_ATTRIB8_4_NV:
135bc42c19f22c3b719712529d86faea818f34150a2Brian Paul      case GL_MAP1_VERTEX_ATTRIB9_4_NV:
136bc42c19f22c3b719712529d86faea818f34150a2Brian Paul      case GL_MAP1_VERTEX_ATTRIB10_4_NV:
137bc42c19f22c3b719712529d86faea818f34150a2Brian Paul      case GL_MAP1_VERTEX_ATTRIB11_4_NV:
138bc42c19f22c3b719712529d86faea818f34150a2Brian Paul      case GL_MAP1_VERTEX_ATTRIB12_4_NV:
139bc42c19f22c3b719712529d86faea818f34150a2Brian Paul      case GL_MAP1_VERTEX_ATTRIB13_4_NV:
140bc42c19f22c3b719712529d86faea818f34150a2Brian Paul      case GL_MAP1_VERTEX_ATTRIB14_4_NV:
141bc42c19f22c3b719712529d86faea818f34150a2Brian Paul      case GL_MAP1_VERTEX_ATTRIB15_4_NV:
142bc42c19f22c3b719712529d86faea818f34150a2Brian Paul         if (!ctx->Extensions.NV_vertex_program)
143bc42c19f22c3b719712529d86faea818f34150a2Brian Paul            return NULL;
144bc42c19f22c3b719712529d86faea818f34150a2Brian Paul         return &ctx->EvalMap.Map1Attrib[target - GL_MAP1_VERTEX_ATTRIB0_4_NV];
145bc42c19f22c3b719712529d86faea818f34150a2Brian Paul      default:
146bc42c19f22c3b719712529d86faea818f34150a2Brian Paul         return NULL;
147bc42c19f22c3b719712529d86faea818f34150a2Brian Paul   }
148bc42c19f22c3b719712529d86faea818f34150a2Brian Paul}
149bc42c19f22c3b719712529d86faea818f34150a2Brian Paul
150bc42c19f22c3b719712529d86faea818f34150a2Brian Paul
151bc42c19f22c3b719712529d86faea818f34150a2Brian Paul/*
152bc42c19f22c3b719712529d86faea818f34150a2Brian Paul * Return pointer to the gl_2d_map struct for the named target.
153bc42c19f22c3b719712529d86faea818f34150a2Brian Paul */
154bc42c19f22c3b719712529d86faea818f34150a2Brian Paulstatic struct gl_2d_map *
155bc42c19f22c3b719712529d86faea818f34150a2Brian Paulget_2d_map( GLcontext *ctx, GLenum target )
156bc42c19f22c3b719712529d86faea818f34150a2Brian Paul{
157bc42c19f22c3b719712529d86faea818f34150a2Brian Paul   switch (target) {
158bc42c19f22c3b719712529d86faea818f34150a2Brian Paul      case GL_MAP2_VERTEX_3:
159bc42c19f22c3b719712529d86faea818f34150a2Brian Paul         return &ctx->EvalMap.Map2Vertex3;
160bc42c19f22c3b719712529d86faea818f34150a2Brian Paul      case GL_MAP2_VERTEX_4:
161bc42c19f22c3b719712529d86faea818f34150a2Brian Paul         return &ctx->EvalMap.Map2Vertex4;
162bc42c19f22c3b719712529d86faea818f34150a2Brian Paul      case GL_MAP2_INDEX:
163bc42c19f22c3b719712529d86faea818f34150a2Brian Paul         return &ctx->EvalMap.Map2Index;
164bc42c19f22c3b719712529d86faea818f34150a2Brian Paul      case GL_MAP2_COLOR_4:
165bc42c19f22c3b719712529d86faea818f34150a2Brian Paul         return &ctx->EvalMap.Map2Color4;
166bc42c19f22c3b719712529d86faea818f34150a2Brian Paul      case GL_MAP2_NORMAL:
167bc42c19f22c3b719712529d86faea818f34150a2Brian Paul         return &ctx->EvalMap.Map2Normal;
168bc42c19f22c3b719712529d86faea818f34150a2Brian Paul      case GL_MAP2_TEXTURE_COORD_1:
169bc42c19f22c3b719712529d86faea818f34150a2Brian Paul         return &ctx->EvalMap.Map2Texture1;
170bc42c19f22c3b719712529d86faea818f34150a2Brian Paul      case GL_MAP2_TEXTURE_COORD_2:
171bc42c19f22c3b719712529d86faea818f34150a2Brian Paul         return &ctx->EvalMap.Map2Texture2;
172bc42c19f22c3b719712529d86faea818f34150a2Brian Paul      case GL_MAP2_TEXTURE_COORD_3:
173bc42c19f22c3b719712529d86faea818f34150a2Brian Paul         return &ctx->EvalMap.Map2Texture3;
174bc42c19f22c3b719712529d86faea818f34150a2Brian Paul      case GL_MAP2_TEXTURE_COORD_4:
175bc42c19f22c3b719712529d86faea818f34150a2Brian Paul         return &ctx->EvalMap.Map2Texture4;
176bc42c19f22c3b719712529d86faea818f34150a2Brian Paul      case GL_MAP2_VERTEX_ATTRIB0_4_NV:
177bc42c19f22c3b719712529d86faea818f34150a2Brian Paul      case GL_MAP2_VERTEX_ATTRIB1_4_NV:
178bc42c19f22c3b719712529d86faea818f34150a2Brian Paul      case GL_MAP2_VERTEX_ATTRIB2_4_NV:
179bc42c19f22c3b719712529d86faea818f34150a2Brian Paul      case GL_MAP2_VERTEX_ATTRIB3_4_NV:
180bc42c19f22c3b719712529d86faea818f34150a2Brian Paul      case GL_MAP2_VERTEX_ATTRIB4_4_NV:
181bc42c19f22c3b719712529d86faea818f34150a2Brian Paul      case GL_MAP2_VERTEX_ATTRIB5_4_NV:
182bc42c19f22c3b719712529d86faea818f34150a2Brian Paul      case GL_MAP2_VERTEX_ATTRIB6_4_NV:
183bc42c19f22c3b719712529d86faea818f34150a2Brian Paul      case GL_MAP2_VERTEX_ATTRIB7_4_NV:
184bc42c19f22c3b719712529d86faea818f34150a2Brian Paul      case GL_MAP2_VERTEX_ATTRIB8_4_NV:
185bc42c19f22c3b719712529d86faea818f34150a2Brian Paul      case GL_MAP2_VERTEX_ATTRIB9_4_NV:
186bc42c19f22c3b719712529d86faea818f34150a2Brian Paul      case GL_MAP2_VERTEX_ATTRIB10_4_NV:
187bc42c19f22c3b719712529d86faea818f34150a2Brian Paul      case GL_MAP2_VERTEX_ATTRIB11_4_NV:
188bc42c19f22c3b719712529d86faea818f34150a2Brian Paul      case GL_MAP2_VERTEX_ATTRIB12_4_NV:
189bc42c19f22c3b719712529d86faea818f34150a2Brian Paul      case GL_MAP2_VERTEX_ATTRIB13_4_NV:
190bc42c19f22c3b719712529d86faea818f34150a2Brian Paul      case GL_MAP2_VERTEX_ATTRIB14_4_NV:
191bc42c19f22c3b719712529d86faea818f34150a2Brian Paul      case GL_MAP2_VERTEX_ATTRIB15_4_NV:
192bc42c19f22c3b719712529d86faea818f34150a2Brian Paul         if (!ctx->Extensions.NV_vertex_program)
193bc42c19f22c3b719712529d86faea818f34150a2Brian Paul            return NULL;
194bc42c19f22c3b719712529d86faea818f34150a2Brian Paul         return &ctx->EvalMap.Map2Attrib[target - GL_MAP2_VERTEX_ATTRIB0_4_NV];
195bc42c19f22c3b719712529d86faea818f34150a2Brian Paul      default:
196bc42c19f22c3b719712529d86faea818f34150a2Brian Paul         return NULL;
197afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach   }
198afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach}
199afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach
200afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach
201afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach/**********************************************************************/
202afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach/***            Copy and deallocate control points                  ***/
203afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach/**********************************************************************/
204afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach
205afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach
206afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach/*
2075e3bc0c2a2bcdf59949410f94c9b705fc1281ce8Jouk Jansen * Copy 1-parametric evaluator control points from user-specified
208afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach * memory space to a buffer of contiguous control points.
209afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach * Input:  see glMap1f for details
210afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach * Return:  pointer to buffer of contiguous control points or NULL if out
211afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach *          of memory.
212afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach */
21308836341788a9f9d638d9dc8328510ccd18ddeb5Brian PaulGLfloat *_mesa_copy_map_points1f( GLenum target, GLint ustride, GLint uorder,
214bc42c19f22c3b719712529d86faea818f34150a2Brian Paul                                  const GLfloat *points )
215afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach{
216afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach   GLfloat *buffer, *p;
217fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul   GLint i, k, size = _mesa_evaluator_components(target);
218afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach
219bc42c19f22c3b719712529d86faea818f34150a2Brian Paul   if (!points || !size)
220afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach      return NULL;
221afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach
222bd5cdaf4442872d3cd2ff94eeafadd481d27fcfbBrian Paul   buffer = (GLfloat *) MALLOC(uorder * size * sizeof(GLfloat));
223afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach
224bc42c19f22c3b719712529d86faea818f34150a2Brian Paul   if (buffer)
225bc42c19f22c3b719712529d86faea818f34150a2Brian Paul      for (i = 0, p = buffer; i < uorder; i++, points += ustride)
226bc42c19f22c3b719712529d86faea818f34150a2Brian Paul	for (k = 0; k < size; k++)
227afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach	  *p++ = points[k];
228afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach
229afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach   return buffer;
230afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach}
231afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach
232afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach
233afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach
234afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach/*
235afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach * Same as above but convert doubles to floats.
236afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach */
23708836341788a9f9d638d9dc8328510ccd18ddeb5Brian PaulGLfloat *_mesa_copy_map_points1d( GLenum target, GLint ustride, GLint uorder,
238bc42c19f22c3b719712529d86faea818f34150a2Brian Paul                                  const GLdouble *points )
239afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach{
240afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach   GLfloat *buffer, *p;
241fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul   GLint i, k, size = _mesa_evaluator_components(target);
242afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach
243bc42c19f22c3b719712529d86faea818f34150a2Brian Paul   if (!points || !size)
244afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach      return NULL;
245afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach
246bd5cdaf4442872d3cd2ff94eeafadd481d27fcfbBrian Paul   buffer = (GLfloat *) MALLOC(uorder * size * sizeof(GLfloat));
247afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach
248bc42c19f22c3b719712529d86faea818f34150a2Brian Paul   if (buffer)
249bc42c19f22c3b719712529d86faea818f34150a2Brian Paul      for (i = 0, p = buffer; i < uorder; i++, points += ustride)
250bc42c19f22c3b719712529d86faea818f34150a2Brian Paul	for (k = 0; k < size; k++)
251afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach	  *p++ = (GLfloat) points[k];
252afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach
253afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach   return buffer;
254afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach}
255afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach
256afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach
257afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach
258afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach/*
2595e3bc0c2a2bcdf59949410f94c9b705fc1281ce8Jouk Jansen * Copy 2-parametric evaluator control points from user-specified
260afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach * memory space to a buffer of contiguous control points.
261afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach * Additional memory is allocated to be used by the horner and
262afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach * de Casteljau evaluation schemes.
263afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach *
264afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach * Input:  see glMap2f for details
265afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach * Return:  pointer to buffer of contiguous control points or NULL if out
266afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach *          of memory.
267afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach */
26808836341788a9f9d638d9dc8328510ccd18ddeb5Brian PaulGLfloat *_mesa_copy_map_points2f( GLenum target,
269e2053d16901732f4947c702cdc5ef72993d8d130Brian Paul                                  GLint ustride, GLint uorder,
270e2053d16901732f4947c702cdc5ef72993d8d130Brian Paul                                  GLint vstride, GLint vorder,
271e2053d16901732f4947c702cdc5ef72993d8d130Brian Paul                                  const GLfloat *points )
272afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach{
273afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach   GLfloat *buffer, *p;
274afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach   GLint i, j, k, size, dsize, hsize;
275afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach   GLint uinc;
276afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach
277fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul   size = _mesa_evaluator_components(target);
278afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach
279afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach   if (!points || size==0) {
280afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach      return NULL;
281afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach   }
282afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach
283afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach   /* max(uorder, vorder) additional points are used in      */
284afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach   /* horner evaluation and uorder*vorder additional */
285afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach   /* values are needed for de Casteljau                     */
286afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach   dsize = (uorder == 2 && vorder == 2)? 0 : uorder*vorder;
287afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach   hsize = (uorder > vorder ? uorder : vorder)*size;
288afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach
289afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach   if(hsize>dsize)
290bd5cdaf4442872d3cd2ff94eeafadd481d27fcfbBrian Paul     buffer = (GLfloat *) MALLOC((uorder*vorder*size+hsize)*sizeof(GLfloat));
291afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach   else
292bd5cdaf4442872d3cd2ff94eeafadd481d27fcfbBrian Paul     buffer = (GLfloat *) MALLOC((uorder*vorder*size+dsize)*sizeof(GLfloat));
293afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach
294afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach   /* compute the increment value for the u-loop */
295afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach   uinc = ustride - vorder*vstride;
296afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach
2975e3bc0c2a2bcdf59949410f94c9b705fc1281ce8Jouk Jansen   if (buffer)
298afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach      for (i=0, p=buffer; i<uorder; i++, points += uinc)
299afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach	 for (j=0; j<vorder; j++, points += vstride)
300afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach	    for (k=0; k<size; k++)
301afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach	       *p++ = points[k];
302afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach
303afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach   return buffer;
304afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach}
305afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach
306afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach
307afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach
308afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach/*
309afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach * Same as above but convert doubles to floats.
310afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach */
31108836341788a9f9d638d9dc8328510ccd18ddeb5Brian PaulGLfloat *_mesa_copy_map_points2d(GLenum target,
312e2053d16901732f4947c702cdc5ef72993d8d130Brian Paul                                 GLint ustride, GLint uorder,
313e2053d16901732f4947c702cdc5ef72993d8d130Brian Paul                                 GLint vstride, GLint vorder,
314e2053d16901732f4947c702cdc5ef72993d8d130Brian Paul                                 const GLdouble *points )
315afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach{
316afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach   GLfloat *buffer, *p;
317afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach   GLint i, j, k, size, hsize, dsize;
318afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach   GLint uinc;
319afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach
320fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul   size = _mesa_evaluator_components(target);
321afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach
322afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach   if (!points || size==0) {
323afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach      return NULL;
324afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach   }
325afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach
326afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach   /* max(uorder, vorder) additional points are used in      */
327afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach   /* horner evaluation and uorder*vorder additional */
328afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach   /* values are needed for de Casteljau                     */
329afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach   dsize = (uorder == 2 && vorder == 2)? 0 : uorder*vorder;
330afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach   hsize = (uorder > vorder ? uorder : vorder)*size;
331afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach
332afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach   if(hsize>dsize)
333bd5cdaf4442872d3cd2ff94eeafadd481d27fcfbBrian Paul     buffer = (GLfloat *) MALLOC((uorder*vorder*size+hsize)*sizeof(GLfloat));
334afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach   else
335bd5cdaf4442872d3cd2ff94eeafadd481d27fcfbBrian Paul     buffer = (GLfloat *) MALLOC((uorder*vorder*size+dsize)*sizeof(GLfloat));
336afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach
337afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach   /* compute the increment value for the u-loop */
338afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach   uinc = ustride - vorder*vstride;
339afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach
3405e3bc0c2a2bcdf59949410f94c9b705fc1281ce8Jouk Jansen   if (buffer)
341afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach      for (i=0, p=buffer; i<uorder; i++, points += uinc)
342afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach	 for (j=0; j<vorder; j++, points += vstride)
343afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach	    for (k=0; k<size; k++)
344afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach	       *p++ = (GLfloat) points[k];
345afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach
346afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach   return buffer;
347afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach}
348afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach
349afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach
350afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach
351afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach
352afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach/**********************************************************************/
353afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach/***                      API entry points                          ***/
354afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach/**********************************************************************/
355afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach
356afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach
357afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach/*
358fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul * This does the work of glMap1[fd].
359afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach */
360fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paulstatic void
361fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paulmap1(GLenum target, GLfloat u1, GLfloat u2, GLint ustride,
362fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul     GLint uorder, const GLvoid *points, GLenum type )
363afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach{
364fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul   GET_CURRENT_CONTEXT(ctx);
365afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach   GLint k;
366fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul   GLfloat *pnts;
367e2053d16901732f4947c702cdc5ef72993d8d130Brian Paul   struct gl_1d_map *map = NULL;
368afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach
369bc42c19f22c3b719712529d86faea818f34150a2Brian Paul   ASSERT_OUTSIDE_BEGIN_END(ctx);
370e2053d16901732f4947c702cdc5ef72993d8d130Brian Paul   ASSERT(type == GL_FLOAT || type == GL_DOUBLE);
371fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul
372fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul   if (u1 == u2) {
37308836341788a9f9d638d9dc8328510ccd18ddeb5Brian Paul      _mesa_error( ctx, GL_INVALID_VALUE, "glMap1(u1,u2)" );
374afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach      return;
375afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach   }
376fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul   if (uorder < 1 || uorder > MAX_EVAL_ORDER) {
37708836341788a9f9d638d9dc8328510ccd18ddeb5Brian Paul      _mesa_error( ctx, GL_INVALID_VALUE, "glMap1(order)" );
378afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach      return;
379afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach   }
380fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul   if (!points) {
38108836341788a9f9d638d9dc8328510ccd18ddeb5Brian Paul      _mesa_error( ctx, GL_INVALID_VALUE, "glMap1(points)" );
382fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul      return;
383fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul   }
384afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach
385fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul   k = _mesa_evaluator_components( target );
386fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul   if (k == 0) {
38708836341788a9f9d638d9dc8328510ccd18ddeb5Brian Paul      _mesa_error( ctx, GL_INVALID_ENUM, "glMap1(target)" );
388afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach   }
389afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach
390fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul   if (ustride < k) {
39108836341788a9f9d638d9dc8328510ccd18ddeb5Brian Paul      _mesa_error( ctx, GL_INVALID_VALUE, "glMap1(stride)" );
392afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach      return;
393afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach   }
394afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach
395441a4af435b46e1b475318fbaf4e80b774390cb0Brian Paul   if (ctx->Texture.CurrentUnit != 0) {
396441a4af435b46e1b475318fbaf4e80b774390cb0Brian Paul      /* See OpenGL 1.2.1 spec, section F.2.13 */
397441a4af435b46e1b475318fbaf4e80b774390cb0Brian Paul      _mesa_error( ctx, GL_INVALID_OPERATION, "glMap2(ACTIVE_TEXTURE != 0)" );
398441a4af435b46e1b475318fbaf4e80b774390cb0Brian Paul      return;
399441a4af435b46e1b475318fbaf4e80b774390cb0Brian Paul   }
400441a4af435b46e1b475318fbaf4e80b774390cb0Brian Paul
401bc42c19f22c3b719712529d86faea818f34150a2Brian Paul   map = get_1d_map(ctx, target);
402bc42c19f22c3b719712529d86faea818f34150a2Brian Paul   if (!map) {
403bc42c19f22c3b719712529d86faea818f34150a2Brian Paul      _mesa_error( ctx, GL_INVALID_ENUM, "glMap1(target)" );
404bc42c19f22c3b719712529d86faea818f34150a2Brian Paul      return;
405afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach   }
406a96308c37db0bc0086a017d318bc3504aa5f0b1aKeith Whitwell
407cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell   /* make copy of the control points */
408cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell   if (type == GL_FLOAT)
40908836341788a9f9d638d9dc8328510ccd18ddeb5Brian Paul      pnts = _mesa_copy_map_points1f(target, ustride, uorder, (GLfloat*) points);
410cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell   else
41108836341788a9f9d638d9dc8328510ccd18ddeb5Brian Paul      pnts = _mesa_copy_map_points1d(target, ustride, uorder, (GLdouble*) points);
412cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell
413cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell
414cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell   FLUSH_VERTICES(ctx, _NEW_EVAL);
415cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell   map->Order = uorder;
416cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell   map->u1 = u1;
417cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell   map->u2 = u2;
41894a6ec8f0c8a25aeeb5880e2285ae6042cfb99dbKarl Schultz   map->du = 1.0F / (u2 - u1);
419cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell   if (map->Points)
420cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell      FREE( map->Points );
421cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell   map->Points = pnts;
422afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach}
423afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach
424afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach
425afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach
426fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paulvoid
427fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul_mesa_Map1f( GLenum target, GLfloat u1, GLfloat u2, GLint stride,
428fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul             GLint order, const GLfloat *points )
429fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul{
430fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul   map1(target, u1, u2, stride, order, points, GL_FLOAT);
431fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul}
432afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach
433fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul
434fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paulvoid
435fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul_mesa_Map1d( GLenum target, GLdouble u1, GLdouble u2, GLint stride,
436fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul             GLint order, const GLdouble *points )
437afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach{
43894a6ec8f0c8a25aeeb5880e2285ae6042cfb99dbKarl Schultz   map1(target, (GLfloat) u1, (GLfloat) u2, stride, order, points, GL_DOUBLE);
439fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul}
440fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul
441fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul
442fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paulstatic void
443fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paulmap2( GLenum target, GLfloat u1, GLfloat u2, GLint ustride, GLint uorder,
444fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul      GLfloat v1, GLfloat v2, GLint vstride, GLint vorder,
445fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul      const GLvoid *points, GLenum type )
446fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul{
447fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul   GET_CURRENT_CONTEXT(ctx);
448afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach   GLint k;
449fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul   GLfloat *pnts;
450e2053d16901732f4947c702cdc5ef72993d8d130Brian Paul   struct gl_2d_map *map = NULL;
451e2053d16901732f4947c702cdc5ef72993d8d130Brian Paul
452cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell   ASSERT_OUTSIDE_BEGIN_END(ctx);
453e2053d16901732f4947c702cdc5ef72993d8d130Brian Paul   ASSERT(type == GL_FLOAT || type == GL_DOUBLE);
454afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach
455afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach   if (u1==u2) {
45608836341788a9f9d638d9dc8328510ccd18ddeb5Brian Paul      _mesa_error( ctx, GL_INVALID_VALUE, "glMap2(u1,u2)" );
457afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach      return;
458afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach   }
459afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach
460afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach   if (v1==v2) {
46108836341788a9f9d638d9dc8328510ccd18ddeb5Brian Paul      _mesa_error( ctx, GL_INVALID_VALUE, "glMap2(v1,v2)" );
462afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach      return;
463afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach   }
464afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach
465afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach   if (uorder<1 || uorder>MAX_EVAL_ORDER) {
46608836341788a9f9d638d9dc8328510ccd18ddeb5Brian Paul      _mesa_error( ctx, GL_INVALID_VALUE, "glMap2(uorder)" );
467afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach      return;
468afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach   }
469afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach
470afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach   if (vorder<1 || vorder>MAX_EVAL_ORDER) {
47108836341788a9f9d638d9dc8328510ccd18ddeb5Brian Paul      _mesa_error( ctx, GL_INVALID_VALUE, "glMap2(vorder)" );
472afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach      return;
473afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach   }
474afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach
475fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul   k = _mesa_evaluator_components( target );
476afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach   if (k==0) {
47708836341788a9f9d638d9dc8328510ccd18ddeb5Brian Paul      _mesa_error( ctx, GL_INVALID_ENUM, "glMap2(target)" );
478afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach   }
479afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach
480afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach   if (ustride < k) {
48108836341788a9f9d638d9dc8328510ccd18ddeb5Brian Paul      _mesa_error( ctx, GL_INVALID_VALUE, "glMap2(ustride)" );
482afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach      return;
483afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach   }
484afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach   if (vstride < k) {
48508836341788a9f9d638d9dc8328510ccd18ddeb5Brian Paul      _mesa_error( ctx, GL_INVALID_VALUE, "glMap2(vstride)" );
486afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach      return;
487afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach   }
488afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach
489441a4af435b46e1b475318fbaf4e80b774390cb0Brian Paul   if (ctx->Texture.CurrentUnit != 0) {
490441a4af435b46e1b475318fbaf4e80b774390cb0Brian Paul      /* See OpenGL 1.2.1 spec, section F.2.13 */
491441a4af435b46e1b475318fbaf4e80b774390cb0Brian Paul      _mesa_error( ctx, GL_INVALID_OPERATION, "glMap2(ACTIVE_TEXTURE != 0)" );
492441a4af435b46e1b475318fbaf4e80b774390cb0Brian Paul      return;
493441a4af435b46e1b475318fbaf4e80b774390cb0Brian Paul   }
494441a4af435b46e1b475318fbaf4e80b774390cb0Brian Paul
495bc42c19f22c3b719712529d86faea818f34150a2Brian Paul   map = get_2d_map(ctx, target);
496bc42c19f22c3b719712529d86faea818f34150a2Brian Paul   if (!map) {
497bc42c19f22c3b719712529d86faea818f34150a2Brian Paul      _mesa_error( ctx, GL_INVALID_ENUM, "glMap2(target)" );
498bc42c19f22c3b719712529d86faea818f34150a2Brian Paul      return;
499afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach   }
500a96308c37db0bc0086a017d318bc3504aa5f0b1aKeith Whitwell
501cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell   /* make copy of the control points */
502cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell   if (type == GL_FLOAT)
50308836341788a9f9d638d9dc8328510ccd18ddeb5Brian Paul      pnts = _mesa_copy_map_points2f(target, ustride, uorder,
504cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell                                  vstride, vorder, (GLfloat*) points);
505cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell   else
50608836341788a9f9d638d9dc8328510ccd18ddeb5Brian Paul      pnts = _mesa_copy_map_points2d(target, ustride, uorder,
507cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell                                  vstride, vorder, (GLdouble*) points);
50822144ab7552f0799bcfca506bf4ffa7f70a06649Gareth Hughes
50922144ab7552f0799bcfca506bf4ffa7f70a06649Gareth Hughes
510cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell   FLUSH_VERTICES(ctx, _NEW_EVAL);
511cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell   map->Uorder = uorder;
512cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell   map->u1 = u1;
513cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell   map->u2 = u2;
51494a6ec8f0c8a25aeeb5880e2285ae6042cfb99dbKarl Schultz   map->du = 1.0F / (u2 - u1);
515cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell   map->Vorder = vorder;
516cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell   map->v1 = v1;
517cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell   map->v2 = v2;
51894a6ec8f0c8a25aeeb5880e2285ae6042cfb99dbKarl Schultz   map->dv = 1.0F / (v2 - v1);
519cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell   if (map->Points)
520cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell      FREE( map->Points );
521cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell   map->Points = pnts;
522afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach}
523afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach
524afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach
525fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paulvoid
526fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul_mesa_Map2f( GLenum target,
527fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul             GLfloat u1, GLfloat u2, GLint ustride, GLint uorder,
528fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul             GLfloat v1, GLfloat v2, GLint vstride, GLint vorder,
529fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul             const GLfloat *points)
530fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul{
531fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul   map2(target, u1, u2, ustride, uorder, v1, v2, vstride, vorder,
532fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul        points, GL_FLOAT);
533fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul}
534afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach
535afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach
536fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paulvoid
537fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul_mesa_Map2d( GLenum target,
538fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul             GLdouble u1, GLdouble u2, GLint ustride, GLint uorder,
539fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul             GLdouble v1, GLdouble v2, GLint vstride, GLint vorder,
540fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul             const GLdouble *points )
541afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach{
54294a6ec8f0c8a25aeeb5880e2285ae6042cfb99dbKarl Schultz   map2(target, (GLfloat) u1, (GLfloat) u2, ustride, uorder,
54394a6ec8f0c8a25aeeb5880e2285ae6042cfb99dbKarl Schultz	(GLfloat) v1, (GLfloat) v2, vstride, vorder, points, GL_DOUBLE);
544fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul}
545fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul
546fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul
5475e3bc0c2a2bcdf59949410f94c9b705fc1281ce8Jouk Jansen
548fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paulvoid
549fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul_mesa_GetMapdv( GLenum target, GLenum query, GLdouble *v )
550fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul{
551fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul   GET_CURRENT_CONTEXT(ctx);
552bc42c19f22c3b719712529d86faea818f34150a2Brian Paul   struct gl_1d_map *map1d;
553bc42c19f22c3b719712529d86faea818f34150a2Brian Paul   struct gl_2d_map *map2d;
554afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach   GLint i, n;
555afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach   GLfloat *data;
556bc42c19f22c3b719712529d86faea818f34150a2Brian Paul   GLuint comps;
557bc42c19f22c3b719712529d86faea818f34150a2Brian Paul
558cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell   ASSERT_OUTSIDE_BEGIN_END(ctx);
559afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach
560bc42c19f22c3b719712529d86faea818f34150a2Brian Paul   comps = _mesa_evaluator_components(target);
561bc42c19f22c3b719712529d86faea818f34150a2Brian Paul   if (!comps) {
562bc42c19f22c3b719712529d86faea818f34150a2Brian Paul      _mesa_error( ctx, GL_INVALID_ENUM, "glGetMapdv(target)" );
563bc42c19f22c3b719712529d86faea818f34150a2Brian Paul      return;
564bc42c19f22c3b719712529d86faea818f34150a2Brian Paul   }
565bc42c19f22c3b719712529d86faea818f34150a2Brian Paul
566bc42c19f22c3b719712529d86faea818f34150a2Brian Paul   map1d = get_1d_map(ctx, target);
567bc42c19f22c3b719712529d86faea818f34150a2Brian Paul   map2d = get_2d_map(ctx, target);
568bc42c19f22c3b719712529d86faea818f34150a2Brian Paul   ASSERT(map1d || map2d);
569bc42c19f22c3b719712529d86faea818f34150a2Brian Paul
570afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach   switch (query) {
571afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach      case GL_COEFF:
572bc42c19f22c3b719712529d86faea818f34150a2Brian Paul         if (map1d) {
573bc42c19f22c3b719712529d86faea818f34150a2Brian Paul            data = map1d->Points;
574bc42c19f22c3b719712529d86faea818f34150a2Brian Paul            n = map1d->Order * comps;
575bc42c19f22c3b719712529d86faea818f34150a2Brian Paul         }
576bc42c19f22c3b719712529d86faea818f34150a2Brian Paul         else {
577bc42c19f22c3b719712529d86faea818f34150a2Brian Paul            data = map2d->Points;
578bc42c19f22c3b719712529d86faea818f34150a2Brian Paul            n = map2d->Uorder * map2d->Vorder * comps;
579bc42c19f22c3b719712529d86faea818f34150a2Brian Paul         }
580afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach	 if (data) {
581afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach	    for (i=0;i<n;i++) {
582afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach	       v[i] = data[i];
583afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach	    }
584afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach	 }
585afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach         break;
586afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach      case GL_ORDER:
587bc42c19f22c3b719712529d86faea818f34150a2Brian Paul         if (map1d) {
588bc42c19f22c3b719712529d86faea818f34150a2Brian Paul            v[0] = (GLdouble) map1d->Order;
589bc42c19f22c3b719712529d86faea818f34150a2Brian Paul         }
590bc42c19f22c3b719712529d86faea818f34150a2Brian Paul         else {
591bc42c19f22c3b719712529d86faea818f34150a2Brian Paul            v[0] = (GLdouble) map2d->Uorder;
592bc42c19f22c3b719712529d86faea818f34150a2Brian Paul            v[1] = (GLdouble) map2d->Vorder;
593bc42c19f22c3b719712529d86faea818f34150a2Brian Paul         }
594afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach         break;
595afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach      case GL_DOMAIN:
596bc42c19f22c3b719712529d86faea818f34150a2Brian Paul         if (map1d) {
597bc42c19f22c3b719712529d86faea818f34150a2Brian Paul            v[0] = (GLdouble) map1d->u1;
598bc42c19f22c3b719712529d86faea818f34150a2Brian Paul            v[1] = (GLdouble) map1d->u2;
599bc42c19f22c3b719712529d86faea818f34150a2Brian Paul         }
600bc42c19f22c3b719712529d86faea818f34150a2Brian Paul         else {
601bc42c19f22c3b719712529d86faea818f34150a2Brian Paul            v[0] = (GLdouble) map2d->u1;
602bc42c19f22c3b719712529d86faea818f34150a2Brian Paul            v[1] = (GLdouble) map2d->u2;
603bc42c19f22c3b719712529d86faea818f34150a2Brian Paul            v[2] = (GLdouble) map2d->v1;
604bc42c19f22c3b719712529d86faea818f34150a2Brian Paul            v[3] = (GLdouble) map2d->v2;
605bc42c19f22c3b719712529d86faea818f34150a2Brian Paul         }
606afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach         break;
607afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach      default:
60808836341788a9f9d638d9dc8328510ccd18ddeb5Brian Paul         _mesa_error( ctx, GL_INVALID_ENUM, "glGetMapdv(query)" );
609afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach   }
610afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach}
611afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach
612afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach
613fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paulvoid
614fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul_mesa_GetMapfv( GLenum target, GLenum query, GLfloat *v )
615afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach{
616fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul   GET_CURRENT_CONTEXT(ctx);
617bc42c19f22c3b719712529d86faea818f34150a2Brian Paul   struct gl_1d_map *map1d;
618bc42c19f22c3b719712529d86faea818f34150a2Brian Paul   struct gl_2d_map *map2d;
619afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach   GLint i, n;
620afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach   GLfloat *data;
621bc42c19f22c3b719712529d86faea818f34150a2Brian Paul   GLuint comps;
622bc42c19f22c3b719712529d86faea818f34150a2Brian Paul
623cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell   ASSERT_OUTSIDE_BEGIN_END(ctx);
624afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach
625bc42c19f22c3b719712529d86faea818f34150a2Brian Paul   comps = _mesa_evaluator_components(target);
626bc42c19f22c3b719712529d86faea818f34150a2Brian Paul   if (!comps) {
627e2053d16901732f4947c702cdc5ef72993d8d130Brian Paul      _mesa_error( ctx, GL_INVALID_ENUM, "glGetMapfv(target)" );
628bc42c19f22c3b719712529d86faea818f34150a2Brian Paul      return;
629bc42c19f22c3b719712529d86faea818f34150a2Brian Paul   }
630bc42c19f22c3b719712529d86faea818f34150a2Brian Paul
631bc42c19f22c3b719712529d86faea818f34150a2Brian Paul   map1d = get_1d_map(ctx, target);
632bc42c19f22c3b719712529d86faea818f34150a2Brian Paul   map2d = get_2d_map(ctx, target);
633bc42c19f22c3b719712529d86faea818f34150a2Brian Paul   ASSERT(map1d || map2d);
634bc42c19f22c3b719712529d86faea818f34150a2Brian Paul
635afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach   switch (query) {
636afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach      case GL_COEFF:
637bc42c19f22c3b719712529d86faea818f34150a2Brian Paul         if (map1d) {
638bc42c19f22c3b719712529d86faea818f34150a2Brian Paul            data = map1d->Points;
639bc42c19f22c3b719712529d86faea818f34150a2Brian Paul            n = map1d->Order * comps;
640bc42c19f22c3b719712529d86faea818f34150a2Brian Paul         }
641bc42c19f22c3b719712529d86faea818f34150a2Brian Paul         else {
642bc42c19f22c3b719712529d86faea818f34150a2Brian Paul            data = map2d->Points;
643bc42c19f22c3b719712529d86faea818f34150a2Brian Paul            n = map2d->Uorder * map2d->Vorder * comps;
644bc42c19f22c3b719712529d86faea818f34150a2Brian Paul         }
645afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach	 if (data) {
646afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach	    for (i=0;i<n;i++) {
647afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach	       v[i] = data[i];
648afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach	    }
649afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach	 }
650afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach         break;
651afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach      case GL_ORDER:
652bc42c19f22c3b719712529d86faea818f34150a2Brian Paul         if (map1d) {
653bc42c19f22c3b719712529d86faea818f34150a2Brian Paul            v[0] = (GLfloat) map1d->Order;
654bc42c19f22c3b719712529d86faea818f34150a2Brian Paul         }
655bc42c19f22c3b719712529d86faea818f34150a2Brian Paul         else {
656bc42c19f22c3b719712529d86faea818f34150a2Brian Paul            v[0] = (GLfloat) map2d->Uorder;
657bc42c19f22c3b719712529d86faea818f34150a2Brian Paul            v[1] = (GLfloat) map2d->Vorder;
658bc42c19f22c3b719712529d86faea818f34150a2Brian Paul         }
659afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach         break;
660afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach      case GL_DOMAIN:
661bc42c19f22c3b719712529d86faea818f34150a2Brian Paul         if (map1d) {
662bc42c19f22c3b719712529d86faea818f34150a2Brian Paul            v[0] = map1d->u1;
663bc42c19f22c3b719712529d86faea818f34150a2Brian Paul            v[1] = map1d->u2;
664bc42c19f22c3b719712529d86faea818f34150a2Brian Paul         }
665bc42c19f22c3b719712529d86faea818f34150a2Brian Paul         else {
666bc42c19f22c3b719712529d86faea818f34150a2Brian Paul            v[0] = map2d->u1;
667bc42c19f22c3b719712529d86faea818f34150a2Brian Paul            v[1] = map2d->u2;
668bc42c19f22c3b719712529d86faea818f34150a2Brian Paul            v[2] = map2d->v1;
669bc42c19f22c3b719712529d86faea818f34150a2Brian Paul            v[3] = map2d->v2;
670bc42c19f22c3b719712529d86faea818f34150a2Brian Paul         }
671afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach         break;
672afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach      default:
67308836341788a9f9d638d9dc8328510ccd18ddeb5Brian Paul         _mesa_error( ctx, GL_INVALID_ENUM, "glGetMapfv(query)" );
674afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach   }
675afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach}
676afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach
677afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach
678fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paulvoid
679fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul_mesa_GetMapiv( GLenum target, GLenum query, GLint *v )
680afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach{
681fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul   GET_CURRENT_CONTEXT(ctx);
682bc42c19f22c3b719712529d86faea818f34150a2Brian Paul   struct gl_1d_map *map1d;
683bc42c19f22c3b719712529d86faea818f34150a2Brian Paul   struct gl_2d_map *map2d;
684afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach   GLuint i, n;
685afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach   GLfloat *data;
686bc42c19f22c3b719712529d86faea818f34150a2Brian Paul   GLuint comps;
687bc42c19f22c3b719712529d86faea818f34150a2Brian Paul
688cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell   ASSERT_OUTSIDE_BEGIN_END(ctx);
689afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach
690bc42c19f22c3b719712529d86faea818f34150a2Brian Paul   comps = _mesa_evaluator_components(target);
691bc42c19f22c3b719712529d86faea818f34150a2Brian Paul   if (!comps) {
692e2053d16901732f4947c702cdc5ef72993d8d130Brian Paul      _mesa_error( ctx, GL_INVALID_ENUM, "glGetMapiv(target)" );
693bc42c19f22c3b719712529d86faea818f34150a2Brian Paul      return;
694bc42c19f22c3b719712529d86faea818f34150a2Brian Paul   }
695bc42c19f22c3b719712529d86faea818f34150a2Brian Paul
696bc42c19f22c3b719712529d86faea818f34150a2Brian Paul   map1d = get_1d_map(ctx, target);
697bc42c19f22c3b719712529d86faea818f34150a2Brian Paul   map2d = get_2d_map(ctx, target);
698bc42c19f22c3b719712529d86faea818f34150a2Brian Paul   ASSERT(map1d || map2d);
699bc42c19f22c3b719712529d86faea818f34150a2Brian Paul
700afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach   switch (query) {
701afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach      case GL_COEFF:
702bc42c19f22c3b719712529d86faea818f34150a2Brian Paul         if (map1d) {
703bc42c19f22c3b719712529d86faea818f34150a2Brian Paul            data = map1d->Points;
704bc42c19f22c3b719712529d86faea818f34150a2Brian Paul            n = map1d->Order * comps;
705bc42c19f22c3b719712529d86faea818f34150a2Brian Paul         }
706bc42c19f22c3b719712529d86faea818f34150a2Brian Paul         else {
707bc42c19f22c3b719712529d86faea818f34150a2Brian Paul            data = map2d->Points;
708bc42c19f22c3b719712529d86faea818f34150a2Brian Paul            n = map2d->Uorder * map2d->Vorder * comps;
709bc42c19f22c3b719712529d86faea818f34150a2Brian Paul         }
710afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach	 if (data) {
711afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach	    for (i=0;i<n;i++) {
712afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach	       v[i] = ROUNDF(data[i]);
713afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach	    }
714afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach	 }
715afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach         break;
716afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach      case GL_ORDER:
717bc42c19f22c3b719712529d86faea818f34150a2Brian Paul         if (map1d) {
718bc42c19f22c3b719712529d86faea818f34150a2Brian Paul            v[0] = map1d->Order;
719bc42c19f22c3b719712529d86faea818f34150a2Brian Paul         }
720bc42c19f22c3b719712529d86faea818f34150a2Brian Paul         else {
721bc42c19f22c3b719712529d86faea818f34150a2Brian Paul            v[0] = map2d->Uorder;
722bc42c19f22c3b719712529d86faea818f34150a2Brian Paul            v[1] = map2d->Vorder;
723bc42c19f22c3b719712529d86faea818f34150a2Brian Paul         }
724afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach         break;
725afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach      case GL_DOMAIN:
726bc42c19f22c3b719712529d86faea818f34150a2Brian Paul         if (map1d) {
727bc42c19f22c3b719712529d86faea818f34150a2Brian Paul            v[0] = ROUNDF(map1d->u1);
728bc42c19f22c3b719712529d86faea818f34150a2Brian Paul            v[1] = ROUNDF(map1d->u2);
729bc42c19f22c3b719712529d86faea818f34150a2Brian Paul         }
730bc42c19f22c3b719712529d86faea818f34150a2Brian Paul         else {
731bc42c19f22c3b719712529d86faea818f34150a2Brian Paul            v[0] = ROUNDF(map2d->u1);
732bc42c19f22c3b719712529d86faea818f34150a2Brian Paul            v[1] = ROUNDF(map2d->u2);
733bc42c19f22c3b719712529d86faea818f34150a2Brian Paul            v[2] = ROUNDF(map2d->v1);
734bc42c19f22c3b719712529d86faea818f34150a2Brian Paul            v[3] = ROUNDF(map2d->v2);
735bc42c19f22c3b719712529d86faea818f34150a2Brian Paul         }
736afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach         break;
737afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach      default:
73808836341788a9f9d638d9dc8328510ccd18ddeb5Brian Paul         _mesa_error( ctx, GL_INVALID_ENUM, "glGetMapiv(query)" );
739afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach   }
740afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach}
741afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach
742afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach
743afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach
744fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paulvoid
745fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul_mesa_MapGrid1f( GLint un, GLfloat u1, GLfloat u2 )
746afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach{
747fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul   GET_CURRENT_CONTEXT(ctx);
748cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell   ASSERT_OUTSIDE_BEGIN_END(ctx);
749afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach
750afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach   if (un<1) {
75108836341788a9f9d638d9dc8328510ccd18ddeb5Brian Paul      _mesa_error( ctx, GL_INVALID_VALUE, "glMapGrid1f" );
752afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach      return;
753afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach   }
754cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell   FLUSH_VERTICES(ctx, _NEW_EVAL);
755afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach   ctx->Eval.MapGrid1un = un;
756afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach   ctx->Eval.MapGrid1u1 = u1;
757afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach   ctx->Eval.MapGrid1u2 = u2;
758afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach   ctx->Eval.MapGrid1du = (u2 - u1) / (GLfloat) un;
759afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach}
760afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach
761afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach
762fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paulvoid
763fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul_mesa_MapGrid1d( GLint un, GLdouble u1, GLdouble u2 )
764fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul{
76594a6ec8f0c8a25aeeb5880e2285ae6042cfb99dbKarl Schultz   _mesa_MapGrid1f( un, (GLfloat) u1, (GLfloat) u2 );
766fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul}
767fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul
768fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul
769fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paulvoid
770fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul_mesa_MapGrid2f( GLint un, GLfloat u1, GLfloat u2,
771fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul                 GLint vn, GLfloat v1, GLfloat v2 )
772afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach{
773fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul   GET_CURRENT_CONTEXT(ctx);
774cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell   ASSERT_OUTSIDE_BEGIN_END(ctx);
775cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell
776afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach   if (un<1) {
77708836341788a9f9d638d9dc8328510ccd18ddeb5Brian Paul      _mesa_error( ctx, GL_INVALID_VALUE, "glMapGrid2f(un)" );
778afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach      return;
779afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach   }
780afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach   if (vn<1) {
78108836341788a9f9d638d9dc8328510ccd18ddeb5Brian Paul      _mesa_error( ctx, GL_INVALID_VALUE, "glMapGrid2f(vn)" );
782afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach      return;
783afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach   }
784cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell
785cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell   FLUSH_VERTICES(ctx, _NEW_EVAL);
786afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach   ctx->Eval.MapGrid2un = un;
787afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach   ctx->Eval.MapGrid2u1 = u1;
788afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach   ctx->Eval.MapGrid2u2 = u2;
789afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach   ctx->Eval.MapGrid2du = (u2 - u1) / (GLfloat) un;
790afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach   ctx->Eval.MapGrid2vn = vn;
791afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach   ctx->Eval.MapGrid2v1 = v1;
792afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach   ctx->Eval.MapGrid2v2 = v2;
793afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach   ctx->Eval.MapGrid2dv = (v2 - v1) / (GLfloat) vn;
794afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach}
795afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach
796afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach
797fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paulvoid
798fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul_mesa_MapGrid2d( GLint un, GLdouble u1, GLdouble u2,
799fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul                 GLint vn, GLdouble v1, GLdouble v2 )
800fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul{
80194a6ec8f0c8a25aeeb5880e2285ae6042cfb99dbKarl Schultz   _mesa_MapGrid2f( un, (GLfloat) u1, (GLfloat) u2,
80294a6ec8f0c8a25aeeb5880e2285ae6042cfb99dbKarl Schultz		    vn, (GLfloat) v1, (GLfloat) v2 );
803fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul}
804