Successfully reported this slideshow.
We use your LinkedIn profile and activity data to personalize ads and to show you more relevant ads. You can change your ad preferences anytime.

Fontconfigことはじめ

7,052 views

Published on

2014年1月に実施した、Uniba×BPS合同勉強会で発表した資料です。

Linuxで古くから広く使われているFontConfig。
概要の説明と、具体的な使い方(設定ファイルの書き方サンプル)を見てみましょう。

Published in: Technology
  • すみません嘘書いてました。AndroidではFontConfigじゃなくて独自XML使ってました。
       Reply 
    Are you sure you want to  Yes  No
    Your message goes here

Fontconfigことはじめ

  1. 1. FontConfigことはじめ 2014/01/24 babatakao@BPS
  2. 2. FontConfigとは • フォントを決めたりするやつ • アプリにフォント設定を提供する • 設定機能 • マッチング機能 • コマンド • • • • • • • fc-cache fc-cat fc-list fc-match fc-pattern fc-query fc-scan • フォントファイルのパースはFreeTypeに依存
  3. 3. 使い方 • アプリから • #include <fontconfig/fontconfig.h> • FcPattern * FcFontSetMatch(FcConfig *config, FcFontSet **sets, intnsets, FcPattern *pattern, FcResult *result); • ユーザ • fonts.confファイルで設定 • fc-listやfc-matchで確認・デバッグ アプリによらず、フォントを一元管理できる
  4. 4. コマンド • fc-list • インストールされているフォントが出てくる • fc-cache • フォントファイルをスキャンしてキャッシュを更新 • /var/cache/fontconfig • ~/.cache/fontconfig • fc-query /path/to/font.otf • フォント情報を詳細に表示 • fc-match • 条件に一致するフォントを取得
  5. 5. とりあえず遊んでみる
  6. 6. 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“ • → フォントファイル名では指定できない
  7. 7. 設定ファイル 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
  8. 8. /etc/fonts/fonts.conf <!-DO NOT EDIT THIS FILE. IT WILL BE REPLACED WHEN FONTCONFIG IS UPDATED. LOCAL CHANGES BELONG IN 'local.conf'. … --> 和訳: 編集すると楽しそう
  9. 9. /etc/fonts/fonts.conf <?xml version="1.0"?> <!DOCTYPE fontconfig SYSTEM "fonts.dtd"> <fontconfig> </fontconfig>
  10. 10. /etc/fonts/fonts.conf
  11. 11. ~/.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>
  12. 12. ~/.fonts.conf
  13. 13. マッチングと設定 デフォルト設定ファイルと動作の仕組みを見てみよう
  14. 14. 仕組み • /etc/fonts.confが読まれる • <dir> • フォント読み込みパス • <include> • 別のconfファイルを読み込む • /etc/fonts/conf.d読み込み • 50-user.confが~/.fonts.conf読み込み • <match> • マッチング設定 • フォント属性設定
  15. 15. フォントの属性 property type description family string ファミリー名 antialias bool アンチエイリアス対応 hinting bool 自動ヒンティング対応 hintstyle int 自動ヒンティングスタイル outline bool アウトラインフォント weight int light, medium, bold, … • 他にも色々ある • <edit>で上書きできる • 独自で定義できる
  16. 16. マッチング • fc-matchコマンドやAPIから「パターン」を指定する • 指定パターンと全フォントの「距離」を計算し、最も近いもの が返る • 存在しないフォントを指定しても、何かしら近いものが返る • システムフォントが存在する限り、nullにはならない • 指定パターンは事前に<edit>により変更される • 結果には、フォントファイル名・ピクセルサイズ・アンチエイ リアス有無など、レンダリングエンジンに渡せるデータが含ま れる
  17. 17. マッチング • マッチングは2パス実行 • 1回目 • どのフォントを使うか決める • 2回目 • レンダリング用のフォント属性を決める
  18. 18. match, test, edit • matchの中にtest, editを書く • testの条件に一致する場合、editが適用される • <edit mode=“assign”> • assign: 置き換える • prepend: 先頭に挿入 • append: 末尾に挿入 • <edit binding=“strong”> • strong • weak • same
  19. 19. match, test, edit <!-- /etc/fonts/conf.d/10-antialias.conf --> <match target="font"> <edit name="antialias" mode="assign"><bool>true</bool></edit> </match> 全フォントに、無条件で「アンチエイリアス=true」をセットしてい る
  20. 20. 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」に、具体的なフォントを割り当てている
  21. 21. 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」を割り当てている
  22. 22. selectfont, acceptfont, rejectfont • selectfontの中にacceptfontとrejectfontを書く • rejectfontはブラックリスト • ここに書かれたフォントは存在しないことになる • acceptfontはホワイトリスト • rejectfontより優先される
  23. 23. selectfont, acceptfont, rejectfont <!-- /etc/fonts/conf.d/70-no-bitmaps.conf --> <selectfont> <rejectfont> <pattern> <patelt name="scalable"><bool>false</bool></patelt> </pattern> </rejectfont> </selectfont> ビットマップフォントは使わないように設定している
  24. 24. デバッグ FC_DEBUG=1 fc-match serif FC_DEBUG=1 簡単なmatch結果 FC_DEBUG=2 詳細なmatch結果 FC_DEBUG=4 match/editの経過
  25. 25. 設定例 一般ユーザ編
  26. 26. ユーザ設定 • ~/.fonts.confを書くことで、様々なアプリのフォントを変えられ る • • • • 自分好みの見た目にできる アプリがフォント設定機能なくてもOK フォントごとにアンチエイリアスなど詳細設定できる 「このシステムフォント使いたくない」が実現できる • root権限はいらない • Android 4.0以上でも採用されている ←嘘でした • ちなみに~/.fonts.confはDEPRECATEDなので~/.config/fonts.confな どを使う
  27. 27. 全部手書きフォントにしたい <?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>
  28. 28. アンチエイリアスとヒンティングは嫌い です <?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>
  29. 29. 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>
  30. 30. 特定フォントを置き換えたい <?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>
  31. 31. 許可フォント以外使わないで <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>
  32. 32. 設定例 開発者編
  33. 33. カスタムパラメータの追加も簡単だ! int i; if (FcPatternGetInteger(match, “aanumgrays”, 0, &i) == FcResultMatch) { // process } -----------------------------------------------------------------------------<match target="font"> <edit name="aanumgrays" mode="assign"> <int>4</int> </edit> </match>
  34. 34. まとめ
  35. 35. まとめ • ユーザの皆様 • rootなくても色々遊べて面白いよ • 開発者の皆様 • フォントを使う処理があったら、Linux版ではFontConfigを使ってくだ さい • ソースコードにフォントファイル名決め打ちしないで • 難しいフォント設定機能作らなくて良くなるよ
  36. 36. ところで
  37. 37. CSS body { font-family: “メイリオ”, “ヒラギノ角ゴ Pro W3”, serif; } ▲ 優先順位は? @font-face { font-family: “MyFont”; src: url(“myfont.ttf”); unicode-range: U+0a; } ▲ ファイル名直接指定したらどうなる?rangeはFontConfigとどう連動 する?
  38. 38. 次回へ続く coming soon

×