surface: Add binding for SDL_ConvertSurfaceFormat.
authorDavid Thompson <dthompson2@worcester.edu>
Tue, 22 Dec 2015 14:00:20 +0000 (09:00 -0500)
committerDavid Thompson <dthompson2@worcester.edu>
Tue, 22 Dec 2015 14:00:20 +0000 (09:00 -0500)
* sdl2/bindings.scm: Add a ton of pixel format constants.
* sdl2/surface.scm: (symbol->sdl-pixel-format, convert-surface-format):
  New procedures.

sdl2/bindings.scm
sdl2/surface.scm

index 1672b0d..79fbf92 100644 (file)
@@ -847,6 +847,48 @@ RETURN-TYPE and accept arguments of ARG-TYPES."
 
 \f
 ;;;
+;;; Pixels
+;;;
+
+(define-public SDL_PIXELFORMAT_UNKNOWN     0)
+(define-public SDL_PIXELFORMAT_INDEX1LSB   286261504)
+(define-public SDL_PIXELFORMAT_INDEX1MSB   287310080)
+(define-public SDL_PIXELFORMAT_INDEX4LSB   303039488)
+(define-public SDL_PIXELFORMAT_INDEX4MSB   304088064)
+(define-public SDL_PIXELFORMAT_INDEX8      318769153)
+(define-public SDL_PIXELFORMAT_RGB332      336660481)
+(define-public SDL_PIXELFORMAT_RGB444      353504258)
+(define-public SDL_PIXELFORMAT_RGB555      353570562)
+(define-public SDL_PIXELFORMAT_BGR555      357764866)
+(define-public SDL_PIXELFORMAT_ARGB4444    355602434)
+(define-public SDL_PIXELFORMAT_RGBA4444    356651010)
+(define-public SDL_PIXELFORMAT_ABGR4444    359796738)
+(define-public SDL_PIXELFORMAT_BGRA4444    360845314)
+(define-public SDL_PIXELFORMAT_ARGB1555    355667970)
+(define-public SDL_PIXELFORMAT_RGBA5551    356782082)
+(define-public SDL_PIXELFORMAT_ABGR1555    359862274)
+(define-public SDL_PIXELFORMAT_BGRA5551    360976386)
+(define-public SDL_PIXELFORMAT_RGB565      353701890)
+(define-public SDL_PIXELFORMAT_BGR565      357896194)
+(define-public SDL_PIXELFORMAT_RGB24       386930691)
+(define-public SDL_PIXELFORMAT_BGR24       390076419)
+(define-public SDL_PIXELFORMAT_RGB888      370546692)
+(define-public SDL_PIXELFORMAT_RGBX8888    371595268)
+(define-public SDL_PIXELFORMAT_BGR888      374740996)
+(define-public SDL_PIXELFORMAT_BGRX8888    375789572)
+(define-public SDL_PIXELFORMAT_ARGB8888    372645892)
+(define-public SDL_PIXELFORMAT_RGBA8888    373694468)
+(define-public SDL_PIXELFORMAT_ABGR8888    376840196)
+(define-public SDL_PIXELFORMAT_BGRA8888    377888772)
+(define-public SDL_PIXELFORMAT_ARGB2101010 372711428)
+(define-public SDL_PIXELFORMAT_YV12        842094169)
+(define-public SDL_PIXELFORMAT_IYUV        1448433993)
+(define-public SDL_PIXELFORMAT_YUY2        844715353)
+(define-public SDL_PIXELFORMAT_UYVY        1498831189)
+(define-public SDL_PIXELFORMAT_YVYU        1431918169)
+
+\f
+;;;
 ;;; Surface
 ;;;
 
@@ -856,6 +898,9 @@ RETURN-TYPE and accept arguments of ARG-TYPES."
 (define-foreign sdl-load-bmp-rw
   '* "SDL_LoadBMP_RW" (list '* int))
 
+(define-foreign sdl-convert-surface-format
+  '* "SDL_ConvertSurfaceFormat" (list '* uint32 uint32))
+
 \f
 ;;;
 ;;; Audio
index 1537c58..98ddf70 100644 (file)
@@ -37,7 +37,9 @@
             surface-width
             surface-height
             surface-pitch
-            surface-pixels))
+            surface-pixels
+
+            convert-surface-format))
 
 (define-wrapped-pointer-type <surface>
   surface?
@@ -108,3 +110,89 @@ PROC."
                                        (native-endianness)
                                        %pointer-size))))
     (pointer->bytevector pixels (* height pitch))))
+
+(define (symbol->sdl-pixel-format sym)
+  (match sym
+    ('index1lsb   ffi:SDL_PIXELFORMAT_INDEX1LSB)
+    ('index1msb   ffi:SDL_PIXELFORMAT_INDEX1MSB)
+    ('index4lsb   ffi:SDL_PIXELFORMAT_INDEX4LSB)
+    ('index4msb   ffi:SDL_PIXELFORMAT_INDEX4MSB)
+    ('index8      ffi:SDL_PIXELFORMAT_INDEX8)
+    ('rgb332      ffi:SDL_PIXELFORMAT_RGB332)
+    ('rgb444      ffi:SDL_PIXELFORMAT_RGB444)
+    ('rgb555      ffi:SDL_PIXELFORMAT_RGB555)
+    ('bgr555      ffi:SDL_PIXELFORMAT_BGR555)
+    ('argb4444    ffi:SDL_PIXELFORMAT_ARGB4444)
+    ('rgba4444    ffi:SDL_PIXELFORMAT_RGBA4444)
+    ('abgr4444    ffi:SDL_PIXELFORMAT_ABGR4444)
+    ('bgra4444    ffi:SDL_PIXELFORMAT_BGRA4444)
+    ('argb1555    ffi:SDL_PIXELFORMAT_ARGB1555)
+    ('rgba5551    ffi:SDL_PIXELFORMAT_RGBA5551)
+    ('abgr1555    ffi:SDL_PIXELFORMAT_ABGR1555)
+    ('bgra5551    ffi:SDL_PIXELFORMAT_BGRA5551)
+    ('rgb565      ffi:SDL_PIXELFORMAT_RGB565)
+    ('bgr565      ffi:SDL_PIXELFORMAT_BGR565)
+    ('rgb24       ffi:SDL_PIXELFORMAT_RGB24)
+    ('bgr24       ffi:SDL_PIXELFORMAT_BGR24)
+    ('rgb888      ffi:SDL_PIXELFORMAT_RGB888)
+    ('rgbx8888    ffi:SDL_PIXELFORMAT_RGBX8888)
+    ('bgr888      ffi:SDL_PIXELFORMAT_BGR888)
+    ('bgrx8888    ffi:SDL_PIXELFORMAT_BGRX8888)
+    ('argb8888    ffi:SDL_PIXELFORMAT_ARGB8888)
+    ('rgba8888    ffi:SDL_PIXELFORMAT_RGBA8888)
+    ('abgr8888    ffi:SDL_PIXELFORMAT_ABGR8888)
+    ('bgra8888    ffi:SDL_PIXELFORMAT_BGRA8888)
+    ('argb2101010 ffi:SDL_PIXELFORMAT_ARGB2101010)
+    ('yv12        ffi:SDL_PIXELFORMAT_YV12)
+    ('iyuv        ffi:SDL_PIXELFORMAT_IYUV)
+    ('yuy2        ffi:SDL_PIXELFORMAT_YUY2)
+    ('uyvy        ffi:SDL_PIXELFORMAT_UYVY)
+    ('yvyu        ffi:SDL_PIXELFORMAT_YVYU)))
+
+(define (convert-surface-format surface format)
+  "Convert the pixels in SURFACE to FORMAT, a symbol representing a
+specific pixel format, and return a new surface object.
+
+Valid format types are:
+
+- index1lsb
+- index1msb
+- index4lsb
+- index4msb
+- index8
+- rgb332
+- rgb444
+- rgb555
+- bgr555
+- argb4444
+- rgba4444
+- abgr4444
+- bgra4444
+- argb1555
+- rgba5551
+- abgr1555
+- bgra5551
+- rgb565
+- bgr565
+- rgb24
+- bgr24
+- rgb888
+- rgbx8888
+- bgr888
+- bgrx8888
+- argb8888
+- rgba8888
+- abgr8888
+- bgra8888
+- argb2101010
+- yv12
+- iyuv
+- yuy2
+- uyvy
+- yvyu"
+  (let ((ptr (ffi:sdl-convert-surface-format (unwrap-surface surface)
+                                             (symbol->sdl-pixel-format format)
+                                             0)))
+    (if (null-pointer? ptr)
+        (sdl-error "convert-surface-format" "failed to convert surface format")
+        (wrap-surface surface))))