ディスプレイ ドライバーの特殊効果

Windows 2000 以降のオペレーティング システムバージョンでは、次の特殊効果がサポートされています。

  • ディスプレイ ハードウェアがアルファ ブレンドをサポートしている場合、ディスプレイ ドライバーは DrvAlphaBlend を実装できます。

  • ディスプレイ ハードウェアがグラデーション塗りつぶしをサポートしている場合、ディスプレイ ドライバーは DrvGradientFill を実装する必要があります。

アルファ ブレンド

Microsoft Windows 2000 (以降) シェルでは、アルファ ブレンドを広範囲に使用して、ブレンドインアニメーションやブレンドアウト アニメーションアルファ カーソルなどの操作を実行します。 アルファ ブレンド操作ではソースサーフェスと宛先サーフェスの両方からの読み取りが必要であるため、ソースまたは宛先のいずれかがビデオ メモリ内にある場合、GDI にパントするのは非常に遅くなります。 その結果、ドライバーのハードウェア アクセラレーションにより、目に見えるほどスムーズなアニメーションが生成され、システム全体のパフォーマンスが向上します。

ドライバーは、一定のアルファを使用して互換性のあるビットマップからのビット ブロック転送と、ピクセルごとのアルファ値を持つ 32 bpp BGRA システム メモリ サーフェイスからのビット ブロック転送に DrvAlphaBlend を実装する必要があります。 DrvAlphaBlend は、継ぎ目が表示されない場合に、三角形のテクスチャ フィルを使用して実装できます。

DrvAlphaBlend によって生成される最悪の場合のエラーは、カラー チャネルごとに 1 つを超えないようにしてください。 ストレッチが関係する場合は、ブレンドする前にソースを COLORONCOLOR でストレッチする必要があります (Windows SDK のドキュメントを参照)。最悪の場合のエラーは、最悪のケースのストレッチ エラーと組み合わせたカラー チャネルごとに 1 つを超えないようにしてください。

アルファ ブレンドがストレッチと組み合わされている場合、WDK には、ディスプレイ ドライバーの DrvAlphaBlend の実装を次のように評価するテストがあります。

  1. このテストでは、ディスプレイ ドライバーの DrvAlphaBlend が呼び出され、アルファ ブレンドおよびストレッチ四角形が生成されます。

  2. このテストでは、DrvAlphaBlend の呼び出しで使用されたのと同じソース矩形を使用して、変換先の矩形が生成されます。

  3. ステップ 2 の移動先の四角形の各ピクセル P について、テストでは、元の矩形内の対応するピクセルを、ストレッチ前に決定する逆引き伸びをシミュレートします。 テストでは、ドライバーによるさまざまなストレッチ実装に対応するために、逆ストレッチに許容値を適用します。 次に、テストはそのピクセルに適用するアルファ ブレンドを計算します。

    ソース矩形の 4 つの可能なピクセル (ピクセル P を中心とする 3 X 3 ピクセルの矩形の角) のいずれかを引き伸ばして、ターゲット矩形内のピクセル P を生成できるため、テストでは、各角ピクセルの色値を、DrvAlphaBlend によって生成された矩形内の対応する位置にあるピクセルの色値と比較する必要があります。

最悪の場合のストレッチ エラーは、対応するコーナー ピクセルのペア間の色値の最大の差です。そのうち の 1 つは DrvAlphaBlend で生成された矩形上にあり、もう 1 つはテストで生成されたソース矩形上にあります。

グラデーション塗りつぶし

Windows 2000 (以降) シェルでは、すべてのキャプションバーに グラデーションの塗りつぶし が使用されます。

DrvGradientFill によって生成される結果は、ピクセルあたりのビット数によって異なります。次のガイドラインを満たす必要があります。

24 bpp または 32-bpp サーフェス

  • 値は、すべてのグラフ化された方向で単調に増減する必要があります。

  • 四角形のグラデーションの場合: ulMode == GRADIENT_FILL_RECT_H の場合、各垂直バーは 1 色である必要があります。 ulMode == GRADIENT_FILL_RECT_V の場合、各水平バーは 1 色である必要があります。

  • どのチャネルでも、最悪の場合のエラーは ±1 を超えることはできません。

  • リージョンのエンドポイントは完全に一致している必要があります。

15 bpp または 16-bpp サーフェス

どのチャネルでも、最悪の場合のエラーは ±15 を超えることはできません。

1-bpp から 8-bpp サーフェス

これらのサーフェスのグラデーション塗りつぶしではエラーは許可されません。 8 bpp サーフェスの場合、GDI はドライバーの DrvGradientFill 関数を呼び出しません。

すべてのサーフェスでクリッピングが結果に影響しないことに注意してください。