なぜか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だけでできるわけなのだな。