[Kdeveloper] [Qt-devel] Fwd: KDE 4.3における日本語フォントに関する問題整理

Asaki Takumi takumi @ asaki.jp
2010年 1月 14日 (木) 06:58:59 UTC


朝木です。

On 2010/01/13, at 16:06, Kenji Sugita wrote:

>  杉田です。
> 
> From: KOBAYASHI Tomoyuki <maron-kde @ maidlab.jp>
> Subject: Re: [Qt-devel] [Kdeveloper] Fwd: KDE 4.3における日本語フォントに関する問題整理
> Date: Tue, 12 Jan 2010 19:52:22 +0900
> 
> ;;; Qtはfontconfig経由でフォントを読むときはfontconfigを利用し
> ;;; (src/gui/text/qfontengine_x11.cpp)、
> ;;; *.{ttf,otf}を指定されて自前でフォントファイルを
> ;;; 開かなければならないときは、freetypeを直接
> ;;; (src/gui/text/qfontengine_ft.cpp)
> ;;; 叩いています。

fontconfig はグリフのレンダリングそのものは行わないので、
Qt ではレンダリングは freetype を直接呼び出して使っています。
そのため、各文字のメトリックは freetype が返すものを用いることとなります。

> ;;; fontconfigは少々難解なxmlファイルに
> ;;; かなり細かい指定が書けるので、
> ;;; $HOME/.fonts.confで頑張ればなんとかなるかもしれません。

上記の理由から .fonts.conf での対応は難しいと思います。
英文部分のみ別フォントを使うような設定をすればまた別ですが。

>  .fonts.conf を使わずに、うまく行くようにしたいです。KDE と逸れてしまうけれど、
> そうすれば、Qt for Embedded Linux でも新 IPA フォントが使えるというのが理由です。
> 
>    $ ftstring -encode unicode -m AAああ 18 ipag.ttf
> 
> では、A が正しく半角になるので、qfontengine_ft.cpp が間違っている可能性もある
> のではないでしょうか。

参考ですが、 Mac OS X に付属の Font Book でも IPA フォントを半角で表示しています。

freetype ではフォントデータを読み込む際にオプションを指定できるので、
それらを含めてもう少し調べてみました。
アップデートしたプログラムを http://www.kde.gr.jp/~asaki/freetypeinfo.tar.gz に置いておきます。
なお、freetype でレンダリングした結果を表示するようにもしてありますが、
埋め込みビットマップフォントの読み込みがうまくできていないため、
デフォルトではビットマップフォントは使わないようにしています。

確認してみたところ、
IPA00203: ビットマップフォントは半角/全角で幅が異なる。
		FT_LOAD_NO_BITMAP 時はそれぞれ同じ。
IPA00301: ビットマップフォントはなし。幅は半角/全角が同じ。

ただし、それぞれで "ignore Global Advance Width" 指定時には半角は全角の半分の幅となる。
ということがわかりました。

ftstring や fontconfig 等のいくつかの freetype を用いたプログラムではこの
FT_LOAD_IGNORE_GLOBAL_ADVANCE_WIDTH を指定してグリフをロードしているようです。
http://freetype.sourceforge.net/freetype2/docs/reference/ft2-base_interface.html#FT_LOAD_XXX

つまり、 FIXED と宣言しているフォントが実は文字ごとに幅が異なるような場合に
グローバルな値を無視することができるようになっているようです。
> This flag exists for historical reasons (to support buggy CJK fonts).
( freetype のドキュメントより )

試しに Qt のソースの FT_Load_Glyph のフラグに全て FT_LOAD_IGNORE_GlOBAL_ADVANCE_WIDTH を
加えてみたところ、Qt で IPA フォントの半角を半角として表示することができました。

ということで、原因としては
* IPA フォントは FIXED フォントと宣言している
* freetype は FIXED フォントに対しては指定されない限りグローバルな値を幅に用いる。
  ( 埋め込みビットマップがある場合はそちらが優先? )
* Qt では Global Advance Width を無視するようにしていない。
ということになります。

問題は対策でしょうか。
Qt で FT_LOAD_IGNORE_GlOBAL_ADVANCE_WIDTH を指定して対策するパッチを作成するのは
難しいことではないですが、フォント側ではなく Qt を変更することの理由がなければ
受け入れてもらうのは難しいかもしれません。
問題のないであろうその他のフォントに影響がないことも言えなければだめだと思います。

IPA フォントに対応してもらうのが一番でしょうが、
* 半角/全角の双方を含むフォントが FIXED と宣言するのは正しいのか。
    (freetype では buggy CJK fonts と言っていますが)
という観点に関する情報が欲しいですね。






Kde-jp メーリングリストの案内