2016-08-24 19 views
1

私はstb_truetypeを使用して、OpenGLコンテキストでTrueTypeフォントをレンダリングしています。stb_truetype文字列のサイズを計算する

レンダリングする前に、フォント内の文字列の高さと幅を事前に決定する簡単な方法はありますか?

+0

これはOpenGLと何が関係がありますか?高さ/幅の計算は、使用しているフォントライブラリの関数です。 –

+0

stbのタグを取得できなかったために –

+0

@Briggyこれは解決策frを見つけましたか?もしそうなら、投稿してください。そうでない場合は、どの言語を使用していますか?私はLWJGL 3のstb(so、Java)へのバインドでこれを行う方法を見つけましたが、投稿前に私の答えが適切であることを確認したいと思います。 – Tophandour

答えて

0

@ Tophandourの答えは幅の良い近似値でしたが、stbはこれをより正確に行う関数を提供しています。情報がstbtt_InitFont経由で作成したフォント情報オブジェクトであるとCSCALE

public float getWidth(String text) { 
    float length = 0f; 
    for (int i = 0; i < text.length(); i++) { 
     IntBuffer advancewidth = BufferUtils.createIntBuffer(1); 
     IntBuffer leftsidebearing = BufferUtils.createIntBuffer(1); 
     stbtt_GetCodepointHMetrics(info, (int)text.charAt(i), advancewidth, leftsidebearing); 
     length += advancewidth.get(0); 
    } 
    return length * cscale; 
} 

がstbtt_ScaleForPixelHeightからである:これは私が今、Javaで使用したソリューションです。

+0

私はあなたがカーニングを逃しているかもしれないと思う... –

1

私は、stbへのLWJGL 3.1.1のバインディングでおおよその答えを得ることができました。

まず、あなたがSTBTTBakedChar.Bufferあるべきchardataバッファ、上に保持し、で始まる、ともintあるfirst_char上に保持するためにフォントをロードするときSTBTruetype.stbtt_BakeFontBitmap(ByteBuffer data, float pixel_height, ByteBuffer pixels, int pw, int ph, int first_char, Buffer chardata)を呼び出した後。

次に、「M」文字の幅を取得しようとしている場合は、と呼び出して、その結果を文字の幅にする必要があります。これは、文字列の各文字に対して行うことができ、文字列の合計幅のすべての値を加算することができます。

私は、スペース文字の幅を取得すると結果が0になることに気付きました。これは近似値として使用する必要があります。個人的には、文字列の幅の上限を得るために、 'M'文字の幅を文字列の合計長で乗算しました。

+0

このメソッドは、最初に使用されたメソッドですが、正しい値を返しません。これは良い近似ですが、今すぐ私のコードで@Briggy @Briggy –

+0

私はフォントの 'M'文字の幅を取得し、文字列の長さを掛けることで長さを近似しています。スペース文字の幅を取得すると0が返されることに気付きました。これは、繰り返しを行うと問題になります。私は私の答えを更新します。 – Tophandour

関連する問題