Wacom WebPlugin Feel™ Multi-Touch API
更新情報
2011年9月24日 | V1.0 | 初版公開 | RCC |
2012年5月9日 | V1.1 | Modesプロパティに関する記述を追加 | RCC |
INDEX
- 1 概要
- 1.1 サポートされているバージョン
- 1.2 WebPluginの使用法
- 1.3 サンプルデモと関連リソース
- 2 WebPlugin Feel™ Multi-Touch APIプロパティ
- 2.1 TouchRawFingerData
- 2.2 TouchDeviceCapabilities
- 2.3 TouchDeviceIDList
- 2.4 Open
- 2.5 Close
- 2.6 Modes
- 3 WebPlugin Feel™ Multi-Touch APIイベント
- 3.1 TouchDataEvent
- 3.2 TouchDeviceAttachEvent
- 3.3 TouchDeviceDetachEvent
- 4 参照
詳細
1 概要
このドキュメントでは、Wacom WebPluginコンポーネントのWacom Feel™ Multi-Touchサポート用APIについて説明します。WebPluginモジュールは、Wacom Feel™ Multi-Touch API [Loftus2011]のサブセットです。Loftus2011では、サポートされているWacom Feel™ Multi-Touch対応タブレットからフィンガータッチデータにアクセスできます。すべてのWacomブランドのタブレットが、Feel™ Multi-Touch機能をサポートしているわけではありません。Feel™ Multi-Touch API対応のタブレットは、WebPlugin APIによって認識されます。開発者は、そのタブレットのマルチタッチプロパティをクエリし、フィンガータッチデータを取得できます。 Feel™ Multi-Touch APIは、同じプラグインでサポートされているWintabペンインタフェースAPIと合わせて使用できます。タブレットが同時にペンデータとタッチデータをサポートしている場合、ペンが近い場合でもWebアプリケーションはタッチデータを取得し続けます。タブレットがこれをサポートしていない場合、ペンはタッチよりも優先されます。つまり、ペンが近い場合でもタッチデータは送信されません。WebPlugin Feel™ Multi-Touch APIは、ペンの近接性について処理または通知を行いません。アプリケーションがペンストロークによって解釈されたタッチストロークに対して特殊な処理を行う必要がある場合、アプリケーションは両方のAPIを監視する必要があります。
1.1 サポートされているバージョン
WebPlugin Feel™ Multi-Touch APIは、次のコンポーネントでサポートされています。
- WebPlugin:バージョン2.0以降
- タブレットドライバ:バージョン5.2.5以降
- WebPluginは、次のブラウザとオペレーティングシステムでサポートされています(記載バージョンは最低限です)。
Windows 7、Vista、XP | Mac OSX 10.5.8、10.6 | |
Firefox v4 | はい | はい |
Safari v5 | はい | はい |
Chrome v10 | はい | n/a |
Internet Explorer v8 | はい | n/a |
1.2 WebPluginの使用法
簡単に言うと、WebPluginは、Feel™ Multi-Touch APIプロパティとイベントにアクセスするためにjavascriptプログラムで使用されます。その上で、javascriptプログラムを含むHTMLページを、サポートされているブラウザコンポーネント(Canvasなど)、他のプラグイン(Adobe Flashなど)、フレームワーク(Silverlightなど)で使用できるようになります。WebPluginを使用すると、Feel™ Multi-Touch APIの初期化の大半は自動的に実行されるので、開発者はアプリケーションに集中できます。WebPluginの詳細な使用方法については、[Cohn2011]を参照してください。 このドキュメントでは、さまざまなFeel™ Multi-Touch APIのプロパティ、データ、およびイベント処理を示すjavascriptコードのスニペットを記載しています。
1.3 サンプルデモと関連リソース
WebPlugin Feel™ Multi-Touch APIサンプルコードと関連ドキュメントについては、http://www.wacomeng.com/ を参照してください。
2 WebPlugin Feel™ Multi-Touch APIプロパティ
2.1 TouchRawFingerData
最初に見つかったタッチデバイスからユーザーに最新の未処理フィンガータッチデータを返します。
2.1.1 パラメータ:
TouchDeviceCapabilitiesもしくは、TouchDeviceIDListから取得したdeviceIDを指定します。
有効なID以外のdeviceIDを指定すると、FB::VariantMapのStatusフラグはエラーを示します。
2.1.2 戻り値:
FB::VariantMapは下記のメンバーで構成されています。
NumFingers Int // このデータパケットのフィンガー数 DeviceID Int // データの送信元デバイス Status Int // データが有効かどうかを示す(下記を参照) FingerList FB::VariantList // フィンガーデータのリスト FingerList[0] FB::VariantMap // Finger1のデータ FingerID Int // データパケットで指定 PosX float // APIから渡されたX座標(下記を参照) PosY float // APIから渡されたY座標(下記を参照) Width float // フィンガーコンタクトエリアの論理的な幅 Height float // フィンガーコンタクトエリアの論理的な高さ Orientation float // フィンガーコンタクトの垂直線からの楕円の角度 Confidence Int // ドライバが有効なタッチと判断した場合はtrue Sensitivity Short // コンタクトの強さ FingerState Int // 現在の指の最後の動き(下記を参照) FingerList[1] FB::VariantMap // Finger2のデータ FingerID Int PosX float PosY float Width float Height float Orientation float Confidence Int Sensitivity Short FingerState Int ...
返されたFB::VariantMapのサイズは、最後のタッチデータパケットの指の数によって決まります。動的なFB::VariantMapがサポートされていない場合、プラグインは10本の指用にマップを事前に割り当て、最新のタッチAPIデータパケットからデータの指の数を指定します。
NumFingers – 最新のデータパケットで検出された指の数。WebPluginは、指ごとのタッチデータを指定します。
DeviceID – タッチデータの入力元タブレットの固有のID
Status – 返されたFB::Variantに有効なデータが含まれているかどうかを示します。データが有効な場合、Statusはゼロになります。データが無効な場合、Statusは-1になります。
PosXおよびPosY -
不透明タブレットに対する0~1.0の論理単位です。
統合タブレットに対する仮想デスクトップ範囲のピクセル画面座標です。**
WidthおよびHeight – フィンガーコンタクトの論理的な幅と高さを表します。*
Sensitivity – コンタクトの強さ。これは筆圧ではありません。これは、コンタクトポイントの強さを示すデバイス/ユーザー固有の指標です。同じフレーム/ジェスチャー内の他の指に関連する場合にのみ有効です。*
Orientation – フィンガーコンタクトの垂直線からの楕円の角度*
FingerState = 0(不明)、1(Down = 指が下りた)、2(Hold = 指が触れたまま)、3(Up = 指が上がった)
Move(移動)状態はないので注意してください。Hold状態は、指の位置が変わると移動として解釈されることがあります。
2.1.3 サンプルJavascriptの使用:
var deviceID = plugin.touchAPI.TouchDeviceIDList[0]; var fingerdata = plugin.touchAPI.TouchRawFingerData(deviceID); var numFingers = fingerdata.NumFingers; var status = fingerdata.Status; if ( status == 0 ) { var finger1= FingerData.FingerList[0]; var finger1ID = finger1.FingerID; if (finger1.Confidence == 1 && finger1.FingerState != 0) { var finger1PosX = finger1.PosX; var finger1PosY = finger1.PosY; ... } var finger2 = FingerData.FingerList[1]; etc... }
2.1.4 設計上の注:
FB::VariantMapとFB::VariantListは、サポートされているFirebreathバリアント型です。 プラグインの初期化に際し、プラグインは次の操作を実行します。
- タッチAPIとWacomMTInitialize()の接続を初期化します
- アタッチされているタッチデバイスをWacomMTRegisterAttachCallback()で登録します。その際、すべてのプラグインタッチAPI構造を初期化します。
- デタッチされているタッチデバイスをWacomMTRegisterDetachCallback()で登録します。その際、すべてのプラグインタッチAPI構造を削除/消去します。
- WebPluginクライアントは、データをポールするか、TouchDataEventを使用します(下記を参照)。
プラグインの破棄に際し、プラグインは次の操作を実行します。
- WacomMTQuit()を呼び出し、タッチドライバサービスとの接続を閉じ、すべてのプラグインタッチAPI構造を削除/消去します。
プラグインの破棄に際し、プラグインは次の操作を実行します。
- WacomMTQuit()を呼び出し、タッチドライバサービスとの接続を閉じ、すべてのプラグインタッチAPI構造を削除/消去します。
2.2 TouchDeviceCapabilities
指定したタッチデバイスの機能を返します。
2.2.1 パラメータ:
TouchDeviceIDListから取得したdeviceIDを指定してください。
2.2.2 戻り値:
FB::VariantMapは下記のメンバーで構成されています。
Version Int // データ構造バージョン DeviceID Int // このデバイスのID DeviceType Int // WacomMTDeviceType値 MaxFingers Int // デバイスでサポートされている指の最大数 ReportedSizeX Int // X方向のタッチポイントの数 ReportedSizeY Int // Y方向のタッチポイントの数 PhysicalSizeX float // デバイスのアクティブタッチ面の幅(mm) PhysicalSizeY float // デバイスのアクティブタッチ面の高さ(mm) LogicalOriginX float // デバイスの最小X。デバイスが表示よりも大きい場合はマイナスになる可能性があります LogicalOriginY float // デバイスの最小Y。デバイスが表示よりも大きい場合はマイナスになる可能性があります LogicalWidth float // デバイスの論理的な幅。MaxX = LogicalOriginX + LogicalWidth LogicalHeight float // デバイスの論理的な高さ。MaxY = LogicalOriginY + LogicalHeight
呼び出しに失敗した場合、返されたFB::VariantMapはVersion == -1になります。
2.2.3 サンプルJavascriptの使用:
var deviceID = plugin.touchAPI.TOuchDeviceIDList[0]; var touchDeviceCaps = plugin.TouchAPI.TouchDeviceCapabilities(deviceID); var maxNumFingers = touchDeviceCaps.MaxFingers; var maxXTouchPoints = touchDeviceCaps.ReportedSizeX; var maxYTouchPoints = touchDeviceCaps.ReportedSizeY; etc...
2.2.4 設計上の注:
上記の通り、このAPIの初期リリースは正当なdeviceIDとして-1のみを認識します。そのため、返された機能は、deviceID = -1が使用されているときに最初に見つかったタッチデバイス用です。この構造で返されたDeviceID値は、deviceIDを必要とする別のタッチAPIプロパティ(TouchRawFingerData、Open、Close)で使用できます。
2.3 TouchDeviceIDList
アタッチされたタッチデバイスIDのリストを返します。
2.3.1 パラメータ:
なし
2.3.2 戻り値:
アタッチされたタッチデバイスIDのFB::VariantList。タッチデバイスIDがアタッチされていない場合、配列のサイズはゼロです。
2.3.3 サンプルJavascriptの使用:
_touchDeviceIDList = plugin.touchAPI.TouchDeviceIDList;
2.3.4 設計上の注:
返されたリストは、アクティブなタッチデバイスのリストから構築されます。リストはプラグインで保持されます。その際、プラグインがタッチAPIからAttachメッセージを受信したときに新しくアタッチされたデバイスを追加するか、プラグインがタッチAPIからDetachメッセージを受信したときにタッチデバイスをリストから削除します。
2.4 Open
指定したデバイスにアタッチし、そのデバイスのデータがクライアントに送信されるようにクライアントのタッチAPIを初期化するメソッドです。クライアントは、タッチデータがシステムに渡されないように接続することも、タッチデータがクライアントに渡され、システムにデータが送信されるように接続することもできます。
2.4.1 パラメータ:
deviceID Int // 指定したdeviceIDのタッチデバイスを開きます deviceIDはTouchDeviceIDListもしくは、TouchDeviceCapabilitiesから渡されます passThru Int // 1:データがシステムに渡されます。0:データはシステムに渡されません
2.4.2 戻り値:
成功の場合は0、エラーの場合は0以外
2.4.3 サンプルJavascriptの使用:
var caps = plugin.TouchAPI.TouchDeviceCapabilities(-1);// 最初のタッチデバイスの機能を取得します
次のいずれかが機能します。
var status = plugin.touchAPI.Open(caps.DeviceID, 0); // 指定デバイスを開きます var status = plugin.touchAPI.Open(plugin.touchAPI.TouchDeviceIDList[0], 0);
2.4.4 設計上の注:
このメソッドが呼び出されると、プラグインは次の操作を実行します。
- 次の引数を指定したWacomMTRegisterFingerReadCallback()で、タッチデータを登録します。
mode = passThru = 0 -> ProcessingModeAPIOnly; passThru = 1 -> ProcessModeOS
ProcessingModeAPIOnly = クライアントのみがタッチデータを取得します
ProcessModeOS = クライアントとシステムの両方がタッチデータを取得します
fingerCallback = WebPlugin APIで使用するためにタッチデータをキャッシュするプラグインハンドラ
userData = NULL(この使用についてはまだ考えていません)
- 現在のところ、あらゆるデータをユーザーに渡す予定です(-1が使用されているためです)が、将来的には、指定したdeviceIDに合致するデータのみを転送します
2.5 Close
このメソッドは、指定したデバイスからクライアントをデタッチし、そのデバイスからもタッチデバイスからも、データがこれ以上クライアントに送信されないようにします。
2.5.1 パラメータ:
deviceID Int // -1 -> すべてのタッチデバイスを閉じます。または、deviceIDで指定したタッチデバイスを閉じます TouchDeviceCapabilitiesから渡されます
2.5.2 戻り値:
成功の場合は0、エラーの場合は0以外
2.5.3 サンプルJavascriptの使用:
次のいずれかが機能します。
var status = plugin.touchAPI.Close (-1); // すべてのデバイスを閉じます var status = plugin.touchAPI.Close (caps.DeviceID); // 指定したデバイスを閉じます
2.5.4 設計上の注:
- WacomMTRegisterFingerReadCallback()でfingerCallback引数をNULLに設定し、タッチデータの登録を解除します。
2.6 Modes
このメソッドでは、さまざまな条件に対してプラグインを設定できます。現時点でサポートされている条件は次のとおりです。
- CHILD_BIT:プラグインをブラウザの子プロセスまたはブラウザのメインスレッドで実行するようにAPIに指示します。この設定を使用すると、子プロセスでプラグインを開始するか、メインスレッドでプラグインを開始するブラウザでプラグインが実行されるようAPIに設定を指示できます。現在、ほとんどのブラウザ(Internet Explorer、Firefox、Chromeなど)は、別のプロセスでプラグインを開始します。これにより、失敗したプラグインでブラウザ全体がクラッシュすることを防ぐことができます。プラグインAPIは、デフォルトでは子プロセスで実行されることを想定していますが、その動作をオフにし、WebPluginをメインスレッドで実行するように切り替えることができます。
- OBSERVER_BIT:タッチコンシューマまたはタッチオブザーバとして実行されるようにプラグインを設定します。この設定を使用すると、オブザーバモードまたはコンシューマモードで実行されるようにプラグインを設定できます。オブザーバモードで、プラグインはタッチデータを処理し、タッチデータをシステムに渡します。渡されたタッチデータは、別のアプリケーションやシステムでジェスチャーやカーソル移動を実行するために使用できます。コンシューマモードでは、プラグインはタッチデータを処理しますが、システムにはデータを渡しません。
2.6.1 パラメータ:
mode Int // 条件のビット単位のOR: // CHILD_BIT: 0x00000001 -> プラグインが子ブラウザプロセスにあることを前提としています // OBSERVER_BIT:0x00000010 -> プラグインはデータをシステムに渡します(オブザーバ) // デフォルトでは、プラグインはコンシューマとして子ブラウザプロセスで実行されます。
2.6.2 戻り値:
成功の場合は0、エラーの場合は0以外
2.6.3 サンプルJavascriptの使用:
// プラグインがブラウザのメインスレッドで実行され、コンシューマになるようにAPIに指示します var status = plugin.touchAPI.Modes (0); var status = plugin.touchAPI.Modes (1); // プラグインが子プロセスで実行され、コンシューマになるようにAPIに指示します var status = plugin.touchAPI.Modes (3); // プラグインが子プロセスで実行され、オブザーバになるようにAPIに指示します
2.6.4 設計上の注:
大半のブラウザでは、メインブラウザスレッドでプラグインを実行するためにモードを変更する必要はありません(現時点で認識している限りではOperaが唯一の例外です)。
アプリケーションのブラウザウィンドウにフォーカスがあるときにタッチデータを処理するために他のアプリケーションまたはシステムが不要な場合は、オブザーバビットを設定します。
3 WebPlugin Feel™ Multi-Touch APIイベント
3.1 TouchDataEvent
タッチデータを受信したときに生成されます。クライアントのハンドラは、このイベントを受信すると、データをクエリできます(下記を参照)。
3.1.1 プラグインイベント名
3.1.2 サンプルJavascriptの使用
イベントの登録:
if (window.addEventListener) { obj.addEventListener("TouchDataEvent", touchDataHandler, false); } else { obj.attachEvent("onTouchDataEvent", touchDataHandler); }
イベントの関数ハンドラ:
function touchDataHandler() { // TouchRawFingerDataを使用してキャッシュデータをクエリします // クライアント表示エリアでフィンガーデータを処理/描画します }
3.1.3 設計上の注
プラグインは、下記を使用してこのイベントを登録します。
プラグインは、受信側FingerReadイベントのタッチAPIから通知を受信すると、 下記を使用してクライアントに通知を発行します。
3.2 TouchDeviceAttachEvent
3.2.1 プラグインイベント名
3.2.2 サンプルJavascriptの使用
イベントの登録:
if (window.addEventListener) { obj.addEventListener("TouchDeviceAttachEvent", touchDeviceAttachHandler, false); } else { obj.attachEvent("onTouchDeviceAttachEvent ", touchDeviceAttachHandler); }
イベントの関数ハンドラ:
function touchDeviceAttachHandler () { // タッチデバイスの現在のリストを取得し、最初のデバイスを開きます。 _touchDeviceIDList = plugin.touchAPI.TouchDeviceIDList; _touchDeviceID = _touchDeviceIDList[0]; plugin.touchAPI.Open(_touchDeviceID, 0); }
3.2.3 設計上の注
プラグインは、下記を使用してこのイベントを登録します。
プラグインは、AttachイベントのタッチAPIから通知を受信すると、 下記を使用してクライアントに通知を発行します。
3.3 TouchDeviceDetachEvent
3.3.1 プラグインイベント名
3.3.2 サンプルJavascriptの使用
イベントの登録:
if (window.addEventListener) { obj.addEventListener("TouchDeviceDetachEvent", touchDeviceDetachHandler, false); } else { obj.attachEvent("onTouchDeviceDetachEvent", touchDeviceDetachHandler); }
イベントの関数ハンドラ:
function touchDeviceDetachHandler () { // 現在のタッチデバイスへの接続を閉じます plugin.touchAPI.Close(_touchDeviceID); }
3.3.3 設計上の注
プラグインは、下記を使用してこのイベントを登録します。
プラグインは、DetachイベントのタッチAPIから通知を受信すると、 下記を使用してクライアントに通知を発行します。