FreeType中的新行像素距离?

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)

  • 如果它们是1/64像素值,则应该除以64. 64个单位将是一个像素 (5认同)
  • `face-> height`不取决于大小.相反,你应该使用`face-> size-> metrics.height`来返回缩放的高度.这些数字也是1/64像素,所以你应该乘以64. (2认同)

And*_*man 2

非垂直字体是什么意思?字体并不是真正水平或垂直的,但当您要打印某些文本时,您可以垂直或水平排列字形。您会发现,对于大多数字体,字形存储两组属性(水平和垂直前进),以便您可以根据需要水平或垂直排列文本。

\n

如果您水平绘制文本,则不会使用字形的提前量,提前量用于文本字符串中字符之间的间距。对于线之间的间距,您真正想要的是知道最大上升和下降(基线上方/下方的距离),以便您的线不会重叠。

\n

实际上,您可以在不知道字符串中的任何字符的情况下计算所需的行间距。如果您知道字体中上升和下降最大的字符,则可以完成此操作。在罗马字体中,上升最大的字符通常是T,下降最大的字符是g。我对中文的熟悉程度为零,所以我无法告诉你一般的经验法则,但我确信有一个。

\n

仔细看看下面来自 FreeType 2 的图表(水平)

\n

\xc2\xa0\xc2\xa0http://www.freetype.org/freetype2/docs/tutorial/metrics.png

\n

在上图中,字母的上升g由 测量bearingY,下降可以计算为bearingY - height。行之间的最小间距将是行中每个字形的最大上升和下降的总和。请记住,最好将其推广到整个字体并保持间距一致,而不是为打印的每个字符串实际计算它(您的行最终会根据它们包含的字符而改变垂直位置)。

\n