2012-05-24 6 views
5

私は独自のビットマップフォントレンダラを使用していますが、文字の間隔が正しく設定されているとは思うのですが、文字のy配置。たとえば、文字 'a'のy配置が0の場合、 '*'または '、'は何を持っていますか?私は文字間の間隔を決定するためにwinapi関数GetCharABCWidthsFloatWを使用している、私はyのオフセットのいくつかの並べ替えを判断するために使用できる別の関数はありますか?レンダリングテキストの文字のy配置を決定する

私は自分のビットマップイメージに最も適しているので、必ずしも同じサイズではありません。

+0

フォントのビットマップの高さが同じですか? –

+0

良い点、私はビットマップ画像に最適なフィットをしているので、常に同じサイズになるとは限りません。 – jack

+0

多分オフセットテーブルがありますか?ベースラインからのオフセットで、同じテーブルを使用して 'g'のような文字を配置することもできます。 –

答えて

0

各文字自体は、テキストレンダリングAPIによって正しくy方向にオフセットされている必要があります(TextOutDrawTextなど)ので、一定のオフセットが必要です。私は常にGetTextExtentPoint32を使用して文字列 "Ag"のメトリックを取得し、一般的なメトリックを取得します。さらに、GetTextMetricsを試すこともできます。

+0

私は 'GetTextMetrics'を調べましたが、文字固有の情報を取得する必要があり、それはフォントの情報でした。 'GetTextExtentPoint32'の情報を使ってyをオフセットするにはどうすればいいですか? – jack

0

GetTextMetricsが正しい答えです。しかし、demorgeは、あなたがY座標に使用する必要があるフィールドがtmAscent(構造を見てください)であると言いたいかもしれません。

合計高さはtmHeightです。 tmAscentは、上からベースラインまでの距離です。そして、tmDescentは、ベースラインとフォントの最下部との間の距離です。

ほとんどの場合、テキストの左上隅を座標(x、y)で指定する場合は、tmAscentを追加します。もしy座標が底であれば、tmDescentを減算します(+または - は、ビューポートを反転したかどうかによって異なりますが、テストして得られるものを確認できます)。

この情報は、 、 "*"、 "j"のいずれかです。ベースラインはすべての文字で同じです。

+0

特定のキャラクターがどれだけ上昇または下降しているかを調べるにはどうすればよいですか?文字をビットマップに書き込んだ後、文字ごとに最適なビットマップを作成して保存します。したがって、ビットマップ自体では、それぞれが異なる高さを持っています。 – jack

+0

フォント内のすべての文字に同じAscentとDescentがあります。ビットマップを最適化したい場合は、余分な作業を自分で実行する必要があります(つまり、結果のビットマップを自動トリミングする必要があります)。また、小さな四角形を実際に作成することはできず、 Courierなどのフォントのような端末で使用しない限り)。ほとんどのフォントは、どこにでも "リーク"します。正しいボックスを計算するのは本当に難しいです。 –

0

私が正しく理解している場合、各グリフのビットマップは最初は同じ高さです。次に、各文字の周りのすべてのスペアスペースをトリムして、各文字の最小ビットマップを作成します。

この場合の回答は簡単です。トリミングされたビットマップを作成するときは、左上と上端(またはグリフの配置方法に応じて左と下)から削除するピクセル数を覚えておいてください。ビットマップを描画するときに、保存された値を使用して座標を調整できます。

ただし、フォントメトリックを使用して各ビットマップからトリムする量を判断しようとしている場合は、できません。

0

一般フォント情報:あなたが探しているものを

は、「ベースライン」または「起源」(同じ概念)にテキストの配置を正規化する方法です。これは、座標系によっては、上昇(上昇)または下降(下降)で行うことができます。タイポグラフィに関連する画像例のかなり良いセットを提供

http://www.freetype.org/freetype2/docs/tutorial/step2.html

一般的なビットマップフォント情報:今すぐ

、ビットマップ画像に関してそれらがすべて正しく並んでいることを確認するための最も簡単な方法は、あなたのスプライトシート内の各文字のビットマップ表現のために同じ高さを持つことです(幅は実際の文字幅に基づいて異なるはずです)。これを行うと、その共通の高さに基づいてすべてを整列させることができます。

しかし、文字の周りの余分な空白を切り取っている場合、グリフと一緒にいくつかの構造体にクリップされた値を格納して、オフセットを決定する必要があります。 APIがこれを実行している場合、キャラクターに基づいて完全な次元を得ることができるように、これを適切に行うことができるように、昇順/降順、起点/ベースライン、またはラインハイトタイプのメソッドを持つ可能性が高くなります。

アピ具体的な情報
編集:

GetTextMetrics:
http://msdn.microsoft.com/en-us/library/dd144941(v=vs.85).aspx

TEXTMETRIC構造体:
http://msdn.microsoft.com/en-us/library/dd145132(v=vs.85).aspx

ここで他の回答に基づいて、あなたのAPI特定の質問に関連するリンクです

tmAscentまたはtmDescentを使用してy座標をオフセットすることができますinate。

関連する問題