我试图预测 pango 库呈现的文本有多宽,但为了性能起见,我试图在裸 Freetype 中实现它。
回答评论者 - 是的,我使用该callgrind
工具测量了性能。而且 pango 大部分时间都花在了 fontconfig 上,这是无法解决的。pango_layout_get_extents
也不是非常快。同时,freetype 的性能非常快 - 但可能由于缺乏适当的设置而导致结果不准确。不幸的是,我无法发布渲染的位图,因为我只进行了简单的测量——但为了比较起见,实施它可能是值得的。我的用例中的渲染是由 SVG 中的网络浏览器完成的,我唯一需要的是预测渲染文本的长度 - 因此由于我没有渲染代码,因此在问题中不提供位图。
我的测试程序运行:
> ./freetype_text /usr/share/fonts/truetype/verdana.ttf "WWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWW"
Width: 374
但是 .. 字体大小为 10 (72dpi) 的相同文本在 pango 中以 340 像素呈现。测量是通过测量布局的常用方法:
PangoRectangle logical_rect = {0, 0};
pango_layout_get_extents (layout, NULL, &logical_rect);
我观察到的差异可能是什么原因?我观察到的差异范围为 0%-15%。
下面是我的自由类型测试程序(编译gcc freetype_text.c $(pkg-config --cflags --libs freetype2))
#include <ft2build.h>
#include FT_FREETYPE_H
#include FT_OUTLINE_H
#include FT_STROKER_H
#include FT_GLYPH_H
#include FT_TRUETYPE_IDS_H
static FT_Library library;
int main(int argc, char** argv)
{
FT_Error error = FT_Init_FreeType( &library );
if ( error ) {
return 1;
}
int i;
FT_Face face;
error = FT_New_Face( library, argv[1], 0, &face );
if(error) {
return 2;
}
FT_Set_Pixel_Sizes(face, 0, 10);
char* str = argv[2];
wchar_t ch = 0;
FT_GlyphSlot slot = face->glyph;
int w = 0;
int previous = 0;
while( (ch = *str) != 0) {
int glyph_index = FT_Get_Char_Index( face, ch );
error = FT_Load_Glyph(face, glyph_index, FT_LOAD_DEFAULT|FT_LOAD_NO_BITMAP);
str++;
w += slot->advance.x;
if(previous && glyph_index )
{
FT_Vector delta;
FT_Get_Kerning( face, previous, glyph_index, FT_KERNING_DEFAULT, &delta );
w += delta.x ;
}
previous = glyph_index;
}
printf("Width: %i\n", w/64);
return 0;
}