EngAlphaBlend 関数 (winddi.h)
EngAlphaBlend 関数は、アルファ ブレンドを使用したビット ブロック転送機能を提供します。
構文
ENGAPI BOOL EngAlphaBlend(
SURFOBJ *psoDest,
SURFOBJ *psoSrc,
CLIPOBJ *pco,
XLATEOBJ *pxlo,
RECTL *prclDest,
RECTL *prclSrc,
BLENDOBJ *pBlendObj
);
パラメーター
psoDest
描画するサーフェスを識別する SURFOBJ 構造体へのポインター。
psoSrc
ソース サーフェスを識別する SURFOBJ 構造体へのポインター。
pco
CLIPOBJ 構造体へのポインター。 クリップ領域を四角形のセットとして列挙するために、CLIPOBJ_Xxx サービス ルーチンが用意されています。 この列挙は、変更される宛先の領域を制限します。 可能な限り、GDI は関連するクリッピングを簡略化します。 ただし、 EngBitBlt とは異なり、出力のクリッピングの丸めエラーを防ぐために、 EngAlphaBlend が単一の四角形で呼び出される場合があります。
pxlo
ソース サーフェスと変換先サーフェスの間でカラー インデックスを変換する方法を指定する XLATEOBJ 構造体へのポインター。
ソース サーフェスがパレットで管理されている場合、その色は RGB カラー値の参照テーブルへのインデックスによって表されます。 この場合、GDI は XLATEOBJ 構造体に対して変換ベクトルのクエリを実行して、ソース インデックスを変換先のカラー インデックスにすばやく変換できます。
たとえば、ソースが RGB であるが、コピー先がパレットで管理されている場合など、状況はより複雑になります。 この場合、各ソース RGB 値に最も近い一致がターゲット パレットで見つかる必要があります。 GDI は、 XLATEOBJ_iXlate サービス ルーチンを呼び出して、この一致操作を実行します。
prclDest
変更する四角形領域を定義する RECTL 構造体へのポインター。 この四角形は、変換先サーフェスの座標系で指定され、左上と右下の 2 つの点で定義されます。 四角形を定義する 2 つの点は、常に適切に並べ替えられます。
四角形は右下の排他的です。つまり、その下端と右端はブレンドの一部ではありません。
指定した四角形は、移動先のサーフェスに張り出すことができます。GDI では、適切なクリッピングが実行されます。
EngAlphaBlend は、空の変換先の四角形で呼び出さないでください。
prclSrc
コピーする領域を定義する RECTL 構造体へのポインター。 この四角形は、ソース サーフェスの座標系で指定され、左上と右下の 2 つの点で定義されます。 四角形を定義する 2 つの点は、常に適切に並べ替えられます。
四角形は右下の排他的です。つまり、その下端と右端はブレンドの一部ではありません。
ソースの四角形はソース サーフェスの境界を超えないようにし、ソース サーフェスを張り出すことはありません。
EngAlphaBlend は、空のソース四角形で呼び出さないでください。
マッピングは、 prclSrc と prclDest によって定義されます。 prclDest および prclSrc で指定された点は、ピクセルの中心に対応する整数座標にあります。 このような 2 つの点で定義された四角形は、指定された点を座標とする 2 つの頂点を持つ幾何学的な四角形と見なされますが、各座標から 0.5 が減算されます。 (POINTL 構造体は、これらの小数座標頂点を指定するための短縮表記です)。
pBlendObj
ソース サーフェスとターゲット サーフェスの間で実行するブレンド操作を記述する BLENDOBJ 構造体へのポインター。 この構造体は BLENDFUNCTION 構造体のラッパーです。これには、XLATEOBJ 構造体では使用できない必要なソースと宛先の形式情報が含まれます。 BLENDFUNCTION は、Microsoft Windows SDKドキュメントで宣言されています。 そのメンバーは次のように定義されます。
BlendOp は、実行するブレンド操作を定義します。 現在、この値はAC_SRC_OVERする必要があります。つまり、ソース ビットマップは、ソース ピクセルのアルファ値に基づいてコピー先ビットマップ上に配置されます。 このブレンド操作で処理する必要があるケースは 3 つあります。 これらは、このリファレンス ページの「解説」セクションで説明されています。
BlendFlags は予約されており、現在は 0 に設定されています。
SourceConstantAlpha は、ソース サーフェス全体に適用する定数ブレンド係数を定義します。 この値は [0,255] の範囲内で、0 は完全に透明で、255 は完全に不透明です。
AlphaFormat は、サーフェスにアルファ チャネルがあると見なされるかどうかを定義します。 このメンバーは、必要に応じて次の値に設定できます。
AC_SRC_ALPHA
ソース サーフェスは、事前乗算されたアルファ 32bpp "BGRA" 形式であると見なすことができます。つまり、サーフェスタイプはBMF_32BPPされ、パレットタイプはBI_RGB。 アルファ成分は[0,255]の範囲の整数で、0は完全に透明で、255は完全に不透明です。
戻り値
EngAlphaBlend は、成功すると TRUE を 返します。 エラーが発生した場合は、 FALSE を 返し、エラー コードを報告します。
注釈
アルファ ブレンドを使用したビット ブロック転送は、次のサーフェス間でサポートされています。
- 1 つの デバイス管理サーフェス から別のデバイス管理サーフェスへ。
- 1 つの GDI マネージド標準形式ビットマップから、別の GDI マネージド標準形式ビットマップへ。
- 1 つのデバイスで管理されたサーフェスから GDI で管理されるサーフェスへ、またはその逆も同様です。
AC_SRC_OVER ブレンド関数で考えられる 3 つのケースは次のとおりです。
- ソース ビットマップにはピクセルごとのアルファ (AC_SRC_ALPHAが設定されていません) がないため、 次のように SourceConstantAlpha で指定された一定のソース アルファ値に基づいて、ブレンドがピクセルのカラー チャネルに適用されます。
Dst.Red = Round(((Src.Red * SourceConstantAlpha) + ((255 − SourceConstantAlpha) * Dst.Red)) / 255); Dst.Green = Round(((Src.Green * SourceConstantAlpha) + ((255 − SourceConstantAlpha) * Dst.Green)) / 255); Dst.Blue = Round(((Src.Blue * SourceConstantAlpha) + ((255 − SourceConstantAlpha) * Dst.Blue)) / 255); /* Do the next computation only if the destination bitmap has an alpha channel. */ Dst.Alpha = Round(((Src.Alpha * SourceConstantAlpha) + ((255 − SourceConstantAlpha) * Dst.Alpha)) / 255);
- ソース ビットマップにはピクセル単位のアルファ値があります (AC_SRC_ALPHAが設定されています)、 SourceConstantAlpha は使用されません (255 に設定されています)。 ブレンドは次のように計算されます。
Dst.Red = Src.Red + Round(((255 − Src.Alpha) * Dst.Red) / 255); Dst.Green = Src.Green + Round(((255 − Src.Alpha) * Dst.Green) / 255); Dst.Blue = Src.Blue + Round(((255 − Src.Alpha) * Dst.Blue) / 255); /* Do the next computation only if the destination bitmap has an alpha channel. */ Dst.Alpha = Src.Alpha + Round(((255 − Src.Alpha) * Dst.Alpha) / 255);
- ソース ビットマップにはピクセル単位のアルファ値があります (AC_SRC_ALPHAが設定されています)、 SourceConstantAlpha が使用されます (255 に設定されていません)。 ブレンドは次のように計算されます。
Temp.Red = Round((Src.Red * SourceConstantAlpha) / 255); Temp.Green = Round((Src.Green * SourceConstantAlpha) / 255); Temp.Blue = Round((Src.Blue * SourceConstantAlpha) / 255); /* The next computation must be done even if the destination bitmap does not have an alpha channel. */ Temp.Alpha = Round((Src.Alpha * SourceConstantAlpha) / 255); /* Note that the following equations use the just-computed Temp.Alpha value: */ Dst.Red = Temp.Red + Round(((255 − Temp.Alpha) * Dst.Red) / 255); Dst.Green = Temp.Green + Round(((255 − Temp.Alpha) * Dst.Green) / 255); Dst.Blue = Temp.Blue + Round(((255 − Temp.Alpha) * Dst.Blue) / 255); /* Do the next computation only if the destination bitmap has an alpha channel. */ Dst.Alpha = Temp.Alpha + Round(((255 − Temp.Alpha) * Dst.Alpha) / 255);
要件
要件 | 値 |
---|---|
サポートされている最小のクライアント | Windows 2000 以降のバージョンの Windows オペレーティング システムで使用できます。 |
対象プラットフォーム | ユニバーサル |
Header | winddi.h (Winddi.h を含む) |
Library | Win32k.lib |
[DLL] | Win32k.sys |