源碼
pub fn alpha_lerp(self,src: Argb, dst: Argb, clip: u32) -> Argb {self.alpha_mul_256(clip).lerp(src, dst)}
這個函數 alpha_lerp 是一個顏色插值(線性插值,lerp)函數,它結合了透明度混合(alpha_mul_256)和顏色插值(lerp),用于計算兩個顏色 src 和 dst 的混合結果,其中混合比例由 self(透明度)和 clip(裁剪值)共同決定。
參數:
-
self:一個 Alpha256 類型的值,表示透明度 alpha256,范圍是 [0, 256]。
-
src:源顏色,類型為 Argb(通常表示帶 Alpha 通道的 RGBA 顏色)。
-
dst:目標顏色,類型為 Argb。
-
clip:一個 u32 值,用于調整混合比例,范圍是 [0, 255] 。
返回值:
- 返回一個 Argb,表示混合后的顏色值。
計算步驟:
- self.alpha_mul_256(clip):
-
調用 alpha_mul_256 方法,計算 (clip * alpha256) / 255,得到一個 Alpha256 類型的混合比例。
-
這個比例用于后續的顏色插值。
- .lerp(src, dst):
-
使用上一步計算的比例,對 src 和 dst 進行線性插值(lerp)。
-
lerp 的公式通常是 src * (1 - t) + dst * t,其中 t 是混合比例(Alpha256 的值歸一化到 [0, 1])。
作用:
-
這個函數主要用于顏色混合,例如:
-
在圖形渲染中,將一個半透明的顏色 src 疊加到背景顏色 dst 上。
-
在 UI 繪制中,實現漸變或淡入淡出效果。
-
-
clip 參數可以進一步控制混合比例(例如,用于裁剪效果)。
-
self 用于遮罩效果
示例:
假設:
-
self.0 = 128(alpha256 = 128,半透明)。
-
clip = 255(最大值)。
-
src = Argb(0xFFFF0000)(紅色,完全不透明)。
-
dst = Argb(0xFF0000FF)(藍色,完全不透明)。
計算過程:
- alpha_mul_256(255):
-
prod = 255 * 128 = 32640。
-
(prod + (prod >> 8)) >> 8 = (32640 + 127) >> 8 = 32767 >> 8 = 127。
-
返回 Alpha256(127)(即 t ≈ 127 / 256 ≈ 0.496)。
- lerp(src, dst):
-
對 src 和 dst 的每個通道(A、R、G、B)進行插值:
- 紅色通道:0xFF * (1 - 0.496) + 0x00 * 0.496 ≈ 0x80。
-
藍色通道:0x00 * (1 - 0.496) + 0xFF * 0.496 ≈ 0x80。
-
最終混合顏色可能是 Argb(0xFF808080)(灰色)。
總結:
alpha_lerp 是一個高效的透明度混合函數,結合了 alpha_mul_256 和 lerp,適用于圖形渲染、顏色混合等場景。它通過整數運算避免了浮點計算,同時保持較高的精度。