2

我试图预测 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;
}
4

0 回答 0