GetGlyphOutlineの罠

ここはGetGlyphOutlineを使っていて気が付いた問題を書き留めておく場所です。問題は手元の環境で発生したものであり、一般的に起こるとは限りません。また、原因については多くの場合仮説です。発生条件もそれが直接的な原因とは限りません。

主にGGO_GRAYn_BITMAPでビットマップを取得した時に起こる問題について言及します。それ以外のものも気が付いたら書くかもしれません。

問題はVisual C++(Visual Studio 2005)で作成した時に発生したものです。GetGlyphOutlineだけの問題ではなく、ビルドツール自体の問題も含まれているかもしれません。もちろん私の勘違いも含まれているかもしれません。

検証プログラム

GetGlyphOutline Viewer

任意の文字やフォントでのGetGlyphOutlineの結果を表示します。

問題一覧

問題詳細

GetGlyphOutline呼び出し時のスタックポインタの位置次第で字形が崩れる(testWin98StackDelta40)

正しい字形
正しい画像
崩れた字形
崩れた画像

GetGlyphOutlineを使って字形のビットマップを取得する時、一回目の呼び出しでサイズを取得して、二回目の呼び出しで実際の字形ビットマップを取得することがある。そのとき、一回目と二回目を別々の関数にするなどしてスタックポインタの位置が一定間隔ずれた場合、字形が崩れることがある。

GetGlyphOutlineが0を返しているのにgmBlackBoxXとgmBlackBoxYが0にならない(testZeroSizeGlyph)

GetGlyphOutlineが返すバイト数とブラックボックス矩形から求めたバイト数とが一致しない(testGlyphSizeMismatch)

次に一例を示す。

赤線内が(gmBlackBoxX,gmBlackBoxY)が示す範囲で、青線が取得できたビットマップの各ピクセルを表す。右の「ぱ」において、gmBlackBoxYが示す高さより1ライン分大きいバッファサイズをGetGlyphOutlineは返しており、その内容は明らかにブラックボックス矩形をはみ出したものになっている。これを素直に(gmBlackBoxX,gmBlackBoxY)やgmptGlyphOriginを元に描画すると、他の平仮名に比べて「ぱ」の位置だけ1ピクセル下に下がり、しかも字形の下部1ラインが切れてしまう。このように字形がセルをはみ出した事によると思われるずれが他にも多数存在する。詳しくはサイズが食い違う文字コードを検証プログラムで出力させて、個々の文字をGetGlyphOutline Viewerで確認すると良い。ちなみにこの問題はWin98では確認できなかった。

Microsoftサポート技術情報へのリンク

NT4.0

Win3.1

Win9x

使い方に関する情報

その他へのリンク


AKIYAMA Kouhei <k-akiのあとにアットマークのgreenwoodドットcoドットjp>
Last modified: 2008-03-22 17:09:23+0900