2011-03-10 83 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,并将其用作一般身高值。最有可能的是,高度太大,因为字体中的某些字符走得太高或太低。

我想一个更好的方法可能是遍历所有预期使用的字符,得到它们的字形度量并存储找到的最大高度。但是,这看起来并不健全。

相关问题