ecolor/
hsva_gamma.rs

1use crate::{gamma_from_linear, linear_from_gamma, Color32, Hsva, Rgba};
2
3/// Like Hsva but with the `v` value (brightness) being gamma corrected
4/// so that it is somewhat perceptually even.
5#[derive(Clone, Copy, Debug, Default, PartialEq)]
6pub struct HsvaGamma {
7    /// hue 0-1
8    pub h: f32,
9
10    /// saturation 0-1
11    pub s: f32,
12
13    /// value 0-1, in gamma-space (~perceptually even)
14    pub v: f32,
15
16    /// alpha 0-1. A negative value signifies an additive color (and alpha is ignored).
17    pub a: f32,
18}
19
20impl From<HsvaGamma> for Rgba {
21    fn from(hsvag: HsvaGamma) -> Self {
22        Hsva::from(hsvag).into()
23    }
24}
25
26impl From<HsvaGamma> for Color32 {
27    fn from(hsvag: HsvaGamma) -> Self {
28        Rgba::from(hsvag).into()
29    }
30}
31
32impl From<HsvaGamma> for Hsva {
33    fn from(hsvag: HsvaGamma) -> Self {
34        let HsvaGamma { h, s, v, a } = hsvag;
35        Self {
36            h,
37            s,
38            v: linear_from_gamma(v),
39            a,
40        }
41    }
42}
43
44impl From<Rgba> for HsvaGamma {
45    fn from(rgba: Rgba) -> Self {
46        Hsva::from(rgba).into()
47    }
48}
49
50impl From<Color32> for HsvaGamma {
51    fn from(srgba: Color32) -> Self {
52        Hsva::from(srgba).into()
53    }
54}
55
56impl From<Hsva> for HsvaGamma {
57    fn from(hsva: Hsva) -> Self {
58        let Hsva { h, s, v, a } = hsva;
59        Self {
60            h,
61            s,
62            v: gamma_from_linear(v),
63            a,
64        }
65    }
66}