Wine:フォント

フォント
Wine では、Linux にインストールされているフォントをそのまま使用できますが、Wine prefix 内のディレクトリにフォントを置いて使用することもできます。

# フォントファイルを置く場所
[Wine prefix]/windows/Fonts

特定の Wine prefix でのみ使用するようなフォントがあれば、ここに置くと良いです。
文字化け解消
日本語 Windows では、UI のテキストに「MS UI Gothic」などが使われています。

Wine 上においても、実行元のロケールが日本語であれば、それらをデフォルトのフォントとして扱います。

なので、msgothic.ttc を持っている場合、それを使えば、Windows 環境と同じようにテキストを表示できますが、Windows 以外で使うのはライセンス的に問題がありそうなので、注意してください。

msgothic.ttc を使わずに、他のフォントを使う場合は、一部で文字化けなどが起こる場合があります。
文字化けの例
最初に文字化けに気づくのは、winecfg の「画面」タブの「画像の解像度」内のテキストプレビューかもしれません。



本来は、「10 ポイントの Tahoma による見本です」と表示されるはずですが、msgothic.ttc がない場合は、日本語の部分が表示されません。
フォントリンク
上記の例の場合は、テキストに Tahoma フォントが使われています。
Tahoma フォント自体は /usr/share/wine/fonts 内にあるので、それが使われます。

この Tahoma フォントは、そもそも欧文フォントであり、日本語が含まれていないので、本来は日本語が表示されないのが当然です。

しかし、Windows には「フォントリンク」という機能があります。
この機能によって、あらかじめ指定された他のフォントから、フォント内に含まれていない文字を補うことができます。

フォントリンクの情報は、以下のレジストリ内にあります。

HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\FontLink\SystemLink

このキーを見てみると、"Tahoma" に値が設定されています。

MSGOTHIC.TTC,MS UI Gothic
MINGLIU.TTC,PMingLiU
SIMSUN.TTC,SimSun
GULIM.TTC,Gulim

複数行の文字列があり、各行にそれぞれ、"フォントファイル名,フォント名" の情報があります。

最初に MS UI Gothic があるので、msgothic.ttc がある場合は、そこから日本語が補完されることになります。
しかし、msgothic.ttc がない場合は補完されないため、結果的に、表示できない文字は□で表示されます。

値の変更
欧文には Tahoma を使い、日本語は他のフォントで補完したいのであれば、フォントリンクの値に、実存する日本語のフォントを設定する必要があります。

例えば、「IPA Pゴシック」で補完したいのであれば、以下の行を先頭に追加、または置き換えます。

ipagp.ttf,IPA Pゴシック

なお、Linux にインストールされているフォント (fontconfig に登録されているもの) の、ファイル名とフォント名を知りたい場合は、以下のコマンドでリストを表示してください。

$ fc-list

レジストリの値を変更した後に、再度 winecfg を開いてみると、フォントの補完が行われているのがわかります。
フォントの置き換え
Wine では、Windows 上で使われるフォントを、別のフォントに置き換える機能があります。

フォント置き換えを行うには、以下のレジストリキーに、値を設定します。

HKEY_CURRENT_USER\Software\Wine\Fonts\Replacements

値はそれぞれ、名前に「置き換え元のフォント名」、データ(文字列)に「置き換えるフォント名」を指定します。

Replacements キーはデフォルトで存在していないので、まずはキーを作成します。
ツリーから「HKEY_CURRENT_USER\Software\Wine\Fonts」までを開き、ツリー上の「Fonts」を右クリックして、「新規」>「キー」で、「Replacements」キーを作成してください。

その後、「Replacements」キーを選択し、値を設定していきます。

リストの部分を右クリックで、「新規」>「文字列値」を選択し、名前(置き換え元のフォント名)を入力。
その後、アイテムをダブルクリックして、データに、置き換えるフォント名を指定します。
Tahoma のフォント置き換えについて
フォント置き換えで、Tahoma を別のフォントに置き換えても、実際には適用されませんでした。

代わりに、"MS UI Gothic"="IPA Pゴシック" で置き換えて、winecfg を見てみると、欧文は Tahoma で、日本語は「IPA Pゴシック」になっていました。
(フォントリンクは初期状態のまま)

おそらく、フォントリンクの設定がある場合は、そちらの方が優先されています。

この場合、以下のような流れになります。
・Tahoma フォントで描画
→ 日本語の文字はフォント内にないので、フォントリンクからフォントを検索
→ 先頭の "MS UI Gothic" のフォントを検索
→ Wine のフォント置き換えにより、"MS UI Gothic" → "IPA Pゴシック" に置換
→ "IPA Pゴシック" で日本語フォントを描画

フォントの置き換えが適用されなかった場合は、フォントリンクの方をチェックしてみてください。
日本語フォントの置き換え
ここまでの情報をまとめると、日本語フォントを MS フォント以外の任意のフォントで表示したい場合、以下のフォントを、フォント置き換え機能を使って、指定フォントに置き換える必要があります。

MS ゴシック
MS Pゴシック
MS Gothic
MS PGothic
MS UI Gothic

## 明朝が使われている場合
MS 明朝
MS P明朝
MS Mincho
MS PMincho

## Windows Vista 以降
メイリオ
Meiryo
Meiryo UI

※全角の「MS」の後の空白は、全角空白です。

Windows ソフトの場合、UI のフォントは、基本的にソフト側でフォント名が指定されています。
(メニューやウィンドウタイトルなど、共通の部品については別)
そのため、ソフトによって、使われているフォントが異なります。

日本語のソフトであれば、MS 系のフォントが使われている場合が多いですが、欧文フォントをベースに、日本語をフォントリンクで補完している場合もあります。
その場合は、欧文フォントも置き換えてください。

フォントには、英語の名前と、各言語(日本語など)の名前がそれぞれ存在している場合があります。
例えば、「MS ゴシック」と「MS Gothic」は、どちらの名前を指定しても、同じフォントの名前として扱われます。

日本語のフォントが英語名で指定されている場合もあるので、両方の名前で置き換えを設定する必要があります。
アンチエイリアスの無効化について
Wine では、実行元において、フォントのアンチエイリアスが有効になっていれば、Wine で実行した Windows のソフト上でも、アンチエイリアスありで描画されます。

以前は、アンチエイリアスに関するレジストリ値が存在していましたが、現在では使われていないようなので、今は、Wine の設定によってアンチエイリアスを無効化することはできません。
フォントに関する設定情報
※以下は、Wine 6.14 時点での情報です。

Windows の機能として、レジストリ HKEY_CURRENT_USER\Control Panel\Desktop の FontSmoothing 関連の値で、グレイスケール(AA) または LCD の RGB/BGR、ガンマ値などは設定できるようですが、アンチエイリアスを無効にすることはできないようです。
[参考] dlls/gdi32/font.c: init_font_options() 関数

X11 の場合、アンチエイリアスの有無を決めるのは、X のリソース値 Xft.antialias のようです。
[参考] dlls/winex11.drv/xrender.c: get_xft_aa_flags() 関数
結論
X11 においては、X のリソース値 Xft.antialias を 0 にすれば、Wine 上でアンチエイリアスを無効にできます。

※ Xft は、X11 で FreeType によるフォント描画を行うためのライブラリです。
※ fontconfig の設定で、埋め込みビットマップを有効にする必要があります。

ただし、X のリソース値は、X11 全体の値として設定されるので、設定を変更すると、他の Xft を使うソフトも影響を受けます。
そのため、Wine の実行前に変更して、Wine の終了時に元に戻す必要があります。

このように、Wine の実行時のみアンチエイリアスを無効にするのは少々面倒なので、表示上特に問題がなければ、アンチエイリアスはそのままにして使った方がいいでしょう。

ゲームなど、アンチエイリアスを無効にしないと、表示上の支障が出る場合は、以下の手順で設定を行ってください。
アンチエイリアスの無効化を行う
1. fontconfig の埋め込みビットマップを有効にする
まずは、fontconfig の設定で、埋め込みビットマップを有効にする必要があります。

fontconfig は、デフォルトで、フォント内のビットマップデータを使用しない設定になっているので、アンチエイリアスを無効にしても、アウトラインデータを元にした非アンチエイリアス描画となってしまい、ギザギザに表示されてしまいます。

TTF/OTF フォントには、アウトラインデータとビットマップデータの両方が含まれている場合があり、その場合は、描画するフォントのサイズによって、どちらを使うかを判断します。

ちなみに、ビットマップデータのみの TTF/OTF フォントを作成することはできません。

埋め込みビットマップが有効の場合、フォント内に、描画するフォントサイズと一致するビットマップデータがあれば、それを使います。
埋め込みビットマップが無効の場合、フォントサイズに一致するビットマップデータがあっても、常にアウトラインデータを使います。

アンチエイリアスを有効にしたい場合は、すべてのフォントサイズで常にアウトラインデータを使う必要があるので、埋め込みビットマップはデフォルトで無効になっています。

設定方法
fontconfig で埋め込みビットマップを有効にするには、設定ファイルで設定する必要があります。

/usr/share/fontconfig/conf.avail (fontconfig が古い場合は、/etc/fonts/conf.avail) に、いくつかの設定ファイルがあらかじめ用意されているので、そのうちの 70-yes-bitmaps.conf を使います。
これは、埋め込みビットマップを有効にする設定ファイルです。

fontconfig は、/etc/fonts/conf.d から設定ファイルを読み込むので、そのディレクトリ上に、/usr/share/fontconfig/conf.avail/70-yes-bitmaps.conf へのシンボリックリンクを作成します。

$ sudo ln -s /usr/share/fontconfig/conf.avail/70-yes-bitmaps.conf /etc/fonts/conf.d

※もし、/etc/fonts/conf.d に 70-no-bitmaps.conf がある場合は、削除してください。
2. Xft.antialias を変更する
X リソースは、X11 の起動時に、~/.Xresources から読み込まれます。
Xft による描画の詳細は、ここで設定することができます。

[例]
Xft.antialias: 1
Xft.lcdfilter: lcddefault
Xft.hintstyle: hintslight
Xft.hinting: 1
Xft.rgba: rgb

Xft 描画時のアンチエイリアスの有効/無効は、Xft.antialias で設定できます。
無効にする場合は、値を 0 に設定します。

X リソースの値を直接変更したい場合は、xrdb コマンドで行うことができます。
(現在の X11 上でのみ適用されます。再起動すると、元に戻ります)

# パッケージ名
Ubuntu: x11-xserver-utils
Arch Linux: xorg-xrdb

## 現在の X リソース値を表示
$ xrdb -query

## アンチエイリアスを無効
$ echo "Xft.antialias:0" | xrdb
## Wine を実行
$ wine ...

## X リソースを元に戻す (ファイルがある場合)
$ xrdb -load ~/.Xresources
## X リソースを削除 (元々の設定値がない場合)
$ xrdb -remove

一応これで変更はできますが、少し面倒です。

私の方で、Xft.antialias の値だけを切り替えるプログラムを作ったので、必要であれば、そちらを使ってください。
xftnoaa
https://gitlab.com/azelpg/xftnoaa

X リソースの Xft.antialias の値だけを ON/OFF する、コマンドラインプログラムです。
シンプルに、アンチエイリアスの無効/有効を切り替えられます。

$ xftnoaa 0 # アンチエイリアス無効
$ wine ...
$ xftnoaa 1 # アンチエイリアス有効

※現在実行中の X11 上でのみ適用されます。