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

Technical Q&A QA1193
QuickDraw Text Anti-Aliasing using Quartz 2D


Q: 作成したアプリケーションで QuickDraw テキストの Quartz 2D アンチエイリアスを有効にするにはどうすればよいのでしょうか?

A: Mac OS X 10.1.5 から、アップルは、開発者が Core Graphics (Quartz 2D) のアンチエイリアス技術を利用して QuickDraw テキストを描画できる機能を追加しました。この機能が追加されたのは、DrawThemeTextBox または ATSUI を介して UniCode のイメージングに完全には移行できなくても、アプリケーションの外観を今までどおりにしたい、という開発者を支援するためでした。

10.1.5 では SwapQDTextFlags の API 名だけが使用可能であり、CFM 経由ではエクスポートされません。このため、CFM アプリケーションは、Application Services フレームワークで SwapQDTextFlags シンボルを見つけるために、Core Foundation フレームワークの CFBundleGetFunctionPointerForName を使う必要があります。CFM アプリケーションから Mach-O シンボルを探して呼び出す方法の詳細については、CarbonLib SDK にある CallMachOFramework のサンプルを参照してください。

Mac OS X 10.2 (Jaguar) からは、SwapQDTextFlags と同じ機能をもつ新しい API 名 QDSwapTextFlags がサポートされています。さらに Jaguar は、QDSwapPortTextFlags という名前のポートベースの新しい API をサポートしています。これにより開発者は、ポートごとに設定を制御できます。



関数:

// 10.1.5 以降では、SwapQDTextFlags は現在の

// フラグを返し、必要に応じて新しいフラグを設定する

UInt32 SwapQDTextFlags(UInt32 newFlags);

// 10.2 以降では、QDSwapTextFlags は現在の

// フラグを返し、必要に応じて新しいフラグを設定する

UInt32 QDSwapTextFlags(UInt32 newFlags);

パラメタ:

UInt32 newFlags;

サポートされるフラグ:

// システムデフォルトで指定されているものを設定する // 何も指定されていない場合は、現時点では、 // kQDUseTrueTypeScalerGlyphs を設定する kQDUseDefaultTextRendering = 0

// ビット 0 kQDUseTrueTypeScalerGlyphs = (1 << 0)

// ビット 1 kQDUseCGTextRendering = (1 << 1)

// ビット 2

// Mac OS X 10.2 では、kQDUseCGTextMetrics は

// kQDUseCGTextRendering を意味する kQDUseCGTextMetrics = (1 << 2)

kQDSupportedFlags = kQDUseTrueTypeScalerGlyphs | kQDUseCGTextRendering | kQDUseCGTextMetrics

// 何も変更せずに、現在の状態を要求する kQDDontChangeFlags = 0xFFFFFFFF

推奨される使用方法:

UInt32 savedFlags = SwapQDTextFlags(newFlags);

// “newFlags”の状態の下でテキストを描画する

// 以前の設定に戻す (void)SwapQDTextFlags(savedFlags);

ポートをベースとした API:

// 10.2 以降では、QDSwapPortTextFlags は

// 指定されたポートの現在のフラグを返し、

// 必要に応じて新しいフラグを設定する

UInt32 QDSwapPortTextFlags(CGrafPtr port, UInt32 newFlags);

パラメタ:

CGrafPtr port; // あらゆるグローバル設定に優先するポートごとの設定 // port == NULL ならば、現在のポートが使用される

UInt32 newFlags; // 上記の SwapQDTextFlags と QDSwapTextFlags // ごとに“newFlags”を定義



ディスカッション:

(リフローを回避するために)既存のドキュメントとの互換性が必要な場合に限り、kQDUseCGTextMetrics を指定せずに SwapQDTextFlags(kQDUseCGTextRendering) を使います。以前の QuickdrawText のメトリック情報は、指示された(グリッドに合った)アウトラインから取得され、CG テキストレンダリングで使われる理想的なアウトラインに対応した理想的な(ということを感じさせない)メトリックとはかけ離れていることがあります。

SwapQDTextFlags 関数自体は、パフォーマンスに重大な影響力を与えるものではないため、フラグはいつでも変更できます。設定はアプリケーションごと(たとえば、SetFractEnable()SetOutlinePreferred() など)であり、GrafPort ごとではありません。ポートごとの設定には、QDSwapPortTextFlags を使います。

制限事項:

SrcOr モードは、唯一サポートされているテキスト転送モードです。それ以外のケースでは、従来の QuickDrawText レンダリングを使うことになります。特殊な転送モードの効果が必要な場合は、オフスクリーンにテキストを描画して、CopyBits を使用する必要があります(これは基本的に QuickDrawText も他の転送モードに対し行っていることです)。

同様に、ボールド体とイタリック体だけが、計算によって生成される字体としてサポートされています(タイプフェースに固有のフォントがない場合)。また、アウトラインと影はサポートされていません。

アンダーラインが常に実線であるのに対し、QuickdrawText はディセンダの部分を空けておきます。

同じテキストを二重に描画するのは避けてください。描画を繰り返すことにより、アンチエイリアスされた領域が暗くなるためです。

Cocoa テキストの場合と同様、非常に細い線のフォントは、明るすぎて読みにくくなることがあります。

特定のフォントのグリフによっては、QD の FontInfo における垂直方向メトリックのアセントやディセントの値の限度を越えているものもあります。そのようなグリフに対しては、すべての文字がこの範囲内に収まるものと想定しているテキスト編集コードが、不要なピクセルを残したり、アクセントを切り取ったりすることのないように、デフォルトでは(SetPreserveGlyph(true) が呼び出されない限り)、QuickDrawText が強制的にアセントとディセントの間にグリフを収めます。CG テキストレンダリングは、このようなグリフを「つぶす」処理をサポートしていません。特に、「セディーユ」や、大文字の上に発音区別符号が付く言語などです。これを回避するには、「偽り」のメトリック情報という設計上の欠陥を持ったフォントの使用は避けてください。このようなフォントは主に TrueType フォントです。TrueType フォントには、同じフォント名を持つ古いビットマップフォントが存在しました。TrueType アウトラインは、既存のビットマップフォントにできるだけ一致させ、また垂直方向のメトリックを維持するように、という制限の下で設計されましたが、これにより特定の追加グリフとの間に矛盾が生じました。

Mac OS X 10.1.5 では、これらのフラグは、一般システム環境設定パネルのアンチエイリアス設定に関係なく、10 ポイント以上のフォントのテキストを対象としたアンチエイリアスだけをサポートします。また、Mac OS X 10.2 では、システム環境設定での設定が優先されます。


[2002 年 10 月 29 日]