投稿者 魔界の仮面弁士  (社会人) 投稿日時 2021/11/13 14:15:11
このまま TableDirectory[0].TableRecord[*] の解析も続けます。
データ位置を示すオフセットは、ファイル先頭 を 0 とした値で記録されています。


位置      : バイナリ     : 説明
--------- : ------------ : --------------------------------------
0024-0027 : 00,01,00,00  : version = 0x00010000
0028-0029 : 00,12        : numTables = 0x12

0030-0033 : 47,53,55,42  : TableRecord[0] は "GSUB" レコード(Glyph Substitution Table)
0034-0037 : 2F,55,3F,5D  : チェックサム
0038-003B : 00,00,03,A8  : GSUB レコードの位置 (ファイルの先頭からの位置)
003C-003F : 00,00,00,4C  : GSUB レコードの長さ (0x4C すなわち 76 バイト)

0040-0043 : 47,53,55,42  : TableRecord[1] は "OS/2" レコード(OS/2 and Windows Metrics Table)
0044-0047 : 60,AA,D7,06  : チェックサム
0048-004B : 00,00,03,F4  : OS/2 レコードの位置 (ファイルの先頭からの位置)
004C-004F : 00,00,00,60  : OS/2 レコードの長さ (0x60 すなわち 96 バイト)


こんな感じで解析していくと、最初のフォントに記録されている
各レコードとその開始位置を、以下のように読み取れます。
[ 0] = "GSUB" (000003A8)
[ 1] = "OS/2" (000003F4)
[ 2] = "cmap" (00000454)
[ 3] = "cvt " (000006D0)
[ 4] = "fpgm" (000006D8)
[ 5] = "gasp" (000006EC)
[ 6] = "glyf" (000006FC)
[ 7] = "head" (022AB4E8)
[ 8] = "hhea" (022AB520)
[ 9] = "hmtx" (022AB544)
[10] = "loca" (022C388C)
[11] = "maxp" (022F3B08)
[12] = "meta" (022F3B28)
[13] = "name" (022F3B68)
[14] = "post" (022F4248)
[15] = "prep" (022F4268)
[16] = "vhea" (022F427C)
[17] = "vmtx" (022F42A0)


Gekka さんのコードでいうと、
TTF.GetNames メソッドで "name" タグのレコード、
TTF.GetIVSMap メソッドで "cmap" タグのレコードを読む実装です。

ということで、今度は "name" タグの解析。
位置              : バイナリ    : 説明
----------------- : ----------- : --------------------------------------
022F3B68-022F3B69 : 00,00       : version = 0。Naming table version 0 を意味します。
                                : version 0 の場合は nameRecord 配列だけですが
                                : version 1 の場合はさらに langTag 配列も加わります。
022F3B6A-022F3B6B : 00,23       : count = 0x23。35 個の nameRecord があります。
022F3B6C-022F3B6D : 01,AA       : storageOffset。文字列領域の場所。(table先頭からの位置)
022F3B6E-         :             : nameRecord[count] 配列
022F3D12-         :             : 文字列領域。(0x022F3B68 + 0x01AA = 0x22F3D12 です)


Gekka さんのコードで実行した場合、NamingTable のインスタンスはこうなります。
.format = 0
.nameRecords.Count = 35
.langTagRecords.Count = 0