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*****>