TX11 - sfnt キャッシュサイズの変更
(98 年 4 月 12 日)
Q: 大きな (128K を超える) sfnt フォントに問題があります。これらのフォントを使ったテキストは
Geneva で表示されてしまうか、全く表示されません。これについて何か原因と思われることはありませんか。
A: 残念ながら、その通りです。sfnt リソースが 128K よりも大きいと、FontManager
はそれを全部ロードせず、 (TrueType スケーラの要求に応じ) ReadPartialResource で部分ごとにロードします。TrueType スケーラは、速度向上のためフォントのフラグメントをキャッシュしますが、キャッシュはブート時にシステムヒープに割り付けられます。Mac
OS 8.0 より前は、キャッシュサイズは 10K でした。キャッシュサイズを決定した当時の
TrueType フォントにはそれで十分でした (そして、TrueType フォントは 2MB RAM の Macintosh
でもサポートしたかったのです) 。その間、sfnt フォントはどんどん複雑になり、テーブルはどんどん大きくなり、もはや
10K では足りなくなってしまいました。そして、Mac OS 8.0 でキャッシュサイズは 48K になりました。しかし、これでも非常に特殊なフォント
(例えば、WorldScript II がインストールされていない場合に使用する 2 バイトスクリプト用
sfnt など) には十分ではない場合があります。幸い、この問題を解決し、sfnt のフラグメントキャッシュのサイズを変更する方法があります。この変更は、できれば、システム起動時になるべく早く行ってください。このため、小さなエクステンションを用意して、以下のコードで変更を行ってください。
// ファイル: FontFix.c
//
// InitializePartialFonts() で適切なサイズを指定する。
//
// システムの kMinimalPartialFontZoneSize は 10 × 1024 だったが、
// それでは不十分。
// PartialFontZone がすでに十分に大きいシステムでは、
// InitializePartialFonts() は何もしない。
//
// 既存の PartialFontZone が新しい kMinimalPartialFontZoneSize よりも
// 小さい場合 (または、全くない場合) のみ、InitializePartialFonts
// ルーチンは新しいサイズを割り当て、既存のものを (もしあれば) 破棄する。
#include <Types.h>
#include <ConditionalMacros.h>
#include <Resources.h>
enum { kMinimalPartialFontZoneSize = 0x0000C000, // 48K
kMaximalPartialFontZoneSize = 0x00080000 // 512K
};
extern pascal OSErr InitializePartialFonts (UInt32 partialFontZoneSize)
THREEWORDINLINE(0x303C, 0x000F, 0xA854);
//-------------------------------------------
void main(void)
{
UInt32 size = kMinimalPartialFontZoneSize; // default
Handle h;
// Debugger();
h = GetResource('pfcs', 0);
if (h != NULL)
{
size = **(UInt32**)h;
if (size < kMinimalPartialFontZoneSize)
size = kMinimalPartialFontZoneSize;
else if (size > kMaximalPartialFontZoneSize)
size = kMaximalPartialFontZoneSize;
}
(void)InitializePartialFonts(size);
}
-- Ingrid Kelly
devsupport@apple.com
|