【发布时间】:2022-03-24 06:43:02
【问题描述】:
在 Freetype2 中,我们使用下面的公式来计算给定大小的字体高度。 高度 = (int)((point_size / face->units_per_EM) * (face->ascender - face->descender)); 其中 point_size 是用户提供的数据。
但对于某些字体,它会给出错误的数据。任何人都可以帮助找到正确的公式来找到给定点的正确字体高度吗? (不适用于单个字形)。
【问题讨论】:
在 Freetype2 中,我们使用下面的公式来计算给定大小的字体高度。 高度 = (int)((point_size / face->units_per_EM) * (face->ascender - face->descender)); 其中 point_size 是用户提供的数据。
但对于某些字体,它会给出错误的数据。任何人都可以帮助找到正确的公式来找到给定点的正确字体高度吗? (不适用于单个字形)。
【问题讨论】:
cocos2d-x中使用的方法如下:
_lineHeight = static_cast((face->size->metrics.ascender - face->size->metrics.descender) >> 6);
大多数字体都可以。对于不正常的情况,我在获取 GlyphBitmap 的高度后校准值,然后使用较大的作为最大行高。
【讨论】:
使用较大的作为最大行高是解决此问题的最佳方法。 因为如果你单独写不同的字符串,你可能会得到一个错误的行对齐。
所以我找到的最佳解决方案如下:
int bbox_ymax = FT_MulFix(face->bbox.yMax, face->size->metrics.y_scale) >> 6;
int bbox_ymin = FT_MulFix(face->bbox.yMin, face->size->metrics.y_scale) >> 6;
int height = bbox_ymax - bbox_ymin;
对于某些字体,如果vertAdvance < bbox_ymax,则需要使用face->glyph->metrics.vertAdvance 而不是bbox_ymax
【讨论】: