[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[mgp-users-jp 00458] Re: Magic Point on NetBSD-current



千葉大の山本です。少し前の話題ですが…。

>>>>> On Mon, 8 Feb 1999 14:37:19 +0900, Atsushi Onoe <onoe@sm.sony.co.jp> said:

>> 大きめのmgp file(ようはぺー次数と文字数の多いもの)を作ると、Can't
>> Open font ... がまた出るようになりました。
>> 
>> というわけで、VF_Deinit() を外す場合は1行上の VF_CloseFont(...)も
>> Comment out しましょう。

> これは理屈に合わないのでもうちょっと調べたいです。

VFlib 2.24.2 を使って、vfontcap 中で ft=truetype となっているフォント
に対し、VF_OpenFont と VF_CloseFont を交互に何度も適用していくという簡
単なテストプログラムを実行してみたところ、126 回目の VF_OpenFont で失
敗(負の値を返す)してしまいました。どうも VFlib の file manager(fman.c) 
でのリソースの再利用がうまくいっていないようです。ft=freetype となって
いるフォントの場合は file manager を利用していないためにこの問題は起こ
らないみたいです。

それはそれとして、(以前の VFlib がどうだったのかはわかりませんが、少な
くとも 2.24.2 では)既に open してあるフォントと同じ名前のフォントが 
open されたときには font id を再利用するようですので、毎回 
VF_CloseFont しなくてもよさそうな気がします。その方がいくらかは速いで
しょうし。
#うるさいことをいうと link count (そのフォントが何回 open されたかを
#表す数)が増えてしまうのですが、これは int なのでまあ大丈夫でしょう。

現在の mgp の使い方ですと同時に open してあるフォントは1個になるように
なっているように見えます。おそらくドキュメント中で VFlib のフォントテー
ブルの大きさ(通常 128)を超える種類のフォントが使われる場合を想定してい
るのではないかと思います。まあ現状では上で述べた現象が原因で、
ft=truetype になっていると VF_CloseFont だけではそれはできないのですが。

VFlib の方に手を加えるのが正攻法でしょうが、既に VFlib version 2 がか
なり普及していると思われることと、毎回 VF_CloseFont をするのもそれなり
に overhead があることを考慮して、

  ・通常は VF_CloseFont しない
  ・フォントテーブルを使いきった時点で VF_Deinit, VF_Init を再度行う

という方針にするというのはいかがでしょうか? 実際には VF_OpenFont の返
り値が負であったことからだけでは、「フォントテーブルを使いきった」のか、
「そもそもそういうフォントがない」のか判定できないので、VF_OpenFont に
失敗したときは VF_Deinit, VF_Init して再度 VF_OpenFont を試してみる、
といったようなことが必要になると思いますが。

					山本 光晴
				mituharu@math.s.chiba-u.ac.jp