2012年3月11日日曜日

IPAフォントが、何か変。 ( その3 )

やっぱり何か変。

仕様書通りの解釈だと、glyphIdArrayへのオフセットは、ghostscriptのソースにあるように、

READ_SFNTS(pfont, pcmap->idDelta + segment2, 2, ttdata);
delta = U16(ttdata);
READ_SFNTS(pfont, pcmap->idRangeOffset + segment2, 2, ttdata);
roff = U16(ttdata);
if (roff) {
ulong gidoff = pcmap->idRangeOffset + segment2 + roff +
(chr - start) * 2;

となるのだけれど、chr=#x57a8の場合は、これは、直前のidRangeOffsetを指していて、

READ_SFNTS(pfont, gidoff, 2, ttdata);
value = U16(ttdata);
で得られる値は、#x0723 になるはず。

実際には、この値にさらに、idDeltaの値が加わるわけだけれど、こんなに tricky なコーディングをするはずがない。

[追記:2012-03-13]
少し、判った。正しく表示できるソフトウェアは、たぶん、cmap を見るのに、(platformID 3) (encodingID 1) (format 4)の方ではなくて、(platformID 3) (encodingID 10) (format 12) の方を参照しているのだろう。
(format 4)の方は、「過去との互換性」のために残されているだけで、こちらを参照してしまうと、グリフが見つからない結果になる。
(format 12)の方は
(Group (#x754) (startChar #x57A8) (endChar #x57A8) (startGlyphID #x28A8)
といったデータが書きこまれていて、たぶんこれが本当のグリフの場所。

ということは、エンコーディングを UTF16(UCS2)でなく、UCS4を指定すればいいのかな?

あるいは、format 12 の方を優先して検索するべきところを、format 4を優先している(?)という ghostscriptのバグの可能性もあるなぁ。

0 件のコメント:

コメントを投稿