#[derive(Copy, Clone, Eq, PartialEq, Ord, PartialOrd, Hash, Debug, Default)]
pub struct RGB {
pub r: u8,
pub g: u8,
pub b: u8,
}
impl RGB {
#[must_use]
pub const fn new(r: u8, g: u8, b: u8) -> Self {
Self { r, g, b }
}
}
#[derive(Copy, Clone, Eq, PartialEq, Ord, PartialOrd, Hash, Debug)]
pub struct Style {
pub fill_color: Color,
pub stroke_color: Color,
pub stroke_width: i32,
}
impl Default for Style {
fn default() -> Self {
Self {
fill_color: Color::None,
stroke_color: Color::None,
stroke_width: 1,
}
}
}
impl Style {
#[must_use]
pub const fn solid(c: Color) -> Self {
Self {
fill_color: c,
stroke_color: Color::None,
stroke_width: 0,
}
}
#[must_use]
pub const fn outlined(c: Color, w: i32) -> Self {
Self {
fill_color: Color::None,
stroke_color: c,
stroke_width: w,
}
}
#[must_use]
pub const fn as_line_style(&self) -> LineStyle {
LineStyle {
color: self.stroke_color,
width: self.stroke_width,
}
}
}
impl From<LineStyle> for Style {
fn from(value: LineStyle) -> Self {
Self {
fill_color: Color::None,
stroke_color: value.color,
stroke_width: value.width,
}
}
}
#[derive(Copy, Clone, Eq, PartialEq, Ord, PartialOrd, Hash, Debug, Default)]
pub struct LineStyle {
pub color: Color,
pub width: i32,
}
impl LineStyle {
#[must_use]
pub const fn new(c: Color, w: i32) -> Self {
Self { color: c, width: w }
}
}
impl From<Style> for LineStyle {
fn from(value: Style) -> Self {
Self {
color: value.stroke_color,
width: value.stroke_width,
}
}
}
#[derive(Copy, Clone, Eq, PartialEq, Ord, PartialOrd, Hash, Debug, Default)]
pub enum Color {
#[default]
None,
Black,
Purple,
Red,
Orange,
Yellow,
LightGreen,
Green,
DarkGreen,
DarkBlue,
Blue,
LightBlue,
Cyan,
White,
LightGray,
Gray,
DarkGray,
}
impl Color {
#[must_use]
pub const fn new(v: u8) -> Self {
match v {
1 => Color::Black,
2 => Color::Purple,
3 => Color::Red,
4 => Color::Orange,
5 => Color::Yellow,
6 => Color::LightGreen,
7 => Color::Green,
8 => Color::DarkGreen,
9 => Color::DarkBlue,
10 => Color::Blue,
11 => Color::LightBlue,
12 => Color::Cyan,
13 => Color::White,
14 => Color::LightGray,
15 => Color::Gray,
16 => Color::DarkGray,
_ => Color::None,
}
}
}
impl From<u8> for Color {
fn from(value: u8) -> Self {
Self::new(value)
}
}
impl From<Color> for i32 {
fn from(value: Color) -> Self {
i32::from(u8::from(value))
}
}
impl From<Color> for usize {
fn from(value: Color) -> Self {
usize::from(u8::from(value))
}
}
impl From<Color> for u8 {
fn from(value: Color) -> Self {
match value {
Color::None => 0,
Color::Black => 1,
Color::Purple => 2,
Color::Red => 3,
Color::Orange => 4,
Color::Yellow => 5,
Color::LightGreen => 6,
Color::Green => 7,
Color::DarkGreen => 8,
Color::DarkBlue => 9,
Color::Blue => 10,
Color::LightBlue => 11,
Color::Cyan => 12,
Color::White => 13,
Color::LightGray => 14,
Color::Gray => 15,
Color::DarkGray => 16,
}
}
}
impl From<Option<Color>> for Color {
fn from(value: Option<Color>) -> Self {
value.unwrap_or(Color::None)
}
}