構文木の操作
なんだか昔々の話に戻ったような気もするが、いまさらながらSqueakの構文木(ParseNode)をいじる。一つは、Tileから文字列表現を経由することなく一気にParseNodeを生成するというもので、もう一つは、Etoysのタイルで四則演算などを使ったときに、演算の優先順位が常に右結合優先になっていたことの修正である。
前者は、ちゃんとReturnNodeを作っておかないと、code generatorが生成したコードがスタックのバランスをちゃんとキープしなくなるため、ありとあらゆる意味不明なエラーが起こりまくるという問題にしばし悩まされたものの、正しい構文木から生成されたバイトコードを眺め、primitiveを書き間違えたときの症状に似ていることを思いだして解決。後者は、EtoysのTileから作られる式が常に右結合になっていて、それはほとんど直線的であるということから、ParseNodeの要素を操作する演算子順位文法のドライバを30行ほどで書いて、それに適切な木を食わせて変換することによって解決。
後者の問題は、Etoysをある程度使った人が常に驚かされる問題だったので、少なくともOLPCではそういうことはなくなるはずである。
MLBのシーズン
メジャーリーグが始まり、俺も人並み程度に興味を持っている今日このごろです。
長老Madduxが勝利投手になっているのを見てMLB.comで記録をチェックしたり。大リーグの最多勝投手はいわずと知れたCy Youngですが、さて、大リーグ最多敗投手は誰でしょう?
答えは、Cy Youngだったのですね。ちょっと得した気になる小情報でした、俺にとっては。
Madduxも97年にBravesのプレーオフの試合を見に行ったころなどは、「絶対的なエース」扱いだったわけですが、記録を見ると本当に勝ちまくりなのはいくつかのシーズンだけで、生涯勝率になるとそれほどでもないというのもちょっとした驚きではあります。(Randy Johnsonのほうがよっぽど良い)
なぜかBitBlt
阿部さんがアイコンを作ってくれた、本当は透明に白い線がアンチエイリアシングされて描かれていればなお良かったのだが、黒字に白のアンチエイリアシングされたアイコンになってしまっていたわけである。(しかも、よく見たら一部のものは8bit depthで、その他のものが32bit depthになっていたりするではないか。阿部さんリハビリ中ですな。)
以前TrueTypeレンダリングのことをやっていたときからこの手の変換は必要だったわけだが、今日になって、画期的な方法を思いついたのである。
そのコードはずばりこんな感じ。
| icon g h orig w height | icon := self iconAt: aString. orig := Form new hackBits: icon bits. height := icon width * icon height. g := Form extent: icon extent depth: 32. h := Form new hackBits: g bits. w := WarpBlt current toForm: h. w sourceForm: orig. w cellSize: 1. w copyQuad: {1@0. 1@height. 2@height. 2@0} toRect: (0@0 corner: 4@height). w combinationRule: Form over. ret := (Form extent: icon extent depth: 32) fillColor: aColor. g displayOn: ret at: 0 rule: 34. ^ ret.
TrueTypeの場合、キャッシュしたグリフを8ビットグレイスケールで持っておいても、横に4倍に引き伸ばした後で、rgbMul:with:を使えば良いのかもしれない。速度が向上するかどうかは不明だが、少なくともキャッシュは小さくできて、画像オペレーションのところは全部BitBltだけでできるわけなのだな。
reverse co-ed
超久々のぶっつけ本番で、最初から足が出ませんでした。すみません。これから心を入れ替えて精進します。