MACWORLD Expo/Tokyoの会期中に、アップル社がADCメンバー対象に(Selectメンバー以上?)Mac OS Xの技術セッションを開催しました。今回は「Overlayウィンドウを使ったオブジェクトのセレクション」の話をする予定でしたが、そのセッションで、Quartz 2D(Core Graphics)の機能についての「新事実」が判明しましたので、そちらを先行して紹介したいと思います。
その前にちょっと宣伝です(笑)。毎日コミュニケーションズから「Mac OS X Carbon Programming Guide」という技術解説書が出版されます。

この書籍は、私が今までウェブサイトで書き溜めてきたMac OS XとCarbonについての解説を整理し、足りない部分を加筆した内容となっています。多くの読者から「書籍としてまとめて欲しい」という要望が届いていたのですが、それを実現できてホッとしております。加えて、MLTEやDataBrowserコントロールなど、まだ言及していない技術については、「金魚すくい」で有名な中野洋一氏が詳しく解説してくれています。Mac OS XとCarbonについて非常に「濃い」内容となっていますので、これからもMac OS XやCarbonと付き合わなければいけない方は、ぜひ参考にしてみてください。
さて、アップル社が開催したセッションは、Mac OS Xにおける「日本語環境」「グラフィックス」「ハードウェア」の各パートに別かれていました。セッションの解説者がApple本社から来日した技術担当でしたので、「プレWWDC 2002」といった雰囲気で、なかなか充実した内容となりました。ただし、深い質問をすると「それはWWDCで詳しく紹介するから参加してね(ウィンク)」といった具合に、WWDC 2002の宣伝も兼ねていたようです(笑)。出席者には、しっかり「WWDCツアー」のパンフレット配られていましたし...。「グラフィックス」セッションの大部分はQuartz 2Dに関してでした。すでに知っているトピックスが多かったのですが、Q&Aコーナーでは以下の3つの質問をぶつけてみました。
(1)「Quartz Compositor」はデベロッパー側からアクセスできるのか?それに関するAPIのリファレンスやドキュメントはあるのか?
(2)ヘッダーファイルに定義されているQuartz 2Dの「パタン機能」は、ちゃんと実装されていて利用することが可能なのか?
(3)Quartz APIで描画された図形や画像をCarbonアプリケーションからプリントアウトするのにはどうしたら良いのか?
(1)は、「非常に複雑な処理をしているので、ごにょごにょ...」といった感じで、口を濁していましたが(笑)、用意してあったスライドでCompositorの仕組みを簡単に説明してくれました(用意してあるなら質問する前にやってね)。「Quartz Compositor」はウィンドウサーバで、加えて低レベルのイベントハンドリングも受け持っています。結局、Quartz 2Dのドキュメントに解説されている内容以上の事実は分からずじまいで、このモジュールのAPIが開発者に開放されるかどうかについても、言及されませんでした。
(2)は、「ちゃんと実装している」と話していましたが(ちょっと自信なさげ)、私が「動かないんだけど...」と突っ込むと、「非常に複雑な処理なので、ごにょごにょ...」といった感じで、うまくごまかされてしまいました。サンプルソースならメールで送ることが出来るとフォローしていましたが、「誰でも見れるようにオープンにしてよ!」と頼むと、「まだ、そのレベルじゃないので、ごにょごにょ...」という雰囲気でした(笑)。多分、あの感じでは、完全な実装にはほど遠い状態なのでしょう?こちらについては、WWDC 2002で再度追及してみたいと思います。
(3)については、ついに「謎」が解決しました。まず重要な点は、Mac OS Xではプリントの最終出力には、必ずQuartz APIが作成したPDFが利用されるという事実です。CocoaアプリケーションでもCarbonアプリケーションでも、その仕組みは同じだそうです。ただし、Carbonアプリケーションからは、QuickDraw環境でQuartz APIを使わないとプリントアウトは実行できません。これは、いったいどういう事なのでしょうか?
以前に解説したと思いますが、Carbonアプリケーションのプリントアウトには、セッションプリントマネージャを利用します。関連ドキュメントによると、Quartz APIで描画した図形をプリントアウトするのには、PMSessionGetGraphicsContext()にkPMGraphicsContextCoreGraphicsを代入し、それにより得られたCGContextRefを用いて図形やテキストを描画するように指示されています。

サンプルルーチン内の、drawQuartzPrint()がQuartz APIで実際に図形を描画している箇所です。

ところが、このルーチンを実行してもプリントアウトはなされず、白紙が出力されるだけです。最初は「プリンターのドライバに問題があるのか?」と推測したのですが、ダイアログから「プレビュー」を実行しても同じ結果となるので、ドライバに依存した問題ではないという結論になりました。
今回のセッションの解説によると、Quartz APIによる描画をCarbonアプリケーションからダイレクトにプリントアウトすることは不可能なようです。つまり、プリント環境にCGContextRefを選べないのです。具体的には、PMSessionGetGraphicsContext()にkPMGraphicsContextCoreGraphicsを代入してCGContextRefを得る方法が使えないのです。その代わり、kPMGraphicsContextQuickdrawを代入しCGrafPtrを得、それをQDBeginCGContext()に渡すことでCGContextRefを得る方法を取ります。

プリントアウトが終了したら、QDEndCGContext()を呼び出してCGContextRefを開放することを忘れないでください。QDBeginCGContext()とQDEndCGContext()は、「Universal Interfaces 3.4.1」のCore Graphics関係のヘッダーファイルではなく、「Quickdraw.h」の方に定義されていますので注意してください。
この処理が一時的な対処方法なのかどうかは謎のままです。この手順を見てみると、プリント最終出力までの処理が、随分と遠回りをしているような気がします。こうしないとプリントアウトできないのは、Mac OS Xの内部的な仕組みが、まだまだ未完成である証拠なのかもしれません?しかし、出来ないなら出来ないでドキュメントに一言記述しておいてもらいたいものです。不可能な処理を試して悩むのは、まったくの時間の無駄なのですから(涙)。とにもかくにも、うちのプリンタでもQuartz APIによる図形描画をプリントアウトすることができました。記念すべき最初の出力ですね。

次回も、セッションで判明した利用価値が高いQuartz 2Dの隠れた機能を紹介します。Quartz 2Dを利用してPICTファイルを高精度で描画するという「荒技」です(笑)。どうやら、Microsoft社のExcelやWordでは、すでにこの機能が使われているようです。
copyright 2002 Ottimo, Inc. All rights reserved
無断転載・引用禁止
Contact Us: koike@ottimo.co.jp