Win32 API 日本語リファレンス
ホームGraphics.Direct2D › ID2D1EffectImpl

ID2D1EffectImpl

COM
IIDa248fd3f-3e6c-4e63-9f03-7f68ecc91db9継承元IUnknown自前メソッド開始 vtbl3

公式ドキュメント

カスタムエフェクトのインターフェイスと動作を、エフェクトの作成者が指定できるようにします。

解説(Remarks)

このインターフェイスは、ID2D1Factory::RegisterEffect メソッドを通じて登録された静的ファクトリから、エフェクトの作成者によって作成されます。

メソッド 3

vtbl = vtable インデックス(0始まり)。HSP等からCOMメソッドをインデックス指定で呼ぶ際に使用します。0〜2 は IUnknown。

vtbl 3 HRESULT Initialize(ID2D1EffectContext* effectContext, ID2D1TransformGraph* transformGraph)

エフェクトは、このメソッドを使用して一度限りの初期化タスクを実行できます。

effectContextID2D1EffectContext*inエフェクトの作成者向けの型を作成して返す、内部的なコンテキストインターフェイスです。
transformGraphID2D1TransformGraph*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;
};
vtbl 4 HRESULT PrepareForRender(D2D1_CHANGE_TYPE changeType)

レンダリング処理に向けてエフェクトを準備します。

changeTypeD2D1_CHANGE_TYPEinエフェクトが想定すべき変更の種類を示します。

戻り値

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;
};
vtbl 5 HRESULT SetGraph(ID2D1TransformGraph* transformGraph)

レンダラーはこのメソッドを呼び出し、エフェクトの実装に対して、そのトランスフォームグラフおよびトランスフォームグラフの変更を指定する手段を提供します。

transformGraphID2D1TransformGraph*inエフェクトが SetDescription 呼び出しを通じて自身のトランスフォームトポロジを記述する対象となるグラフです。

戻り値

Type: HRESULT

CreateEffect 呼び出しの一部として呼び出された場合に、エフェクトの初期化を妨げるエラーです。後続の SetGraph 呼び出しでエフェクトが失敗した場合は次のとおりです。

出典・ライセンス: 上記「公式ドキュメント」の内容は Microsoft の Win32 API ドキュメント(MicrosoftDocs/sdk-api)を日本語に翻訳・改変したものです。© Microsoft Corporation. CC BY 4.0 で提供。
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 指定が可能。