mrubyでもcairo


rubyにはrcairoがありますが、mrubyでも使えるようにmrbgem作ってみました。

使いそうな関数のみバインディングしてあるので、ソースの最後の定義を確認してみてください。

FreeBSDでcairoのpkgをインストールされた環境でビルドできます。もちろんZRouterでもビルドできます。

元々は小型液晶に画像を表示させるためのエンジンとして作ったのですがpng処理などいれてみたので汎用的に使えると思います。

mrubyビルドするときに以下を入れてください。

conf.gem :github => 'yamori813/mruby-cairo'

線を引いてみる

c = Cairo.new(120, 160)
c.set_source_rgb(1, 0, 0)
c.move_to(0, 0)
c.line_to(100, 100)
c.stroke()
c.save_png("test.png");

四角を書いてみる

c.set_line_width(2)
c.rectangle(10, 10, 30, 30)

丸を書いてみる

c.arc(20, 20, 40, 0, 3.14*2);

文字を書いてみる

c.move_to(10, 30)
c.set_source_rgb(1, 0, 1)
c.font_create("6x13.pcf")
c.set_font_size(13)
c.show_text("mruby demo cairo")

漢字も書けます。文字コードはUTF-8です。

c.move_to(20, 13)
c.set_source_rgb(1, 1, 1)
c.font_create("14x14ja.pcf")
c.set_font_size(14)
c.show_text('漢字')
c.stroke();

フォントはビットマップ形式のpcfファイルが使えるのですがbdfファイルの場合はbdftopcfコマンドで変換して使います。フォントのエンコードはiso10646です。ポイント指定がフォントと違ってると表示されないので注意してください。

アウトラインフォントのttfファイルも使えるようです。表示領域が広い場合はttfで狭い場合はpcfが良いです。

文字列を処理するときにはMRB_UTF8_STRINGを定義してmrubyをコンパイルしておくと良いです。デフォルトは設定されてないので、文字列の部分抜き出しとかキャタクタ単位でなくバイト単位となってしまいます。

conf.cc.defines = %w(MRB_UTF8_STRING)

pngファイルを読み込み

c.print_png(5, 20, "foo.png")

ファイルディスクリプタに書き出す

f = File.open("test.png", "w")
c.write_png(f.fileno)

QRCodeなんかも書けます

rcairoは自前での実装があるみたいですが、こちらはほぼ1対1のバインディングです。

結構使えるのではないかと思うので、興味があったら試してみてください。