我继承了一个代码,其中作者使用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
函数(也在提到的文件中)以返回{ {1}}但是有一个例外,即face->glyph->metrics.width
为空。但我认为我甚至不应该尝试编辑图书馆资源。
由于我不知道如何获得文本宽度我考虑以某种方式打印文本,获取打印内容的宽度并在其上打印一些内容。对此有何看法?
答案 0 :(得分:4)
如果您只使用拉丁字符,这是一种简单而肮脏的方法。
你可以迭代字形,加载每个字形,然后计算边界框:
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字符串。我强烈建议你使用这个。