Removed all RCS / CVS tags (Id, Header, Date, etc.) from everything.
[mesa.git] / src / mesa / main / eval.c
index a992a3922e1d4148f072e3bea1f9f4c1fe0aa452..03d779e89416732d7237aba1f5af88e85dbbbd5d 100644 (file)
@@ -1,10 +1,9 @@
-/* $Id: eval.c,v 1.19 2001/03/12 00:48:37 gareth Exp $ */
 
 /*
  * Mesa 3-D graphics library
- * Version:  3.5
+ * Version:  5.1
  *
- * Copyright (C) 1999-2001  Brian Paul   All Rights Reserved.
+ * Copyright (C) 1999-2003  Brian Paul   All Rights Reserved.
  *
  * Permission is hereby granted, free of charge, to any person obtaining a
  * copy of this software and associated documentation files (the "Software"),
  */
 
 
-#ifdef PC_HEADER
-#include "all.h"
-#else
 #include "glheader.h"
+#include "imports.h"
 #include "colormac.h"
 #include "context.h"
 #include "eval.h"
 #include "macros.h"
-#include "mem.h"
-#include "mmath.h"
 #include "mtypes.h"
-#endif
 
 
 /*
@@ -78,7 +72,122 @@ GLuint _mesa_evaluator_components( GLenum target )
       case GL_MAP2_TEXTURE_COORD_2:    return 2;
       case GL_MAP2_TEXTURE_COORD_3:    return 3;
       case GL_MAP2_TEXTURE_COORD_4:    return 4;
-      default:                         return 0;
+      default:                         break;
+   }
+
+   /* XXX need to check for the vertex program extension
+   if (!ctx->Extensions.NV_vertex_program)
+      return 0;
+   */
+
+   if (target >= GL_MAP1_VERTEX_ATTRIB0_4_NV &&
+       target <= GL_MAP1_VERTEX_ATTRIB15_4_NV)
+      return 4;
+
+   if (target >= GL_MAP2_VERTEX_ATTRIB0_4_NV &&
+       target <= GL_MAP2_VERTEX_ATTRIB15_4_NV)
+      return 4;
+
+   return 0;
+}
+
+
+/*
+ * Return pointer to the gl_1d_map struct for the named target.
+ */
+static struct gl_1d_map *
+get_1d_map( GLcontext *ctx, GLenum target )
+{
+   switch (target) {
+      case GL_MAP1_VERTEX_3:
+         return &ctx->EvalMap.Map1Vertex3;
+      case GL_MAP1_VERTEX_4:
+         return &ctx->EvalMap.Map1Vertex4;
+      case GL_MAP1_INDEX:
+         return &ctx->EvalMap.Map1Index;
+      case GL_MAP1_COLOR_4:
+         return &ctx->EvalMap.Map1Color4;
+      case GL_MAP1_NORMAL:
+         return &ctx->EvalMap.Map1Normal;
+      case GL_MAP1_TEXTURE_COORD_1:
+         return &ctx->EvalMap.Map1Texture1;
+      case GL_MAP1_TEXTURE_COORD_2:
+         return &ctx->EvalMap.Map1Texture2;
+      case GL_MAP1_TEXTURE_COORD_3:
+         return &ctx->EvalMap.Map1Texture3;
+      case GL_MAP1_TEXTURE_COORD_4:
+         return &ctx->EvalMap.Map1Texture4;
+      case GL_MAP1_VERTEX_ATTRIB0_4_NV:
+      case GL_MAP1_VERTEX_ATTRIB1_4_NV:
+      case GL_MAP1_VERTEX_ATTRIB2_4_NV:
+      case GL_MAP1_VERTEX_ATTRIB3_4_NV:
+      case GL_MAP1_VERTEX_ATTRIB4_4_NV:
+      case GL_MAP1_VERTEX_ATTRIB5_4_NV:
+      case GL_MAP1_VERTEX_ATTRIB6_4_NV:
+      case GL_MAP1_VERTEX_ATTRIB7_4_NV:
+      case GL_MAP1_VERTEX_ATTRIB8_4_NV:
+      case GL_MAP1_VERTEX_ATTRIB9_4_NV:
+      case GL_MAP1_VERTEX_ATTRIB10_4_NV:
+      case GL_MAP1_VERTEX_ATTRIB11_4_NV:
+      case GL_MAP1_VERTEX_ATTRIB12_4_NV:
+      case GL_MAP1_VERTEX_ATTRIB13_4_NV:
+      case GL_MAP1_VERTEX_ATTRIB14_4_NV:
+      case GL_MAP1_VERTEX_ATTRIB15_4_NV:
+         if (!ctx->Extensions.NV_vertex_program)
+            return NULL;
+         return &ctx->EvalMap.Map1Attrib[target - GL_MAP1_VERTEX_ATTRIB0_4_NV];
+      default:
+         return NULL;
+   }
+}
+
+
+/*
+ * Return pointer to the gl_2d_map struct for the named target.
+ */
+static struct gl_2d_map *
+get_2d_map( GLcontext *ctx, GLenum target )
+{
+   switch (target) {
+      case GL_MAP2_VERTEX_3:
+         return &ctx->EvalMap.Map2Vertex3;
+      case GL_MAP2_VERTEX_4:
+         return &ctx->EvalMap.Map2Vertex4;
+      case GL_MAP2_INDEX:
+         return &ctx->EvalMap.Map2Index;
+      case GL_MAP2_COLOR_4:
+         return &ctx->EvalMap.Map2Color4;
+      case GL_MAP2_NORMAL:
+         return &ctx->EvalMap.Map2Normal;
+      case GL_MAP2_TEXTURE_COORD_1:
+         return &ctx->EvalMap.Map2Texture1;
+      case GL_MAP2_TEXTURE_COORD_2:
+         return &ctx->EvalMap.Map2Texture2;
+      case GL_MAP2_TEXTURE_COORD_3:
+         return &ctx->EvalMap.Map2Texture3;
+      case GL_MAP2_TEXTURE_COORD_4:
+         return &ctx->EvalMap.Map2Texture4;
+      case GL_MAP2_VERTEX_ATTRIB0_4_NV:
+      case GL_MAP2_VERTEX_ATTRIB1_4_NV:
+      case GL_MAP2_VERTEX_ATTRIB2_4_NV:
+      case GL_MAP2_VERTEX_ATTRIB3_4_NV:
+      case GL_MAP2_VERTEX_ATTRIB4_4_NV:
+      case GL_MAP2_VERTEX_ATTRIB5_4_NV:
+      case GL_MAP2_VERTEX_ATTRIB6_4_NV:
+      case GL_MAP2_VERTEX_ATTRIB7_4_NV:
+      case GL_MAP2_VERTEX_ATTRIB8_4_NV:
+      case GL_MAP2_VERTEX_ATTRIB9_4_NV:
+      case GL_MAP2_VERTEX_ATTRIB10_4_NV:
+      case GL_MAP2_VERTEX_ATTRIB11_4_NV:
+      case GL_MAP2_VERTEX_ATTRIB12_4_NV:
+      case GL_MAP2_VERTEX_ATTRIB13_4_NV:
+      case GL_MAP2_VERTEX_ATTRIB14_4_NV:
+      case GL_MAP2_VERTEX_ATTRIB15_4_NV:
+         if (!ctx->Extensions.NV_vertex_program)
+            return NULL;
+         return &ctx->EvalMap.Map2Attrib[target - GL_MAP2_VERTEX_ATTRIB0_4_NV];
+      default:
+         return NULL;
    }
 }
 
@@ -96,20 +205,19 @@ GLuint _mesa_evaluator_components( GLenum target )
  *          of memory.
  */
 GLfloat *_mesa_copy_map_points1f( GLenum target, GLint ustride, GLint uorder,
-                               const GLfloat *points )
+                                  const GLfloat *points )
 {
    GLfloat *buffer, *p;
    GLint i, k, size = _mesa_evaluator_components(target);
 
-   if (!points || size==0) {
+   if (!points || !size)
       return NULL;
-   }
 
    buffer = (GLfloat *) MALLOC(uorder * size * sizeof(GLfloat));
 
-   if(buffer)
-      for(i=0, p=buffer; i<uorder; i++, points+=ustride)
-       for(k=0; k<size; k++)
+   if (buffer)
+      for (i = 0, p = buffer; i < uorder; i++, points += ustride)
+       for (k = 0; k < size; k++)
          *p++ = points[k];
 
    return buffer;
@@ -121,20 +229,19 @@ GLfloat *_mesa_copy_map_points1f( GLenum target, GLint ustride, GLint uorder,
  * Same as above but convert doubles to floats.
  */
 GLfloat *_mesa_copy_map_points1d( GLenum target, GLint ustride, GLint uorder,
-                               const GLdouble *points )
+                                  const GLdouble *points )
 {
    GLfloat *buffer, *p;
    GLint i, k, size = _mesa_evaluator_components(target);
 
-   if (!points || size==0) {
+   if (!points || !size)
       return NULL;
-   }
 
    buffer = (GLfloat *) MALLOC(uorder * size * sizeof(GLfloat));
 
-   if(buffer)
-      for(i=0, p=buffer; i<uorder; i++, points+=ustride)
-       for(k=0; k<size; k++)
+   if (buffer)
+      for (i = 0, p = buffer; i < uorder; i++, points += ustride)
+       for (k = 0; k < size; k++)
          *p++ = (GLfloat) points[k];
 
    return buffer;
@@ -153,9 +260,9 @@ GLfloat *_mesa_copy_map_points1d( GLenum target, GLint ustride, GLint uorder,
  *          of memory.
  */
 GLfloat *_mesa_copy_map_points2f( GLenum target,
-                               GLint ustride, GLint uorder,
-                               GLint vstride, GLint vorder,
-                               const GLfloat *points )
+                                  GLint ustride, GLint uorder,
+                                  GLint vstride, GLint vorder,
+                                  const GLfloat *points )
 {
    GLfloat *buffer, *p;
    GLint i, j, k, size, dsize, hsize;
@@ -196,9 +303,9 @@ GLfloat *_mesa_copy_map_points2f( GLenum target,
  * Same as above but convert doubles to floats.
  */
 GLfloat *_mesa_copy_map_points2d(GLenum target,
-                              GLint ustride, GLint uorder,
-                              GLint vstride, GLint vorder,
-                              const GLdouble *points )
+                                 GLint ustride, GLint uorder,
+                                 GLint vstride, GLint vorder,
+                                 const GLdouble *points )
 {
    GLfloat *buffer, *p;
    GLint i, j, k, size, hsize, dsize;
@@ -251,10 +358,10 @@ map1(GLenum target, GLfloat u1, GLfloat u2, GLint ustride,
    GET_CURRENT_CONTEXT(ctx);
    GLint k;
    GLfloat *pnts;
-   struct gl_1d_map *map = 0;
-   ASSERT_OUTSIDE_BEGIN_END(ctx);
+   struct gl_1d_map *map = NULL;
 
-   assert(type == GL_FLOAT || type == GL_DOUBLE);
+   ASSERT_OUTSIDE_BEGIN_END(ctx);
+   ASSERT(type == GL_FLOAT || type == GL_DOUBLE);
 
    if (u1 == u2) {
       _mesa_error( ctx, GL_INVALID_VALUE, "glMap1(u1,u2)" );
@@ -279,37 +386,16 @@ map1(GLenum target, GLfloat u1, GLfloat u2, GLint ustride,
       return;
    }
 
-   switch (target) {
-      case GL_MAP1_VERTEX_3:
-         map = &ctx->EvalMap.Map1Vertex3;
-        break;
-      case GL_MAP1_VERTEX_4:
-         map = &ctx->EvalMap.Map1Vertex4;
-        break;
-      case GL_MAP1_INDEX:
-         map = &ctx->EvalMap.Map1Index;
-        break;
-      case GL_MAP1_COLOR_4:
-         map = &ctx->EvalMap.Map1Color4;
-        break;
-      case GL_MAP1_NORMAL:
-         map = &ctx->EvalMap.Map1Normal;
-        break;
-      case GL_MAP1_TEXTURE_COORD_1:
-         map = &ctx->EvalMap.Map1Texture1;
-        break;
-      case GL_MAP1_TEXTURE_COORD_2:
-         map = &ctx->EvalMap.Map1Texture2;
-        break;
-      case GL_MAP1_TEXTURE_COORD_3:
-         map = &ctx->EvalMap.Map1Texture3;
-        break;
-      case GL_MAP1_TEXTURE_COORD_4:
-         map = &ctx->EvalMap.Map1Texture4;
-        break;
-      default:
-         _mesa_error( ctx, GL_INVALID_ENUM, "glMap1(target)" );
-        return;
+   if (ctx->Texture.CurrentUnit != 0) {
+      /* See OpenGL 1.2.1 spec, section F.2.13 */
+      _mesa_error( ctx, GL_INVALID_OPERATION, "glMap2(ACTIVE_TEXTURE != 0)" );
+      return;
+   }
+
+   map = get_1d_map(ctx, target);
+   if (!map) {
+      _mesa_error( ctx, GL_INVALID_ENUM, "glMap1(target)" );
+      return;
    }
 
    /* make copy of the control points */
@@ -323,7 +409,7 @@ map1(GLenum target, GLfloat u1, GLfloat u2, GLint ustride,
    map->Order = uorder;
    map->u1 = u1;
    map->u2 = u2;
-   map->du = 1.0 / (u2 - u1);
+   map->du = 1.0F / (u2 - u1);
    if (map->Points)
       FREE( map->Points );
    map->Points = pnts;
@@ -343,7 +429,7 @@ void
 _mesa_Map1d( GLenum target, GLdouble u1, GLdouble u2, GLint stride,
              GLint order, const GLdouble *points )
 {
-   map1(target, u1, u2, stride, order, points, GL_DOUBLE);
+   map1(target, (GLfloat) u1, (GLfloat) u2, stride, order, points, GL_DOUBLE);
 }
 
 
@@ -355,8 +441,10 @@ map2( GLenum target, GLfloat u1, GLfloat u2, GLint ustride, GLint uorder,
    GET_CURRENT_CONTEXT(ctx);
    GLint k;
    GLfloat *pnts;
-   struct gl_2d_map *map = 0;
+   struct gl_2d_map *map = NULL;
+
    ASSERT_OUTSIDE_BEGIN_END(ctx);
+   ASSERT(type == GL_FLOAT || type == GL_DOUBLE);
 
    if (u1==u2) {
       _mesa_error( ctx, GL_INVALID_VALUE, "glMap2(u1,u2)" );
@@ -392,37 +480,16 @@ map2( GLenum target, GLfloat u1, GLfloat u2, GLint ustride, GLint uorder,
       return;
    }
 
-   switch (target) {
-      case GL_MAP2_VERTEX_3:
-         map = &ctx->EvalMap.Map2Vertex3;
-        break;
-      case GL_MAP2_VERTEX_4:
-         map = &ctx->EvalMap.Map2Vertex4;
-        break;
-      case GL_MAP2_INDEX:
-         map = &ctx->EvalMap.Map2Index;
-        break;
-      case GL_MAP2_COLOR_4:
-         map = &ctx->EvalMap.Map2Color4;
-        break;
-      case GL_MAP2_NORMAL:
-         map = &ctx->EvalMap.Map2Normal;
-        break;
-      case GL_MAP2_TEXTURE_COORD_1:
-         map = &ctx->EvalMap.Map2Texture1;
-        break;
-      case GL_MAP2_TEXTURE_COORD_2:
-         map = &ctx->EvalMap.Map2Texture2;
-        break;
-      case GL_MAP2_TEXTURE_COORD_3:
-         map = &ctx->EvalMap.Map2Texture3;
-        break;
-      case GL_MAP2_TEXTURE_COORD_4:
-         map = &ctx->EvalMap.Map2Texture4;
-        break;
-      default:
-         _mesa_error( ctx, GL_INVALID_ENUM, "glMap2(target)" );
-        return;
+   if (ctx->Texture.CurrentUnit != 0) {
+      /* See OpenGL 1.2.1 spec, section F.2.13 */
+      _mesa_error( ctx, GL_INVALID_OPERATION, "glMap2(ACTIVE_TEXTURE != 0)" );
+      return;
+   }
+
+   map = get_2d_map(ctx, target);
+   if (!map) {
+      _mesa_error( ctx, GL_INVALID_ENUM, "glMap2(target)" );
+      return;
    }
 
    /* make copy of the control points */
@@ -438,11 +505,11 @@ map2( GLenum target, GLfloat u1, GLfloat u2, GLint ustride, GLint uorder,
    map->Uorder = uorder;
    map->u1 = u1;
    map->u2 = u2;
-   map->du = 1.0 / (u2 - u1);
+   map->du = 1.0F / (u2 - u1);
    map->Vorder = vorder;
    map->v1 = v1;
    map->v2 = v2;
-   map->dv = 1.0 / (v2 - v1);
+   map->dv = 1.0F / (v2 - v1);
    if (map->Points)
       FREE( map->Points );
    map->Points = pnts;
@@ -466,8 +533,8 @@ _mesa_Map2d( GLenum target,
              GLdouble v1, GLdouble v2, GLint vstride, GLint vorder,
              const GLdouble *points )
 {
-   map2(target, u1, u2, ustride, uorder, v1, v2, vstride, vorder,
-        points, GL_DOUBLE);
+   map2(target, (GLfloat) u1, (GLfloat) u2, ustride, uorder, 
+       (GLfloat) v1, (GLfloat) v2, vstride, vorder, points, GL_DOUBLE);
 }
 
 
@@ -476,98 +543,34 @@ void
 _mesa_GetMapdv( GLenum target, GLenum query, GLdouble *v )
 {
    GET_CURRENT_CONTEXT(ctx);
+   struct gl_1d_map *map1d;
+   struct gl_2d_map *map2d;
    GLint i, n;
    GLfloat *data;
+   GLuint comps;
+
    ASSERT_OUTSIDE_BEGIN_END(ctx);
 
+   comps = _mesa_evaluator_components(target);
+   if (!comps) {
+      _mesa_error( ctx, GL_INVALID_ENUM, "glGetMapdv(target)" );
+      return;
+   }
+
+   map1d = get_1d_map(ctx, target);
+   map2d = get_2d_map(ctx, target);
+   ASSERT(map1d || map2d);
+
    switch (query) {
       case GL_COEFF:
-        switch (target) {
-           case GL_MAP1_COLOR_4:
-              data = ctx->EvalMap.Map1Color4.Points;
-              n = ctx->EvalMap.Map1Color4.Order * 4;
-              break;
-           case GL_MAP1_INDEX:
-              data = ctx->EvalMap.Map1Index.Points;
-              n = ctx->EvalMap.Map1Index.Order;
-              break;
-           case GL_MAP1_NORMAL:
-              data = ctx->EvalMap.Map1Normal.Points;
-              n = ctx->EvalMap.Map1Normal.Order * 3;
-              break;
-           case GL_MAP1_TEXTURE_COORD_1:
-              data = ctx->EvalMap.Map1Texture1.Points;
-              n = ctx->EvalMap.Map1Texture1.Order * 1;
-              break;
-           case GL_MAP1_TEXTURE_COORD_2:
-              data = ctx->EvalMap.Map1Texture2.Points;
-              n = ctx->EvalMap.Map1Texture2.Order * 2;
-              break;
-           case GL_MAP1_TEXTURE_COORD_3:
-              data = ctx->EvalMap.Map1Texture3.Points;
-              n = ctx->EvalMap.Map1Texture3.Order * 3;
-              break;
-           case GL_MAP1_TEXTURE_COORD_4:
-              data = ctx->EvalMap.Map1Texture4.Points;
-              n = ctx->EvalMap.Map1Texture4.Order * 4;
-              break;
-           case GL_MAP1_VERTEX_3:
-              data = ctx->EvalMap.Map1Vertex3.Points;
-              n = ctx->EvalMap.Map1Vertex3.Order * 3;
-              break;
-           case GL_MAP1_VERTEX_4:
-              data = ctx->EvalMap.Map1Vertex4.Points;
-              n = ctx->EvalMap.Map1Vertex4.Order * 4;
-              break;
-           case GL_MAP2_COLOR_4:
-              data = ctx->EvalMap.Map2Color4.Points;
-              n = ctx->EvalMap.Map2Color4.Uorder
-                 * ctx->EvalMap.Map2Color4.Vorder * 4;
-              break;
-           case GL_MAP2_INDEX:
-              data = ctx->EvalMap.Map2Index.Points;
-              n = ctx->EvalMap.Map2Index.Uorder
-                 * ctx->EvalMap.Map2Index.Vorder;
-              break;
-           case GL_MAP2_NORMAL:
-              data = ctx->EvalMap.Map2Normal.Points;
-              n = ctx->EvalMap.Map2Normal.Uorder
-                 * ctx->EvalMap.Map2Normal.Vorder * 3;
-              break;
-           case GL_MAP2_TEXTURE_COORD_1:
-              data = ctx->EvalMap.Map2Texture1.Points;
-              n = ctx->EvalMap.Map2Texture1.Uorder
-                 * ctx->EvalMap.Map2Texture1.Vorder * 1;
-              break;
-           case GL_MAP2_TEXTURE_COORD_2:
-              data = ctx->EvalMap.Map2Texture2.Points;
-              n = ctx->EvalMap.Map2Texture2.Uorder
-                 * ctx->EvalMap.Map2Texture2.Vorder * 2;
-              break;
-           case GL_MAP2_TEXTURE_COORD_3:
-              data = ctx->EvalMap.Map2Texture3.Points;
-              n = ctx->EvalMap.Map2Texture3.Uorder
-                 * ctx->EvalMap.Map2Texture3.Vorder * 3;
-              break;
-           case GL_MAP2_TEXTURE_COORD_4:
-              data = ctx->EvalMap.Map2Texture4.Points;
-              n = ctx->EvalMap.Map2Texture4.Uorder
-                 * ctx->EvalMap.Map2Texture4.Vorder * 4;
-              break;
-           case GL_MAP2_VERTEX_3:
-              data = ctx->EvalMap.Map2Vertex3.Points;
-              n = ctx->EvalMap.Map2Vertex3.Uorder
-                 * ctx->EvalMap.Map2Vertex3.Vorder * 3;
-              break;
-           case GL_MAP2_VERTEX_4:
-              data = ctx->EvalMap.Map2Vertex4.Points;
-              n = ctx->EvalMap.Map2Vertex4.Uorder
-                 * ctx->EvalMap.Map2Vertex4.Vorder * 4;
-              break;
-           default:
-              _mesa_error( ctx, GL_INVALID_ENUM, "glGetMapdv(target)" );
-              return;
-        }
+         if (map1d) {
+            data = map1d->Points;
+            n = map1d->Order * comps;
+         }
+         else {
+            data = map2d->Points;
+            n = map2d->Uorder * map2d->Vorder * comps;
+         }
         if (data) {
            for (i=0;i<n;i++) {
               v[i] = data[i];
@@ -575,170 +578,25 @@ _mesa_GetMapdv( GLenum target, GLenum query, GLdouble *v )
         }
          break;
       case GL_ORDER:
-        switch (target) {
-           case GL_MAP1_COLOR_4:
-              *v = ctx->EvalMap.Map1Color4.Order;
-              break;
-           case GL_MAP1_INDEX:
-              *v = ctx->EvalMap.Map1Index.Order;
-              break;
-           case GL_MAP1_NORMAL:
-              *v = ctx->EvalMap.Map1Normal.Order;
-              break;
-           case GL_MAP1_TEXTURE_COORD_1:
-              *v = ctx->EvalMap.Map1Texture1.Order;
-              break;
-           case GL_MAP1_TEXTURE_COORD_2:
-              *v = ctx->EvalMap.Map1Texture2.Order;
-              break;
-           case GL_MAP1_TEXTURE_COORD_3:
-              *v = ctx->EvalMap.Map1Texture3.Order;
-              break;
-           case GL_MAP1_TEXTURE_COORD_4:
-              *v = ctx->EvalMap.Map1Texture4.Order;
-              break;
-           case GL_MAP1_VERTEX_3:
-              *v = ctx->EvalMap.Map1Vertex3.Order;
-              break;
-           case GL_MAP1_VERTEX_4:
-              *v = ctx->EvalMap.Map1Vertex4.Order;
-              break;
-           case GL_MAP2_COLOR_4:
-              v[0] = ctx->EvalMap.Map2Color4.Uorder;
-              v[1] = ctx->EvalMap.Map2Color4.Vorder;
-              break;
-           case GL_MAP2_INDEX:
-              v[0] = ctx->EvalMap.Map2Index.Uorder;
-              v[1] = ctx->EvalMap.Map2Index.Vorder;
-              break;
-           case GL_MAP2_NORMAL:
-              v[0] = ctx->EvalMap.Map2Normal.Uorder;
-              v[1] = ctx->EvalMap.Map2Normal.Vorder;
-              break;
-           case GL_MAP2_TEXTURE_COORD_1:
-              v[0] = ctx->EvalMap.Map2Texture1.Uorder;
-              v[1] = ctx->EvalMap.Map2Texture1.Vorder;
-              break;
-           case GL_MAP2_TEXTURE_COORD_2:
-              v[0] = ctx->EvalMap.Map2Texture2.Uorder;
-              v[1] = ctx->EvalMap.Map2Texture2.Vorder;
-              break;
-           case GL_MAP2_TEXTURE_COORD_3:
-              v[0] = ctx->EvalMap.Map2Texture3.Uorder;
-              v[1] = ctx->EvalMap.Map2Texture3.Vorder;
-              break;
-           case GL_MAP2_TEXTURE_COORD_4:
-              v[0] = ctx->EvalMap.Map2Texture4.Uorder;
-              v[1] = ctx->EvalMap.Map2Texture4.Vorder;
-              break;
-           case GL_MAP2_VERTEX_3:
-              v[0] = ctx->EvalMap.Map2Vertex3.Uorder;
-              v[1] = ctx->EvalMap.Map2Vertex3.Vorder;
-              break;
-           case GL_MAP2_VERTEX_4:
-              v[0] = ctx->EvalMap.Map2Vertex4.Uorder;
-              v[1] = ctx->EvalMap.Map2Vertex4.Vorder;
-              break;
-           default:
-              _mesa_error( ctx, GL_INVALID_ENUM, "glGetMapdv(target)" );
-              return;
-        }
+         if (map1d) {
+            v[0] = (GLdouble) map1d->Order;
+         }
+         else {
+            v[0] = (GLdouble) map2d->Uorder;
+            v[1] = (GLdouble) map2d->Vorder;
+         }
          break;
       case GL_DOMAIN:
-        switch (target) {
-           case GL_MAP1_COLOR_4:
-              v[0] = ctx->EvalMap.Map1Color4.u1;
-              v[1] = ctx->EvalMap.Map1Color4.u2;
-              break;
-           case GL_MAP1_INDEX:
-              v[0] = ctx->EvalMap.Map1Index.u1;
-              v[1] = ctx->EvalMap.Map1Index.u2;
-              break;
-           case GL_MAP1_NORMAL:
-              v[0] = ctx->EvalMap.Map1Normal.u1;
-              v[1] = ctx->EvalMap.Map1Normal.u2;
-              break;
-           case GL_MAP1_TEXTURE_COORD_1:
-              v[0] = ctx->EvalMap.Map1Texture1.u1;
-              v[1] = ctx->EvalMap.Map1Texture1.u2;
-              break;
-           case GL_MAP1_TEXTURE_COORD_2:
-              v[0] = ctx->EvalMap.Map1Texture2.u1;
-              v[1] = ctx->EvalMap.Map1Texture2.u2;
-              break;
-           case GL_MAP1_TEXTURE_COORD_3:
-              v[0] = ctx->EvalMap.Map1Texture3.u1;
-              v[1] = ctx->EvalMap.Map1Texture3.u2;
-              break;
-           case GL_MAP1_TEXTURE_COORD_4:
-              v[0] = ctx->EvalMap.Map1Texture4.u1;
-              v[1] = ctx->EvalMap.Map1Texture4.u2;
-              break;
-           case GL_MAP1_VERTEX_3:
-              v[0] = ctx->EvalMap.Map1Vertex3.u1;
-              v[1] = ctx->EvalMap.Map1Vertex3.u2;
-              break;
-           case GL_MAP1_VERTEX_4:
-              v[0] = ctx->EvalMap.Map1Vertex4.u1;
-              v[1] = ctx->EvalMap.Map1Vertex4.u2;
-              break;
-           case GL_MAP2_COLOR_4:
-              v[0] = ctx->EvalMap.Map2Color4.u1;
-              v[1] = ctx->EvalMap.Map2Color4.u2;
-              v[2] = ctx->EvalMap.Map2Color4.v1;
-              v[3] = ctx->EvalMap.Map2Color4.v2;
-              break;
-           case GL_MAP2_INDEX:
-              v[0] = ctx->EvalMap.Map2Index.u1;
-              v[1] = ctx->EvalMap.Map2Index.u2;
-              v[2] = ctx->EvalMap.Map2Index.v1;
-              v[3] = ctx->EvalMap.Map2Index.v2;
-              break;
-           case GL_MAP2_NORMAL:
-              v[0] = ctx->EvalMap.Map2Normal.u1;
-              v[1] = ctx->EvalMap.Map2Normal.u2;
-              v[2] = ctx->EvalMap.Map2Normal.v1;
-              v[3] = ctx->EvalMap.Map2Normal.v2;
-              break;
-           case GL_MAP2_TEXTURE_COORD_1:
-              v[0] = ctx->EvalMap.Map2Texture1.u1;
-              v[1] = ctx->EvalMap.Map2Texture1.u2;
-              v[2] = ctx->EvalMap.Map2Texture1.v1;
-              v[3] = ctx->EvalMap.Map2Texture1.v2;
-              break;
-           case GL_MAP2_TEXTURE_COORD_2:
-              v[0] = ctx->EvalMap.Map2Texture2.u1;
-              v[1] = ctx->EvalMap.Map2Texture2.u2;
-              v[2] = ctx->EvalMap.Map2Texture2.v1;
-              v[3] = ctx->EvalMap.Map2Texture2.v2;
-              break;
-           case GL_MAP2_TEXTURE_COORD_3:
-              v[0] = ctx->EvalMap.Map2Texture3.u1;
-              v[1] = ctx->EvalMap.Map2Texture3.u2;
-              v[2] = ctx->EvalMap.Map2Texture3.v1;
-              v[3] = ctx->EvalMap.Map2Texture3.v2;
-              break;
-           case GL_MAP2_TEXTURE_COORD_4:
-              v[0] = ctx->EvalMap.Map2Texture4.u1;
-              v[1] = ctx->EvalMap.Map2Texture4.u2;
-              v[2] = ctx->EvalMap.Map2Texture4.v1;
-              v[3] = ctx->EvalMap.Map2Texture4.v2;
-              break;
-           case GL_MAP2_VERTEX_3:
-              v[0] = ctx->EvalMap.Map2Vertex3.u1;
-              v[1] = ctx->EvalMap.Map2Vertex3.u2;
-              v[2] = ctx->EvalMap.Map2Vertex3.v1;
-              v[3] = ctx->EvalMap.Map2Vertex3.v2;
-              break;
-           case GL_MAP2_VERTEX_4:
-              v[0] = ctx->EvalMap.Map2Vertex4.u1;
-              v[1] = ctx->EvalMap.Map2Vertex4.u2;
-              v[2] = ctx->EvalMap.Map2Vertex4.v1;
-              v[3] = ctx->EvalMap.Map2Vertex4.v2;
-              break;
-           default:
-              _mesa_error( ctx, GL_INVALID_ENUM, "glGetMapdv(target)" );
-        }
+         if (map1d) {
+            v[0] = (GLdouble) map1d->u1;
+            v[1] = (GLdouble) map1d->u2;
+         }
+         else {
+            v[0] = (GLdouble) map2d->u1;
+            v[1] = (GLdouble) map2d->u2;
+            v[2] = (GLdouble) map2d->v1;
+            v[3] = (GLdouble) map2d->v2;
+         }
          break;
       default:
          _mesa_error( ctx, GL_INVALID_ENUM, "glGetMapdv(query)" );
@@ -750,98 +608,34 @@ void
 _mesa_GetMapfv( GLenum target, GLenum query, GLfloat *v )
 {
    GET_CURRENT_CONTEXT(ctx);
+   struct gl_1d_map *map1d;
+   struct gl_2d_map *map2d;
    GLint i, n;
    GLfloat *data;
+   GLuint comps;
+
    ASSERT_OUTSIDE_BEGIN_END(ctx);
 
+   comps = _mesa_evaluator_components(target);
+   if (!comps) {
+      _mesa_error( ctx, GL_INVALID_ENUM, "glGetMapfv(target)" );
+      return;
+   }
+
+   map1d = get_1d_map(ctx, target);
+   map2d = get_2d_map(ctx, target);
+   ASSERT(map1d || map2d);
+
    switch (query) {
       case GL_COEFF:
-        switch (target) {
-           case GL_MAP1_COLOR_4:
-              data = ctx->EvalMap.Map1Color4.Points;
-              n = ctx->EvalMap.Map1Color4.Order * 4;
-              break;
-           case GL_MAP1_INDEX:
-              data = ctx->EvalMap.Map1Index.Points;
-              n = ctx->EvalMap.Map1Index.Order;
-              break;
-           case GL_MAP1_NORMAL:
-              data = ctx->EvalMap.Map1Normal.Points;
-              n = ctx->EvalMap.Map1Normal.Order * 3;
-              break;
-           case GL_MAP1_TEXTURE_COORD_1:
-              data = ctx->EvalMap.Map1Texture1.Points;
-              n = ctx->EvalMap.Map1Texture1.Order * 1;
-              break;
-           case GL_MAP1_TEXTURE_COORD_2:
-              data = ctx->EvalMap.Map1Texture2.Points;
-              n = ctx->EvalMap.Map1Texture2.Order * 2;
-              break;
-           case GL_MAP1_TEXTURE_COORD_3:
-              data = ctx->EvalMap.Map1Texture3.Points;
-              n = ctx->EvalMap.Map1Texture3.Order * 3;
-              break;
-           case GL_MAP1_TEXTURE_COORD_4:
-              data = ctx->EvalMap.Map1Texture4.Points;
-              n = ctx->EvalMap.Map1Texture4.Order * 4;
-              break;
-           case GL_MAP1_VERTEX_3:
-              data = ctx->EvalMap.Map1Vertex3.Points;
-              n = ctx->EvalMap.Map1Vertex3.Order * 3;
-              break;
-           case GL_MAP1_VERTEX_4:
-              data = ctx->EvalMap.Map1Vertex4.Points;
-              n = ctx->EvalMap.Map1Vertex4.Order * 4;
-              break;
-           case GL_MAP2_COLOR_4:
-              data = ctx->EvalMap.Map2Color4.Points;
-              n = ctx->EvalMap.Map2Color4.Uorder
-                 * ctx->EvalMap.Map2Color4.Vorder * 4;
-              break;
-           case GL_MAP2_INDEX:
-              data = ctx->EvalMap.Map2Index.Points;
-              n = ctx->EvalMap.Map2Index.Uorder
-                 * ctx->EvalMap.Map2Index.Vorder;
-              break;
-           case GL_MAP2_NORMAL:
-              data = ctx->EvalMap.Map2Normal.Points;
-              n = ctx->EvalMap.Map2Normal.Uorder
-                 * ctx->EvalMap.Map2Normal.Vorder * 3;
-              break;
-           case GL_MAP2_TEXTURE_COORD_1:
-              data = ctx->EvalMap.Map2Texture1.Points;
-              n = ctx->EvalMap.Map2Texture1.Uorder
-                 * ctx->EvalMap.Map2Texture1.Vorder * 1;
-              break;
-           case GL_MAP2_TEXTURE_COORD_2:
-              data = ctx->EvalMap.Map2Texture2.Points;
-              n = ctx->EvalMap.Map2Texture2.Uorder
-                 * ctx->EvalMap.Map2Texture2.Vorder * 2;
-              break;
-           case GL_MAP2_TEXTURE_COORD_3:
-              data = ctx->EvalMap.Map2Texture3.Points;
-              n = ctx->EvalMap.Map2Texture3.Uorder
-                 * ctx->EvalMap.Map2Texture3.Vorder * 3;
-              break;
-           case GL_MAP2_TEXTURE_COORD_4:
-              data = ctx->EvalMap.Map2Texture4.Points;
-              n = ctx->EvalMap.Map2Texture4.Uorder
-                 * ctx->EvalMap.Map2Texture4.Vorder * 4;
-              break;
-           case GL_MAP2_VERTEX_3:
-              data = ctx->EvalMap.Map2Vertex3.Points;
-              n = ctx->EvalMap.Map2Vertex3.Uorder
-                 * ctx->EvalMap.Map2Vertex3.Vorder * 3;
-              break;
-           case GL_MAP2_VERTEX_4:
-              data = ctx->EvalMap.Map2Vertex4.Points;
-              n = ctx->EvalMap.Map2Vertex4.Uorder
-                 * ctx->EvalMap.Map2Vertex4.Vorder * 4;
-              break;
-           default:
-              _mesa_error( ctx, GL_INVALID_ENUM, "glGetMapfv(target)" );
-              return;
-        }
+         if (map1d) {
+            data = map1d->Points;
+            n = map1d->Order * comps;
+         }
+         else {
+            data = map2d->Points;
+            n = map2d->Uorder * map2d->Vorder * comps;
+         }
         if (data) {
            for (i=0;i<n;i++) {
               v[i] = data[i];
@@ -849,170 +643,25 @@ _mesa_GetMapfv( GLenum target, GLenum query, GLfloat *v )
         }
          break;
       case GL_ORDER:
-        switch (target) {
-           case GL_MAP1_COLOR_4:
-              *v = ctx->EvalMap.Map1Color4.Order;
-              break;
-           case GL_MAP1_INDEX:
-              *v = ctx->EvalMap.Map1Index.Order;
-              break;
-           case GL_MAP1_NORMAL:
-              *v = ctx->EvalMap.Map1Normal.Order;
-              break;
-           case GL_MAP1_TEXTURE_COORD_1:
-              *v = ctx->EvalMap.Map1Texture1.Order;
-              break;
-           case GL_MAP1_TEXTURE_COORD_2:
-              *v = ctx->EvalMap.Map1Texture2.Order;
-              break;
-           case GL_MAP1_TEXTURE_COORD_3:
-              *v = ctx->EvalMap.Map1Texture3.Order;
-              break;
-           case GL_MAP1_TEXTURE_COORD_4:
-              *v = ctx->EvalMap.Map1Texture4.Order;
-              break;
-           case GL_MAP1_VERTEX_3:
-              *v = ctx->EvalMap.Map1Vertex3.Order;
-              break;
-           case GL_MAP1_VERTEX_4:
-              *v = ctx->EvalMap.Map1Vertex4.Order;
-              break;
-           case GL_MAP2_COLOR_4:
-              v[0] = ctx->EvalMap.Map2Color4.Uorder;
-              v[1] = ctx->EvalMap.Map2Color4.Vorder;
-              break;
-           case GL_MAP2_INDEX:
-              v[0] = ctx->EvalMap.Map2Index.Uorder;
-              v[1] = ctx->EvalMap.Map2Index.Vorder;
-              break;
-           case GL_MAP2_NORMAL:
-              v[0] = ctx->EvalMap.Map2Normal.Uorder;
-              v[1] = ctx->EvalMap.Map2Normal.Vorder;
-              break;
-           case GL_MAP2_TEXTURE_COORD_1:
-              v[0] = ctx->EvalMap.Map2Texture1.Uorder;
-              v[1] = ctx->EvalMap.Map2Texture1.Vorder;
-              break;
-           case GL_MAP2_TEXTURE_COORD_2:
-              v[0] = ctx->EvalMap.Map2Texture2.Uorder;
-              v[1] = ctx->EvalMap.Map2Texture2.Vorder;
-              break;
-           case GL_MAP2_TEXTURE_COORD_3:
-              v[0] = ctx->EvalMap.Map2Texture3.Uorder;
-              v[1] = ctx->EvalMap.Map2Texture3.Vorder;
-              break;
-           case GL_MAP2_TEXTURE_COORD_4:
-              v[0] = ctx->EvalMap.Map2Texture4.Uorder;
-              v[1] = ctx->EvalMap.Map2Texture4.Vorder;
-              break;
-           case GL_MAP2_VERTEX_3:
-              v[0] = ctx->EvalMap.Map2Vertex3.Uorder;
-              v[1] = ctx->EvalMap.Map2Vertex3.Vorder;
-              break;
-           case GL_MAP2_VERTEX_4:
-              v[0] = ctx->EvalMap.Map2Vertex4.Uorder;
-              v[1] = ctx->EvalMap.Map2Vertex4.Vorder;
-              break;
-           default:
-              _mesa_error( ctx, GL_INVALID_ENUM, "glGetMapfv(target)" );
-              return;
-        }
+         if (map1d) {
+            v[0] = (GLfloat) map1d->Order;
+         }
+         else {
+            v[0] = (GLfloat) map2d->Uorder;
+            v[1] = (GLfloat) map2d->Vorder;
+         }
          break;
       case GL_DOMAIN:
-        switch (target) {
-           case GL_MAP1_COLOR_4:
-              v[0] = ctx->EvalMap.Map1Color4.u1;
-              v[1] = ctx->EvalMap.Map1Color4.u2;
-              break;
-           case GL_MAP1_INDEX:
-              v[0] = ctx->EvalMap.Map1Index.u1;
-              v[1] = ctx->EvalMap.Map1Index.u2;
-              break;
-           case GL_MAP1_NORMAL:
-              v[0] = ctx->EvalMap.Map1Normal.u1;
-              v[1] = ctx->EvalMap.Map1Normal.u2;
-              break;
-           case GL_MAP1_TEXTURE_COORD_1:
-              v[0] = ctx->EvalMap.Map1Texture1.u1;
-              v[1] = ctx->EvalMap.Map1Texture1.u2;
-              break;
-           case GL_MAP1_TEXTURE_COORD_2:
-              v[0] = ctx->EvalMap.Map1Texture2.u1;
-              v[1] = ctx->EvalMap.Map1Texture2.u2;
-              break;
-           case GL_MAP1_TEXTURE_COORD_3:
-              v[0] = ctx->EvalMap.Map1Texture3.u1;
-              v[1] = ctx->EvalMap.Map1Texture3.u2;
-              break;
-           case GL_MAP1_TEXTURE_COORD_4:
-              v[0] = ctx->EvalMap.Map1Texture4.u1;
-              v[1] = ctx->EvalMap.Map1Texture4.u2;
-              break;
-           case GL_MAP1_VERTEX_3:
-              v[0] = ctx->EvalMap.Map1Vertex3.u1;
-              v[1] = ctx->EvalMap.Map1Vertex3.u2;
-              break;
-           case GL_MAP1_VERTEX_4:
-              v[0] = ctx->EvalMap.Map1Vertex4.u1;
-              v[1] = ctx->EvalMap.Map1Vertex4.u2;
-              break;
-           case GL_MAP2_COLOR_4:
-              v[0] = ctx->EvalMap.Map2Color4.u1;
-              v[1] = ctx->EvalMap.Map2Color4.u2;
-              v[2] = ctx->EvalMap.Map2Color4.v1;
-              v[3] = ctx->EvalMap.Map2Color4.v2;
-              break;
-           case GL_MAP2_INDEX:
-              v[0] = ctx->EvalMap.Map2Index.u1;
-              v[1] = ctx->EvalMap.Map2Index.u2;
-              v[2] = ctx->EvalMap.Map2Index.v1;
-              v[3] = ctx->EvalMap.Map2Index.v2;
-              break;
-           case GL_MAP2_NORMAL:
-              v[0] = ctx->EvalMap.Map2Normal.u1;
-              v[1] = ctx->EvalMap.Map2Normal.u2;
-              v[2] = ctx->EvalMap.Map2Normal.v1;
-              v[3] = ctx->EvalMap.Map2Normal.v2;
-              break;
-           case GL_MAP2_TEXTURE_COORD_1:
-              v[0] = ctx->EvalMap.Map2Texture1.u1;
-              v[1] = ctx->EvalMap.Map2Texture1.u2;
-              v[2] = ctx->EvalMap.Map2Texture1.v1;
-              v[3] = ctx->EvalMap.Map2Texture1.v2;
-              break;
-           case GL_MAP2_TEXTURE_COORD_2:
-              v[0] = ctx->EvalMap.Map2Texture2.u1;
-              v[1] = ctx->EvalMap.Map2Texture2.u2;
-              v[2] = ctx->EvalMap.Map2Texture2.v1;
-              v[3] = ctx->EvalMap.Map2Texture2.v2;
-              break;
-           case GL_MAP2_TEXTURE_COORD_3:
-              v[0] = ctx->EvalMap.Map2Texture3.u1;
-              v[1] = ctx->EvalMap.Map2Texture3.u2;
-              v[2] = ctx->EvalMap.Map2Texture3.v1;
-              v[3] = ctx->EvalMap.Map2Texture3.v2;
-              break;
-           case GL_MAP2_TEXTURE_COORD_4:
-              v[0] = ctx->EvalMap.Map2Texture4.u1;
-              v[1] = ctx->EvalMap.Map2Texture4.u2;
-              v[2] = ctx->EvalMap.Map2Texture4.v1;
-              v[3] = ctx->EvalMap.Map2Texture4.v2;
-              break;
-           case GL_MAP2_VERTEX_3:
-              v[0] = ctx->EvalMap.Map2Vertex3.u1;
-              v[1] = ctx->EvalMap.Map2Vertex3.u2;
-              v[2] = ctx->EvalMap.Map2Vertex3.v1;
-              v[3] = ctx->EvalMap.Map2Vertex3.v2;
-              break;
-           case GL_MAP2_VERTEX_4:
-              v[0] = ctx->EvalMap.Map2Vertex4.u1;
-              v[1] = ctx->EvalMap.Map2Vertex4.u2;
-              v[2] = ctx->EvalMap.Map2Vertex4.v1;
-              v[3] = ctx->EvalMap.Map2Vertex4.v2;
-              break;
-           default:
-              _mesa_error( ctx, GL_INVALID_ENUM, "glGetMapfv(target)" );
-        }
+         if (map1d) {
+            v[0] = map1d->u1;
+            v[1] = map1d->u2;
+         }
+         else {
+            v[0] = map2d->u1;
+            v[1] = map2d->u2;
+            v[2] = map2d->v1;
+            v[3] = map2d->v2;
+         }
          break;
       default:
          _mesa_error( ctx, GL_INVALID_ENUM, "glGetMapfv(query)" );
@@ -1024,269 +673,60 @@ void
 _mesa_GetMapiv( GLenum target, GLenum query, GLint *v )
 {
    GET_CURRENT_CONTEXT(ctx);
+   struct gl_1d_map *map1d;
+   struct gl_2d_map *map2d;
    GLuint i, n;
    GLfloat *data;
+   GLuint comps;
+
    ASSERT_OUTSIDE_BEGIN_END(ctx);
 
+   comps = _mesa_evaluator_components(target);
+   if (!comps) {
+      _mesa_error( ctx, GL_INVALID_ENUM, "glGetMapiv(target)" );
+      return;
+   }
+
+   map1d = get_1d_map(ctx, target);
+   map2d = get_2d_map(ctx, target);
+   ASSERT(map1d || map2d);
+
    switch (query) {
       case GL_COEFF:
-        switch (target) {
-           case GL_MAP1_COLOR_4:
-              data = ctx->EvalMap.Map1Color4.Points;
-              n = ctx->EvalMap.Map1Color4.Order * 4;
-              break;
-           case GL_MAP1_INDEX:
-              data = ctx->EvalMap.Map1Index.Points;
-              n = ctx->EvalMap.Map1Index.Order;
-              break;
-           case GL_MAP1_NORMAL:
-              data = ctx->EvalMap.Map1Normal.Points;
-              n = ctx->EvalMap.Map1Normal.Order * 3;
-              break;
-           case GL_MAP1_TEXTURE_COORD_1:
-              data = ctx->EvalMap.Map1Texture1.Points;
-              n = ctx->EvalMap.Map1Texture1.Order * 1;
-              break;
-           case GL_MAP1_TEXTURE_COORD_2:
-              data = ctx->EvalMap.Map1Texture2.Points;
-              n = ctx->EvalMap.Map1Texture2.Order * 2;
-              break;
-           case GL_MAP1_TEXTURE_COORD_3:
-              data = ctx->EvalMap.Map1Texture3.Points;
-              n = ctx->EvalMap.Map1Texture3.Order * 3;
-              break;
-           case GL_MAP1_TEXTURE_COORD_4:
-              data = ctx->EvalMap.Map1Texture4.Points;
-              n = ctx->EvalMap.Map1Texture4.Order * 4;
-              break;
-           case GL_MAP1_VERTEX_3:
-              data = ctx->EvalMap.Map1Vertex3.Points;
-              n = ctx->EvalMap.Map1Vertex3.Order * 3;
-              break;
-           case GL_MAP1_VERTEX_4:
-              data = ctx->EvalMap.Map1Vertex4.Points;
-              n = ctx->EvalMap.Map1Vertex4.Order * 4;
-              break;
-           case GL_MAP2_COLOR_4:
-              data = ctx->EvalMap.Map2Color4.Points;
-              n = ctx->EvalMap.Map2Color4.Uorder
-                 * ctx->EvalMap.Map2Color4.Vorder * 4;
-              break;
-           case GL_MAP2_INDEX:
-              data = ctx->EvalMap.Map2Index.Points;
-              n = ctx->EvalMap.Map2Index.Uorder
-                 * ctx->EvalMap.Map2Index.Vorder;
-              break;
-           case GL_MAP2_NORMAL:
-              data = ctx->EvalMap.Map2Normal.Points;
-              n = ctx->EvalMap.Map2Normal.Uorder
-                 * ctx->EvalMap.Map2Normal.Vorder * 3;
-              break;
-           case GL_MAP2_TEXTURE_COORD_1:
-              data = ctx->EvalMap.Map2Texture1.Points;
-              n = ctx->EvalMap.Map2Texture1.Uorder
-                 * ctx->EvalMap.Map2Texture1.Vorder * 1;
-              break;
-           case GL_MAP2_TEXTURE_COORD_2:
-              data = ctx->EvalMap.Map2Texture2.Points;
-              n = ctx->EvalMap.Map2Texture2.Uorder
-                 * ctx->EvalMap.Map2Texture2.Vorder * 2;
-              break;
-           case GL_MAP2_TEXTURE_COORD_3:
-              data = ctx->EvalMap.Map2Texture3.Points;
-              n = ctx->EvalMap.Map2Texture3.Uorder
-                 * ctx->EvalMap.Map2Texture3.Vorder * 3;
-              break;
-           case GL_MAP2_TEXTURE_COORD_4:
-              data = ctx->EvalMap.Map2Texture4.Points;
-              n = ctx->EvalMap.Map2Texture4.Uorder
-                 * ctx->EvalMap.Map2Texture4.Vorder * 4;
-              break;
-           case GL_MAP2_VERTEX_3:
-              data = ctx->EvalMap.Map2Vertex3.Points;
-              n = ctx->EvalMap.Map2Vertex3.Uorder
-                 * ctx->EvalMap.Map2Vertex3.Vorder * 3;
-              break;
-           case GL_MAP2_VERTEX_4:
-              data = ctx->EvalMap.Map2Vertex4.Points;
-              n = ctx->EvalMap.Map2Vertex4.Uorder
-                 * ctx->EvalMap.Map2Vertex4.Vorder * 4;
-              break;
-           default:
-              _mesa_error( ctx, GL_INVALID_ENUM, "glGetMapiv(target)" );
-              return;
-        }
+         if (map1d) {
+            data = map1d->Points;
+            n = map1d->Order * comps;
+         }
+         else {
+            data = map2d->Points;
+            n = map2d->Uorder * map2d->Vorder * comps;
+         }
         if (data) {
            for (i=0;i<n;i++) {
-              v[i] = ROUNDF(data[i]);
+              v[i] = IROUND(data[i]);
            }
         }
          break;
       case GL_ORDER:
-        switch (target) {
-           case GL_MAP1_COLOR_4:
-              *v = ctx->EvalMap.Map1Color4.Order;
-              break;
-           case GL_MAP1_INDEX:
-              *v = ctx->EvalMap.Map1Index.Order;
-              break;
-           case GL_MAP1_NORMAL:
-              *v = ctx->EvalMap.Map1Normal.Order;
-              break;
-           case GL_MAP1_TEXTURE_COORD_1:
-              *v = ctx->EvalMap.Map1Texture1.Order;
-              break;
-           case GL_MAP1_TEXTURE_COORD_2:
-              *v = ctx->EvalMap.Map1Texture2.Order;
-              break;
-           case GL_MAP1_TEXTURE_COORD_3:
-              *v = ctx->EvalMap.Map1Texture3.Order;
-              break;
-           case GL_MAP1_TEXTURE_COORD_4:
-              *v = ctx->EvalMap.Map1Texture4.Order;
-              break;
-           case GL_MAP1_VERTEX_3:
-              *v = ctx->EvalMap.Map1Vertex3.Order;
-              break;
-           case GL_MAP1_VERTEX_4:
-              *v = ctx->EvalMap.Map1Vertex4.Order;
-              break;
-           case GL_MAP2_COLOR_4:
-              v[0] = ctx->EvalMap.Map2Color4.Uorder;
-              v[1] = ctx->EvalMap.Map2Color4.Vorder;
-              break;
-           case GL_MAP2_INDEX:
-              v[0] = ctx->EvalMap.Map2Index.Uorder;
-              v[1] = ctx->EvalMap.Map2Index.Vorder;
-              break;
-           case GL_MAP2_NORMAL:
-              v[0] = ctx->EvalMap.Map2Normal.Uorder;
-              v[1] = ctx->EvalMap.Map2Normal.Vorder;
-              break;
-           case GL_MAP2_TEXTURE_COORD_1:
-              v[0] = ctx->EvalMap.Map2Texture1.Uorder;
-              v[1] = ctx->EvalMap.Map2Texture1.Vorder;
-              break;
-           case GL_MAP2_TEXTURE_COORD_2:
-              v[0] = ctx->EvalMap.Map2Texture2.Uorder;
-              v[1] = ctx->EvalMap.Map2Texture2.Vorder;
-              break;
-           case GL_MAP2_TEXTURE_COORD_3:
-              v[0] = ctx->EvalMap.Map2Texture3.Uorder;
-              v[1] = ctx->EvalMap.Map2Texture3.Vorder;
-              break;
-           case GL_MAP2_TEXTURE_COORD_4:
-              v[0] = ctx->EvalMap.Map2Texture4.Uorder;
-              v[1] = ctx->EvalMap.Map2Texture4.Vorder;
-              break;
-           case GL_MAP2_VERTEX_3:
-              v[0] = ctx->EvalMap.Map2Vertex3.Uorder;
-              v[1] = ctx->EvalMap.Map2Vertex3.Vorder;
-              break;
-           case GL_MAP2_VERTEX_4:
-              v[0] = ctx->EvalMap.Map2Vertex4.Uorder;
-              v[1] = ctx->EvalMap.Map2Vertex4.Vorder;
-              break;
-           default:
-              _mesa_error( ctx, GL_INVALID_ENUM, "glGetMapiv(target)" );
-              return;
-        }
+         if (map1d) {
+            v[0] = map1d->Order;
+         }
+         else {
+            v[0] = map2d->Uorder;
+            v[1] = map2d->Vorder;
+         }
          break;
       case GL_DOMAIN:
-        switch (target) {
-           case GL_MAP1_COLOR_4:
-              v[0] = ROUNDF(ctx->EvalMap.Map1Color4.u1);
-              v[1] = ROUNDF(ctx->EvalMap.Map1Color4.u2);
-              break;
-           case GL_MAP1_INDEX:
-              v[0] = ROUNDF(ctx->EvalMap.Map1Index.u1);
-              v[1] = ROUNDF(ctx->EvalMap.Map1Index.u2);
-              break;
-           case GL_MAP1_NORMAL:
-              v[0] = ROUNDF(ctx->EvalMap.Map1Normal.u1);
-              v[1] = ROUNDF(ctx->EvalMap.Map1Normal.u2);
-              break;
-           case GL_MAP1_TEXTURE_COORD_1:
-              v[0] = ROUNDF(ctx->EvalMap.Map1Texture1.u1);
-              v[1] = ROUNDF(ctx->EvalMap.Map1Texture1.u2);
-              break;
-           case GL_MAP1_TEXTURE_COORD_2:
-              v[0] = ROUNDF(ctx->EvalMap.Map1Texture2.u1);
-              v[1] = ROUNDF(ctx->EvalMap.Map1Texture2.u2);
-              break;
-           case GL_MAP1_TEXTURE_COORD_3:
-              v[0] = ROUNDF(ctx->EvalMap.Map1Texture3.u1);
-              v[1] = ROUNDF(ctx->EvalMap.Map1Texture3.u2);
-              break;
-           case GL_MAP1_TEXTURE_COORD_4:
-              v[0] = ROUNDF(ctx->EvalMap.Map1Texture4.u1);
-              v[1] = ROUNDF(ctx->EvalMap.Map1Texture4.u2);
-              break;
-           case GL_MAP1_VERTEX_3:
-              v[0] = ROUNDF(ctx->EvalMap.Map1Vertex3.u1);
-              v[1] = ROUNDF(ctx->EvalMap.Map1Vertex3.u2);
-              break;
-           case GL_MAP1_VERTEX_4:
-              v[0] = ROUNDF(ctx->EvalMap.Map1Vertex4.u1);
-              v[1] = ROUNDF(ctx->EvalMap.Map1Vertex4.u2);
-              break;
-           case GL_MAP2_COLOR_4:
-              v[0] = ROUNDF(ctx->EvalMap.Map2Color4.u1);
-              v[1] = ROUNDF(ctx->EvalMap.Map2Color4.u2);
-              v[2] = ROUNDF(ctx->EvalMap.Map2Color4.v1);
-              v[3] = ROUNDF(ctx->EvalMap.Map2Color4.v2);
-              break;
-           case GL_MAP2_INDEX:
-              v[0] = ROUNDF(ctx->EvalMap.Map2Index.u1);
-              v[1] = ROUNDF(ctx->EvalMap.Map2Index.u2);
-              v[2] = ROUNDF(ctx->EvalMap.Map2Index.v1);
-              v[3] = ROUNDF(ctx->EvalMap.Map2Index.v2);
-              break;
-           case GL_MAP2_NORMAL:
-              v[0] = ROUNDF(ctx->EvalMap.Map2Normal.u1);
-              v[1] = ROUNDF(ctx->EvalMap.Map2Normal.u2);
-              v[2] = ROUNDF(ctx->EvalMap.Map2Normal.v1);
-              v[3] = ROUNDF(ctx->EvalMap.Map2Normal.v2);
-              break;
-           case GL_MAP2_TEXTURE_COORD_1:
-              v[0] = ROUNDF(ctx->EvalMap.Map2Texture1.u1);
-              v[1] = ROUNDF(ctx->EvalMap.Map2Texture1.u2);
-              v[2] = ROUNDF(ctx->EvalMap.Map2Texture1.v1);
-              v[3] = ROUNDF(ctx->EvalMap.Map2Texture1.v2);
-              break;
-           case GL_MAP2_TEXTURE_COORD_2:
-              v[0] = ROUNDF(ctx->EvalMap.Map2Texture2.u1);
-              v[1] = ROUNDF(ctx->EvalMap.Map2Texture2.u2);
-              v[2] = ROUNDF(ctx->EvalMap.Map2Texture2.v1);
-              v[3] = ROUNDF(ctx->EvalMap.Map2Texture2.v2);
-              break;
-           case GL_MAP2_TEXTURE_COORD_3:
-              v[0] = ROUNDF(ctx->EvalMap.Map2Texture3.u1);
-              v[1] = ROUNDF(ctx->EvalMap.Map2Texture3.u2);
-              v[2] = ROUNDF(ctx->EvalMap.Map2Texture3.v1);
-              v[3] = ROUNDF(ctx->EvalMap.Map2Texture3.v2);
-              break;
-           case GL_MAP2_TEXTURE_COORD_4:
-              v[0] = ROUNDF(ctx->EvalMap.Map2Texture4.u1);
-              v[1] = ROUNDF(ctx->EvalMap.Map2Texture4.u2);
-              v[2] = ROUNDF(ctx->EvalMap.Map2Texture4.v1);
-              v[3] = ROUNDF(ctx->EvalMap.Map2Texture4.v2);
-              break;
-           case GL_MAP2_VERTEX_3:
-              v[0] = ROUNDF(ctx->EvalMap.Map2Vertex3.u1);
-              v[1] = ROUNDF(ctx->EvalMap.Map2Vertex3.u2);
-              v[2] = ROUNDF(ctx->EvalMap.Map2Vertex3.v1);
-              v[3] = ROUNDF(ctx->EvalMap.Map2Vertex3.v2);
-              break;
-           case GL_MAP2_VERTEX_4:
-              v[0] = ROUNDF(ctx->EvalMap.Map2Vertex4.u1);
-              v[1] = ROUNDF(ctx->EvalMap.Map2Vertex4.u2);
-              v[2] = ROUNDF(ctx->EvalMap.Map2Vertex4.v1);
-              v[3] = ROUNDF(ctx->EvalMap.Map2Vertex4.v2);
-              break;
-           default:
-              _mesa_error( ctx, GL_INVALID_ENUM, "glGetMapiv(target)" );
-        }
+         if (map1d) {
+            v[0] = IROUND(map1d->u1);
+            v[1] = IROUND(map1d->u2);
+         }
+         else {
+            v[0] = IROUND(map2d->u1);
+            v[1] = IROUND(map2d->u2);
+            v[2] = IROUND(map2d->v1);
+            v[3] = IROUND(map2d->v2);
+         }
          break;
       default:
          _mesa_error( ctx, GL_INVALID_ENUM, "glGetMapiv(query)" );
@@ -1316,7 +756,7 @@ _mesa_MapGrid1f( GLint un, GLfloat u1, GLfloat u2 )
 void
 _mesa_MapGrid1d( GLint un, GLdouble u1, GLdouble u2 )
 {
-   _mesa_MapGrid1f( un, u1, u2 );
+   _mesa_MapGrid1f( un, (GLfloat) u1, (GLfloat) u2 );
 }
 
 
@@ -1352,5 +792,6 @@ void
 _mesa_MapGrid2d( GLint un, GLdouble u1, GLdouble u2,
                  GLint vn, GLdouble v1, GLdouble v2 )
 {
-   _mesa_MapGrid2f( un, u1, u2, vn, v1, v2 );
+   _mesa_MapGrid2f( un, (GLfloat) u1, (GLfloat) u2, 
+                   vn, (GLfloat) v1, (GLfloat) v2 );
 }