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) の同じテキストが 340px の pango でレンダリングされます。測定は、以下を使用してレイアウトを測定する一般的な方法によるものです。
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;
}