restore type hack for glGetString.xml typo
[clinton/guile-figl.git] / figl / gl / types.scm
index 00cf14e..1d14450 100644 (file)
 ;;; Code:
 
 (define-module (figl gl types)
-  #:use-module (system foreign)
-  #:re-export (void)
-  #:export (GLboolean
+  #:use-module (figl runtime)
+  #:use-module (rnrs bytevectors)
+  #:use-module ((system foreign) #:renamer (symbol-prefix-proc 'ffi:))
+  #:export (void
+            GLboolean
             GLbyte
             GLubyte
             GLchar
             GLfloat
             GLclampf
             GLdouble
-            GLclampd))
+            GLclampd
+
+            GLboolean-*
+            GLbyte-*
+            GLubyte-*
+            GLchar-*
+            GLshort-*
+            GLushort-*
+            GLint-*
+            GLuint-*
+            GLsizei-*
+            GLenum-*
+            GLfloat-*
+            GLclampf-*
+            GLdouble-*
+            GLclampd-*
+            GLvoid-*
+            GLvoid-**
+
+            const-GLboolean-*
+            const-GLbyte-*
+            const-GLubyte-*
+            const-GLubyte*
+            const-GLchar-*
+            const-GLchar-**
+            const-GLshort-*
+            const-GLushort-*
+            const-GLint-*
+            const-GLuint-*
+            const-GLsizei-*
+            const-GLenum-*
+            const-GLfloat-*
+            const-GLclampf-*
+            const-GLdouble-*
+            const-GLclampd-*
+            const-GLvoid-*
+            const-GLvoid-**
+            void-*))
 
 (define %ptr
-  (case (sizeof '*)
-    ((4) uint32)
-    ((8) uint64)
+  (case (ffi:sizeof '*)
+    ((4) ffi:uint32)
+    ((8) ffi:uint64)
     (else (error "unknown pointer size"))))
 
-(define GLboolean uint8)
-(define GLbyte int8)
-(define GLubyte uint8)
-(define GLchar int8)
-(define Glshort int16)
-(define GLushort uint16)
-(define GLint int32)
-(define GLuint uint32)
-(define GLsizei int32)
-(define GLenum uint32)
-(define GLintptr %ptr)
-(define GLsizeiptr %ptr)
-(define GLbitfield uint32)
-(define GLfloat float)
-(define GLclampf float)
-(define GLdouble double)
-(define GLclampd double)
+(define-simple-foreign-type void ffi:void)
+(define-simple-foreign-type GLboolean ffi:uint8)
+(define-simple-foreign-type GLbyte ffi:int8)
+(define-simple-foreign-type GLubyte ffi:uint8)
+(define-simple-foreign-type GLchar ffi:int8)
+(define-simple-foreign-type GLshort ffi:int16)
+(define-simple-foreign-type GLushort ffi:uint16)
+(define-simple-foreign-type GLint ffi:int32)
+(define-simple-foreign-type GLuint ffi:uint32)
+(define-simple-foreign-type GLsizei ffi:int32)
+(define-simple-foreign-type GLenum ffi:uint32)
+(define-simple-foreign-type GLintptr %ptr)
+(define-simple-foreign-type GLsizeiptr %ptr)
+(define-simple-foreign-type GLbitfield ffi:uint32)
+(define-simple-foreign-type GLfloat ffi:float)
+(define-simple-foreign-type GLclampf ffi:float)
+(define-simple-foreign-type GLdouble ffi:double)
+(define-simple-foreign-type GLclampd ffi:double)
+(define-simple-foreign-type GLvoid-* '*)
+(define-simple-foreign-type void-* '*)
+(define-simple-foreign-type const-GLvoid-* '*)
+
+(define (array->pointer x)
+  (lambda (x)
+    (if x
+        (ffi:bytevector->pointer x)
+        ffi:%null-pointer)))
+
+(define-syntax define-array-foreign-type
+  (syntax-rules ()
+    ((_ name element-type)
+     (define-foreign-type name '*
+       array->pointer
+       (lambda (x) x)))))
+
+(define-array-foreign-type GLboolean-* GLboolean)
+(define-array-foreign-type GLbyte-* GLbyte)
+(define-array-foreign-type GLubyte-* GLubyte)
+(define-array-foreign-type GLchar-* GLchar)
+(define-array-foreign-type GLshort-* GLshort)
+(define-array-foreign-type GLushort-* GLushort)
+(define-array-foreign-type GLint-* GLint)
+(define-array-foreign-type GLuint-* GLuint)
+(define-array-foreign-type GLsizei-* GLsizei)
+(define-array-foreign-type GLenum-* GLenum)
+(define-array-foreign-type GLfloat-* GLfloat)
+(define-array-foreign-type GLclampf-* GLclampf)
+(define-array-foreign-type GLdouble-* GLdouble)
+(define-array-foreign-type GLclampd-* GLclampd)
+
+(define-array-foreign-type const-GLboolean-* GLboolean)
+(define-array-foreign-type const-GLbyte-* GLbyte)
+(define-array-foreign-type const-GLubyte-* GLubyte)
+(define-array-foreign-type const-GLshort-* GLshort)
+(define-array-foreign-type const-GLushort-* GLushort)
+(define-array-foreign-type const-GLint-* GLint)
+(define-array-foreign-type const-GLuint-* GLuint)
+(define-array-foreign-type const-GLsizei-* GLsizei)
+(define-array-foreign-type const-GLenum-* GLenum)
+(define-array-foreign-type const-GLfloat-* GLfloat)
+(define-array-foreign-type const-GLclampf-* GLclampf)
+(define-array-foreign-type const-GLdouble-* GLdouble)
+(define-array-foreign-type const-GLclampd-* GLclampd)
+(define-array-foreign-type const-GLvoid-* GLvoid)
+
+(define-foreign-type const-GLchar-* '*
+  ffi:string->pointer
+  ffi:pointer->string)
+
+;; Functions with these types will need special help.
+(define-simple-foreign-type GLvoid-** '*)
+(define-simple-foreign-type const-GLchar-** '*)
+(define-simple-foreign-type const-GLvoid-** '*)
+
+;; TODO: Hacked for a typo in glGetString.xml.
+(define-array-foreign-type const-GLubyte* GLubyte)