#[repr(C)]
#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
#[derive(Copy, Clone, Debug, PartialEq, Default)]
pub struct Color {
pub r: u8,
pub g: u8,
pub b: u8,
pub a: u8,
}
impl Color {
pub const TRANSPARENT: Self = Self {
r: 0,
g: 0,
b: 0,
a: 0,
};
pub const BLACK: Self = Self {
r: 0,
g: 0,
b: 0,
a: 255,
};
pub const GOLD: Self = Self {
r: 219,
g: 172,
b: 52,
a: 255,
};
pub const WHITE: Self = Self {
r: 255,
g: 255,
b: 255,
a: 255,
};
pub const RED: Self = Self {
r: 255,
g: 0,
b: 0,
a: 255,
};
pub const LIME: Self = Self {
r: 0,
g: 255,
b: 0,
a: 255,
};
pub const BLUE: Self = Self {
r: 0,
g: 0,
b: 255,
a: 255,
};
pub const SILVER: Self = Self {
r: 191,
g: 191,
b: 191,
a: 255,
};
pub const GRAY: Self = Self {
r: 127,
g: 127,
b: 127,
a: 255,
};
pub const BROWN: Self = Self {
r: 140,
g: 68,
b: 17,
a: 255,
};
pub const PURPLE: Self = Self {
r: 127,
g: 0,
b: 127,
a: 255,
};
pub const PINK: Self = Self {
r: 255,
g: 0,
b: 255,
a: 255,
};
pub const GREEN: Self = Self {
r: 0,
g: 127,
b: 0,
a: 255,
};
pub const YELLOW: Self = Self {
r: 255,
g: 255,
b: 0,
a: 255,
};
pub const NAVY: Self = Self {
r: 0,
g: 0,
b: 127,
a: 255,
};
pub const CYAN: Self = Self {
r: 0,
g: 255,
b: 255,
a: 255,
};
pub const ORANGE: Self = Self {
r: 255,
g: 165,
b: 0,
a: 255,
};
pub const fn new(r: u8, g: u8, b: u8, a: u8) -> Self {
return Self { r, g, b, a };
}
pub fn set(&mut self, r: u8, g: u8, b: u8, a: u8) {
self.r = r;
self.g = g;
self.b = b;
self.a = a;
}
pub fn invert(&mut self) {
self.r = u8::MAX - self.r;
self.g = u8::MAX - self.g;
self.b = u8::MAX - self.b;
}
}
impl Into<wgpu::Color> for Color {
fn into(self) -> wgpu::Color {
wgpu::Color {
r: self.r as f64 / 255.0,
g: self.g as f64 / 255.0,
b: self.b as f64 / 255.0,
a: self.a as f64 / 255.0,
}
}
}
impl Into<image::Rgba<u8>> for Color {
fn into(self) -> image::Rgba<u8> {
image::Rgba([self.r, self.g, self.b, self.a])
}
}
impl Into<[u8; 4]> for Color {
fn into(self) -> [u8; 4] {
[self.r, self.g, self.b, self.a]
}
}
impl Into<[f64; 4]> for Color {
fn into(self) -> [f64; 4] {
[
self.r as f64 / 255.0,
self.g as f64 / 255.0,
self.b as f64 / 255.0,
self.a as f64 / 255.0,
]
}
}
impl Into<[f32; 4]> for Color {
fn into(self) -> [f32; 4] {
[
self.r as f32 / 255.0,
self.g as f32 / 255.0,
self.b as f32 / 255.0,
self.a as f32 / 255.0,
]
}
}