サイログ。

~雑多な記事置き場~

2.0のサンプルが動かなかった件

実は、バイナリ版リリース作業で一番手こずったのは、sample/load_from_io.rbが動かなかったことです。
Surface#loadFromIOメソッドがエラーを返していました。
ohaiさんの話によると、このサンプルは問題なく動いているということで、原因が分からず、時間だけが経つばかり・・・。

ところが、今日、あっけなく解決してしまいました。
元のサンプルでは、

File.open("icon.png"){|f| SDL::Surface.loadFromIO(f) }

だったのですが、これをWindowsで実行しようとするとファイルがアスキーモードで開かれるためでした。以下、リファレンスマニュアルから引用。

"これらのいずれに対しても "b" フラグを ("r+b"のように) つけることができます (整数なら File::BINARY )。この場合、バイナリモードでオープンします (ただし、DOS/Windowsのようにシステムがテキスト/バイナリでファイルを区別する場合に限ります) "
(Ruby1.8.6リファレンスマニュアル Kernel.openメソッドの説明より)

孔明の罠か!(笑)

つまり、Windowsでは、File.openメソッドの引数にバイナリモードかどうかちゃんと指定しろということですね。なるほど〜。

というわけで、以下の様に修正したら直りました。

File.open("icon.png", "rb"){|f| SDL::Surface.loadFromIO(f) }

Ruby側に原因があったなんて・・・灯台もと暗しとはこのことです・・・。

とはいえ、上手くいって良かった良かった。