surface: Add SDL_CreateRGBSurfaceFrom binding.
authorDavid Thompson <dthompson2@worcester.edu>
Sat, 17 Dec 2016 02:49:11 +0000 (21:49 -0500)
committerDavid Thompson <dthompson2@worcester.edu>
Sat, 17 Dec 2016 02:52:36 +0000 (21:52 -0500)
sdl2/bindings.scm
sdl2/surface.scm

index ceabf06..e3167a0 100644 (file)
@@ -903,6 +903,10 @@ RETURN-TYPE and accept arguments of ARG-TYPES."
   '* "SDL_CreateRGBSurface"
   (list uint32 int int int uint32 uint32 uint32 uint32))
 
+(define-foreign sdl-create-rgb-surface-from
+  '* "SDL_CreateRGBSurfaceFrom"
+  (list '* int int int int uint32 uint32 uint32 uint32))
+
 (define-foreign sdl-free-surface
   void "SDL_FreeSurface" '(*))
 
index 919c6c3..8017d78 100644 (file)
@@ -31,6 +31,7 @@
   #:use-module ((sdl2 bindings) #:prefix ffi:)
   #:use-module (sdl2)
   #:export (make-rgb-surface
+            bytevector->surface
             surface?
             delete-surface!
             call-with-surface
@@ -65,6 +66,25 @@ DEPTH bits per pixel."
                                    #x00ff0000
                                    #xff000000))))
 
+(define (bytevector->surface bv width height depth pitch)
+  "Convert BV, a bytevector of pixel data with dimenions WIDTHxHEIGHT,
+to an SDL surface.  Each pixel is DEPTH bits in size, and each row of
+pixels is PITCH bytes in size."
+  (wrap-surface
+   (if (eq? (native-endianness) 'big)
+       (ffi:sdl-create-rgb-surface-from (bytevector->pointer bv)
+                                        width height depth pitch
+                                        #xff000000
+                                        #x00ff0000
+                                        #x0000ff00
+                                        #x000000ff)
+       (ffi:sdl-create-rgb-surface-from (bytevector->pointer bv)
+                                        width height depth pitch
+                                        #x000000ff
+                                        #x0000ff00
+                                        #x00ff0000
+                                        #xff000000))))
+
 (define (delete-surface! surface)
   "Free the memory used by SURFACE."
   (ffi:sdl-free-surface (unwrap-surface surface)))