Iteration Suites — After Effects SDK Guide 22.0.0 documentation

Effectsでは、画像内のすべてのピクセルに対して反復処理を行い、各ピクセルにフィルタをかけることがよくあります。After Effectsの反復処理スイートを利用することで、ハードウェア固有のアクセラレーションを利用して、After Effectsが存在するプロセッサの数だけタスクをサブアロケートすることを可能にします。

また、進捗状況の報告やユーザーのキャンセルもAfter Effectsが自動で管理します。

これらのスイートを使用します。これらのイテレータコールバックに渡すピクセル処理関数がリエントラントであることを確認してください。

<aside> 💡 2021年10月のSDKアップデートにより、同時反復処理スレッド数が、これまでのハードコードされた上限32から、利用可能なシステムCPUコア数まで増加します。

</aside>

PF_Iterate8Suite1, PF_Iterate16Suite1, PF_IterateFloatSuite1

Function Purpose
iterate 元画像のピクセルを反復して変更し、目的画像に入力します。繰り返しの対象となるピクセルの矩形領域を指定することもできますが、指定しない場合は、After Effects は重なり合うすべてのピクセルに対して繰り返しを行います。Refcon を与えると、その Refcon と現在のピクセルの x 座標と y 座標、そして元画像と先画像のそのピクセルへのポインタを用いて関数が呼び出されます。ソース画像にNULLを渡すと,dst画像に対して反復処理を行います.この関数は,品質に依存しません.ピクセルが特定の順序で走査されることに依存しないでください。イメージは異なるCPUにサブセットされる可能性があるので、After Effectsの処理中は、すべてのパラメータ(dstを除く)を読み取り専用にすることを考慮する。このコールバックは自動的に進行と中止のチェックを含むので、ピクセル関数でそのようなことをしないようにする。
**iterate(
PF_InData *in_data,
A_long progress_base,
A_long progress_final,
PF_EffectWorld *src,
const PF_Rect *area,
void *refcon,
PF_Err (*pix_fn)(
void      *refcon,
A_long    x,
A_long    y,
PF_Pixel  *in,
PF_Pixel  *out),

PF_EffectWorld dst );* | | iterate_origin | 入力から出力へのオフセットを指定することができます。例えば、出力バッファが入力バッファより小さい場合、原点に (in_- data>output_origin_x, in_data>output_origin_y) を、面積に NULL を渡すと、この関数は src ピクセルポインタをピクセル関数に応じて適切にオフセットします。 **iterate_origin( PF_InData *in_data, A_long progress_base, A_long progress_final, PF_EffectWorld *src, const PF_Rect *area, const PF_Point *origin, void *refcon, PF_Err (*pix_fn)( void *refcon, A_long x, A_long y, PF_Pixel *in, PF_Pixel out), PF_EffectWorld dst ); | | iterate_lut | PF_Iterate8Suiteのみ。反復処理にルックアップテーブル(LUT)を渡すことができるようにします。LUTが渡されない場合、同一LUTが使用されます。 **iterate_lut( PF_InData *in_data, A_long prog_base, A_long prog_final, PF_EffectWorld *src, const PF_Rect *area, A_u_char *a_lut0, A_u_char *r_lut0, A_u_char *g_lut0, A_u_char b_lut0, PF_EffectWorld dst ); | | iterate_origin_non_clip_src | ソースレイヤーとデスティネーションレイヤーの交差点の外側にあるピクセルで反復処理を行えるようにします。これらのピクセルに対してはPF_Pixelで値{0,0,0,0}を指定します。**iterate_origin_non_clip_src( PF_InData *in_data, A_long progress_base, A_long progress_final, PF_EffectWorld *src, const PF_Rect *area, const PF_Point *origin, void *refcon, PF_Err (*pix_fn)( void *refcon, A_long x, A_long y, PF_Pixel *in, PF_Pixel out), PF_EffectWorld dst ); | | iterate_generic | PF_Iterate8Suiteのみです。使用可能なCPUごとに1回だけ何かをしたい場合、この関数を使用します(iterationsLにはPF_Iterations_ONCE_PER_PROCESSORを渡してください)。スレッドインデックス0からabortとprogress関数だけを呼び出します。 注:ピクセル以上のものを反復処理することができます。内部では、行ベースの画像処理や、複雑な配列データの1エンティティごとの更新に使用しています。 **iterate_generic( A_long iterationsL, void *refconPV, PF_Err (fn_func)( void refconPV, A_long thread_idxL, A_long i, A_long itrtL) ); |