2012-04-05 94 views

回答

4

好吧,我找到了我的問題的答案,endPtsOfContours有座標列表中每個輪廓的最後一個點的位置。

我用TTFDUMP找出答案是什麼。

1

只是爲了闡明如何計算標誌的數量。標誌,n的數量,是endPtsOfContours + 1

+0

找到至少兩個公式不適用的字體:Bradley Hand ITC Regular和Rage Italic。 TTFDUMP返回不同數量的標誌。 – 2016-03-02 12:02:54

+0

@IgorBrejc好吧,什麼字形顯示這個問題。標誌的實際數量是多少? endPtsOfContours的最後一個元素是什麼?如果您需要檢查單個字節,請參閱https://github.com/vidstige/NRasterizer在C#中的小實現。你還可以在評論中鏈接字體文件嗎? – vidstige 2016-03-02 14:34:59

+0

@IgorBrejc請參閱下面的答案。上述兩種字體可能使用* Repeat *標誌,這會導致標誌數量和點數之間的差異。 – Waruyama 2016-04-02 09:23:44

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定期和憤怒在上述使用它的評論中提到斜體),但如果你想要確保你閱讀正確的標誌數量,你必須考慮到這一點。

+0

不錯!你是怎麼找到這個的?任何來源?我閱讀規格(很久以前),沒有罰款任何東西: -/ – vidstige 2016-04-02 19:24:11

+0

@vistige我從開放式規格在https://www.microsoft.com/typography/otspec/glyf.htm 這是在*標誌*表(位3是重要的).. – Waruyama 2016-04-02 22:16:19