ホームページ開発ツール>Xojo Cocoa 64bit Plugin 覚書・応用編1・コントロール系プラグイン(途上版)

 Xojo Cocoa 64bit Plugin 覚書

応用編1・コントロール系プラグイン(途上版)

目次
 はじめに

 今回はコントロール系、すなわち、IDEのコントロールペインに表示され、そこからウィンドウにドラッグして使う部品についての話題です。
注)解決できていない不明点がいくつかあるので、途上版としました。

 テスト環境

 ・Mac mini 2018
 ・macOS Mojave 10.14.6
 ・Xojo 2019 Release 1.1
 ・Xcode 11.2


 ここでもBox Control

 2019r1.1添付のサンプルの中では、HostWPFContentがコントロール系のようですが、これはWindows用なのでそのまま使うことできないため、ここでも以前使ったMach-O版 Box Controlを使うことにします。
 ただし、Box ControlはREALbasic 2008r1に添付されていたもので、Xcodeプロジェクトも3.0の頃のものなので、ソースコードファイル(boxControl.cpp)の中身だけを使うこととします。
 とはいえ、そのままでは使えない部分もあったりするので、気付いたことをまとめておきます。
  1. QuickDrawからCocoaへ
     塗り潰しや線の描画には、Quick Draw系の命令を使っているのですが、64bitビルドでは使えないので変更します。
     Core Graphics(以下、CG)系とApplication Kit(以下、NS)系の両方を試してみます。

  2. y座標軸問題
     Quick Draw系とCG/NS系では、周知の通り、y軸の座標系が異なります。(QDは左上が原点のULOで、CG/NSは左下が原点のLLO)
     REALGetControlBounds()はULOで返ってくるので、LLOに座標変換する必要があります。
     しかも、実験の結果、実行時と編集時で、原点が異なることが分かりました。

     まず、実行時ですが、原点は描画領域の左下になりますので、y値は0にすればOKです。
     一方、編集時は、原点がレイアウトエリアの左下になるのですが、横スクロールバーが表示されている場合は、スクロールバーの上辺が原点となるようです。
     レイアウトエリアの高さはCGBitmapContextGetHeight()で得られるのですが、この値は横スクロールバーが表示されていても変わらないため、そのまま使ってしまうと、横スクロールバー表示時には描画位置がずれてしまいます。

     IDE上の話なので、横スクロールバーを表示させないようにサイズ調整するとか、最悪、ズレは無視する(苦)とか、考えられなくもないですが、もう少し調べた方がよさそうです。

  3. コントロールの書き換えできない?
     ボックスサイズを変更した場合は、値をコントロールに書き戻す処理が含まれているのですが、そのためのREALSetControlPosition()がDeprecatedになっていて、代替メソッドも見つかっていません。
     テストレベルでは使わなくても問題なさそうですが、(考え方が変わっている可能性もあるので)調べておく必要はありそうです。
    (REALSetPropValue@Type@を使えばいいのかもしれませんが、これも分からないことだらけです。)

  4. NSLog代わり?
     今回実装するのがredrawFunctionであることもあって、drawAtPoint:withAttributes:を使って、変数の値を文字列化して書くことができます。
     デバッグに使えます。

 アイコンについて

 IDEに表示するためのアイコンを付加することや、なければないで標準のアイコンが使われることもMach-O版と同じですが、以下が異なります。
(詳細はPluginPackaging.rtf参照)
  1. フォーマット
    BMP形式からTIFF形式に変わっています。(BMPがNGかどうかは未確認)

  2. 名前
    REALcontrol構造体の5,6番目で指定する点は変わらずですが、この数字をファイル名の先頭に持つアイコンが使われます。
    (6番は5番と同じにするのがデフォのようです>結局、使っていない?)
 ここでちょっとした問題が。
 HostWPFContentのサンプルには1-library-large.tiff他が同梱されていますが、これがアイコン画像です。
 なぜかプレビューでは開けず、プラグインに同梱してもIDE上で認識しなかったことから、Mac(Cocoa API?)では扱えない形式のようでした。

 ググってみると、Windowsのフォトビューアー使え、とあったので従ったところ、確かに表示されました。
 このファイルはマルチページTIFFで、二つの画像が確認されました。(PluginPackaging.rtfに解説がありますが、高解像度用とパックになったもののようです。)
 また、Mac版Photoshop Elements 11では、最初の画像だけを表示することができました。(独自実装?)

 なぜ開けないのか、気になって少し調べてみましたが、どうも仕様上の齟齬があって、それが原因のようでした。
 TIFFの仕様では、BitsPerSample(0x0102)のCountは、SamplesPerPixel(0x0115)の値と一致させるのが一般的なようなのですが、当該TIFFではSamplesPerPixelの値は4(注1)になっているのですが、BitsPerSampleのCountは3となっていて、オフセット先でも3要素分(08 00 08 00 08 00)しか確保されていません。
注1:SamplesPerPixelが3を超える場合は、ExtraSamples(0x0152)で追加チャンネルの意味を示せ、とのことなので見ると、1 = Associated alpha data (with pre-multiplied color)が指定されていることから、アルファチャンネルであることが分かる。
 当該TIFFを編集して、BitsPerSampleのCount=4、オフセット先も4要素(08 00 08 00 08 00 08 00)としてみたところ、プレビューで開けるようになりました。


 参考サイト(1):TIFF tags
 参考サイト(2):TIFFのフォーマット(その1) | JProgramer

 dylibをビルドする

 Xcodeを用いてdylibを作成します。
  1. 前回プロジェクトをコピーして使用。(必要ならプロジェクト/ファイル名を変更して下さい。その場合は、以下の名称を適宜読み替えて下さい。)
  2. PluginModule1.cppの中身を全文削除後に、こちらのコードをペースト
    (注:NS系はコメントアウトしてあるので、必要に応じて入れ替えて下さい。)
  3. まずCleanを実行(少なくとも初回は)
  4. 次にBuildを実行
 DerivedData/PluginModule1/Build/Products/Debug に libPluginModule1.dylib ができていればOK。
この後、アイコン画像が用意できるのであれば、アイコンもセットしておきます。(詳細はPluginPackaging.rtf参照)

 プラグインをテストする

 動くかどうか、テストします。
  1. Xojoで新規プロジェクトを作成
  2. ライブラリの最後にプラグイン(名前はBox)が追加されるので、標準のコントロール同様、Window1上にドラッグする。(インスタンス名はデフォルトのBox1とする。)
  3. Window1に、PushButton(Name:PushButton1)を追加
  4. 以下をBox1にペースト(できなければ、Sub - Endの間をActionイベントに記述)
    Sub Action(Red As Integer) Handles Action
      MsgBox str(Red)
    End Sub
    
  5. 以下をPushButton1にペースト(できなければ、Sub - Endの間をActionイベントに記述)
    Sub Action() Handles Action
      Box1.MakeRed()
      Box1.Refresh  // Need for OSX
    End Sub
    
  6. Box1を選択し、インスペクタペインで、BackColorが設定できて、Boxの色が指定色に変わればOK。
  7. 実行する。
  8. 指定した位置に、指定した色で表示されればOK。
  9. PushuButton1を押すと、色が赤に変わり、メッセージが表示されればOK。

注)レイアウトエリア(中央ペイン)左下の数値は、NSLog代わりのデバッグ文。


 おわりに

 とりあえず動いてはいますが、Mach-Oの頃からするとDeprecatedがあまりにも多く、かといって、新しいサンプルはWindowsに特化していたりと、情報が少なすぎるのが難点です。
 およそのことはDeclareで出来るので、あまり深入りしないほうが賢明なのかもしれません。

 積み残しとなった謎に光が差すようでしたら、今後も改訂していきたいとは思っていますが、果たして…。


 お世話になったサイト

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

 参考サイト(1):TIFF tags
 参考サイト(2):TIFFのフォーマット(その1) | JProgramer


 更新履歴

 2019.11.27 新規作成


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