graphics/color/
rgb565.rs

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; // 5 bits
43        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; // 6 bits
49        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; // 5 bits
55        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}