omp_gdk/types/
colour.rs

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}