Skip to main content

penlib/
papermate.rs

1use std::hash::Hash;
2
3use palette::rgb::LinSrgb;
4
5use crate::Pen;
6
7pub trait InkJoyGelPenSize: Clone + Eq + PartialEq + Hash {
8    fn nib_size() -> f64;
9}
10
11#[derive(Debug, Copy, Clone, Eq, PartialEq, Hash)]
12pub struct PointSevenMM;
13impl InkJoyGelPenSize for PointSevenMM {
14    fn nib_size() -> f64 {
15        0.7
16    }
17}
18
19#[derive(Debug, Copy, Clone, Eq, PartialEq, Hash)]
20pub struct PointFiveMM;
21impl InkJoyGelPenSize for PointFiveMM {
22    fn nib_size() -> f64 {
23        0.5
24    }
25}
26
27#[derive(Debug, Copy, Clone, Eq, PartialEq, Hash)]
28pub enum InkJoyGelPenColor {
29    Red,
30    Berry,
31    Pink,
32    Orange,
33    Yellow,
34    Green,
35    Lime,
36    SlateBlue,
37    Blue,
38    BrightBlue,
39    Teal,
40    Purple,
41    Cocoa,
42    Black,
43}
44
45impl InkJoyGelPenColor {
46    fn rgb_color(&self) -> LinSrgb {
47        let (r, g, b) = match self {
48            InkJoyGelPenColor::Red => (0xd1, 0x24, 0x31),
49            InkJoyGelPenColor::Berry => (0xc1, 0x52, 0x9e),
50            InkJoyGelPenColor::Pink => (0xd8, 0x40, 0x8c),
51            InkJoyGelPenColor::Orange => (0xf3, 0x6c, 0x38),
52            InkJoyGelPenColor::Yellow => (0xff, 0xda, 0x3a),
53            InkJoyGelPenColor::Green => (0x00, 0xa8, 0x5d),
54            InkJoyGelPenColor::Lime => (0xa6, 0xd0, 0x60),
55            InkJoyGelPenColor::SlateBlue => (0x28, 0x62, 0x8f),
56            InkJoyGelPenColor::Blue => (0x0a, 0x2e, 0x83),
57            InkJoyGelPenColor::BrightBlue => (0x47, 0xb7, 0xe6),
58            InkJoyGelPenColor::Teal => (0x00, 0x9b, 0xa8),
59            InkJoyGelPenColor::Purple => (0x78, 0x5b, 0xa7),
60            InkJoyGelPenColor::Cocoa => (0x8e, 0x61, 0x5e),
61            InkJoyGelPenColor::Black => (0x37, 0x36, 0x3d),
62        };
63        LinSrgb::new(r as f32 / 255.0, g as f32 / 255.0, b as f32 / 255.0).into_linear()
64    }
65}
66
67#[derive(Debug, Copy, Clone, Eq, PartialEq, Hash)]
68pub struct InkJoyGelPen<T: InkJoyGelPenSize> {
69    color: InkJoyGelPenColor,
70    _size: std::marker::PhantomData<T>,
71}
72
73impl<T: InkJoyGelPenSize> InkJoyGelPen<T> {
74    pub fn new(color: InkJoyGelPenColor) -> Self {
75        let _size = std::marker::PhantomData;
76        InkJoyGelPen { color, _size }
77    }
78}
79
80impl<T: InkJoyGelPenSize> Pen for InkJoyGelPen<T> {
81    fn available_colors() -> Vec<Self> {
82        vec![
83            InkJoyGelPen::new(InkJoyGelPenColor::Red),
84            InkJoyGelPen::new(InkJoyGelPenColor::Berry),
85            InkJoyGelPen::new(InkJoyGelPenColor::Pink),
86            InkJoyGelPen::new(InkJoyGelPenColor::Orange),
87            InkJoyGelPen::new(InkJoyGelPenColor::Yellow),
88            InkJoyGelPen::new(InkJoyGelPenColor::Green),
89            InkJoyGelPen::new(InkJoyGelPenColor::Lime),
90            InkJoyGelPen::new(InkJoyGelPenColor::SlateBlue),
91            InkJoyGelPen::new(InkJoyGelPenColor::Blue),
92            InkJoyGelPen::new(InkJoyGelPenColor::BrightBlue),
93            InkJoyGelPen::new(InkJoyGelPenColor::Teal),
94            InkJoyGelPen::new(InkJoyGelPenColor::Purple),
95            InkJoyGelPen::new(InkJoyGelPenColor::Cocoa),
96            InkJoyGelPen::new(InkJoyGelPenColor::Black),
97        ]
98    }
99
100    fn nib_size_mm() -> f64 {
101        T::nib_size()
102    }
103
104    fn rgb_color(&self) -> LinSrgb {
105        self.color.rgb_color()
106    }
107}