我在學習如何閱讀打開的字體文件。True Type字體。 glyf表的問題
事情是我在閱讀某些表時遇到問題。我認爲這將是足以與http://www.microsoft.com/typography/otspec/otff.htm
給予當試圖讀取glyf表我下簡單的字形說明 flags[n]
,其中n爲標誌的號碼查詢信息。
問題是我不知道從哪裏得到的標誌數量,並且沒有看到表格標誌的數量似乎不可能。
我在學習如何閱讀打開的字體文件。True Type字體。 glyf表的問題
事情是我在閱讀某些表時遇到問題。我認爲這將是足以與http://www.microsoft.com/typography/otspec/otff.htm
給予當試圖讀取glyf表我下簡單的字形說明 flags[n]
,其中n爲標誌的號碼查詢信息。
問題是我不知道從哪裏得到的標誌數量,並且沒有看到表格標誌的數量似乎不可能。
好吧,我找到了我的問題的答案,endPtsOfContours有座標列表中每個輪廓的最後一個點的位置。
我用TTFDUMP找出答案是什麼。
只是爲了闡明如何計算標誌的數量。標誌,n
的數量,是endPtsOfContours
+ 1
的最後元素。雖然這是一個老問題,我覺得我需要添加一些更多的信息,這個話題的答案上面可能會產生錯誤的結果。
字形中的點數等於最後的endPtsOfContours
+ 1.通常這等於標記數n
,但不一定是。使用標誌中的位3(重複標誌)表示相同標誌重複多次。如果設置了該標誌,標誌的數量可以低於點的數量。
事實是,在閱讀標誌之前,您無法知道需要讀取多少字節。你將不得不繼續閱讀旗幟,直到你達到點數。這是一個小的Javascript snipplet,顯示瞭如何讀取標誌。
var pointCount; // This has to the set to the last endPtsOfContours + 1
var flags = []; // our internal array of flags
while (flags.length < pointCount) {
var flag = fontReader.readByte(); // flag is a single byte
flags.push(flag); // add flag
if (flag & 8) { // if bit 3 is set
var repeats = fontReader.readByte(); // next byte indicates repeats of the flag
for (; repeats > 0; repeats--) {
flags.push(flag); // add same flag again
}
}
}
我不能告訴你,如果還是多久重複標誌在現實世界中使用的字體(可能是兩種字體布拉德利手ITC定期和憤怒在上述使用它的評論中提到斜體),但如果你想要確保你閱讀正確的標誌數量,你必須考慮到這一點。
找到至少兩個公式不適用的字體:Bradley Hand ITC Regular和Rage Italic。 TTFDUMP返回不同數量的標誌。 – 2016-03-02 12:02:54
@IgorBrejc好吧,什麼字形顯示這個問題。標誌的實際數量是多少? endPtsOfContours的最後一個元素是什麼?如果您需要檢查單個字節,請參閱https://github.com/vidstige/NRasterizer在C#中的小實現。你還可以在評論中鏈接字體文件嗎? – vidstige 2016-03-02 14:34:59
@IgorBrejc請參閱下面的答案。上述兩種字體可能使用* Repeat *標誌,這會導致標誌數量和點數之間的差異。 – Waruyama 2016-04-02 09:23:44