Stem darkening

Fontconfigでは設定できませんが、FreeTypeで環境依存し大きく見た目に影響する要素が実はもうひとつあります。 それが環境変数 FREETYPE_PROPERTIES です。 特にstem darkeningはフォントにこだわるのであれば一度見直したほうが良いでしょう。 Qtアプリケーションとそれ以外でフォントの見た目が違うなと感じたらこれが原因かもしれません。

拝啓、年の瀬も押し迫り、皆様何かとご多忙のことと存じます。 私は特に忙しくも無かったはずですのにとうとう何も書き物をすることなく年末を迎えてしまいました。 ですのこのブログだけでも2025年の記事ゼロを回避しようと今更のようなことを書いております。

……と、そんな話はどうでもいいですね。

環境変数 FREETYPE_PROPERTIES

環境変数 FREETYPE_PROPERTIES はFreeTypeのレンダリングに影響を与えます。 アプリケーション側の設定が最優先で、次に FREETYPE_PROPERTIES、特に設定がなければFreeTypeのデフォルトという順番です。 リファレンスは Driver properties - FreeType-2.14.1 API Reference にあります。

ライブラリのAPIに付け足す形で分散して書かれてますので読んでもよくわからないとは思いますが重要な設定はstem darkeningぐらいです。 ヒンティングのエンジンをAdobe製のものからFreeTypeオリジナルのものへと切り替えたりと他にも色々できはしますが質が落ちるだけです。 Stem darkening以外はデフォルトで良いです。

ですので今回はStem darkeningだけ説明します。

Stem darkeningを無効にするには

FREETYPE_PROPERTIES=cff:no-stem-darkening=1

有効にするには

FREETYPE_PROPERTIES=cff:no-stem-darkening=0

とします。

no- が付いていますので1が無効で0が有効です。

FreeTypeのデフォルトは「無効」です。

Stem darkeningとは

それでstem darkeningとはどういうもので変えるとどうなるのかという話ですが、これはもう見ていただいたほうが早いでしょう。 Noto Sans CJK JPをftviewで表示しました。

これが cff:no-stem-darkening=1 無効のときで

cff:no-stem-darkening=1 無効

これが cff:no-stem-darkening=0 有効のときです。

cff:no-stem-darkening=0 有効

明らかに下のほうが線が濃いですよね。

hintslightのときにも参照した On slight hinting, proper text rendering, stem darkening and LCD filters のページにもstem darkeningの比較画像がありますので見てみてください。

Stem darkeningは cff: が付いていますようにCFFフォント、つまりOpenTypeフォントにのみ影響します。 「stem」というのはOpenTypeフォントのヒント情報で使われる言葉で文字の中で線をピクセル境界に沿わせるように指定するものです。 ヒンティングを行ってもまだ線が1ピクセルの幅に満たない場合や複数ピクセルをまたぐ場合はその線は薄く描かれるわけですが、stem darkeningは本来もっと薄く描かれるはずの線を濃い目にする機能です。

線の細いフォントは小さなサイズでは薄くなりすぎてかすれたようになって殆ど見えなくなってしまうのはよく問題になっています。 Stem darkeningはそのようなケースを大きく減らしてくれる大変嬉しい機能です。

一方でフォント本来の形状からは離れてしまうわけですから用途によっては使えないこともあるでしょう。 もしヒンティングを有効にしているのであれば今更ではありますが。

単純に好き嫌いもあると思います。 濃い線が嫌いな方は無効で良いでしょう。

TrueTypeフォントはヒンティングの方式が全く違うためstem darkeningは適用されません。 元々OpenTypeのほうが線が薄くなりがちですし。

Qt

このstem darkeningですが、Qtアプリケーションでははじめから有効になっています。 Qt5Qt6 ともにハードコーディングされていますので該当する.soを再コンパイルするなりフックするなりしない限り上書きする方法はありません。

FreeTypeのデフォルトが無効ですからQt以外ではほとんどのアプリケーションで無効です。 同じフォント同じサイズ同じFontconfig設定なのにそれでも見た目が違う場合には使用ライブラリや環境変数も確認してみたほうが良いでしょう。

Qtアプリケーションとそれ以外でOpenTypeフォントのレンダリングを揃えたい場合は有効にする一択となってしまっています。