moshで絵を描く
というわけで、moshのFFIにdoubleが追加されたのでcairoが使えるようになった。
もっとも、現状ではIA32のみのサポートなので、このために全部の依存関係を手でビルドしたが。。
他の問題として、
- FFI testがconfigureのHOST(やCFLAGS)を尊重しないのでクロスコンパイル時にFFIのテストが通らない
- double引数に対して正確数を渡せない。下のサンプルで1.0とかいちいち指定しているのはこのため。
以下↑の画像を生成するためのコード。
(import (rnrs) (mosh ffi)) (let* ((libcairo (open-shared-library "libcairo.so")) (cairo-image-surface-create (c-function libcairo void* cairo_image_surface_create int int int)) (cairo-surface-write-to-png (c-function libcairo int cairo_surface_write_to_png void* char*)) (cairo-create (c-function libcairo void* cairo_create void*)) (set-line-width (c-function libcairo void cairo_set_line_width void* double)) (rgba (c-function libcairo void cairo_set_source_rgba void* double double double double)) (move-to (c-function libcairo void cairo_move_to void* double double)) (line-to (c-function libcairo void cairo_line_to void* double double)) (TOY-show-text (c-function libcairo void cairo_show_text void* char*)) (stroke (c-function libcairo void cairo_stroke void*))) (let* ((surface (cairo-image-surface-create 1 300 300)) (ctx (cairo-create surface))) (rgba ctx 1.0 1.0 1.0 1.0) (set-line-width ctx 8.0) (move-to ctx 10.0 10.0) (line-to ctx 10.0 290.0) (line-to ctx 290.0 290.0) (line-to ctx 290.0 10.0) (line-to ctx 10.0 10.0) (move-to ctx 100.0 150.0) (TOY-show-text ctx "mosh") (stroke ctx) (display (cairo-surface-write-to-png surface "test.png"))))
追記 : PDF版 http://storage.osdev.info/pub/idmjt/diaryimage/0901/neta090131l2.pdf
(import (rnrs) (mosh ffi)) (let* ((libcairo (open-shared-library "libcairo.so")) (cairo-pdf-surface-create (c-function libcairo void* cairo_pdf_surface_create char* double double)) (cairo-surface-write-to-png (c-function libcairo int cairo_surface_write_to_png void* char*)) (cairo-surface-destroy (c-function libcairo void cairo_surface_destroy void*)) (cairo-destroy (c-function libcairo void cairo_destroy void*)) (show-page (c-function libcairo void cairo_surface_show_page void*)) (cairo-create (c-function libcairo void* cairo_create void*)) (set-line-width (c-function libcairo void cairo_set_line_width void* double)) (rgba (c-function libcairo void cairo_set_source_rgba void* double double double double)) (move-to (c-function libcairo void cairo_move_to void* double double)) (line-to (c-function libcairo void cairo_line_to void* double double)) (TOY-show-text (c-function libcairo void cairo_show_text void* char*)) (stroke (c-function libcairo void cairo_stroke void*))) (let* ((surface (cairo-pdf-surface-create "test.pdf" 300.0 300.0)) (ctx (cairo-create surface))) (rgba ctx 0.0 0.0 0.0 1.0) (set-line-width ctx 8.0) (move-to ctx 10.0 10.0) (line-to ctx 10.0 290.0) (line-to ctx 290.0 290.0) (line-to ctx 290.0 10.0) (line-to ctx 10.0 10.0) (move-to ctx 100.0 150.0) (TOY-show-text ctx "mosh") (stroke ctx) (show-page surface) (cairo-destroy ctx) (cairo-surface-destroy surface))