cosmic_theme/
composite.rs

1use palette::Srgba;
2
3/// straight alpha "A over B" operator on non-linear srgba
4pub fn over<A: Into<Srgba>, B: Into<Srgba>>(a: A, b: B) -> Srgba {
5    let a = a.into();
6    let b = b.into();
7    let o_a = (alpha_over(a.alpha, b.alpha)).max(0.0).min(1.0);
8    let o_r = (c_over(a.red, b.red, a.alpha, b.alpha, o_a))
9        .max(0.0)
10        .min(1.0);
11    let o_g = (c_over(a.green, b.green, a.alpha, b.alpha, o_a))
12        .max(0.0)
13        .min(1.0);
14    let o_b = (c_over(a.blue, b.blue, a.alpha, b.alpha, o_a))
15        .max(0.0)
16        .min(1.0);
17
18    Srgba::new(o_r, o_g, o_b, o_a)
19}
20
21fn alpha_over(a: f32, b: f32) -> f32 {
22    a + b * (1.0 - a)
23}
24
25fn c_over(a: f32, b: f32, a_alpha: f32, b_alpha: f32, o_alpha: f32) -> f32 {
26    a * a_alpha + b * b_alpha * (1.0 - a_alpha) / o_alpha
27}