« SF.net の Anonymous CVS はまだ死んでた | トップページ | 今日のコミット »

2006.05.02

Array#pack というマホウ

Tim Burks の新作「Cocoa Magic for Gruff Graphs」。なんといってもでき上がりの絵がキレイなので、自分でもやりたくなる(まだやってないけど)。内容としては、NSImage と NSBezierPath でグラフをぐりぐり書くというもの。

そこで NSBezierPath のメソッドで (float *) の引数をとるものがあるので、 OSX::ObjcPtr を拡張までしている。

だけど、単純な配列なら Array#pack を使えば解決してしまう。だいぶ前に ruby-talk あたりで誰かが教えてくれたもの。

 bezier = OSX::NSBezierPath.bezierPath
 # some settings..
 pattern = [5.0, 2.0].pack('f*')
 bezier.setLineDash(pattern, :count, 2, :phaze, 0.0)
 bezier.stroke

なんでこんなで ok かというと、 "^f" のエンコーディングは RubyCocoa では変換されないので、 pack された文字列がそのままバイト列のデータとしてObjective-C 側に渡される。そのため、ちゃんと動くわけ。OSX::ObjcPtr#unpack(template) があるとうれしいケースがあるかも。

なんだか黒魔術っぽいけど、それで解決するならいいじゃん。とりあえず FAQ あたりに書いておいたほうがいいかな?

|

« SF.net の Anonymous CVS はまだ死んでた | トップページ | 今日のコミット »