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
35
36
37
38
39
40
41
42
#[repr(C)]
#[derive(Default, Copy, Clone)]
struct Rgba {
    r: u8,
    g: u8,
    b: u8,
    a: u8,
}
#[repr(C)]
#[derive(Copy, Clone)]
union ColourData {
    rgba: std::mem::ManuallyDrop<Rgba>,
}

impl Default for ColourData {
    fn default() -> Self {
        ColourData {
            rgba: std::mem::ManuallyDrop::new(Rgba::default()),
        }
    }
}

#[repr(C)]
#[derive(Default, Clone, Copy)]
pub struct Colour {
    data: ColourData,
}

impl Colour {
    pub fn from_rgba(from: u32) -> Colour {
        Colour {
            data: ColourData {
                rgba: std::mem::ManuallyDrop::new(Rgba {
                    r: ((from & 0xFF000000) >> 24) as u8,
                    g: ((from & 0x00FF0000) >> 16) as u8,
                    b: ((from & 0x0000FF00) >> 8) as u8,
                    a: (from & 0x000000FF) as u8,
                }),
            },
        }
    }
}