源码
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,适用于图形渲染、颜色混合等场景。它通过整数运算避免了浮点计算,同时保持较高的精度。