ID2D1CommandSink1
COM公式ドキュメント
このインターフェースは、既存の ID2D1CommandSink インターフェースとまったく同じ機能をすべて実行します。さらに、SetPrimitiveBlend1 メソッドを通じて、新しいプリミティブブレンドモードである MIN と ADD へのアクセスも可能にします。
メソッド 1
vtbl = vtable インデックス(0始まり)。HSP等からCOMメソッドをインデックス指定で呼ぶ際に使用します。0〜2 は IUnknown。
新しいプリミティブブレンドモードを設定します。(ID2D1CommandSink1.SetPrimitiveBlend1)
| primitiveBlend | D2D1_PRIMITIVE_BLEND | in | 以降のプリミティブに適用されるプリミティブブレンドです。 |
戻り値
型: HRESULT
メソッドが成功した場合は S_OK を返します。失敗した場合は HRESULT エラーコードを返します。
解説(Remarks)
ブレンドモード
エイリアスレンダリング(MIN モードを除く)では、出力値 O は、プリミティブがデスティネーションピクセルを覆う割合に基づいて、値 blend(S, D) をデスティネーションピクセル値と線形補間することによって計算されます。ここに示す表は、エイリアスブレンディングとアンチエイリアスブレンディングの両方についてのプリミティブブレンドモードを示しています。表に記載されている式では、次の要素が使用されています。
- O = 出力
- S = ソース
- SA = ソースアルファ
- D = デスティネーション
- DA = デスティネーションアルファ
- C = ピクセルカバレッジ
| プリミティブブレンドモード | エイリアスブレンディング | アンチエイリアスブレンディング | 説明 |
|---|---|---|---|
| D2D1_PRIMITIVE_BLEND_SOURCE_OVER | O = (S + (1 – SA) * D) * C + D * (1 – C) | O = S * C + D *(1 – SA *C) | 標準的なソースオーバーデスティネーションのブレンドモードです。 |
| D2D1_PRIMITIVE_BLEND_COPY | O = S * C + D * (1 – C) | O = S * C + D * (1 – C) | ソースがデスティネーションにコピーされます。デスティネーションのピクセルは無視されます。 |
| D2D1_PRIMITIVE_BLEND_MIN | O = Min(S + 1-SA, D) | O = Min(S * C + 1 – SA *C, D) | 結果のピクセル値には、ソースとデスティネーションのピクセル値の最小値が使用されます。Windows 8 以降で利用可能です。 |
| D2D1_PRIMITIVE_BLEND_ADD | O = (S + D) * C + D * (1 – C) | O = S * C + D | 結果のピクセル値は、ソースとデスティネーションのピクセル値の合計になります。Windows 8 以降で利用可能です。 |
不透明度と背景を変化させたプリミティブブレンドモードの図です。
プリミティブブレンドは、DrawImage API の compositeMode パラメーターでオーバーライドされない限り、コンテキスト上に描画されるすべてのプリミティブに適用されます。
プリミティブブレンドは、コンテキスト上に描画されるあらゆるプリミティブの内部に適用されます。DrawImage の場合、これはイメージの矩形、オフセット、およびワールド変換によって暗黙的に決定されます。
プリミティブブレンドが D2D1_PRIMITIVE_BLEND_OVER 以外の場合、ClearType レンダリングは無効になります。アプリケーションがこれらのモードで明示的に ClearType レンダリングを強制すると、描画コンテキストはエラー状態になります。EndDraw または Flush のいずれかから D2DERR_WRONG_STATE が返されます。
Microsoft 公式リファレンス: 英語 (en-us) · 日本語 (ja-jp) · 原文ソース (GitHub)
HSP用 COM定義
#usecom / #comfunc によるHSPのCOM呼び出し定義。数字は vtbl インデックス(0始まり)。クラスIDが無い場合 #usecom の末尾は "{}"、ある場合は "{CLSID}"。
#define global IID_ID2D1CommandSink1 "{9EB767FD-4269-4467-B8C2-EB30CB305743}"
#usecom global ID2D1CommandSink1 IID_ID2D1CommandSink1 "{}"
#comfunc global ID2D1CommandSink1_SetPrimitiveBlend1 28 int
; ※数字は vtbl インデックス(0始まり)。0/1/2 は IUnknown(QueryInterface/AddRef/Release)。
; ※このインターフェースは直接 CoCreateInstance するクラスIDが無いため "{}"(他メソッド/アクティベーションで取得)。