DrvAlphaBlend 関数 (winddi.h)
DrvAlphaBlend 関数は、アルファ ブレンドを使用したビット ブロック転送機能を提供します。
構文
BOOL DrvAlphaBlend(
[in, out] SURFOBJ *psoDest,
[in] SURFOBJ *psoSrc,
[in] CLIPOBJ *pco,
[in, optional] XLATEOBJ *pxlo,
[in] RECTL *prclDest,
[in] RECTL *prclSrc,
[in] BLENDOBJ *pBlendObj
);
パラメーター
[in, out] psoDest
描画するサーフェスを識別する SURFOBJ 構造体へのポインター。
[in] psoSrc
ソース サーフェスを識別する SURFOBJ 構造体へのポインター。
[in] pco
CLIPOBJ 構造体へのポインター。 CLIPOBJ_Xxx サービス ルーチンは、 クリップ領域 を一連の四角形として列挙するために提供されます。 この列挙は、変更される宛先の領域を制限します。 可能な限り、GDI は関連するクリッピングを簡略化します。 ただし、 DrvBitBlt とは異なり、出力のクリッピングで丸めエラーが発生しないように、 DrvAlphaBlend が 1 つの四角形で呼び出される場合があります。
[in, optional] pxlo
ソース サーフェスとターゲット サーフェスの間でカラー インデックスを変換する方法を指定する XLATEOBJ 構造体へのポインター。 pxlo が NULL の場合、変換は必要ありません。
ソース サーフェスがパレットで管理されている場合、その色は RGB カラー値の参照テーブルへのインデックスによって表されます。 この場合、XLATEOBJ に対して変換ベクトルを照会できます。これにより、デバイス ドライバーはソース インデックスを変換先のカラー インデックスにすばやく変換できます。
たとえば、ソースが RGB であるが、コピー先がパレットで管理されている場合など、状況はより複雑になります。 この場合、各ソース RGB 値に最も近い一致がターゲット パレットで見つかる必要があります。 ドライバーは、 XLATEOBJ_iXlate サービス ルーチンを呼び出して、この一致操作を実行できます。
[in] prclDest
変更する四角形領域を定義する RECTL 構造体へのポインター。 この四角形は、変換先サーフェスの座標系で指定され、左上と右下の 2 つの点で定義されます。 四角形を定義する 2 つの点は、常に適切に並べ替えられます。 四角形は右下の排他的です。つまり、その下端と右端はブレンドの一部ではありません。
指定した四角形がターゲットサーフェスに張り出す可能性があるため、ピクセルを書き込むときに適切なクリッピングを行うには、ドライバーが注意する必要があります。
DrvAlphaBlend は、空の変換先の四角形で呼び出されることはありません。
[in] prclSrc
コピーする領域を定義する RECTL 構造体へのポインター。 この四角形は、ソース サーフェスの座標系で指定され、左上と右下の 2 つの点で定義されます。 四角形を定義する 2 つの点は、常に適切に並べ替えられます。 四角形は右下の排他的です。つまり、その下端と右端はブレンドの一部ではありません。
ソースの四角形がソース サーフェスの境界を超えることはなく、ソース サーフェスがオーバーハングすることはありません。
DrvAlphaBlend は、空のソース四角形で呼び出されることはありません。
マッピングは、 prclSrc と prclDest によって定義されます。 prclDest および prclSrc で指定された点は、ピクセルの中心に対応する整数座標にあります。 このような 2 つの点で定義された四角形は、指定された点を座標とする 2 つの頂点を持つ幾何学的な四角形と見なされますが、各座標から 0.5 が減算されます。 (POINTL 構造体は、これらの小数座標頂点を指定するための短縮表記です)。
[in] 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は完全に不透明です。
戻り値
DrvAlphaBlend は成功すると 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);
Trunc(x + 0.5);
DrvAlphaBlend は、必要に応じてグラフィックス ドライバーに実装できます。 ソース サーフェスとターゲット サーフェスが同じ形式でアルファ チャネルが含まれていないブレンドなど、いくつかの種類のアルファ ブレンドを処理するために提供できます。
ハードウェア実装では、ブレンド操作で浮動小数点または固定ポイントを使用できます。 互換性テストでは、結果の数値エラーが考慮されます。最大許容エラーの詳細については、「 ディスプレイ ドライバーの特殊効果 」を参照してください。 固定小数点を使用する場合、 x/255 という用語に許容される近似値は (x*257)/65536 です。 丸め処理を組み込む式:
((255 - Src.Alpha) * Dst.Red) / 255
その後、次のように近似できます。
temp = ((255 - Src.Alpha) * Dst.Red) + 128;
result = (temp + (temp >> 8)) >> 8;
ドライバーは、EngAssociateSurface を呼び出すときに HOOK_ALPHABLEND フラグを設定して DrvAlphaBlend をフックします。 ドライバーが DrvAlphaBlend をフックし、サポートされていない操作を実行するために呼び出された場合、ドライバーは EngAlphaBlend の呼び出しでデータをパントすることによって GDI で操作を処理する必要があります。
要件
要件 | 値 |
---|---|
対象プラットフォーム | デスクトップ |
Header | winddi.h (Winddi.h を含む) |