我正在尝试预测pango库渲染文本的宽度,但我试图在裸Freetype中实现它以获得性能。
回答评论者 - 是的,我使用callgrind
工具衡量了效果。 pango大部分时间都花在fontconfig上,这是不可能解决的。 pango_layout_get_extents
也不是非常快。同时freetype的性能非常快 - 但由于缺乏适当的设置,结果可能不准确。不幸的是,我无法发布渲染的位图,因为我只进行了简单的测量 - 但为了比较,这可能是值得努力实现的。我的用例中的渲染是由SVG中的Web浏览器完成的,我唯一的需要是预测渲染文本的长度 - 因此我不提供问题中的位图,因为我没有渲染代码。
我的测试程序运行:
> ./freetype_text /usr/share/fonts/truetype/verdana.ttf "WWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWW"
Width: 374
然而..字体大小为10(72dpi)的相同文本在pango中以340px呈现。测量是通过以下方法测量布局的常用方法:
PangoRectangle logical_rect = {0, 0};
pango_layout_get_extents (layout, NULL, &logical_rect);
我观察到的差异可能是什么原因?我观察到的差异范围为0%-15%。
下面是我的freetype测试程序(使用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;
}