エフェクトプラグイン仕様 *エクスポート関数 extern "C" __declspec(dllexport) BOOL __cdecl load(HGLOBAL h, long len); extern "C" __declspec(dllexport) BOOL __cdecl unload(void); extern "C" __declspec(dllexport) HGLOBAL __cdecl request(HGLOBAL h, long *len); extern "C" __declspec(dllexport) BOOL __cdecl process( int handle, int time, void * dst, int dstnextofs, const void * src , int srcnextofs, const void * src2 ); load  起動時にDllのパスが入って呼ばれます unload  終了時に呼ばれます request  各種呼び出しです process 後述する、OnProcessの直接呼出し形式です   この関数がエクスポートされている場合、OnProcessリクエストは呼び出されず、この関数が呼ばれます   速度が気になる場合は、こちらを利用してください   なお、二つ目の合成元画像が必要ない場合、src2はNULLになります   正常終了した場合は、TRUEを返してください。   何かしらのエラーが発生した場合、FALSEを返すと以降OnFinalizeまで呼び出されなくなります。 *リクエスト  リクエストはすべてNOTIFY形式で行います    以下のような感じになります  NOTIFY EFFECT/1.0[CRLF]  ID: OnInitialize[CRLF]  Sender: CROW[CRLF] Charset: Shift_JIS[CRLF]  Reference0: 0[CRLF]  [CRLF]  ※[CRLF]=CR+LF  空行で終了。Zero-Terminateとは限らないので注意してください。 Charsetは初回のOnGetList時にはShift_JISを使用しますが、  レスポンスにCharsetがあった場合、それ以降のリクエストはそのCharsetを使用します。  呼び出されるリクエストは以下の4つです ID: OnGetList[EXECUTE] load直後に呼ばれます。   公開するエフェクトのリストを返す必要があります   エフェクトは名前のほか、IDが必要です   呼び出すときは、名前とIDどちらも使用可能です   このIDはPLUGIN/2.0のプラグインIDと同じ仕様です Ref0:エフェクト名[\1]エフェクトID Ref1:エフェクト名[\1]エフェクトID ・ ・ ・ 以下、PLUGIN/2.0の仕様 >■プラグインID > プラグインごとに一意につけられるIDです。 > ぶつかる可能性が「極端に低い」63バイトまでの1バイト文字列なら何でもかまいません。 > 通常、GUID/UUIDと呼ばれるものを使います。 > > ※それなりに開発環境をそろえておられる方なら、guidgen.exeのRegistry Formatが生成に使えると思います。 > ※ない人はこちら > http://ssp.shillest.net/docs/guid.zip > ※処理系側は最低でも63バイトまで受け付ける必要がありますが、そもそも制限を設けないことを推奨します。 > > descript.txtのIDエントリに、次のように書いてください。 > 例:id,3491996A-B383-4890-B863-5CE258678093 > > ゴースト側からはプラグイン名以外にこのIDを使ってプラグインを呼び出すことができます。 > 意味的には、このIDが同じであるということは、たとえ名前が変っても互換性がある、という事を示すことになります。  ID: OnInitialize[EXECUTE]   エフェクトを起動する直前に呼ばれます。   エフェクト起動のたびに呼ばれるため、何度も呼ばれることがあります。 レスポンスがオブジェクトハンドルが0以外の場合は、さらに同時に呼ばれることもあります。   また、かならずOnFinalizeと対になります 帰り値として、出力に使用したいサイズ、長さとオブジェクトハンドルを指定します   長さはms単位で指定し、Process時には、0からこの指定した長さまでの値が来ます   オブジェクトハンドルは、複数同時に起動する場合の識別用に、エフェクトDLLが生成して渡す値です   processやexitのRef0に渡されます。   本体側では、中身の数値は一切見ません。   10進で32ビットの数値であれば、どんな値でも指定可能です   この数値が0の場合は、複数起動が不可能と判定されます。 Ref0: エフェクトID Ref1: 元データ枚数(1か2)   Ref2: 横ドットサイズ Ref3: 縦ドットサイズ Ref4以降はユーザー指定 帰り値   Ref0: 要求横サイズ   Ref1: 要求縦サイズ Ref2: 想定長さ(ms) Ref3: オブジェクトハンドル  ID:OnProcess[EXECUTE]   OnInitializeとOnFinalize間に複数回呼ばれる実際の画像加工リクエストです このときに使用される画像データは、32ビットカラー固定です また、元画像は呼び出し側が同サイズにそろえます   そのため、二つ目の合成元画像のオフセットは、一つ目と共通です   Ref0: オブジェクトハンドル Ref1: 時間(ms)   Ref2: 書き出し左上アドレス(16進になります。頭に0xや$等はつきません) Ref3: 次のラインへのオフセット(バイト単位で、たいてい負の値になります)   Ref4: 元データ左上アドレス(16進になります。頭に0xや$等はつきません)   Ref5: 次のラインへのオフセット(バイト単位で、たいてい負の値になります) Ref6: [元データ左上アドレス]  帰り値なし  ID:OnFinalize[EXECUTE]   エフェクト処理が完了したときに呼ばれます   Ref0: オブジェクトハンドル  帰り値なし *レスポンス レスポンスの例は以下のとおりです。 CRLF区切りはリクエストと同様ですので[CRLF]は省略しています。  正常終了の場合 Effect/1.0 200 OK Charset: Shift_JIS Reference0: Sample1[\1]8BAC50DC-5417-4187-AF7A-A6EC9F983891  認識できないリクエストの場合 Effect/1.0 400 Bad Request Charset: Shift_JIS  内部で何かしらのエラーが発生した場合 Effect/1.0 500 Internal Error Charset: Shift_JIS  Charsetは省略可能です。省略時はShift_JISとなります。  Charsetが指定されると、次回以降ベースウェアからのリクエストはそのCharsetが使用されます。  なお、現在CROWではShift_JISとUTF-8のみが使用できます。  Process時にエラーが発生した場合OnFinalizeまでProcessイベントは発生しません。  Initialize時にエラーが発生した場合、OnFinalizeもProcessイベントも発生しません。 *呼び出し \![effect,プラグイン名,(速度(100で元スピード)),(以降ユーザーパラメータ)] \![effect2,プラグイン名,追加サーフィス番号,(速度(100で元スピード)),(以降ユーザーパラメータ)] 速度は負の値を指定すると、逆再生になります *フィルタ フィルタは、一度指定するとサーフィス画像が書き換わるたびにエフェクトプラグインが呼ばれます そのときは、OnInitializeの後、Processが一度だけ呼ばれます。 以降、元サーフィスのサイズが変化しない限りは、時間は同一のままprocessが呼ばれます。 元サーフィスが変化すると、OnFinalize,OnInit,Processと続けてよばれます フィルタが解除されるときは、OnFinalizeが呼ばれます パラメータの起動時間は、0〜100の数値で、エフェクトプラグインのどの時間の部分を呼び出すかを決定します。 例えば、ちょうど半分だけエフェクトがかかった状態を使う場合は、50を指定します。 省略時は100になります また、フィルタは各スコープごとにひとつだけ指定可能で、二つ目を指定すると最初に指定したものが解除されます 設定 \![filter,プラグイン名,(起動時間),(以降ユーザーパラメータ)] 解除 \![filter]