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 管理的介面,反之亦然。
驅動程序絕對不應該呼叫具有相同介面上重疊來源和目的地矩形的 EngAlphaBlend

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);
    
如果驅動程式已連結DrvAlphaBlend,而且呼叫它來執行不支援的內容,驅動程式應該呼叫EngAlphaBlend

規格需求

需求
最低支援的用戶端 適用於 Windows 2000 和更新版本的 Windows 作業系統。
目標平台 Universal
標頭 winddi.h (包含Winddi.h)
程式庫 Win32k.lib
Dll Win32k.sys

另請參閱

DrvAlphaBlend

DrvBitBlt

DrvPlgBlt

DrvStretchBlt

DrvStretchBltROP

DrvTransparentBlt

EngAssociateSurface

EngBitBlt

EngPlgBlt

EngStretchBlt

EngStretchBltROP

EngTransparentBlt