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