フォーラム: VLゴシックへの要望 (スレッド #35498)

VL ゴシック 13pt等で、GetTextExtentPoint32が正しい文字列幅を返さない。 (2014-05-25 10:57 by matsu_boolean #73151)

初めまして。

VL ゴシックの13ptなどを使うと、Windows APIのGetTextExtentPoint32が正しい文字列幅
を返しません。TextOut APIで実際に描画される幅よりも若干狭い値を返します。どうも、
ASCII文字のみの場合のようです。

Windows XP, Vista, 7, 8.1で検証しました。13ptのほかに、11pt, 14pt, 16pt, 17pt, 19pt,
20pt等でも発生するようです。

Delphiのコードで検証しましたが、C#ではどうかと思い試したところ、GDI+では正常に文字
幅を得られるようでした。

何かわかりますでしょうか。

Re: VL ゴシック 13pt等で、GetTextExtentPoint32が正しい文字列幅を返さない。 (2014-05-26 11:04 by dicey #73158)

申し訳ありませんが、Windows についてはまったくわかりませんので、
原因などもわかりません。GetTextExtentPoint32 がなにを見て計算
しているのかわからないですが、、計算の問題なのではないかと思い
ます。(文字幅が2種類のみではないプロポーショナルフォントに対応
できていないのかもしれません)

[メッセージ #73151 への返信]
> 初めまして。
>
> VL ゴシックの13ptなどを使うと、Windows APIのGetTextExtentPoint32が正しい文字列幅
> を返しません。TextOut APIで実際に描画される幅よりも若干狭い値を返します。どうも、
> ASCII文字のみの場合のようです。
>
> Windows XP, Vista, 7, 8.1で検証しました。13ptのほかに、11pt, 14pt, 16pt, 17pt, 19pt,
> 20pt等でも発生するようです。
>
> Delphiのコードで検証しましたが、C#ではどうかと思い試したところ、GDI+では正常に文字
> 幅を得られるようでした。
>
> 何かわかりますでしょうか。
#73151 への返信

Re: VL ゴシック 13pt等で、GetTextExtentPoint32が正しい文字列幅を返さない。 (2014-05-26 22:22 by matsu_boolean #73171)

返信ありがとうございます。

 GetTextExtentPoint32についてですが、文字列の描画に必要な幅と高さをドット単位で取得するWindows APIです。

 仮説ですが、もしかして VLフォントでは、ASCII文字コードの範囲で、埋め込みビットマップフォントを持つのでしょうか?。GetTextExtentPoint32は、すべて埋め込みビットマップフォントで賄えるグリフかつ文字サイズの場合、埋め込みビットマップフォントから文字列幅を得ているのではないかという気がします。

 実際の描画は(アンチエリアスのため?)埋め込みビットマップフォントを使わず描画するため、埋め込みビットマップでないフォントと埋め込みビットマップフォントの幅が違う場合このような現象が発生するのかなと考えます。

 この仮説が正しいとすると、多分にWindows API側の問題かなという気もしますが、他のフォントでは起こりませんし、VL ゴシック側で対処は可能でしょうか?。
#73158 への返信

Re: VL ゴシック 13pt等で、GetTextExtentPoint32が正しい文字列幅を返さない。 (2014-05-26 22:59 by dicey #73172)

[メッセージ #73171 への返信]
>  GetTextExtentPoint32についてですが、文字列の描画に必要な幅と高さをドット単位で取得するWindows APIです。
>
>  仮説ですが、もしかして VLフォントでは、ASCII文字コードの範囲で、埋め込みビットマップフォントを持つのでしょうか?。GetTextExtentPoint32は、すべて埋め込みビットマップフォントで賄えるグリフかつ文字サイズの場合、埋め込みビットマップフォントから文字列幅を得ているのではないかという気がします。

VLゴシック/VLPゴシックともに埋め込みビットマップフォントを持っていません。なので、この仮説は違いますね。

>  実際の描画は(アンチエリアスのため?)埋め込みビットマップフォントを使わず描画するため、埋め込みビットマップでないフォントと埋め込みビットマップフォントの幅が違う場合このような現象が発生するのかなと考えます。
>
>  この仮説が正しいとすると、多分にWindows API側の問題かなという気もしますが、他のフォントでは起こりませんし、VL ゴシック側で対処は可能でしょうか?。

他のフォント、たとえばベースが同じ M+ や Koruri などでも起こらないで
しょうか?
#73171 への返信

Re: VL ゴシック 13pt等で、GetTextExtentPoint32が正しい文字列幅を返さない。 (2014-05-28 07:55 by matsu_boolean #73189)

 お返事ありがとうございます。

 仮説が間違っていたとなると、ますますよく分からないですね。

 M+ フォント(M+ 1m regular等)で試してみたところ、この現象は発生しませんでした。
Koruriも発生しませんでしたが、Koruriはプロポーショナルフォントでしょうか?。「VL Pゴ
シック」も該当現象は発生しないようです。

 現在現象が発生しているのは、「VL ゴシック」の特定のフォントサイズ(11pt, 13pt,
14pt, 16pt, 17pt, 19pt, 20pt)かつ、ASCIIコード範囲内で構成される文字列のようです。
また、出力時の印字品質に「ClearTypeNatural」という値を指定すると該当現象が発生
しないことも分かりました。

 一応回避策はある(ClearTypeNaturalを指定する or 非ASCII文字(ZERO WIDTH
SPACEも大丈夫)をつなげた文字列で幅を計算)ので優先順位は低くともかまいません。

 以上よろしくお願いいたします。
#73172 への返信