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 構造体へのポインター。 pxloNULL の場合、変換は必要ありません。

ソース サーフェスがパレットで管理されている場合、その色は RGB カラー値の参照テーブルへのインデックスによって表されます。 この場合、XLATEOBJ に対して変換ベクトルを照会できます。これにより、デバイス ドライバーはソース インデックスを変換先のカラー インデックスにすばやく変換できます。

たとえば、ソースが RGB であるが、コピー先がパレットで管理されている場合など、状況はより複雑になります。 この場合、各ソース RGB 値に最も近い一致がターゲット パレットで見つかる必要があります。 ドライバーは、 XLATEOBJ_iXlate サービス ルーチンを呼び出して、この一致操作を実行できます。

[in] prclDest

変更する四角形領域を定義する RECTL 構造体へのポインター。 この四角形は、変換先サーフェスの座標系で指定され、左上と右下の 2 つの点で定義されます。 四角形を定義する 2 つの点は、常に適切に並べ替えられます。 四角形は右下の排他的です。つまり、その下端と右端はブレンドの一部ではありません。

指定した四角形がターゲットサーフェスに張り出す可能性があるため、ピクセルを書き込むときに適切なクリッピングを行うには、ドライバーが注意する必要があります。

DrvAlphaBlend は、空の変換先の四角形で呼び出されることはありません。

[in] prclSrc

コピーする領域を定義する RECTL 構造体へのポインター。 この四角形は、ソース サーフェスの座標系で指定され、左上と右下の 2 つの点で定義されます。 四角形を定義する 2 つの点は、常に適切に並べ替えられます。 四角形は右下の排他的です。つまり、その下端と右端はブレンドの一部ではありません。

ソースの四角形がソース サーフェスの境界を超えることはなく、ソース サーフェスがオーバーハングすることはありません。

DrvAlphaBlend は、空のソース四角形で呼び出されることはありません。

マッピングは、 prclSrcprclDest によって定義されます。 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 で管理されるサーフェスへ、またはその逆も同様です。
ドライバーは 、EngAlphaBlend への呼び出しをパントできます。

ドライバーは、同じサーフェス上に重複するソースと宛先の四角形で呼び出されることはありません。

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);
    
Round(x) 関数は、次のように計算された最も近い整数に丸められます。
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 を含む)

こちらもご覧ください

DrvBitBlt

DrvPlgBlt

DrvStretchBlt

DrvStretchBltROP

DrvTransparentBlt

EngAlphaBlend

EngBitBlt

EngPlgBlt

EngStretchBlt

EngStretchBltROP

EngTransparentBlt