use ptrdiff_t if available, otherwise keep compat with released Guile
[clinton/guile-figl.git] / figl / gl / types.scm
CommitLineData
37a0c0f3
DH
1;;; figl
2;;; Copyright (C) 2013 Daniel Hartwig <mandyke@gmail.com>
3;;;
4;;; Figl is free software: you can redistribute it and/or modify it
5;;; under the terms of the GNU Lesser General Public License as
6;;; published by the Free Software Foundation, either version 3 of the
7;;; License, or (at your option) any later version.
8;;;
9;;; Figl is distributed in the hope that it will be useful, but WITHOUT
10;;; ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
11;;; or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General
12;;; Public License for more details.
13;;;
14;;; You should have received a copy of the GNU Lesser General Public
15;;; License along with this program. If not, see
16;;; <http://www.gnu.org/licenses/>.
17
18;;; Commentary:
19;;
20;; Mappings from OpenGL to FFI types.
21;;
22;;; Code:
23
7ec693ed 24(define-module (figl gl types)
93f72ad8 25 #:use-module (figl runtime)
e40b2a3d 26 #:use-module (rnrs bytevectors)
93f72ad8
AW
27 #:use-module ((system foreign) #:renamer (symbol-prefix-proc 'ffi:))
28 #:export (void
29 GLboolean
37a0c0f3
DH
30 GLbyte
31 GLubyte
32 GLchar
33 GLshort
34 GLushort
35 GLint
36 GLuint
37 GLsizei
38 GLenum
39 GLintptr
40 GLsizeiptr
41 GLbitfield
42 GLfloat
43 GLclampf
44 GLdouble
00239761
AW
45 GLclampd
46
47 GLboolean-*
78aa45b9
DH
48 GLbyte-*
49 GLubyte-*
00239761 50 GLchar-*
78aa45b9
DH
51 GLshort-*
52 GLushort-*
00239761 53 GLint-*
00239761 54 GLuint-*
78aa45b9
DH
55 GLsizei-*
56 GLenum-*
57 GLfloat-*
58 GLclampf-*
59 GLdouble-*
60 GLclampd-*
00239761 61 GLvoid-*
b002944d 62 GLvoid-**
78aa45b9
DH
63
64 const-GLboolean-*
65 const-GLbyte-*
66 const-GLubyte-*
f681b980 67 const-GLubyte*
00239761
AW
68 const-GLchar-*
69 const-GLchar-**
78aa45b9
DH
70 const-GLshort-*
71 const-GLushort-*
00239761 72 const-GLint-*
00239761 73 const-GLuint-*
78aa45b9
DH
74 const-GLsizei-*
75 const-GLenum-*
76 const-GLfloat-*
77 const-GLclampf-*
78 const-GLdouble-*
79 const-GLclampd-*
00239761
AW
80 const-GLvoid-*
81 const-GLvoid-**
82 void-*))
37a0c0f3 83
737b0fe3
DH
84;; TODO: Taken from Mesa headers for some types below. Not clear what
85;; these types are on other platforms.
92eab582
AW
86(define %ptr
87 (cond
88 ((defined? 'ffi:ptrdiff_t) ffi:ptrdiff_t)
89 ((= (ffi:sizeof '*) 8) ffi:int64)
90 ((= (ffi:sizeof '*) 4) ffi:int32)
91 (else (error "unknown pointer size" (ffi:sizeof '*)))))
37a0c0f3 92
93f72ad8 93(define-simple-foreign-type void ffi:void)
93f72ad8
AW
94(define-simple-foreign-type GLbyte ffi:int8)
95(define-simple-foreign-type GLubyte ffi:uint8)
96(define-simple-foreign-type GLchar ffi:int8)
78aa45b9 97(define-simple-foreign-type GLshort ffi:int16)
93f72ad8
AW
98(define-simple-foreign-type GLushort ffi:uint16)
99(define-simple-foreign-type GLint ffi:int32)
100(define-simple-foreign-type GLuint ffi:uint32)
101(define-simple-foreign-type GLsizei ffi:int32)
102(define-simple-foreign-type GLenum ffi:uint32)
103(define-simple-foreign-type GLintptr %ptr)
104(define-simple-foreign-type GLsizeiptr %ptr)
105(define-simple-foreign-type GLbitfield ffi:uint32)
106(define-simple-foreign-type GLfloat ffi:float)
107(define-simple-foreign-type GLclampf ffi:float)
108(define-simple-foreign-type GLdouble ffi:double)
109(define-simple-foreign-type GLclampd ffi:double)
93f72ad8 110(define-simple-foreign-type GLvoid-* '*)
e40b2a3d 111(define-simple-foreign-type void-* '*)
93f72ad8 112(define-simple-foreign-type const-GLvoid-* '*)
e40b2a3d 113
81cf639e
DH
114(define GL_FALSE 0)
115(define GL_TRUE 1)
116
117(define-foreign-type GLboolean ffi:uint8
118 (lambda (x) (if x GL_TRUE GL_FALSE))
119 (lambda (x) (eqv? x GL_TRUE)))
120
f6fb0de5
DH
121(define (coerce-array-pointer x)
122 (cond
123 ((ffi:pointer? x)
124 x)
125 ((bytevector? x)
126 (ffi:bytevector->pointer x))
127 ;; TODO: (typed-array? x element-type)
128 ((not x)
129 ffi:%null-pointer)
130 (else
131 (error "unhandled array-pointer type" x))))
c9820ad6 132
e40b2a3d
AW
133(define-syntax define-array-foreign-type
134 (syntax-rules ()
135 ((_ name element-type)
136 (define-foreign-type name '*
f6fb0de5 137 coerce-array-pointer
e40b2a3d
AW
138 (lambda (x) x)))))
139
140(define-array-foreign-type GLboolean-* GLboolean)
78aa45b9
DH
141(define-array-foreign-type GLbyte-* GLbyte)
142(define-array-foreign-type GLubyte-* GLubyte)
e40b2a3d 143(define-array-foreign-type GLchar-* GLchar)
78aa45b9
DH
144(define-array-foreign-type GLshort-* GLshort)
145(define-array-foreign-type GLushort-* GLushort)
e40b2a3d 146(define-array-foreign-type GLint-* GLint)
e40b2a3d 147(define-array-foreign-type GLuint-* GLuint)
78aa45b9
DH
148(define-array-foreign-type GLsizei-* GLsizei)
149(define-array-foreign-type GLenum-* GLenum)
150(define-array-foreign-type GLfloat-* GLfloat)
151(define-array-foreign-type GLclampf-* GLclampf)
152(define-array-foreign-type GLdouble-* GLdouble)
153(define-array-foreign-type GLclampd-* GLclampd)
e40b2a3d 154
78aa45b9
DH
155(define-array-foreign-type const-GLboolean-* GLboolean)
156(define-array-foreign-type const-GLbyte-* GLbyte)
e40b2a3d 157(define-array-foreign-type const-GLubyte-* GLubyte)
78aa45b9
DH
158(define-array-foreign-type const-GLshort-* GLshort)
159(define-array-foreign-type const-GLushort-* GLushort)
160(define-array-foreign-type const-GLint-* GLint)
e40b2a3d 161(define-array-foreign-type const-GLuint-* GLuint)
78aa45b9
DH
162(define-array-foreign-type const-GLsizei-* GLsizei)
163(define-array-foreign-type const-GLenum-* GLenum)
164(define-array-foreign-type const-GLfloat-* GLfloat)
165(define-array-foreign-type const-GLclampf-* GLclampf)
166(define-array-foreign-type const-GLdouble-* GLdouble)
167(define-array-foreign-type const-GLclampd-* GLclampd)
e40b2a3d
AW
168(define-array-foreign-type const-GLvoid-* GLvoid)
169
170(define-foreign-type const-GLchar-* '*
171 ffi:string->pointer
172 ffi:pointer->string)
173
174;; Functions with these types will need special help.
b002944d 175(define-simple-foreign-type GLvoid-** '*)
e40b2a3d 176(define-simple-foreign-type const-GLchar-** '*)
93f72ad8 177(define-simple-foreign-type const-GLvoid-** '*)
f681b980
DH
178
179;; TODO: Hacked for a typo in glGetString.xml.
180(define-array-foreign-type const-GLubyte* GLubyte)