Pil*_*pel 2 c c++ opengl fonts freetype
我尝试在OpenGL和FreeType2中渲染文本,我不知道在渲染字体时如何获得每行之间的空间(以像素为单位).当我解析文本时,我希望能够做类似的事情
const char *text = "some text\n here";
for(char *p = text; *p; p++)
{
if(*p == '\n')
{
y -= newLineDistance;
continue;
}
...//render text here
}
Run Code Online (Sandbox Code Playgroud)
起初我用过
newLineDistance = face->glyph->metrics.vertAdvance >> 6;
Run Code Online (Sandbox Code Playgroud)
但它不适用于某些字体,因为文档也说它对非垂直字体(中文等)不可靠
Fib*_*les 10
无需计算行间距,因为FreeType已经提供了它.自己计算它也可能会产生错误的结果,因为它是艺术家定义的.例如,小写字母'g'的最低部分可以在下面一行上的大写字母的最高部分下方延伸.
来自文档:http: //www.freetype.org/freetype2/docs/tutorial/step2.html
高度
此字段表示使用此字体书写文本时的默认行间距(即基线到基线距离).请注意,它通常大于ascender和descender之和作为绝对值.当使用此距离时,也无法保证在后续基线之上或之下没有字形延伸 - 将其视为字体设计者认为合适的值.
如何使用它:
// 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;
Run Code Online (Sandbox Code Playgroud)
非垂直字体是什么意思?字体并不是真正水平或垂直的,但当您要打印某些文本时,您可以垂直或水平排列字形。您会发现,对于大多数字体,字形存储两组属性(水平和垂直前进),以便您可以根据需要水平或垂直排列文本。
\n如果您水平绘制文本,则不会使用字形的提前量,提前量用于文本字符串中字符之间的间距。对于线之间的间距,您真正想要的是知道最大上升和下降(基线上方/下方的距离),以便您的线不会重叠。
\n实际上,您可以在不知道字符串中的任何字符的情况下计算所需的行间距。如果您知道字体中上升和下降最大的字符,则可以完成此操作。在罗马字体中,上升最大的字符通常是T,下降最大的字符是g。我对中文的熟悉程度为零,所以我无法告诉你一般的经验法则,但我确信有一个。
\xc2\xa0\xc2\xa0
在上图中,字母的上升g由 测量bearingY,下降可以计算为bearingY - height。行之间的最小间距将是行中每个字形的最大上升和下降的总和。请记住,最好将其推广到整个字体并保持间距一致,而不是为打印的每个字符串实际计算它(您的行最终会根据它们包含的字符而改变垂直位置)。
| 归档时间: |
|
| 查看次数: |
3152 次 |
| 最近记录: |