タイトル小池邦人のプログラミング日記》2001/10/12<Quartz 2D(Core Graphics)を使う 最終回>カテゴリーグラフィックス, 小池邦人のプログラミング日記
作成日2001/11/20 17:51:23作成者新居雅行
今回は、Mac OS X 10.1から利用可能になったPattern(パタン)描画を取り上げてみます。Quartz 2DのAPIの中でも、パタン描画だけはちょっと変わった手法を採用しています。それから、思わぬ所でQuartz 2Dに関わる便利なAPIを発見しましたので、その内容も紹介したいと思います。

2001/11/20現在、ADCメンバーサイトには「CarebonLib_1.5a3_SDK」が登録されています。1週間にワンステップのペースでバージョンアップが進行していますね。このペースで行けば、正式な発表は来年初頭に持ち越されると予想されます。Release Notesに記載されている変更点には、相変わらずバグフィックスが多いのですが、とにかく今年最後の大仕事と認識し、徹底的にやってほしいと思います。それから、Mac OS X 10.1.1アップデータも先週初めに登場しました。Finderなどの表面的な機能追加はほとんど無いようですが、I/Oやネットワークなどのシステム内部はずいぶんと改良されているようです。うちのマシンでは、ネットワークで大量のファイルコピーをすると頻繁に発生していたエラーが、バージョンアップによりピタリと止まりました。すでにMac OS Xをメインシステムとしてバリバリ使われている方は、今すぐアップデートされることをお勧めします。

まずは、Quartz 2Dに関係する便利なユーティリティーAPIの紹介から始めようと思います。以下のサイトの「September 2001」の日付の箇所に、「Customizing Your Application Dock Tile」と「Dock Manager Reference」という2つのPDFドキュメントが登録されています。

◇Carbon Documents: What’s New
 http://developer.apple.com/techpubs/macosx/Carbon/SiteInfo/whatsnew.html

これらのドキュメントには、アプリケーション側で「Dock」のTile(アイコンではなくタイルと呼ぶ)に追加情報を描画したり、そこで好みのメニューをポップアップさせる方法などが解説されています。そうした解説の中で、Tile上の画像描画に利用できるようにと、CreateCGImageFromPixMaps()というAPIが紹介されています。

 

このAPIを利用すれば、QuickDrawのPixMapをQuartz 2D用のImage(CGImageRef)へと簡単に変換することができます。加えて、画像のアルファーチャンネルに使われるマスク情報もPixMapとして渡すことが可能です。もし機会があれば、一度使い勝手を試してみるとよいでしょう。このAPIが定義されているヘッダーファイルはMacApplication.hですので、参考にしてみてください。

続いて、Quartz 2Dを利用したパタン描画の話に移りたいと思います。Contextに定義したPathの内部やフレーム(Stroke)をパタンで塗りつぶしたい場合には、別途パタン描画を実行するルーチン(CGDrawPatternProcPtr)を用意する必要があります。つまり、QuickDrawのように「パタン描画」という独立機能があるわけでなく、「どんなパタンで塗りつぶすのか?」は、利用者側で責任を持つ必要があるわけです。逆に言えば、パタンの種類がイメージ(PixMap)に固定されているQuickDrawとは異なり、Quartz 2Dの描画能力の範囲内であれば、どんな画像や図形(テキスト)でもパタンとして利用することが可能となります。

パタン描画ルーチン(CGDrawPatternProcPtr)が用意できたら、そのエントリーポイントをCGPatternCallbacks構造体のdrawPatternメンバーにセットし、その構造体アドレスをCGPatternCreate()というAPIに代入します。

 

この作業が正しく完了すれば、CGPatternCreate()は返り値としてCGPatternRefを返します。これをCGContextSetFillPattern()やCGContextSetStrokePattern()に代入し、塗りつぶしにパタンを利用することを宣言します。

 

その後、図形用Pathを定義してCGContextFillRect()やCGContextFillPath()を呼べば、パタンルーチンがその内部のみに適用され実行されることになります。描画が終了したら、使用済みのパタンはCGPatternRelease()で開放しておきます。ちなみに、CGPatternCreate()とCGPatternRelease()は、ヘッダーファイルのCGPattern.hに定義されていますが、CGContextSetFillPattern()とCGContextSetStrokePattern()はCGContext.hの方に定義されていますので注意してください。

さて、このような仕組みで実行されるQuatz 2Dパタン機能ですが、実際にサンプルソースを書いて動かしてみても何故だかうまく動きません?うまく動かないというより、まったく動かないのです?あれこれチェックしてみたところ、CGPatternCreate()にセットしたはずのCGDrawPatternProcPtrへと制御が渡らないようです。現状、Apple社から提供されているパタン描画サンプルプロジェクトが見あたらないので(無い可能性が大きい)、私の「やり方」が間違っている可能性も大です。しかし、なんとも納得いかないので色々と試行錯誤を繰り返してみましたが、結局はダメでした。ひょっとするとQuartz 2Dのパタン機能自体、まだ実装されていないのかもしれません(涙)。どなたか、Quartz 2Dのパタン機能を使い、うまく図形を塗りつぶすことができた方がいらっしゃいましたら、ぜひ私宛にご連絡をください。お待ちしております。

Quartz 2Dのパタンに関係するAPI(CGPatternCreate()など)定義をヘッダーファイルで調べてみると、そのコメントには、しっかり「in version 10.1 and later」と記載されています。確かにソース内でAPIを記載しても、リンクエラーが発生することはありませんし、呼び出すことでアプリケーションが落ちるようなこともありません。API自体は、Framework内にちゃんと実装されているようです。しかし、Mac OS X 10.0の時にも何度も遭遇したのですが、未だ「機能実装」が不完全なAPIがあるようです。「機能実装の準備まではしたが、Mac OS X 10.1の発表までに機能の完成が間に合わなくて取り残されてしまった」と言ったところでしょうか?こうしたAPIを、デベロッパー側が試行錯誤のすえ見つけ出さなければいけないのは、異常な事態です。Apple社には、こうした「取り残されAPI」についての正確な情報を、デベロッパー側にすみやかに提供する義務があると思います。

とりあえず、今回でQuartz 2Dの話は最後です。Mac OS X 10.2では、Quartz 2Dの機能も大幅にアップされるでしょう(そうじゃないと困る)。そうなれば、Appleサイトにも最新版(最終版?)ドキュメントが登録されると思われますので、その時にはアップされた機能内容を再度紹介したいと思います。
[小池邦人/オッティモ]
関連リンクオッティモ