源码
rust
impl Alpha256 {
#[inline]
pub fn alpha_mul(&self, x: u32) -> u32 {
let mask = 0xFF00FF;
let src_rb = ((x & mask) * self.0) >> 8;
let src_ag = ((x >> 8) & mask) * self.0;
(src_rb & mask) | (src_ag & !mask)
}
}
代码分析
功能
-
输入:
- x:32 位像素值(通常格式为 0xAARRGGBB 或 0xRRGGBBAA)。
-
self:Alpha256 实例,存储 alpha 值(范围 [1, 256])。
-
输出:
- 返回 x 的每个颜色通道(R、G、B)乘以 alpha / 255 后的新像素值(A 通道未处理)。
计算步骤
- 掩码 mask = 0xFF00FF:
-
用于提取 红色(R) 和 蓝色(B) 通道(0x00RR00BB 格式)。
-
例如,x & mask 得到 0x00RR00BB,(x >> 8) & mask 得到 0x00AA00GG。
- 计算 src_rb(R 和 B 通道的 alpha 乘法):
rust
let src_rb = ((x & mask) * self.0) >> 8;
-
x & mask:提取 R 和 B 分量(0x00RR00BB)。
-
- self.0:乘以 alpha(范围 [1, 256])。
-
8:相当于除以 256(近似 alpha / 255)。
- 计算 src_ag(A 和 G 通道的 alpha 乘法):
rust
let src_ag = ((x >> 8) & mask) * self.0;
-
x >> 8:右移 8 位,使 A 和 G 通道对齐到低位(0x00AA00GG)。
-
& mask:再次提取 A 和 G(避免高位干扰)。
-
- self.0:乘以 alpha(但尚未右移 8 位)。
- 组合结果:
rust
(src_rb & mask) | (src_ag & !mask)
-
src_rb & mask:保留 R 和 B 通道(0x00RR00BB)。
-
src_ag & !mask:保留 A 和 G 通道的高 8 位(0xAA00GG00)。
|:合并 R+B 和 A+G,得到最终像素值。
- 为什么这样计算?
优化技巧
-
并行计算:
- 同时处理 R+B 和 A+G 通道,减少指令依赖,提高性能。
-
近似除以 255:
-
(x * alpha) >> 8 近似于 (x * alpha) / 255(因为 256 ≈ 255)。
-
误差极小(最大误差 0.4%),在图形处理中可以接受。
-
适用场景
-
图像合成(如 blend = src * alpha + dst * (1 - alpha))。
-
颜色调整(如调整透明度或亮度)。