2011-01-03 25 views
3

ビットマップフォントレンダラを作成しようとしていますが、実際の文字のプレースメントのレンダリングに問題があります。ビットマップフォントのレンダリングとカーニング

GetCharABCWidthsFloatとGetTextMetricsWを使用してフォント文字情報を取得しますが、ABC幅を正しく使用する方法がわかりません。これを行うにはさらに情報が必要ですか?

私はFreeTypeや他のライブラリを使ってこの操作をしたくないのですが、私はC++ \ Windowsで利用できる標準の機能でこれをしようとしています。

カーニング情報がないと、文字が正しく表示されません。たとえば、「f」と「t」が隣り合わせに置かれている場合、「Times new roman」を見てください。正しい文字間隔がなければ、それらはあまりにも離れて見えるでしょう。 アルゴリズムの例は---ここ

float letterBottomLeftX = 0.0f; 
float letterHeight = 1.0f; 
float letterWidth = 1.0f; 

float scale = 1.0f; 
for(U32 c = 0; c < numberOfCharacters; ++c) 
{ 
    fon->GetCharcterInfo(charValue, charInfo); 
    //float advancedWith = (charInfo.A * scale) + (charInfo.B * scale) + (charInfo.C * scale); 

    letterWidth = charInfo.B * scale; 
    letterHeight = textMetrics.Height * scale; 

    if(c == 0) 
    { 
     letterBottomLeftX = -(charInfo.A * scale); 
    } 


    // vertex placement, beginning at letterBottomLeftX 

    // texture placement 

    // index placement 

    letterBottomLeftX += (charInfo.A + charInfo.B + charInfo.C) * scale; 
} 

は、それがどのように見えるか、あなたは文字間の悪い間隔を気づくことができるの例です。 (テクスチャUVを無視して、文字の配置が正しいとしたらそれを修正します)。

http://img88.imageshack.us/img88/4015/njpjp2.png

+0

誰にもアイデアはありませんか? – jack

+0

誰かがビットマップフォントレンダラーを書いていますか? – jack

答えて

2

KERNINGPAIRのドキュメントはかなり簡単です。現在の文字と次の文字の両方がwFirstwSecondのメンバーを介してテーブルに存在する場合は、次の文字の前に進むピクセル数にiKernAmountを追加します。

GetKerningPairsからの検索結果をstd::map<std::pair<wchar_t,wchar_t>,int>として作成することをおすすめします。 GetKerningPairsは、可能なすべての文字の組み合わせに対して結果を返さないことに気付きました。この情報はフォント自体からのものであり、調整が必要な文字ペアを指定するのはフォントデザイナの責任です。この情報が完全に失われている可能性があります。

マッピングモードが結果に影響するため、これらの関数を呼び出す前にSetMapMode(hdc,MM_TEXT)を必ず実行してください。

+0

興味深い。 "SetMapMode(hdc、MM_TEXT)"はどこに置く必要がありますか?これは私がそれを行う方法ですが、私はそれが適切に使用されているかどうかはわかりません(多くの返信については申し訳ありませんが、ここの書式は返信にはひどいです)。 HFONT fnt CreateFont(サイズ、0,0,0、FW_NORMAL、0,0,0、ANSI_CHARSET、OUT_TT_PRECIS、CLIP_DEFAULT_PRECIS、PROOF_QUALITY、FF_DONTCARE、 "Times New Roman"); – jack

+0

SelectObject(dc、fnt); – jack

+0

SetMapMode(dc、MM_TEXT); – jack

0

一つの一般的な解決策は、文字のペア幅テーブルを作成することです。だから、文字「Ti」はミネソタ州よりも近くに置かれます。これは、コストのために優れた結果を出すための簡単なテーブルです。

+1

このテーブルを自動的に作成する方法はありますか?情報に何らかの質問をしなくても、そこに値を置くだけのハックのように思えます。 GetKerningPairsは、特別な配置が必要な場合でも、すべてのペアの情報を返しません。 – jack

+0

私は組み込みゲーム開発の土地です。これを行うツールは理想的ですが、結果を得るための簡単な方法はわかっています。ほとんどの場合、私は実行可能なソリューションのアイデアを伝えていました。 –

関連する問題