1afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach
2afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach/*
3afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach * Mesa 3-D graphics library
45e3bc0c2a2bcdf59949410f94c9b705fc1281ce8Jouk Jansen *
527558a160a9fe91745728d7626995cd88f8fe339Brian Paul * Copyright (C) 1999-2003  Brian Paul   All Rights Reserved.
65e3bc0c2a2bcdf59949410f94c9b705fc1281ce8Jouk Jansen *
7afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach * Permission is hereby granted, free of charge, to any person obtaining a
8afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach * copy of this software and associated documentation files (the "Software"),
9afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach * to deal in the Software without restriction, including without limitation
10afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach * the rights to use, copy, modify, merge, publish, distribute, sublicense,
11afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach * and/or sell copies of the Software, and to permit persons to whom the
12afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach * Software is furnished to do so, subject to the following conditions:
135e3bc0c2a2bcdf59949410f94c9b705fc1281ce8Jouk Jansen *
14afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach * The above copyright notice and this permission notice shall be included
15afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach * in all copies or substantial portions of the Software.
165e3bc0c2a2bcdf59949410f94c9b705fc1281ce8Jouk Jansen *
17afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
18afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
19afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
203d8d5b298a268b119d840bc9bae0ee9e0c9244a9Kenneth Graunke * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR
213d8d5b298a268b119d840bc9bae0ee9e0c9244a9Kenneth Graunke * OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
223d8d5b298a268b119d840bc9bae0ee9e0c9244a9Kenneth Graunke * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
233d8d5b298a268b119d840bc9bae0ee9e0c9244a9Kenneth Graunke * OTHER DEALINGS IN THE SOFTWARE.
24afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach */
25afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach
26afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach
27afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach/*
28afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach * eval.c was written by
29afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach * Bernd Barsuhn (bdbarsuh@cip.informatik.uni-erlangen.de) and
30afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach * Volker Weiss (vrweiss@cip.informatik.uni-erlangen.de).
31afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach *
32afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach * My original implementation of evaluators was simplistic and didn't
33afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach * compute surface normal vectors properly.  Bernd and Volker applied
34afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach * used more sophisticated methods to get better results.
35afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach *
36afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach * Thanks guys!
37afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach */
38afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach
39afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach
40fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul#include "glheader.h"
413c63452e64df7e10aa073c6c3b9492b1d7dabbb8Brian Paul#include "imports.h"
42afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach#include "context.h"
43afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach#include "eval.h"
44afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach#include "macros.h"
455e3bc0c2a2bcdf59949410f94c9b705fc1281ce8Jouk Jansen#include "mtypes.h"
462cf44390d1e819f23e1d7ceb3199276c9148c647Chia-I Wu#include "main/dispatch.h"
47aefa1f6ab1d9267b223b06ae205ab34c8e0d7c02Chia-I Wu
48aefa1f6ab1d9267b223b06ae205ab34c8e0d7c02Chia-I Wu
49afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach/*
50afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach * Return the number of components per control point for any type of
51afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach * evaluator.  Return 0 if bad target.
52fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul * See table 5.1 in the OpenGL 1.2 spec.
53afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach */
54fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian PaulGLuint _mesa_evaluator_components( GLenum target )
55afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach{
56afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach   switch (target) {
57afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach      case GL_MAP1_VERTEX_3:		return 3;
58afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach      case GL_MAP1_VERTEX_4:		return 4;
59afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach      case GL_MAP1_INDEX:		return 1;
60afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach      case GL_MAP1_COLOR_4:		return 4;
61afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach      case GL_MAP1_NORMAL:		return 3;
62afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach      case GL_MAP1_TEXTURE_COORD_1:	return 1;
63afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach      case GL_MAP1_TEXTURE_COORD_2:	return 2;
64afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach      case GL_MAP1_TEXTURE_COORD_3:	return 3;
65afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach      case GL_MAP1_TEXTURE_COORD_4:	return 4;
66afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach      case GL_MAP2_VERTEX_3:		return 3;
67afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach      case GL_MAP2_VERTEX_4:		return 4;
68afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach      case GL_MAP2_INDEX:		return 1;
69afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach      case GL_MAP2_COLOR_4:		return 4;
70afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach      case GL_MAP2_NORMAL:		return 3;
71afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach      case GL_MAP2_TEXTURE_COORD_1:	return 1;
72afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach      case GL_MAP2_TEXTURE_COORD_2:	return 2;
73afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach      case GL_MAP2_TEXTURE_COORD_3:	return 3;
74afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach      case GL_MAP2_TEXTURE_COORD_4:	return 4;
75bc42c19f22c3b719712529d86faea818f34150a2Brian Paul      default:				break;
76bc42c19f22c3b719712529d86faea818f34150a2Brian Paul   }
77bc42c19f22c3b719712529d86faea818f34150a2Brian Paul
78bc42c19f22c3b719712529d86faea818f34150a2Brian Paul   return 0;
79bc42c19f22c3b719712529d86faea818f34150a2Brian Paul}
80bc42c19f22c3b719712529d86faea818f34150a2Brian Paul
81bc42c19f22c3b719712529d86faea818f34150a2Brian Paul
82bc42c19f22c3b719712529d86faea818f34150a2Brian Paul/*
83bc42c19f22c3b719712529d86faea818f34150a2Brian Paul * Return pointer to the gl_1d_map struct for the named target.
84bc42c19f22c3b719712529d86faea818f34150a2Brian Paul */
85bc42c19f22c3b719712529d86faea818f34150a2Brian Paulstatic struct gl_1d_map *
86f9995b30756140724f41daf963fa06167912be7fKristian Høgsbergget_1d_map( struct gl_context *ctx, GLenum target )
87bc42c19f22c3b719712529d86faea818f34150a2Brian Paul{
88bc42c19f22c3b719712529d86faea818f34150a2Brian Paul   switch (target) {
89bc42c19f22c3b719712529d86faea818f34150a2Brian Paul      case GL_MAP1_VERTEX_3:
90bc42c19f22c3b719712529d86faea818f34150a2Brian Paul         return &ctx->EvalMap.Map1Vertex3;
91bc42c19f22c3b719712529d86faea818f34150a2Brian Paul      case GL_MAP1_VERTEX_4:
92bc42c19f22c3b719712529d86faea818f34150a2Brian Paul         return &ctx->EvalMap.Map1Vertex4;
93bc42c19f22c3b719712529d86faea818f34150a2Brian Paul      case GL_MAP1_INDEX:
94bc42c19f22c3b719712529d86faea818f34150a2Brian Paul         return &ctx->EvalMap.Map1Index;
95bc42c19f22c3b719712529d86faea818f34150a2Brian Paul      case GL_MAP1_COLOR_4:
96bc42c19f22c3b719712529d86faea818f34150a2Brian Paul         return &ctx->EvalMap.Map1Color4;
97bc42c19f22c3b719712529d86faea818f34150a2Brian Paul      case GL_MAP1_NORMAL:
98bc42c19f22c3b719712529d86faea818f34150a2Brian Paul         return &ctx->EvalMap.Map1Normal;
99bc42c19f22c3b719712529d86faea818f34150a2Brian Paul      case GL_MAP1_TEXTURE_COORD_1:
100bc42c19f22c3b719712529d86faea818f34150a2Brian Paul         return &ctx->EvalMap.Map1Texture1;
101bc42c19f22c3b719712529d86faea818f34150a2Brian Paul      case GL_MAP1_TEXTURE_COORD_2:
102bc42c19f22c3b719712529d86faea818f34150a2Brian Paul         return &ctx->EvalMap.Map1Texture2;
103bc42c19f22c3b719712529d86faea818f34150a2Brian Paul      case GL_MAP1_TEXTURE_COORD_3:
104bc42c19f22c3b719712529d86faea818f34150a2Brian Paul         return &ctx->EvalMap.Map1Texture3;
105bc42c19f22c3b719712529d86faea818f34150a2Brian Paul      case GL_MAP1_TEXTURE_COORD_4:
106bc42c19f22c3b719712529d86faea818f34150a2Brian Paul         return &ctx->EvalMap.Map1Texture4;
107bc42c19f22c3b719712529d86faea818f34150a2Brian Paul      default:
108bc42c19f22c3b719712529d86faea818f34150a2Brian Paul         return NULL;
109bc42c19f22c3b719712529d86faea818f34150a2Brian Paul   }
110bc42c19f22c3b719712529d86faea818f34150a2Brian Paul}
111bc42c19f22c3b719712529d86faea818f34150a2Brian Paul
112bc42c19f22c3b719712529d86faea818f34150a2Brian Paul
113bc42c19f22c3b719712529d86faea818f34150a2Brian Paul/*
114bc42c19f22c3b719712529d86faea818f34150a2Brian Paul * Return pointer to the gl_2d_map struct for the named target.
115bc42c19f22c3b719712529d86faea818f34150a2Brian Paul */
116bc42c19f22c3b719712529d86faea818f34150a2Brian Paulstatic struct gl_2d_map *
117f9995b30756140724f41daf963fa06167912be7fKristian Høgsbergget_2d_map( struct gl_context *ctx, GLenum target )
118bc42c19f22c3b719712529d86faea818f34150a2Brian Paul{
119bc42c19f22c3b719712529d86faea818f34150a2Brian Paul   switch (target) {
120bc42c19f22c3b719712529d86faea818f34150a2Brian Paul      case GL_MAP2_VERTEX_3:
121bc42c19f22c3b719712529d86faea818f34150a2Brian Paul         return &ctx->EvalMap.Map2Vertex3;
122bc42c19f22c3b719712529d86faea818f34150a2Brian Paul      case GL_MAP2_VERTEX_4:
123bc42c19f22c3b719712529d86faea818f34150a2Brian Paul         return &ctx->EvalMap.Map2Vertex4;
124bc42c19f22c3b719712529d86faea818f34150a2Brian Paul      case GL_MAP2_INDEX:
125bc42c19f22c3b719712529d86faea818f34150a2Brian Paul         return &ctx->EvalMap.Map2Index;
126bc42c19f22c3b719712529d86faea818f34150a2Brian Paul      case GL_MAP2_COLOR_4:
127bc42c19f22c3b719712529d86faea818f34150a2Brian Paul         return &ctx->EvalMap.Map2Color4;
128bc42c19f22c3b719712529d86faea818f34150a2Brian Paul      case GL_MAP2_NORMAL:
129bc42c19f22c3b719712529d86faea818f34150a2Brian Paul         return &ctx->EvalMap.Map2Normal;
130bc42c19f22c3b719712529d86faea818f34150a2Brian Paul      case GL_MAP2_TEXTURE_COORD_1:
131bc42c19f22c3b719712529d86faea818f34150a2Brian Paul         return &ctx->EvalMap.Map2Texture1;
132bc42c19f22c3b719712529d86faea818f34150a2Brian Paul      case GL_MAP2_TEXTURE_COORD_2:
133bc42c19f22c3b719712529d86faea818f34150a2Brian Paul         return &ctx->EvalMap.Map2Texture2;
134bc42c19f22c3b719712529d86faea818f34150a2Brian Paul      case GL_MAP2_TEXTURE_COORD_3:
135bc42c19f22c3b719712529d86faea818f34150a2Brian Paul         return &ctx->EvalMap.Map2Texture3;
136bc42c19f22c3b719712529d86faea818f34150a2Brian Paul      case GL_MAP2_TEXTURE_COORD_4:
137bc42c19f22c3b719712529d86faea818f34150a2Brian Paul         return &ctx->EvalMap.Map2Texture4;
138bc42c19f22c3b719712529d86faea818f34150a2Brian Paul      default:
139bc42c19f22c3b719712529d86faea818f34150a2Brian Paul         return NULL;
140afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach   }
141afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach}
142afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach
143afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach
144afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach/**********************************************************************/
145afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach/***            Copy and deallocate control points                  ***/
146afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach/**********************************************************************/
147afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach
148afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach
149afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach/*
1505e3bc0c2a2bcdf59949410f94c9b705fc1281ce8Jouk Jansen * Copy 1-parametric evaluator control points from user-specified
151afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach * memory space to a buffer of contiguous control points.
1526dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell * \param see glMap1f for details
1536dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell * \return pointer to buffer of contiguous control points or NULL if out
154afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach *          of memory.
155afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach */
15608836341788a9f9d638d9dc8328510ccd18ddeb5Brian PaulGLfloat *_mesa_copy_map_points1f( GLenum target, GLint ustride, GLint uorder,
157bc42c19f22c3b719712529d86faea818f34150a2Brian Paul                                  const GLfloat *points )
158afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach{
159afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach   GLfloat *buffer, *p;
160fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul   GLint i, k, size = _mesa_evaluator_components(target);
161afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach
162bc42c19f22c3b719712529d86faea818f34150a2Brian Paul   if (!points || !size)
163afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach      return NULL;
164afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach
1652b7a972e3f36bfcdc6fbe2b59d7ffdcde49c9405Matt Turner   buffer = malloc(uorder * size * sizeof(GLfloat));
166afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach
167bc42c19f22c3b719712529d86faea818f34150a2Brian Paul   if (buffer)
168bc42c19f22c3b719712529d86faea818f34150a2Brian Paul      for (i = 0, p = buffer; i < uorder; i++, points += ustride)
169bc42c19f22c3b719712529d86faea818f34150a2Brian Paul	for (k = 0; k < size; k++)
170afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach	  *p++ = points[k];
171afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach
172afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach   return buffer;
173afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach}
174afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach
175afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach
176afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach
177afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach/*
178afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach * Same as above but convert doubles to floats.
179afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach */
18008836341788a9f9d638d9dc8328510ccd18ddeb5Brian PaulGLfloat *_mesa_copy_map_points1d( GLenum target, GLint ustride, GLint uorder,
181bc42c19f22c3b719712529d86faea818f34150a2Brian Paul                                  const GLdouble *points )
182afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach{
183afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach   GLfloat *buffer, *p;
184fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul   GLint i, k, size = _mesa_evaluator_components(target);
185afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach
186bc42c19f22c3b719712529d86faea818f34150a2Brian Paul   if (!points || !size)
187afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach      return NULL;
188afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach
1892b7a972e3f36bfcdc6fbe2b59d7ffdcde49c9405Matt Turner   buffer = malloc(uorder * size * sizeof(GLfloat));
190afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach
191bc42c19f22c3b719712529d86faea818f34150a2Brian Paul   if (buffer)
192bc42c19f22c3b719712529d86faea818f34150a2Brian Paul      for (i = 0, p = buffer; i < uorder; i++, points += ustride)
193bc42c19f22c3b719712529d86faea818f34150a2Brian Paul	for (k = 0; k < size; k++)
194afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach	  *p++ = (GLfloat) points[k];
195afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach
196afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach   return buffer;
197afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach}
198afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach
199afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach
200afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach
201afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach/*
2025e3bc0c2a2bcdf59949410f94c9b705fc1281ce8Jouk Jansen * Copy 2-parametric evaluator control points from user-specified
203afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach * memory space to a buffer of contiguous control points.
204afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach * Additional memory is allocated to be used by the horner and
205afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach * de Casteljau evaluation schemes.
206afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach *
2076dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell * \param see glMap2f for details
2086dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell * \return pointer to buffer of contiguous control points or NULL if out
209afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach *          of memory.
210afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach */
21108836341788a9f9d638d9dc8328510ccd18ddeb5Brian PaulGLfloat *_mesa_copy_map_points2f( GLenum target,
212e2053d16901732f4947c702cdc5ef72993d8d130Brian Paul                                  GLint ustride, GLint uorder,
213e2053d16901732f4947c702cdc5ef72993d8d130Brian Paul                                  GLint vstride, GLint vorder,
214e2053d16901732f4947c702cdc5ef72993d8d130Brian Paul                                  const GLfloat *points )
215afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach{
216afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach   GLfloat *buffer, *p;
217afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach   GLint i, j, k, size, dsize, hsize;
218afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach   GLint uinc;
219afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach
220fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul   size = _mesa_evaluator_components(target);
221afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach
222afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach   if (!points || size==0) {
223afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach      return NULL;
224afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach   }
225afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach
226afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach   /* max(uorder, vorder) additional points are used in      */
227afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach   /* horner evaluation and uorder*vorder additional */
228afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach   /* values are needed for de Casteljau                     */
229afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach   dsize = (uorder == 2 && vorder == 2)? 0 : uorder*vorder;
230afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach   hsize = (uorder > vorder ? uorder : vorder)*size;
231afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach
232afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach   if(hsize>dsize)
2332b7a972e3f36bfcdc6fbe2b59d7ffdcde49c9405Matt Turner     buffer = malloc((uorder*vorder*size+hsize)*sizeof(GLfloat));
234afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach   else
2352b7a972e3f36bfcdc6fbe2b59d7ffdcde49c9405Matt Turner     buffer = malloc((uorder*vorder*size+dsize)*sizeof(GLfloat));
236afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach
237afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach   /* compute the increment value for the u-loop */
238afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach   uinc = ustride - vorder*vstride;
239afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach
2405e3bc0c2a2bcdf59949410f94c9b705fc1281ce8Jouk Jansen   if (buffer)
241afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach      for (i=0, p=buffer; i<uorder; i++, points += uinc)
242afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach	 for (j=0; j<vorder; j++, points += vstride)
243afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach	    for (k=0; k<size; k++)
244afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach	       *p++ = points[k];
245afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach
246afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach   return buffer;
247afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach}
248afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach
249afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach
250afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach
251afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach/*
252afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach * Same as above but convert doubles to floats.
253afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach */
25408836341788a9f9d638d9dc8328510ccd18ddeb5Brian PaulGLfloat *_mesa_copy_map_points2d(GLenum target,
255e2053d16901732f4947c702cdc5ef72993d8d130Brian Paul                                 GLint ustride, GLint uorder,
256e2053d16901732f4947c702cdc5ef72993d8d130Brian Paul                                 GLint vstride, GLint vorder,
257e2053d16901732f4947c702cdc5ef72993d8d130Brian Paul                                 const GLdouble *points )
258afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach{
259afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach   GLfloat *buffer, *p;
260afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach   GLint i, j, k, size, hsize, dsize;
261afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach   GLint uinc;
262afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach
263fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul   size = _mesa_evaluator_components(target);
264afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach
265afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach   if (!points || size==0) {
266afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach      return NULL;
267afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach   }
268afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach
269afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach   /* max(uorder, vorder) additional points are used in      */
270afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach   /* horner evaluation and uorder*vorder additional */
271afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach   /* values are needed for de Casteljau                     */
272afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach   dsize = (uorder == 2 && vorder == 2)? 0 : uorder*vorder;
273afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach   hsize = (uorder > vorder ? uorder : vorder)*size;
274afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach
275afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach   if(hsize>dsize)
2762b7a972e3f36bfcdc6fbe2b59d7ffdcde49c9405Matt Turner     buffer = malloc((uorder*vorder*size+hsize)*sizeof(GLfloat));
277afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach   else
2782b7a972e3f36bfcdc6fbe2b59d7ffdcde49c9405Matt Turner     buffer = malloc((uorder*vorder*size+dsize)*sizeof(GLfloat));
279afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach
280afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach   /* compute the increment value for the u-loop */
281afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach   uinc = ustride - vorder*vstride;
282afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach
2835e3bc0c2a2bcdf59949410f94c9b705fc1281ce8Jouk Jansen   if (buffer)
284afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach      for (i=0, p=buffer; i<uorder; i++, points += uinc)
285afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach	 for (j=0; j<vorder; j++, points += vstride)
286afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach	    for (k=0; k<size; k++)
287afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach	       *p++ = (GLfloat) points[k];
288afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach
289afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach   return buffer;
290afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach}
291afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach
292afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach
293afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach
294afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach
295afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach/**********************************************************************/
296afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach/***                      API entry points                          ***/
297afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach/**********************************************************************/
298afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach
299afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach
300afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach/*
301fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul * This does the work of glMap1[fd].
302afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach */
303fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paulstatic void
304fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paulmap1(GLenum target, GLfloat u1, GLfloat u2, GLint ustride,
305fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul     GLint uorder, const GLvoid *points, GLenum type )
306afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach{
307fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul   GET_CURRENT_CONTEXT(ctx);
308afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach   GLint k;
309fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul   GLfloat *pnts;
310e2053d16901732f4947c702cdc5ef72993d8d130Brian Paul   struct gl_1d_map *map = NULL;
311afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach
312bfcdb843830bba0190e00e35e3c5c18c4bdb5de1Matt Turner   assert(type == GL_FLOAT || type == GL_DOUBLE);
313fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul
314fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul   if (u1 == u2) {
31508836341788a9f9d638d9dc8328510ccd18ddeb5Brian Paul      _mesa_error( ctx, GL_INVALID_VALUE, "glMap1(u1,u2)" );
316afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach      return;
317afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach   }
318fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul   if (uorder < 1 || uorder > MAX_EVAL_ORDER) {
31908836341788a9f9d638d9dc8328510ccd18ddeb5Brian Paul      _mesa_error( ctx, GL_INVALID_VALUE, "glMap1(order)" );
320afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach      return;
321afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach   }
322fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul   if (!points) {
32308836341788a9f9d638d9dc8328510ccd18ddeb5Brian Paul      _mesa_error( ctx, GL_INVALID_VALUE, "glMap1(points)" );
324fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul      return;
325fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul   }
326afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach
327fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul   k = _mesa_evaluator_components( target );
328fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul   if (k == 0) {
32908836341788a9f9d638d9dc8328510ccd18ddeb5Brian Paul      _mesa_error( ctx, GL_INVALID_ENUM, "glMap1(target)" );
3309a31e090efb15ec34e7a1a5e707d600a11d74925Brian Paul      return;
331afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach   }
332afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach
333fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul   if (ustride < k) {
33408836341788a9f9d638d9dc8328510ccd18ddeb5Brian Paul      _mesa_error( ctx, GL_INVALID_VALUE, "glMap1(stride)" );
335afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach      return;
336afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach   }
337afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach
338441a4af435b46e1b475318fbaf4e80b774390cb0Brian Paul   if (ctx->Texture.CurrentUnit != 0) {
339441a4af435b46e1b475318fbaf4e80b774390cb0Brian Paul      /* See OpenGL 1.2.1 spec, section F.2.13 */
340441a4af435b46e1b475318fbaf4e80b774390cb0Brian Paul      _mesa_error( ctx, GL_INVALID_OPERATION, "glMap2(ACTIVE_TEXTURE != 0)" );
341441a4af435b46e1b475318fbaf4e80b774390cb0Brian Paul      return;
342441a4af435b46e1b475318fbaf4e80b774390cb0Brian Paul   }
343441a4af435b46e1b475318fbaf4e80b774390cb0Brian Paul
344bc42c19f22c3b719712529d86faea818f34150a2Brian Paul   map = get_1d_map(ctx, target);
345bc42c19f22c3b719712529d86faea818f34150a2Brian Paul   if (!map) {
346bc42c19f22c3b719712529d86faea818f34150a2Brian Paul      _mesa_error( ctx, GL_INVALID_ENUM, "glMap1(target)" );
347bc42c19f22c3b719712529d86faea818f34150a2Brian Paul      return;
348afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach   }
349a96308c37db0bc0086a017d318bc3504aa5f0b1aKeith Whitwell
350cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell   /* make copy of the control points */
351cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell   if (type == GL_FLOAT)
35208836341788a9f9d638d9dc8328510ccd18ddeb5Brian Paul      pnts = _mesa_copy_map_points1f(target, ustride, uorder, (GLfloat*) points);
353cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell   else
35408836341788a9f9d638d9dc8328510ccd18ddeb5Brian Paul      pnts = _mesa_copy_map_points1d(target, ustride, uorder, (GLdouble*) points);
355cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell
356cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell
357cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell   FLUSH_VERTICES(ctx, _NEW_EVAL);
358cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell   map->Order = uorder;
359cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell   map->u1 = u1;
360cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell   map->u2 = u2;
36194a6ec8f0c8a25aeeb5880e2285ae6042cfb99dbKarl Schultz   map->du = 1.0F / (u2 - u1);
3622276bb991ac091b2b42274c2a094ba6f1de08468Brian Paul   free(map->Points);
363cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell   map->Points = pnts;
364afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach}
365afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach
366afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach
367afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach
368f7fa946d1da96178e63e42dd8d8739d3e0f66e1dPaul Berryvoid GLAPIENTRY
369fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul_mesa_Map1f( GLenum target, GLfloat u1, GLfloat u2, GLint stride,
370fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul             GLint order, const GLfloat *points )
371fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul{
372fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul   map1(target, u1, u2, stride, order, points, GL_FLOAT);
373fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul}
374afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach
375fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul
376f7fa946d1da96178e63e42dd8d8739d3e0f66e1dPaul Berryvoid GLAPIENTRY
377fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul_mesa_Map1d( GLenum target, GLdouble u1, GLdouble u2, GLint stride,
378fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul             GLint order, const GLdouble *points )
379afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach{
38094a6ec8f0c8a25aeeb5880e2285ae6042cfb99dbKarl Schultz   map1(target, (GLfloat) u1, (GLfloat) u2, stride, order, points, GL_DOUBLE);
381fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul}
382fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul
383fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul
384fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paulstatic void
385fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paulmap2( GLenum target, GLfloat u1, GLfloat u2, GLint ustride, GLint uorder,
386fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul      GLfloat v1, GLfloat v2, GLint vstride, GLint vorder,
387fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul      const GLvoid *points, GLenum type )
388fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul{
389fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul   GET_CURRENT_CONTEXT(ctx);
390afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach   GLint k;
391fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul   GLfloat *pnts;
392e2053d16901732f4947c702cdc5ef72993d8d130Brian Paul   struct gl_2d_map *map = NULL;
393e2053d16901732f4947c702cdc5ef72993d8d130Brian Paul
394bfcdb843830bba0190e00e35e3c5c18c4bdb5de1Matt Turner   assert(type == GL_FLOAT || type == GL_DOUBLE);
395afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach
396afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach   if (u1==u2) {
39708836341788a9f9d638d9dc8328510ccd18ddeb5Brian Paul      _mesa_error( ctx, GL_INVALID_VALUE, "glMap2(u1,u2)" );
398afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach      return;
399afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach   }
400afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach
401afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach   if (v1==v2) {
40208836341788a9f9d638d9dc8328510ccd18ddeb5Brian Paul      _mesa_error( ctx, GL_INVALID_VALUE, "glMap2(v1,v2)" );
403afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach      return;
404afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach   }
405afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach
406afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach   if (uorder<1 || uorder>MAX_EVAL_ORDER) {
40708836341788a9f9d638d9dc8328510ccd18ddeb5Brian Paul      _mesa_error( ctx, GL_INVALID_VALUE, "glMap2(uorder)" );
408afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach      return;
409afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach   }
410afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach
411afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach   if (vorder<1 || vorder>MAX_EVAL_ORDER) {
41208836341788a9f9d638d9dc8328510ccd18ddeb5Brian Paul      _mesa_error( ctx, GL_INVALID_VALUE, "glMap2(vorder)" );
413afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach      return;
414afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach   }
415afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach
416fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul   k = _mesa_evaluator_components( target );
417afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach   if (k==0) {
41808836341788a9f9d638d9dc8328510ccd18ddeb5Brian Paul      _mesa_error( ctx, GL_INVALID_ENUM, "glMap2(target)" );
4199a31e090efb15ec34e7a1a5e707d600a11d74925Brian Paul      return;
420afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach   }
421afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach
422afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach   if (ustride < k) {
42308836341788a9f9d638d9dc8328510ccd18ddeb5Brian Paul      _mesa_error( ctx, GL_INVALID_VALUE, "glMap2(ustride)" );
424afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach      return;
425afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach   }
426afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach   if (vstride < k) {
42708836341788a9f9d638d9dc8328510ccd18ddeb5Brian Paul      _mesa_error( ctx, GL_INVALID_VALUE, "glMap2(vstride)" );
428afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach      return;
429afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach   }
430afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach
431441a4af435b46e1b475318fbaf4e80b774390cb0Brian Paul   if (ctx->Texture.CurrentUnit != 0) {
432441a4af435b46e1b475318fbaf4e80b774390cb0Brian Paul      /* See OpenGL 1.2.1 spec, section F.2.13 */
433441a4af435b46e1b475318fbaf4e80b774390cb0Brian Paul      _mesa_error( ctx, GL_INVALID_OPERATION, "glMap2(ACTIVE_TEXTURE != 0)" );
434441a4af435b46e1b475318fbaf4e80b774390cb0Brian Paul      return;
435441a4af435b46e1b475318fbaf4e80b774390cb0Brian Paul   }
436441a4af435b46e1b475318fbaf4e80b774390cb0Brian Paul
437bc42c19f22c3b719712529d86faea818f34150a2Brian Paul   map = get_2d_map(ctx, target);
438bc42c19f22c3b719712529d86faea818f34150a2Brian Paul   if (!map) {
439bc42c19f22c3b719712529d86faea818f34150a2Brian Paul      _mesa_error( ctx, GL_INVALID_ENUM, "glMap2(target)" );
440bc42c19f22c3b719712529d86faea818f34150a2Brian Paul      return;
441afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach   }
442a96308c37db0bc0086a017d318bc3504aa5f0b1aKeith Whitwell
443cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell   /* make copy of the control points */
444cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell   if (type == GL_FLOAT)
44508836341788a9f9d638d9dc8328510ccd18ddeb5Brian Paul      pnts = _mesa_copy_map_points2f(target, ustride, uorder,
446cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell                                  vstride, vorder, (GLfloat*) points);
447cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell   else
44808836341788a9f9d638d9dc8328510ccd18ddeb5Brian Paul      pnts = _mesa_copy_map_points2d(target, ustride, uorder,
449cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell                                  vstride, vorder, (GLdouble*) points);
45022144ab7552f0799bcfca506bf4ffa7f70a06649Gareth Hughes
45122144ab7552f0799bcfca506bf4ffa7f70a06649Gareth Hughes
452cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell   FLUSH_VERTICES(ctx, _NEW_EVAL);
453cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell   map->Uorder = uorder;
454cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell   map->u1 = u1;
455cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell   map->u2 = u2;
45694a6ec8f0c8a25aeeb5880e2285ae6042cfb99dbKarl Schultz   map->du = 1.0F / (u2 - u1);
457cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell   map->Vorder = vorder;
458cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell   map->v1 = v1;
459cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell   map->v2 = v2;
46094a6ec8f0c8a25aeeb5880e2285ae6042cfb99dbKarl Schultz   map->dv = 1.0F / (v2 - v1);
4612276bb991ac091b2b42274c2a094ba6f1de08468Brian Paul   free(map->Points);
462cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell   map->Points = pnts;
463afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach}
464afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach
465afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach
466f7fa946d1da96178e63e42dd8d8739d3e0f66e1dPaul Berryvoid GLAPIENTRY
467fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul_mesa_Map2f( GLenum target,
468fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul             GLfloat u1, GLfloat u2, GLint ustride, GLint uorder,
469fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul             GLfloat v1, GLfloat v2, GLint vstride, GLint vorder,
470fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul             const GLfloat *points)
471fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul{
472fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul   map2(target, u1, u2, ustride, uorder, v1, v2, vstride, vorder,
473fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul        points, GL_FLOAT);
474fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul}
475afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach
476afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach
477f7fa946d1da96178e63e42dd8d8739d3e0f66e1dPaul Berryvoid GLAPIENTRY
478fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul_mesa_Map2d( GLenum target,
479fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul             GLdouble u1, GLdouble u2, GLint ustride, GLint uorder,
480fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul             GLdouble v1, GLdouble v2, GLint vstride, GLint vorder,
481fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul             const GLdouble *points )
482afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach{
48394a6ec8f0c8a25aeeb5880e2285ae6042cfb99dbKarl Schultz   map2(target, (GLfloat) u1, (GLfloat) u2, ustride, uorder,
48494a6ec8f0c8a25aeeb5880e2285ae6042cfb99dbKarl Schultz	(GLfloat) v1, (GLfloat) v2, vstride, vorder, points, GL_DOUBLE);
485fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul}
486fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul
487fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul
4885e3bc0c2a2bcdf59949410f94c9b705fc1281ce8Jouk Jansen
489f7fa946d1da96178e63e42dd8d8739d3e0f66e1dPaul Berryvoid GLAPIENTRY
4906b329b9274b18c50f4177eef7ee087d50ebc1525Brian Paul_mesa_GetnMapdvARB( GLenum target, GLenum query, GLsizei bufSize, GLdouble *v )
491fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul{
492fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul   GET_CURRENT_CONTEXT(ctx);
493bc42c19f22c3b719712529d86faea818f34150a2Brian Paul   struct gl_1d_map *map1d;
494bc42c19f22c3b719712529d86faea818f34150a2Brian Paul   struct gl_2d_map *map2d;
495afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach   GLint i, n;
496afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach   GLfloat *data;
497bc42c19f22c3b719712529d86faea818f34150a2Brian Paul   GLuint comps;
4986b329b9274b18c50f4177eef7ee087d50ebc1525Brian Paul   GLsizei numBytes;
499bc42c19f22c3b719712529d86faea818f34150a2Brian Paul
500bc42c19f22c3b719712529d86faea818f34150a2Brian Paul   comps = _mesa_evaluator_components(target);
501bc42c19f22c3b719712529d86faea818f34150a2Brian Paul   if (!comps) {
502bc42c19f22c3b719712529d86faea818f34150a2Brian Paul      _mesa_error( ctx, GL_INVALID_ENUM, "glGetMapdv(target)" );
503bc42c19f22c3b719712529d86faea818f34150a2Brian Paul      return;
504bc42c19f22c3b719712529d86faea818f34150a2Brian Paul   }
505bc42c19f22c3b719712529d86faea818f34150a2Brian Paul
506bc42c19f22c3b719712529d86faea818f34150a2Brian Paul   map1d = get_1d_map(ctx, target);
507bc42c19f22c3b719712529d86faea818f34150a2Brian Paul   map2d = get_2d_map(ctx, target);
508bfcdb843830bba0190e00e35e3c5c18c4bdb5de1Matt Turner   assert(map1d || map2d);
509bc42c19f22c3b719712529d86faea818f34150a2Brian Paul
510afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach   switch (query) {
511afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach      case GL_COEFF:
512bc42c19f22c3b719712529d86faea818f34150a2Brian Paul         if (map1d) {
513bc42c19f22c3b719712529d86faea818f34150a2Brian Paul            data = map1d->Points;
514bc42c19f22c3b719712529d86faea818f34150a2Brian Paul            n = map1d->Order * comps;
515bc42c19f22c3b719712529d86faea818f34150a2Brian Paul         }
516bc42c19f22c3b719712529d86faea818f34150a2Brian Paul         else {
517bc42c19f22c3b719712529d86faea818f34150a2Brian Paul            data = map2d->Points;
518bc42c19f22c3b719712529d86faea818f34150a2Brian Paul            n = map2d->Uorder * map2d->Vorder * comps;
519bc42c19f22c3b719712529d86faea818f34150a2Brian Paul         }
520afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach	 if (data) {
5216b329b9274b18c50f4177eef7ee087d50ebc1525Brian Paul            numBytes = n * sizeof *v;
5226b329b9274b18c50f4177eef7ee087d50ebc1525Brian Paul            if (bufSize < numBytes)
5236b329b9274b18c50f4177eef7ee087d50ebc1525Brian Paul               goto overflow;
524afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach	    for (i=0;i<n;i++) {
525afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach	       v[i] = data[i];
526afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach	    }
527afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach	 }
528afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach         break;
529afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach      case GL_ORDER:
530bc42c19f22c3b719712529d86faea818f34150a2Brian Paul         if (map1d) {
5316b329b9274b18c50f4177eef7ee087d50ebc1525Brian Paul            numBytes = 1 * sizeof *v;
5326b329b9274b18c50f4177eef7ee087d50ebc1525Brian Paul            if (bufSize < numBytes)
5336b329b9274b18c50f4177eef7ee087d50ebc1525Brian Paul               goto overflow;
534bc42c19f22c3b719712529d86faea818f34150a2Brian Paul            v[0] = (GLdouble) map1d->Order;
535bc42c19f22c3b719712529d86faea818f34150a2Brian Paul         }
536bc42c19f22c3b719712529d86faea818f34150a2Brian Paul         else {
5376b329b9274b18c50f4177eef7ee087d50ebc1525Brian Paul            numBytes = 2 * sizeof *v;
5386b329b9274b18c50f4177eef7ee087d50ebc1525Brian Paul            if (bufSize < numBytes)
5396b329b9274b18c50f4177eef7ee087d50ebc1525Brian Paul               goto overflow;
540bc42c19f22c3b719712529d86faea818f34150a2Brian Paul            v[0] = (GLdouble) map2d->Uorder;
541bc42c19f22c3b719712529d86faea818f34150a2Brian Paul            v[1] = (GLdouble) map2d->Vorder;
542bc42c19f22c3b719712529d86faea818f34150a2Brian Paul         }
543afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach         break;
544afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach      case GL_DOMAIN:
545bc42c19f22c3b719712529d86faea818f34150a2Brian Paul         if (map1d) {
5466b329b9274b18c50f4177eef7ee087d50ebc1525Brian Paul            numBytes = 2 * sizeof *v;
5476b329b9274b18c50f4177eef7ee087d50ebc1525Brian Paul            if (bufSize < numBytes)
5486b329b9274b18c50f4177eef7ee087d50ebc1525Brian Paul              goto overflow;
549bc42c19f22c3b719712529d86faea818f34150a2Brian Paul            v[0] = (GLdouble) map1d->u1;
550bc42c19f22c3b719712529d86faea818f34150a2Brian Paul            v[1] = (GLdouble) map1d->u2;
551bc42c19f22c3b719712529d86faea818f34150a2Brian Paul         }
552bc42c19f22c3b719712529d86faea818f34150a2Brian Paul         else {
5536b329b9274b18c50f4177eef7ee087d50ebc1525Brian Paul            numBytes = 4 * sizeof *v;
5546b329b9274b18c50f4177eef7ee087d50ebc1525Brian Paul            if (bufSize < numBytes)
5556b329b9274b18c50f4177eef7ee087d50ebc1525Brian Paul               goto overflow;
556bc42c19f22c3b719712529d86faea818f34150a2Brian Paul            v[0] = (GLdouble) map2d->u1;
557bc42c19f22c3b719712529d86faea818f34150a2Brian Paul            v[1] = (GLdouble) map2d->u2;
558bc42c19f22c3b719712529d86faea818f34150a2Brian Paul            v[2] = (GLdouble) map2d->v1;
559bc42c19f22c3b719712529d86faea818f34150a2Brian Paul            v[3] = (GLdouble) map2d->v2;
560bc42c19f22c3b719712529d86faea818f34150a2Brian Paul         }
561afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach         break;
562afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach      default:
56308836341788a9f9d638d9dc8328510ccd18ddeb5Brian Paul         _mesa_error( ctx, GL_INVALID_ENUM, "glGetMapdv(query)" );
564afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach   }
5656b329b9274b18c50f4177eef7ee087d50ebc1525Brian Paul   return;
5666b329b9274b18c50f4177eef7ee087d50ebc1525Brian Paul
5676b329b9274b18c50f4177eef7ee087d50ebc1525Brian Pauloverflow:
5686b329b9274b18c50f4177eef7ee087d50ebc1525Brian Paul   _mesa_error( ctx, GL_INVALID_OPERATION,
5696b329b9274b18c50f4177eef7ee087d50ebc1525Brian Paul               "glGetnMapdvARB(out of bounds: bufSize is %d,"
5706b329b9274b18c50f4177eef7ee087d50ebc1525Brian Paul               " but %d bytes are required)", bufSize, numBytes );
571afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach}
572afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach
573f7fa946d1da96178e63e42dd8d8739d3e0f66e1dPaul Berryvoid GLAPIENTRY
5746b329b9274b18c50f4177eef7ee087d50ebc1525Brian Paul_mesa_GetMapdv( GLenum target, GLenum query, GLdouble *v )
5756b329b9274b18c50f4177eef7ee087d50ebc1525Brian Paul{
5766b329b9274b18c50f4177eef7ee087d50ebc1525Brian Paul   _mesa_GetnMapdvARB(target, query, INT_MAX, v);
5776b329b9274b18c50f4177eef7ee087d50ebc1525Brian Paul}
578afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach
579f7fa946d1da96178e63e42dd8d8739d3e0f66e1dPaul Berryvoid GLAPIENTRY
5806b329b9274b18c50f4177eef7ee087d50ebc1525Brian Paul_mesa_GetnMapfvARB( GLenum target, GLenum query, GLsizei bufSize, GLfloat *v )
581afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach{
582fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul   GET_CURRENT_CONTEXT(ctx);
583bc42c19f22c3b719712529d86faea818f34150a2Brian Paul   struct gl_1d_map *map1d;
584bc42c19f22c3b719712529d86faea818f34150a2Brian Paul   struct gl_2d_map *map2d;
585afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach   GLint i, n;
586afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach   GLfloat *data;
587bc42c19f22c3b719712529d86faea818f34150a2Brian Paul   GLuint comps;
5886b329b9274b18c50f4177eef7ee087d50ebc1525Brian Paul   GLsizei numBytes;
589bc42c19f22c3b719712529d86faea818f34150a2Brian Paul
590bc42c19f22c3b719712529d86faea818f34150a2Brian Paul   comps = _mesa_evaluator_components(target);
591bc42c19f22c3b719712529d86faea818f34150a2Brian Paul   if (!comps) {
592e2053d16901732f4947c702cdc5ef72993d8d130Brian Paul      _mesa_error( ctx, GL_INVALID_ENUM, "glGetMapfv(target)" );
593bc42c19f22c3b719712529d86faea818f34150a2Brian Paul      return;
594bc42c19f22c3b719712529d86faea818f34150a2Brian Paul   }
595bc42c19f22c3b719712529d86faea818f34150a2Brian Paul
596bc42c19f22c3b719712529d86faea818f34150a2Brian Paul   map1d = get_1d_map(ctx, target);
597bc42c19f22c3b719712529d86faea818f34150a2Brian Paul   map2d = get_2d_map(ctx, target);
598bfcdb843830bba0190e00e35e3c5c18c4bdb5de1Matt Turner   assert(map1d || map2d);
599bc42c19f22c3b719712529d86faea818f34150a2Brian Paul
600afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach   switch (query) {
601afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach      case GL_COEFF:
602bc42c19f22c3b719712529d86faea818f34150a2Brian Paul         if (map1d) {
603bc42c19f22c3b719712529d86faea818f34150a2Brian Paul            data = map1d->Points;
604bc42c19f22c3b719712529d86faea818f34150a2Brian Paul            n = map1d->Order * comps;
605bc42c19f22c3b719712529d86faea818f34150a2Brian Paul         }
606bc42c19f22c3b719712529d86faea818f34150a2Brian Paul         else {
607bc42c19f22c3b719712529d86faea818f34150a2Brian Paul            data = map2d->Points;
608bc42c19f22c3b719712529d86faea818f34150a2Brian Paul            n = map2d->Uorder * map2d->Vorder * comps;
609bc42c19f22c3b719712529d86faea818f34150a2Brian Paul         }
610afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach	 if (data) {
6116b329b9274b18c50f4177eef7ee087d50ebc1525Brian Paul            numBytes = n * sizeof *v;
6126b329b9274b18c50f4177eef7ee087d50ebc1525Brian Paul            if (bufSize < numBytes)
6136b329b9274b18c50f4177eef7ee087d50ebc1525Brian Paul               goto overflow;
614afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach	    for (i=0;i<n;i++) {
615afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach	       v[i] = data[i];
616afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach	    }
617afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach	 }
618afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach         break;
619afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach      case GL_ORDER:
620bc42c19f22c3b719712529d86faea818f34150a2Brian Paul         if (map1d) {
6216b329b9274b18c50f4177eef7ee087d50ebc1525Brian Paul            numBytes = 1 * sizeof *v;
6226b329b9274b18c50f4177eef7ee087d50ebc1525Brian Paul            if (bufSize < numBytes)
6236b329b9274b18c50f4177eef7ee087d50ebc1525Brian Paul               goto overflow;
624bc42c19f22c3b719712529d86faea818f34150a2Brian Paul            v[0] = (GLfloat) map1d->Order;
625bc42c19f22c3b719712529d86faea818f34150a2Brian Paul         }
626bc42c19f22c3b719712529d86faea818f34150a2Brian Paul         else {
6276b329b9274b18c50f4177eef7ee087d50ebc1525Brian Paul            numBytes = 2 * sizeof *v;
6286b329b9274b18c50f4177eef7ee087d50ebc1525Brian Paul            if (bufSize < numBytes)
6296b329b9274b18c50f4177eef7ee087d50ebc1525Brian Paul               goto overflow;
630bc42c19f22c3b719712529d86faea818f34150a2Brian Paul            v[0] = (GLfloat) map2d->Uorder;
631bc42c19f22c3b719712529d86faea818f34150a2Brian Paul            v[1] = (GLfloat) map2d->Vorder;
632bc42c19f22c3b719712529d86faea818f34150a2Brian Paul         }
633afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach         break;
634afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach      case GL_DOMAIN:
635bc42c19f22c3b719712529d86faea818f34150a2Brian Paul         if (map1d) {
6366b329b9274b18c50f4177eef7ee087d50ebc1525Brian Paul            numBytes = 2 * sizeof *v;
6376b329b9274b18c50f4177eef7ee087d50ebc1525Brian Paul            if (bufSize < numBytes)
6386b329b9274b18c50f4177eef7ee087d50ebc1525Brian Paul               goto overflow;
639bc42c19f22c3b719712529d86faea818f34150a2Brian Paul            v[0] = map1d->u1;
640bc42c19f22c3b719712529d86faea818f34150a2Brian Paul            v[1] = map1d->u2;
641bc42c19f22c3b719712529d86faea818f34150a2Brian Paul         }
642bc42c19f22c3b719712529d86faea818f34150a2Brian Paul         else {
6436b329b9274b18c50f4177eef7ee087d50ebc1525Brian Paul            numBytes = 4 * sizeof *v;
6446b329b9274b18c50f4177eef7ee087d50ebc1525Brian Paul            if (bufSize < numBytes)
6456b329b9274b18c50f4177eef7ee087d50ebc1525Brian Paul               goto overflow;
646bc42c19f22c3b719712529d86faea818f34150a2Brian Paul            v[0] = map2d->u1;
647bc42c19f22c3b719712529d86faea818f34150a2Brian Paul            v[1] = map2d->u2;
648bc42c19f22c3b719712529d86faea818f34150a2Brian Paul            v[2] = map2d->v1;
649bc42c19f22c3b719712529d86faea818f34150a2Brian Paul            v[3] = map2d->v2;
650bc42c19f22c3b719712529d86faea818f34150a2Brian Paul         }
651afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach         break;
652afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach      default:
65308836341788a9f9d638d9dc8328510ccd18ddeb5Brian Paul         _mesa_error( ctx, GL_INVALID_ENUM, "glGetMapfv(query)" );
654afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach   }
6556b329b9274b18c50f4177eef7ee087d50ebc1525Brian Paul   return;
6566b329b9274b18c50f4177eef7ee087d50ebc1525Brian Paul
6576b329b9274b18c50f4177eef7ee087d50ebc1525Brian Pauloverflow:
6586b329b9274b18c50f4177eef7ee087d50ebc1525Brian Paul   _mesa_error( ctx, GL_INVALID_OPERATION,
6596b329b9274b18c50f4177eef7ee087d50ebc1525Brian Paul               "glGetnMapfvARB(out of bounds: bufSize is %d,"
6606b329b9274b18c50f4177eef7ee087d50ebc1525Brian Paul               " but %d bytes are required)", bufSize, numBytes );
661afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach}
662afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach
663afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach
664f7fa946d1da96178e63e42dd8d8739d3e0f66e1dPaul Berryvoid GLAPIENTRY
6656b329b9274b18c50f4177eef7ee087d50ebc1525Brian Paul_mesa_GetMapfv( GLenum target, GLenum query, GLfloat *v )
6666b329b9274b18c50f4177eef7ee087d50ebc1525Brian Paul{
6676b329b9274b18c50f4177eef7ee087d50ebc1525Brian Paul   _mesa_GetnMapfvARB(target, query, INT_MAX, v);
6686b329b9274b18c50f4177eef7ee087d50ebc1525Brian Paul}
6696b329b9274b18c50f4177eef7ee087d50ebc1525Brian Paul
6706b329b9274b18c50f4177eef7ee087d50ebc1525Brian Paul
671f7fa946d1da96178e63e42dd8d8739d3e0f66e1dPaul Berryvoid GLAPIENTRY
6726b329b9274b18c50f4177eef7ee087d50ebc1525Brian Paul_mesa_GetnMapivARB( GLenum target, GLenum query, GLsizei bufSize, GLint *v )
673afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach{
674fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul   GET_CURRENT_CONTEXT(ctx);
675bc42c19f22c3b719712529d86faea818f34150a2Brian Paul   struct gl_1d_map *map1d;
676bc42c19f22c3b719712529d86faea818f34150a2Brian Paul   struct gl_2d_map *map2d;
677afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach   GLuint i, n;
678afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach   GLfloat *data;
679bc42c19f22c3b719712529d86faea818f34150a2Brian Paul   GLuint comps;
6806b329b9274b18c50f4177eef7ee087d50ebc1525Brian Paul   GLsizei numBytes;
681bc42c19f22c3b719712529d86faea818f34150a2Brian Paul
682bc42c19f22c3b719712529d86faea818f34150a2Brian Paul   comps = _mesa_evaluator_components(target);
683bc42c19f22c3b719712529d86faea818f34150a2Brian Paul   if (!comps) {
684e2053d16901732f4947c702cdc5ef72993d8d130Brian Paul      _mesa_error( ctx, GL_INVALID_ENUM, "glGetMapiv(target)" );
685bc42c19f22c3b719712529d86faea818f34150a2Brian Paul      return;
686bc42c19f22c3b719712529d86faea818f34150a2Brian Paul   }
687bc42c19f22c3b719712529d86faea818f34150a2Brian Paul
688bc42c19f22c3b719712529d86faea818f34150a2Brian Paul   map1d = get_1d_map(ctx, target);
689bc42c19f22c3b719712529d86faea818f34150a2Brian Paul   map2d = get_2d_map(ctx, target);
690bfcdb843830bba0190e00e35e3c5c18c4bdb5de1Matt Turner   assert(map1d || map2d);
691bc42c19f22c3b719712529d86faea818f34150a2Brian Paul
692afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach   switch (query) {
693afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach      case GL_COEFF:
694bc42c19f22c3b719712529d86faea818f34150a2Brian Paul         if (map1d) {
695bc42c19f22c3b719712529d86faea818f34150a2Brian Paul            data = map1d->Points;
696bc42c19f22c3b719712529d86faea818f34150a2Brian Paul            n = map1d->Order * comps;
697bc42c19f22c3b719712529d86faea818f34150a2Brian Paul         }
698bc42c19f22c3b719712529d86faea818f34150a2Brian Paul         else {
699bc42c19f22c3b719712529d86faea818f34150a2Brian Paul            data = map2d->Points;
700bc42c19f22c3b719712529d86faea818f34150a2Brian Paul            n = map2d->Uorder * map2d->Vorder * comps;
701bc42c19f22c3b719712529d86faea818f34150a2Brian Paul         }
702afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach	 if (data) {
7036b329b9274b18c50f4177eef7ee087d50ebc1525Brian Paul            numBytes = n * sizeof *v;
7046b329b9274b18c50f4177eef7ee087d50ebc1525Brian Paul            if (bufSize < numBytes)
7056b329b9274b18c50f4177eef7ee087d50ebc1525Brian Paul               goto overflow;
706afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach	    for (i=0;i<n;i++) {
70727558a160a9fe91745728d7626995cd88f8fe339Brian Paul	       v[i] = IROUND(data[i]);
708afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach	    }
709afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach	 }
710afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach         break;
711afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach      case GL_ORDER:
712bc42c19f22c3b719712529d86faea818f34150a2Brian Paul         if (map1d) {
7136b329b9274b18c50f4177eef7ee087d50ebc1525Brian Paul            numBytes = 1 * sizeof *v;
7146b329b9274b18c50f4177eef7ee087d50ebc1525Brian Paul            if (bufSize < numBytes)
7156b329b9274b18c50f4177eef7ee087d50ebc1525Brian Paul               goto overflow;
716bc42c19f22c3b719712529d86faea818f34150a2Brian Paul            v[0] = map1d->Order;
717bc42c19f22c3b719712529d86faea818f34150a2Brian Paul         }
718bc42c19f22c3b719712529d86faea818f34150a2Brian Paul         else {
7196b329b9274b18c50f4177eef7ee087d50ebc1525Brian Paul            numBytes = 2 * sizeof *v;
7206b329b9274b18c50f4177eef7ee087d50ebc1525Brian Paul            if (bufSize < numBytes)
7216b329b9274b18c50f4177eef7ee087d50ebc1525Brian Paul               goto overflow;
722bc42c19f22c3b719712529d86faea818f34150a2Brian Paul            v[0] = map2d->Uorder;
723bc42c19f22c3b719712529d86faea818f34150a2Brian Paul            v[1] = map2d->Vorder;
724bc42c19f22c3b719712529d86faea818f34150a2Brian Paul         }
725afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach         break;
726afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach      case GL_DOMAIN:
727bc42c19f22c3b719712529d86faea818f34150a2Brian Paul         if (map1d) {
7286b329b9274b18c50f4177eef7ee087d50ebc1525Brian Paul            numBytes = 2 * sizeof *v;
7296b329b9274b18c50f4177eef7ee087d50ebc1525Brian Paul            if (bufSize < numBytes)
7306b329b9274b18c50f4177eef7ee087d50ebc1525Brian Paul               goto overflow;
73127558a160a9fe91745728d7626995cd88f8fe339Brian Paul            v[0] = IROUND(map1d->u1);
73227558a160a9fe91745728d7626995cd88f8fe339Brian Paul            v[1] = IROUND(map1d->u2);
733bc42c19f22c3b719712529d86faea818f34150a2Brian Paul         }
734bc42c19f22c3b719712529d86faea818f34150a2Brian Paul         else {
7356b329b9274b18c50f4177eef7ee087d50ebc1525Brian Paul            numBytes = 4 * sizeof *v;
7366b329b9274b18c50f4177eef7ee087d50ebc1525Brian Paul            if (bufSize < numBytes)
7376b329b9274b18c50f4177eef7ee087d50ebc1525Brian Paul               goto overflow;
73827558a160a9fe91745728d7626995cd88f8fe339Brian Paul            v[0] = IROUND(map2d->u1);
73927558a160a9fe91745728d7626995cd88f8fe339Brian Paul            v[1] = IROUND(map2d->u2);
74027558a160a9fe91745728d7626995cd88f8fe339Brian Paul            v[2] = IROUND(map2d->v1);
74127558a160a9fe91745728d7626995cd88f8fe339Brian Paul            v[3] = IROUND(map2d->v2);
742bc42c19f22c3b719712529d86faea818f34150a2Brian Paul         }
743afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach         break;
744afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach      default:
74508836341788a9f9d638d9dc8328510ccd18ddeb5Brian Paul         _mesa_error( ctx, GL_INVALID_ENUM, "glGetMapiv(query)" );
746afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach   }
7476b329b9274b18c50f4177eef7ee087d50ebc1525Brian Paul   return;
7486b329b9274b18c50f4177eef7ee087d50ebc1525Brian Paul
7496b329b9274b18c50f4177eef7ee087d50ebc1525Brian Pauloverflow:
7506b329b9274b18c50f4177eef7ee087d50ebc1525Brian Paul   _mesa_error( ctx, GL_INVALID_OPERATION,
7516b329b9274b18c50f4177eef7ee087d50ebc1525Brian Paul               "glGetnMapivARB(out of bounds: bufSize is %d,"
7526b329b9274b18c50f4177eef7ee087d50ebc1525Brian Paul               " but %d bytes are required)", bufSize, numBytes );
753afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach}
754afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach
755afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach
756f7fa946d1da96178e63e42dd8d8739d3e0f66e1dPaul Berryvoid GLAPIENTRY
7576b329b9274b18c50f4177eef7ee087d50ebc1525Brian Paul_mesa_GetMapiv( GLenum target, GLenum query, GLint *v )
7586b329b9274b18c50f4177eef7ee087d50ebc1525Brian Paul{
7596b329b9274b18c50f4177eef7ee087d50ebc1525Brian Paul   _mesa_GetnMapivARB(target, query, INT_MAX, v);
7606b329b9274b18c50f4177eef7ee087d50ebc1525Brian Paul}
7616b329b9274b18c50f4177eef7ee087d50ebc1525Brian Paul
762afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach
763f7fa946d1da96178e63e42dd8d8739d3e0f66e1dPaul Berryvoid GLAPIENTRY
764fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul_mesa_MapGrid1f( GLint un, GLfloat u1, GLfloat u2 )
765afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach{
766fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul   GET_CURRENT_CONTEXT(ctx);
767afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach
768afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach   if (un<1) {
76908836341788a9f9d638d9dc8328510ccd18ddeb5Brian Paul      _mesa_error( ctx, GL_INVALID_VALUE, "glMapGrid1f" );
770afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach      return;
771afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach   }
772cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell   FLUSH_VERTICES(ctx, _NEW_EVAL);
773afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach   ctx->Eval.MapGrid1un = un;
774afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach   ctx->Eval.MapGrid1u1 = u1;
775afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach   ctx->Eval.MapGrid1u2 = u2;
776afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach   ctx->Eval.MapGrid1du = (u2 - u1) / (GLfloat) un;
777afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach}
778afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach
779afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach
780f7fa946d1da96178e63e42dd8d8739d3e0f66e1dPaul Berryvoid GLAPIENTRY
781fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul_mesa_MapGrid1d( GLint un, GLdouble u1, GLdouble u2 )
782fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul{
78394a6ec8f0c8a25aeeb5880e2285ae6042cfb99dbKarl Schultz   _mesa_MapGrid1f( un, (GLfloat) u1, (GLfloat) u2 );
784fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul}
785fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul
786fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul
787f7fa946d1da96178e63e42dd8d8739d3e0f66e1dPaul Berryvoid GLAPIENTRY
788fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul_mesa_MapGrid2f( GLint un, GLfloat u1, GLfloat u2,
789fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul                 GLint vn, GLfloat v1, GLfloat v2 )
790afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach{
791fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul   GET_CURRENT_CONTEXT(ctx);
792cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell
793afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach   if (un<1) {
79408836341788a9f9d638d9dc8328510ccd18ddeb5Brian Paul      _mesa_error( ctx, GL_INVALID_VALUE, "glMapGrid2f(un)" );
795afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach      return;
796afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach   }
797afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach   if (vn<1) {
79808836341788a9f9d638d9dc8328510ccd18ddeb5Brian Paul      _mesa_error( ctx, GL_INVALID_VALUE, "glMapGrid2f(vn)" );
799afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach      return;
800afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach   }
801cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell
802cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell   FLUSH_VERTICES(ctx, _NEW_EVAL);
803afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach   ctx->Eval.MapGrid2un = un;
804afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach   ctx->Eval.MapGrid2u1 = u1;
805afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach   ctx->Eval.MapGrid2u2 = u2;
806afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach   ctx->Eval.MapGrid2du = (u2 - u1) / (GLfloat) un;
807afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach   ctx->Eval.MapGrid2vn = vn;
808afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach   ctx->Eval.MapGrid2v1 = v1;
809afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach   ctx->Eval.MapGrid2v2 = v2;
810afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach   ctx->Eval.MapGrid2dv = (v2 - v1) / (GLfloat) vn;
811afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach}
812afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach
813afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach
814f7fa946d1da96178e63e42dd8d8739d3e0f66e1dPaul Berryvoid GLAPIENTRY
815fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul_mesa_MapGrid2d( GLint un, GLdouble u1, GLdouble u2,
816fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul                 GLint vn, GLdouble v1, GLdouble v2 )
817fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul{
81894a6ec8f0c8a25aeeb5880e2285ae6042cfb99dbKarl Schultz   _mesa_MapGrid2f( un, (GLfloat) u1, (GLfloat) u2,
81994a6ec8f0c8a25aeeb5880e2285ae6042cfb99dbKarl Schultz		    vn, (GLfloat) v1, (GLfloat) v2 );
820fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul}
8216dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell
8226dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell
823aefa1f6ab1d9267b223b06ae205ab34c8e0d7c02Chia-I Wuvoid
824aefa1f6ab1d9267b223b06ae205ab34c8e0d7c02Chia-I Wu_mesa_install_eval_vtxfmt(struct _glapi_table *disp,
825200e09e393c05706d830667cbf626d1d51c000c4Brian Paul                          const GLvertexformat *vfmt)
826aefa1f6ab1d9267b223b06ae205ab34c8e0d7c02Chia-I Wu{
827aefa1f6ab1d9267b223b06ae205ab34c8e0d7c02Chia-I Wu   SET_EvalCoord1f(disp, vfmt->EvalCoord1f);
828aefa1f6ab1d9267b223b06ae205ab34c8e0d7c02Chia-I Wu   SET_EvalCoord1fv(disp, vfmt->EvalCoord1fv);
829aefa1f6ab1d9267b223b06ae205ab34c8e0d7c02Chia-I Wu   SET_EvalCoord2f(disp, vfmt->EvalCoord2f);
830aefa1f6ab1d9267b223b06ae205ab34c8e0d7c02Chia-I Wu   SET_EvalCoord2fv(disp, vfmt->EvalCoord2fv);
831aefa1f6ab1d9267b223b06ae205ab34c8e0d7c02Chia-I Wu   SET_EvalPoint1(disp, vfmt->EvalPoint1);
832aefa1f6ab1d9267b223b06ae205ab34c8e0d7c02Chia-I Wu   SET_EvalPoint2(disp, vfmt->EvalPoint2);
833aefa1f6ab1d9267b223b06ae205ab34c8e0d7c02Chia-I Wu}
834aefa1f6ab1d9267b223b06ae205ab34c8e0d7c02Chia-I Wu
835aefa1f6ab1d9267b223b06ae205ab34c8e0d7c02Chia-I Wu
8366dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell/**********************************************************************/
8376dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell/*****                      Initialization                        *****/
8386dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell/**********************************************************************/
8396dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell
8406dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell/**
8416dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell * Initialize a 1-D evaluator map.
8426dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell */
8436dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwellstatic void
8446dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwellinit_1d_map( struct gl_1d_map *map, int n, const float *initial )
8456dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell{
8466dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell   map->Order = 1;
8476dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell   map->u1 = 0.0;
8486dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell   map->u2 = 1.0;
8492b7a972e3f36bfcdc6fbe2b59d7ffdcde49c9405Matt Turner   map->Points = malloc(n * sizeof(GLfloat));
8506dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell   if (map->Points) {
8516dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell      GLint i;
8526dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell      for (i=0;i<n;i++)
8536dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell         map->Points[i] = initial[i];
8546dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell   }
8556dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell}
8566dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell
8576dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell
8586dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell/**
8596dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell * Initialize a 2-D evaluator map
8606dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell */
8616dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwellstatic void
8626dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwellinit_2d_map( struct gl_2d_map *map, int n, const float *initial )
8636dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell{
8646dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell   map->Uorder = 1;
8656dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell   map->Vorder = 1;
8666dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell   map->u1 = 0.0;
8676dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell   map->u2 = 1.0;
8686dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell   map->v1 = 0.0;
8696dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell   map->v2 = 1.0;
8702b7a972e3f36bfcdc6fbe2b59d7ffdcde49c9405Matt Turner   map->Points = malloc(n * sizeof(GLfloat));
8716dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell   if (map->Points) {
8726dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell      GLint i;
8736dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell      for (i=0;i<n;i++)
8746dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell         map->Points[i] = initial[i];
8756dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell   }
8766dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell}
8776dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell
8786dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell
879f9995b30756140724f41daf963fa06167912be7fKristian Høgsbergvoid _mesa_init_eval( struct gl_context *ctx )
8806dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell{
8816dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell   /* Evaluators group */
8826dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell   ctx->Eval.Map1Color4 = GL_FALSE;
8836dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell   ctx->Eval.Map1Index = GL_FALSE;
8846dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell   ctx->Eval.Map1Normal = GL_FALSE;
8856dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell   ctx->Eval.Map1TextureCoord1 = GL_FALSE;
8866dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell   ctx->Eval.Map1TextureCoord2 = GL_FALSE;
8876dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell   ctx->Eval.Map1TextureCoord3 = GL_FALSE;
8886dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell   ctx->Eval.Map1TextureCoord4 = GL_FALSE;
8896dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell   ctx->Eval.Map1Vertex3 = GL_FALSE;
8906dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell   ctx->Eval.Map1Vertex4 = GL_FALSE;
8916dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell   ctx->Eval.Map2Color4 = GL_FALSE;
8926dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell   ctx->Eval.Map2Index = GL_FALSE;
8936dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell   ctx->Eval.Map2Normal = GL_FALSE;
8946dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell   ctx->Eval.Map2TextureCoord1 = GL_FALSE;
8956dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell   ctx->Eval.Map2TextureCoord2 = GL_FALSE;
8966dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell   ctx->Eval.Map2TextureCoord3 = GL_FALSE;
8976dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell   ctx->Eval.Map2TextureCoord4 = GL_FALSE;
8986dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell   ctx->Eval.Map2Vertex3 = GL_FALSE;
8996dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell   ctx->Eval.Map2Vertex4 = GL_FALSE;
9006dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell   ctx->Eval.AutoNormal = GL_FALSE;
9016dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell   ctx->Eval.MapGrid1un = 1;
9026dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell   ctx->Eval.MapGrid1u1 = 0.0;
9036dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell   ctx->Eval.MapGrid1u2 = 1.0;
9046dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell   ctx->Eval.MapGrid2un = 1;
9056dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell   ctx->Eval.MapGrid2vn = 1;
9066dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell   ctx->Eval.MapGrid2u1 = 0.0;
9076dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell   ctx->Eval.MapGrid2u2 = 1.0;
9086dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell   ctx->Eval.MapGrid2v1 = 0.0;
9096dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell   ctx->Eval.MapGrid2v2 = 1.0;
9106dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell
9116dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell   /* Evaluator data */
9126dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell   {
9136dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell      static GLfloat vertex[4] = { 0.0, 0.0, 0.0, 1.0 };
9146dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell      static GLfloat normal[3] = { 0.0, 0.0, 1.0 };
9156dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell      static GLfloat index[1] = { 1.0 };
9166dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell      static GLfloat color[4] = { 1.0, 1.0, 1.0, 1.0 };
9176dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell      static GLfloat texcoord[4] = { 0.0, 0.0, 0.0, 1.0 };
9186dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell
9196dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell      init_1d_map( &ctx->EvalMap.Map1Vertex3, 3, vertex );
9206dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell      init_1d_map( &ctx->EvalMap.Map1Vertex4, 4, vertex );
9216dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell      init_1d_map( &ctx->EvalMap.Map1Index, 1, index );
9226dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell      init_1d_map( &ctx->EvalMap.Map1Color4, 4, color );
9236dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell      init_1d_map( &ctx->EvalMap.Map1Normal, 3, normal );
9246dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell      init_1d_map( &ctx->EvalMap.Map1Texture1, 1, texcoord );
9256dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell      init_1d_map( &ctx->EvalMap.Map1Texture2, 2, texcoord );
9266dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell      init_1d_map( &ctx->EvalMap.Map1Texture3, 3, texcoord );
9276dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell      init_1d_map( &ctx->EvalMap.Map1Texture4, 4, texcoord );
9286dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell
9296dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell      init_2d_map( &ctx->EvalMap.Map2Vertex3, 3, vertex );
9306dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell      init_2d_map( &ctx->EvalMap.Map2Vertex4, 4, vertex );
9316dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell      init_2d_map( &ctx->EvalMap.Map2Index, 1, index );
9326dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell      init_2d_map( &ctx->EvalMap.Map2Color4, 4, color );
9336dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell      init_2d_map( &ctx->EvalMap.Map2Normal, 3, normal );
9346dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell      init_2d_map( &ctx->EvalMap.Map2Texture1, 1, texcoord );
9356dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell      init_2d_map( &ctx->EvalMap.Map2Texture2, 2, texcoord );
9366dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell      init_2d_map( &ctx->EvalMap.Map2Texture3, 3, texcoord );
9376dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell      init_2d_map( &ctx->EvalMap.Map2Texture4, 4, texcoord );
9386dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell   }
9396dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell}
9406dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell
9416dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell
942f9995b30756140724f41daf963fa06167912be7fKristian Høgsbergvoid _mesa_free_eval_data( struct gl_context *ctx )
9436dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell{
9446dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell   /* Free evaluator data */
9452276bb991ac091b2b42274c2a094ba6f1de08468Brian Paul   free(ctx->EvalMap.Map1Vertex3.Points);
9462276bb991ac091b2b42274c2a094ba6f1de08468Brian Paul   free(ctx->EvalMap.Map1Vertex4.Points);
9472276bb991ac091b2b42274c2a094ba6f1de08468Brian Paul   free(ctx->EvalMap.Map1Index.Points);
9482276bb991ac091b2b42274c2a094ba6f1de08468Brian Paul   free(ctx->EvalMap.Map1Color4.Points);
9492276bb991ac091b2b42274c2a094ba6f1de08468Brian Paul   free(ctx->EvalMap.Map1Normal.Points);
9502276bb991ac091b2b42274c2a094ba6f1de08468Brian Paul   free(ctx->EvalMap.Map1Texture1.Points);
9512276bb991ac091b2b42274c2a094ba6f1de08468Brian Paul   free(ctx->EvalMap.Map1Texture2.Points);
9522276bb991ac091b2b42274c2a094ba6f1de08468Brian Paul   free(ctx->EvalMap.Map1Texture3.Points);
9532276bb991ac091b2b42274c2a094ba6f1de08468Brian Paul   free(ctx->EvalMap.Map1Texture4.Points);
9542276bb991ac091b2b42274c2a094ba6f1de08468Brian Paul
9552276bb991ac091b2b42274c2a094ba6f1de08468Brian Paul   free(ctx->EvalMap.Map2Vertex3.Points);
9562276bb991ac091b2b42274c2a094ba6f1de08468Brian Paul   free(ctx->EvalMap.Map2Vertex4.Points);
9572276bb991ac091b2b42274c2a094ba6f1de08468Brian Paul   free(ctx->EvalMap.Map2Index.Points);
9582276bb991ac091b2b42274c2a094ba6f1de08468Brian Paul   free(ctx->EvalMap.Map2Color4.Points);
9592276bb991ac091b2b42274c2a094ba6f1de08468Brian Paul   free(ctx->EvalMap.Map2Normal.Points);
9602276bb991ac091b2b42274c2a094ba6f1de08468Brian Paul   free(ctx->EvalMap.Map2Texture1.Points);
9612276bb991ac091b2b42274c2a094ba6f1de08468Brian Paul   free(ctx->EvalMap.Map2Texture2.Points);
9622276bb991ac091b2b42274c2a094ba6f1de08468Brian Paul   free(ctx->EvalMap.Map2Texture3.Points);
9632276bb991ac091b2b42274c2a094ba6f1de08468Brian Paul   free(ctx->EvalMap.Map2Texture4.Points);
9646dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell}
965