C++ FreeType中的新行像素距离?

C++ FreeType中的新行像素距离?,c++,c,opengl,fonts,freetype,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 } 起初我用 newL

我尝试在OpenGL和FreeType2中渲染文本,但我不知道在渲染字体时如何获得每行之间的空间(以像素为单位)。当我解析文本时,我希望能够执行以下操作

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;

但是它对某些字体不起作用,因为文档还说它对非垂直字体(中文等)不可靠。

非垂直字体是什么意思?字体实际上不是水平或垂直的,但在打印某些文本时,可以垂直或水平排列字形。您会发现,对于大多数字体,glyph存储两组属性(水平和垂直前进),以便您可以选择水平或垂直排列文本

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

实际上,您可以在不知道字符串中的任何字符的情况下计算所需的行间距。这可以做到,如果你知道的字符与最大的上升和下降在您的字体。在罗马字体中,上升幅度最大的字符通常是
T
,下降幅度最大的字符是
g
。我对中文一点也不熟悉,所以我不能告诉你一个普遍的经验法则,但我相信有一个

仔细查看FreeType 2(水平)中的下图:


在上图中,字母
g
的上升通过
bearingY
测量,下降可计算为
bearingY-高度
。线条之间的最小间距是线条中每个标志符号的最大上升和下降的总和。请记住,最好是对整个字体进行概括,并保持间距一致,而不是为打印的每个字符串实际计算间距(根据所包含的字符,行最终会移动垂直位置)。

无需计算行距,因为FreeType已经提供了行距。由于它是艺术家定义的,因此自己计算它也可能产生错误的结果。例如,小写字母“g”的最低部分可以延伸到下一行大写字母“g”的最高部分下方

从文档中:

高度

此字段表示使用此字体写入文本时的默认行距(即基线到基线的距离)。请注意,它通常大于作为绝对值的上升和下降之和。使用此距离时,也不能保证任何标志符号都不会延伸到后续基线的上方或下方——请将其视为字体设计者认为合适的值

如何使用它:

// 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;

省略我写的“non-”前缀,这是错误的。我指的是文字自上而下的语言,比如汉语。不管怎样,你第二和第三段中的解释就是我想要的。假设我有字体的最大上升和下降值,那么使用这些值来获得所需行间距的标准方法是什么?就像固定数量的像素必须介于“g”和“T”之间,如果一个像素在第二个像素之上。@Pilpel:这将告诉您所需的确切像素间距。您还需要至少1个额外像素,以便一行上的“g”底部和下一行上的“T”顶部不接触。这个概念作为一个整体被称为“线间距”。您应该看看全局glyph metrics部分-您最感兴趣的值是
高度
面->高度
不取决于大小。相反,您可能应该使用
face->size->metrics.height
返回缩放高度。而且这些数字是1/64像素,所以你应该乘以64。你的字体标准是正确的,我会编辑这篇文章。它已经提到测量值是一个像素的64分之一。如果测量值是一个像素值的1/64,则应相差64。64个单位将是一个像素