タイトル【小池邦人のプログラミング日記】2000/11/15<さよならBitMapまた会う日まで!>カテゴリーグラフィックス, 小池邦人のプログラミング日記
作成日2000/11/15 18:21:47作成者小池邦人
今回も前回のフォローからです。前回、「CodeWarrior 6.0で、コマンドキーを押しながらのマウスドラッグでテキストのブロックコピーが可能になったが、この機能はソースコードのどんな編集に必要とされるのか?どなたか教えてください。」と尋ねたところ、何人かの読者の方から幾つかのアイデアが届きました。みなさん、お手紙ありがとうございました(笑)。そのうち良いなと思ったのは「Universal Interfacesの飾り文字を除外してコメント文章だけをカットする」という使い方です。確かにこの方法で文章をカットすれば、そのまま英語翻訳ソフト(うちの場合はE To J Pro)にペーストして快適に翻訳作業が行えます。まあソースコードの編集ではないのですが(笑)。みなさんも試してみてください。
 

さて、毎日目を光らせているCarbon SDKの進捗状況ですが、11/15にはADCメンバーサイトに「CarbonLib 1.2a2 SDK」が登録されました。つい最近、日本のアップルで開催されたMOSAセミナーで、アップルの技術担当者に「CarbonLib v1.1のGMどうなるのか?」と尋ねてみたのですが、正式な回答は得られませんでした(涙)。ついでに、Navigationサービスのダイアログをシートウィンドウとして表示する方法も尋ねてみましたが、こちらも回答無し。未来に期待してくれと言うことだそうですが、実に困ったもんです。MOSA湘南セミナーの深夜の大宴会では、CarbonLibの進捗状況を悲観し、某老舗Mac用ソフトメーカの大御所が大いに荒れたことを付け加えて起きましょう(笑)。

さて、今回はMac OS X環境でのBitMap(白黒2値の画像バッファ)の扱いについて解説してみたいと思います。最近、AppleからMac OS X環境でのBitMapの扱いについてのQ&A集が発表されました。基本的にはBitMapはサポートしないというのが回答です。Macintoshでは、すでに白黒2値のモニター表示はサポートされていませんので、いまさらBitMapが利用できなくなっても困らないんじゃないかと思う人もいるでしょう。ところが、QuickDrawルーチンにはSeedCFill()やCalcCMask()のように、作成したマスクをBitMap画像バッファへ保存するAPIがいくつかあります。こうしたAPIは、ペイント系のアプリケーションを開発しているデベロッパーにとっては必需品であり、代替品が無いとすれば、Mac OS Xだからといって使うのを止めるわけにはいきません。

例として、SeedCFill()の動作の仕組みを簡単に説明してみます。

SeedCFill( BitMap *srcBits, BitMap *dstBits,
      Rect *srcRect,Rect *dstRect,
      short seedH, short seedV,
      ColorSearchProcPtr matchProc, long matchData);

SeedCFill()は、ソースとして与えら得たBitMap、もしくはPixMapの矩形領域の指定座標(seedH,seedV)を開始点とし、指定値(matchData)と同カラーのピクセルに対して塗りつぶし(Seed Fill)を実行します。その結果は白黒マスクとしてデスティネーションのBitMapに保存されるわけです。今までは、この保存用のBitMapを作成するのためにOpenPort()などのAPIを利用していました。CarbonLibを用いたMac OS 9環境で調べてみると、OpenPort() などを利用しなくても、BitMapさえ自作すればSeedCFill()は問題なく利用できます。例えば、別掲のmakeBitMap関数のようなルーチンでBitMapを自作し、それを引数に渡せばちゃんと結果がでるわけです。ところがMac OS X環境ではBitMapが葬り去られてしまったことにより、この方法ではうまく行きません。

私も自作ペイントソフトのペイントツール(バケツツール)などが、Mac OS X環境ではまったく動かない(ハングアップもしない)ので不思議に思っていたのですが、原因はここにあったようです。そこでAppleが提示した解決策は、NewGWorld()で1ビットのオフスクリーンバッファを作成し、それをBitMapの代わりに利用するという方法です。ここでは、その方法を取り入れた簡単なサンプルルーチンを提示しておきます(別掲の記事のmakeClickRegion関数)。PICT画像のある場所をクリックした時に、そのポイントを含む不定形領域のマスクをRegionとして作成するというルーチンです。これは、フォトショップのマジックハンドツールの簡易バージョン(濃度をチェックしない単色版)だと思っていただければ良いでしょう。

まずは、32bitフルカラーと1bit白黒2値の2種類のオフスクリーンバッファを作ります。32bitオフスクリーンの方にPICT画像を描画し、指定座標のカラーをGetCPixel()で抽出しおきます。それを開始座標値と共にSeedCFill()に渡せば、SeedCFill()は32bitのオフスクリーン上の「指定色と同じピクセル」を塗りつぶし、その結果を白黒2値マスクとして1bitオフスクリーンに保存します。最後に1BitオフスクリーンのPixMapをBitMapToRegion()に渡し、マスク領域をRegionに変換してやれば作業は終了です。ちなみに、名前には「BitMap」と付いているBitMapToRegion()ですが、ちゃんとPixMapを受け取ることができる点に注目してください(笑)。できれば、この機会にまぎらわしい名前を変更してほしいものです。とにもかくにも、さようならBitMap。長い間ご苦労さまでした!!
[小池邦人/オッティモ]
関連リンクオッティモ