我正在使用FreeType2进行字体渲染,我需要为所有字体获取一个全局边界框,因此我可以将它们对齐在一个漂亮的网格中。我调用FT_Set_Char_Size
,然后使用
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),但结果几乎相同。即使仅使用face->bbox.xMax
也会导致边界框太宽。我做的是正确的,还是我的字体中只有一些巨大的字形(在这种情况下是Arial.ttf?)有什么方法可以检查哪个字形应该是那么大?
答案 0 :(得分:0)
为什么不计算您要在对齐的字符串中使用的字符的最小值/最大值?只需遍历字符并存储您正在使用的字符的最大值和最小值。您可以在渲染后存储这些值,这样每次渲染字形时都不需要查找它们。
答案 1 :(得分:0)
我有一个类似的问题,使用freetype渲染将出现在网格中的一堆文本元素。并非所有的文本元素都是相同的大小,我需要先预先渲染它们,然后才能知道它们的布局。当高度改变时,不同尺寸是最大的问题,例如具有下降部分的字母(如“j”或“Q”)。
我最终使用了脸上的高度(有点像你对bbox所做的那样)。但就像你提到的那样,这个价值要大得多。它应该是基线距离的基线,但它似乎是距离的两倍左右。所以,我采取了简单的方法,将报告的高度除以2并将其用作一般高度值。最有可能的是,高度太大,因为字体中的某些字符会高或低。
我想更好的方法可能是遍历所有预期使用的字符,获取字形度量并存储找到的最大高度。但这似乎并不那么强大。
答案 2 :(得分:0)
您的代码正确。
它不是太大。
因为有许多特殊的符号,其大小比ascii字符大。 。 view special big symbol
遍历所有unicode字符码,找到那些大符号很容易。
如果您只需要ascii,我的破解方法是
FT_MulFix(face_->units_per_EM, face_->size->metrics.x_scale ) >> 6
FT_MulFix(face_->units_per_EM, face_->size->metrics.y_scale ) >> 6