Macintosh Developer Online (MDOnline)


2001年9月3日発行号 - WO4.5.1へのアップデート



2001年8月30日に配信した「倉橋浩一のWebObjects Practice》WebObjectsを4.5から5に移行する時の注意点」という記事において、事実を正確に反映していない箇所がありましたので、記事の一部を改めました。再配信は行いませんので、申し訳ありませんが、Webサイトで記事を御確認ください。Webでの公開によって訂正をさせていただくものとしますので、ご了承ください。関係者の方々にはこの場を借りておわび申し上げます。
━━━━━━━━
休暇中は家族で旅行に行きました。那智勝浦の温泉に行ってきたのですが、宿泊したのは「ホテル浦島」です。東京近辺の人は、晴海にあるあのホテルを聞いたことがあるかと思いますが、その系列のホテルです。岩場の洞窟の中にあって大平洋の荒波を見ながら温泉につかることができるという「忘帰洞」が最大の売りで、文字どおり帰るのを忘れるくらいのいいながめでした。ホテルと言っても1つの建物があるだけでなく、全部で4〜5つ分くらいの建物があって、半島のあちらこちらの建物があるというくらいの豪快な巨大ホテル群です。土産もの屋は店があるというよりも、ほとんど商店街状態でたくさんの店が連なり、帰りの時間帯なんて混雑した駅を歩いているかのようです。いずれにしても、典型的な温泉ホテルだけど、規模が半端じゃないというところでしょうか。昔は、熱海、勝浦、別府といえば、3大温泉地だったとか…。そのホテルで、なかなか豪快なものを見つけました。こんなところでもマカダミアナッツチョコレートが売ってるんですね〜(笑)。おやおや、ほんまに世界中で買えるんかないなと思いながら良く見ると、「ホテル浦島」のマカダミアナッツチョコレートなんですよ。ハワイ土産というか、海外旅行土産として定着した感のあるマカダミアナッツチョコレートですが、ホテル浦島バージョンがあるとすると、もしかして、各地にいろいろなマカダミアナッツチョコレートがあのかも? なんて思うとわくわくしたりして(笑)。ちなみに、パッケージは「忘帰洞」の写真です。原産はハワイになっていて、江戸川区にあるギフト物産というところが輸入元になっています。

(新居雅行 msyk@mdonline.jp


小池邦人のプログラミング日記》2001/9/1<Quartz 2D(Core Graphics)を使う その4>

今回は、QuickDrawのイメージ(PixMapイメージ)をQuartz 2Dで描画することにチャレンジしてみます。Quartz 2Dでは、描画するイメージをBitmapと呼ぶのですが、これはQuickDrawのBitMap(白黒2値イメージ)とは異なる物なので注意してください。

最近、AppleのADCメンバーサイトに「CarbonLib 1.4.5d3 SDK」が登録されました。まだまだCarbonLibの開発は続くようです(笑)。逆に言えば、未だに実現していない機能とか、取れていないバグが存在していると言うことですから、利用する側としては、必ずSDKに添付されているRelease Notesには目を通すべきでしょう。ただし、今回追加されたAPIやバグフィックスの箇所を見てみると、ほとんどシステムの奥底であり、一般的なデベロッパーが活用する箇所については、かなり「こなれて」来たのかもしれません。ちなみに、今回のSDKに付属しているUniversal Interfacesのバージョンは3.4.1b2で、こちらに関しては、ADCメンバーサイトに登録されている最新バージョンからの変更点は無いようです。

さて、Quartz 2Dを使い、特定のContex(描画環境)へイメージを描画する場合には、CGContextDrawImage()というAPIを利用します。このAPI、QuickDrawでイメージを描画する時によく使うCopyBits()とは少し性質が異なります。どちらかと言うと、QuickDrawのDrawPicture()に似ているかもしれません。CopyBits()の方は、汎用のイメージ転送ルーチンであり、ダイレクトに転送元と転送先を選択でき、描画モードについても(Copy、OR、XORなど)色々と変更することができました。それと比較して、CGContextDrawImage()は、指定されたイメージデータを、単純にContextの特定矩形領域に描画するだけです。ただし、オリジナルからの拡大、回転、変形といった処理は、以前に説明したCurrent Transformation Matrizx(CTM)を操作することで簡単に実現することができます。描画結果の品質は、アンチエイリアスもしっかり処理されており、QuickDrawのCopyBits()とは比較にならないほど美しいものです。Mac OS Xのスクリーンセーバーに、フォルダに保存されているイメージをスライドショー的に順次表示していくモジュールがありますが、あの時の美しい拡大表示は、この能力を活用していると思われます。

まず最初に、Windowへ描画したいイメージをファイルからロードし、QuickDrawのPixMapイメージとしてGWorldオフスクリーンバッファに保存しておきます。ここまでの作業は、ToolBoxやQuickDraw APIを活用して処理する一般的な作業ですので、説明は省略します。そうして確保したオフスクリーンバッファを参照するためのWindowは、先んじて外部変数(WindowRef)のq_wptrに保存しておきます。以下が、GWorldに確保したPixMapをQuartz 2DのBitmapイメージに変換し、それをWindow(Context)に描画するためのdrawPixMapImage()ルーチンです。

 

このルーチンの引数は、保存されているPixMapを参照するためのWindowRefと、描画先を決定するQuartz 2D Context、イメージの描画位置を示すX、Y座標(Point)です。

最初のlockOffScreen()は、GWorldが内部に確保しているPixMapのメモリー領域(Handle)をロックするための自作ルーチンです。続いて、GetPixBaseAddr()とGetPixRowBytes()を使い、PixMapイメージの先頭アドレスとRowバイト(画像の横幅のバイト数)を得ます。それと、GetPortBounds()で得たイメージの矩形枠(prt)から、それの横幅ピクセル数(ww)、高さピクセル数(hh)、そして全データのバイト数(size)を計算しておきます。まずは、イメージの先頭アドレスとデータバイト数をCGDataProviderCreateWithData()に渡し、CGDataProviderRefを得ます。この処理により、描画したいイメージのデータ供給元を特定したことになります。

CGColorSpaceCreateDeviceRGB()で採用するカラースペック(CGColorSpaceRef)を決定し、他の引数と伴にCGImageCreate()に渡し、Quartz 2D BitmapイメージのリファレンスであるCGImageRefを得ます。引数のkCGImageAlphaPremultipliedFirst定数は、このBitmapイメージがどのようなタイプなのかを指示しています。Quartz 2Dで描画できるイメージには、アルファーチャンネルやRGBプレーンの並び順の違いで、色々なタイプが存在しています。そこうしたタイプについては、Universal InterfacesのCGImage.hに定義されていますので、一度参照してみてください。CGImageRefを、CGRectMake()で作成した矩形情報と一緒にCGContextDrawImage()に渡せば、同じく引数として渡したContexの指定矩形領域に、イメージが描画されることになります。

この時CGRectMake()に渡す引数は、SetRect()とは異なり4つとも浮動小数点で、渡する順序も矩形の左、下、幅、高さとなっていますので注意してください。確保したCGColorSpaceRefやCGImageRefは、作業終了後に、CGColorSpaceRelease()やCGImageRelease()で解放しておきます。ルーチンの最後に実行しているunlockOffScreen()は、GWorldのPixMapイメージのメモリー領域のロックを解除する自作ルーチンです。

drawPixMapImage()を用い、Window上のマウスクリック位置にイメージを描画するpaintImageWindowX()ルーチンは、以下のようになります。

 

確保したイメージは、マウスドラッグをしている間(マウスを離すまで)連続して描画されます。対象イメージは、drawPixMapImage()に外部変数に確保したq_wptrを渡すことで指示しています。ただし、この処理だと、描画する度にCGImageCreat()でイメージを作成することになり、描画効率が良くありません。本当ならば、paintImageWindowX()で実行されるマウスクリックループの直前に、CGImageCreate()でCGImageRefを得て、マウスが離されたらCGImageRelease()で解放するように処理に書き直すべきでしょう。そうすれば、より高速なイメージ描画が可能となります。

さて、こうしたルーチンを使い、実際にGWorldに確保してあるイメージをWindowに描画してみると、困ったことが起こります。

 

図の左側にあるのが、GWorldに確保されているオリジナルイメージです。その右側のWindow上が、実際の描画中を示しているのですが、描画イメージがひっくり返っていることが分かります。これは、以前に解説したcreateWindowContxt()が、Quartz 2Dの描画座標系をQuickDrawやマウスカーソルの座標系に合わせるために、CTMを調整しているのが原因です。これにより、描画位置はマウスカーソルと一致したのですが、イメージの描画方向まで座標変換されてしまったわけです。

これを防ぐためには、イメージのCGImageRefを得る時に、メモリ上のイメージの方向を再調整する必要があります。しかし、それは非常に面倒な作業となりますので、座標変換をしているCTMの調整を止め、独自に座標変換をするように改良した方が得策です。以下が、CTMによる調整を止めたcreateWindowContxt()ルーチンと、独自の座標変換を追加したpaintImageWindowX()ルーチンです。

 

座標変換を行うのはマウスカーソルのY座標だけであり、その処理も...

pt1.v=(drt.bottom-drt.top)-pt1.v; /* pt1.vはマウスのローカルY座標 */

といった簡単なものです。よって、イメージだけでなく図形を描画する場合にも、こちらを用いた方が良いかもしれません。この新しいcreateWindowContxt()とpaintImageWindowX()を使えば、Window上へのイメージの描画結果は以下のように正常に行えます。

 

次回は、Quartz 2Dを利用したPDF(Portable Document Format)ファイルの描画と、描画図形のPDFファイルへの書き出し(保存)を解説してみたいと思います。
[小池邦人/オッティモ]

関連リンク:オッティモ
カテゴリ:グラフィックス, 小池邦人のプログラミング日記


WebObjects 4.5.1、AppleShare IP 6.3.3のアップグレードは今月一杯で締め切り

WebObjects 4.5から4.5.1へのアップグレードは、2001年9月28日で申し込みが締め切られる。Ver.4.5は、Mac OS X Server 1.2までの環境で開発や運用ができるが、Mac OS X/Server 10.0でObjective-Cベースのアプリケーションの開発や運用を行うには、Ver.4.5.1が必要となる。開発中の案件をVer.4.5のObjective-Cをベースに作業を行っている場合には、稼動環境がWindowsやあるいはSolarisだとしても、開発環境を最新のMac OS X 10.0で行いたい場合には必要になるアップグレードである。価格は2,500円となっている。なお、WebObjects 4.5.1の新規購入も受け付けており、通常パッケージは72,800円で購入できるが、購入方法は、WebObjectsのページを参照してもらいたい。Ver.4.5は販売を終了しているが、Ver.4.5.1のキーは移行を考慮して、開発・運用共にVer.4.5でも使用することができる。

◇WebObjects
 http://www.apple.co.jp/webobjects/index.html

AppleShare IP 6.1/6.2/6.3を、最新版の6.3.3へアップグレードするプログラムも2001年9月30日で申し込みが締め切られる。Mac OS 9.1を含む、AppleShare IPのフルインストールCDも付属して、2,500円で入手ができる。なお、Network Assistant 4は含まれない。AppleShare IPの6.3.3へのアップグレードプログラムはダウンロードによる入手はできない。AppleShare IPを使ったサーバを使い続ける必要がある場合には、アップデートは検討する必要があるだろう。ただし、QuickSilverタイプのPower Mac G4と、2001年夏モデルのiMacは動作対象機種ではなくなっているので注意が必要だ。

◇AppleShare IP 6.3.3 アップグレードプログラム
 http://www.apple.co.jp/appleshareip/upgrade/asip.html

カテゴリ:サーバー製品, WebObjects, 各種製品


KBase》Mac OS Xでモデム接続の情報を残し参照する方法

Mac OS X 10.0でモデム接続を行う場合のトラブルシューティングのための情報がKnowledge Baseに掲載された。モデム接続では、PPP設定のパネルにあるPPPオプションに「詳細なログを作成する」という設定が可能である。その設定を行う方法と、ログの参照の仕方が掲載されている。設定は、システム環境設定の「ネットワーク」で行い、ログはInternet Connectioアプリケーションの「ウィンドウ」メニューから「接続ログ」を選択して参照することができる。この文書では手順が細かく示されている。

関連リンク:Mac OS X 10.0: How to Gather Modem Troubleshooting Information
カテゴリ:Knowledge Base(旧TIL), インターネット全般, Mac OS X


KBase》Server Adminアプリケーションで-193のエラーが出る場合の対処

Mac OS X Serverの管理を行うためのServer Adminで、-193番のエラーが発生する原因について、Knowledge Baseで解説が掲載された。ユーザのホームフォルダにあるLibraryフォルダ内のPreferencesフォルダに対して、読み込みと書き込みの権限がないとこのエラーが出る。また、この文書には、読み書きの権限の設定をFinderで行う方法が手順で説明されている。フォルダのプロパティをウインドウに表示して、アクセス権の設定を行うというものである。

関連リンク:Mac OS X Server 10.0: Server Admin - "A program error has occurred. -193" Alert
カテゴリ:Knowledge Base(旧TIL), Mac OS X Server


KBase》Mac OS XのApple System Profilerではモデム情報が正しく表示されないことも

Mac OS X 10.0に付属するApple System Profilerでは、モデムに関する情報が正しく表示されないことがあることについてKnowledge Baseの文書で公開されている。ハードウエアの問題がない場合でも、正しく表示が行われない。問題については調査中としている。

関連リンク:Mac OS X 10.0: Apple System Profiler Modem Information Incorrect or Missing
カテゴリ:Knowledge Base(旧TIL), Mac OS X


nibファイルに保存されるアクションに対応したセレクタは2通りの形式がある

Technical Q&Aで、Cocoa-Javaのアプリケーションにおいて、セレクタのチェックを行う場合の方法が説明されている。サンプルプログラムも掲載されており、セレクタの文字列との比較だけでなく、コロン(:)を最後につけたセレクタ文字列の比較も行って、それらをORで結ぶ必要がある。Interface Builderでの設計を行った結果はnibファイルに保存されるが、アクションに対応したセレクタもnibファイルに保存される。Objective-Cのセレクタはコロンで終わるが、Javaのセレクタはコロンが付かない。したがって、どちらか一方のみを認識しておくような作りだと問題が発生する可能性があるので、両方のセレクタを認識されるように作成しておく必要がある。あるいはコロンを意図的に削除しておくという方法もある。

関連リンク:QA1069: Comparing selectors in Cocoa-Java code
カテゴリ:Technical Q&A, Java, Cocoa


KBase》Mac OS 9.2.1のインストールでQuickTime Proキーの更新が必要な場合も

Mac OS 9.2.1をインストールすると、QuickTime Proキーが期限切れになる場合があることが、Knowledge Baseの文書で紹介されている。Mac OS 9.2.1によってQuickTime 5がインストールされる。一定期間より古いProキーは、アップデートをしないと利用できないようになっているので、その場合は従来のキーの継続利用はできないということになる。

関連リンク:Mac OS 9.2.1: Installs QuickTime 5, Which May Require a New QuickTime Pro Key
カテゴリ:Knowledge Base(旧TIL), Mac OS 9, QuickTime


KBase》iBookの外部ディスプレイ接続でフリッカーが出るのはDDC対応してないため

Dual USBタイプのiBookで、外部ディスプレイを接続した時にフリッカー(点滅)して見える場合があることがKnowledge Baseの文書で公開されている。1024×768ドットの場合で、ディスプレイがDDC(Display Data Channel)に対応していない場合にそうした症状が発生する。解像度を下げれば、フリッカーはなくなる。DDC対応していないモニタはとしては、初期のタイプがそうであるという説明がなされている。

関連リンク:iBook (Dual USB): External Monitor Flickers at 1024 by 768 Resolution
カテゴリ:Knowledge Base(旧TIL), iBook