Support glMap*
authorJosé Fonseca <jose.r.fonseca@gmail.com>
Fri, 3 Jun 2011 18:33:56 +0000 (19:33 +0100)
committerJosé Fonseca <jose.r.fonseca@gmail.com>
Sat, 4 Jun 2011 12:13:10 +0000 (13:13 +0100)
glapi.py
glsize.hpp

index 93e6942..d8076ef 100644 (file)
--- a/glapi.py
+++ b/glapi.py
@@ -294,10 +294,10 @@ glapi.add_functions([
     GlFunction(Void, "glAccum", [(GLenum, "op"), (GLfloat, "value")]),
     GlFunction(Void, "glPopAttrib", []),
     GlFunction(Void, "glPushAttrib", [(GLbitfield_attrib, "mask")]),
-    GlFunction(Void, "glMap1d", [(GLenum, "target"), (GLdouble, "u1"), (GLdouble, "u2"), (GLint, "stride"), (GLint, "order"), (Const(OpaqueArray(GLdouble, "__glMap1d_size(target, stride, order)")), "points")]),
-    GlFunction(Void, "glMap1f", [(GLenum, "target"), (GLfloat, "u1"), (GLfloat, "u2"), (GLint, "stride"), (GLint, "order"), (Const(OpaqueArray(GLfloat, "__glMap1f_size(target, stride, order)")), "points")]),
-    GlFunction(Void, "glMap2d", [(GLenum, "target"), (GLdouble, "u1"), (GLdouble, "u2"), (GLint, "ustride"), (GLint, "uorder"), (GLdouble, "v1"), (GLdouble, "v2"), (GLint, "vstride"), (GLint, "vorder"), (Const(OpaqueArray(GLdouble, "__glMap2d_size(target, ustride, uorder, vstride, vorder)")), "points")]),
-    GlFunction(Void, "glMap2f", [(GLenum, "target"), (GLfloat, "u1"), (GLfloat, "u2"), (GLint, "ustride"), (GLint, "uorder"), (GLfloat, "v1"), (GLfloat, "v2"), (GLint, "vstride"), (GLint, "vorder"), (Const(OpaqueArray(GLfloat, "__glMap2f_size(target, ustride, uorder, vstride, vorder)")), "points")]),
+    GlFunction(Void, "glMap1d", [(GLenum, "target"), (GLdouble, "u1"), (GLdouble, "u2"), (GLint, "stride"), (GLint, "order"), (Const(Array(GLdouble, "__glMap1d_size(target, stride, order)")), "points")]),
+    GlFunction(Void, "glMap1f", [(GLenum, "target"), (GLfloat, "u1"), (GLfloat, "u2"), (GLint, "stride"), (GLint, "order"), (Const(Array(GLfloat, "__glMap1f_size(target, stride, order)")), "points")]),
+    GlFunction(Void, "glMap2d", [(GLenum, "target"), (GLdouble, "u1"), (GLdouble, "u2"), (GLint, "ustride"), (GLint, "uorder"), (GLdouble, "v1"), (GLdouble, "v2"), (GLint, "vstride"), (GLint, "vorder"), (Const(Array(GLdouble, "__glMap2d_size(target, ustride, uorder, vstride, vorder)")), "points")]),
+    GlFunction(Void, "glMap2f", [(GLenum, "target"), (GLfloat, "u1"), (GLfloat, "u2"), (GLint, "ustride"), (GLint, "uorder"), (GLfloat, "v1"), (GLfloat, "v2"), (GLint, "vstride"), (GLint, "vorder"), (Const(Array(GLfloat, "__glMap2f_size(target, ustride, uorder, vstride, vorder)")), "points")]),
     GlFunction(Void, "glMapGrid1d", [(GLint, "un"), (GLdouble, "u1"), (GLdouble, "u2")]),
     GlFunction(Void, "glMapGrid1f", [(GLint, "un"), (GLfloat, "u1"), (GLfloat, "u2")]),
     GlFunction(Void, "glMapGrid2d", [(GLint, "un"), (GLdouble, "u1"), (GLdouble, "u2"), (GLint, "vn"), (GLdouble, "v1"), (GLdouble, "v2")]),
index cff66d2..b9002c1 100644 (file)
@@ -234,51 +234,83 @@ __glCallLists_size(GLsizei n, GLenum type)
 
 
 static inline size_t
-__glMap1d_size(GLenum pname)
+__glMap1d_size(GLenum target, GLint stride, GLint order)
 {
-    switch (pname) {
+    if (order < 1) {
+        return 0;
+    }
+
+    GLint channels;
+    switch (target) {
     case GL_MAP1_INDEX:
     case GL_MAP1_TEXTURE_COORD_1:
-        return 1;
+        channels = 1;
+        break;
     case GL_MAP1_TEXTURE_COORD_2:
-        return 2;
+        channels = 2;
+        break;
     case GL_MAP1_NORMAL:
     case GL_MAP1_TEXTURE_COORD_3:
     case GL_MAP1_VERTEX_3:
-        return 3;
+        channels = 3;
+        break;
     case GL_MAP1_COLOR_4:
     case GL_MAP1_TEXTURE_COORD_4:
     case GL_MAP1_VERTEX_4:
-        return 4;
+        channels = 4;
+        break;
     default:
-        OS::DebugMessage("warning: %s: unknown GLenum 0x%04X\n", __FUNCTION__, pname);
-        return 1;
+        OS::DebugMessage("warning: %s: unknown GLenum 0x%04X\n", __FUNCTION__, target);
+        return 0;
     }
+
+    if (stride < channels) {
+        return 0;
+    }
+
+    return channels + stride * (order - 1);
 }
 
 #define __glMap1f_size __glMap1d_size
 
 static inline size_t
-__glMap2d_size(GLenum pname)
+__glMap2d_size(GLenum target, GLint ustride, GLint uorder, GLint vstride, GLint vorder)
 {
-    switch (pname) {
+    if (uorder < 1 || vorder < 1) {
+        return 0;
+    }
+
+    GLint channels;
+    switch (target) {
     case GL_MAP2_INDEX:
     case GL_MAP2_TEXTURE_COORD_1:
-        return 1;
+        channels = 1;
+        break;
     case GL_MAP2_TEXTURE_COORD_2:
-        return 2;
+        channels = 2;
+        break;
     case GL_MAP2_NORMAL:
     case GL_MAP2_TEXTURE_COORD_3:
     case GL_MAP2_VERTEX_3:
-        return 3;
+        channels = 3;
+        break;
     case GL_MAP2_COLOR_4:
     case GL_MAP2_TEXTURE_COORD_4:
     case GL_MAP2_VERTEX_4:
-        return 4;
+        channels = 4;
+        break;
     default:
-        OS::DebugMessage("warning: %s: unknown GLenum 0x%04X\n", __FUNCTION__, pname);
-        return 1;
+        OS::DebugMessage("warning: %s: unknown GLenum 0x%04X\n", __FUNCTION__, target);
+        return 0;
     }
+
+    if (ustride < channels || vstride < channels) {
+        return 0;
+    }
+
+    return channels + 
+           ustride * (uorder - 1) +
+           vstride * (vorder - 1);
 }
 
 #define __glMap2f_size __glMap2d_size