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