1use std::fmt::Debug;
2
3#[repr(C)]
4#[derive(Default, Copy, Clone, Debug, PartialEq)]
5struct Rgba {
6 r: u8,
7 g: u8,
8 b: u8,
9 a: u8,
10}
11#[repr(C)]
12#[derive(Copy, Clone)]
13union ColourData {
14 rgba: std::mem::ManuallyDrop<Rgba>,
15}
16
17impl Default for ColourData {
18 fn default() -> Self {
19 ColourData {
20 rgba: std::mem::ManuallyDrop::new(Rgba::default()),
21 }
22 }
23}
24
25impl Debug for ColourData {
26 fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
27 f.debug_struct("Rgba")
28 .field("red", unsafe { &self.rgba.r })
29 .field("blue", unsafe { &self.rgba.g })
30 .field("green", unsafe { &self.rgba.b })
31 .field("alpha", unsafe { &self.rgba.a })
32 .finish()
33 }
34}
35
36impl PartialEq for ColourData {
37 fn eq(&self, other: &Self) -> bool {
38 unsafe { self.rgba == other.rgba }
39 }
40}
41
42#[repr(C)]
43#[derive(Default, Clone, Copy, Debug, PartialEq)]
44pub struct Colour {
45 data: ColourData,
46}
47
48impl Colour {
49 pub fn from_rgba(from: u32) -> Colour {
50 Colour {
51 data: ColourData {
52 rgba: std::mem::ManuallyDrop::new(Rgba {
53 r: ((from & 0xFF000000) >> 24) as u8,
54 g: ((from & 0x00FF0000) >> 16) as u8,
55 b: ((from & 0x0000FF00) >> 8) as u8,
56 a: (from & 0x000000FF) as u8,
57 }),
58 },
59 }
60 }
61
62 pub fn from_argb(from: u32) -> Colour {
63 Colour {
64 data: ColourData {
65 rgba: std::mem::ManuallyDrop::new(Rgba {
66 a: ((from & 0xFF000000) >> 24) as u8,
67 r: ((from & 0x00FF0000) >> 16) as u8,
68 g: ((from & 0x0000FF00) >> 8) as u8,
69 b: (from & 0x000000FF) as u8,
70 }),
71 },
72 }
73 }
74
75 pub fn rgba(&self) -> u32 {
76 unsafe {
77 (((self.data.rgba.r as u32) << 24) & 0xFF000000)
78 | (((self.data.rgba.g as u32) << 16) & 0x00FF0000)
79 | (((self.data.rgba.b as u32) << 8) & 0x0000FF00)
80 | ((self.data.rgba.a as u32) & 0x000000FF)
81 }
82 }
83
84 pub fn argb(&self) -> u32 {
85 unsafe {
86 (((self.data.rgba.a as u32) << 24) & 0xFF000000)
87 | (((self.data.rgba.r as u32) << 16) & 0x00FF0000)
88 | (((self.data.rgba.g as u32) << 8) & 0x0000FF00)
89 | ((self.data.rgba.b as u32) & 0x000000FF)
90 }
91 }
92}