rcairo

このページのソースです。

!インストール
さくらインターネットに*rcairo-1.0.0>http://cairographics.org/rcairo*を入れてみた。

!cairoのインストール
まずcairo-1.0.2のインストール。
-freetypeをインストール。
-fontconfig をインストール
どっちかがexpat を要求するのでインストール。
-cairo をインストール
GNU makeの新しいバージョンを要求されたのでインストール。
{{{
setenv PKG_CONFIG_PATH /home/HOGEHOGE/lib/pkgconfig
./configure --prefix=/home/HOGEHOGE --enable-pdf --enable-ps
}}}
pixman/src/pixman.h の98行目でエラーがでるので、
{{{
stdint.h -> inttypes.h
}}}
に変更

test/Makefileでpthreadが見つからず。古いFreeBSDではpthreadはc_rという名前のようだ。
その関係で、
{{{
-lpthread -> -pthread
}}}
と変更するとコンパイルは通る。

-追記。cairo-1.2.4の場合。
src/cairoint.hに以下を追加。
{{{
#define 	INT16_MAX   0x7fff
#define 	INT16_MIN   (-INT16_MAX - 1)
}}}

!rcairoをインストール
{{{
setenv PKG_CONFIG_PATH /home/HOGEHOGE/lib/pkgconfig
}}}
して
{{{
ruby setup.rb config 
ruby setup.rb setup
ruby setup.rb install --prefix=/home/HOGEHOGE
}}}
実行時にはlibcairoが見えないといけないので、
{{{
setenv LD_LIBRARY_PATH /home/HOGEHOGE/lib
}}}
を設定するとか、Makefileの-Rオプションをいじる(*参考>http://ashitani.jp/diary/?date=20060818*)とかして探せるようにしておく。

うーん、しかしテキストを扱おうとすると
{{{
`text_extents': out of memory (NoMemoryError)
}}}
とかいわれるな。つーかそもそもフォント入れてないじゃん。

 !使い方    
!!処理の流れ
Surface を用意する。200x200は画像サイズ。
{{{
surface = Cairo::ImageSurface.new(Cairo::FORMAT_ARGB32, 200, 200)
}}}
Surface上に何か書くときは、Contextを作ってstrokeする、を繰り返す。
{{{
c = Cairo::Context.new(surface)

#例えば、線を書く
c.set_source_rgb(0,0,0)
c.move_to(0,100)
c.lone_to(200,100)

#Surfaceに対して描画
c.stroke
}}}
描画済みのSurfaceを、たとえばpngファイルに落とす。
{{{
surface.write_to_png("test.png")
}}}

Contextがいまいちわかりにくいし説明しにくいが、描画の手順。
Contextに描画手順を登録して、strokeで実際に描画、というイメージ。
まだよくわかってないのだけど、フォントサイズや色など、strokeするまでに変更すると後に設定したものが反映されるっぽい。また、strokeしたらpathは消えてしまう。

!!線を書く
{{{
c.move_to(x0,y0)  # (x0,y0) にペンを移動
c.line_to(x1,y1)     # (x1,y1)まで線を引く
c.line_to(x2,y2)     # さらに(x2,y2)まで線を引く
}}}
!!線のスタイルを変える
{{{
c.set_source_rgb(0.0, 0.0, 0.0)  # 色。R,G,B の濃さをそれぞれ0.0から1.0で表す
c.set_line_width(4)                    # 太さ。ピクセル指定?
c.set_dash([5,5],2.5)                # 点線の指定。5ピクセル書いて5ピクセル休む、
                                               # のを2.5ピクセルのオフセットをつけて書く。
                                               # 行列はOn,Offのパターンを指定するものなので、
                                               #行列サイズを増やせば一点鎖線などが書ける
}}}

!!文字
utfにすれば日本語もさっくりOk。
{{{
c.move_to(100,100)
str=Uconv.euctou8("テスト表示")
c.show_text(str)
}}}

!!フォント指定
{{{
c.select_font_face("times", 0,0)
c.select_font_face("mikachan", 0,0)
c.select_font_face("kochi gothic", 0,0)
}}}
などなど。Win環境でMS明朝を出したければフォント名をutf8でencodeするのかな。

!!文字サイズ取得
{{{
c.text_extents("hoge").width
}}}
などのようにtext_extentsで現在のContextの設定(フォントサイズとか)で
の"hoge"の実サイズが得られる。