Quartz 2D(CoreGraphics)を使い、何らかの画像をウィンドウ上に描画する場合には、CGImageRefで参照される画像オブジェクト(CGImage)を作成する必要があります。自作のCarbonアプリケーションでもCoreGraphicsを使いたいわけですが、今までのMac OS Naitive画像フォーマットはPicture(PICT)であり、ユーザインタフェースで使う画像などもPICTファイルやリソースとして保存されているのが普通です。
上記の用途を満たすために、Mac OS X 10.1からPICTファイルを直接CoreGraphicsの環境(Context)に描画するためのAPIが用意されました。こうしたAPIは、CoreGraphicsではなくQuickDrawに属していますので、参照する時は注意してください。以下のdrawCGPictFile()ルーチンは、アプリケーションパッケージのResourcesフォルダに保存されている「Image.pct」というPICTファイルを読み込みウィンドウ上に描画します。

CFBundleCopyResourceURL()に参照パッケージを代入し、その内部にあるResourcesフォルダのImage.pctファイルのCFURLRefを得ます。CFBundleGetMainBundle()によりアプリケーションパッケージを指定しています。次のQDPictCreateWithURL()が、指定されたCFURLRefからQDPictRefを得るAPIです。QDPictGetBounds()でPICT画像の矩形情報を得ておき、QDPictDrawToCGContext()でウィンドウのCGContexを指定して描画を実行します。CoreGraphicsのディフォルト座標系は原点がウィンドウの左下ですので注意してください。画像もウィンドウの左下に表示されます。
残念ながら、PICTリソースを直接描画するAPIはありませんが、PICTデータの先頭アドレスとサイズをCGDataProviderCreateWithData()に渡すことでCGDataProviderRefを得ることができます。それをQDPictCreateWithProvider()に渡せば、上記ルーチン同様にQDPictRefを得ることが可能です。以下のdrawCGPictRes()ルーチンでは、アプリケーションパッケージ内のリソースファイルからID=10000のPICTリソースを取り出し、それをウィンドウ上に描画します。

もし、Mac OS X 10.0環境も考慮に入れるとすると、今まで説明してきた便利なAPIは利用できません。PICTリソースを一度GWorld(オフスクリーン)のPixMapに描画し、そのメモリ領域からCGImageRefを作り出します。

PICTリソースからCGImageRefを作成しているのが、pictToImage()ルーチンです。最初に、NewGWorld()で作成されたオフスクリーンにPICT画像を描画します。そして、画像が展開されているメモリ領域の先頭アドレスとサイズをCGDataProviderCreateWithData()に渡すことでCGDataProviderRefを得ます。最後に、それをCGImageCreate()に渡してやっと目的のCGImageRefを得ることができます。

CGImageCreate()に渡しているkCGImageAlphaNoneSkipFirstを、kCGImageAlphaLastやkCGImageAlphaPremultipliedLastに変えると、32ビットフルカラー以外のPICT画像が表示されなくなるので注意してください。これは、白黒や8bitカラーのPICT画像を描画する時に限り、DrawPicture()がアルファチャンネルを考慮しないことが原因のようです。
QDPictCreateWithURL()やQDPictDrawToCGContext()などのAPIが定義されているUniversal InterfacesはQD.frameworkに含まれるQDPictToCGContext.hです。また、CoreGraphicsのAPIが定義されているヘッダファイルは、ファイル名の頭に「CG」が付いています。これらは、Universal Interfaces 3.4.2には18あるのですが、Mac OS X 10.2のCoreGraphics.frameworkの方には23もあります。CoreGraphicsの最新機能を参照したい場合には、Mac OS X 10.2付属のヘッダファイルを参照した方が得策でしょう。
CoreGraphicsに関するドキュメントは、Apple社のQuartz 2Dサイトに登録されている「Drawing With Quartz 2D」と「Quartz Primer」です。Mac OS X 10.2ではCoreGraphicsに関係するAPIがいくつか追加されましたが、それらについては「What's New in Quartz 2D」というドキュメントで確認することが可能です。
http://developer.apple.com/techpubs/macosx/CoreTechnologies/graphics/Quartz2D/quartz2d.html
copyright 2002 Ottimo, Inc. All rights reserved
無断転載・引用禁止
Contact us: koike@ottimo.co.jp