FreeType调用FT_Get_Glyph后advance.x值异常问题咨询
问题解答
1. 关于FT_Get_Glyph后advance值的获取
你的核心理解是对的,但需要修正移位的位数:
调用FT_Get_Glyph后,glyphs[c]->root.advance.x采用16.16定点数格式,要得到正确的整数advance值,必须对其右移16位(glyphs[c]->root.advance.x >> 16),而非你测试代码里的右移6位。
从你的输出就能验证这一点:你打印的Advance after get: 16384其实是16 << 16 >> 6 = 16 << 10 = 16384,如果换成右移16位,结果就是16 <<16 >>16 =16,和ftFace->glyph->advance.x >>6的输出完全一致。
2. 两种定点数格式的设计逻辑
FreeType使用两种不同的定点数格式,是为了适配不同模块的功能需求:
- FT_GlyphSlot(26.6格式):这是字形加载后的临时处理结构,26位的整数部分可以支持更大的坐标范围(比如大字号、复杂变换后的字形位置),6位小数刚好满足字形渲染的像素级精度——毕竟屏幕渲染只需要整数像素附近的精度,1/64像素的精度完全够用。
- FT_Glyph(16.16格式):这是通用的字形对象,用于缓存、复制、跨模块传递或复杂几何变换(比如旋转、缩放)。16.16是FreeType的通用坐标格式,16位小数提供了足够的变换精度,同时数据长度更紧凑,适合长期存储(比如你的字形缓存),也方便和其他图形系统(如OpenGL)对接。
内容的提问来源于stack exchange,提问作者nauman
相关产品推荐
相关产品推荐

