Visual Basic 中学校 掲示板 投稿の管理
タグのない投稿を抽出
統計
RSS
Visual Basic 中学校
投稿一覧
文字コード 追加で教えて欲しいです
この投稿へのリンク
https://keijiban.umayadia.com/ThreadDetail.aspx?ThreadId=30649#CommentId84834
この投稿の削除
削除パスワード
削除する
コメント本文
投稿者
魔界の仮面弁士
 (社会人)
投稿日時
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