Create  Edit  Diff  FrontPage  Index  Search  Changes  History  Source  RSS  wikifarm  Login

unixuser200403-2

UNIX USER 誌 2004 年 3 月号 のフォント特集の元原稿より

X Window System でのフォントの扱い

  • かずひこ *1
  • 村田賢太 *2
  • 山下繁行 *3

X Window System でフォントの描画を受け持つサブシステムは、大きく分けて二つあり、一つは古くからあるコアフォントシステムで、もう一つは新しく設計された Xft フォントシステムである。 なお、この記事では執筆時点の最新版である XFree86-4.3 を対象とする。

まずはじめに、GNOME で採用されているツールキット*4である GTK+ (執筆時点での最新版は 2.2.4) を例として、X Window System におけるフォントシステムの取り扱われ方について、その簡単な概要を説明する。 それによって、各フォントサブシステムが実際にどの部分に関わっているのかを把握するのに役立つだろう。

GTK+ とは

GTK+ (GIMP ToolKit?)*5 は GUI に必要な部品を提供するライブラリである。 GTK+ はライブラリを単純にするため、部品を定義するのに不要な要素を別のライブラリに分離している (表??)。そのうち、フォントに関するライブラリが Pango*6 と呼ばれるライブラリである。

ライブラリ名概要
GDK 描画機能を集めたライブラリ
GDK Pixbuf ビットマップ画像用の機能を集めたライブラリ
Pango フォント関連機能とレイアウト機能を集めたライブラリ

Pango とその周辺

図?? に Pango におけるフォントの取り扱いに関するフローチャートを示す。この図の中で、実線はデータが直接やりとりされることを表している。また、点線はデータが間接的に (プロセス間通信を使って) やりとりされることを表している。そして線の色については、

ピンク
フォントファミリ名による一覧の取得
XLFD による一覧の取得
黄色
グリフのレンダリング
フォントファイルへのアクセス

という意味を表している。

gdk-font-diagram.png ★「図? Pango におけるフォントの取り扱い」 gdk-font-diagram.eps.gz

Pango は次の3つのフォントシステムを使用する。

  • FreeType2?
  • Xft
  • Xlib (コアフォントシステム)

これらのフォントシステムのうち、実際にどれを使用するかを決定するのは GDK*7 である。 FreeType2? は、GDK が DirectFB 上で動いている場合に使用されるので、今回の特集では省略する。 Xft と Xlib は、GDK が X Window System 上で動いている場合に使用される。ただし、Xft と Xlib が2つ同時に使用されることはなく、どちらか一方だけが有効となる。どちらが使用されるかは、環境変数 GDK_USE_XFT の値で決定される (表??)。

GDK_USE_XFT の値使用されるシステム
0以外の数値 Xft
0 Xlib
未設定 Xft

なおこの図の中の、'Client Application Part' と 'X Server Part' と 'X Font Server Part' は、それぞれ別のマシンで動かすことが可能である。

ではいよいよ、'Client Application Part' と 'X Server Part' と 'X Font Server Part' の三つについて、それぞれの設定を解説する。

Client Application Part

この Part では、Xft フォントシステムと呼ばれる、X Window System でアウトラインフォントをよりうまく扱えるように新しく設計されたシステム*8が用いられる。

なおXft フォントシステムは、従来のコアフォントシステムと互換ではないため、古いアプリケーションでは Xft を使うように作り直さない限り Xft フォントシステムを用いることはできない。 しかし今や GTK+ と Qt*9 の二大 toolkit が Xft に対応しているので 、今後開発される多くのアプリケーションは、この Xft フォントシステムに対応したものになるであろう。

フォントの確認とインストール

Xft フォントシステムで使えるフォントの一覧を取得するには

$ fc-list

を実行する。なお日本語のフォント名などは UTF-8 で出力される。

GUI でフォントの一覧を眺める方法はいくつかあるが、Xft を使用するアプリケーションでフォントの設定ができるもの (例えば GNOME の gedit や KDE の kedit) なら、当然その設定画面で使えるフォントを見ることができる。

もっと小粋に攻めるなら ruby-gnome2*10 を使ったこんなスクリプトを実行する手もある。

#!/usr/bin/env ruby
require 'gtk2'
Gtk.init
fontsel = Gtk::FontSelectionDialog.new("gtkfontsel").show
fontsel.signal_connect("delete-event"){ Gtk.main_quit }
fontsel.cancel_button.signal_connect("clicked"){ Gtk.main_quit }
fontsel.ok_button.signal_connect("clicked") do
  puts fontsel.font_selection.font_name
  Gtk.main_quit
end
Gtk.main

★「リスト? gtkfontsel.rb」

gtkfontsel.png ★「図? gtkfontsel.rb によるフォント選択ダイアログ」

また、nautilus がインストールされている環境では

$ nautilus fonts:///

とすればちょっとしたプレビューとともに一覧できる。

nautilus.png ★「図? nautilus によるフォントプレビュー」

さらに、新しいフォントファイルをこの 'fonts:///' のウィンドウにドラッグ・アンド・ドロップすれば GUI でフォントの追加インストールができる (実際は ~/.fonts ディレクトリにコピーされる)。

Xft フォントシステムの設定

システム全般でのデフォルト設定は /etc/fonts/fonts.conf にあるが、fontconfig-2.2.1 以降ではこのファイルを直接編集せず、その中で include されている /etc/fonts/local.conf を編集するか、ユーザ毎に ~/.fonts.conf を編集し設定をオーバーライドする。

fonts.conf、local.conf、 ~/.fonts.conf のファイルフォーマットは XML で、例えば

<dir>/usr/share/fonts</dir>

の様にタグで囲んで記述を行なう。

XML や HTML を編集したことのある人であれば簡単に編集できるだろう。DTD (Document Type Definition) が /etc/fonts/fonts.dtd としてインストールされている筈なので、そちらを一読されることをお奨めする。

fontconfig には設定できる項目が多数あり、紙面の都合上全部を網羅することは出来無いが、その中で、ユーザが好みにより変更したくなるであろうと思われるものについて簡単な例を挙げて説明したいと思う。プロパティやその型,値について詳しくは man 5 fonts-conf と /etc/fonts/fonts.dtd を参照していただきたい。

dir

dir はフォントのあるディレクトリを指定する要素である。fontconfig は dir で指定されたディレクトリ内を再帰的に走査し、フォントのリストを得る。

例
<dir>/usr/X11R6/lib/X11/fonts</dir>
<dir>/usr/share/fonts</dir>
<dir>~/.fonts</dir>

root 権限のないユーザがフォントを追加したい時は ~/.fonts に追加すれば良いだろう。もしそれ以外の場所へフォントをインストールした場合はそのディレクトリを追加すれば良い。

例
<dir>/usr/X11R6/lib/X11/fonts</dir>
<dir>/usr/share/fonts</dir>
<dir>~/.fonts</dir>
<dir>/mnt/data/fonts</dir> ← 追加したディレクトリ
alias

alias は総称ファミリー名と実際のフォント名を結びつける。

例えば serif というファミリー名に対して 'Century Schoolbook L'、'DFPHSMincho-W3' を使いたい場合、

<alias>
  <family>serif</family>
  <prefer>
    <family>Century Schoolbook L</family>
    <family>DFPHSMincho-W3</family>
  </prefer>
</alias>

の様に記述しておくとそれらのフォントが serif として利用されるようになる。

match

match は font あるいは pattern に対しマッチングを行なう。

ある条件にマッチしたらプロパティの値を変更するという設定を行ないたい場合、例えば、フォントがあるサイズ以下なら埋め込みビットマップを使いたいという時など、match を利用すると良い。

以下の例では font に対し、pixelsize が 16pixel 以下、フォントファミリーが Kochi Mincho、Kochi Gothic なら埋めこみビットマップフォントを利用してアンチエイリアスを無効にしている。

<match target="font">
  <test name="pixelsize" compare="less_eq">
    <double>16</double>
  </test>
  <test name="family" compare="eq">
    <string>Kochi Mincho</string>
    <string>Kochi Gothic</string>
  </test>
  <edit name="embeddedbitmap" mode="assign">
    <bool>true</bool>
  </edit>
  <edit name="antialias" mode="assign">
    <bool>false</bool>
  </edit>
</match>

screenshot.png ★「図1 mozilla でのレンダリング例 (Kochi Gothic では font-size 16 以下が埋め込み bitmap となっている)」

まず match target="font" で font をターゲットにしている。

<test name="pixelsize" compare="less_eq"> で検査するプロパティの値を pixelsize、条件を less_eq とし、pixelsize プロパティの型が double であるため <double>16</double> という指定を行ない 16pixel 以下にマッチするか検査している。表??に compare で指定できる関係名を示した。

★ 表?? compare

関係名 意味
eq 等価
not_eq 不等価
less より小さい
less_eq 以下
more より大きい
more_eq 以上
contains 含む
not_contains含まない

そして次の <test name="family" compare="eq"> で family プロパティが指定した値と同じであるかを条件としている。

その下でマッチした時に行ないたい変更を edit で指定している。mode の値 assign はその値で置き換える。表?? に mode で指定できる変更方法を示した。

★ 表?? mode

変更方法 意味
assign その値で現在の値を置き換える。
assign_replaceその値で現在の全ての値を置き換える。
prepend その値をマッチした値の前へ追加する。
append その値をマッチした値の後ろへ追加する。
prepend_first その値を現在の値のリストの先頭へ追加する。
append_last その値を現在の値のリストの最後へ追加する。
<edit name="プロパティ名" mode="変更方法">
  <プロパティの型>プロパティの値</プロパティの型>
</edit>

と憶えておくとよいだろう。

プロパティ名

設定ファイルで使用できるフォントプロパティの一覧を表?? に示した。

★ 表?? フォントプロパティの一覧

プロパティ名 説明
family String フォントファミリ名。
style String weight と slant の両方を表す文字列。
slant Int 文字の傾き。
weight Int 線の太さ。
size Double ポイントサイズ。
aspect Double ヒント適用前のグリフの横幅。
pixelsize Double ピクセルサイズ。
spacing Int 文字間隔。
foundry String フォント作成者名。
antialias Bool グリフをアンチエイリアスするかどうか。
hinting Bool ヒント情報を使用するかどうか。
verticallayoutBool 垂直レイアウトを使用するかどうか。
autohint Bool freetype の自動ヒント生成機能を使用するかどうか。
globaladvance Bool フォントの大域的な幅情報を使用するかどうか。
width Int 文字の横方向の広さ。
file String フォントファイル名。
index Int フォントのファイル内のインデックス値。
ftface FT_Face使用する FreeType? のフェースオブジェクト。
rasterizer String 使用するラスタライザ。
outline Bool グリフがアウトラインかどうか。
scalable Bool グリフがスケーラブルかどうか。
scale Double ポイントサイズからピクセルサイズへ変換するためのスケールファクタ。
dpi Double DPIの値。
rgba Int サブピクセルの配置を指定。
minspace Bool 行間の最小値を使用するかどうか。
source String "X11" か "FreeType?" のどちらか (現在は "FreeType?" のみ)。
charset CharSet?エンコードされている Unicode の文字。
lang String フォントがサポートする言語のリスト。
fontversion Int フォントのバージョン。
charwidth Int 文字の幅。
charheight Int 文字の高さ。
matrix Matrix グリフに適用するアフィン変換行列。

これらプロパティのうち、slant, weight, width, spacing, および rgba に ついては、それぞれ表??〜??で指定した定数名を、整数値の代わりに使用でき る。定数名は

<const>定数名</const>

の様に使用する。

rgba プロパティは、サブピクセルレンダリングの設定に用いる。 サブピクセルレンダリングは、指定したサブピクセルの配置が実際の液晶での配置と異なっていると、文字がにじんだように見えてしまい通常のアンチエイリアスよりもかえって見栄えが悪くなってしまうので注意が必要である。 液晶のサブピクセルの配置は、DVI ケーブル接続の液晶モニタや最近のノートパソコンでは、その配置を検出することができる。

$ xdpyinfo -ext RENDER | grep sub-pixel

と実行してみて

    Screen 0 (sub-pixel order Horizontal RGB)

のように出力されたら、自動的に適切なサブピクセルレンダリングが有効になるよう設定される。

残念ながら

    Screen 0 (sub-pixel order Unknown)

と出力されてしまったら、原始的だが液晶をルーペ等で拡大して直接目で確認するしかない。例えばその結果が「水平方向に赤緑青の順」であれば、

<match target="font">
    <edit name="rgba" mode="assign">
        <const>rgb</const>
    </edit>
</match>

と手動で設定する。

matrix プロパティは、グリフの形状を変形するために用いる。例えば、ある ファミリのオブリーク体を要求されたが、フォントとしてはローマン体しか存 在ていない場合、次のような設定をしておくことで、擬似的に傾いた書体を提 供できる。

<match target="font">
  <test name="slant">
    <const>roman</const>
  </test>
  <test target="pattern" name="slant" compare"not_eq">
    <const>roman</const>
  </test>
  <edit name="matrix" mode="assign">
    <times>
      <name>matrix</name>
      <matrix>
        <double>1</double> <double>0.2</double>
        <double>0</double> <double>1</double>
      </matrix>
    </times>
  </edit>
  <edit name="slant" mode="assign">
    <const>oblique</const>
  </edit>
</match>

matrix プロパティでは、文字の傾き (slant) の変更の他、文字の横方向の広 さ (width) の変更を行う事もできる。また、使い道があるかどうかは不明で あるが、文字の高さの変更、文字の左下を中心とした回転、などにも対応でき る。アフィン変換の性質から、線の太さを変更することはできない。

★ 表?? slant プロパティで使用できる定数名とその値

定数 説明
roman 0ローマン体
italic 100イタリック体
oblique110オブリーク体

★ 表?? weight プロパティで使用できる定数名とその値

定数名 説明
thin 0極細い
extralight 40
ultralight 40
light 50細い
regular 80
medium 100普通
demibold 180
semibold 180
bold 200太い
extrabold 205
ultrabold 206
black 210極太い

★ 表?? width プロパティで使用できる定数名とその値

定数 説明
ultracondensed 50狭い
extracondensed 63
condensed 75
semicondensed 87
normal 100普通
semiexpanded 113
expanded 125
extraexpanded 150
ultraexpanded 200広い

★ 表?? spacing プロパティで使用できる定数名とその値

定数 説明
proportional 0グリフによって文字幅が異なる。
mono 100全てのグリフの幅が同じ。
charcell 110...

★ 表?? rgba プロパティで指定できる定数名とその値

定数 説明
unknown 0不明。
rgb 1左から RGB の順で並んでいる。
bgr 2左から BGR の順で並んでいる。
vrgb 3上から RGB の順で並んでいる。
vbgr 4上から BGR の順で並んでいる。
none 5サブピクセルレンダリングを使用しない。

X Server part

X Server Part と次の X Font Server Part では、コアフォントシステムが用いられるので、まずはそこから解説する。

フォントの確認

コアフォントシステムで使えるフォントの一覧を取得するには xlsfonts を実行する。

-shinonome-gothic-medium-r-normal--12-110-75-75-c-120-jisx0208.1983-0
-shinonome-gothic-medium-r-normal--12-110-75-75-c-120-jisx0208.1990-0
-shinonome-gothic-medium-r-normal--12-110-75-75-c-60-jisx0201.1976-0
-shinonome-gothic-medium-r-normal--12-110-75-75-p-120-jisx0208.1983-0
-shinonome-gothic-medium-r-normal--12-110-75-75-p-120-jisx0208.1990-0
-shinonome-gothic-medium-r-normal--14-130-75-75-c-140-jisx0208.1983-0
-shinonome-gothic-medium-r-normal--14-130-75-75-c-140-jisx0208.1990-0
-shinonome-gothic-medium-r-normal--14-130-75-75-c-70-jisx0201.1976-0
-shinonome-gothic-medium-r-normal--16-150-75-75-c-160-jisx0208.1983-0
-shinonome-gothic-medium-r-normal--16-150-75-75-c-160-jisx0208.1990-0
-shinonome-gothic-medium-r-normal--16-150-75-75-c-80-jisx0201.1976-0

★「リスト? xlsfonts の出力例 (一部)」

GUI でフォントの一覧を眺めるには xfontsel を実行する。

★「図 xfontsel 実行例」 xfontsel.png

'-fndry-fmly-...' と並んでいるメニューから、XLFD のそれぞれの項目を設定すると、その条件にマッチするフォントの数が右上に表示され、その中で最初にマッチするフォントが下のフィールドに表示される。

希望のフォントが表示されたら、左上の 'select' を押せば設定した XLFD がクリップボードにコピーされる。

そして、選んだフォントのグリフを眺めるには、'xfd -fn fontname' を実行する。 ここでは先程クリップボードにコピーした XLFD を用いてみる。

xfd -fn '-*-*-medium-r-*-*-16-*-*-*-*-*-jisx0208.1990-*'

★「図 xfd 実行例」 xfd.png

フォントの設定

コアフォントシステムでは、XLFD (X Logical Font Description) という記述形式でフォントを管理している。 XLFD は、以下に示す項目で構成される。

fndry
フォント作成者 (例:adobe)
fmly
フォントファミリー (例:helvetica)
wght
太さ (例:medium, bold 等)
slant
傾き (例:r = roman, i = italic , o = oblique 等)
sWdth
単位あたりの幅 (例:normal, condensed 等)
adstyl
スタイルに関する情報 (例:serif, sans 等)
pxlsz
文字の大きさ。文字の縦方向のピクセルサイズ
ptSz
テキストのおおよそのポイントサイズを 10 倍したもの
resx
水平方向の解像度 (単位:dpi)
resy
垂直方向の解像度 (単位:dpi)
spc
文字間隔 (例:m = monospace, c = charcell, p = propotional)
avgWidth
全文字の幅の平均
rgstry
登録した組織もしくは標準名 (例:iso8859, jis0208.1990 等)
encdng
文字セットのエンコーディング

なお、スケーラブルフォントでは pxlsz, ptSz, resx, resy, avgWidth に 0 を指定する。

フォントが置かれるディレクトリ毎に、そこに含まれるフォントの XLFD を同じディレクトリの fonts.dir というファイルに記述することで、コアフォントシステムでフォントを使えるようになる。

[A] ビットマップフォント (BDF 形式または PCF 形式) の場合 テキストファイルである BDF 形式のフォントは、ヘッダ部分に

FONT -Shinonome-Gothic-Medium-R-Normal--16-150-75-75-C-160-JISX0208.1990-0

のように XLFD 情報を持っており、PCF 形式に変換後ももちろん保持している。 そのため、BDF 形式や PCF 形式の fonts.dir を作成するのは容易で、

mkfontdir [フォントディレクトリ]

を実行するだけである。作成される fonts.dir は以下のようなフォーマットになっている。

[フォント数]
[フォントファイル名] [フォントの XLFD]
[フォントファイル名] [フォントの XLFD]
…

[B] TrueType? フォントの場合 TrueType? 形式のフォント用の fonts.dir を作成するには、

  • mkttfdir.pl を用いる
  • ttmkfdir を用いる
  • mkfontscale を用いる (XFree86 に付属)
  • esemkfontdir を用いる

等、さまざまなツールがあるが、いずれにしても BDF 形式の場合と違って全自動で適切な XLFD を作るのは無理がある。

ここでは日本語 TrueType? を扱うのに便利な esemkfontdir について紹介する。

$ wget http://sickhack.homelinux.org/linux/XdeTT/esemkfontdir.pl.txt
$ mv esemkfontdir.pl.txt esemkfontdir
$ chmod +x esemkfontdir
$ sudo cp esemkfontdir /usr/bin/

使用例

(ヘルプの表示)
$ esemkfontdir -h

(fndry を Kochi、fmly を Mincho で fonts.dir を作成/追加)
$ esemkfontdir -v Kochi -n Mincho -o fonts.dir -f kochi-mincho-subst.ttf
create entries "Mincho" for kochi-mincho-subst.ttf
done

$ cat fonts.dir
12
kochi-mincho-subst.ttf -Kochi-Mincho-medium-r-normal--0-0-0-0-c-0-iso8859-1
kochi-mincho-subst.ttf -Kochi-Mincho-medium-r-normal--0-0-0-0-c-0-iso8859-7
kochi-mincho-subst.ttf -Kochi-Mincho-medium-r-normal--0-0-0-0-c-0-jisx0201.1976-0
kochi-mincho-subst.ttf -Kochi-Mincho-medium-r-normal--0-0-0-0-c-0-jisx0208.1983-0
kochi-mincho-subst.ttf -Kochi-Mincho-medium-r-normal--0-0-0-0-c-0-jisx0208.1990-0
kochi-mincho-subst.ttf -Kochi-Mincho-medium-r-normal--0-0-0-0-c-0-jisx0212.1990-0
ds=y:kochi-mincho-subst.ttf -Kochi-Mincho-bold-r-normal--0-0-0-0-c-0-iso8859-1
ds=y:kochi-mincho-subst.ttf -Kochi-Mincho-bold-r-normal--0-0-0-0-c-0-iso8859-7
ds=y:kochi-mincho-subst.ttf -Kochi-Mincho-bold-r-normal--0-0-0-0-c-0-jisx0201.1976-0
ds=y:kochi-mincho-subst.ttf -Kochi-Mincho-bold-r-normal--0-0-0-0-c-0-jisx0208.1983-0
ds=y:kochi-mincho-subst.ttf -Kochi-Mincho-bold-r-normal--0-0-0-0-c-0-jisx0208.1990-0
ds=y:kochi-mincho-subst.ttf -Kochi-Mincho-bold-r-normal--0-0-0-0-c-0-jisx0212.1990-0

後半の 'ds=y' というのは、'xtt' モジュールが提供する TTCap と呼ばれる X の TrueType? 拡張の機能で、'Key=Value' の組合せを ':' で区切ってフォントファイル名の前に記述する。 以下に、代表的なオプションを紹介する。

  • Face Number (fn=整数)

TrueType? Collection (*.ttc) フォントファイルで用いる face 番号。

  • Scale Width (sw=実数)

文字幅の倍率を指定する。無指定時は 1.0 になる。

★「図 sw=0.8 の例」 TTCap-sw.png

  • Auto Italic (ai=実数)

文字の傾きを指定する。無指定時は 0.0 になる。

★「図 ai=0.2 の例」 TTCap-ai.png

  • Double Strike (ds=y または n)

ずらして重ね表示することで疑似的に太字に見せるかどうか。無指定時は n になる。

★「図 ds=y の例」 TTCap-ds.png

なお、今のところ TTCap 拡張が使えるのは XF86Config? に直接フォントパスを指定している場合のみで、xfs 経由では使えない。

[C] CID フォントの場合 まず、CID Postscript フォントを扱うのは xft では簡単だが、XFree86 ではかなり面倒になる。ここでは ftp://ftp.oreilly.com/pub/examples/nutshell/ujip/adobe/samples/ で配布されているサンプルフォントのうち、WadaGo-Bold を例に紹介する。

1. 上記のサイトから、フォントファイル WadaGo?-Bold とその AFM (Adobe Font Metric) ファイル WadaGo?-Bold.afm を取得する。

2. Adobe-Japan1 の CMap ファイルを ftp://ftp.oreilly.com/pub/examples/nutshell/ujip/adobe/aj15.tar.Z から取得する。

3. /usr/X11R6?/lib/X11/fonts/CID の下に、以下のディレクトリを作る。

Adobe-Japan1/AFM/
Adobe-Japan1/CFM/
Adobe-Japan1/CIDFont/
Adobe-Japan1/CMap/

4. WadaGo?-Bold を CIDFont/ に、WadaGo-Bold.afm を AFM/ に、展開した CMap ファイルのうち Adobe-Japan1-0 を CMap/ にそれぞれコピーする。

5. /usr/X11R6?/lib/X11/fonts/CID の下に、以下のようなの内容の fonts.dir を作る。 フォント定義の第一カラムはフォントファイル名ではなく、フォントの PostScript? 名に '.cid' をつけたものとなるのに注意。

1
Adobe-Japan1/WadaGo-Bold--Adobe-Japan1-0.cid -misc-wadago-bold-r-normal--0-0-0-0-p-0-adobe.japan1-0

6. /usr/X11R6?/bin/mkcfm を実行する。

これでようやく準備完了。 最終的に /usr/X11R6?/lib/X11/fonts/CID の中は以下のようなファイル構成になる。

fonts.dir
Adobe-Japan1/CMap/Adobe-Japan1-0
Adobe-Japan1/CIDFont/WadaGo-Bold
Adobe-Japan1/AFM/WadaGo-Bold.afm
Adobe-Japan1/CFM/WadaGo-Bold--Adobe-Japan1-0.cfm

フォントの置き場所

X Server Part で使えるフォントの置き場所は XFree86 の設定ファイル (通常 /etc/X11/XF86Config?) の Files セクションで、

        FontPath "/usr/X11R6/lib/X11/fonts/75dpi/:unscaled"
        FontPath "/usr/X11R6/lib/X11/fonts/100dpi/:unscaled"
        FontPath "/usr/X11R6/lib/X11/fonts/misc/:unscaled"
        FontPath "/usr/X11R6/lib/X11/fonts/TTF"
        FontPath "/usr/share/fonts/default/Type1"

のようにディレクトリ名を列挙する。 Xft フォントシステムと異なり、指定されたディレクトリの下位ディレクトリを再帰的に走査はしないので注意。

また、必要に応じて Module セクションに

        Load  "xtt"

        Load  "freetype"

を指定する必要がある。 前者は TTCap 拡張 つきの TrueType? フォントサポートを提供し、後者は Type 1 フォント、TrueType フォント (TTCap 拡張なし)、OpenType フォントのサポートを提供する。

なお、コアフォントシステムはアンチエイリアスやサブピクセルレンダリングには対応していない。

フォントの別名

XLFD での記述はあまりに複雑すぎるが、フォントの別名を使ってもっと簡単な名前を付けることができる。 フォントに別名を付けるには、fonts.dir と同じディレクトリに、

[別名] [XLFD]

という書式で fonts.alias というファイルを置く。例えば /usr/X11R6?/lib/X11/fonts/misc/fonts.dir に

k14 -misc-fixed-medium-r-normal--14-*-*-*-*-*-jisx0208.1983-0

という行があれば、これは 'k14' というフォント名で '-misc-fixed-medium-r-normal--14-*-*-*-*-*-jisx0208.1983-0' という XLFD のフォントを使える。

X Font Server Part

X Font Server Part は X Server Part の下位に位置するので、まず X Server が X Font Server Part のフォントを参照できるように、XFree86 の設定ファイル (通常 /etc/X11/XF86Config?) の Files セクションで、

        FontPath "unix/:-1" # xfs が同じマシンで動いている場合

もしくは

        FontPath "tcp/servername:7100" # xfs が別のマシンで動いている場合

のように xfs の接続先を指定する。

X Font Server Part で使えるフォントの置き場所は xfs (X Font Server) の設定ファイル (通常 /etc/X11/fs/config) で

catalogue = /usr/X11R6/lib/X11/fonts/75dpi/:unscaled",
            /usr/X11R6/lib/X11/fonts/100dpi/:unscaled",
            /usr/X11R6/lib/X11/fonts/misc/:unscaled"

のようにディレクトリ名を列挙する。 こちらも X Server Part と同様に、指定されたディレクトリの下位ディレクトリを再帰的に走査はしない。

なお、現在の XFree86-4.3 の xfs は TTCap 拡張をサポートしていないので、xfs 経由で TrueType? フォントを使う際は、XFree86 の設定ファイルの Module セクションで

        Load  "freetype"

を指定する必要がある。

X Font Server を使うメリットとデメリットを整理すると次のようになる。

  • メリット
    • X Font Server は X Server と違ってフォントレンダリングを並列処理できるので、大きなフォントをレンダリングする際に動作が止まらない。
    • フォントを集中管理できる。
  • デメリット
    • 描画するフォントについて、X Server と X Font Server の両方でメモリを使うためメモリ負荷が高い
    • TTCap 拡張が使えない。

なお、デメリットのうち TTCap 拡張については XFree86-4.4 では使えるようになる予定である。詳しくは「コラム XFree86 のバージョンによる違い」を参照のこと。

まとめ

'Client Application Part' と 'X Server Part' と 'X Font Server Part' の三つに分けて、X Window System でどのようにフォントが扱われているかを紹介した。

すでに述べたように、これらの三つのパートはそれぞれ独立している、例えば A というマシンの X Server で、B というマシンで走っている X Font Server も利用するようになっていて、その環境で C というマシンにある Xft を用いるアプリケーションを使う場合、A および B のコアフォントシステムのフォントと C の Xft フォントシステムのフォントが使える。 ただし、A および B のフォントはアンチエイリアスをサポートしていない、B のフォントは TTCap 拡張が使えない、といった制限がそれぞれあるので注意が必要である。

デスクトップ環境のこれから

XFree86 に替わるプロジェクトとして、Xft2 や fontconfig を作った Keith Packard さんの率いる freedesktop.org *11 がある。 freedesktop.org は、xmkmf ではなく autotools を使っていて、各ライブラリ毎に分離されているのが特徴である。 さらに Xouvert *12 というまた別の X Server の実装もある。

フォントレンダリングのフレームワークには、Xft2 とは別のアプローチを取る Standard Type Services Framework (STSF) *13 がある。 STSF は、Sun Microsystems 社が開発して BSD ライセンスで公開している。 今のところ、対応する X Server が古いとか、対応するアプリケーションが少ないとかの理由もあってあまり普及していないが、その設計思想はとても興味深い。

今のところは XFree86 と Xft2 の組合せがデファクトスタンダードであるが、今後のデスクトップ環境がどうなるかはまだまだ流動的である。


コラム「CHISE プロジェクトの紹介」

守岡 知彦 (CHISE Project <http://www.kanji.zinbun.kyoto-u.ac.jp/projects/chise/>・京都大学人文科学研究所')

今の計算機環境では文字はフォントで表示するのが普通 だろう。だからこそフォントが重要なのだが、筆者は実 はこの仕組に少し不満を持っている。この不満は要約す ると

  1. 同じエンコーディングでも、あるコードポイントに対してしばしば異なる字形が出てきたりする (『字体化け』)
  2. 自分が使いたい文字レパートリとフォントが収録するグリフレパートリがしばしば一致せず、複数のフォントを使い分けなければならない (そして、大抵、それらはデザインが不一致である)
  3. フォントにない文字は表示できない (あたりまえ)

の3点に要約できる。これはつまるところ符号化文字層 とグリフ層*14が分離されている上、フォントがフォン トやグリフに関するメタデータを十分な形で持っていな いか、持っていてもそれがアプリケーションで利用でき ないのが原因だと思われる。そうであれば、フォントや グリフに関するメタデータを揃え、それらを利用するた めのインターフェースを用意すれば良いといえる。また、 3. は無理な注文ではあるが、漢字に限定していえば、 多くの漢字が部品の組合せで成り立っていることを考え れば、部品合成に基づく漢字字形合成システムによって ある程度解決することができるといえる。

筆者らは数年前から CHISE project で文字オントロジー に基づく文字処理技術を開発している。現在、基本ライ ブラリ libchise やスクリプト言語用バインディングの Ruby/CHISE*15, Perl/CHISE や文書編集系 XEmacs CHISEに よって曲がりなりにも文字オントロジーを操作するため の基本機能を実現し、必要に応じて文字を定義すること も可能になっている。ただ、文字表示に関しては既存の フォントを利用しており、フォントがないとせっかく定 義した文字も表示できない。また、CHISE の文字データ ベースを参照する組版・印刷システムも必要である。こ のようなことから漢字字形合成システム KAGE*16 を開発し ている上地氏を仲間に引き込むとともに、多言語 TeX のひとつである Ω を利用した Ω/CHISE の開発を行っ ている。これにより Ω/CHISE では KAGE を利用した漢 字字形合成機能が利用できるようになり、3. の不満を 解決する目処も立ってきた。実用的な観点でいえば、 KAGE の部品字形やその他データが足りず、また、CHISE の文字データベースとの統合も十分ではなく、まだまだ 問題はあるが、こうしたことはデータ整備で解決可能な 問題であるといえる。また、将来的には組版・印刷 だけでなく、ディスプレー・エンジンをこうした CHISE 的な枠組で置き換えて行くことが重要である。このため、 産総研で開発している m17n ライブラリとの統合を検討 している。このような取り組みは一見回り道をしている ように見えるかも知れないが、より自由に文字を扱うた めに本質的に必要なことだと思っている。もし、こうし た取り組みに興味を持たれたなら、是非、CHISE project に参加して頂きたい。

kage.png ★「図? KAGE によるフォントの自動生成のサンプル―様々な異形 (異体) の用意された漢字部品を組み合わせて自由な作字が可能」


コラム「XFree86 のバージョンによる違い」

今回の特集では、執筆時点の最新リリースである XFree86-4.3.0 について解説したが、XFree86 のバージョンによるフォント関連の違いについて、簡単に紹介する。

XFree86-4.0.1 〜 4.0.3

  • TrueType? フォントのサポート (バックエンドは 'freetype' モジュールを使う xfsft と、'xtt' モジュールを使う X-TrueType? の二つ)
  • CID フォントのサポート
  • アウトラインフォントのバックエンドの国際化
  • Unicode (ISO 10646) のサポート

XFree86-4.1 〜 4.2.1

  • Xft1 の採用。設定ファイルは /etc/X11/XftConfig? で、キャッシュの操作は xftcache を用いる。

XFree86-4.3

  • Xft2 の採用。設定ファイルは /etc/fonts/fonts.conf で、キャッシュの操作は fc-cache を用いる。
  • X-TrueType? の安定化。

XFree86-4.4

(2004 年初めにリリース予定)

  • After X-TT Project*17 による 新しい FreeType? バックエンド (libfreetype-xtt2) の採用

この新しい FreeType? バックエンドでは、X-TrueType? バックエンドの TTCap 拡張が使えるようになるので、xfs でも TTCap が使えるようになる。また、従来の X-TrueType? よりも高速化がなされている。


★「表? 主なアプリケーションが使用するフォントサブシステム」

アプリケーション名サブシステムアンチエイリアスの可否
emacs, xemacsXlib不可
tgifXlib不可
sylpheedXlib不可
mozillaXft2
konquerorXft2
OpenOffice?.orgfreetype2
gnumericXft2
WindowMaker?Xlib不可
XFce4Xft2
fluxboxXft2
xpdffreetype2
ghostscript自前

注) 使用するサブシステムはコンパイル時の設定によって異なるものもある。


コラム「主な環境のシステムフォントの設定」

(以下、Fedora Core 1 の話、と一応断っておいたほうがいいと思います)

○ GNOME のシステムフォントの設定

左下のメニューから、個人設定 -> フォント と進んで設定する。

コマンドラインから起動するなら、 $ gnome-font-properties

gnome1.png gnome2.png

○ KDE のシステムフォントの設定

左下のメニューから、コントロールセンターを選び、「外観 & テーマ」の中のフォントを選ぶ。

コマンドラインから起動するなら、 $ kcontrol

kde1.png kde2.png

○ kterm のフォントの設定 デフォルトのフォントリストは /usr/X11R6?/lib/X11/app-defaults/KTerm で指 定されてあり、

*VT100*fontList:        -*-fixed-medium-r-normal--14-*,\
                        -*-gothic-medium-r-normal--14-*,\
                        -*-mincho-medium-r-normal--14-*

のようになっている。これを例えば 12 ドットのフォントサイズにするには ~/.Xresources に

KTerm*fontList: -*-fixed-medium-r-normal--12-*,\
                -*-gothic-medium-r-normal--12-*,\
                -*-mincho-medium-r-normal--12-*

と書けば、次回 X 起動時に反映される。すぐに反映させるなら

$ xrdb -merge ~/.Xresources

を実行すればよい。その他、コマンドラインからもフォントを指定することができる。詳しくは 'man kterm' を見て欲しい。

(コマンドライン指定も詳しく書いた方がよいですか?)

○ GTK+-1.2 系アプリケーション (例:sylpheed) のシステムフォントの設定 日本語環境のデフォルトフォントは /etc/gtk/gtkrc.ja で指定されてあり、

style "gtk-default-ja" {
       fontset = "-adobe-helvetica-medium-r-normal--14-100-100-100-p-76-iso8859-1,\
                  -ricoh-ms mincho-medium-r-normal--14-*-*-*-*-*-jisx0208.1983-0,\
                  -misc-fixed-medium-r-normal--14-*-*-*-*-*-jisx0208.1983-0,\
                  *-r-*"
}
class "GtkWidget" style "gtk-default-ja"

のようになっている。 自分の好みの設定に変更するには、そのファイルを ~/.gtkrc にコピーして、fontset の項に使いたいフォントの XLFD を優先順に列挙すればよい。

Last modified:2011/11/06 11:46:06
Keyword(s):
References:[unixuser200403]

*1 電子書体オープンラボ他。http://www.fdiary.net/

*2 Momonga Project http://www.momonga-linux.org/

*3 Momonga Project・『肝臓の病気』サイト http://sickhack.homelinux.org/ 主宰

*4 よく使われるパターンを集めたライブラリで、例えばボタンやスクロールバーといったウィジェット (部品) などが定義されている。

*5 http://www.gtk.org/

*6 http://www.pango.org/ なお Pango という名は「全て」を意味するギリシャ語の Παν と日本語の「語」を合わせたものである。

*7 GTK+ Drawing Kit

*8 Xft サブシステムは XFree86 <http://www.xfree86.org/> による機能であり、XFree86 ベースではない X Window System 実装では含まれていないかもしれない。

*9 http://www.trolltech.com/products/qt/ KDE などで用いられている toolkit。なお、「KDE のフォント環境をさらに充実されよう」<http://www.kde.gr.jp/~akito/xft/patch_xft.html> も是非参照のこと。

*10 http://ruby-gnome2.sourceforge.net/

*11 http://freedesktop.org/

*12 http://www.xouvert.org/

*13 http://stsf.sourceforge.net/

*14 グリフも抽象グリフ・字体と具象グリフ・字形に別けて考える必要がある場合がある。

*15 http://eto.com/2003/ruby/

*16 http://fonts.jp/?KAGE

*17 http://x-tt.sourceforge.jp/