[英]How to get text width in FreeType?
我繼承了一個代碼,其中作者使用FreeType和OpenGL打印了一些文本(不一定是等寬字體)。
我需要計算打印的文本寬度,以便正確對齊。
這是他寫的代碼:
freetype::font_data font;
font.init(fontPath.c_str(), fontSize);
freetype::print(font, x, y, "%s", str.c_str());
這是帶有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字符串。 我強烈建議您使用這個。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.