ビットマップのコピー

ドライバーによって実装されるビット ブロック転送 (BitBlt) 関数は、あるサーフェイスから別のサーフェイスにビットのブロックをコピーします。 次のような関数があります。

DrvSaveScreenBits という名前のディスプレイ ドライバー固有の BitBlt 関数もあります。

描画されるサーフェイスがデバイスで管理されるサーフェイスまたはビットマップの場合、ドライバーは最小レベルのビット ブロック転送関数をサポートする必要があります。 サーフェイスが GDI マネージドの標準形式のビットマップの場合、GDI はドライバーによってフックされない操作のみを処理します。

DrvBitBlt

DrvBitBlt 関数は、一般的なビット ブロック転送機能を提供します。 ソースが使用される場合、DrvBitBlt はソース矩形のコンテンツをコピー先矩形にコピーします。 (この関数の pptlSrc パラメーターは、矩形の左上隅を特定します。ソース矩形がない場合、DrvBitBltpptlSrc パラメーターを無視します。 修正するサーフェイスであるコピー先矩形は、左上隅と右下隅の 2 つの整数ポイントによって定義されます。 矩形は右下を含みません。矩形の下端と右端はブロック転送に含まれません。 DrvBitBlt を空のコピー先矩形で呼び出すことはできません。 矩形の 2 つのポイントは常に正しく適切に並べ替えられます。つまり、右下のポイントの両方の座標は、左上のポイントの対応する座標よりも大きくなります。

DrvBitBlt は、さまざまな ROP を処理し、デバイスに応じて最適化を実行します。 場合によっては、ROP が単色の場合、BitBlt ではなく塗りつぶしを実行できます。 Pscript ドライバーなど、ROP をサポートしていないデバイスまたはドライバーの場合、表示イメージと印刷イメージの間に不一致が生じることがあります。

オプションで、DrvBitBlt で処理するブロック転送をマスクし、カラー インデックス変換を含めることができます。 変換ベクトルは、パレットのカラー インデックス変換を支援します。 一連のクリップ矩形を使用して、転送をディスプレイ ドライバーによって任意にクリップする必要がある場合があります。 必要な領域と情報は GDI によって提供されます。

DrvBitBlt の実装は、標準形式のフレーム バッファーを持たないラスター ディスプレイ ドライバーのドライバーの記述に関連する作業の重要な部分を表します。 Windows Driver Kit (WDK) に付属する Microsoft VGA ドライバーには、平面デバイスの基本機能をサポートするサンプル コードが用意されています。 他のデバイスへの DrvBitBlt の実装は、あまり複雑ではありません。

DrvCopyBits

DrvCopyBits 関数は、デバイスで管理されるラスター サーフェイスと GDI 標準形式のビットマップの間で変換するために、GDI によってシミュレーション操作から呼び出されます。 DrvCopyBits は、SRCCOPY (0xCCCC) ROP ビット ブロック転送に高速パスを提供します。

デバイスで管理されるビットマップまたはラスター サーフェイスを持つグラフィックス ドライバーに必要なこの関数は、標準形式のビットマップとの間でドライバー サーフェイスを変換する必要があります。 DrvCopyBits は空のコピー先矩形で呼び出されることはなく、コピー先矩形の 2 つのポイントは常に適切に並べ替えられます。 この呼び出しの要件は、DrvBitBlt と同じです。

ドライバーがデバイス管理サーフェイスまたはビットマップをサポートしている場合、ドライバーはDrvCopyBits 関数を実装する必要があります。 少なくとも、ドライバーは、DrvCopyBits が呼び出されたときに、以下を実行する必要があります。

  • デバイスの優先形式で、ビットマップとの間でのブロック転送、およびデバイス サーフェイスへのブロック転送を実行します。
  • SRCCOPY (0xCCCC) ラスター演算 (ROP) を使用して転送を実行します。
  • 任意のクリッピングを許可します。

ドライバーは、GDI CLIPOBJ 列挙サービスを使用して、一連のクリップ矩形へのクリッピングを減らすことができます。 GDI は、ソース サーフェイスとコピー先サーフェイス間のカラー インデックス変換をサポートするために、XLATEOBJ 構造体である変換ベクトルを渡します。

デバイスのサーフェイスが標準形式のデバイスに依存しないビットマップ (DIB) として編成されている場合、ドライバーは単純な転送のみをサポートできます。 複雑な ROP で呼び出しが発生した場合、ドライバーは、EngCopyBits 関数の呼び出しを使用して GDI にブロック転送要求をパントできます。 これにより、GDI はドライバーが実行できるより単純な関数に呼び出しを分割できます。

DrvCopyBits は、RLE ビットマップ (Microsoft Windows SDK のドキュメントを参照) とデバイス依存ビットマップ (DDB) でも呼び出されます。 ビットマップは、複数の Win32 GDI ルーチンへのアプリケーション プログラム呼び出しの結果として、この関数に提供されます。 オプションの DDB は、いくつかの特殊なドライバーでのみサポートされます。

DrvStretchBlt

必要に応じて、ドライバーは (デバイスで管理されるサーフェイスをサポートするドライバーでも)、DrvStretchBlt 関数を提供できます。 この関数は、デバイスで管理されるサーフェイスと GDI で管理されるサーフェイス間のブロック転送を拡張する機能を提供します。 DrvStretchBlt は、整数の倍数によるストレッチなど、特定の種類のストレッチのみをサポートします。

DrvStretchBlt は、特にドライバーがハーフトニングを実行できる場合に、ドライバーに GDI ビットマップへの書き込みを許可します。 この関数では、GDI ビットマップとデバイス サーフェイスに同じハーフトニング アルゴリズムを適用することもできます。

DrvStretchBlt は、幾何学的なソース矩形を幾何学的なコピー先矩形に正確にマップします。 ソースは、指定された整数座標から角が (-0.5,-0.5) だけずれた矩形です。 関数パラメーターで指定されたポイントは、ピクセルの中心に対応する整数座標上にあります。 このような 2 つのポイントで定義された矩形は、指定されたポイントを座標とする 2 つの頂点があり、各座標から 0.5 だけ差し引いたされた幾何学図形と見なされます。 (GDI POINTL 構造体では、これらの小数部の座標頂点を指定するために短縮表記が使用されます)。このような矩形の端は、ピクセルと交差することはなく、一連のピクセルの周りを移動します。 矩形内のピクセルは、右下を含まない矩形の通常のピクセルです。

ソースの矩形の角を定義するポイントは適切に並べ替えられます。DrvStretchBlt に空のソース矩形を指定することはできません。 DrvBitBlt と異なり、DrvStretchBlt は 1 つのクリッピング矩形で呼び出して、出力クリッピングで丸めエラーが発生しないようにします。

コピー先矩形は、2 つの整数ポイントによって定義されます。 これらのポイントは適切に並べ替えられていないため、2 つ目のポイントの座標が必ずしも最初のポイントの座標よりも大きいとは限りません。 これらのポイントで記述するソース矩形には、下端と右端が含まれません。 矩形が正しく適切に並べ替えられていないため、DrvStretchBlt で、2 つの x 座標や 2 つの y 座標で反転を実行する必要がある場合があります。 (ドライバーは、ソース サーフェイスに存在しないピクセルの読み取りを試行する必要はありません)。 DrvStretchBlt を空のコピー先矩形で呼び出すことはできません。

色変換の場合、DrvStretchBlt は、ポインターの pxloXLATEOBJ 構造体を提供します。これは、ソース サーフェイスとコピー先サーフェイスの間で変換するために使用されます。 XLATEOBJ 構造体をクエリして、任意のソース インデックスのコピー先インデックスを検索できます。 高品質のストレッチ ブロック転送では、場合によっては DrvStretchBlt で色を補間する必要があります。 DrvStretchBlt は、COLORADJUSTMENT 構造体を使用して、ビットが引き伸ばされる前にソース ビットマップに適用される色調整値を定義します。

DrvStretchBlt では、iMode パラメーターを使用して、ソース ピクセルを出力用に結合する方法を定義します。 特に、 iMode には HALFTONE オプションが用意されています。このオプションを使用すると、ドライバーは出力サーフェイスでピクセルのグループを使用して、出力の色または灰色のレベルを近似できます。 COLORADJUSTMENT 構造体への変更は、HALFTONE の iMode で次の DrvStretchBlt 呼び出しの後に、ドライバーに渡されます。 また、ドライバーが GDI ビットマップのハーフトニングを処理するために GDI を必要とする場合、ドライバーは DrvStretchBlt をフックし、iMode パラメーターを HALFTONE に設定し、それを EngStretchBlt に返します。

DrvStretchBltEngStretchBlt 関数の呼び出しをフックし、サポートしていない操作を行うように求められた場合、適切な関数でそれを処理できるように GDI に要求を返します。

DrvTransparentBlt

DrvTransparentBlt 関数は、転送先ビットマップの一部がコピー後に表示されたままになるように、ソース ビットマップを転送先ビットマップにコピーします。 この関数の iTransColor パラメーターで、透明にする色を指定します。

次の図は、透明な blt の例を示しています。

Diagram illustrating the process of transparent blt with source and destination bitmaps.

上の図は、左から右に、ソース ビットマップ、透明な blt の前のコピー先ビットマップ、および透明な blt の後のコピー先ビットマップを示しています。 iTransColor の色は、ソース ビットマップの中央の領域の、上下と両側にある 4 つの領域の色と同じであることに注意してください。

blt 操作が行われると、これらの 4 つの領域はコピーされないため、これらの領域の下のコピー先ビットマップ内のピクセル パターンが表示されたままになります。 他の領域 (四隅と中央) の下にあるピクセル パターンは、透明な blt で上書きされます。

これは、右端の画像で示されています。4 つの隅の文字 'M' の一部と中央が、ソース ビットマップの色で上書きされています。 iTransColor の色と同じ色の 4 つの領域の文字 'M' の一部は、引き続き表示されます。