(import (chezscheme))
;; save some typing
(define-syntax library-types
(syntax-rules ()
[(_ (name type object) ...)
(begin
(begin
(define-ftype type object)
(define name (make-ftype-pointer type (foreign-alloc (ftype-sizeof type)))))
...)]))
(define-syntax library-entries
(syntax-rules ()
[(_ (name entry (parameters ...) type) ...)
(begin
(define name (foreign-procedure entry (parameters ...) type))
...)]))
;; bind sdl library
(load-shared-object "c:/lib/SDL2.dll")
(library-types
(window Window void*)
(renderer Renderer void*)
(event Event unsigned-32))
(library-entries
(sdl:start "SDL_Init" (unsigned-32) int)
(sdl:window "SDL_CreateWindowAndRenderer" (int int unsigned-32 (* void*) (* void*)) int)
(sdl:event "SDL_PollEvent" ((* Event)) int)
(sdl:color "SDL_SetRenderDrawColor" (Renderer unsigned-8 unsigned-8 unsigned-8 unsigned-8) int)
(sdl:clear "SDL_RenderClear" (Renderer) int)
(sdl:render "SDL_RenderPresent" (Renderer) void)
(sdl:%renderer "SDL_DestroyRenderer" (Renderer) void)
(sdl:%window "SDL_DestroyWindow" (Window) void)
(sdl:exit "SDL_Quit" () void))
;; render a blue texture
(sdl:start #x0020)
(sdl:window 320 240 #x0020 window renderer)
(let ([&renderer (ftype-ref Renderer () renderer)]
[&window (ftype-ref Window () window)])
(let loop ()
(sdl:event event)
(unless (= #x0100 (ftype-ref Event () event))
(sdl:color &renderer #x00 #x00 #xff #x00)
(sdl:clear &renderer)
(sdl:render &renderer)
(loop)))
(sdl:%renderer &renderer)
(sdl:%window &window))
(sdl:exit)