しらいとブログ

ネットで検索してもなかなか出てこないIT情報を独自にまとめています

「WinFont+」開発記録 Part 3

今回はWinFont+_alpha2の不都合をまとめてみました。

FontLinkに対応していない


画像はEmEditorの設定ウィンドウ

英語フォントで日本語を表示しようとするとFontLinkで日本語だけ日本語フォントに置き換えられます。この処理はGDIのフォント描画関数の内部でやっているため、自分でシミュレートする必要があります。そのためにはレジストリ値を読み取ってリストを作ったり、自分でフォントをロードしたりといろいろ手間がかかります。現時点ではフォントリンクが必要な部分だけ通常通りGDIで表示しています。つまり日本語だけWinFont+が効きません。

無効化された文字がつぶれる


画像はMedia Player Classic Home Cinema

WindowsGUIでは無効化された文字はグレーで表示されます。この処理にはDrawState関数が使われるのですが、内部で一度モノクロに変換されるため、アンチエイリアスが単色になって文字がつぶれます。DrawState関数内では通常通りGDIで描画させるか、DrawState関数自体を置き換えるか思案中です。

SetWorldTransformに非対応


画像はAdobe AIRインストーラ

SetWorldTransformは画面全体の拡大縮小や回転機能です。DirectWriteにも拡大縮小や回転のための機能が有るので理論上対応可能ですが、既に縦横3倍に拡大してラスタライズしたものを縮小して使っているので、計算が面倒なことになり、後回しになっています。

縦書きに一部非対応


画像はLibreOfficeのWriter

縦書きの描画方法はいくつかあり、これは文章全体を90度回転し、文字だけを逆方向に90度回転させて描画する手法です。文章を回転する機能も、文字だけを回転させる機能も対応していません。

文字の縦横比を変えられない

WinFont+_alpha2 通常(GDI)

画像はレミュオールの錬金術

GDIではLOGFONTのlfWidthとlfHeightを設定することで縦横比を自由に変えることができましたが、DirectWriteにはそのような機能はありません。文字単位ではなく画面単位でなら縦横比を変えられるので理論上は再現可能ですがややこしいので後回しにしています。

文字の背景が塗りつぶされる

WinFont+_alpha2 通常(GDI)

画像は東方紅魔郷(体験版)

これは描画先が16ビットのビットマップでした。今の仕様だと、16ビットの背景を32ビットのビットマップにコピー、文字を合成、32ビットのビットマップを16ビットに描き戻すという処理をやっています。この流れの中で背景が変化しているみたいです。背景を変化させないためには32ビットに変換せず直接16ビットで合成する必要がありそうです。

文字が見切れる

Firefoxなどいくつかのソフトで文字が見切れる可能性があります。WinFont+ではヒンティング無しの描画を行っていますが、GDIはヒンティング有りなので描画に必要なサイズが変わる可能性があるからです。これは文字の描画に必要なサイズを取得する関数をフックしてヒンティング無しのサイズを返すようにする必要があります。

一部のソフトに効かない

子プロセスを生成するソフトには効きません。また、レジストリの設定で全ソフトにDLLを読み込ませる設定にしても、セキュリティの関係で読み込まれないソフトもあります。どちらも、子プロセスを親プロセスからフックする必要があります。

やらなきゃいけないこと

  • FontLink対応
  • DrawState関数への対応
  • 画面単位、文章単位、文字単位、の3パターンで回転&拡大縮小
  • 16ビット対応
  • 文字サイズの補正
  • 子プロセスのフック

Download

今回は無し。

不都合の原因は分かっているので、非対応の部分だけ通常通りGDIで表示するようプログラムすることもできますが、それをやると間違ったバグ報告が増えるのでまだやりません。そのうちデバッグ用にバグ回避有り版とバグ回避無し版を分けて公開するかもしれません。