【学Rust写CAD】36 颜色插值函数(alpha256.rs补充方法)

发布于:2025-04-09 ⋅ 阅读:(90) ⋅ 点赞:(0)

源码

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,表示混合后的颜色值。

计算步骤:

  1. self.alpha_mul_256(clip):
  • 调用 alpha_mul_256 方法,计算 (clip * alpha256) / 255,得到一个 Alpha256 类型的混合比例。

  • 这个比例用于后续的颜色插值。

  1. .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)(蓝色,完全不透明)。

计算过程:

  1. 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)。

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


网站公告

今日签到

点亮在社区的每一天
去签到