Glyphs3 ハンドブック非公式翻訳 #11 PostScriptヒンティング

広告

下記の文章はGlyphs3ハンドブックを個人的に日本語に訳したもので、内容には誤訳を含む可能性もあります。誤訳により生じた一切の責任については負いかねますので予めご了承ください。 参考サイト:Glyphs3 Handbook(PDF)Glyphs2.3ハンドブック日本語版(PDF)Glyphs Handbook(WEB)Microsoft Typography documentationCSSでのOpenType 機能の構文

11 PostScriptヒンティング

PostScriptヒンティングは、PostScript/CFFアウトラインを持つOpenTypeフォント(拡張子は通常.otf)の低解像度表示を改善するための方法です。一方、TrueType方式のOpenTypeフォントは異なるヒンティング方法を使用しています(第12章「TrueTypeヒンティング」参照)。

フォントがデジタル画面上でピクセル化されて表示されるとき、その画像はラスタライザと呼ばれるソフトウェアによって生成されます。ラスタライザはピクセル化の作業を自動で行いますが、フォントに「ヒント」と呼ばれる情報を埋め込むことで、ラスタライザがより均一で美しい字形を作成する手助けができます。特に、同じ行内のテキストで文字の垂直部分(ステム)が均等に見えるように調整されます。PostScriptのヒントはTrueTypeのヒントに比べてシンプルですが、その分柔軟性は低いです。

ヒンティング情報のほとんどは、グリフのどの部分が重要なストロークであるか、小さいサイズで表示された際に省略できない部分を定義するためのものです。ヒントには2つの種類があります。

  1. フォントレベルのヒント: フォント全体に適用されるもので、一般的な情報を保持します。これには、標準的なステム(文字の垂直部分)の値やアラインメントゾーン(配置基準となる領域)が含まれます。
  2. グリフレベルのヒント: 各グリフに対して個別に配置されるヒントで、ラスタライザーがアウトラインをピクセルグリッドに合わせて調整する際に役立ちます。これには、ステムヒントやゴーストヒントが含まれます。

最も効率的な方法は、まずフォントレベルのヒント情報をしっかりと定義し、その後、オートヒンターと呼ばれるアルゴリズムにグリフレベルのヒントを自動で生成させることです。

ヒンティングは、フォント内のステム幅が規則的であるなど、フォントデザインに一貫した特徴がある場合にのみ効果があります。手書き風フォントや絵文字、装飾用ボーダー、グランジ風のフォントなど、アウトラインが不規則なフォントでは、ヒンティングによってラスタライズの改善を図ることはできません。また、ヒンティング情報が無視される環境、例えば高解像度のディスプレイや、macOSやiOSを搭載したApple製品で使用されるフォントでは、ヒンティング情報は使用ないため、フォントファイルのファイルサイズを無駄に大きくすることになります。こうしたプロジェクトでは、ヒンティングを行わないか、既存のヒンティングを無効にすることをお勧めします。

PostScriptヒンティングは、低解像度においてシャープで一貫したピクセル画像を作成することを目的としています。ラスタライザはピクセルグリッドに適合するように与えられたサイズに合わせてアウトラインを変形させます。言い換えれば、ヒンティングの仕事は形状を保護することではなく、形状を変更することであるということです。もし形状の保持が重要であるフォント、例えばストロークが連綿するスクリプト書体フォントやアイコンフォントなど、鮮明なピクセルイメージよりも形状の保存が重要なフォントでは、ヒンティングは使用しない方がよいでしょう。

広告

11.1 フォント全体のヒンティング

グリフレベルのヒンティングを追加する前に、フォント全体で適用されるヒンティングの一連のパラメータを定義する必要があります。これらのフォントレベルのヒントは、エクスポートされたフォント内の「PostScript Private Dictionary」に保存されます。詳細については、以下の資料を参照してください。

11.1.1 スタンダードステム

ステム幅とは、フォントの文字の線幅のことです。垂直ステムは、文字の縦方向の線幅のことで、例えば大文字Iのストロークの太さや、Oの左右のカーブの太さがこれに当たります。水平ステムは、横方向の線幅のことで、例えば、AやHのセリフの厚さや横線の太さ、tやfの横棒の太さ、Oの上下のカーブの太さがこれに当たります。

スタンダードステムは、フォント内の多くのステム幅を代表する平均値です。オートヒンティングのアルゴリズムがステムを認識し、グリフレベルのヒンティングを適切に行うためには、スタンダードステムを適切に設定することが重要です。また、スクリーンラスタライザはこれらの値を利用してピクセルレンダリングを最適化することができます。特に、低解像度でフォント全体のステム幅を同期するのに役立ちます。



スタンダードステムの値はフォント情報の「マスター」タブ(「ファイル」→「フォント情報…」→「マスター」、CmdI)の垂直ステムと水平ステムの欄に入力します。代表的な値だけを、なるべく件数を絞って設定してください。ステム値の編集については、8.2.5「ステム」を参照してください。

もし値が非常に近いステムがある場合は、その2つの平均値をステム値とするのが良いでしょう。ステムの太さを素早く測るには、ステム上の2つのノードを選択して情報ボックス(CmdShiftI)で選択範囲の幅を確認するか、ものさしツールに切り替えてください。詳細は4.10「計測」を参照してください。

例えば、フォント内の垂直ステムの測定値が68、71、72、74、75、82、83、85であった場合は、70台前半と80台前半に山があるため、それぞれの平均の72と83あたりを選ぶのがよいでしょう(このような場合、たいてい68~75は小文字、82~85は大文字のステム幅だと想像できます)。どちらの値も、多くのステム測定値の中央値として適切な値です。(訳者注:同じ数値群で、Glyphs2.3日本語マニュアルでは72と83、Glyphs3では75と80を選定しています。)

スタンダードステムの値を1つだけにすると、低解像度(PPM)のスクリーン上ではフォント内のすべてのステムが同じ太さに見えるようになり、ステムがより均一にスケールします。

PPMとはpixel per emの略で、画素密度を表す指標です。

理論的には、垂直ステム欄と水平ステム欄でそれぞれ最大12個のスタンダードステム値を設定することができます。しかし、実際にはできるだけ少ない数にするのがベストです。通常、なるべく代表的な値に絞っていけば、ステム値は1個か2個に収束するでしょう。2個の場合は小文字と大文字でそれぞれ1個ずつのステム値か、あるいは水平ステムの場合は水平ストローク用とセリフ用の2つの値となることが多いです。2つ目や3つ目の値を使用する場合は、サイズによっては同じピクセルサイズで異なる太さのステムが発生する可能性があることを留意しておきましょう。例えば、垂直ステムが70と80の2つのスタンダードステム値で設定されている場合、フォントサイズによっては最初のステムが2ピクセル幅で表示され、もう一方のステムが3ピクセルで表示される可能性があります。

それぞれのステム幅フィールドに設定する最初のステム幅の値は特に重要です。ここには、小文字などの最も頻繁に使用されるグリフのステム値を入力してください。このステム値は、ヒンティングだけでなく、Glyphsの他の機能(「パス」→「変形」の「視覚的傾斜」や「フィルタ」→「スマート角丸」など)でも使用されます。2つめ以降に入力するステム値は、ヒンティングのみに使用されます。また、水平ステムの値はTrueTypeヒンティングにも利用されます。詳細は、第12章「TrueType ヒンティング」を参照してください。

マスター間で補間を行う際に、両方のマスターに同じ名前のステムがある場合、それらを使って中間のステム値を補間します。そのため、各マスターに入力するステム値の個数を揃え、順番も一致させるようにしてください。

11.1.2 アラインメントゾーン

フォントがコンピュータの画面で非常に少ないピクセルで表示されるとき、多くの欧文フォントデザインでは、xハイト(小文字の高さ)、アセンダー(f、h、kなどの上に伸びる部分)、ディセンダー(g、p、yなどの下に伸びる部分)、大文字の高さのそれぞれを、文字の高さが同じになるように同じ量のピクセルで表現する必要があります。また、低解像度で表示する場合、すべての文字のベースラインを揃えることも重要です。

一般的な欧文書体デザインでは、文字のアウトラインは常に正確に整列しているわけではありません。例えば、小文字の「o」の底辺は視覚的なバランスをとるためにベースラインより少し下に出るようにデザインされることが一般的です。また、小文字の「n」のセリフ(飾り部分)はベースラインに正確に揃えられます。大文字の「A」の頂点(アペックス)は、大文字の「H」の高さより少し高くデザインされ、文字が背が低く見えないように調整されます。このように、標準の高さからはみ出す部分を「オーバーシュート」と呼びます。はみ出しの量は10〜15ユニット程度が一般的です。

アラインメントゾーンは、ラスタライザがオーバーシュートを認識できるようにするための設定です。小さなピクセルサイズでは、オーバーシュートがあると見た目のバランスが崩れることがあるため、オーバーシュートを再現する必要はありません。具体的には、低解像度において、水平ステムやゴーストヒント(11.3.2「ゴーストヒント」参照)が付いたパスの集合がアラインメントゾーンにある場合、そのパスはゾーンの基準位置に整列されます。

アラインメントゾーンは、開始位置とサイズの2つの値から構成されています。開始位置はゾーンの基準となるy座標の値であり、通常はxハイトやアセンダーなどの垂直メトリクスの値を指します。この開始位置はオーバーシュートが整列する目標の高さとなるので、時として「フラット・エッジ」と呼ばれることがあります。サイズは、その開始位置に現れる可能性があるオーバーシュートの最大値を表します。もしオーバーシュートの高さが開始位置を上に超える場合(xハイト、小文字の高さ、大文字の高さ、アセンダーなど)、サイズの値は正の値になります。これらのゾーンは「トップゾーン」と呼ばれます。逆にオーバーシュートが開始位置を下に超える場合(ベースライン、ディセンダーなど)、サイズの値は負の値になり、これらのゾーンは「ボトムゾーン」と呼ばれます。フォントのマスターのアラインメントゾーンの編集については、8.2.4「メトリクスとアラインメントゾーン」を参照してください。

一般的なのアラインメントゾーンの設定: アセンダー(文字の上部)、キャップハイト(大文字の高さ)、およびxハイト(小文字の高さ)では、正のサイズ値を持つトップゾーンが設定されます。一方、ベースライン(文字の下端)やディセンダー(文字の下部)には、負のサイズ値を持つボトムゾーンが設定されます。

アラインメントゾーンは、できるだけ小さく設定することを心がけてください。「念のため」という理由で大きな値を設定するのは避けてください。アラインメントゾーンの最大サイズはblueScale値に依存しており(11.1.3「カスタムパラメータ」参照)、具体的には「240 ÷ (240 × blueScale − 0.98)」を超えてはいけません。また、どんな場合でもゾーンの最大サイズは25ユニットです。トップゾーンは最大6つ、ボトムゾーンは最大5つ、ベースラインゾーンは1つだけ設定できます。ゾーン同士は重なってはいけません。また、最低でも1ユニット以上の間隔を確保してください(広い間隔が望ましいです)。なお、ベースラインのゾーンの位置は0でなければなりません。

「ファイル」→「フォント情報…」→「その他」で「グリッドのユニット間隔」を標準値の1以外に設定している場合、垂直方向のノード位置で丸め誤差が発生することがあります(8.5.1「グリッドのユニット間隔とグリッド細分」参照)。したがって、誤差の対策として、アラインメントゾーンも上下方向に1ユニットずつ拡張する必要があります。具体的には、開始位置を1ユニット移動させ、サイズを2ユニット拡張します。ただし、ベースラインのゾーンについては開始位置は0のままで変更せず、サイズのみを1ユニット広げます。

11.1.3 カスタムパラメータ

アラインメントゾーンやスタンダードステム以外にも、フォント全体のプライベートディクショナリには「blueFuzz」、「blueScale」、「blueShift」、「Family Alignment Zones」などのヒンティングに関する設定値があります。Glyphsではこれらの値をカスタムパラメータとして設定できます。詳細については、カスタムパラメータを追加する際に表示されるGlyphsの説明や、17.4「カスタムパラメータ」を参照してください。

11.2 オートヒンティング

アラインメントゾーンやスタンダードステムの設定が適切に行われていれば、「ファイル」→「出力…」のダイアログで「すべてのグリフをオートヒント」オプションをオンにすることで、オートヒンティング機能を使ったヒンティングを行うことができます。また、Autohintカスタムパラメータを設定すれば、オートヒンティングを強制的に実行させることもできます。出力ダイアログでオートヒントがオフに設定されていても、このパラメータがあるインスタンスには強制的にオートヒンティングが適用されます。

Adobeアプリケーションでヒンティング結果をテストしてみましょう(4.13.6「Adobeアプリケーションでのプレビュー」参照)。テスト用のテキストを作成し、文字が数ピクセルのサイズで表示される程度までズームアウトします。その後、macOSのズーム機能を使ってズームインし(この機能はシステム設定の「アクセシビリティ」から設定できます)、ヒンティングの結果を確認しましょう。必要に応じてフォント設定を調整したり、問題のあるグリフを手動でヒンティングして再出力、確認する作業を繰り返します。手動ヒンティングの詳細については、11.3「手動ヒンティング」を参照してください。

11.2.1 フレックス・ヒント

フレックスヒント: ノード1とノード3は同じ高さにあり、アラインメントゾーン内に配置されています。ノード2はゾーンのフラット・エッジ上に正確に配置する必要があります。ハンドルは、ノード1からノード3までの空間に収まるように配置する必要があります(1~3番のポイントはいずれも極点でなければいけません)。

フォントに緩やかに凹んだセリフやステム(カップ型のセリフやテーパーがかかったステム)がある場合、自動ヒンティング機能(オートヒンティング)が「フレックスヒント」という調整を自動的に適用することがあります。フレックスヒントは、低解像度で表示される際に浅い曲線を平坦にしてくれます。フレックスヒントは手動で設定することはできず、フォントをエクスポートする際に自動的に適用されます。フレックスヒントを有効にするためには、以下のの条件が必要です。

  1. 「blueShift」の値は、凹みの深さに1を加えた値以上に設定する必要があります。例えば凹型のセリフのへこみが5ユニットであれば、「blueShift」は6以上に設定する必要があります。この設定は、「ファイル」→「フォント情報…」→「フォント(CmdI)」のカスタムパラメータで行います。
  2. カップやテーパー(先細り)の部分は、凹み曲線の形状は3つのノードから構成される2つのセグメントでなければいけません。2つのセグメント形状は対称である必要はありませんが、1つ目と3つ目のノードは、x座標(テーパーしたステムの場合、例えばOptimaのIのようなステム形状の上端と下端のポイント)、またはy座標(カップしたセリフの場合、例えばPalatinoのTのようなセリフの右端と左端)が同じでなければなりません。最大で4つあるハンドルは、完全な水平または垂直である必要はありませんが、3つのノードは2つのセグメントの端に配置する必要があります。また、曲線の深さは最大20ユニットまでです。
  3. 曲線のセリフの場合、3つのポイントがアラインメントゾーンに完全に収まっているのが理想です。最良の結果を得るためには、中央(2つ目)のポイントはゾーンのフラット・エッジ(ゾーンの目標の高さ)にぴったりと配置し、両端の2つのポイントはアラインメントゾーン内に収める必要があります。つまり、上図のように曲線上のセリフがベースラインにある場合、両端のノードは曲線の深さ分だけベースライン下のゾーンに入ることになります(もしかしたら、やや直感に反するかもしれません)。

11.3 手動ヒンティング

GlyphsのPostScriptヒンティングでは、同じフォント内でオートヒンティングと手動ヒンティングの両方を併用することができます。そのため、手動ヒンティングを追加する前に、まずはオートヒンティングでできるだけ品質を上げておくことをお勧めします。低解像度で正しく表示されないグリフにのみ手動調整を行うようにしましょう。

手動ヒンティングと自動ヒンティングは、同じグリフに同時に適用することはできません。手動ヒンティングを設定したグリフは、自動ヒンティングの対象外となり、手動で設定したヒンティングデータのみが使用されます。そのため、一度手動ヒンティングを行ったグリフは最後まで自分でヒンティングを管理する必要があります。

グリフレベルで手動で設定するヒントには、ステムヒントとゴーストヒントの2種類があります。ステムヒントは、グリフの垂直または水平のステムや、セリフやクロスバーの部分を指定する際に使用します。一方、ゴーストヒントは、セルフがないサンセリフのようなフォントで水平ステムヒントが適用できない場合に、アウトラインの上端や下端を指定するために使用します。

アラインメントゾーンと同様に、水平ゴーストヒントやステムヒントは、xハイトやアセンダーなどの垂直方向の整列に重要な役割を果たします。ラスタライザは、水平ヒントを使用してアラインメントゾーン内のすべての要素を整列させようとします。水平ヒントの上端もしくは下端は、ポイントが揃うべき高さ (x ハイトやキャップハイト、アセンダー)と一致している必要があります。ヒント同士が重なることはできないため、離れたところにあるステムも1つのヒントで対応するようになっています(例:mの2つのショルダー)。

例えば、数字の「8」の縦ステムのように、2つのステムヒントを配置する必要があり、かつ、それらが重なってしまう場合があります。しかし、PostScriptヒンティングではヒントがオーバーラップすることは許されていません。このような場合、Glyphsは自動的に「ヒントリプレースメント」という情報を追加し、各ステムが描画される際に不要なヒントを自動的に解除します。そのため、ステムヒントの重なりについて心配する必要はありません。

マルチプルマスターを使用する場合、最初のマスター(フォント情報の一番上にあるマスター)のヒントのみが採用され、他のすべてのマスターにも流用されます。このとき、手動で設定したヒントは必ずノードとリンクされるようにしてください。そうしないと、Glyphsはどのようにヒントを補間すればよいか分からなくなります(11.3.1「ステムヒント」参照)。マルチプルマスターでのヒンティングについては、11.3.3「マルチプルマスターのヒンティング」を参照してください。

編集ビューでコンテキストメニューから「オートヒント」を選択すると、最初のヒント設定が簡単になります。これにより、オートヒンティング機能が行うのと同等のヒントが、グリフレベルのヒントとして挿入されます。これらのヒントは、以降の項に記載された手順に従って調整できます。なお、手動でヒントを追加したグリフについては、出力時に自動的にヒントが付加されません。この点には十分な注意が必要です。

11.3.1 ステムヒント

グリフにステムヒントを追加するには、右クリックしてコンテキストメニューから「水平ヒントを追加」または「垂直ヒントを追加」を選択します。灰色のバーと、2つの数字が書かれたバッジが表示されます。この2つの数字は、ヒントの開始位置とサイズを示しています。

2つのノードを選択した状態でヒントを追加すると、そのヒントは選択されたノードにリンクされます。この方法は、異なるアウトラインにある複数のノードペアにも一括でヒントを追加できます。最適な結果を得るためには、常に極点のノードにヒントをリンクさせることをおすすめします(4.2.14「極点と変曲点」参照)。

垂直ステム(緑)と水平ステム(黄色)の位置関係。

ヒントを選択するには、灰色の数字のバッジをクリックします。複数のヒントを選択したい場合は、Shiftキーを押しながらクリックしてください。選択したヒントの値は、情報ボックスで編集できます(「表示」→「情報を表示」、CmdShiftI)。次のヒントを選択するにはTabキーを、前のヒントに戻るにはShiftTabキーを押します。

青いマーク(円や三角形)をドラッグすることで、マウス操作でヒントを調整できます。青い円はヒントの開始位置(基準)を、三角形はヒントのサイズ(幅)と方向を示しています。マーカーをノードの上にドラッグすると、ヒントがそのノードにリンクされます。リンクされた状態でノードを移動すると、ヒントもそれに合わせて自動的に変更されます。ヒントを削除するには、ヒントを選択してDeleteキーを押してください。

出力されたOTFファイルでは、すべてのPostScriptステムヒントの幅は必ず0より大きくなければなりません。もし誤って負の値でヒントが設定されている場合、Glyphsはファイル出力時にそのヒントの方向を自動的に修正し、すべてのステムヒントを正の値に変換します。

11.3.2 ゴーストヒント

サンセリフ書体などで、水平のステムヒントが使えない場合は、ゴーストヒントを使ってグリフの上端や下端を垂直方向に揃えることができます。例として、サンセリフの大文字「I」を考えてみましょう。「I」の上端はキャップハイトに、下端はベースラインに揃える必要があります。もしこれがセリフのある「I」なら、セリフ部分に水平ヒントを適用すれば良いのですが、サンセリフの「I」には水平ヒントを適用できるような特徴がありません。この場合、「I」の上端に上端ゴーストヒントを、下端に下端ゴーストヒントを配置します。このような状況は、サンセリフの「L」の上端や「P」の下端でも同様に発生します。

ゴーストヒント(青)と通常のステムヒントの位置関係。ゴーストヒントは、水平方向のヒントが適用できない場合に機能します。

ゴーストヒントを作成するには、ノードを1つ選択し、Controlキーを押しながらクリック(または右クリック)して、コンテキストメニューから「水平ヒントを追加」を選択します。すでにあるヒントをゴーストヒントに変えるには、水平ヒントのバッジをControlキーを押しながらクリック(または右クリック)し、「ゴーストヒントに変換」を選択します。

ゴーストヒントのバッジは、位置とその向きを表示するだけです。上向きの矢印↑は上のゴーストヒント、下向きの矢印↓は下のゴーストヒントを示しています。青い円をノードにドラッグして、ポイントに貼り付けます。ゴーストヒントを選択して、情報ボックスの上向きまたは下向きのアイコンをクリックして、ゴーストヒントの垂直方向の向きを設定します(表示 → 情報の表示、Cmd-Shift-I)。

ゴーストヒントのバッジには開始位置(基準)と方向のみが表示されます。バッジ内の上向きの矢印↑は上端ゴーストヒント、下向きの矢印↓は下端ゴーストヒントであることを表します。青い円をノードに合わせてドラッグすることで、ノードとゴーストヒントをリンクさせることができます。ゴーストヒントの上端、下端を切り替えるには、情報ボックスの上向きまたは下向きのアイコンをクリックします(「表示」→「情報を表示」、CmdShiftI)。

11.3.3 マルチプルマスターのヒンティング

マルチプルマスターのフォントでは、最初のマスターのみにヒンティングを設定してください。最初のマスターとは、フォント情報の「マスター」タブ内で最上位に位置するフォント(またはフォントウインドウで左端のアイコンのマスター)のことです。別のマスターをヒンティング用のマスターとして設定したい場合は、「ファイル」→「フォント情報…」→「フォント」(CmdI)から「Get Hints From Master」カスタムパラメータを設定します。ヒントがアウトラインのノードにリンクされていて、パスの互換性が保たれている場合、補間の際には対応するノードにヒントが設定されます。

例えば最初のマスターが非常に細いウエイトの場合、目的のポイントを選択して手動のヒンティングを施す作業はやりづらいかもしれません。このような場合、RegularまたはBoldマスターをヒンティング用のマスターとした方がよいでしょう。

他のマスターに施した手動ヒントは使用されませんが、最初のマスターに手動ヒントがなければ他のマスターのヒントが採用されます。オルタネートレイヤー(13.7.1「オルタネートレイヤー」参照)や中間レイヤー(13.6「中間レイヤー」参照)を使用する場合は、手動ヒントを含むマスターレイヤーと、置き換えられるこれらのレイヤーにヒントを挿入してください。

タイトルとURLをコピーしました