Lazy Diary @ Hatena Blog

PowerShell / Java / miscellaneous things about software development, Tips & Gochas. CC BY-SA 4.0/Apache License 2.0

GTK? なプログラムでアルファベットが文字化けする(別の文字に置き換わる)(2)

私は UNIX におけるフォント関係のシステムについての知識はさっぱりないので、ここでちょっとまとめてみることにする。まず環境は Debian sarge, XFree86 。化けているグリフは全てスケーラブルフォント (IPA P Gothic) をレンダリングした結果であり、表示にはアンチエイリアスがかかっている。今まで同様の症状が発生したのは、gxine, gaim, Firefox の 3 つ。
さて、Debian のパッケージにおいて、症状の出たパッケージが共通に利用している、フォントの表示に関係しそうなライブラリは libpango1.0-0 のみ。 GTK のライブラリもあるけど、GTK はフォント関係の処理を Pango に任せてる、とのことで、犯人はこれで決定かな……と思ったら http://wiki.fdiary.net/font/?unixuser200403-2 を発見。Pango だけを疑うことはできないことが分かった上に、グリフのレンダリングの何をどこでやってるか不明。
で、読み進めると Pango は普通 Xft か Xlib を使う、と。環境変数 GDK_USE_XFT が未設定なら Xft を使ってるぞ、と。"echo GD" あたりで Tab 補完をしても補完されないので Xft で確定。で、ページの図を眺めると、[PangoRenderXft]-[Xft2] の箱から右へ伸びてる線は 3 つ。それぞれ [FreeType2] [Fontconfig] [XRender]-[X-TT] へ…… GDK が直接アクセスしてるフォントシステムは分かっても、その先は分かんないんじゃないか orz
xlsfonts の実行結果に IPA フォントの名前がなく、fc-list の実行結果に名前があるところを見ると、少なくとも Xlib を使ってはいないみたい。で、もう一度考えてみると、数ある fonts.dir の中で IPA フォントに関して記述があるのは /var/lib/defoma/x-ttcidfont-conf.d/dirs/TrueType/fonts.dir だけ。このディレクトリ名 "x-ttcidfont-conf" って "X-TT CID Font-Config" の意味だよね。で、そのファイルの中に "ds=y:ai=0.4:ipagp.ttf -unknown-ipapgothic-..." みたいな記述があるってことは、XFree86 の xtt モジュールが動いてて、TTCap 拡張が効いてる、ということになる。
ここまできてやっと分かったのは、このシステム上で GTK が動いているときに、 http://wiki.fdiary.net/font/?unixuser200403-2 の図 http://wiki.fdiary.net/font/?c=plugin;plugin=attach_download;p=unixuser200403-2;file_name=gdk-font-diagram.png でいうところのどの経路を通ってフォントのグリフ生成を行っているか、ということ。結論は [GDK]-[PangoRenderXft]-[Xft2]-[XRender]-[X Server]-[X-TT]-[Fonts] 。あー疲れた! その上問題解決されてないし!

なお、今までに実行してみた(けど症状は改善しなかった)ものとしては……

  • システム再起動
  • /home にあるフォントキャッシュの再構成。 ~/.fonts.cache-1 と ~/.fonts/fonts.cache-1 を mv して fc-list を実行
  • defoma が作ったフォントキャッシュの再構成。 sudo defoma-reconfigure
  • IPA フォントのあるディレクトリにあるフォントキャッシュの再構成。 /usr/share/fonts/truetype/ipa/ で fonts.cache-1 を mv して sudo fc-cache ./

道は長いなぁ。