ホームページ開発ツール>REALbasic Mach-O Plugin 覚書・応用編2a・アイコンの取得(256と512アイコン)

 REALbasic Mach-O Plugin 覚書

応用編2a・アイコンの取得(256と512アイコン)

目次
 はじめに

 アイコン画像を取得するプラグインの作成に関する話題の続きです。

 Mac OS X 10.5より、アイコンデータに256x256ピクセルと512x512ピクセルの画像が追加されました。
 前回の記事では128x128ピクセル迄の対応でしたが、偶々実験の必要が生じたこともあって、これを拡張してみました。
注)成り行きと、不確定要素を増やしたくないことから、以下の環境でビルドしています。
・Mac mini late 2006 (intel)
・Mac OS X 10.5.8
・REALbasic 2008r2
・Xcode 3.1.4
(最新の環境でのビルド状況は未確認です。ただし、ビルド済のプラグインは10.8でも動作しています。)

 基本方針

 基本的には、対応するエレメントタイプを追加するだけで、前回のプロジェクトがそのまま使えます。
256x256ピクセルアイコン用:kIconServices256PixelDataARGB
512x512ピクセルアイコン用:kIconServices512PixelDataARGB
 ただし、これ迄と違って、マスクは独立したエレメントタイプを持たず、アイコンデータ内のアルファチャンネルに格納されています。
 そのため、アルファチャンネルから値を読み取って、これをマスクとして書き出す処理が必要になります。
 また、従来のマスクとの整合性をとるために、値を反転する処理も追加しておきます。

 マスクの書き出し方法は色々あると思いますが、ピクセル単位で、アルファチャンネルの値をRGBの各要素にコピーするのが手っ取り早そうです。

 GetIconFamilyData()により取得した、raw形式のデータ(ハンドル)は4バイト一組で、RGBとA(アルファ)がそれぞれ1バイトを占有しています。
 この並びは、Intelマシンでは「B-G-R-A」の順になっているようです。なので、
  1. ハンドルをUInt32で取得
  2. 0x000000ffでアンドを取って、アルファチャンネルのみを残す
  3. ビットシフトを行って、RGBの各領域にコピー
  4. ハンドルが終了する迄繰り返す
 なお、PPCマシンでは「A-R-G-B」の順になっているようですが、検証する環境がありませんので、未確認です。


 ソースの変更部分

 前回のソースに、以下の通り追加します。(case文は256のみ示しているが、512も同様に取得可。)
注1)呼び出し側の引数は、256データ=16、256マスク=17、512データ=18、512マスク=19、としている。
注2)データとマスクは同じエレメントタイプを使うので、同じものを指定する。
注3)前述の通り、PPCには対応していない。(必要なら追加して下さい。)

OSType	iconType[] = {
kThumbnail32BitData,kHuge32BitData,kHuge8BitData,kLarge32BitData,kLarge8BitData,kSmall32BitData,kSmall8BitData,kMini8BitData,
kThumbnail8BitMask,kHuge8BitMask,kHuge1BitMask,kLarge8BitMask,kLarge1BitMask,kSmall8BitMask,kSmall1BitMask,kMini1BitMask,
kIconServices256PixelDataARGB,kIconServices256PixelDataARGB,kIconServices512PixelDataARGB,kIconServices512PixelDataARGB};  // 最後に4個追加
UInt32	*tmpHndl, *tmpHndlEnd, tmp1, tmp2, tmp3, tmp4;  // 新規追加
…

case 16:  // kIconServices256PixelDataARGB
	w = 256; h = 256; iPix = 0; iSize = w*4; break;

case 17:  // kIconServices256PixelDataARGB > Mask
	w = 256; h = 256; iPix = 0; iSize = w*4;
	tmpHndl = (UInt32*) *hndl;  // rawデータの先頭
	tmpHndlEnd = tmpHndl + w * h;  // rawデータの最後
	while (tmpHndl < tmpHndlEnd) {
		tmp1 = ~ (*tmpHndl) & 0x000000ff;  // アルファチャンネルバイト領域のみを残し、ビット反転
		tmp2 = tmp1 << 8;   // RGBバイト領域にシフト(1)
		tmp3 = tmp1 << 16;  // RGBバイト領域にシフト(2)
		tmp4 = tmp1 << 24;  // RGBバイト領域にシフト(3)
		*tmpHndl = tmp2 | tmp3 | tmp4;  // 書き戻す
		++tmpHndl;
	}
	break;


 おわりに

 Cocoa系だとアルファチャンネルを取得するクラスとかがあるようですが、Carbon系にもあるのでしょうか?
 もしあれば、もっとスマートに処理できると思います。
 ただし、処理時間はそれほどかかっていないので、実験用途には使えそうです。

 注)今回のサンプルはあくまで動作確認用で、配布を前提としたものではありません。(配布用とするにはいくつかの配慮が必要になります。)


 お世話になったサイト

 貴重な情報をご提供頂いている皆様に、お礼申し上げます。(以下、順不同)

 参考サイト(1):thisservice/IconFamily.m at master・wafflesoftware/thisservice・GitHub


 更新履歴

 2013.01.11 新規作成


[Home]  [MacSoft]  [Donation]  [History]