在FreeType中设置字符大小

时间:2016-11-17 14:27:04

标签: freetype freetype2

我有点困惑设置字符大小对象的字符宽度和高度字段(例如enter image description here中描述的那样)

error = FT_Set_Char_Size(
          face,    /* handle to face object           */
          0,       /* char_width in 1/64th of points  */
          16*64,   /* char_height in 1/64th of points */
          300,     /* horizontal device resolution    */
          300 );   /* vertical device resolution      */

为什么要指定char_widthchar_height?这不应该取决于实际的字形吗?例如,字符“w”和“l”具有不同的宽度和高度。

另外,由于我没有渲染到屏幕(我计划将光栅字体数据用于其他一些深奥的目的),使用enter image description here代替了吗?

1 个答案:

答案 0 :(得分:2)

函数 FT_Set_Char_Size 和 FT_Set_Pixel_Sizes 设置字体的大小,不是单个字符的大小,而是字体 em square 的大小,它是一个可能与最高字符一样高的概念正方形(例如,方括号: '[') 但实际上可能与任何字符的高度不同;它只是定义了一个参考尺寸。设置 12pt 大小的主要含义是创建的字符通常适合相距 12pt 的基线而不会发生冲突,并且与来自其他字体的 12pt 字符协调。因此,“em”是表示字体大小的排版尺寸。

高度和宽度可单独设置,因此您可以使用比高度更大或更小的宽度来创建扩展(水平放大)或压缩(水平压缩)字体。通常您将宽度保留为零,这意味着 em 正方形的宽度与高度相同,并且字符将按标准比例创建,而不是拉伸或收缩。

没有理由使用 FT_Set_Char_Size 而不是 FT_Set_Pixel_Sizes,因为 FT_Set_Char_Size 可以提供更好的控制; FT_Set_Pixel_Sizes 不允许小数像素,这在创建抗锯齿字形时很有意义。最终结果总是使用 em 大小和显示分辨率来计算。

在您的情况下,您不妨使用 FT_Set_Pixel_Sizes;但如果您需要小数像素大小,请使用 FT_Set_Char_Sizes,高度为 64 像素,宽度为零,水平和垂直设备分辨率为零; 0 的分辨率使像素与点的大小相同。因此,要获得 11.5 的像素大小,您可以使用

FT_Set_Char_Sizes(face,0,11 * 64 + 32,0,0);