この会話は、複数のチャットモデルを使用してDuck.ai(https://duck.ai)で生成されました。AIチャットでは不正確な情報や不快な内容が表示される場合があります(詳細についてはhttps://duckduckgo.com/duckai/privacy-termsを参照してください)。 ==================== ユーザープロンプト1/3 - 2025/6/23 22:01:20: Lubuntu+WineでITパスポート試験CBT疑似体験ソフトウェアを動かしてみた。 まず、フォント置換を行った。 設問自体は一応解けるが、設問に関する説明やヘルプの描画ができない。 フォント関連は色々試したし、文字化けの豆腐(白い□)すら表示されないので、問題はフォントでは無さそう。 そこで、WINEDEBUGを使うと 0024:fixme:gdiplus:GdipCreateHalftonePalette stub 0024:warn:palette:NtUserSelectPalette invalid selected palette (nil) などというメッセージがあったので、winetricksでgdiplusをインストールしてみた。 すると、一部領域が描画されないエラーは直った。 その代わりに、今まで表示されていた領域の英数字が、元のフォントともレジストリで指定したフォントとも違うフォントに置換されてしまった。 o4-mini: 以下のポイントを順にチェック/試行してみてください。 1. 使う “gdiplus.dll” の切り替え Wine の `gdiplus`(GDI+)には「Wine標準(builtin)」と「Windowsネイティブ(native)」があります。 1. `winecfg` →「ライブラリ」タブ 2. “gdiplus” を選択 → 追加 3. “gdiplus” の優先度を「native (Windows)」あるいは「builtin (Wine)」に切り替え 4. それぞれでソフトを起動して、英数字のフォントがどうなるか確かめる → Wine 側の GDI+ 実装(stub)の問題で配色やアンチエイリアスが効いていない場合は “native” が改善することがありますし、逆に “builtin” のほうがフォント置換が安定する場合もあります。 2. 必要な Windows フォントを入れる ITパスポート試験疑似体験ソフトはおそらく「MS ゴシック」「MS Pゴシック」「MS UI Gothic」「Tahoma」「Arial」あたりを参照しているはずです。 ``` winetricks corefonts winetricks allfonts winetricks ttf-mscorefonts-installer ``` などで定番の Windows フォントを入れ、 winecfg の「デスクトップ統合」タブがあれば「フォントのインストール済みを仮定」するチェックも入れておくと吉です。 3. Wine 側のフォント置換設定を調整 `regedit` → HKEY_LOCAL_MACHINE\Software\Wine\Fonts 以下を直接編集できます。 - FontSubstitutes キーに “MS UI Gothic” → “MS Gothic” など明示的にマッピングを追加 - “Arial” → “Tahoma” など、漢字と英数字のフォントを分けたい場合は両方登録 例: ``` [HKEY_LOCAL_MACHINE\Software\Wine\Fonts\FontSubstitutes] "MS UI Gothic"="MS Gothic" "Arial"="Tahoma" ``` 4. Cleartype(サブピクセルレンダリング)の On/Off GDI+を使う描画では ClearType のあり/なしで印象が大きく変わります。 ``` winetricks fontsmooth=rgb ← ClearType (RGB) winetricks fontsmooth=none ← 通常グレースケール ``` で切り替え、くっきり読めるほうを選んでください。 5. キャッシュ/設定のクリア - `~/.wine` 以下の一時ファイルが干渉している可能性があるので、ソフトを終了した上で ``` rm -rf ~/.wine/drive_c/windows/Fonts/*cache* ``` 相当する cache ファイルを削除 - Wine を再起動してから再度ソフトを立ち上げ 6. それでもダメなら… - 別のエミュレータ(PlayOnLinux / Lutris)経由でバージョン違いの Wine(たとえば 6.0, 7.0, staging)を試す - Windows7 モード/Windows10モードの切り替え(winecfg の「アプリケーション」タブ) ―――― 上記を一つずつ潰していくことで、 a. GDI+(gdiplus.dll)の精度 b. フォントそのものの有無 c. Wine のフォント置換ルール を正しくマッチさせられれば、「日本語部分も英数字部分もオリジナルに近いフォント」で描画できるはずです。まずは “gdiplus.dll” の native/builtin 切り替えと、winetricks corefonts の導入あたりからお試しください。 -------------------- ユーザープロンプト2/3 - 2025/6/23 22:03:58: > 元のフォントともレジストリで指定したフォントとも違うフォントに置換されてしまった。 これの原因はなんですか? o4-mini: Wine上で「本来の英数字フォント→登録フォントとも違うフォント」に置き換わってしまう原因は、大まかに言うと 1. Wine の「GDI+ ネイティブ DLL」を入れたことで ・Wine 独自の GDI+ 実装(文字レンダリング/フォントマップ機能)ではなく ・Windows 本来の GDI+ 実装(winetricks で入れた “gdiplus”)が動くようになった ↓ Windows 純正の GDI+ は、フォント名からフォントファイルを引く 「Wine のフォント マッパー」をバイパスし 直接 Windows レジストリの FontSubstitutes や自前のフォント検索ルーチンを使います。 そこに該当フォントが登録されていない/インストールされていないと →「代わりにこれを使うよ」というフォールバック用のフォント(例:DejaVu、Droid Sans 系など)に置き換わります。 2. Wine 標準の GDI+ stub(WineGDI+ビルトインのフォント管理)は ・wineprefix 内の windows/Fonts/*.ttf を全部斑に見て置換ルールを適用してくれるのに対し ・真正 gdiplus.dll はそういう補完機構を持たないため、レジストリの FontSubstitutes がきちんと設定されていないと →期待している “MS ゴシック” “MS 明朝” “Arial” 等がまったくヒットせず、全く別のフォントを拾ってしまう ――という二重構造になっているためです。 対策としては、 1. winetricks で corefonts/allfonts/cjkfonts(→Arial, Times New Roman, MS ゴシック などの ttf)を入れる 2. レジストリ(regedit)で HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\FontSubstitutes に必要なフォント置換ルールを追記する 3. Wine のフォントキャッシュをクリア(`fc-cache -fv`、`wineboot -r`)して再起動 を行えば、GDI+ でちゃんと狙ったフォントが呼び出されるようになります。 -------------------- ユーザープロンプト3/3 - 2025/6/23 22:14:39: レジストリ[HKEY_CURRENT_USER\Software\Wine\Fonts\Replacements]で指定したフォントとおなじになる場合もあるのはなぜですか? o4-mini: Wine のフォント置換には大きく分けて2つのレイヤーがあります。それぞれで参照するレジストリキーが異なるため、 ・HKCU\Software\Wine\Fonts\Replacements ・HKLM\…\FontSubstitutes(Windows 純正 GDI+/GDI の置換ルール) のどちらを使ってフォント検索/代替を行うかが「どの描画 API(GDI vs GDI+)を経由しているか」で変わり、結果として 「ある領域は HKCU の Replacements のフォントになる」 「別の領域は HKLM の FontSubstitutes から辿るフォントになる」 ――という混在が起きます。 ―――――――――――――――――――――――― 1) Wine の組み込み GDI+(stub) → HKCU\…\Replacements を参照 ・winegdi 上の GdipDrawString 等は、Wine 側のフォントマッパーを通して Replacements の置換ルールを優先的に適用します。 2) Windows 純正 gdiplus.dll(winetricks で入れたもの) → HKLM\…\FontSubstitutes を参照 ・こちらは Wine 独自のフォントマッパーをバイパスして Windows ネイティブのレジストリ設定(FontSubstitutes)と自前フォント検索ルーチンを使うため、 HKCU\…\Replacements は基本的に見に行きません。 3) さらに GDI(DrawText系)呼び出しが混ざると、 ・Wine の組み込み GDI→HKCU\…\Replacements ・Windows GDI(ネイティブ gdi32.dll/gdiplus.dll 経由)→HKLM\…\FontSubstitutes   がそれぞれ別々に動きます。 ―――――――――――――――――――――――― 結果として、 * アプリのあるパーツが「組み込み GDI+ stub → HKCU\Replacements」を使った描画 * 別パーツが「本物の gdiplus.dll → HKLM\FontSubstitutes」を使った描画 という風に API 切り替えが起きると、“同じ”アプリ内でもフォント置換のルールがすり抜けて混在してしまうわけです。 【対策】 もしすべてを HKCU\Replacements 側で統一したいなら、逆に本物の gdiplus.dll を外して Wine 標準の stub を使う(winetricks の gdiplus をアンインストール)か、 あるいは HKLM\…\FontSubstitutes にも同じ置換ルールを追加して両者で差が出ないようにそろえれば、混在はなくなります。