2011-04-21 11 views
5

OpenType文件中的cmap表將字符代碼轉換爲字形標識。cmap的Microsoft OpenType規範

可以在任何一個可以幫助我瞭解C表達式:

*(idRangeOffset[i]/2 + (c - startCount[i]) + &idRangeOffset[i]) 

Here是格式4子表CMAP。

+4

您可以嘗試跳過Microsoft文檔並轉至原始Apple TrueType文檔:http://developer.apple.com/fonts/ttrefman/rm06/Chap6cmap.html – ohmantics 2011-04-21 15:05:55

+0

感謝ohmantics。那太棒了 ! – Ayrosa 2011-04-26 20:30:57

回答

5

因此,在表達式中i =段索引和c =字符代碼 idRangeOffset將段的偏移量獲取到cmap中的glyphIdArray中。在這種情況下是glyphIdArray [東西]。由於glyphIdArray立即在字體文件如下idRangeOffset,您使用idRangeOffset作爲基本指針。

要到glyphIdArray你需要添加idRangeOffset開始,但是因爲該值以字節爲單位,idRangeOffset表爲16位,需要除以2才能得到字數。然後在glyphIdArray中獲得段i的偏移量。

然而,你的角色的偏移量在c - startCount [i]中,所以你需要添加這個。

最後的表達式是一個指針,所以你需要解引用它來實際得到字形的索引。

該索引然後用於LOCA表。

+0

我很久沒有離開過SO了。這就是爲什麼花了我很長時間來接受你的答案。 – Ayrosa 2011-11-13 16:48:33

-5

RTFM!

「如果段的idRangeOffset值不爲0,則字符代碼的映射依賴於glyphIdArray。將從startCode起的字符代碼偏移量添加到idRangeOffset值中,該總和用作從當前位置idRangeOffset本身索引出正確glyphIdArray值這晦澀索引特技工作,因爲glyphIdArray立即在字體文件如下idRangeOffset其產生的標誌符號索引的C表達式是:。

*(idRangeOffset [I]/2 +( c - startCount [i]) + & idRangeOffset [i])

Th e值c是所討論的字符代碼,i是c出現的片段索引。如果從索引操作獲得的值不是0(表示missingGlyph),則將idDelta [i]添加到它以獲取字形索引。 idDelta算術是模65536.「

+0

但這正是我需要理解的。我不關心公式,而是關於表格佈局本身。如果idRangeOffset [i]是GlyphIDArray []的偏移量,其中段i中的字形所在的位置,此公式似乎不正確。基本上,我正在尋找的是格式4 cmap表格中數組idDelta []和idRangeOffset []的含義。謝謝。 – Ayrosa 2011-04-21 13:40:17

5

不知道你是否仍然需要它,但我分享我的研究結果爲周圍的人。

&idRangeOffset[i]指的是地址idRangeOffset[i],或在文檔的語音中,是從文件開始的偏移量。

*(x)是x的地址的內容。

因此,找到idRangeOffset[i]的地址,將其添加到idRangeOffset[i]/2 + (c - startCount[i]),結果將是另一個地址。該地址的內容是所需的字形標識。