TrueType アウトラインの検証

FontForge の使い方
ここから、TrueType アウトラインのデータの検証をしていきますが、FontForge を使ってアウトラインを確認するので、使い方を解説しておきます。

まず、文字からグリフを検索したい場合は、メニューから「表示」>「移動」で、文字を入力して、そのグリフへ移動できます。
※ 日本語の文字の場合、入力欄で入力メソッドが起動しない場合があるので、その時はコピー&ペーストで貼り付けてください。

グリフへの移動ができたら、ダブルクリックで、アウトラインのウィンドウを表示します。

各ポイントをクリックすると、その位置の座標値が表示されるので、値を確認してください。

もしくは、ポイントを選択後、メニューの「エレメント」>「情報を得る」で、座標を確認できます。

ポイントに「←」の矢印があるものは、輪郭の最初の点です。
「×」のポイントは、輪郭線上にない制御点です。
直線のみの簡単なアウトライン
まずは、直線のみで構成された、簡単なアウトラインを見てみます。



numberOfContours: 1
xMin,yMin,xMax,yMax: 102, 545, 630, 705
endPtsOfContours: 3,
instructionLength: 27
instructions: (略)

points:
== contour [0] ==

(630, 545) : raw (630, 545)
{ON_CURVE_POINT, }

(102, 545) : raw (-528, 0)
{ON_CURVE_POINT, Y_IS_SAME_OR_POSITIVE_Y_SHORT_VECTOR, }

(102, 705) : raw (0, 160)
{ON_CURVE_POINT, Y_SHORT_VECTOR, X_IS_SAME_OR_POSITIVE_X_SHORT_VECTOR, Y_IS_SAME_OR_POSITIVE_Y_SHORT_VECTOR, }

(630, 705) : raw (528, 0)
{ON_CURVE_POINT, Y_IS_SAME_OR_POSITIVE_Y_SHORT_VECTOR, }

輪郭は1つで、4つの点から構成されています。

pt 0int16 の x, y。
原点からの位置なので、(630, 545)。
pt 1X : 「(int16) -528」で、630 (pt[0] の x 位置) - 528 = 102
Y : 前の Y 位置と同じなので、545
pt 2X : 前の X 位置と同じなので、102
Y : 「(uint8) 160」、フラグの bit 5 が ON なので、正の値。545 + 160 = 705
pt 3X : 「(int16) 528」、102 + 528 = 630
Y : 前の Y 位置と同じなので、705

ON_CURVE_POINT と ON_CURVE_POINT の点の間は、直線となります。
輪郭が2つで、曲線を含むアウトライン


輪郭が2つあります。
上の部分が contour [0]、下の部分が contour [1] です。

numberOfContours: 2
xMin,yMin,xMax,yMax: -74, -401, 375, 1462
endPtsOfContours: 3,15,
instructionLength: 69
instructions:(略)

points:
== contour [0] ==

(375, 1257) : raw (375, 1257)
{ON_CURVE_POINT, }

(174, 1257) : raw (-201, 0)
{ON_CURVE_POINT, X_SHORT_VECTOR, Y_IS_SAME_OR_POSITIVE_Y_SHORT_VECTOR, }

(174, 1462) : raw (0, 205)
{ON_CURVE_POINT, Y_SHORT_VECTOR, X_IS_SAME_OR_POSITIVE_X_SHORT_VECTOR, Y_IS_SAME_OR_POSITIVE_Y_SHORT_VECTOR, }

(375, 1462) : raw (201, 0)
{ON_CURVE_POINT, X_SHORT_VECTOR, X_IS_SAME_OR_POSITIVE_X_SHORT_VECTOR, Y_IS_SAME_OR_POSITIVE_Y_SHORT_VECTOR, }

== contour [1] ==

(362, 1040) : raw (-13, -422)
{ON_CURVE_POINT, X_SHORT_VECTOR, }

(362, 49) : raw (0, -991)
{ON_CURVE_POINT, X_IS_SAME_OR_POSITIVE_X_SHORT_VECTOR, }

(362, -203) : raw (0, -252)
{Y_SHORT_VECTOR, X_IS_SAME_OR_POSITIVE_X_SHORT_VECTOR, }

(225, -309) : raw (-137, -106)
{ON_CURVE_POINT, X_SHORT_VECTOR, Y_SHORT_VECTOR, }

(142, -374) : raw (-83, -65)
{X_SHORT_VECTOR, Y_SHORT_VECTOR, }

(-15, -401) : raw (-157, -27)
{ON_CURVE_POINT, X_SHORT_VECTOR, Y_SHORT_VECTOR, }

(-74, -254) : raw (-59, 147)
{ON_CURVE_POINT, X_SHORT_VECTOR, Y_SHORT_VECTOR, Y_IS_SAME_OR_POSITIVE_Y_SHORT_VECTOR, }

(38, -239) : raw (112, 15)
{X_SHORT_VECTOR, Y_SHORT_VECTOR, X_IS_SAME_OR_POSITIVE_X_SHORT_VECTOR, Y_IS_SAME_OR_POSITIVE_Y_SHORT_VECTOR, }

(98, -195) : raw (60, 44)
{ON_CURVE_POINT, X_SHORT_VECTOR, Y_SHORT_VECTOR, X_IS_SAME_OR_POSITIVE_X_SHORT_VECTOR, Y_IS_SAME_OR_POSITIVE_Y_SHORT_VECTOR, }

(186, -128) : raw (88, 67)
{X_SHORT_VECTOR, Y_SHORT_VECTOR, X_IS_SAME_OR_POSITIVE_X_SHORT_VECTOR, Y_IS_SAME_OR_POSITIVE_Y_SHORT_VECTOR, }

(186, 51) : raw (0, 179)
{ON_CURVE_POINT, Y_SHORT_VECTOR, X_IS_SAME_OR_POSITIVE_X_SHORT_VECTOR, Y_IS_SAME_OR_POSITIVE_Y_SHORT_VECTOR, }

(186, 1040) : raw (0, 989)
{ON_CURVE_POINT, X_IS_SAME_OR_POSITIVE_X_SHORT_VECTOR, }

上の部分は直線で構成されているため、単純です。

下の部分は曲線を含むので、ON_CURVE_POINT が OFF の制御点が存在します (× マーク)。

(362, 49) 〜 (225, -309) の間は、(362, -203) を制御点とした、曲線になります。