よくあるフォントの問題点を自動的に検出する方法

誰しも完璧ではありません。

もちろん、私もです。

あなたがグリフを作成した時、きっと小さな間違いをいくつか犯しているはずです。例えば文字毎にステムの幅が微妙に異なるとか、完全に垂直でない線が含まれているとか……。

FontForge の 問題点を発見(O)... コマンドは、いくつかのよくある間違いの発見助けることができます。いくつかの場合では、間違いを修正することができますが、あなたの許可を得ないでそれを行うことはありません (いわゆる「問題点」のいくつかが、実際にあなたの意図通りでないと誰が判るでしょうか) が、それはあなたが確認するべき事柄の指摘を行うためのものです。

このコマンドはフォントビュー、アウトラインビューまたはメトリックビューのどこからも呼び出すことができます。フォントビューでは、選択されたすべての文字のエラーを検査し、何らかの問題点を発見した場合、グリフを表示するためのウィンドウを開き、エラーが存在することを指摘する (非モーダルな) ダイアログを出します。そのウィンドウで問題点を修正することができますので、完了したら [次(N)] ボタンを押してください。コマンドの実行を中止するには [中止(S)] ボタンを押します。いくつかのエラーは FontForge が自動で修正が可能ですので、その場合は、[修正] ボタンがダイアログに表示されます。(注意: 指摘される問題点のすべてをエラーであると考えるべきではありません。いくつかの「問題点」は、フォントデザインの特徴として意図されたものである可能性があります。目で確認せずに [修正] ボタンを押さないでください)。アウトラインビューとメトリックビューでのふるまいも同様ですが、問題点を探す文字が 1 個に限られる点が異なります。

FontForge は、以下の操作を行ったときに、より多くの問題点をチェックすることができます:

注意: これらの問題点のいくつかは、ラテン・ギリシャ・キリル文字のフォントの問題点に特化したものです。これらを他の用字系に拡張する方法や、他の用字系に特化した問題点についてお聞かせ頂ければ幸いです (fontforge-users@lists.sourceforge.net まで)。

FontForge は以下の潜在的な問題点を検出することができます:

近すぎる点(C)

FontForge に内蔵されたコマンドのいくつかは、長さ 1 ユニット以下の微小なスプラインが存在すると混乱することがありますし、非常に近いいくつかの点を配置しても、フォントが印字された時に、それが目で見て判る違いをもたらすことはありません。おそらく、どちらか片方を削除すべきではないかと……。FontForge が同一のパス上に、あまりに近すぎると判定された 2 個の点を検出したとき、それら両者を選択し、問題点を修正可能な状態で実行を中止します。

近接するX [val]

ファイル全体を通じて整合性を保つべき一連の特徴がしばしば存在します。例えば、“BDEFHIKLMNPR”の各グリフの左サイドベアリングはおそらくすべて同じでしょう。ここでは望ましいサイドベアリングの値を入力する欄があり、FontForge は入力された値に近いが、正確には一致しない座標をもつ点をすべて探します。この「近い」という基準は、ダイアログのいちばん下にあるテキストボックスの値で定まります (この図の例では、3 em ユニット以内―どちらの方向でも―にあるすべての物を探します)。ずれた位置にある点を発見したら、FontForge はそれを選択し、処理を停止して修正操作を待ちます。

近接するY [val]

これは上のコマンドと完全に対になるもので、Y 座標を対象にしている点のみが異なります。多くの場合、次のチェックによってこのチェックをより簡単に行うことができます…。

標準の高さの近くの Y 座標

ラテン・ギリシャ・キリルの各アルファベットには、いくつかの標準の高さがあり、FontForge はその検査を備えつけています: ベースライン、小文字の高さ、大文字の高さ、アセンダをもつ小文字の高さ (多くの場合、大文字の高さと同じか、非常に近い値です) およびディセンダをもつ小文字の深さです。 このコマンドでは、FontForge はこれらの高さを 0,“x”の高さ、“I”の高さ、“l”の高さおよび“p”の深さとして定義しています (ギリシャ文字またはキリル文字のフォントで作業していて、そのフォントにラテン文字が含まれていないときは、FontForge はそのアルファベットにある同種の文字を使います)。続いて、FontForge はその高さの「近く」にあって、正確にはその高さと一致しない点を探します。ここでも「近く」と見なされる誤差の限界はダイアログの下で定義します。そのような点が見つかった場合、FontForge はそれを選択し、中断してそれを修正できるようにします。

水平/垂直/イタリック角に近い制御点

これは、下記の水平/垂直に近い辺オプションに似ていますが、それが直線のみを検査するのに対し、このオプションは始点または終点がほとんど水平 (垂直、イタリック角) に近い曲線を検査します。

端点の外にはみ出す制御点(B)

例えば右図のようなグリフにおいては、選択中の点には適切と思われるよりはるかに外側の制御点が存在し、おそらく本来あるべき位置に置かれていないと考えられます。このオプションはそのような点の存在をチェックします。

技術的に言えば、このオプションは、スプラインの 2 個の端点を結ぶ直線上に垂線を引いたときに、2 点に挟まれた線分の外側に投影されるようなすべての点を検索します。

無意味な制御点をチェック(I)

これは、制御点が変形の対象となる端点に近すぎてほとんど曲線の形に影響を与えていないことがないか探します。制御点が近すぎると見なされるのは、影響を与える点との距離が、その制御点が調節するスプラインの両端点の距離に「無意味と見なす比率」を掛けた距離よりも短い場合です。

開いたパス(P)

パスはすべて閉じていなければなりません。つまり、1 本の曲線素片がもっているような端点が存在するのではなく、それがパスの最初の点に繋がっていなければなりません。これは、パスの最後の点を置くときに最初の点と繋げるのではなくて、最初の点の近くの場所に置いただけというちょっとした不注意でしばしば発生します。FontForge が開いたパスを発見したときはそのパス全体を選択し、パスの修正ができるようにそこで停止します。

交差するパス

PostScript と TrueType のどちらでも、フォント内にパス同士が交差する箇所があることは望ましくありません。

水平/垂直/イタリック角に近い辺

ほとんど垂直に近いが完全に垂直ではない線を作成してしまうことは非常によくあります。このコマンドはそのような状況をチェックします。また、水平線および (フォントにイタリックか句が指定されている場合) イタリック角にほとんど平行であるが完全に平行ではない線もチェックします。それらのどれかにあてはまる線が見つかったとき、FontForge はその線の両端の点を選択し、それを修正できるように停止します。

水平線のときは 2 個の端点の y 座標を通知し、垂直線のときは x 座標を通知します。

一番外のパスが時計回りかをチェック(O)

PostScript と TrueType のどちらでも、パスは時計回りに辿ることを要求しています。これが問題とならない場合もありますが、多くのラスタライザはこのルールに従っているときのほうが良好に動作します。このコマンドは、この制約が破られているかどうかを検査します。

現在のところ、このコマンドは問題点が修正されるまで同じエラーを何度も報告します。これはある種のバグですが、これを避ける簡単な方法がまだ見つかりません。

点の個数の上限(M)

PostScript 言語リファレンスマニュアルの付録 B には、インタプリタは 1500 個までの点を含むパスが処理できればよいと書かれています。ほとんどのインタプリタでは実際の制限値はそれよりはるかに大きな値なので、あなたの要求に合うような上限値に変更できるべきでしょう。私は、制御点も個数に含まれると考えています。2 次曲線をもつフォント (つまり TrueType フォント) を検査するときには、2 個の端点の間には最大 1 個の制御点しか存在しなくても、PostScript に変換したときには 2 個になるだろうことにご注意ください。FontForge は現在のところこれを 1 個の点として勘定します。TrueType にはそのような制限はありません。

反転した参照をチェック(R)

上で述べたように、PostScript と TrueType のどちらでも、時計回りのパスが好まれます。反転した参照が存在する場合、参照またはオリジナルのパスが反時計回りに描かれることになります。これを修復するには、編集(E)参照を解除(N) を行ってから エレメント(L)アウトラインの向きを修正(C) を行う必要があります。

不正な TTF 変換行列をもつ参照

TrueType のグリフフォーマットでは、ほとんど任意の変換行列を参照に適用することができます。唯一の制限は、変換行列の全ての項 (平行移動の項を除いて) は -2 と 2 の間の値でなければならないということです。

表現不能な変換行列を指定した参照がある場合、FontForge は参照をインライン展開しますので、グリフに存在するすべての輪郭が、参照として表現できないために配置されることになります。

輪郭と参照の混在

TrueType では、グリフは全て参照からなるか、すべて輪郭からなるかのどちらかでなければなりません (表現不能な変換行列をもつ参照は輪郭であると見なされます)。

両者が混在したグリフがある場合、FontForge はすべての参照をインライン展開します。

不正な PS 変換行列をもつ参照

Type1 フォントフォーマットでは、許される参照は平行移動のみです (回転や拡大・縮小は許されません)。技術的には Type2 フォーマットは一切の参照を許容しないところ、サブルーチンを使うことによって参照をシミュレートすることができますが、これも回転や拡大・縮小はできません。

表現不能な変換行列を指定した参照がある場合、FontForge は参照をインライン展開しますので、グリフに存在するすべての輪郭が、参照として表現できないために配置されることになります。

参照の入れ子の上限(D)

Type2 仕様書の付録 B には、インタプリタは参照の入れ子を 10 重までしかサポートしなくても良いと書かれています。FontForge は参照されたグリフの処理と、ヒントの処理の一部のケースでサブルーチン呼び出しを使用します。ヒントづけは最大 1 重のサブルーチン呼び出しを消費するので、参照に使用できるのは残り 9 重となります。TrueType にはそのような制限はありません。

点を制御しないヒント(H)

このオプションはちょっと秘教的で、ghostview のあるバグ (と私が考えている動作) に対する彌縫策を提供するために用意されています。以下のようなグリフがあったとします。


最初の 2 個の画像は、ヒント無しのグリフを示しています。最初が FontForge 上での表示、次が ghostview による表示です。結果は問題ありません。もしここで、2 本の曲がったステムにヒントを追加したとすると、ghostview は非常に混乱する個とになります。私には、ここにそれらのヒントが存在するべきかどうか判定できるほど、ヒントについて詳しくありません。私はそうであると仮定しているので、FontForge はこれを生成します。しかしこのコマンドが「問題を発見している」と呼べるのは、これが本当に問題である場合のみでしょう。FontForge がこれを発見すると、表示品質を損なっているヒントを選択し、問題点が解決できるように停止します (おそらく、最前の解決法はすべての曲がったスプラインの極値に曲線上の点を追加することでしょう。なんといっても、この方法は実際に Adobe によって推奨されているのです (T1_Spec.pdf のセクション 4.1 を参照))

ヒント端に近い点(P)

"H" のような、主要な垂直ステムがクロスバーで分割されたグリフがあるとき、ステムの上半分の幅が下半分とわずかに異なるというのは非常によくあることです (ヒントづけの操作はすべてのステムを検出してしまいます)。このコマンドはそれを避けるために、かいつまんで言えば、ステムから僅かに離れた点を探します。(ここでも、「近い」というのはダイアログの一番下で定義された距離によって判断ます)。FontForge がそのようなステムを発見したときには、そのステムを選択し、それを修正できるように停止します。

ヒント幅のぶれ量(W) [val]

一般に、人は多くのグリフが一定のステム幅をもっていることを望むものであり、このコマンドは指定された幅に近い幅をもつステムが正確に同じ幅であるかをチェックします (ここでも「近く」の基準はページの一番下で定義した値です)。FontForge が不正なステムを発見したときには、そのステムを選択し、問題点を修正できるように停止します。

歪んだstem3ヒント

PostScript には、"m" のような、3 つのステムの幅が等しく、それらの間隔がどちらも同じ文字のステムにヒントづけを行う用途に設計されているいくつかのヒント演算子 (hstem3 と vstem3) があります。あるグリフがこの演算子を用いるための判定基準に適合しないことはよくあります (その場合、FontForge はこの演算子を使いません)。このコマンドは、この条件がほとんど成り立ちかけている場合を検出します。筆者の場合、「近く」の値を、デフォルトより大きくする必要がありました。

精確な*stem3かを表示

(これは問題ではありませんが、上の「歪んだstem3」が何も表示しない場合を区別できると便利だと気づいたので入れてあります。精確な stem3 な場合と、stem3 からあまりに外れた場合が存在するからです)

ヒントの個数の上限(M)

Type2 仕様書の付録 B には、インタプリタは 96 個までの水平・垂直ヒントをサポートすればよいと書かれています。

ビットマップの欠落をチェック(B)

付属のビットマップフォントを通覧して、アウトライン版のフォントにあるグリフが存在しないものを発見します。その逆に、アウトラインフォントに存在しないグリフをビットマップフォントから検索します。

Unicode値の重複をチェック

2 つのグリフに同じ Unicode の符号位置を割り当てていないかチェックします。(Unicode の文字符号は、どのグリフが TrueType/OpenType の 'cmap' テーブルに出現するかを決定します。2 つのグリフが同じ符号位置をもっている場合、どちらが使用されるかの保証はありません)。

グリフ名の重複をチェック

2 つのグリフに同じ名前をつけていないかチェックします。

送り幅をチェック

送り幅が指定されたグリフがないかどうかチェックします (固定幅フォントで、すべてのグリフが同じ幅かどうかをチェックするのに役立ちます)。

縦書きの送り幅をチェック

(縦書き用メトリックを含むフォントにおいて) 縦書きの送り幅 が指定した幅と異なるものがないかチェックします。

空のグリフへの置換をチェック

すべての 'GSUB' 置換、選択型置換、複数置換および現在のグリフに接続するすべての合字項目を通覧し、名前のついた構成要素がフォント内に存在するか (そして何らかの内容が存在するか) どうかをチェックします。

存在しないグリフ名をチェック(M)

フォント内に存在しないグリフ名を参照する置換や合字などを作成することが可能です。このオプションは上記の誤りをチェックします。

存在しない表引きタグをチェック(L)

フォント内に存在しない表引きタグを参照する条件つき機能を作成することが可能です。このオプションは上記の誤りをチェックします。

'DFLT'用字系が使われていないかをチェック

OpenType では‘DFLT’の使用を廃止していますが、FontForge は適切な用字系が存在しないグリフに対して適切な用字系が推測できないときに使用する場合があります。


CID フォントを編集している場合、以下の項目も表示されます:

重複定義されたCIDをチェック(T)

2 個以上のフォントで使用されている CID が存在しないかどうかを調べるために、フォントセット全体を通覧します。

未定義のCIDをチェック(B)

どのフォントでも定義されていない CID を探します。これは CID フォントでは非常によく起こることなので、使用時にはご注意ください。

ダイアログの最下行には 2 個のボタンが存在します ([すべてクリア][すべてセット] のボタンが置かれていて、それぞれ全部のテストのチェックボックスをクリアまたはセットします――ただし、CID フォント以外では、CID に関するテストは [すべてセット] を押してもセットされません)。

また、これらのテストの多くで使用される“近く”の意味を定義することができるテキストフィールドが置かれています。何かが“近く”にあると見なされるデフォルト値は、求める値の 3 em ユニット以内に含まれていて、その値と等しくない場合です)。

目次