投稿者 魔界の仮面弁士  (社会人) 投稿日時 2021/11/13 17:07:01
> 各レコードとその開始位置を、以下のように読み取れます。
この中の "cmap", "hhea", "head", "hmtx", "maxp", "name", "OS/2", "post" は
どのフォントファイルにも含まれる必須レコードです。

で…今回欲しいのは、Naming table ということでしたよね。お待たせしました。
ようやく本命の TableDirectory[0].TableRecord["name"].nameRecord[*] な領域です。

ここに、フォントファミリ名や著作権表示が記録されています。

位置              : バイナリ    : 説明
----------------- : ----------- : --------------------------------------
022F3B6A-022F3B6B : 00,23       : nameRecord.count = 0x23
022F3B6C-022F3B6D : 01,AA       : storageOffset。文字列が 0x22F3D12 にあることを示す。

022F3B6E-022F3B6F : 00,01       : nameRecord[0].platformID = 1
022F3B70-022F3B71 : 00,00       : nameRecord[0].encodingID = 0
022F3B72-022F3B73 : 00,00       : nameRecord[0].languageID = 0
022F3B74-022F3B75 : 00,00       : nameRecord[0].nameID = 0
022F3B76-022F3B77 : 00,18       : nameRecord[0].length = 0x18
022F3B78-022F3B79 : 00,00       : nameRecord[0].stringOffset = 0

022F3B7A-022F3B7B : 00,01       : nameRecord[1].platformID = 1
022F3B7C-022F3B7D : 00,00       : nameRecord[1].encodingID = 0
022F3B7E-022F3B7F : 00,00       : nameRecord[1].languageID = 0
022F3B80-022F3B81 : 00,01       : nameRecord[1].nameID = 1
022F3B82-022F3B83 : 00,0C       : nameRecord[1].length = 0x0C
022F3B84-022F3B85 : 00,18       : nameRecord[1].stringOffset = 0x18

022F3B86-022F3B87 : 00,01       : nameRecord[2].platformID = 1
022F3B88-022F3B89 : 00,00       : nameRecord[2].encodingID = 0
022F3B8A-022F3B8B : 00,00       : nameRecord[2].languageID = 0
022F3B8C-022F3B8D : 00,02       : nameRecord[2].nameID = 2
022F3B8E-022F3B8F : 00,07       : nameRecord[2].length = 0x07
022F3B90-022F3B91 : 00,24       : nameRecord[2].stringOffset = 0x24

以下略



今回用いた mingliub.ttc には 3 つのフォントが含まれており、
それぞれが 35 個の Naming table レコードを含んでいましたが
Gekka さんのコードではすべてを読み取ることができません。
platformID が 3 (Windows) のもの以外は無視する設計になっているためです。

すべてのデータを読み取りたい場合には、NameRecord.ReadData メソッドや
TTF.GetNames メソッド内の platformID 判定部を修正する必要があります。

platformID, encodingID, languageID の意味についてはこのあたり。
https://docs.microsoft.com/en-us/typography/opentype/spec/name#platform-encoding-and-language-ids


一つの nameID に対して、platformID, encodingID, languageID の異なる
複数の組み合わせが同時に収録されています。

今回のケースだと、nameID が 13, 14, 19 の物は、Windows / 米語 だけの収録でしたが、
nameID が 0~7 のレコードに関しては、Mac を含む下記 4 言語で収録されていました。

platformID    : encodingID      : languageID
------------- : --------------- : --------------------------------
1 (Macintosh) : 0 (Roman)       : 0x0000 (English)
3 (Windows)   : 1 (Unicode BMP) : 0x0404 (Chinese/Taiwan)
3 (Windows)   : 1 (Unicode BMP) : 0x0409 (English/United States)
3 (Windows)   : 1 (Unicode BMP) : 0x0409 (Chinese/Hong Kong S.A.R.)


nameID = 19 "SampleText" の内容は "𠀀𠀁𠀂𠀃𠀄\r𦬣𦬤𦬥𦬦𦬧\r𦩒𦩓𦩔𦩕𦩖\r𨣫𨣬𨣭𨣮𨣯" なのに
収録されている languageID が 英語(米語) だけだったのが、ちょっと違和感。