1use core::fmt::Debug;
2
3use super::{ColorARGB8888, ColorRGBA8888};
4
5#[derive(Clone, Copy, PartialEq, Eq)]
6#[repr(transparent)]
7pub struct ColorRGB565(u16);
8
9impl Debug for ColorRGB565 {
10 fn fmt(&self, formatter: &mut core::fmt::Formatter<'_>) -> core::fmt::Result {
11 formatter
12 .debug_struct("Color_RGB565_type")
13 .field("Red", &self.get_red())
14 .field("Green", &self.get_green())
15 .field("Blue", &self.get_blue())
16 .finish()
17 }
18}
19
20impl ColorRGB565 {
21 pub const fn new(red: u8, green: u8, blue: u8) -> Self {
22 Self(0).set_red(red).set_green(green).set_blue(blue)
23 }
24
25 pub const fn as_u16(self) -> u16 {
26 self.0
27 }
28
29 pub const fn get_red(&self) -> u8 {
30 ((self.0 >> 11) & 0b11111) as u8
31 }
32
33 pub const fn get_green(&self) -> u8 {
34 ((self.0 >> 5) & 0b111111) as u8
35 }
36
37 pub const fn get_blue(&self) -> u8 {
38 (self.0 & 0b11111) as u8
39 }
40
41 pub const fn set_red(mut self, value: u8) -> Self {
42 let value = value & 0b11111; self.0 = (self.0 & !(0b11111 << 11)) | ((value as u16) << 11);
44 self
45 }
46
47 pub const fn set_green(mut self, value: u8) -> Self {
48 let value = value & 0b111111; self.0 = (self.0 & !(0b111111 << 5)) | ((value as u16) << 5);
50 self
51 }
52
53 pub const fn set_blue(mut self, value: u8) -> Self {
54 let value = value & 0b11111; self.0 = (self.0 & !0b11111) | (value as u16);
56 self
57 }
58}
59
60impl From<ColorRGB565> for u16 {
61 fn from(value: ColorRGB565) -> u16 {
62 value.0
63 }
64}
65
66impl From<u16> for ColorRGB565 {
67 fn from(value: u16) -> Self {
68 Self(value)
69 }
70}
71
72impl From<ColorARGB8888> for ColorRGB565 {
73 fn from(value: ColorARGB8888) -> Self {
74 Self::new(
75 value.get_red() >> 3,
76 value.get_green() >> 2,
77 value.get_blue() >> 3,
78 )
79 }
80}
81
82impl From<ColorRGBA8888> for ColorRGB565 {
83 fn from(value: ColorRGBA8888) -> Self {
84 Self::new(
85 value.get_red() >> 3,
86 value.get_green() >> 2,
87 value.get_blue() >> 3,
88 )
89 }
90}
91
92#[cfg(test)]
93mod tests {
94 use super::*;
95
96 #[test]
97 fn test_rgb565() {
98 let color = ColorRGB565::new(255, 255, 255);
99 assert_eq!(color.get_red(), 0b11111);
100 assert_eq!(color.get_green(), 0b111111);
101 assert_eq!(color.get_blue(), 0b11111);
102 assert_eq!(color.0, 0xFFFF);
103
104 let color = ColorRGB565::new(255, 0, 0);
105 assert_eq!(color.get_red(), 0b11111);
106 assert_eq!(color.get_green(), 0);
107 assert_eq!(color.get_blue(), 0);
108 assert_eq!(color.0, 0xF800);
109
110 let color = ColorRGB565::new(0, 255, 0);
111 assert_eq!(color.get_red(), 0);
112 assert_eq!(color.get_green(), 0b111111);
113 assert_eq!(color.get_blue(), 0);
114 assert_eq!(color.0, 0x07E0);
115
116 let color = ColorRGB565::new(0, 0, 255);
117 assert_eq!(color.get_red(), 0);
118 assert_eq!(color.get_green(), 0);
119 assert_eq!(color.get_blue(), 0b11111);
120 assert_eq!(color.0, 0x00_1F);
121
122 let color = ColorRGB565::new(0, 0, 0);
123 assert_eq!(color.get_red(), 0);
124 assert_eq!(color.get_green(), 0);
125 assert_eq!(color.get_blue(), 0);
126 assert_eq!(color.0, 0);
127 }
128}