use crate::layer::Rgba; #[derive(Debug, Clone)] pub struct Palette { pub default: Rgba, pub overrides: Vec<(String, Rgba)>, pub via_body: Rgba, pub via_drill: Rgba, } impl Palette { pub fn colour(&self, layer: &str) -> Rgba { self.overrides .iter() .find(|(n, _)| n == layer) .map(|(_, c)| *c) .unwrap_or(self.default) } pub fn with_override(mut self, layer: impl Into, colour: Rgba) -> Self { self.overrides.push((layer.into(), colour)); self } pub fn via_body(&self) -> Rgba { self.via_body } pub fn via_drill(&self) -> Rgba { self.via_drill } } impl Default for Palette { fn default() -> Self { Self { default: Rgba::opaque(180, 180, 180), overrides: vec![ ("F.Cu".into(), Rgba::opaque(200, 52, 52)), ("B.Cu".into(), Rgba::opaque(77, 127, 196)), ("In1.Cu".into(), Rgba::opaque(127, 200, 127)), ("In2.Cu".into(), Rgba::opaque(206, 125, 188)), ("F.Silkscreen".into(), Rgba::opaque(220, 200, 200)), ("B.Silkscreen".into(), Rgba::opaque(200, 220, 220)), ("F.SilkS".into(), Rgba::opaque(220, 200, 200)), ("B.SilkS".into(), Rgba::opaque(200, 220, 220)), ("F.Mask".into(), Rgba::opaque(102, 0, 102)), ("B.Mask".into(), Rgba::opaque(102, 0, 102)), ("F.Paste".into(), Rgba::opaque(180, 180, 180)), ("B.Paste".into(), Rgba::opaque(180, 180, 180)), ("F.Fab".into(), Rgba::opaque(150, 115, 60)), ("B.Fab".into(), Rgba::opaque(150, 115, 60)), ("F.Courtyard".into(), Rgba::opaque(255, 38, 226)), ("B.Courtyard".into(), Rgba::opaque(38, 233, 255)), ("F.CrtYd".into(), Rgba::opaque(255, 38, 226)), ("B.CrtYd".into(), Rgba::opaque(38, 233, 255)), ("Edge.Cuts".into(), Rgba::opaque(255, 240, 150)), ("Margin".into(), Rgba::opaque(255, 120, 120)), ("Dwgs.User".into(), Rgba::opaque(194, 194, 194)), ("Cmts.User".into(), Rgba::opaque(89, 148, 220)), ], via_body: Rgba::opaque(200, 170, 80), via_drill: Rgba::opaque(30, 30, 30), } } }