OpenTypeとは-その1

意表をついての連日の投下です。
やるやると言ってなかなか前に進まないフォントの解説ですが、ぼちぼち進めたいと思います。しかしながらわたし自身も少々理解不足だったりしますので、おかしな部分等がございましたらお気軽にご指摘頂ければ幸いに存じます。
毎度の事なのですが、資料に目を通すと次から次へと不明な部分が現れて、目を通す必要のあるドキュメントが等比級数的に増加するのです。今年の夏はそのドキュメントの参照にほぼつぶれてしまったのです。娘を海に連れて行けなかった事とか、USJ連れて行かなかった事とかの原因がこいつにかまけて…っていうのがばれると家庭の危機に陥りそうなので内緒にしておきますね。

まず最初のステップとしてフォント情報を正しくパースして情報を取り出す事を目的とします。

上のイメージは必須テーブルの情報を全て表示させた状態です。必須テーブルの荷関しては以下をご覧下さい。

cmap Character to glyph mapping
おなじみのcmapです。文字コードとグリフIDの橋渡しをするサブテーブルを内包します。

head Font header
そのまんまフォントヘッダです。色々な基本情報が書いてあります。

hhea Horizontal header
ホライゾンタルヘッダは水平方向の配置関する情報を含みます。

hmtx Horizontal metrics
水平方向のメトリクスに関するテーブルです。

maxp Maximum profile
最大値に関する色々をとりまとめてあります。

name Naming table
ネームテーブル。フォントのお名前やその他ライセンス情報等が含まれています。

OS/2 OS/2 and Windows specific metrics
OS/2やWindowsが利用する情報の塊です。が、Windowsに限らずその他のOSでも利用する重要な情報が含まれています。ライセンスリストリクションとかね。

post PostScript information
ポストスクリプト関連の情報。

必須テーブルは上記の8コです。まずは、これを順番に解説して行きたいと思います。今回はheadテーブルを解説します。

head – Font Header
フォントのグローバルインフォメーションが記述されているのがこのテーブルです。グリフの最大boundsサイズとか各種フラグの情報がここから得られます。

構造

Fixed Table version number
Fixed fontRevision
ULONG checkSumAdjustment
ULONG magicNumber
USHORT flags
USHORT unitsPerEm
LONGDATETIME created
LONGDATETIME modified
SHORT xMin
SHORT yMin
SHORT xMax
SHORT yMax
USHORT macStyle
USHORT lowestRecPPEM
SHORT fontDirectionHint
SHORT indexToLocFormat
SHORT glyphDataFormat.

テーブルバージョン
32bitのFixedデータです。16.16のアンサインドですが、面倒なので4バイト整数で見てたりしてw

フォントレビジョン
こちらも32bitのFixedです。こちらはフォントマニファクチュアラーによって設定されるフォントのレビジョンです。16.16のアンサインドで…以下略

チェックサムアジャストメント
符号なし32bitです。フォント全体のチェックサムです。あるお作法にに従って生成される物ですが、そのお作法は必要になったら解説致します。

マジックナンバー
32bit符号なし、数値も「0x5F0F3CF5」に固定です。

フラグ
フラグは16bitのバイナリです。各ビットは以下の様なフラグのスイッチとなります。

Bit 0: Baseline for font at y=0;
ベースラインはy=0

Bit 1: Left sidebearing point at x=0;
レフトサイドベアリングはx=0

Bit 2: Instructions may depend on point size;
インストラクションはポイントサイズに依存する。

Bit 3: Force ppem to integer values for all internal scaler math; may use fractional ppem sizes if this bit is clear;
ppemの内部計算を整数にまるめこむ。ちなみにppemは…

ppem = size*resolution/72

こんな計算で算出されるようです。

Bit 4: Instructions may alter advance width (the advance widths might not scale linearly);
インストラクションがアドバンスドワイドスを変更することがある(アドバンスドワイドスはスケールに比例しない)

Bits 5-10: These should be set according to Apple’s specification . However, they are not implemented in OpenType.
Appleに割り当てられている範囲だけどアップル自身はインプリメントしていません。だからfalse固定です。

Bit 11: Font data is ‘lossless,’ as a result of having been compressed and decompressed with the Agfa MicroType Express engine.
Agfa MicroType Express engine用の圧縮フラグらしいですが0にセットしておきましょう。

Bit 12: Font converted (produce compatible metrics)
こちらは良くわかりませんのでfalseで…

Bit 13: Font optimized for ClearType™. Note, fonts that rely on embedded bitmaps (EBDT) for rendering should not be considered optimized for ClearType, and therefore should keep this bit cleared.
クリアタイプ関連のフラグですが0で良いでしょう。

Bit 14: Last Resort font. If set, indicates that the glyphs encoded in the cmap subtables are simply generic symbolic representations of code point ranges and don’t truly represent support for those code points. If unset, indicates that the glyphs encoded in the cmap subtables represent proper support for those code points.
ラストリゾートフォント関連のフラグ。こちらも0にセットの方向で。

Bit 15: Reserved, set to 0
予約ビット0にセット
要するに5〜15bitは0にセットしておけってことで。

unitsPerEm Valid range is from 16 to 16384. This value should be a power of 2 for fonts that have TrueType outlines.
Emスクエアのユニット値。trueTypeの場合、慣例的に2の累乗が選択されますので1024か2048になります。Postscriptの場合は1000が多いです。この値はレンジが決まっていて16〜16384の範囲でなくてはいけません。

created Number of seconds since 12:00 midnight, January 1, 1904. 64-bit integer
ISO 8601で定義されている国際標準規格フォーマットの日付データ64bit。

modified Number of seconds since 12:00 midnight, January 1, 1904. 64-bit integer
ISO 8601で定義されている国際標準規格フォーマットの日付データ64bit。

xMin For all glyph bounding boxes.
yMin For all glyph bounding boxes.
xMax For all glyph bounding boxes.
yMax For all glyph bounding boxes.
以上の4点はバウンズを示しますが、全てのグリフの内の最大値と最小値が記録されています。フォーマットは符号付き16bitです。

macStyle
Bit 0: Bold (if set to 1);
Bit 1: Italic (if set to 1)
Bit 2: Underline (if set to 1)
Bit 3: Outline (if set to 1)
Bit 4: Shadow (if set to 1)
Bit 5: Condensed (if set to 1)
Bit 6: Extended (if set to 1)
Bits 7-15: Reserved (set to 0).
符号なし16ビットデータです。Machintosh向けのフラグ集です。7bit目以降は予約ビットで0にセットされています。

lowestRecPPEM Smallest readable size in pixels.
符号なし2バイト、最小サイズの定義です。単位はpixel/EMでEMあたりの最小ピクセル数が定義されます。

fontDirectionHint Deprecated (Set to 2).
0: Fully mixed directional glyphs;
1: Only strongly left to right;
2: Like 1 but also contains neutrals;
-1: Only strongly right to left;
-2: Like -1 but also contains neutrals.
文字列の流れる方向です。符号付き16bitで定義されていますが、使うのは3bitだけです。すごく贅沢な使い方だとおもいます。0は入り交じったケース。1だと全てのキャラクタが左から右に並べられます。2は1とほぼ一緒だけどneutralsが含まれます。
-1というのは右から左に流れる場合です。アラビア語等が該当します。-2も同-1とほぼ同様だけどneutralsがふくまれます。
で、これだけではneutralsが意味不明ですのでAppleのドキュメントから引用

The fontDirectionHint provides information about the way in which the glyphs in this font are likely to be set. A value of 0 indicates a mixed directional font; a value of one indicates only left to right glyphs, -1 only right to left glyphs. The values 2 and -2 refer to fonts which contain some neutral glyphs, that is glyphs without a strong directionality.

A neutral character has no inherent directionality. (It is not a character with zero width). Spaces and punctuation are examples of neutral characters. Non-neutral characters are those with inherent directionality. For example Roman letters (left-to-right) and Arabic letters (right-to-left) have directionality. In a Roman font where spaces and punctuation are present, the font direction hint should be set to 2.

要するにneutralsっていうのは方向性を持たないスペースやパンクチュエーションキャラクタを指します。Romanなフォントは通常これらのキャラクタを持ちますので2にセットされます。

indexToLocFormat 0 for short offsets, 1 for long.
locaテーブルのフォーマットを決めるフラグ。符号付き16bitだけど0か1しか見てません。

glyphDataFormat 0 for current format.
こちらはglypfテーブルのフォーマットの為のフラグ。indexToLocFormatと同様に16bit符号付きデータとして定義されていますが、1bitのフラグとして扱われます。

すべてのデータをシーケンシャルに読込む事が出来るのでファンクションは以下の様に単純なものとなります。

/*readHead.jsx*/
function readHead(pth){
var localFileName = pth+”/head.table”;
var tgFile = new File(localFileName);
tgFile.encoding = ‘BINARY’;
if (!tgFile.open(‘r’)) {
alert (‘table read error…’);
return null;
}
var rslt = new Array();
rslt[0] = readFixed (tgFile);
rslt[1] = readFixed (tgFile);
rslt[2] = “0x” + readULong(tgFile).toString(16);
rslt[3] = “0x” + readULong(tgFile).toString(16);
rslt[4] = readUShort(tgFile).toString(2);
while(rslt[4].length<16) rslt[4] = “0” + rslt[4];
rslt[5] = readUShort(tgFile);
rslt[6] = readLongDt(tgFile);
rslt[7] = readLongDt(tgFile);
rslt[8] = new Array();
for (var i=0;i<4;i++) rslt[8].push(readShort (tgFile));
rslt[9] = readUShort(tgFile).toString(2);
while(rslt[9].length<16) rslt[9] = “0” + rslt[9];
rslt[10] = readUShort(tgFile);
rslt[11] = readShort(tgFile);
rslt[12] = readShort(tgFile);
rslt[13] = readShort(tgFile);
tgFile.close();
//UI
var hdw = new Window(‘palette’,’head Table’,[200,120,460,440]);
hdw.add(‘statictext’,[5,5,350,20],”version : “+rslt[0]);
hdw.add(‘statictext’,[5,25,350,40],”revision : “+rslt[1]);
hdw.add(‘statictext’,[5,45,350,60],”checksum : “+rslt[2]);
hdw.add(‘statictext’,[5,65,350,80],”magic : “+rslt[3]);
hdw.add(‘statictext’,[5,85,350,100],”flag : “+rslt[4]);
hdw.add(‘statictext’,[5,105,350,120],”unitsPerEm : “+rslt[5]);
hdw.add(‘statictext’,[5,125,350,140],”created : “+rslt[6]);
hdw.add(‘statictext’,[5,145,350,160],”modified : “+rslt[7]);
hdw.add(‘statictext’,[5,165,350,180],”bounds : “+rslt[8]);
hdw.add(‘statictext’,[5,185,350,200],”macStyle : “+rslt[9]);
hdw.add(‘statictext’,[5,205,350,220],”lowestRecPPEM : “+rslt[10]);
hdw.add(‘statictext’,[5,225,350,240],”fontDirectionHint : “+rslt[11]);
hdw.add(‘statictext’,[5,245,350,260],”indexToLocFormat : “+rslt[12]);
hdw.add(‘statictext’,[5,265,350,280],”glyphDataFormat : “+rslt[13]);
var hdwCls = hdw.add(‘button’,[5,290,55,305],’close’,{name:’cancel’});
hdwCls.onClick = function(){hdw.close()};
hdw.show();
return rslt;
}

実行結果がこちらArialのHEADテーブルを参照しています。

ファンクション的には結果をリターンしますが現状では利用しません。ところでArialってありえる?あらいある?えーりある?いまひとつ理解していないのでした(^^)

ten_a

Graphic Designer, Scripter and Coder. Adobe Community Professional.

シェアする