moshで絵を描く


というわけで、moshFFIに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))