graphics/color/
rgba8888.rs1use 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}