OTFフォントの持つヒント情報について
週末はネットワークケーブル総延長300メートルほどを粛清した次第です。かしめたRJ45が40個ほどということで疲れましたwww
そんなことはどうでも良いのですが、日ごろからアウトライン化するとヒント情報が飛んで太く見えちゃうって言っていますが、みなさんはこのヒント情報ってどんなものか知っていますか?
ヒント情報というものは基本的にアウトラインフォントを小さなサイズで表示する際の表示品質を向上させるための機能です。今回はOpentypeFont(CFF)のヒント処理について概要を説明します。
小さな表示サイズにおいてはレンダリング時に各水平位置であったり、幅であったりといった部分を規定の数値に強制します。これは各グリフが並べられた時にがたつきが感じられないようにピクセル位置を整頓し、行や単語としての一体感を保つためであり、合わせてコントラストも調整される事により大幅に可読性が向上します。プリントや印刷時に潰れが生じることで細部のディテールが失われますので、それを防ぐために細くなるような調整が施されます。ですからIllustrator等において、アウトライン化を行う事によるヒント情報の喪失は、プリントアウト時にアウトライン化する前のものと比較して太く見えることになります。一言でいうと、アウトラインを取ると太ります。
こちらが見本となりますが、上がヒント情報に従ってラスター化されたもので、下のものがアウトライン化によるヒント情報が欠落した状態でラスター化されたものです。
ベースラインやキャップハイトが揃えられているのはBluevalues属性の影響です。各ステム幅が揃えられるのはグリフ情報に含まれるhstemやvstem等のオペレータによるものです。このように水平及び垂直のステム幅はグリフによって微妙に異なりますが、ヒント情報が適用された場合、各数値によって強制的に統一されます。
フォントレベルのヒント機能
BlueValues
高さの値の範囲がリスト化されたもので、小さな文字サイズではこの範囲に入ったすべての値が強制的に同じ高さに揃えられます。この情報は必須のものです。フォントによっては利用されないケースもありますが定義されないフォントにおいても空定義が含められています。高さの値アセンダハイト、キャップハイト、xハイト、ベースラインおよびディセンダハイト等が含まれます。
StemSnap
標準ステム幅を提供し、小さな文字サイズではステム幅をこの値に強制します。
flex
水平もしくは垂直線において僅かな変異部分を小さな文字サイズでは直線として処理します。
このように微細な曲線を表現する十分な解像度が無い場合、flex属性の数値による丸め込みが生じ該当区間は直線としてレンダリングされます。
以上のものはフォント自体に適用されるグローバルなものです。グリフ毎に個別に定義される情報に以下の物があります。
グリフレベルのヒント機能
hstem、vstem
水平及び垂直のステム幅を定義します。
hstemhm、vstemhm
hstemやvstemと同様の情報を定義しますが、後ろに必ずhintmask情報が続き、hintmaskと共に利用されます。
hintmaskn
上記のステム情報の利用を制御し、重複しないヒントのセットのみが有効になるようコントロールします。
cntrmask
カウンターマスクはhstemやvstem等と同様の手法でグリフ内のカウンタースペースの確保を行うために利用されます。
こちらはフォントエディタ上でのステム幅に関連するヒント情報を可視化したものです。hstem、vstemが各4個定義されています。
最初に示した図のベースラインやキャップハイトの位置自体はBlueValueによって制御されます。基本的にベースラインやxハイト、キャップハイトのオーバーシュートをコントロールし組版時にベースラインやxハイト、キャップハイトといった部分のがたつきがを抑制し、コントラストを高める効果があります。また、StemSnap属性もこのフォントディクショナリに含まれます。各グリフのアウトラインが記述されているType2CharStringsにもグリフレベルのヒント情報であるHStemやVStem等の情報が含まれていて、各ステム幅はこれらの情報を基準に計算されます。
フォントレベルのデフォルト値ににグリフレベルのステム値が加えられて上で空間を確保するカウンターマスク等のグリフレベルのヒント情報をオーバライドする事により最終的な表示データが生成されます。
これらのヒンティングが有効になるサイズを定義するのがBlueScale属性でこちらもフォントディクショナリに含まれ、文字サイズ及び解像度の数値より算出されたしきい値によってヒント情報を適用するかどうかが決定されます。