高度な検索
Developer Connection
Member Login ログイン | ご入会 ADC連絡先



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