ID2D1EffectImpl
COM公式ドキュメント
カスタムエフェクトのインターフェイスと動作を、エフェクトの作成者が指定できるようにします。
解説(Remarks)
このインターフェイスは、ID2D1Factory::RegisterEffect メソッドを通じて登録された静的ファクトリから、エフェクトの作成者によって作成されます。
メソッド 3
vtbl = vtable インデックス(0始まり)。HSP等からCOMメソッドをインデックス指定で呼ぶ際に使用します。0〜2 は IUnknown。
エフェクトは、このメソッドを使用して一度限りの初期化タスクを実行できます。
| effectContext | ID2D1EffectContext* | in | エフェクトの作成者向けの型を作成して返す、内部的なコンテキストインターフェイスです。 |
| transformGraph | ID2D1TransformGraph* | in | エフェクトは、トランスフォームグラフにトポロジを設定し、後でそれを更新できます。 |
戻り値
Type: HRESULT
メソッドが成功した場合は S_OK を返します。失敗した場合は HRESULT エラーコードを返します。
解説(Remarks)
これにより、リソース作成のコストがレンダリング中ではなく CreateEffect 呼び出しに移されます。
実装がこの呼び出しに失敗した場合、対応する ID2D1DeviceContext::CreateEffect 呼び出しも失敗します。
次の例は、初期化メソッドを実装するエフェクトを示しています。
例
ここでの例は、初期化メソッドを実装するエフェクトを示しています。
class CEffectImplementation : public ID2D1EffectImpl
{
public:
virtual ~CEffectImplementation()
{
if (_pContextInternal != NULL)
{
_pContextInternal->Release();
}
}
IFACEMETHODIMP Initialize(__in ID2D1DeviceContextInternal *pContextInternal, __in ID2D1TransformGraph *pTransformGraph)
{
HRESULT hr = S_OK;
_pContextInternal = pContextInternal;
_pContextInternal->AddRef();
_pTransformGraph = pTransformGraph;
_pTransformGraph>AddRef();
// Populate the transform graph.
return S_OK;
}
private:
ID2D1EffectContext *_pContextInternal;
ID2D1TransformGraph *_pTransformGraph;
};
レンダリング処理に向けてエフェクトを準備します。
| changeType | D2D1_CHANGE_TYPE | in | エフェクトが想定すべき変更の種類を示します。 |
戻り値
Type: HRESULT
メソッドが成功した場合は S_OK を返します。失敗した場合は HRESULT エラーコードを返します。
解説(Remarks)
このメソッドは、描画対象のエフェクトグラフ内にエフェクトが含まれるときに、レンダラーによって呼び出されます。
このメソッドは次の場合に呼び出されます。
- エフェクトが初期化されているが、まだ描画されていない場合。
- 前回の描画呼び出し以降にエフェクトのプロパティが設定された場合。
- エフェクトが前回描画されて以降にコンテキストの状態が変化した場合。
ほとんどのエフェクトは、この呼び出しが行われるまでリソースの作成やトポロジの指定を遅延させます。エフェクトはプロパティを保持し、最初に描画される際に、それらを具体的なレンダリング手法の集合にマッピングします。
例
エフェクトは通常、レンダリングされるまで待ってから現在の状態をスナップショットし、内包している各トランスフォームに適用します。
class CMyTransform : public ID2D1DrawTransform
{
public:
// Transform methods omitted.
HRESULT PrepareForRender(FLOAT radius);
};
class CEffectImplementation : public ID2D1EffectImpl
{
public:
void SetRadius(FLOAT radius) { _radius = radius; }
IFACEMETHODIMP PrepareForRender(D2D1_CHANGE_TYPE /*type*/)
{
// Send the radius to the transform and ask it to render.
return _pMyTransform->PrepareForRender(_radius);
}
private:
CMyTransform *_pMyTransform;
FLOAT _radius;
};
レンダラーはこのメソッドを呼び出し、エフェクトの実装に対して、そのトランスフォームグラフおよびトランスフォームグラフの変更を指定する手段を提供します。
| transformGraph | ID2D1TransformGraph* | in | エフェクトが SetDescription 呼び出しを通じて自身のトランスフォームトポロジを記述する対象となるグラフです。 |
戻り値
Type: HRESULT
CreateEffect 呼び出しの一部として呼び出された場合に、エフェクトの初期化を妨げるエラーです。後続の SetGraph 呼び出しでエフェクトが失敗した場合は次のとおりです。
- このエラーは、エフェクトへの入力数を変化させる原因となったプロパティメソッドから返されます。
- エフェクトオブジェクトはエラー状態になります。以降レンダリングに使用されると、コンテキストは一時的なエラー状態になり、その特定のエフェクトはレンダリングに失敗し、次の EndDraw または Flush 呼び出しでその失敗が返されます。
Microsoft 公式リファレンス: 英語 (en-us) · 日本語 (ja-jp) · 原文ソース (GitHub)
HSP用 COM定義
#usecom / #comfunc によるHSPのCOM呼び出し定義。数字は vtbl インデックス(0始まり)。クラスIDが無い場合 #usecom の末尾は "{}"、ある場合は "{CLSID}"。
#define global IID_ID2D1EffectImpl "{A248FD3F-3E6C-4E63-9F03-7F68ECC91DB9}"
#usecom global ID2D1EffectImpl IID_ID2D1EffectImpl "{}"
#comfunc global ID2D1EffectImpl_Initialize 3 sptr,sptr
#comfunc global ID2D1EffectImpl_PrepareForRender 4 int
#comfunc global ID2D1EffectImpl_SetGraph 5 sptr
; ※数字は vtbl インデックス(0始まり)。0/1/2 は IUnknown(QueryInterface/AddRef/Release)。
; ※このインターフェースは直接 CoCreateInstance するクラスIDが無いため "{}"(他メソッド/アクティベーションで取得)。
; ※ハンドル/void*等の不透明ポインタは IronHSP では intptr 指定が可能。