Initial commit. Basic IL bindings and a couple of ILUT ones.
authorJulian Squires <julian@cipht.net>
Tue, 28 Oct 2008 23:29:30 +0000 (28 19:29 -0400)
committerJulian Squires <julian@cipht.net>
Tue, 28 Oct 2008 23:29:30 +0000 (28 19:29 -0400)
cl-devil.asd [new file with mode: 0644]
il.lisp [new file with mode: 0644]
ilut.lisp [new file with mode: 0644]
package.lisp [new file with mode: 0644]
utilities.lisp [new file with mode: 0644]

diff --git a/cl-devil.asd b/cl-devil.asd
new file mode 100644 (file)
index 0000000..35fb32f
--- /dev/null
@@ -0,0 +1,15 @@
+;;;; -*- Lisp -*-
+;;;; cl-devil -- DevIL binding for CL.  See README for licensing information.
+
+(defpackage #:cl-devil-system (:use #:cl #:asdf))
+(in-package #:cl-devil-system)
+
+(defsystem cl-devil
+    :depends-on (:cffi)
+    :components
+    ((:file "package")
+     (:file "il" :depends-on ("package"))
+     #+(or)(:file "ilu" :depends-on ("package" "il"))
+     #+(or)(:file "ilut" :depends-on ("package" "ilu"))
+     (:file "utilities" :depends-on ("package" "il"))))
+
diff --git a/il.lisp b/il.lisp
new file mode 100644 (file)
index 0000000..c93f76c
--- /dev/null
+++ b/il.lisp
@@ -0,0 +1,155 @@
+;;;; cl-devil -- DevIL binding for CL.  See README for licensing information.
+
+(in-package :il)
+
+(define-foreign-library il
+  (:unix (:or "libIL" "libIL.so.1"))
+  (t (:default "libIL")))
+(use-foreign-library il)
+
+(defctype handle :pointer)
+(defcenum image-type
+  (:unknown #x0000)
+  (:bmp #x0420)
+  (:cut #x0421)
+  (:doom #x0422)
+  (:doom-flat #x0423)
+  (:ico #x0424)
+  (:jpg #x0425)
+  (:jfif #x0425)
+  (:lbm #x0426)
+  (:pcd #x0427)
+  (:pcx #x0428)
+  (:pic #x0429)
+  (:png #x042A)
+  (:pnm #x042B)
+  (:sgi #x042C)
+  (:tga #x042D)
+  (:tif #x042E)
+  (:chead #x042F)
+  (:raw #x0430)
+  (:mdl #x0431)
+  (:wal #x0432)
+  (:lif #x0434)
+  (:mng #x0435)
+  (:jng #x0435)
+  (:gif #x0436)
+  (:dds #x0437)
+  (:dcx #x0438)
+  (:psd #x0439)
+  (:exif #x043A)
+  (:psp #x043B)
+  (:pix #x043C)
+  (:pxr #x043D)
+  (:xpm #x043E)
+  (:hdr #x043F)
+  (:jasc-pal #x0475))
+
+(defcenum data-format
+  (:colour-index #x1900)
+  (:color-index #x1900)
+  (:rgb #x1907)
+  (:rgba #x1908)
+  (:bgr #x80E0)
+  (:bgra #x80E1)
+  (:luminance #x1909)
+  (:luminance-alpha #x190A))
+
+(defcenum data-type
+  (:byte #x1400)
+  (:unsigned-byte #x1401)
+  (:short #x1402)
+  (:unsigned-short #x1403)
+  (:int #x1404)
+  (:unsigned-int #x1405)
+  (:float #x1406)
+  (:double #x140A))
+
+(defcenum error
+  (:no-error #x0000)
+  (:invalid-enum #x0501)
+  (:out-of-memory #x0502)
+  (:format-not-supported #x0503)
+  (:internal-error #x0504)
+  (:invalid-value #x0505)
+  (:illegal-operation #x0506)
+  (:illegal-file-value #x0507)
+  (:invalid-file-header #x0508)
+  (:invalid-param #x0509)
+  (:could-not-open-file #x050A)
+  (:invalid-extension #x050B)
+  (:file-already-exists #x050C)
+  (:out-format-same #x050D)
+  (:stack-overflow #x050E)
+  (:stack-underflow #x050F)
+  (:invalid-conversion #x0510)
+  (:bad-dimensions #x0511)
+  (:file-read-error #x0512)
+  (:file-write-error #x0512)
+  (:lib-gif-error #x05E1)
+  (:lib-jpeg-error #x05E2)
+  (:lib-png-error #x05E3)
+  (:lib-tiff-error #x05E4)
+  (:lib-mng-error #x05E5)
+  (:unknown-error #x05FF))
+                        
+(defcenum mode                          ; there are some awfully
+  (:version-num #x0DE2)                 ; non-descript names in
+  (:image-width #x0DE4)                 ; DevIL...
+  (:image-height #x0DE5)
+  (:image-depth #x0DE6)
+  (:image-size-of-data #x0DE7)
+  (:image-bpp #x0DE8)
+  (:image-bytes-per-pixel #x0DE8)
+  (:image-bits-per-pixel #x0DE9)
+  (:image-format #x0DEA)
+  (:image-type #x0DEB)
+  (:palette-type #x0DEC)
+  (:palette-size #x0DED)
+  (:palette-bpp #x0DEE)
+  (:palette-num-cols #x0DEF)
+  (:palette-base-type #x0DF0)
+  (:num-images #x0DF1)
+  (:num-mipmaps #x0DF2)
+  (:num-layers #x0DF3)
+  (:active-image #x0DF4)
+  (:active-mipmap #x0DF5)
+  (:active-layer #x0DF6)
+  (:cur-image #x0DF7)
+  (:image-duration #x0DF8)
+  (:image-planesize #x0DF9)
+  (:image-bpc #x0DFA)
+  (:image-offx #x0DFB)
+  (:image-offy #x0DFC)
+  (:image-cubeflags #x0DFD)
+  (:image-origin #x0DFE)
+  (:image-channels #x0DFF))
+
+
+(defcfun ("ilInit" init) :void)
+(defcfun ("ilShutDown" shutdown) :void)
+(defcfun ("ilGenImages" gen-images) :void (num :int) (images :pointer))
+(defcfun ("ilBindImage" bind-image) :void (image :int))
+(defcfun ("ilDeleteImages" delete-images) :void (num :int) (images :pointer))
+(defcfun ("ilLoadImage" load-image) :boolean (file-name :string))
+(defcfun ("ilLoad" load) :boolean (type image-type) (file-name :string))
+(defcfun ("ilLoadF" load-f) :boolean (type image-type) (file handle))
+(defcfun ("ilLoadL" load-l) :boolean (type image-type) (lump :pointer) (size :uint))
+(defcfun ("ilSaveImage" save-image) :boolean (file-name :string))
+(defcfun ("ilSave" save) :boolean (type image-type) (file-name :string))
+(defcfun ("ilSaveF" save-f) :boolean (type image-type) (file handle))
+(defcfun ("ilSaveL" save-l) :boolean (type image-type) (lump :pointer) (size :uint))
+(defcfun ("ilTexImage" tex-image) :boolean
+  (width :uint) (height :uint) (depth :uint) (bpp :uint8) (format data-format) (type data-type) (data :pointer))
+(defcfun ("ilGetData" get-data) :pointer)
+(defcfun ("ilCopyPixels" copy-pixels) :uint
+  (x-offset :uint) (y-offset :uint) (z-offset :uint) (width :uint) (height :uint) (depth :uint) (format data-format) (type data-type) (data :pointer))
+(defcfun ("ilSetData" set-data) :pointer)
+(defcfun ("ilSetPixels" set-pixels) :uint
+  (x-offset :uint) (y-offset :uint) (z-offset :uint) (width :uint) (height :uint) (depth :uint) (format data-format) (type data-type) (data :pointer))
+(defcfun ("ilCopyImage" copy-image) :boolean (source :uint))
+(defcfun ("ilOverlayImage" overlay-image) :boolean (source :uint) (x-coord :int) (y-coord :int) (z-coord :int))
+(defcfun ("ilBlit" blit) :boolean (source :uint) (dest-x :int) (dest-y :int) (dest-z :int) (src-x :int) (src-y :int) (src-z :int) (width :uint) (height :uint) (depth :uint))
+(defcfun ("ilGetError" get-error) error)
+
+(defcfun ("ilGetInteger" get-integer) :uint (mode mode))
\ No newline at end of file
diff --git a/ilut.lisp b/ilut.lisp
new file mode 100644 (file)
index 0000000..0a28a02
--- /dev/null
+++ b/ilut.lisp
@@ -0,0 +1,52 @@
+;;;; cl-devil -- DevIL binding for CL.  See README for licensing information.
+
+(in-package :ilut)
+
+(define-foreign-library ilut
+  (:unix (:or "libILUT" "libILUT.so.1"))
+  (t (:default "libILUT")))
+(use-foreign-library ilut)
+
+(defcenum state-definition
+  (:palette-mode #x0600)
+  (:opengl-conv #x0610)
+  (:d3d-miplevels #x0620)
+  (:maxtex-width #x0630)
+  (:maxtex-height #x0631)
+  (:maxtex-depth #x0632)
+  (:gl-use-s3tc #x0634)
+  (:d3d-use-dxtc #x0634)
+  (:gl-gen-s3tc #x0635)
+  (:d3d-gen-dxtc #x0635)
+  (:s3tc-format #x0705)
+  (:dxtc-format #x0705)
+  (:d3d-pool #x0706)
+  (:d3d-alpha-key-color #x0707)
+  (:d3d-alpha-key-colour #x0707))
+
+(defcenum renderer
+  (:opengl 0)
+  (:allegro 1)
+  (:win32 2)
+  (:direct3d8 3)
+  (:direct3d9 4))
+
+(defcfun ("ilutRenderer" renderer) :boolean (renderer renderer))
+(defcfun ("ilutEnable" enable) :boolean (state state-definition))
+(defcfun ("ilutDisable" disable) :boolean (state state-definition))
+(defcfun ("ilutGetBoolean" get-boolean) :boolean (state state-definition))
+;;; OpenGL
+(defcfun ("ilutGLBindTexImage" gl-bind-tex-image) :uint)
+(defcfun ("ilutGLBindMipmaps" gl-bind-mipmaps) :uint)
+(defcfun ("ilutGLBuildMipmaps" gl-build-mipmaps) :boolean)
+(defcfun ("ilutGLLoadImage" gl-load-image) :uint (file-name :string))
+(defcfun ("ilutGLScreen" gl-screen) :boolean)
+(defcfun ("ilutGLScreenie" gl-screenie) :boolean)
+(defcfun ("ilutGLSaveImage" gl-save-image) :boolean (file-name :string) (tex-id :uint))
+(defcfun ("ilutGLSetTex" gl-set-tex) :boolean (tex-id :uint))
+(defcfun ("ilutGLTexImage" gl-tex-image) :boolean (level :uint))
+(defcfun ("ilutGLSubTex" gl-sub-tex) :boolean (tex-id :uint) (x-offset :uint) (y-offset :uint))
+;;; SDL
+(defcfun ("ilutConvertToSDLSurface" convert-to-sdl-surface) :pointer (flags :uint))
+(defcfun ("ilutSDLSurfaceLoadImage" sdl-surface-load-image) :pointer (file-name :string))
+(defcfun ("ilutSDLSurfaceFromBitmap" sdl-surface-from-bitmap) :boolean (surface :pointer))
diff --git a/package.lisp b/package.lisp
new file mode 100644 (file)
index 0000000..81d663b
--- /dev/null
@@ -0,0 +1,54 @@
+
+(defpackage #:cl-devil
+  (:nicknames #:il)
+  (:use #:cl #:cffi :anaphora)
+  (:shadow #:load #:error)
+  (:export
+   #:with-images
+   ;; bindings
+   #:BIND-IMAGE
+   #:BLIT
+   #:COPY-IMAGE
+   #:COPY-PIXELS
+   #:DELETE-IMAGES
+   #:GEN-IMAGES
+   #:GET-DATA
+   #:GET-ERROR
+   #:GET-INTEGER
+   #:INIT
+   #:LOAD
+   #:LOAD-F
+   #:LOAD-IMAGE
+   #:LOAD-L
+   #:OVERLAY-IMAGE
+   #:SAVE
+   #:SAVE-F
+   #:SAVE-IMAGE
+   #:SAVE-L
+   #:SET-DATA
+   #:SET-PIXELS
+   #:SHUTDOWN
+   #:TEX-IMAGE
+   ))
+
+(defpackage #:ilut
+  (:use #:cl #:cffi)
+  (:export
+   #:CONVERT-TO-SDL-SURFACE
+   #:DISABLE
+   #:ENABLE
+   #:GET-BOOLEAN
+   #:GL-BIND-MIPMAPS
+   #:GL-BIND-TEX-IMAGE
+   #:GL-BUILD-MIPMAPS
+   #:GL-LOAD-IMAGE
+   #:GL-SAVE-IMAGE
+   #:GL-SCREEN
+   #:GL-SCREENIE
+   #:GL-SET-TEX
+   #:GL-SUB-TEX
+   #:GL-TEX-IMAGE
+   #:RENDERER
+   #:SDL-SURFACE-FROM-BITMAP
+   #:SDL-SURFACE-LOAD-IMAGE
+   ))
diff --git a/utilities.lisp b/utilities.lisp
new file mode 100644 (file)
index 0000000..c89890e
--- /dev/null
@@ -0,0 +1,29 @@
+
+(in-package :cl-devil)
+
+(defun w-i-args-helper (args)
+  (when args
+    `((bind-image it)
+      ,(cons
+        (cond ((= 1 (length args)) 'il:load-image)
+              ((= 3 (length args)) 'il:load-l)
+              ((stringp (second args)) 'il:load)
+              (t 'il:load-f))
+        args))))
+
+(defmacro with-images ((&rest images) &body body)
+  "Generates an IL image for each of IMAGES, binding and loading if a parameter is supplied.  BODY is executed, and the images are freed thereafter."
+  (let ((ids (gensym))
+        (count (length images)))
+    `(cffi:with-foreign-object (,ids :uint ,count)
+       (il:gen-images ,count ,ids)
+       (unwind-protect
+            (let (,@(loop for x in images
+                       for (var . args) = (if (listp x) x (list x))
+                       for i from 0
+                       collect `(,var (anaphora:aprog1 (cffi:mem-ref ,ids :uint ,i)
+                                        ,@(w-i-args-helper args)))))
+              ,@body)
+         (il:delete-images ,count ,ids)))))
+
+(il:with-images (urp arp (exit "/home/julian/exit.pcx")) (format t "~&~A ~A ~A" urp arp exit))
\ No newline at end of file