[Mplus-fonts-dev 95] Re: スクリプトアップデート

Back to archive index

KANOU Hiroki kanou****@khdd*****
2003年 11月 21日 (金) 21:13:10 JST


狩野です。詳しい解説ありがとうございます。

[Mplus-fonts-dev 93] の村岡さんの解説を読んでみて、コードを
読み直したところ、おっしゃる通りバグであろうと思います。

> 対象はtottf.c:SFDefaultOS2Info()です。
> 
> オリジナルのコードの意図は私にも検討がつかなかったのですが、動作は
>   1. _sfがセット(pfmset)されていればpfminfoを_sf->pminfoで上書する。
>      (但しpfminfoと_sf->pminfoが同じ場合、無駄なコピーは避けている)
>   2. pfminfoがセット(pfmset)されていれば、pfminfoをクリアしてフォント
>      名等からそれらしい値を決定し初期値とする。
>   3. どちらもセットされていない場合には何もしない。
> という風になっていました。

ソースを grep してみたのですが、「pfmset = true」はあっても false に
戻している例は無いようでした。

pfminfo は、より大きな構造体の一部として、gcalloc() で 0 に初期化され
つつ割り当てられるのが一般的のようです。つまり初期値は false だと。

pfminfo をいじっている関数一覧 (「pfminfo.fsType = -1」を除く。
未初期化値 を表す fsType のデフォルト値は -1 らしい) は、

「pfminfo.pfmset = true;」無し
fontinfo.c:TTFSetup()
parsettf.c:readttfhhea()
parsettf.c:readttfvwidths()
parsettf.c:SFFillFromTTF()
splineutil.c:SplineFontMetaData()
tottf.c:OS2WeightCheck()
tottf.c:SFDefaultOS2Simple()
tottf.c:SFDefaultOS2Info()
tottf.c:initTables()
winfonts.c:FNT_Load()
winfonts.c:_FONFontDump()

「pfminfo.pfmset = true;」有り
parsettf.c:readttfos2metrics()
scripting.c:bSetPanose()
sfd.c:SFD_GetFont()
svg.c:SVGParseFont()

つまり、TTF の OS/2 テーブル、SFD、SVG (すべて panose を含む) から
読み出した時と、panose をユーザが設定した時には、pfmset=true となり、
それ以外は false となるようです。

やっぱり、
 
> ここでちゃんと考えてみると2の「pfminfoをクリアしてフォント名等からそれら
> しい値を決定し初期値とする」というのはフォントのpfminfoが全く設定されて
> いない時にこそ意味があるものですから、条件の「pfminfoがセット(pfmset)さ
> れていれば」は間違いで正しくは「pfminfoがセットされていなければ」が正し
> いのではないかと推測しました。

という事のようですね。

以下は余談ですが…

そもそも、PANOSE における Proportion の値をスクリーンフォント
として使用できる monospaced かどうかの判断に使うのは間違いとしか
思えません。 (Windows の実装は現にそうなっているようですが)

もともと、PANOSE は、フォント名が一致するフォントがない場合、
システムがそのフォントと近いフォントを自動的に探して代替
フォントとして表示させるため、デザイン上の主な特徴を数値で
表現するようにした物です。
http://www.panose.com/hardware/pan2.asp#_Toc380547256 を見て
いただければ分かりますが、「セリフを除いた J の幅 / M の幅 
(高さの半分の所で計る)」の値が 0.78 以上であれば、値は 9 
(Monospaced) にセットされます。
送り幅一定のスクリーンフォントでも「J」が狭ければ Monospaced
にはならないはずですし、その逆の場合も当然あります。

それを措いても、現在の、CIDOneWidth() での判定 (フォント内の
全文字の送り幅が同じかどうか) は不都合です。全角・半角の欧文を
持つ日本語フォントは常に非 Monospace になりますから。
PANOSE はアルファベットに強く依存した仕様なので、日本語文字は
除外して欧文部分だけのチェックでいいと思うんですが…。

狩野 宏樹  <kanou****@khdd*****>



mplus-fonts-dev メーリングリストの案内
Back to archive index