From cc099b061c9466f5d0d3220c71d1c43f13b139d2 Mon Sep 17 00:00:00 2001 From: David Thompson Date: Wed, 16 Dec 2015 23:15:21 -0500 Subject: Add SDL2_image bindings. * sdl2/bindings/image.scm: New file. * sdl2/image.scm: New file. * Makefile.am (SOURCES): Add them. --- Makefile.am | 8 +++++++ sdl2/bindings/image.scm | 56 +++++++++++++++++++++++++++++++++++++++++++++++++ sdl2/image.scm | 51 ++++++++++++++++++++++++++++++++++++++++++++ 3 files changed, 115 insertions(+) create mode 100644 sdl2/bindings/image.scm create mode 100644 sdl2/image.scm diff --git a/Makefile.am b/Makefile.am index 80512fc..489c99e 100644 --- a/Makefile.am +++ b/Makefile.am @@ -49,6 +49,14 @@ SOURCES = \ sdl2/video.scm \ sdl2/events.scm +if WITH_LIBSDL2_IMAGE + +SOURCES += \ + sdl2/bindings/image.scm \ + sdl2/image.scm + +endif + EXTRA_DIST += \ pre-inst-env.in \ README \ diff --git a/sdl2/bindings/image.scm b/sdl2/bindings/image.scm new file mode 100644 index 0000000..cfdb31d --- /dev/null +++ b/sdl2/bindings/image.scm @@ -0,0 +1,56 @@ +;;; guile-sdl2 --- FFI bindings for SDL2 +;;; Copyright © 2015 David Thompson +;;; +;;; This file is part of guile-sdl2. +;;; +;;; Guile-sdl2 is free software; you can redistribute it and/or modify +;;; it under the terms of the GNU Lesser General Public License as +;;; published by the Free Software Foundation; either version 3 of the +;;; License, or (at your option) any later version. +;;; +;;; Guile-sdl2 is distributed in the hope that it will be useful, but +;;; WITHOUT ANY WARRANTY; without even the implied warranty of +;;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +;;; General Public License for more details. +;;; +;;; You should have received a copy of the GNU Lesser General Public +;;; License along with guile-sdl2. If not, see +;;; . + +;;; Commentary: +;; +;; Low-level FFI bindings for SDL2_image. +;; +;;; Code: + +(define-module (sdl2 bindings image) + #:use-module (system foreign) + #:use-module (sdl2 config)) + +(define sdl-image-func + (let ((lib (dynamic-link %libsdl2-image))) + (lambda (return-type function-name arg-types) + "Return a procedure for the foreign function FUNCTION-NAME in +the SDL2_image shared library. That function must return a value of +RETURN-TYPE and accept arguments of ARG-TYPES." + (pointer->procedure return-type + (dynamic-func function-name lib) + arg-types)))) + +(define-syntax-rule (define-foreign name return-type func-name arg-types) + (define-public name + (sdl-image-func return-type func-name arg-types))) + +(define-public IMG_INIT_JPG #x00000001) +(define-public IMG_INIT_PNG #x00000002) +(define-public IMG_INIT_TIF #x00000004) +(define-public IMG_INIT_WEBP #x00000008) + +(define-foreign img-init + int "IMG_Init" (list int)) + +(define-foreign img-quit + void "IMG_Quit" '()) + +(define-foreign img-load + '* "IMG_Load" '(*)) diff --git a/sdl2/image.scm b/sdl2/image.scm new file mode 100644 index 0000000..e741a04 --- /dev/null +++ b/sdl2/image.scm @@ -0,0 +1,51 @@ +;;; guile-sdl2 --- FFI bindings for SDL2 +;;; Copyright © 2015 David Thompson +;;; +;;; This file is part of guile-sdl2. +;;; +;;; Guile-sdl2 is free software; you can redistribute it and/or modify +;;; it under the terms of the GNU Lesser General Public License as +;;; published by the Free Software Foundation; either version 3 of the +;;; License, or (at your option) any later version. +;;; +;;; Guile-sdl2 is distributed in the hope that it will be useful, but +;;; WITHOUT ANY WARRANTY; without even the implied warranty of +;;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +;;; General Public License for more details. +;;; +;;; You should have received a copy of the GNU Lesser General Public +;;; License along with guile-sdl2. If not, see +;;; . + +;;; Commentary: +;; +;; Image loading. +;; +;;; Code: + +(define-module (sdl2 image) + #:use-module (system foreign) + #:use-module (sdl2) + #:use-module ((sdl2 bindings image) #:prefix ffi:) + #:export (image-init + image-quit + load-image)) + +(define (image-init) + "Initialize dynamically loaded image libraries." + (ffi:img-init (logior ffi:IMG_INIT_JPG + ffi:IMG_INIT_PNG + ffi:IMG_INIT_TIF + ffi:IMG_INIT_WEBP)) + *unspecified*) + +(define (image-quit) + "Clean up dynamically loaded image libraries." + (ffi:img-quit)) + +(define (load-image file) + "Load the image in FILE and return an SDL surface." + (let ((ptr (ffi:img-load (string->pointer file)))) + (if (null-pointer? ptr) + (sdl-error "load-image" "failed to load image: ~a" file) + ((@@ (sdl2 surface) wrap-surface) ptr)))) -- cgit v1.2.3