タイトル小池邦人のプログラミング日記》2001/8/3<Quartz 2D(Core Graphics)を使う その1>カテゴリーグラフィックス, 小池邦人のプログラミング日記
作成日2001/8/6 14:34:32作成者新居雅行
今回から数回に分けて、Mac OS Xに搭載されている2Dレンダリングエンジン「Quartz(Core Graphics)」の使用感について書いてみたいと思います。まずは、QuartzがどのようにMac OS Xのシステムと関わってるのかを確認し、それから実際にサンプルアプリケーションを作成してみることにします。

何やらインターネット上にMac OS X 10.1 Preview版がリークされたようで、あちこちで大騒ぎになっている今日この頃です(笑)。Macworld Expo/New YorkでMac OS X 10.1のPreview版が発表されたまでは良かったのですが、それ以降、Mac OS X 10の開発環境について大きな進展がありません。毎日、新しいドキュメントが発表されていないかと、Appleサイトを徘徊しているのですが、残念ながらまったく変化なしです。Carbon開発環境にしても、7/12にADCメンバーサイトにCarebonLib 1.4b2 SDKが登録されて以来、沈黙が続いています。今の時期、Apple社のMac OS X開発チームにとってはそれどころではないのでしょうが(笑)、Mac OS 10.1の正式発表と同時に、CarebonLib 1.4 SDK GMや大量の関連ドキュメントが登場することを望みたいと思います。(と書き終わるか終わらないうちに、以下のAppleサイトにCarebonLib 1.4 SDK GMが登録されました!)

◇CarbonLib SDK 1.4
 http://developer.apple.com/sdk/#Carbon1.4

これから紹介するQuartzについても、関連するドキュメントは少なく、以下のサイトに登録されている2つのPDFドキュメントと、数少ないサンプルプロジェクトが唯一の手がかりとなります。

◇Quartz 2D
 http://developer.apple.com/techpubs/macosx/CoreTechnologies/graphics/Quartz2D/quartz2d.html

2つのPDFドキュメントのうち、片方の「Quartz Primer」(QuartzPrimer.pdf)は、たった15ページしかありません。Quartzの機能についての簡単な紹介と、Quartz APIを使いPixMapやPDFファイルを描画する簡単なサンプルソースが紹介されています。もう片方の「Drawing With Quartz 2D」(drawingwquartz2d.pdf)は、約70ページのPDFドキュメントです。こちらには、Quartzが提供する描画機能がより詳しく記載されており、そうした機能を利用する時に、どのようなAPIを使ったらよいのかが、サンプルソース付きで解説されています。ただし、こちらにも、API全体が一覧できるようなリファレンスは含まれておらず、それについてはUniversal Interfaces 3.4のQuartzに関するヘッダーファイルを参照するしか手はありません。先頭にCG(Core Graphicsの略)と付いているのが、Quartzに関係するヘッダーファイルです。

 

しょうがないので、私は全ヘッダーファイルのAPIに関する部分だけを抽出し、ひとつのファイルにまとめてからプリントアウトし、活用しています。これだけでも50ページ以上のドキュメントとなりますので、Quartzが提供する機能がいかに多いかが理解できます。

Quartzは、Mac OS Xの2Dイメージングモデルの基盤を成すシステムです。これと同様に、3Dに関してはOpenGLが、動画に関してはQuickTimeが受け持ちます。先ほどのQuartz Primerドキュメントを読んでみると、Quartzを機能別に2つのモジュールに分けていることが理解できます。以下が、Quartz Primerより引用したMac OS Xのグラフィックスとウィンドウに関するシステム概念図です。

 

Quartzの部分は「Core Graphics Rendering」と「Core Graphics Services(Window server)」に分かれています。ここで使われている「Core Graphics」という呼び方ですが、ヘッダーファイルやAPIの呼び名など、開発環境にかぎってはQuartzという呼び方より一般的です。WWDC 2001のセッションで、「Quartzはマーケッティング的な呼び名で、テクニカル的にはCore Graphicsが正解だ!」と説明していたAppleの技術者もいました。

ところが、Drawing With Quartz 2Dドキュメントの方を読んでみると、上記の2つのモジュールは「Quartz 2D」と「Quartz Compositor」と言う名称に変更されています。Quartz 2DがCore Graphics Renderingと完全に一致しているのは間違いないと思いますが、Quartz CompositorがCore Graphics Services(Window server)とまったく同じモジュールなのかどうかは定かではありません。なぜなら、今回紹介した両ドキュメントには、Quartz 2Dについてのトピックスのみが記述されており、Quartz Compositorについては記載がないのです。以下のサイトを見ると、Quartz Compositorはドキュメントリストとしては上がっていますが、残念ながらリンク先は存在していません。

◇Core Technologies Developer Documents
 http://developer.apple.com/techpubs/macosx/CoreTechnologies/coretechnologies.html

そんな訳で、Quartz Compositorについてはほとんど情報がないのですが、基本的にはMac OS XのWindow Serverの機能を指しているようです。よく、Jobsがモニター上で、QuickTime Movie、OpenGLの3Dオブジェクト、2Dグラフィックを合成表示するデモを行いますが、そうした機能を提供しているのも、このモジュールだと考えられます。加えて、ローレベルのEventハンドリングやマウスカーソルのマネージメント、Aquaユーザインターフェースなどにも深く関わっているようです。もう片方のQuartz 2Dの方は、PostScriptでお馴染みのベジュ曲線、パス・ベースの図形描画、PDFの描画や書き出し、トランスペアレンシー(透明度)やカラー環境のマネージメントなどなど、アプリケーションレベルの多くの機能を提供しています。

さて、実際に自作CarbonアプリケーションでQuartz 2Dを使う準備をしてみます。ここで、注意しなければいけないのは、Quartz API(Core Graphics API)は、Mach-Oベースのアプリケーションからしか呼び出すことがでないと言う制限です。つまり、CFMベースのCarbonアプリケーションからは利用できません。ただし、Quartz Primerドキュメントの最後には、CMFベースのCarbonアプリケーションからQuartz APIを呼び出す手法が紹介されています。そのために、Universal Interfaces 3.4にもQuartzに関連するヘッダーファイルが含まれているのかもしれませんが、この方法を使うことは、あまりお薦めできません。はっきり言って止めた方が良いでしょう。たとえ、Quartz APIを利用するCMFベースのCarbonアプリケーションを作ったとしても、Mac OS 8/9自体にQuartz 2Dに相当する機能は存在しませんので、起動は不可能です。Quartz 2Dを使うと言うことは、CarbonアプリケーションをMac OS X専用に開発することが前提となるわけです。そう言えば、WWDC 2001のQ&Aセッションで、Macromediaの技術者が「CMFベースのQuartz 2Dライブラリーを用意しろ!!」とAppleに喧嘩を売っていたことを思い出しました(笑)。

March-OベースのCarbonアプリケーションを開発するのには、Mac OS X Developer Toolsに付属していたProjectBuilderを使うか、WWDC 2001でお土産にもらったMetrowerks CodeWarrior 7.0 Early Access(開発リリース)を使います。今回は、使い慣れたCodeWarrior7.0EAを選択し、以前にMach-Oベースに作り直した自作アプリを間借りし、Quartz 2Dの機能を色々と試してみることにします。

 

以前の状態から新たに行なう作業は、プロジェクトウィンドウの「Frameworks」タグに「ApplicationServices.framework」を追加することです。このFrameworkは、Mac OS XのSystem/Library/Frameworksフォルダ内に存在します。そして、実際にリンクされる「CoreGraphics.frameworks」は、このフォルダの奥底に存在しています。Frameworkに関しては、上位階層をリンクしておけば、後はMac OS XのアンブレラFrameworksの仕組みが働き、下位階層のすべてにアクセス可能となります。

 

次回は、自作CarbonアプリケーションにQuartz 2Dで描画可能な環境を構築してみます。加えて、Quartz 2DとQuickDraw描画環境との融合についてもお話したいと思います。
[小池邦人/オッティモ]
関連リンクオッティモ