FontForge の使い方
ここから、TrueType アウトラインのデータの検証をしていきますが、FontForge を使ってアウトラインを確認するので、使い方を解説しておきます。
まず、文字からグリフを検索したい場合は、メニューから「表示」>「移動」で、文字を入力して、そのグリフへ移動できます。
※ 日本語の文字の場合、入力欄で入力メソッドが起動しない場合があるので、その時はコピー&ペーストで貼り付けてください。
グリフへの移動ができたら、ダブルクリックで、アウトラインのウィンドウを表示します。
各ポイントをクリックすると、その位置の座標値が表示されるので、値を確認してください。
もしくは、ポイントを選択後、メニューの「エレメント」>「情報を得る」で、座標を確認できます。
ポイントに「←」の矢印があるものは、輪郭の最初の点です。
「×」のポイントは、輪郭線上にない制御点です。
まず、文字からグリフを検索したい場合は、メニューから「表示」>「移動」で、文字を入力して、そのグリフへ移動できます。
※ 日本語の文字の場合、入力欄で入力メソッドが起動しない場合があるので、その時はコピー&ペーストで貼り付けてください。
グリフへの移動ができたら、ダブルクリックで、アウトラインのウィンドウを表示します。
各ポイントをクリックすると、その位置の座標値が表示されるので、値を確認してください。
もしくは、ポイントを選択後、メニューの「エレメント」>「情報を得る」で、座標を確認できます。
ポイントに「←」の矢印があるものは、輪郭の最初の点です。
「×」のポイントは、輪郭線上にない制御点です。
直線のみの簡単なアウトライン
まずは、直線のみで構成された、簡単なアウトラインを見てみます。
輪郭は1つで、4つの点から構成されています。
ON_CURVE_POINT と ON_CURVE_POINT の点の間は、直線となります。
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 0 | int16 の x, y。 原点からの位置なので、(630, 545)。 |
---|---|
pt 1 | X : 「(int16) -528」で、630 (pt[0] の x 位置) - 528 = 102。 Y : 前の Y 位置と同じなので、545。 |
pt 2 | X : 前の X 位置と同じなので、102。 Y : 「(uint8) 160」、フラグの bit 5 が ON なので、正の値。545 + 160 = 705。 |
pt 3 | X : 「(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) を制御点とした、曲線になります。