gdi++.dll, Smooth edges on screen font again.

gdi++.dll について

gdi++.dll は gdi32.dll に対して listexp2.exe を使って出力されたソースを元に作られています。オーバーライドすべきAPIは、Windows GDI/Font and Text Functions あたりだと思います。ただ、何故か DrawText() 系の API は user32.dll に含まれているので、もしかするとそちらに対してもプロキシ DLL を作成する必要があるかもしれません。2006/09/15 版では、とりあえず TextOut(), GetTextExtentPoint32() のみ対応しています。

フォントのスムージング

Windows 上でフォントをスムージングを掛ける方法はいくつか考えられます。

  1. フォントサイズを本来より大きく描画して、縮小する
  2. GetGlyphOutline()で一文字ごとにスムージングの掛かったイメージを受け取る
  3. 別のフォントレンダラ (FreeType など) を利用する
現在 gdi++.dll が採用しているのは (1) です。あらかじめ背景をStretchBlt()で転送した上に描画すればアルファブレンド処理が必要なく、もっともお手軽に実装できる、というのが大きな理由です。(2) も、比較的メジャーな方法で、GGO_GRAY8_BITMAP などのフラグを GetGlyphOutline() に渡すと、スムージングの掛かったビットマップを返してくれます。ただ、実際に文字列を描画するには、描画位置などを計算しなければならないので、多少面倒です。(3) は、FreeType はヒンティング情報を処理してくれるので、最もクリアな結果が得られるかもしれません。ただ、 FreeType もあくまでグリフごとの情報しか返してくれないようですし、まとまったものを描画させようとすると、けっこうな苦労になると思われます。TextOut() のラッパーを作るなら、やはり TextOut() を呼ぶのが一番手っ取り早いので、(1) が最も現実的な選択肢なのではないでしょうか。

サブピクセルレンダリング

いわゆるClearTypeについて。ClearScale - Image resampling for patterned displays のレポートがとても分かりやすいです。

gdi32.dll の挙動を知るには

Wine のソースが参考になるでしょう。ココらへんが gdi32.dll の部分です。