【发布时间】:2021-02-18 17:39:33
【问题描述】:
我试图弄清楚 FreeType 库是如何计算 FT_GlyphSlotRec_ 的 advance 变量的。根据该结构上方的注释块,该变量与horiAdvance 变量相同,进一步解释了here,它包含在FT_Glyph_Metrics_ 结构中。
无论如何,以典型的 Arial 窄字体为例。它可以在 C:\Windows\Fonts\ARIALN.TTF 中找到。将其上传到任何基于 Web 的 TTF 文件编辑器(option 1、option 2),或使用您自己的可以解释 TTF 文件的程序(fontforge 等),您可以看到“!”的 Advance字符被明确定义为467。
我正在运行以下代码,当我读取FT_GlyphSlotRec_ 的advance.x 值时,我得到的值为1472。显然这与467 不同。我是否误解了它的含义?还是我错误地使用了 FreeType 库?
我正在重新键入以前从没有互联网的计算机上获取 1472 的代码,所以请原谅我的任何普通语法错误。
#include <string>
#include <ft2build.h>
#include FT_FREETYPE_H
using namespace std;
int main() {
FT_Uint font_height = 100;
FT_Library ft;
FT_Face face;
char* filepathname; // Defined through code that was excluded for the sake of simplifying this example
FT_Init_FreeType(&ft);
FT_New_Face(ft, filepathname, 0, &face);
FT_Set_Pixel_Sizes(face, 0, font_height);
FT_Uint glyph_idx = FT_Get_Char_Index(face, 33);
FT_Load_Glyph(face, glyph_index, FT_LOAD_RENDER);
FT_Pos advance_x = face->glyph->advance.x;
return 0;
}
在main() 结束时中断导致advance_x 为1472。
【问题讨论】:
-
"1472 is not the same as 467" 是没有任何单位信息的无意义比较。
-
@molbdnilo 我希望我知道要告诉你关于单位的内容。处理字体指标对我来说是新的。我们在谈论 em 大小吗?还有什么?我知道
face->glyph->advance.x是 26.6 小数像素格式,这意味着 1 个单位等于 1/64 像素。 -
您正在使用 FT_Set_Pixel_Sizes 更改比例 - 所以您的 advance.x 取决于您的 font_height。
-
@MarkusSchumann 这很有帮助,但我似乎仍然无法让 Advance.x 与 ARIALN.ttf 中嵌入的 467 Advance 相匹配。我必须在这个函数中提供一些值,并且 font_height 为 32 会产生最接近的 Advance.x 448,但仍然不是 467。我也玩过 FT_Set_Char_Size(),利用零宽度和 32 * 64 高度,产生类似的结果。
-
你从哪里得到 467?