2011-03-10 80 views
4

我使用FreeType2進行字體渲染,並且我需要爲所有字體獲取全局邊界框,以便我可以將它們對齊到一個漂亮的網格中。我叫FT_Set_Char_Size接着用FreeType2:以像素爲單位獲取全局字體邊界框?

int pixels_x = ::FT_MulFix((face->bbox.xMax - face->bbox.xMin), face->size->metrics.x_scale); 
int pixels_y = ::FT_MulFix((face->bbox.yMax - face->bbOx.yMin), face->size->metrics.y_scale); 
return Size (pixels_x/64, pixels_y/64); 

其中工程提取了全球範圍,但它是相當多的過大。我也試圖計算使用雙打(as described in the FreeType2 tutorial),但結果幾乎相同。即使只使用​​也會導致太寬的邊界框。我做的是正確的事,還是隻有一些巨大的字形在我的字體(Arial.ttf在這種情況下?)有什麼辦法來檢查哪個字形被認爲是那麼大?

回答

0

爲什麼不計算您想要對齊的字符串中使用的字符的最小/最大值?只需循環訪問字符並存儲您正在使用的字符的最大值和最小值即可。您可以在渲染這些值之後存儲這些值,以便每次渲染字形時不需要查看它們。

+0

我不知道哪些字符/要求多少。也就是說,當我初始化網格時,我還沒有渲染任何東西。每個新角色都被添加到網格上的下一個空閒位置。 – Anteru 2011-03-11 14:01:22

+0

一旦檢測到較大的字符,就不可能重新放置已放置的字符? – 2011-03-11 19:32:17

+3

如果屏幕網格開始重新調整,那看起來會很醜陋。 – Anteru 2011-03-12 06:56:10

0

我有一個類似的問題,使用freetype來呈現將出現在網格中的一堆文本元素。並非所有的文本元素都是相同的大小,我需要先將它們預渲染,然後才能知道它們的佈局位置。當高度發生變化時,不同尺寸是最大的問題,例如字母的下降部分(如「j」或「Q」)。

我結束了使用臉上的高度(有點像你用bbox做的)。但就像你提到的那樣,這個價值很大。它應該是基線到基線的距離,但它似乎是這個距離的兩倍。所以,我採取了簡單的方法,並將報告的身高除以2,並將其用作一般身高值。最有可能的是,高度太大,因爲字體中的某些字符走得太高或太低。

我想一個更好的方法可能是遍歷所有預期使用的字符,得到它們的字形度量並存儲找到的最大高度。但是,這看起來並不健全。

相關問題