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