【问题标题】:How to get text width in FreeType?如何在 FreeType 中获取文本宽度?
【发布时间】:2017-04-07 08:09:08
【问题描述】:

我继承了一个代码,作者使用 FreeType 和 OpenGL 打印一些文本(不一定是等宽字体)。

我需要计算打印文本的宽度,以便正确对齐。

这是他写的代码:

freetype::font_data font;
font.init(fontPath.c_str(), fontSize);
freetype::print(font, x, y, "%s", str.c_str());

Here 是具有print 功能的FreeType 源。

我想不出通过修改print 函数来获得文本宽度的任何方法,我尝试编辑字体的init 函数(也在提到的文件中)以返回face->glyph->metrics.width 但有一个例外说@ 987654327@ 为空。但我认为我什至不应该尝试编辑库的来源。

由于我不知道如何获取文本宽度,我正在考虑以某种方式打印文本,获取打印内容的宽度并在其上打印一些内容。有什么想法吗?

【问题讨论】:

  • 据我所知,您走在正确的轨道上。您必须打印文本,您可以为此使用屏幕外缓冲区。应该有一种方法可以获取以像素为单位的打印宽度。

标签: c++ freetype2


【解决方案1】:

如果您仅限于使用拉丁字符,这里有一个简单而肮脏的方法。

您可以遍历字形,加载每个字形,然后计算边界框:

int xmx, xmn, ymx, ymn;

xmn = ymn = INT_MAX;
xmx = ymx = INT_MIN;

FT_GlyphSlot  slot = face->glyph;  /* a small shortcut */
int           pen_x, pen_y, n;


... initialize library ...
... create face object ...
... set character size ...

pen_x = x;
pen_y = y;

for ( n = 0; n < num_chars; n++ )
{
  FT_UInt  glyph_index;


  /* retrieve glyph index from character code */
  glyph_index = FT_Get_Char_Index( face, text[n] );

  /* load glyph image into the slot (erase previous one) */
  error = FT_Load_Glyph( face, glyph_index, FT_LOAD_DEFAULT );
  if ( error )
    continue;  /* ignore errors */

  /* convert to an anti-aliased bitmap */
  error = FT_Render_Glyph( face->glyph, FT_RENDER_MODE_NORMAL );
  if ( error )
    continue;

  /* now, draw to our target surface */
  my_draw_bitmap( &slot->bitmap,
                  pen_x + slot->bitmap_left,
                  pen_y - slot->bitmap_top );

  if (pen_x < xmn) xmn = pen_x;
  if (pen_y < ymn) ymn = pen_y;

  /* increment pen position */
  pen_x += slot->advance.x >> 6;
  pen_y += slot->advance.y >> 6; /* not useful for now */

  if (pen_x > xmx) xmx = pen_x;
  if (pen_y > ymx) ymx = pen_y;

}

但是如果你想做得更专业,我认为你必须使用 harfbuzz(或复杂的文本整形库)。它是一刀切的灵魂,这意味着一旦你编译它,你不仅可以用它来绘制和测量拉丁字符串,还可以绘制和测量 Unicode 字符串。我强烈建议你使用这个。

【讨论】:

  • 可以使用FT_LOAD_NO_BITMAP,不渲染,只获取metrics。
  • 渲染位图是浪费时间
猜你喜欢
  • 2010-12-17
  • 2021-03-24
  • 1970-01-01
  • 1970-01-01
  • 2013-12-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多