Pages

自己紹介

某IT技術情報誌に連載記事を持っていたテクニカルライター。またもや休刊してしまったよ。
Copyright © 2011-2016 Daregada. All rights reserved. Powered by Blogger.

gdippの設定ファイルでフォントやプロセスごとの設定をする方法

2011-03-08

gdippの設定ファイル(gdipp_setting.xml)には、フォントフェイスごとの設定やプロセスごとの設定をする方法が用意されているのだけど、その方法が少し分かり難いよね、という話。

Abstract

理由
特定のプロセスをgdippの対象外にする設定はexcludeノード、特定のフォントフェイスやプロセスに対するレンダリングの設定はgdimmノードと設定箇所が分かれているのに加え、gdimmノード内の選択ノードの優先順位に関するルールを知らないと正しい設定が行なえないため。
対策
自分が行ないたい設定を記述する正しい場所を理解する。

理由

gdippの最新ベータ版(現時点で0.9.1)における設定ファイル(gdipp_setting.xml)の概略は、以下のようになっている。なお、設定は32ビット版と64ビット版で共通だ。

上記のように設定がいくつかの部分に分かれているため、何に対するどんな設定なのかを考えて正しい位置に記述する必要がある。

特に注意すべきなのが、gdimmノード内の設定だ。 gdimmノード内には、複数の選択ノード(processノードとfontノード)を列挙する。 選択ノードの子ノードには、gdippのレンダリングに関する様々な設定項目(レンダラーの種類など)を記述する。こうした設定項目の説明は別の記事で行なう(予定)。

簡単に言えば、「あるソフトだけgdippの設定を変えたい」場合にはprocessノード、「あるフォントフェイスだけgdippの設定を変えたい」場合にはfontノードを使えばいい。なお、あるソフトのフォントフェイスに対して、processノードとfontノードの設定項目の値が異なる場合には、processノードの設定値が優先される。

フォントフェイスとは、フォントファミリーに含まれるフォントスタイル(通常やボールド、イタリックなど)のうちのひとつに限定したフォントを意味する。たとえば、"Courier New"フォントファミリーには、"Courier New"(通常)や、"Courier New Bold"(ボールド)などのフォントフェイスがある。

プロセスやフォントフェイスを特定するには、選択ノードに属性(たとえば、プロセスやフォントフェイスの名前など)を指定する。名前には正規表現(パターン)を利用するため、複数のプロセスやフォントフェイスをまとめて対象とすることも可能だ。なお、選択ノードが属性を持たない場合は、無条件にすべてのプロセス(processノードの場合)やフォントフェイス(fontノードの場合)が対象となる

もし、同じフォントフェイスやプロセスに対して複数の選択ノードが適用可能な場合、gdimmノードを上から順に調べて、初めて見つかった設定を利用する。以上を踏まえた厳密なルールは以下のとおり。

  • gdippは、現在のプロセスとフォントフェイスに要求される設定項目を探すために、gdimmノード内の選択ノードを上から順に訪問する。processノードがfontノードより優先されることから、最初にprocessノードだけを訪問し、設定項目が見つからなかったらfontノードだけを訪問すると考えるとわかりやすい。
  • 訪問した選択ノードの種類と属性から、現在のプロセスまたはフォントフェイスが選択ノードの対象となるか判断する。
    • 対象となる場合は、調べたい設定項目が含まれているかどうか判断する。
      • 設定項目が含まれていれば、その値を読み取って利用する。
      • 設定項目が含まれていなければ、次の選択ノードを訪問する。
    • 対象でないなら、次の選択ノードを訪問する。
  • 対象となる選択ノードが見つからなかった場合や、調べたい設定項目が見つからなかった場合は、gdipp内蔵の既定値を利用する

対策

こうしたルールのため、ユーザーが特定のフォントフェイスやプロセスに関する設定を追加する際には、設定内容だけでなく、それらを含む選択ノードの記述位置に注意する必要がある。たとえば、gdippパッケージ付属の設定ファイルの場合、gdimmノードには1つのprocessノードと2つのfontノードが最初から記述されている。

(1)のprocessノードは属性を持たないため、すべてのプロセスが対象となる。内部には、FreeTypeライブラリ用のパラメーター(キャッシュサイズなど)が記述されている。

これらのパラメーターは各プロセスの起動時に利用されるため、fontノードに記述しても効果がない

(2)のfontノードは、max_height="72"によって、最大ポイントサイズが72ポイント以下のフォントフェイスが対象となる。内部には、(processノードで記述されたもの以外の)すべての設定項目が記述されている。ほとんどのフォントフェイスに共通の設定項目はこの部分に記述すればいい。

(3)のfontノードは属性を持たないため、すべてのフォントフェイスが対象となる。実際には、それより前に置かれた(1)と(2)の組み合わせにより、72ポイント以下のフォントフェイスの設定項目はすべて見つかるので、(3)のfontノードの設定項目が使われるのは、72ポイントを超えるフォントフェイスに限定される。設定項目はレンダラーのみで、Windows標準のレンダラー(ClearTypeなど)を使うよう指定している(GTK対策のようだ)。

通常、ユーザーが新たなfontノードを追加する場合には、(2)より前に記述する必要がある。 というのも、72ポイント以下のフォントフェイスであれば、(2)がすべての設定項目を含んでいるので、(2)より後ろのfontノードに書かれた設定項目は使われないからだ。もちろん、(3)より後ろにfontノードを書いてしまったら、その設定項目は絶対に使われない。

一方、processノードはfontノードより優先されるので、特定のプロセスに対する設定項目を記述したprocessノードを(3)より後ろに書いたとしても、(2)や(3)よりも優先して設定値が使われる。

それでは、いくつかのケースに分けて設定を記述する位置を説明していこう。

  • 特定のプロセスをgdippの対象外にする設定

    gdippによるフォントレンダリングの対象外とするプロセス名は、(gdimmノードではなく) 設定ファイル下方にあるexcludeノード内に、processノードの値として記述する。gdimmノード内のprocessノードとは役割も書き方も異なるので注意されたい。

    processノードは複数記述可能で、そのうちのどれかに該当するプロセスに対してはWindows標準のフォントレンダリングが使われる。

    インストール時の設定ファイルには、"winlogon.exe"や"dwm.exe"など、いくつかのプロセス名が記述済みだ。もし、特定のアプリに対して頻繁にgdippによるエラーが発生するとか、フォントレンダリングがおかしいとか、アプリ独自のフォントレンダリングを行なっているといった場合には、excludeノード内にprocessノードを追加し、そのアプリのプロセス名を値として記述すればいい。実行中のプロセスの名前は、タスクマネージャーやProcess Explorer(日本語化)といった、実行中のプロセス一覧を表示するツールを利用すれば簡単に調べられる。

    なお、プロセス名の記述には正規表現(パターン)を利用する。正規表現では「.」(ドット)を「任意の1文字」を意味するメタ文字として使うため、プロセス名に含まれる"."そのものを指定するには、"\."と記述する必要があることに注意しよう。

  • 特定のフォントフェイスをgdippの対象外にする設定

    特定のフォントフェイスのみgdippのフォントレンダリングの対象外にするには、(excludeノードではなく) gdimmノード内の先頭付近(少なくとも、max_height="72"が指定されたfontノードよりも前)に新たなfontノードを追加し、フォントフェイス名をname属性で指定する。さらに、fontノードの子ノードに、値が0のrendererノードを記述すればいい。これは、Windows標準のフォントレンダラー(ClearTypeなど)を利用する設定だ。

    name属性の値には、"Courier New Bold"のようにフォントスタイルも含めて指定する必要がある。フォントファミリーをまとめて選択するには、フォントファミリー名の後ろに".*"を付ければいい。これは、「0文字以上の任意の文字列」を意味する正規表現だ。たとえば、"Courier New.*"とすると、Courier Newフォントファミリー(標準、ボールド、イタリック、ボールドイタリック)がまとめて選択される。

    なお、gdippの設定ファイルはUTF-8(BOM付き)で記述するので、「メイリオ」や「MS ゴシック」などの日本語フォントファミリーもそのまま名前を記述できる。

  • 特定のプロセスのみを対象とするレンダリング設定

    特定のプロセスのみを対象として、gdippのフォントレンダリングの設定を変更するには、gdimmノード内に新たなprocessノードを追加し、プロセス名をname属性で指定する。さらに、processノードの子ノードに、そのプロセスのみに適用する設定項目を記述すればいい。

    実行中のプロセス一覧を表示するタスクマネージャーなどのツールを利用すればプロセス名は簡単に調べられる。プロセス名の記述には、正規表現(パターン)を利用する。正規表現では「.」(ドット)を「任意の1文字」を意味するメタ文字として使うため、プロセス名に含まれる"."そのものを指定するには、"\."と記述する必要があることに注意しよう。 もちろん、".*"などを使ってプロセス名の記述を短縮したり、"|"を使って複数のプロセス名を並べることもできる。

  • 特定のフォントフェイスのみを対象とするレンダリング設定

    特定のフォントフェイスのみを対象として、gdippのフォントレンダリングの設定を変更するには、gdimmノード内の先頭付近(少なくとも、max_height="72"が指定されたfontノードよりも前)に新たなfontノードを追加し、フォントフェイス名をname属性で指定する。さらに、fontノードの子ノードに、そのフォントフェイスのみに適用する設定項目を記述すればいい。

    name属性の値にはフォントスタイルも含めて指定する必要があるので、通常はフォントファミリー名の後ろに".*"を付けて、フォントファミリーごと選択するとよい。

0 件のコメント:

コメントを投稿