PFN_DrvAlphaBlend
コールバックシグネチャ
BOOL PFN_DrvAlphaBlend(
SURFOBJ* param0,
SURFOBJ* param1,
CLIPOBJ* param2,
XLATEOBJ* param3,
RECTL* param4,
RECTL* param5,
BLENDOBJ* param6
);パラメーター
| フィールド | 型 |
|---|---|
| param0 | SURFOBJ* |
| param1 | SURFOBJ* |
| param2 | CLIPOBJ* |
| param3 | XLATEOBJ* |
| param4 | RECTL* |
| param5 | RECTL* |
| param6 | BLENDOBJ* |
公式ドキュメント
DrvAlphaBlend 関数は、アルファブレンディングを伴うビットブロック転送の機能を提供します。
戻り値
DrvAlphaBlend は、成功すると TRUE を返します。それ以外の場合は、エラーを報告して FALSE を返します。
解説(Remarks)
ドライバーは、次のサーフェス間でアルファブレンディングを伴うビットブロック転送をサポートできます。
- あるデバイス管理サーフェスから別のデバイス管理サーフェスへの転送。
- ある GDI 管理の標準形式ビットマップから別の GDI 管理の標準形式ビットマップへの転送。
- デバイス管理サーフェスから 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 は、グラフィックスドライバーで任意に実装できます。転送元サーフェスと転送先サーフェスが同じ形式でアルファチャネルを含まないブレンドなど、一部の種類のアルファブレンドを処理するために提供できます。
ハードウェア実装では、ブレンド演算に浮動小数点または固定小数点を使用できます。互換性テストでは結果に含まれる多少の数値誤差が考慮されます。許容される最大誤差については、Special Effects in Display Drivers を参照してください。固定小数点を使用する場合、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 にその操作を処理させる必要があります。
Microsoft 公式リファレンス: 英語 (en-us) · 日本語 (ja-jp) · 原文ソース (GitHub)