1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
pub trait Color {
    fn to_rgba(&self) -> (u8, u8, u8, u8);
    fn from_rgba(r: u8, g: u8, b: u8, a: u8) -> Self;
}

pub type Color16 = u16;
pub type Color32 = u32;

impl Color for Color16 {
    fn to_rgba(&self) -> (u8, u8, u8, u8) {
        let r = (((*self >> 10) & 0x1F) * 0xFF / 0x1F) as u8;
        let g = (((*self >> 5) & 0x1F) * 0xFF / 0x1F) as u8;
        let b = ((*self & 0x1F) * 0xFF / 0x1F) as u8;
        (r, g, b, 255)
    }

    fn from_rgba(r: u8, g: u8, b: u8, _a: u8) -> Color16 {
        ((r as u16 >> 3) << 10) + ((g as u16 >> 3) << 5) + (b as u16 >> 3)
    }
}

impl Color for Color32 {
    fn to_rgba(&self) -> (u8, u8, u8, u8) {
        let r = ((*self >> 24) & 0xFF) as u8;
        let g = ((*self >> 16) & 0xFF) as u8;
        let b = ((*self >> 8) & 0xFF) as u8;
        let a = (*self & 0xFF) as u8;
        (r, g, b, a)
    }

    fn from_rgba(r: u8, g: u8, b: u8, a: u8) -> Color32 {
        ((r as u32) << 24) + ((g as u32) << 16) + ((b as u32) << 8) + (a as u32)
    }
}