graphics/color/
rgba8888.rs

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