1#lang racket/base
2(require ffi/unsafe
3         ffi/cvector)
4
5(provide (all-defined-out))
6
7(define _float*
8  (make-ctype _float
9              (lambda (n)
10                (if (exact? n)
11                    (exact->inexact n)
12                    n))
13              #f))
14
15(define (make-gl-vector-type t)
16  (make-ctype _cvector
17              (lambda (sval)
18                (unless (cvector? sval)
19                  (raise-type-error 'Scheme->C "cvector" sval))
20                (unless (eq? (cvector-type sval) t)
21                  (error 'Scheme->C "wrong kind of cvector"))
22                sval)
23              #f))
24
25;; Beware of problems with these type definitions.
26;; They seem to be right for all currently supported
27;; platforms, but in principle they can differ.
28
29(define _gl-byte _int8)
30(define _gl-ubyte _uint8)
31(define _gl-short _int16)
32(define _gl-ushort _uint16)
33(define _gl-int _int)
34(define _gl-uint _uint)
35(define _gl-boolean (make-ctype _int8
36                                (lambda (x)
37                                  (if x 1 0))
38                                (lambda (x) (not (= x 0)))))
39(define _gl-sizei _int)
40(define _gl-enum _int)
41(define _gl-bitfield _uint)
42(define _gl-float _float*)
43(define _gl-double _double*)
44(define _gl-clampf _float*)
45(define _gl-clampd _double*)
46
47(define _gl-bytev (make-gl-vector-type _gl-byte))
48(define _gl-ubytev (make-gl-vector-type _gl-ubyte))
49(define _gl-shortv (make-gl-vector-type _gl-short))
50(define _gl-ushortv (make-gl-vector-type _gl-ushort))
51(define _gl-intv (make-gl-vector-type _gl-int))
52(define _gl-uintv (make-gl-vector-type _gl-uint))
53(define _gl-booleanv (make-gl-vector-type _gl-boolean))
54(define _gl-floatv (make-gl-vector-type _gl-float))
55(define _gl-doublev (make-gl-vector-type _gl-double))
56(define _gl-voidv _cvector)
57
58