EngAlphaBlend 函式 (winddi.h)
EngAlphaBlend 函式提供具有 Alpha 混合的位區塊傳輸功能。
語法
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 結構的指標,定義要修改的矩形區域。 這個矩形是在目的地介面的座標系統中指定,並由兩個點定義:左上方和右下角。 定義矩形的兩個點一律會妥善排序。
矩形的右下角是獨佔的;也就是說,其下邊緣和右邊緣不是混合的一部分。
指定的矩形可以超過目的介面;GDI 會在執行時執行適當的裁剪。
永遠不能使用空的目的地矩形來呼叫 EngAlphaBlend。
prclSrc
RECTL 結構的指標,定義要複製的區域。 這個矩形是在來源介面的座標系統中指定,並由兩個點定義:左上方和右下角。 定義矩形的兩個點一律會妥善排序。
矩形的右下角是獨佔的;也就是說,其下邊緣和右邊緣不是混合的一部分。
來源矩形絕對不能超過來源表面的界限,因此絕不會過度加總來源表面。
永遠不能使用空的來源矩形呼叫 EngAlphaBlend。
對應是由 中國lSrc 和 中國lDest 所定義。 中國Dest 和中國lSrc 中指定的點位於對應於圖元中心的整數座標上。 由兩個這類點定義的矩形會被視為具有兩個頂點的幾何矩形,其座標是指定的點,但每個座標都會減去0.5。 (POINTL 結構是用來指定這些小數座標頂點的速記表示法。)
pBlendObj
BLENDOBJ 結構的指標,描述在來源和目的地介面之間執行的混合作業。 這個結構是 BLENDFUNCTION 結構的包裝函式,其中包含 XLATEOBJ 結構中無法使用的必要來源和目的地格式資訊。 BLENDFUNCTION 會在 Microsoft Windows SDK 檔中宣告。 其成員的定義如下:
BlendOp 會定義要執行的混合作業。 目前此值必須AC_SRC_OVER,這表示來源位圖會根據來源圖元的Alpha值放置在目的地點陣圖上。 此混合作業應該處理三種可能的情況。 這些會在此參考頁面的一節中說明。
BlendFlags 已保留,且目前設定為零。
SourceConstantAlpha 會定義要套用至整個來源表面的常數混合因數。 此值在 [0,255] 的範圍內,其中0完全透明,255 完全不透明。
AlphaFormat 會定義介面是否假設有Alpha色板。 這個成員可以選擇性地設定為下列值:
AC_SRC_ALPHA
來源表面可以假設為預乘 Alpha 32bpp “BGRA” 格式;也就是說,介面類型是BMF_32BPP,而且調色盤類型是BI_RGB。 Alpha元件是 [0,255] 範圍內的整數,其中 0 完全透明,255 完全不透明。
傳回值
EngAlphaBlend 會在成功時傳回 TRUE 。 如果發生錯誤,它會傳回 FALSE 並報告錯誤碼。
備註
下列表面支援具有 Alpha 混合的位區塊傳輸:
- 從一個 裝置管理的介面 到另一個裝置管理的介面。
- 從一個 GDI 管理的標準格式點陣圖到另一個 GDI 管理的標準格式點陣圖。
- 從一個裝置管理的介面到 GDI 管理的介面,反之亦然。
AC_SRC_OVER blend 函式的三個可能案例如下:
- 來源位圖沒有設定每個圖元 alpha (AC_SRC_ALPHA) ,因此會根據 SourceConstantAlpha 中指定的固定來源 Alpha 值,將混合套用至圖元的色彩色板,如下所示:
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) 設定每圖元 Alpha 值,而且不會在設定為 255) (使用 SourceConstantAlpha 。 混合的計算方式如下:
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) 設定每個圖元的 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);
規格需求
需求 | 值 |
---|---|
最低支援的用戶端 | 適用於 Windows 2000 和更新版本的 Windows 作業系統。 |
目標平台 | Universal |
標頭 | winddi.h (包含Winddi.h) |
程式庫 | Win32k.lib |
Dll | Win32k.sys |