FreeType 中的新线像素距离?
New line pixel distance in FreeType?
我尝试在 OpenGL 和 FreeType2 中渲染文本,但在渲染字体时我不知道如何在每行之间获取 space(以像素为单位)。当我解析文本时,我希望能够做类似
的事情
const char *text = "some text\n here";
for(char *p = text; *p; p++)
{
if(*p == '\n')
{
y -= newLineDistance;
continue;
}
...//render text here
}
一开始我用
newLineDistance = face->glyph->metrics.vertAdvance >> 6;
但它不适用于某些字体,因为文档还说它对非垂直字体(中文等)不可靠
non-vertical 字体是什么意思?字体并不是真正水平或垂直的,但是当您要打印一些文本时,您可以垂直或水平排列字形。您会发现,对于大多数字体,字形存储两组属性(水平和垂直前进),以便您可以根据自己的选择水平或垂直排列文本。
如果您水平绘制文本,则不会使用字形的推进,推进用于文本字符串中字符之间的间距。对于线条之间的间距,您真正想要的是知道最大上升和下降(高于/低于基线的距离),这样您的线条就不会重叠。
您实际上可以在不知道字符串中的任何字符的情况下计算出所需的行间距。如果您知道字体中上升和下降最大的字符,则可以这样做。在罗马字体中,上升幅度最大的字符通常是 T
,下降幅度最大的字符是 g
。我对中文零熟悉,所以我不能告诉你一般的经验法则,但我肯定有一个。
仔细查看下图,来自 FreeType 2 (水平):
在上图中,字母 g
的上升由 bearingY
测量,下降可以计算为 bearingY - height
。行与行之间的最小间距将是行中每个字形的最大上升和下降之和。请记住,最好将此概括为您的 整个字体 并保持间距一致,而不是为您打印的每个字符串实际计算它(您的行最终会移动垂直位置,具体取决于它们包含哪些字符)。
不需要计算行距,因为FreeType已经提供了。自己计算也可能会产生错误的结果,因为它是艺术家定义的。例如,小写字母的最低部分 'g' 可能会在下一行延伸到大写字母的最高部分 'G' 以下。
来自文档:
http://www.freetype.org/freetype2/docs/tutorial/step2.html
height
This field represents a default line spacing (i.e., the baseline-to-baseline distance) when writing text with this font. Note that it usually is larger than the sum of the ascender and descender taken as absolute values. There is also no guarantee that no glyphs extend above or below subsequent baselines when using this distance – think of it as a value the designer of the font finds appropriate.
使用方法:
// initialise freetype
FT_Library ft;
FT_Init_FreeType(&ft);
// load a font
FT_Face face;
FT_New_Face(ft, "path_to_font.ttf", 0, &face);
// set the font size, e.g. 48 pixels
FT_Set_Pixel_Sizes(face, 0, 48);
// get the default line spacing, note that it is measured in 64ths of a pixel
int line_spacing = face->height;
// get the scaled line spacing (for 48px), also measured in 64ths of a pixel
int scaled_line_spacing = face->size->metrics.height;
我尝试在 OpenGL 和 FreeType2 中渲染文本,但在渲染字体时我不知道如何在每行之间获取 space(以像素为单位)。当我解析文本时,我希望能够做类似
的事情const char *text = "some text\n here";
for(char *p = text; *p; p++)
{
if(*p == '\n')
{
y -= newLineDistance;
continue;
}
...//render text here
}
一开始我用
newLineDistance = face->glyph->metrics.vertAdvance >> 6;
但它不适用于某些字体,因为文档还说它对非垂直字体(中文等)不可靠
non-vertical 字体是什么意思?字体并不是真正水平或垂直的,但是当您要打印一些文本时,您可以垂直或水平排列字形。您会发现,对于大多数字体,字形存储两组属性(水平和垂直前进),以便您可以根据自己的选择水平或垂直排列文本。
如果您水平绘制文本,则不会使用字形的推进,推进用于文本字符串中字符之间的间距。对于线条之间的间距,您真正想要的是知道最大上升和下降(高于/低于基线的距离),这样您的线条就不会重叠。
您实际上可以在不知道字符串中的任何字符的情况下计算出所需的行间距。如果您知道字体中上升和下降最大的字符,则可以这样做。在罗马字体中,上升幅度最大的字符通常是 T
,下降幅度最大的字符是 g
。我对中文零熟悉,所以我不能告诉你一般的经验法则,但我肯定有一个。
仔细查看下图,来自 FreeType 2 (水平):
在上图中,字母 g
的上升由 bearingY
测量,下降可以计算为 bearingY - height
。行与行之间的最小间距将是行中每个字形的最大上升和下降之和。请记住,最好将此概括为您的 整个字体 并保持间距一致,而不是为您打印的每个字符串实际计算它(您的行最终会移动垂直位置,具体取决于它们包含哪些字符)。
不需要计算行距,因为FreeType已经提供了。自己计算也可能会产生错误的结果,因为它是艺术家定义的。例如,小写字母的最低部分 'g' 可能会在下一行延伸到大写字母的最高部分 'G' 以下。
来自文档: http://www.freetype.org/freetype2/docs/tutorial/step2.html
height
This field represents a default line spacing (i.e., the baseline-to-baseline distance) when writing text with this font. Note that it usually is larger than the sum of the ascender and descender taken as absolute values. There is also no guarantee that no glyphs extend above or below subsequent baselines when using this distance – think of it as a value the designer of the font finds appropriate.
使用方法:
// initialise freetype
FT_Library ft;
FT_Init_FreeType(&ft);
// load a font
FT_Face face;
FT_New_Face(ft, "path_to_font.ttf", 0, &face);
// set the font size, e.g. 48 pixels
FT_Set_Pixel_Sizes(face, 0, 48);
// get the default line spacing, note that it is measured in 64ths of a pixel
int line_spacing = face->height;
// get the scaled line spacing (for 48px), also measured in 64ths of a pixel
int scaled_line_spacing = face->size->metrics.height;