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