« GetTextExtentExPointの締めくくり | トップページ | スクロールバーあれこれ »

2007年1月11日 (木)

Iである

Iである。今回はこのIに焦点を当ててみる。アイとは何ぞや?ってことだが、MSDNのフォント・テキスト関連のAPIの一覧をみると、末尾にIがつくものがいくつかみつかる。GetCharWidthIやGetCharABCWidthIやGetTextExtentPointIなどである。説明を見ればわかるとおり、グリフインデックス(GlphyIndex)のIである(と思う。)

文字列を描画するときに、ExtTextOutなどのAPIに文字コード(UnicodeやShift-JISなど)で表現した文字列を渡して描画するのが一般的だが、直接、フォント内の各グリフのインデックスを使って描画することもできる。まずは、グリフインデックスの取得方法であるが、GetGlyphIndicesを使って、指定した文字列のグリフインデックスの配列を取得できる。このとき、第5引数のフラグflにGGI_MARK_NONEXISTING_GLYPHSを指定すると、フォントにグリフが存在しない場合、0xFFFFが指定しない場合0x0000が返ってくる。この配列を使い、文字コードではなく、グリフインデックスを使って描画したイメージが下の図の下の文字列である。

Indices

ちなみに、グリフインデックスを使用する場合、ExtTextOutの第3引数にETO_GLYPH_INDEXを指定する。また、Tahomaという欧文フォントを使用している。上の文字列はいつも通りの文字コードを使って同じ文字列をExtTextOutで描画したものである。もう何が起きているのかわかると思うが、GetGlyphIndicesを使用して取得するとフォントリンク機能が働かないのである。よって、「あいうえお」の文字列に対応するグリフインデックスが「0xFFFFまたは0x0000」になっている。それで、文字化けが起こったのである。それだけである・・・・

ちなみに、GetGlyphIndicesのグリフインデックスの配列を受け取る第4引数の型がLPWORDである。つまり、各インデックスは2バイトでAPIの仕様の制限かフォントファイルの制限かわからないが、フォントに収録できる文字数は2バイトまでなのかなぁ・・なんて推測してみたり。と、これで思い出したのが、サロゲートである。サロゲート文字は1文字を2ワード(4バイト)で表現する文字であるが、GetCharABCWidthなどで指定する文字コードの型がUINTになっていて、これらのAPIがサロゲートを正しく処理するかは、おいといて、インターフェースを変えずにサロゲートも渡せるよう既になっているなと安堵してみたり。

« GetTextExtentExPointの締めくくり | トップページ | スクロールバーあれこれ »

Windows」カテゴリの記事

コメント

コメントを書く

(ウェブ上には掲載しません)

トラックバック

この記事のトラックバックURL:
http://app.f.cocolog-nifty.com/t/trackback/1497665/39651891

この記事へのトラックバック一覧です: Iである:

« GetTextExtentExPointの締めくくり | トップページ | スクロールバーあれこれ »

自作ソフトウェア

無料ブログはココログ

メモ