gpt4 book ai didi

c++ - 如何在 FreeType 中获取文本宽度?

转载 作者:行者123 更新时间:2023-11-27 22:45:44 26 4
gpt4 key购买 nike

我继承了一个代码,其中作者使用 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 但是有一个异常说 face->glyph 是空的。但我认为我什至不应该尝试编辑库的源代码。

因为我不知道如何获得文本宽度,所以我正在考虑以某种方式打印文本,获得打印内容的宽度并在其上打印一些东西。对此有什么想法吗?

最佳答案

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

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

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 字符串。我强烈建议您使用这个。

关于c++ - 如何在 FreeType 中获取文本宽度?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43272946/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com