graphics/color/
argb8888.rs

1use core::fmt::Debug;
2
3use super::{ColorRGB565, ColorRGBA8888};
4
5#[derive(Clone, Copy, PartialEq, Eq)]
6#[repr(transparent)]
7pub struct ColorARGB8888(u32);
8
9impl Debug for ColorARGB8888 {
10    fn fmt(&self, formatter: &mut core::fmt::Formatter<'_>) -> core::fmt::Result {
11        formatter
12            .debug_struct("Color_ARGB8888_type")
13            .field("Alpha", &self.get_alpha())
14            .field("Red", &self.get_red())
15            .field("Green", &self.get_green())
16            .field("Blue", &self.get_blue())
17            .finish()
18    }
19}
20
21impl ColorARGB8888 {
22    pub const fn new(alpha: u8, red: u8, green: u8, blue: u8) -> Self {
23        Self(0)
24            .set_alpha(alpha)
25            .set_red(red)
26            .set_green(green)
27            .set_blue(blue)
28    }
29
30    pub const fn from_rgb565(value: ColorRGB565) -> Self {
31        Self::new(
32            0xFF,
33            value.get_red() << 3 | value.get_red() >> 2,
34            value.get_green() << 2 | value.get_green() >> 4,
35            value.get_blue() << 3 | value.get_blue() >> 2,
36        )
37    }
38
39    pub const fn as_u32(self) -> u32 {
40        self.0
41    }
42
43    pub const fn get_alpha(&self) -> u8 {
44        ((self.0 >> 24) & 0b1111_1111) as u8
45    }
46
47    pub const fn get_red(&self) -> u8 {
48        ((self.0 >> 16) & 0b1111_1111) as u8
49    }
50
51    pub const fn get_green(&self) -> u8 {
52        ((self.0 >> 8) & 0b1111_1111) as u8
53    }
54
55    pub const fn get_blue(&self) -> u8 {
56        ((self.0) & 0b1111_1111) as u8
57    }
58
59    pub const fn set_alpha(mut self, value: u8) -> Self {
60        self.0 = (self.0 & !(0b1111_1111 << 24)) | ((value as u32) << 24);
61        self
62    }
63
64    pub const fn set_red(mut self, value: u8) -> Self {
65        self.0 = (self.0 & 0xFF00_FFFF) | ((value as u32) << 16);
66        self
67    }
68
69    pub const fn set_green(mut self, value: u8) -> Self {
70        self.0 = (self.0 & 0xFFFF_00FF) | ((value as u32) << 8);
71        self
72    }
73
74    pub const fn set_blue(mut self, value: u8) -> Self {
75        self.0 = (self.0 & 0xFFFF_FF00) | (value as u32);
76        self
77    }
78}
79
80impl From<ColorARGB8888> for u32 {
81    fn from(value: ColorARGB8888) -> u32 {
82        value.0
83    }
84}
85
86impl From<u32> for ColorARGB8888 {
87    fn from(value: u32) -> Self {
88        Self(value)
89    }
90}
91
92impl From<ColorRGB565> for ColorARGB8888 {
93    fn from(value: ColorRGB565) -> Self {
94        Self::from_rgb565(value)
95    }
96}
97
98impl From<ColorRGBA8888> for ColorARGB8888 {
99    fn from(value: ColorRGBA8888) -> Self {
100        Self::new(
101            value.get_alpha(),
102            value.get_red(),
103            value.get_green(),
104            value.get_blue(),
105        )
106    }
107}
108
109#[cfg(test)]
110mod tests {
111    use super::*;
112
113    #[test]
114    fn test_argb8888() {
115        let color = ColorARGB8888::new(255, 255, 255, 255);
116        assert_eq!(color.get_alpha(), 0xFF);
117        assert_eq!(color.get_red(), 0xFF);
118        assert_eq!(color.get_green(), 0xFF);
119        assert_eq!(color.get_blue(), 0xFF);
120        assert_eq!(color.0, 0xFFFF_FFFF);
121
122        let color = ColorARGB8888::new(255, 0, 0, 0);
123        assert_eq!(color.get_alpha(), 0xFF);
124        assert_eq!(color.get_red(), 0);
125        assert_eq!(color.get_green(), 0);
126        assert_eq!(color.get_blue(), 0);
127        assert_eq!(color.0, 0xFF00_0000);
128
129        let color = ColorARGB8888::new(0, 255, 0, 0);
130        assert_eq!(color.get_alpha(), 0);
131        assert_eq!(color.get_red(), 0xFF);
132        assert_eq!(color.get_green(), 0);
133        assert_eq!(color.get_blue(), 0);
134        assert_eq!(color.0, 0x00FF_0000);
135
136        let color = ColorARGB8888::new(0, 0, 255, 0);
137        assert_eq!(color.get_alpha(), 0);
138        assert_eq!(color.get_red(), 0);
139        assert_eq!(color.get_green(), 0xFF);
140        assert_eq!(color.get_blue(), 0);
141        assert_eq!(color.0, 0x0000_FF00);
142
143        let color = ColorARGB8888::new(0, 0, 0, 255);
144        assert_eq!(color.get_alpha(), 0);
145        assert_eq!(color.get_red(), 0);
146        assert_eq!(color.get_green(), 0);
147        assert_eq!(color.get_blue(), 0xFF);
148        assert_eq!(color.0, 0x0000_00FF);
149
150        let color = ColorARGB8888::new(0, 0, 0, 0);
151        assert_eq!(color.get_alpha(), 0);
152        assert_eq!(color.get_red(), 0);
153        assert_eq!(color.get_green(), 0);
154        assert_eq!(color.get_blue(), 0);
155        assert_eq!(color.0, 0);
156    }
157}