2017-04-07 13 views
0

私は、FreeTypeとOpenGLを使用して、著者が何らかのテキスト(モノスペースフォントである必要はない)を印刷するコードを継承しました。FreeTypeでテキストの幅を取得する方法は?

私はそれを正しく整列させるために、印刷されたテキストの幅を計算する必要があります。ここで

は、彼が書いたコードです:

freetype::font_data font; 
font.init(fontPath.c_str(), fontSize); 
freetype::print(font, x, y, "%s", str.c_str()); 

Hereprint機能付きFreeTypeの源です。

私はprint機能を変更することで、テキストの幅を取得する方法を考えることができませんでしたし、私はface->glyph->metrics.widthを返すために(も言及したファイル内の)編集フォントのinit機能を試してみましたが、face->glyphがnullであるという例外がありました。しかし、私は、図書館のソースを編集しようとするべきではないと思う。

テキスト幅を取得する方法がわからないので、テキストを印刷し、印刷されたものの幅を取得して、何かを印刷することを検討しています。それについてのアイデアは?

+0

私が覚えていることから、あなたは正しい方向にあります。テキストを印刷する必要があります。これにはオフスクリーンバッファを使用できます。プリントの幅をピクセル単位で取得する方法があるはずです。 – Jay

答えて

2

ラテン文字を使用することに限定されている場合は、ここでは簡単で汚い方法です。

あなたは、グリフを反復処理し、各グリフをロードし、バウンディングボックスを計算することができます。

int xmx, xmn, ymx, ymn; 

xmn = ymn = INT_MAX; 
xmx = ymx = INT_MIN; 

FT_GlyphSlot slot = face->glyph; /* a small shortcut */ 
int   pen_x, pen_y, n; 


... initialize library ... 
... create face object ... 
... set character size ... 

pen_x = x; 
pen_y = y; 

for (n = 0; n < num_chars; n++) 
{ 
    FT_UInt glyph_index; 


    /* retrieve glyph index from character code */ 
    glyph_index = FT_Get_Char_Index(face, text[n]); 

    /* load glyph image into the slot (erase previous one) */ 
    error = FT_Load_Glyph(face, glyph_index, FT_LOAD_DEFAULT); 
    if (error) 
    continue; /* ignore errors */ 

    /* convert to an anti-aliased bitmap */ 
    error = FT_Render_Glyph(face->glyph, FT_RENDER_MODE_NORMAL); 
    if (error) 
    continue; 

    /* now, draw to our target surface */ 
    my_draw_bitmap(&slot->bitmap, 
        pen_x + slot->bitmap_left, 
        pen_y - slot->bitmap_top); 

    if (pen_x < xmn) xmn = pen_x; 
    if (pen_y < ymn) ymn = pen_y; 

    /* increment pen position */ 
    pen_x += slot->advance.x >> 6; 
    pen_y += slot->advance.y >> 6; /* not useful for now */ 

    if (pen_x > xmx) xmx = pen_x; 
    if (pen_y > ymx) ymx = pen_y; 

} 

ていませんが、より専門的にそれをしたい場合、私はあなたがharfbuzz(あるいは複雑なテキスト整形するライブラリを使用しなければならないと思います)。それは一度のサイズのすべてのsoultionです。つまり、一度コンパイルすれば、それを使ってラテン文字列だけでなくUnicodeも描画できます。私は強くこれを使用することをお勧めします。

関連する問題