cosmic_theme/
composite.rs
1use palette::Srgba;
2
3pub 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}