graphics/color/
rgb565.rs

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; // 5 bits
45        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; // 6 bits
51        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; // 5 bits
57        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}