FontConfigことはじめ
2014/01/24
babatakao@BPS
FontConfigとは
• フォントを決めたりするやつ
• アプリにフォント設定を提供する
• 設定機能
• マッチング機能

• コマンド
•
•
•
•
•
•
•

fc-cache
fc-cat
fc-list
fc-match
fc-pattern
fc-query
fc-scan

• フォントファイルのパースはFreeTypeに依存
使い方
• アプリから
• #include <fontconfig/fontconfig.h>
• FcPattern * FcFontSetMatch(FcConfig *config, FcFontSet
**sets, intnsets, FcPattern *pattern, FcResult *result);

• ユーザ
• fonts.confファイルで設定
• fc-listやfc-matchで確認・デバッグ

アプリによらず、フォントを一元管理できる
コマンド
• fc-list
• インストールされているフォントが出てくる

• fc-cache
• フォントファイルをスキャンしてキャッシュを更新
• /var/cache/fontconfig
• ~/.cache/fontconfig

• fc-query /path/to/font.otf
• フォント情報を詳細に表示

• fc-match
• 条件に一致するフォントを取得
とりあえず遊んでみる
fc-match
• fc-match
• fonts-japanese-gothic.ttf: "Takao Pゴシック" "Regular“
• → デフォルトフォント

• fc-match serif
• fonts-japanese-mincho.ttf: "Takao P明朝" "Regular“

• fc-match IPAex明朝
• ipaexm.ttf: "IPAex明朝" "Regular“

• fc-match hoge
• fonts-japanese-gothic.ttf: "Takao Pゴシック" "Regular“
• → 存在しないフォントはデフォルトになる

• fc-match ipaexm.ttf
• fonts-japanese-gothic.ttf: "Takao Pゴシック" "Regular“
• → フォントファイル名では指定できない
設定ファイル
http://www.freedesktop.org/software/fontconfig/fontconfig-user.html
• /etc/fonts/fonts.conf
• /etc/fonts/fonts.dtd
• /etc/fonts/conf.d
• $XDG_CONFIG_HOME/fontconfig/conf.d
• $XDG_CONFIG_HOME/fontconfig/fonts.conf
• ~/.fonts.conf.d
• ~/.fonts.conf
/etc/fonts/fonts.conf
<!-DO NOT EDIT THIS FILE.
IT WILL BE REPLACED WHEN FONTCONFIG IS UPDATED.
LOCAL CHANGES BELONG IN 'local.conf'.
…
-->

和訳: 編集すると楽しそう
/etc/fonts/fonts.conf
<?xml version="1.0"?>
<!DOCTYPE fontconfig SYSTEM "fonts.dtd">
<fontconfig>
</fontconfig>
/etc/fonts/fonts.conf
~/.fonts.conf
<?xml version="1.0"?>
<!DOCTYPE fontconfig SYSTEM "fonts.dtd">
<fontconfig>
<match target="pattern">
<edit name="family" mode="assign" binding="strong">
<string>RiiTegakiN</string>
</edit>
</match>
</fontconfig>
~/.fonts.conf
マッチングと設定
デフォルト設定ファイルと動作の仕組みを見てみよう
仕組み
• /etc/fonts.confが読まれる
• <dir>
• フォント読み込みパス

• <include>
• 別のconfファイルを読み込む
• /etc/fonts/conf.d読み込み
• 50-user.confが~/.fonts.conf読み込み

• <match>
• マッチング設定
• フォント属性設定
フォントの属性
property

type

description

family

string

ファミリー名

antialias

bool

アンチエイリアス対応

hinting

bool

自動ヒンティング対応

hintstyle

int

自動ヒンティングスタイル

outline

bool

アウトラインフォント

weight

int

light, medium, bold, …

• 他にも色々ある
• <edit>で上書きできる
• 独自で定義できる
マッチング
• fc-matchコマンドやAPIから「パターン」を指定する
• 指定パターンと全フォントの「距離」を計算し、最も近いもの
が返る
• 存在しないフォントを指定しても、何かしら近いものが返る
• システムフォントが存在する限り、nullにはならない

• 指定パターンは事前に<edit>により変更される
• 結果には、フォントファイル名・ピクセルサイズ・アンチエイ
リアス有無など、レンダリングエンジンに渡せるデータが含ま
れる
マッチング
• マッチングは2パス実行
• 1回目
• どのフォントを使うか決める

• 2回目
• レンダリング用のフォント属性を決める
match, test, edit
• matchの中にtest, editを書く
• testの条件に一致する場合、editが適用される
• <edit mode=“assign”>
• assign: 置き換える
• prepend: 先頭に挿入
• append: 末尾に挿入

• <edit binding=“strong”>
• strong
• weak
• same
match, test, edit
<!-- /etc/fonts/conf.d/10-antialias.conf -->
<match target="font">
<edit name="antialias" mode="assign"><bool>true</bool></edit>
</match>
全フォントに、無条件で「アンチエイリアス=true」をセットしてい
る
match, test, edit
<!-- /etc/fonts/conf.d/69-language-selector-ja-jp.conf -->
<match target="pattern">
<test qual="any" name="family">

<string>serif</string>
</test>
<edit name="family" mode="prepend" binding="strong">
<string>Takao P明朝</string>
<string>IPA P明朝</string>
</edit>
</match>
フォントファミリー名「serif」に、具体的なフォントを割り当てている
match, test, edit
<!-- /etc/fonts/conf.d/49-sansserif.conf -->
<match target="pattern">
<test qual="all" name="family" compare="not_eq"><string>sans-serif</string></test>
<test qual="all" name="family" compare="not_eq"><string>serif</string></test>
<test qual="all" name="family" compare="not_eq"><string>monospace</string></test>
<edit name="family" mode="append_last">
<string>sans-serif</string>
</edit>

</match>

デフォルトフォントとして「sans-serif」を割り当てている
selectfont, acceptfont, rejectfont
• selectfontの中にacceptfontとrejectfontを書く
• rejectfontはブラックリスト
• ここに書かれたフォントは存在しないことになる

• acceptfontはホワイトリスト
• rejectfontより優先される
selectfont, acceptfont, rejectfont
<!-- /etc/fonts/conf.d/70-no-bitmaps.conf -->
<selectfont>
<rejectfont>
<pattern>
<patelt name="scalable"><bool>false</bool></patelt>
</pattern>
</rejectfont>
</selectfont>
ビットマップフォントは使わないように設定している
デバッグ
FC_DEBUG=1 fc-match serif
FC_DEBUG=1
簡単なmatch結果
FC_DEBUG=2
詳細なmatch結果
FC_DEBUG=4
match/editの経過
設定例
一般ユーザ編
ユーザ設定
• ~/.fonts.confを書くことで、様々なアプリのフォントを変えられ
る
•
•
•
•

自分好みの見た目にできる
アプリがフォント設定機能なくてもOK
フォントごとにアンチエイリアスなど詳細設定できる
「このシステムフォント使いたくない」が実現できる

• root権限はいらない
• Android 4.0以上でも採用されている ←嘘でした
• ちなみに~/.fonts.confはDEPRECATEDなので~/.config/fonts.confな
どを使う
全部手書きフォントにしたい
<?xml version="1.0"?>
<!DOCTYPE fontconfig SYSTEM "fonts.dtd">
<fontconfig>
<match target="pattern">
<edit name="family" mode="assign" binding="strong">
<string>RiiTegakiN</string>
</edit>
</match>
</fontconfig>
アンチエイリアスとヒンティングは嫌い
です
<?xml version="1.0"?>
<!DOCTYPE fontconfig SYSTEM "fonts.dtd">
<fontconfig>
<match target="pattern">
<edit name="antialias" mode="assign"><bool>false</bool></edit>
<edit name=“hinting" mode="assign"><bool>false</bool></edit>
</match>
</fontconfig>
IPAフォントってFreeTypeとヒンティン
グ相性悪いんだよね
<?xml version="1.0"?>
<!DOCTYPE fontconfig SYSTEM "fonts.dtd">
<fontconfig>
<test qual=“any” name=“family”>
<test target=“pattern”><string>IPAex明朝</string></test>
<test target=“pattern”><string>IPAexゴシック</string></test>
<test target=“pattern”><string>IPAmj明朝</string></test>
<edit name=“hinting" mode="assign"><bool>false</bool></edit>
</match>
</fontconfig>
特定フォントを置き換えたい
<?xml version="1.0"?>
<!DOCTYPE fontconfig SYSTEM "fonts.dtd">
<fontconfig>
<match target="pattern">
<!-- ここに書いたフォント以外は、すべてIPAexゴシックに変換されます -->
<test qual="all" name="family" compare="not_eq"><string>IPAex明朝</string></test>
<test qual="all" name="family" compare="not_eq"><string>IPAexゴシック</string></test>
<test qual="all" name="family" compare="not_eq"><string>A-OTF 新ゴ Pro</string></test>
<test qual="all" name="family" compare="not_eq"><string>モトヤLマルベリ3等幅</string></test>

<edit name="family" mode="assign" binding="strong">
<string>IPAexゴシック</string>
</edit>
</match>
</fontconfig>
許可フォント以外使わないで
<selectfont>
<rejectfont><pattern><patelt name="scalable"><bool>true</bool></patelt></pattern></rejectfont>
<rejectfont><pattern><patelt name="scalable"><bool>false</bool></patelt></pattern></rejectfont>
</selectfont>
<selectfont>
<acceptfont>
<pattern><patelt name=“family”><string>IPAex明朝</string></patelt></pattern>
</acceptfont>
<acceptfont>
<pattern><patelt name=“family”><string>IPAexゴシック</string></patelt></pattern>
</acceptfont>
</selectfont>
<match target="font">
<edit name="family" mode="append" binding="weak">
<string>IPAexゴシック</string>
</edit>
</match>
設定例
開発者編
カスタムパラメータの追加も簡単だ!
int i;
if (FcPatternGetInteger(match, “aanumgrays”, 0, &i) == FcResultMatch)
{
// process
}
-----------------------------------------------------------------------------<match target="font">
<edit name="aanumgrays" mode="assign">
<int>4</int>
</edit>
</match>
まとめ
まとめ
• ユーザの皆様
• rootなくても色々遊べて面白いよ

• 開発者の皆様
• フォントを使う処理があったら、Linux版ではFontConfigを使ってくだ
さい
• ソースコードにフォントファイル名決め打ちしないで
• 難しいフォント設定機能作らなくて良くなるよ
ところで
CSS
body {
font-family: “メイリオ”, “ヒラギノ角ゴ Pro W3”, serif;
}
▲ 優先順位は?
@font-face {
font-family: “MyFont”;
src: url(“myfont.ttf”);
unicode-range: U+0a;
}
▲ ファイル名直接指定したらどうなる?rangeはFontConfigとどう連動
する?
次回へ続く
coming soon

Fontconfigことはじめ