複製點陣圖

Bit Block transfer (BitBlt) 函式,由驅動程式將位區塊從一個表面複製到另一個介面。 這些函式包括:

另外還有一個名為 DrvSaveScreenBits的 display-driver 特定 BitBlt 函式。

如果要繪製的介面是 裝置管理的介面 或點陣圖,驅動程式必須支援最低層級的位區塊傳輸函式。 如果介面是 GDI 管理的標準格式點陣圖,GDI 只會處理驅動程式未連結的作業。

DrvBitBlt

DrvBitBlt函式提供一般位區塊傳輸功能。 如果使用來源, DrvBitBlt 會將來源矩形的內容複寫到目的地矩形。 (此函式的 pptlSrc 參數會識別 rectangle 的左上角。) 如果沒有來源矩形, DrvBitBlt 會忽略 pptlSrc 參數。 要修改的介面目的矩形是由兩個整數點所定義,也就是左上角和右下角。 矩形的 右下角為獨佔;矩形的下邊緣和右邊緣不是區塊傳輸的一部分。 無法使用空的目的地矩形呼叫DrvBitBlt。 矩形的兩個點一律會妥善排序;也就是說,右下角的兩個座標都大於其左上方點的對應座標。

DrvBitBlt 會處理不同的 ROP,並根據裝置執行優化。 在某些情況下,如果 ROP 是純色,則可以執行填滿而非 BitBlt。 對於不支援 ROP 的裝置或驅動程式,例如 Pscript 驅動程式,顯示和列印的影像之間可能會不一致。

您可以選擇性地遮罩 DrvBitBlt 所處理的區塊傳輸,並涉及色彩索引轉譯。 轉譯向量可協助調色盤的色彩索引轉譯。 傳輸可能需要由顯示驅動程式使用一系列裁剪矩形來任意裁剪。 GDI 會提供所需的區域和資訊。

實作 DrvBitBlt 代表為沒有標準格式 框架緩衝區之點陣顯示驅動程式撰寫驅動程式所涉及的重要部分。 Windows 驅動程式套件 (WDK) 提供支援平面裝置基本功能的範例程式碼。 針對其他裝置實作 DrvBitBlt 可能較不復雜。

DrvCopyBits

DrvCopyBits函式是由 GDI 從模擬作業呼叫,以在裝置管理的點陣表面與 GDI 標準格式點陣圖之間進行轉譯。 DrvCopyBits 提供 SRCCOPY (0xCCCC) ROP 位區塊傳輸的快速路徑。

對於具有裝置管理的點陣圖或點陣表面的圖形驅動程式,此函式必須將驅動程式介面轉譯成任何標準格式點陣圖,以及從任何標準格式點陣圖轉譯。 DrvCopyBits 永遠不會使用空的目的地矩形呼叫,而且目的地矩形的兩個點一律會妥善排序。 此呼叫的需求與 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) 反轉角。 函式參數中指定的點位於對應至圖元中心的整數座標上。 由兩個這類點定義的矩形會被視為幾何,其中兩個頂點的座標是指定的點,但會從每個座標減去 0.5。 (GDI POINTL 結構會使用速記標記法來指定這些小數座標頂點。) 請注意,任何這類矩形的邊緣永遠不會與圖元交集,但繞著一組圖元。 矩形內的圖元是右下角獨佔矩形的一般圖元。

定義來源矩形角落的點會經過妥善排序; DrvStretchBlt 無法指定空的來源矩形。 不同于 DrvBitBlt,您可以使用單一裁剪矩形呼叫 DrvStretchBlt ,以避免裁剪輸出時發生舍入錯誤。

目的矩形是由兩個整數點所定義。 這些點的順序不正確,這表示第二個點的座標不一定大於第一個點的座標。 這些點描述的來源矩形不包含下邊緣和右邊緣。 由於矩形的排序不正確, DrvStretchBlt 有時必須在兩個 x 座標和/或兩個 y 座標中執行反轉。 (驅動程式不得嘗試讀取不在來源表面) 的圖元。 無法使用空的目的地矩形呼叫DrvStretchBlt

針對色彩轉譯,DrvStretchBlt會提供XLATEOBJ結構的指標pxlo,用來在來源和目的地表面之間進行轉譯。 您可以查詢 XLATEOBJ 結構,以尋找任何來源索引的目的地索引。 對於高品質的延展區塊傳輸,在某些情況下,需要 DrvStretchBlt 來插補色彩。 DrvStretchBlt 也會使用 COLORADJUSTMENT 結構來定義要套用至來源點陣圖的色彩調整值,然後再縮放點陣圖。

DrvStretchBlt 會使用 iMode 參數來定義如何合併來源圖元以進行輸出。 特別是, iMode 提供 HALFTONE 選項,可讓驅動程式在輸出介面中使用圖元群組,以近似輸出的色彩或灰色層級。 COLORADJUSTMENT 結構的變更會在下一次使用iMode為 HALFTONE 的DrvStretchBlt呼叫之後傳遞至驅動程式。 此外,如果驅動程式要求 GDI 處理 GDI 點陣圖的半形,驅動程式會勾出 DrvStretchBlt、將 iMode 參數設定為 HALFTONE,並在 EngStretchBlt 中傳回它。

如果 DrvStretchBlt 已攔截 對 EngStretchBlt 函式的呼叫,並要求執行不支援的內容,它會將要求傳回 GDI,讓適當的函式可以處理它。

DrvTransparentBlt

DrvTransparentBlt函式會使來源點陣圖複製到目的地點陣圖上,讓目的地點陣圖的部分在複製之後保持可見。 此函式的 iTransColor 參數會指定要變成透明的色彩。

下圖描述透明 blt 的範例。

說明具有來源和目的地點陣圖之透明 blt 程式的圖表。

從左至右,上圖顯示來源點陣圖、透明 blt 之前的目的地點陣圖,以及透明 blt 之後的目的地點陣圖。 請注意, iTransColor 中的色彩與上述四個區域中的色彩相同,以及來源點陣圖中中央區域的任一端。

進行 blt 作業時,不會複製這四個區域,這會導致這些區域下目的地點陣圖中的任何圖元圖樣維持可見狀態。 其他區域下的任何圖元圖樣 (四個角落,而中央) 則會在透明 blt 中覆寫。

這在最右邊的影像中說明:四個角落的字母 'M' 部分,而中心會以來源點陣圖中的色彩覆寫。 字母 'M' 的部分在四個區域下,其色彩與 iTransColor 中的色彩相同,仍可保持可見。