(library (linux libgd) (export gd-image-create gd-image-destroy gd-image-color-allocate gd-image-line gd-image-rectangle gd-image-png-ptr gd-free) (import (rnrs) (ffi)) (define libgd-name "libgd.so.2") (define libgd (load-shared-object libgd-name)) (define gd-image-create (c-function libgd libgd-name void* gdImageCreate (int int))) (define gd-image-destroy (c-function libgd libgd-name void gdImageDestroy (void*))) (define gd-image-color-allocate (c-function libgd libgd-name int gdImageColorAllocate (void* int int int))) (define gd-image-rectangle (c-function libgd libgd-name void gdImageRectangle (void* int int int int int))) (define gd-image-line (c-function libgd libgd-name void gdImageLine (void* int int int int int))) (define gd-image-png-ptr (c-function libgd libgd-name void* gdImagePngPtr (void* byte*))) (define gd-free (c-function libgd libgd-name void gdFree (void*))) ) (import (ffi) (linux libgd)) (let ((im (gd-image-create 100 100))) (gd-image-color-allocate im #xff #xff #xff) ; background color (let ((c (gd-image-color-allocate im #xff #x00 #x00))) (gd-image-rectangle im 20 20 80 80 c) (gd-image-line im 20 80 80 20 c)) (let* ((bsize (make-bytevector sizeof:int)) (ptr (gd-image-png-ptr im bsize)) (size (bytevector-c-int-ref bsize 0)) (bvector (make-bytevector-mapping ptr size))) (let ((oport (open-file-output-port "square.png"))) (put-bytevector oport bvector) (close-port oport)) (gd-free ptr) ) (gd-image-destroy im) )