torutkのブログ

ソフトウェア・エンジニアのブログ

ビットマップフォントの色化け!(アンチエイリアスがかかる)

JavaFX 8で、MSゴシック系フォントのテキスト表示をしてみたら、文字の色は黒なのに、ところどころで青色・赤色に表示される箇所があります。

傾向的に、幅1ピクセルの縦線が青や赤になっていることから、サブピクセルレンダリングLDC)が絡んでいるように思われます。

そこで、システムプロパティ prism.lcdtextをfalseに設定して実行してみると、次の画面のようにこの赤、青問題は発生しなくなりました。

prism.lcdtextをfalseにしても、この画面のようにSegoe UIやVerdanaフォントはアンチエイリアシングがかかっています。これは、アンチエイリアシングが無効になるのではなく、アンチエイリアシングの種類がlcdではなくgrayになっています。

MSゴシック系フォントはTrueTypeフォントですが、フォント内にビットマップフォントも持っており、表示サイズが小さい(20ポイント以下)とビットマップフォントが使われます。
ビットマップフォントの描画にはアンチエイリアシングをかけないはずですが、JavaFXのテキスト描画ではビットマップでもLCDのときはアンチエイリアシングをかけているのではないかと思われます。grayのときはアンチエイリアシングはかかっていません。

JavaFXのバグ管理システムを調べてみると、
https://javafx-jira.kenai.com

RT-36794 "[Font] Bitmapped font should not be sub-pixel rendered. "で報告されている問題と同じかと思われます。Fix Version/s: 9となっています。とりあえずVoteしました。

(2015-08-19追記)バグ管理システムはOpenJDKに統合されたようです。
https://bugs.openjdk.java.net/browse/JDK-8088943