共用方式為


DrvAlphaBlend 函式 (winddi.h)

DrvAlphaBlend 函式提供具有 Alpha 混合的位區塊傳輸功能。

語法

BOOL DrvAlphaBlend(
  [in, out]      SURFOBJ  *psoDest,
  [in]           SURFOBJ  *psoSrc,
  [in]           CLIPOBJ  *pco,
  [in, optional] XLATEOBJ *pxlo,
  [in]           RECTL    *prclDest,
  [in]           RECTL    *prclSrc,
  [in]           BLENDOBJ *pBlendObj
);

參數

[in, out] psoDest

可識別要繪製之表面的 SURFOBJ 結構的指標。

[in] psoSrc

識別來源介面之 SURFOBJ 結構的指標。

[in] pco

CLIPOBJ 結構的指標。 提供CLIPOBJ_Xxx 服務例程,以將 剪輯區域 列舉為一組矩形。 此列舉會限制已修改之目的地的區域。 可能的話,GDI 可簡化涉及的裁剪。 不過,不同於DrvBitBlt,DrvAlphaBlend可能會以單一矩形呼叫,以避免裁剪輸出時發生捨入錯誤。

[in, optional] pxlo

XLATEOBJ 結構的指標,指定來源和目的地介面之間應該如何轉譯色彩索引。 如果 pxloNULL,則不需要翻譯。

如果來源表面是調色盤管理的,其色彩會以索引表示為 RGB 色彩值的查閱表格。 在此情況下,您可以查詢 XLATEOBJ 的轉譯向量,讓設備驅動器快速將任何來源索引轉譯為目的地的色彩索引。

例如,來源是 RGB,但目的地是調色盤管理的比較複雜。 在此情況下,必須在目的地選擇區中找到最接近每個來源 RGB 值的相符專案。 驅動程式可以呼叫 XLATEOBJ_iXlate 服務例程來執行此比對作業。

[in] prclDest

RECTL 結構的指標,定義要修改的矩形區域。 這個矩形是在目的地介面的座標系統中指定,並由兩個點定義:左上方和右下角。 定義矩形的兩個點一律會妥善排序。 矩形是右下角獨佔;也就是說,其下邊緣和右邊緣不是混合的一部分。

在寫入圖元時,驅動程式應該小心執行適當的裁剪,因為指定的矩形可能會超過目的地介面。

DrvAlphaBlend 永遠不會以空的目的地矩形呼叫。

[in] prclSrc

RECTL 結構的指標,定義要複製的區域。 這個矩形是在來源介面的座標系統中指定,並由兩個點定義:左上方和右下。 定義矩形的兩個點一律會妥善排序。 矩形是右下角獨佔;也就是說,其下邊緣和右邊緣不是混合的一部分。

來源矩形永遠不會超過來源表面的界限,因此永遠不會超過來源介面。

DrvAlphaBlend 永遠不會使用空的來源矩形呼叫。

對應是由 中國lSrc中國lDest 所定義。 在中國lDest中國lSrc 中指定的點位於整數座標上,其對應至圖元中心。 由兩個這類點定義的矩形會被視為具有兩個頂點的幾何矩形,其座標為指定點,但會從每個座標減去0.5。 (POINTL 結構是指定這些小數座標頂點的簡短表示法。)

[in] 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 完全不透明。

傳回值

DrvAlphaBlend 會在成功時傳回 TRUE 。 否則,它會報告錯誤並傳回 FALSE

備註

驅動程式可以支援在下列表面之間搭配 Alpha 混合的位區塊傳輸:

  • 從一個 裝置管理的介面 到另一個受裝置管理的介面。
  • 從一個 GDI 管理的標準格式點陣圖到另一個 GDI 管理的標準格式點陣圖。
  • 從一個裝置管理的介面到 GDI 管理的介面,反之亦然。
驅動程式可以標點對 EngAlphaBlend 的呼叫。

驅動程序永遠不會在相同的介面上使用重疊的來源和目的地矩形呼叫。

AC_SRC_OVER混合函式的三個可能案例如下:

  • 來源位圖沒有個別圖元 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);
    
  • 來源位圖具有每個圖元的 Alpha 值, (AC_SRC_ALPHA 設定為) ,且 未使用 SourceConstantAlpha (它設定為 255) 。 混合的計算方式如下:
    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);
    
  • 來源位圖具有每個圖元的 Alpha 值, (AC_SRC_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);
    
Round (x) 函式會四捨五入為最接近的整數,計算為:
Trunc(x + 0.5);

DrvAlphaBlend 可以在圖形驅動程式中選擇性地實作。 您可以提供它來處理某種類型的 Alpha 混合,例如來源和目的地表面為相同格式的混合,而且不包含 Alpha 色板。

硬體實作可以在混合作業中使用浮點或固定點。 相容性測試將考慮結果中的一些數值錯誤;如需允許的最大錯誤相關信息,請參閱 Display Drivers 中的特殊效果 。 使用固定點時, x/255 一詞可接受的近似值 是 (x*257) /65536。 合併四捨五入,表達式:

((255 - Src.Alpha) * Dst.Red) / 255

然後可以近似為:

temp = ((255 - Src.Alpha) * Dst.Red) + 128;
result = (temp + (temp >> 8)) >> 8;

驅動程式會在呼叫 EngAssociateSurface 時設定HOOK_ALPHABLEND旗標,以攔截 DrvAlphaBlend。 如果驅動程式已攔截 DrvAlphaBlend ,並呼叫 以執行不支援的作業,則驅動程式應該透過在 呼叫EngAlphaBlend時,將數據指向 GDI 來處理作業。

規格需求

需求
目標平台 桌面
標頭 winddi.h (包括 Winddi.h)

另請參閱

DrvBitBlt

DrvPlgBlt

DrvStretchBlt

DrvStretchBltROP

DrvTransparentBlt

EngAlphaBlend

EngBitBlt

EngPlgBlt

EngStretchBlt

EngStretchBltROP

EngTransparentBlt