Text Renderer

イメージベースの環境はいろいろ良い面があるのだが、テキスト表示周りのように下回りでデバッガの動作に無くてはならないところというものもある。そういうところに間違ってエラーを仕込んでしまうと、デバッガを起動しようとしてエラーが再帰的に出る、という困った事態になるので、なんとなく抜本的に作り直してきれいにきれいにする、という意欲がわきにくい。

それでも今日は2年越しくらいで気になっていたところをもう一度見直し、汚かったレンダリング・ロジックの一部を正しいやり方に書き換えることができた。デバッグの細かいテクニックも2年前に比べると少しは覚えたようでもあり(といっても、デバッグ対象にしているTextMorphをそのインスペクタで完全に隠し、Morphicがレンダリングをスキップするようにする、とかその手のせこいせこい話ではあるが)、ちょっと納得の一日である。

BitBlt

というねずみはなんだったかというと、今朝書いたBitBltの修正によるものである。Squeakは当たり前のように多倍長整数をサポートしている割には、描画を受け持つ最下層のオブジェクトであるBitBltの実装にいまいちなところがあって、多倍長整数を座標値として持つグラフィカルなものを描画しようとするとこけてしまっていた。今朝になって、自分の才能の無さにいらいらしつつもようやくその修正をしたので、とんでもない座標値を持ったグラフィカルオブジェクトがあってもこけなくなったのである。

普通に文字形式でプログラムを書いているときは、画面上の1ピクセルを1単位とする座標系で多倍長整数が使われてしまうことはなかなかないのだが、タイルスクリプティングなので小学生でもそういう場面が簡単に作れてしまう。単純に座標値に大きな値を入れるだけではなく、

  object's x | increase by | object's x

みたいなスクリプトをタイルで書いてそれを繰り返し実行すれば、あっという間に多倍長整数の世界に突入である。

単純には、SmallIntegerで表現できる値を超えそうになったら値を丸めてしまう、という方針も考えられるが、それではやっぱり面白くない。値そのものはちゃんと正しい値として保持しておいて、レンダリングのときだけ正しくさぼるのが正しいわけだ。

というわけでBitBltを使うやつらはだいたい思ったように動くようになったのだが、SqueakにはBalloon2Dという2次元ベクトルグラフィックスレンダリングエンジンもあって、このねずみのようにベクトルグラフィックスになっているやつはそちらを使うようになっている。その場合、多倍長整数のハンドリングに問題があって、ある線分を一つ描きかかったところでエラーになってしまう。その結果がこの血まみれねずみ、というわけである。

Citris Gallery Builder 2 Release 2.1.1

ちょっと古いねただが、3次元共有環境Croquetを使って、UC Berkeleyのグループが作った
Citris Gallery Builder 2 Release 2.1.1のアナウンスがあった。

http://www.citris-uc.org/hosted/projects/ith/gallery/

やや紆余曲折もあったようであるが、最近はエンジンかかってやっているので良いですね。将来に期待。