LinuxでTrueType font を使う


LinuxにおけるTrueType font の取り扱い

身近な例としてLinuxで最も有名なGUIツールキットであるQt・GTKを考えると*1、これらのライブラリは

  • Xのフォントシステム
  • Xft

のどちらかを使ってフォントのレンダリングを行う*2。そのうちXのフォントシステムは

  • Xフォントサーバ
  • Xのモジュール

の2種類が存在し、またXフォントサーバは主に

  • xfs
  • xfs-xtt

の2種類が存在し、Xのモジュールは

  • freetype
  • xtt

の2種類が存在する。Xftは

  • Xft1
  • Xft2+fontconfig

とバージョンが2種類あり、それぞれ設定方法が異なる。

各ツールの特徴や設定方法については後述する。

Qt/GTK ━┳━ Xのフォント ━┳━ Xフォントサーバ
         ┃      システム   ┃    ・xfs     (TTCap 未対応)
         ┃ (Xサーバで動作) ┃    ・xfs-xtt (TTCap 対応)
         ┃                 ┃
         ┃                 ┗━ モジュール
         ┃                        ・freetype (OpenType対応、TTCap 未対応)
         ┃                        ・xtt      (OpenType未対応、TTCap 対応)
         ┃
         ┗━ Xft (クライアントアプリケーションで動作)
               ・Xft1
               ・Xft2+fontconfig
LinuxにおけるTrurType? fontの取り扱い

Xのフォントシステム

Xのフォントシステムは、Xサーバで動作する。Xのフォントシステムを用いてレンダリングを行った場合はアンチエイリアスができない。

xfs(Xフォントサーバ)

Xフォントサーバを用いる利点としては

  • 1つのフォントサーバに複数のクライアントがアクセスするといった一元管理が可能となる
  • フォントレンダリングが並列処理できる

といったものがあるが、スタンドアローンで使う場合はオーバーヘッドが大きいためモジュールを使うほうがよい。

xfs

今どき素のxfsを使う人もいないだろうが、後述するxfs-xttと設定方法はほぼ同じである。

・XF86Configの設定

/etc/X11/XF86Config にフォントサーバを追加する。

FontPath "tcp/localhost:7100"

localhostは適宜変更のこと。セキュリティの都合上デフォルトでTCP接続を許可しない設定になっている場合があるので、そのときは

FontPath "unix/:7100"

とするか、/etc/X11/fs/config の

no-listen = tcp

をコメントアウトして

#no-listen = tcp
port 7100

を加える。TCPを使うとCPUの使用効率がよくなるという例もあるが一般的に当てはまるかは不明。ローカルホスト以外でTCP接続を許可していない場合はどうするのか・・・

・/etc/X11/fs/config の設定

Xフォントサーバの設定ファイル(/etc/X11/fs/config) に、フォントファイルがあるディレクトリのパスを追加する。

catalogue = /usr/lib/X11/fonts/X-TT/,/usr/lib/X11/fonts/Type1/,/usr/X11R6/lib/X11/fonts/TrueType/

複数ある場合はパスをカンマで区切る。

・高速化のために

~/.xserverrc などに

#! /bin/sh
exec X :0 -deferglyphs 16

のように記述すると、必要になったときに必要な文字だけレンダリングをするようになるため起動が早くなるようだ。

・fonts.dirの作成

以上でサーバの設定は終了したが、その他にフォント情報を記述したfonts.dirをフォントファイルと同じディレクトリに作成する必要がある。fonts.dir作成ツールとしてはmkttfdirやesemkfontdirなどがある。また、有名なフォントなら作成済みのfonts.dirが公開されていることがあるので検索してみるといいかもしれない。

xfs-xtt

基本的にxfsの場合と同じ設定である。サーバーのポート番号が7100 -> 7110に*3、設定ファイルが/etc/X11/fs/config -> /etc/X11/fs-xtt/configになっている。


モジュール

xfsの機能をモジュールとしてXに組み込むことができる。モジュールを用いるとフォントサーバを使用する必要がない。スタンドアローンでフォントサーバを使うより軽快に動作するようだ。モジュールにはfreetypeとxttがあるが、それぞれ排他的であるので同時に使用できない。そのため使用したいフォントに応じてどちらを使うか選択する必要がある。

・XF86Configの設定

/etc/X11/XF86Config に

Load "xtt"

または

Load "freetype"

を加える。xttはTTCap拡張(プロポーショナルフォント展開速度アップ、自動イタリック生成、自動太文字生成など)をサポートしたTrueType、freetypeはTTCap拡張なしのTrueType、Type1、OpenType?に対応している。

・フォントパスの追加

次にフォントのあるディレクトリのパスを加える。/etc/X11/XF86Config に

FontPath   "/usr/X11R6/lib/X11/fonts/TrueType/"

と記述するか、xsetコマンドを用いて

# xset +fp /usr/X11R6/lib/X11/fonts/TrueType/

とする。

・設定反映

設定ファイルを変更したときは

# xset fp rehash

で変更を有効にする。

・fonts.dirの作成

xfsと全く同じようにしてfonts.dirを作成する。

Xft

XftはFreeType? ラスタライザのインターフェイスおよびアンチエイリアス・サブピクセルレンダリングなどの拡張を行うライブラリである。XのフォントシステムがXサーバでレンダリングを行うのに対し、Xftはクライアントアプリケーション側でレンダリングを行う。Xftは将来的にはXに組み込まれることが期待されているらしい。クライアント側で動作するため、アプリケーションがXftに対応している必要がある。Xft対応のアプリケーションの代表的なものとしてGTK、Qt、Mozillaなどがある。

Xft1

Xfree 4.2.x ではXft1を使用している。

/etc/X11/XftConfig? の設定

Xft1の設定ファイルは /etc/X11/XftConfig? である。このファイルにフォントのあるディレクトリを追加する。

dir "/usr/X11R6/lib/X11/fonts/TrueType"

XftCache?の作成

fonts.dirに相当する、Xft1のためのフォント情報ファイルはXftCache?である。これはxftcacheコマンドによって自動で生成することができる。

# xftcache /usr/X11R6/lib/X11/fonts/TrueType

引数を指定しない場合には/etc/X11/XftConfig?で設定されたすべてのディレクトリを探索する。引数にディレクトリを与えれば、他のディレクトリは処理しないので多少早くなる。どうやらディレクトリを再帰的にたどってくれるわけではないらしい。

Xft2+fontconfig

Xfree 4.3.0 以降ではXft2+fontconfigを用いている。fontconfigとは、フォント管理とFreeType?の拡張としてアンチエイリアスやサブピクセルレンダリングを行うライブラリらしい。FreeType?の拡張なので、font自身のレンダリングを行うのはFreeType?である。しかしそうすると、Xft2の役目はなんだろうな*4?おそらくXft2はfontconfigのラッパーなのであろう。

/etc/fonts/local.confの設定

元々は /etc/fonts/fonts.conf が設定ファイルであったが、これはfontconfigがアップデートされると書き換えられたりするため、ローカルな設定は /etc/fonts/local.conf に書くことが推奨されている。フォントを追加するにはこの設定ファイルにディレクトリのパスを追加すればよい。

<?xml version="1.0"?>
<!DOCTYPE fontconfig SYSTEM "fonts.dtd">
<!-- /etc/fonts/local.conf file for local customizations -->
<fontconfig>
    <dir>/usr/X11R6/lib/X11/fonts/TrueType</dir>
</fontconfig>

Xft2の設定ファイルはXMLで記述されている。

fonts.cache-1 の作成

Xft2において、Xフォントシステムのfonts.dir、Xft1のXftCache?に相当するフォント情報ファイルはfonts.cache-1である。これはfc-cacheコマンドで生成することができる。

# fc-cache -f -v /usr/X11R6/lib/X11/fonts/TrueType

fc-cache は指定したディレクトリを再帰的にたどる。また、fonts.cache-1 のフォント情報は何やらエンコードされているようなので、手作業での変更は無理だろう。ちなみにフォントが有効になっているかどうかはfc-listコマンドで確認することができる。

まとめ

長々と書いてきたので、手順のみを簡単にまとめることにする。「フォントのパスを追加」はもちろん「パスが通っているディレクトリにフォントをコピー」でも同じことである。

  • Xフォントサーバを用いる場合
    1. /etc/X11/XF86Config にサーバを追加
    2. /etc/X11/fs/config にフォントのパスを追加
    3. フォントがあるディレクトリにfonts.dirを作成
  • Xのモジュールを使う場合
    1. /etc/X11/XF86Config に Load "xtt" または Load "freetype" を追加
    2. /etc/X11/XF86Config に フォントのパスを追加
    3. フォントがあるディレクトリにfonts.dirを作成
  • Xft1を使う場合
    1. /etc/X11/XftConfig? にフォントのパスを追加
    2. xftcache を実行
  • Xft2を使う場合
    1. /etc/fonts/local.conf にフォントのパスを追加
    2. fc-cache を実行

また、「どれを使えばいいのか?」と言われればとりあえず「Load "xtt" と Xft2」と答えるかな。


*1 OpenOffice?.orgなどは独自のフォントレンダリングを行っている
*2 GTKはpangoというライブラリがフォントのレンダリングを行う
*3 -portオプションで変更可能
*4 たとえば手元のGentooでは、Xfree4.3.0はfontconfigに依存しているがXft2には依存していない。fc-cacheなどもfontconfigのツールのようだ。