ホームページ開発ツール>REALbasic Mach-O Plugin 覚書・応用編1・画像の回転

 REALbasic Mach-O Plugin 覚書

応用編1・画像の回転

目次
 はじめに

 今回はXcodeテンプレートのカスタマイズと、画像関連プラグインの作成に関する話題です。


 Xcodeテンプレートのカスタマイズ

 作成するプラグイン群に共通の設定は、テンプレートの段階でカスタマイズしておけば、後で個別に設定し直さなくても済むようになります。
 ここでは、以下の2点について設定します。
  1. ユニバーサルバイナリがビルドできるようにする
  2. コンパイル時に大量に出る「Deprecated」の警告を表示しないようにする
 なお、Deprecatedについては、例えば以下のサイトに詳説されています。
 参考サイト(1):Koike ToolBox 2006/09/09
 手順は以下の通りです。
  1. /Developer/Library/Xcode/Project Templates/に新規フォルダを作成し、名前をREALbasic Plug-insとする。
  2. 前回用意したREALbasic Mach-O Pluginフォルダを上記フォルダ内に移動し、コピーを作成する。(名前はREALbasic Mach-O Plugin 2
  3. REALbasic Mach-O Plugin 2フォルダ内のプロジェクトをダブルクリック。バージョンが古いとかメッセージが出るので、指示に従って保存する。
  4. 保存したプロジェクトをクリック後、コンテキストメニューを開き、「パッケージの内容を表示」を選択。
  5. <ユーザ名>.pbxuser<ユーザ名>.mode1v3を捨て、パッケージを閉じる。
  6. 旧プロジェクトファイルを捨てる。
  7. プロジェクトをダブルクリックして開く。
  8. プロジェクトを選択して「情報」ボタンを押し、ビルドタブを表示する。
  9. 「アーキテクチャ」の「アーキテクチャ」をクリックし、「ppc i386」とタイプ。
    注)初出時「PPC」と大文字で表記していましたが、これは誤りで、小文字でなければなりません。(2008.04.30)
  10. 「GCC 4.0 - 警告」の「推奨されない関数についての警告」のチェックを外す。
  11. プロジェクトを閉じる。
  12. プロジェクトをクリック後、コンテキストメニューを開き、「パッケージの内容を表示」を選択。
  13. <ユーザ名>.pbxuser<ユーザ名>.mode1v3を再び捨て、パッケージを閉じる。
  14. プロジェクトフォルダのbuildフォルダを捨てる。以上でカスタマイズは終了。
  15. Xcodeを起動し、テンプレートを選択。
  16. オプションの設定が継承されているか確認。
注)<ユーザ名>.pbxuserと<ユーザ名>.mode1v3を捨てると、コンパイルエラーが発生することがありますので、捨てる操作は抹消しました。テンプレート作者本人が使う分には特に問題ないと思われます。(2008.03.22)

 画像を回転するプラグインを作る

 前回作成したサンプルは、実用性という点では殆ど意味はありませんでしたが、画像の回転はプラグイン化の効果が見込める分野です。
 プラグイン内での画像の回転処理方式としては、
  1. QuickDrawを使って、GWorld(いわゆるオフスクリーン)上でピクセルを操作する
  2. Quartz 2Dを使って、マトリックスを操作する
 現在はQuartz 2Dを使うのが主流のようですが、REALbasicとの連携方法が良く分かりません。一方、QuickDrawは比較的情報が揃っていることから、QuickDrawの学習も兼ねて、1の方式でいくことにしました。
 なお、学習にあたっては、以下のサイトで公開されている「AkikoMask_Plugin v1.1」を参考にさせて頂きました。
 参考サイト(2):S.H.R.
 今回作成するものは、与えられた画像(Picture)を90度単位で時計回りに回転するもので、以下のようなものです。
RotateImage(p As Picture, mode As Integer) As Picture (mode=1 : 90度、mode=2 : 180度、mode=3 : 270度、それ以外は入力を返す)
 アルゴリズムは、Picture型を受け取ってオフスクリーンにコピーし、端から1ピクセルずつ拾っては、もう一つのオフスクリーンに置いていき、終わったらPicture型に変換して返す、という単純なものです。
(90度ずつの回転では、規則性があるため、読み出しのループ内で同時に書き出しも行っています。)

 作成手順は前回と同じです。
  1. Xcodeを起動し、ファイル>新規プロジェクト...メニューを選択。
  2. テンプレート選択ダイアログが表示されるので、REALbasic Mach-O Plugin 2を選択。
  3. プロジェクトに名前をつける。ここでは「RotateImage」とする。
  4. RotateImage.cppを開き、(既に書き込まれているものを全て削除後)こちらのコードをコピーする。
    注)コードは作者が学習用に試作したものであり、その内容は無保証です。使用した結果、何らかの障害が発生しても、作者は一切の責任を負いません。
  5. ビルドする。
  6. pbx形式に変換する。
    基本的には前回のpbx形式に変換すると同じですが、ビルドされるのがユニバーサル形式のため、フォルダの構成は以下のとおりとします。
    RotateImage
      Build Resources
        Mac Carbon Mach-O Universal  <-- 名前変更
          RotateImage.dylib
    

 画像回転プラグインをテストする

 動くかどうか、テストします。
  1. REALbsicを起動する。
  2. Window1のプロパティに以下を追加。
    p1 As Picture
    p2 As Picture
    
  3. Window1にCanvasを2個置き、Paintイベントに以下を記述。(上段はCanvas1用、下段はCanvas2用)
    if p1<>nil then
      g.drawpicture p1,0,0,me.Width,me.Height,0,0,p1.Width,p1.Height
    end if
    
    if p2<>nil then
      g.drawpicture p2,0,0,me.Width,me.Height,0,0,p2.Width,p2.Height
    end if
    
  4. Window1にPushButtonとStaticTextを置き、PushButtonのActionイベントに以下を記述。
    Dim t1,t2 As Integer
    
    t1=Ticks
    p2=RotateImage(p1,1)  // プラグイン。必要に応じて第2パラメータを2,3にするか、別ボタンを用意する。
    t2=Ticks
    StaticText1.Text=Str((t2-t1)/60)
    
    if p2<>nil then
      Canvas2.refresh
    else
      msgBox "err"
    end if
    
  5. Window1のopenイベントハンドラに以下を記述。
    Dim f As FolderItem
    
    f=GetFolderItem("hoge.jpg")  // あらかじめプロジェクトと同じフォルダ内に画像ファイルを用意
    if f<>nil and f.exists then
      p1=f.OpenAsPicture
      Canvas1.Refresh
    end if
    
  6. 実行する。(Canvas1に元画像が表示される)
  7. PushuButtonを押す。Canvas2に回転した画像が表示されればOK。
注)動作テストが目的なので、縦横比の維持は考えていません。
 性能も計ってみました。
 テストマシンはmac mini(Intel Core Duo 1.66GHz, 1GB)
 テストデータはデジカメの画像で、2560x1920ピクセル、RGBカラーのjpegファイルです。

  90, 270度 0.3秒前後
  180度   0.2秒前後

で、まずまず実用範囲内と思われます。


 おわりに

 いずれにしても、QuickDrawは「Deprecated」なので、Quartz 2Dへの移行は避けられないのでしょう。
 ということで、追々ではありますが、Quartz 2Dの学習も心掛けていきたいところです。

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


 お世話になったサイト

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

 参考サイト(1):Koike ToolBox 2006/09/09
 参考サイト(2):S.H.R.


 更新履歴

 2008.04.30 Xcodeテンプレートのカスタマイズで、タイプミスを修正。(PPC -> ppc)
 2008.03.22 Xcodeテンプレートのカスタマイズで、<ユーザ名>.pbxuserと<ユーザ名>.mode1v3を捨てる操作を抹消した。
 2008.02.29 新規作成


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