私が持っているコンパイラはVC++5.0。
VC++5.0と各SDKの相性などは以下。結論から言うと、5.5がベスト。基本的に、新しい方がサンプルが読みやすく改良されているので、なるべく新しいものの方が良い。
| SDKのバージョン | コメント |
| 4.0 | プロジェクトがVC++4.0用。そのままコンパイルするには色々問題アリ。SDK4.0をVC++5.0で使う場合、色々コツが必要。 |
| 5.0 | プロジェクトがVC++5.0用。悪くないが、5.5の方がサンプルが判り易い。 |
| 5.5 | プロジェクトがVC++5.0用。この代からサンプルのディレクトリ構成が変わる。 |
| 6.0 | プロジェクトがVC++6.0用。VC++5.0でビルドを試みるとリソースの.rファイルの処理でVC++5.0が固まった。MFC使ったサンプルが付いてたような気がする。 |
サンプルはソース自体は「PoorMansTypeTool」が一番判り易い…んだけど、何故かビルドしたフィルタを実際にハイパーキッドで使うとアプリケーションエラーになるので、やっぱりDissolve-sans-AppleScriptを使う(こちらは大丈夫)。
これをハイパーキッドにインストールすると

そのままコンパイルすると相変わらず
..\..\..\Common\Includes\PIUtilities.h(58) : fatal error C1083: インクルード ファイルがオープンできません。'Types.h': No such file or directoryが出る。例によって
#include <Types.h> // Standard types. ↓ #include <sys/Types.h> // Standard types.と修正。ビルドが成功する。
フィルタのDISSOLVESANS.8bfは
〜\Adobe Photoshop 5.5 SDK\SampleCode\Output\Win\Release\
に出来る。
とりあえず、Dissolve-sans-AppleScriptを同じ階層のディレクトリにコピーする。
Dissolve-sans-AppleScript2と名前を変える(安直)。
nekora.exp : warning LNK4070: .EXP 内の /OUT:DISSOLVESANS.8bf ディレクティブの指定が出力ファイル名 "..\..\..\Output\Win\Release\nekora.8bf" と異なっています; ディレクティブは無視されますというエラーが出るが大丈夫…だと思う…今の所。
///////////////////////////////////////////////////////////////////////////// // 英語 (アメリカ) resources #if !defined(AFX_RESOURCE_DLL) || defined(AFX_TARG_ENU) #ifdef _WIN32 LANGUAGE LANG_ENGLISH, SUBLANG_ENGLISH_US #pragma code_page(1252) #endif //_WIN32を、
///////////////////////////////////////////////////////////////////////////// // 日本語 resources #if !defined(AFX_RESOURCE_DLL) || defined(AFX_TARG_JPN) #ifdef _WIN32 LANGUAGE LANG_JAPANESE, SUBLANG_DEFAULT #pragma code_page(932) #endif //_WIN32に書きかえ、日本語リソースだということにする。 次に、ダイアログのフォントを日本語可のもの変えるべく、その下の方の
FONT 8, "MS Sans Serif"を
FONT 8, "MS Pゴシック"とする。ここでダイアログやボタン等の文字もいじれるけれど、その辺はVisual Studioでやった方が安全でしょう。
キャプションなどを日本語にしてみた。
残った謎:メニューのnoise->Dissolve-sans-AppleScriptの変え方がわからん…。
フォトショップ本体から、複数回に分けてフィルタDLL内の関数を呼び出している。大体、次のような感じ「らしい」。
| タイミング | 呼び出される関数 | メモ |
| メニューからこのフィルタを選択した時 | DoParameters() | 設定ダイアログを出す処理 |
| “前回使ったフィルタ”(Ctrl+f)を選択した時 | DoPrepare() | メモリーとか用意するらしい |
| 上記の後 | DoStart() | スタート |
| 上記の後 | DoContinue() | 実行。よくわからない |
| 最後 | DoFinish() | 終了処理。パラメータを返す |
私がやるべき事としては、DoParameters()で設定ダイアログを出して自分のフィルタ固有のパラメータをユーザに入力させる。で、それを自前でAllocしたメモリに入れ、FileRecordのparameterにそこへのポインタをセットして関数終了。
その後、DoStart()で、先のFileRecord構造体からパラメータ他を取り出し、inDataからピクセルデータを読み、outDataに書き出す、って手順でいいのかな。
改造する関数はずばりDoFilterRect().ここで画像を書き換えている。
unsigned8 *srcPtr = (unsigned8 *) gStuff->inData; // 入力領域 unsigned8 *dstPtr = (unsigned8 *) gStuff->outData; // 出力領域 unsigned8 *mskPtr = (unsigned8 *) gStuff->maskData // マスク; gStuff->planes; プレーンの数(r,g,b+αチャネル(不定) ) gStuff->haveMask; // マスクがある=1 無し=0 const short columns = gStuff->outRect.right - gStuff->outRect.left; // 幅 const short rows = gStuff->outRect.bottom - gStuff->outRect.top; // 高さ
αチャンネルを使う時は、これを1にするらしい。
Dissolvesans.hの
これは違うだろう。
#define useAlpha 0 // use alpha
・HyperKid/Photographerの場合、プラグインを呼ぶ前に予め「表示マスク」を作成しておかないと、プラグインには3プレーンしか渡らない。オカシイ…透明プレーンもあるはずだ。
・DoFilterRect()はいつも4回呼ばれる。何故だろう。←最初の3回は妙に小さいのでプレビューのためくさい。
・衝撃の事実!やっぱ本家Photoshopだと、私の想定通りの動作をする。でもハイパーキッドだと透明部分のデータが反映されない(=透明部分にはフィルタは描画できない?)。ヤル気が無くなったなぁ。
・でも普通に動作するフィルタもある(というか、その方が多い)ので何か方法があるはず。
・つか、ちゃんと動作するサンプルソースさえあれば…。