カテゴリ: pixy

本来、境界ぼかしフィルターを使う為に作ったんだけど、肝心のそれが動かないので使い道無い。が、一応置いておく。VC++ 5.0ではコンパイルできない上、MFC70.DLLが無いのでそもそも家のパソコンでは動かないのであまりやる気なし。設定とか覚えないし。

このエントリーをはてなブックマークに追加 mixiチェック

結論から言うと、3/28の方法で正しかった模様。トレースを入れたデバッグプラグインを作って試したら想定通りの動作をするから、上手く動かないのはプラグイン側の問題と思われる。
PictBearから呼び出すと動かないと言うし。問題のフィルターはBorland C++ Compiler 5.5で作られてるらしい事が関係あるのかも知れない。
ていうか寧ろ本家Pixiaでは何故動いているんだろう?考え付く対策としては、きわ氏のフィルターにだけは見分けて何か特別配慮付きの別関数を作りそこへのポインタをパラメータとして渡しているとか?そんな事は可能なのか?DLLを作ったコンパイラの種別をどうにかして判別してるのかも。

このエントリーをはてなブックマークに追加 mixiチェック

やっぱり上手く行かない。そもそもコールバックでピクセルデータアクセス関数が呼ばれてる気配が無く、どこか謎のあらぬ場所を呼んでるような気がする。何故その時点で落ちないのかは謎。
多分これは、判ってる人が見れば1秒で解決する類の問題だと思うので誰か知ってたら教えてください。と、一応貼っておく。

使ってる所

hLib = LoadLibrary("aaa.dll");

pFilterProc = (BOOL (*)(HWND hWnd, LAYERINFO *li,SETLINEFUNC *sf, GETLINEFUNC *gf, LPSTR szDir,LPBYTE lpExt))GetProcAddress(hLib, _T("FilterProc"));
if (pFilterProc != NULL){
TRACE("pFilterProc取得成功");
HWND hWnd = NULL;
LAYERINFO li;
li.cx = g_img->height ; // サイズ
li.cy = g_img->width ;
li.bit=24; // 色数(bit数) 24固定
SETLINEFUNC sf; // データ書き込み用関数ポインタ
sf.SetLine = &pixia_SetLine;
sf.aSetLine= &pixia_aSetLine;
sf.SetPalette = &pixia_SetPalette;
GETLINEFUNC gf; // データ読み込み用関数ポインタ
gf.GetLine = &pixia_GetLine;
gf.aGetLine= &pixia_aGetLine;
gf.GetPalette = &pixia_GetPalette;
LPSTR szDir = ".\\";
LPBYTE lpExt = NULL;
BOOL ret = (*pFilterProc)(hWnd, &li,&sf, &gf, szDir,lpExt);
TRACE("処理成功=%s",infilename);
}else{
TRACE("pFilterProc取得失敗");
return false;
}
TRACE("exec done\n"); <---- これを出力した後、落ちる。
return true;

DLL側から呼ばれるコールバック関数(全部グローバル)

// PIXIA DLLから呼ばれるコールバック
// メインイメージの取得
BOOL pixia_GetLine( int y, int x0, int x1, LPBYTE buff, int n );
// アルファチャネルの取得 nレイヤのn2アルファチャネルへアクセスする
BOOL pixia_aGetLine( int y, int x0, int x1, LPBYTE buff, int n, int n2 );
// レイヤがフルカラーでない場合のパレット取得
BOOL pixia_GetPalette( BYTE *palette, int n );
// メインイメージへの書き込み
BOOL pixia_SetLine( int y, int x0, int x1, LPBYTE buff, int n );
// アルファチャネルへの書き込み nレイヤのn2アルファチャネルへアクセスする
BOOL pixia_aSetLine( int y, int x0, int x1, LPBYTE buff, int n, int n2 );
// レイヤがフルカラーでない場合のパレット設定
BOOL pixia_SetPalette( BYTE *palette, int n );

このエントリーをはてなブックマークに追加 mixiチェック

を自作アプリから呼び出して使おうしているんだけど、上手く行かない。CALLする処理を入れるとそことは無関係の何の変哲も無い関数から戻った所で呼び出し元にも返らずAPエラーで落ちる。多分スタックが壊れてる模様。TRY-CATCHも役に立たん。まったくC++は難しい。やっぱJavaは良いね。try-catchが確実だしエクセプション出すとソースの位置まで出してくれるし。何と言ってもスタックもヒープも壊れない(らしい)。文法もシンプル。
通常、PhotoshopやPictBearは、プラグインへは処理対象のイメージデータへのポインタを渡すんだけど、Pixiaプラグインは一風変わっててイメージデータへのアクセス関数へのポインタをDLLに渡してる。
これは何が良いかというと、プラグインプログラマがミスしてうっかり訳の判らん座標(100*100ピクセルの画像の(200*200)の位置とか)のデータを取ろうとしても、Pixia本体が事前チェックして弾くなり適当なデータ渡すなりして不正領域アクセスでOSに殺される事を防げる訳。
んが、凝ってる分だけちょっと難しいのだ。何故かスタックが壊れる。私には無理なのか?
きわ氏のフィルタが使いたいんだが、これはPixia以外では動かないと評判*1だしなー。
…ぬぅ。リンク弾かれまくり。Pixia界隈は妙にガードが固いCGIが多い印象。

*1:ただ、氏のフィルタは事前に「設定」しないと駄目なのでその辺も絡んでるのかも

このエントリーをはてなブックマークに追加 mixiチェック

↑このページのトップヘ