« OpenTypeフォントの続き(7)・・・locaテーブル | トップページ | V1.0.0.11リリース »

2008年3月 1日 (土)

OpenTypeフォントの続き(8)・・・glyfテーブル

ということで、glyfテーブル

glyfテーブルはグリフのアウトラインを定義するテーブルである。TrueTypeアウトラインは2つの端点と1つの制御点(control point)で定義する2次Bスプライン曲線と直線でアウトラインを定義するので、WinAPIのPolyBezier関数でアウトラインを描画する場合は、3次ベジェ曲線に変換する必要がある。変換式は、2次Bスプライン曲線の端点の座標をそれぞれ(x0, y0)、(x2, y2)とし、制御点の座標を(x1, y1)とすると、

  • CP0 = (x0, y0)
  • CP1 = (x0 + 2*(x1 - x0)/3, y0 + 2*(y1 - y0)/3)
  • CP2 = (x1 + 1*(x2 - x1)/3, y1 + 1*(y2 - y1)/3)
  • CP3 = (x2, y2)

となる。CP0、CP3は端点、CP1、CP2は制御点。

フォントに含まれる各グリフのグリフデータは前回のlocaテーブルを使ってアクセスするが、各グリフのグリフデータはグリフヘッダーで始まる。グリフヘッダーは次のようになる。

グリフヘッダー
名前 説明
SHORT NumberOfContours 輪郭線(Contour)の数
SHORT xMin x座標の最小値
SHORT yMin y座標の最小値
SHORT xMax x座標の最大値
SHORT yMax y座標の最大値

NumberOfContoursはグリフを構成する輪郭線(Contour)の数を表す。0以上ならシンプルグリフを負なら複数の他のグリフから構成されるコンポジジットグリフを表す。xMinyMinxMaxyMaxはグリフを囲む最小の矩形であるバウンディングボックス(ブラックボックス)を表す。グリフヘッダーの後に、実際のグリフデータが続くが、シンプルグリフかまたは、コンポジットグリフかによってフォーマットが異なる。シンプルグリフの場合、次のようになる。

シンプルグリフ
名前 説明
USHORT EndPtsOfContours[NumberOfContours] 各輪郭線(Contour)の終点番号の配列
USHORT InstructionLength インストラクションの長さ(バイト数)
BYTE Instructions[InstructionLength] インストラクションの配列
Byte Flags[] 各輪郭線のフラグの配列
BYTE or SHORT XCoordinates[] x座標の配列
BYTE or SHORT YCoordinates[] y座標の配列

EndPtsOfContoursは各輪郭線の終点番号の配列である。グリフを構成する各点は0から始まる通し番号が付けられるが、グリフを構成する点の数NumOfPtsは

NumOfPts = EndPtsContours[NumberOfContours] + 1

で求まる。XCoordinatesYCoordinatesは各点の座標を表す配列である。ちなみに、XCoordinates、YCoordinatesは絶対座標ではなく直前の点からのベクトルになっている(最初の点は原点(0, 0)からのベクトル)。また、Flags配列によって、XCoordinates、YCoordniates配列の要素数が変わるので注意が必要である。

コンポジットグリフはややこしいので省略するとして、実際にglyfテーブルを解析してみる。

Opentype9_1

上の画像はTahomaフォント(TAHOMA.TTF)のglyfテーブルを解析した時の実行結果である。また、グリフインデックス42のグリフ(ラテンアルファベットの大文字のGに相当するグリフ)のグリフデータが表示されている。上の画像より輪郭線が1つで、点の数が49個であることが分かる。右下のアウトラインは上が実際のグリフデータから各点の絶対座標を求め単純に各点をオンカーブ点、オフカーブ点を全く考慮せず直線で結んだもの、下がETO_GLYPH_INDEXオプション付きのExtTextOut関数でグリフを表示したものである。ちなみに、輪郭線上の点をオンカーブ点(on-curve point)、輪郭線上にない点をオフカーブ点(off-curve point)と呼ぶ。

MS ゴシックフォントのglyfテーブルを解析した時の実行結果は次のようになる。

Opentype9_2

ところで、グリフの位置がずれるのだが、どうやって正しく配置するんだ??誰か教えて下さい。とりあえず、グリフのバウンディングボックスと水平方向はhmtxテーブルの左サイドベアリングを使って、垂直方向はOS2テーブルのWinAscentを使って配置してるが、垂直方向は結構ずれてる・・インストラクションや存在すればBASEやGPOSテーブルが影響するとは思うが。

とまぁ、OpenTypeフォントの事を始めて1ヶ月になるのだが、キリがいいので、前にも書いたように他の事をやろうかと。作ったプログラムはここから。PostScriptアウトライン、ビットマップ、OpenTypeテキストレイアウト関連のテーブルは一切まだ手をつけていないが、後々気が向いたらやろうかなと。kernテーブルやvheaテーブルなど他のテーブルはだいたい解析できるようになってます。プログラムはメジャーなC言語でなくCodeGear社のDelphiを使っているのだが、ソースコードを見たという人がいれば、ソースもアップロードします。

Opentype9_3

« OpenTypeフォントの続き(7)・・・locaテーブル | トップページ | V1.0.0.11リリース »

フォント」カテゴリの記事

コメント

コメントを書く

(ウェブ上には掲載しません)

トラックバック

この記事のトラックバックURL:
http://app.f.cocolog-nifty.com/t/trackback/1497665/39651792

この記事へのトラックバック一覧です: OpenTypeフォントの続き(8)・・・glyfテーブル:

« OpenTypeフォントの続き(7)・・・locaテーブル | トップページ | V1.0.0.11リリース »

自作ソフトウェア

無料ブログはココログ

メモ