在freetype和pango / cairo之间测量的渲染文本宽度的差异

时间:2013-03-16 21:56:50

标签: c rendering cairo freetype pango

我正在尝试预测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;
}

0 个答案:

没有答案