次の方法で共有


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 は、空のソース四角形で呼び出さないでください。

マッピングは、 prclSrcprclDest によって定義されます。 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 で管理されるサーフェスへ、またはその逆も同様です。
ドライバーは、同じサーフェス上に重複するソースと宛先の四角形を使用して 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);
    
ドライバーは 、DrvAlphaBlend をフックし、サポートされていないことを行うために呼び出される場合は、 EngAlphaBlend を呼び出す必要があります。

要件

要件
サポートされている最小のクライアント Windows 2000 以降のバージョンの Windows オペレーティング システムで使用できます。
対象プラットフォーム ユニバーサル
Header winddi.h (Winddi.h を含む)
Library Win32k.lib
[DLL] Win32k.sys

こちらもご覧ください

DrvAlphaBlend

DrvBitBlt

DrvPlgBlt

DrvStretchBlt

DrvStretchBltROP

DrvTransparentBlt

EngAssociateSurface

EngBitBlt

EngPlgBlt

EngStretchBlt

EngStretchBltROP

EngTransparentBlt