graphics/color/
palette.rs

1use crate::Color;
2
3#[derive(Clone, Copy, Debug, PartialEq)]
4#[repr(u8)]
5pub enum Hue {
6    Red = 0,
7    Pink = 1,
8    Purple = 2,
9    DeepPurple = 3,
10    Indigo = 4,
11    Blue = 5,
12    LightBlue = 6,
13    Cyan = 7,
14    Teal = 8,
15    Green = 9,
16    LightGreen = 10,
17    Lime = 11,
18    Yellow = 12,
19    Amber = 13,
20    Orange = 14,
21    DeepOrange = 15,
22    Brown = 16,
23    BlueGrey = 17,
24    Grey = 18,
25}
26
27// Material Design Color Palette Constants
28// Each color has 10 tones: 50, 100, 200, 300, 400, 500, 600, 700, 800, 900
29// Tone 500 is the main color
30const MATERIAL_COLORS: [[Color; 10]; 19] = [
31    // Red
32    [
33        Color::new(0xFF, 0xEB, 0xEE), // 50
34        Color::new(0xFF, 0xCD, 0xD2), // 100
35        Color::new(0xEF, 0x9A, 0x9A), // 200
36        Color::new(0xE5, 0x73, 0x73), // 300
37        Color::new(0xEF, 0x53, 0x50), // 400
38        Color::new(0xF4, 0x43, 0x36), // 500 (main)
39        Color::new(0xE5, 0x39, 0x35), // 600
40        Color::new(0xD3, 0x2F, 0x2F), // 700
41        Color::new(0xC6, 0x28, 0x28), // 800
42        Color::new(0xB7, 0x1C, 0x1C), // 900
43    ],
44    // Pink
45    [
46        Color::new(0xFC, 0xE4, 0xEC), // 50
47        Color::new(0xF8, 0xBB, 0xD9), // 100
48        Color::new(0xF4, 0x8F, 0xB1), // 200
49        Color::new(0xF0, 0x62, 0x92), // 300
50        Color::new(0xEC, 0x40, 0x7A), // 400
51        Color::new(0xE9, 0x1E, 0x63), // 500 (main)
52        Color::new(0xD8, 0x1B, 0x60), // 600
53        Color::new(0xC2, 0x18, 0x5B), // 700
54        Color::new(0xAD, 0x14, 0x57), // 800
55        Color::new(0x88, 0x0E, 0x4F), // 900
56    ],
57    // Purple
58    [
59        Color::new(0xF3, 0xE5, 0xF5), // 50
60        Color::new(0xE1, 0xBE, 0xE7), // 100
61        Color::new(0xCE, 0x93, 0xD8), // 200
62        Color::new(0xBA, 0x68, 0xC8), // 300
63        Color::new(0xAB, 0x47, 0xBC), // 400
64        Color::new(0x9C, 0x27, 0xB0), // 500 (main)
65        Color::new(0x8E, 0x24, 0xAA), // 600
66        Color::new(0x7B, 0x1F, 0xA2), // 700
67        Color::new(0x6A, 0x1B, 0x9A), // 800
68        Color::new(0x4A, 0x14, 0x8C), // 900
69    ],
70    // Deep Purple
71    [
72        Color::new(0xED, 0xE7, 0xF6), // 50
73        Color::new(0xD1, 0xC4, 0xE9), // 100
74        Color::new(0xB3, 0x9D, 0xDB), // 200
75        Color::new(0x95, 0x75, 0xCD), // 300
76        Color::new(0x7E, 0x57, 0xC2), // 400
77        Color::new(0x67, 0x3A, 0xB7), // 500 (main)
78        Color::new(0x5E, 0x35, 0xB1), // 600
79        Color::new(0x51, 0x2D, 0xA8), // 700
80        Color::new(0x45, 0x27, 0xA0), // 800
81        Color::new(0x31, 0x1B, 0x92), // 900
82    ],
83    // Indigo
84    [
85        Color::new(0xE8, 0xEA, 0xF6), // 50
86        Color::new(0xC5, 0xCA, 0xE9), // 100
87        Color::new(0x9F, 0xA8, 0xDA), // 200
88        Color::new(0x79, 0x86, 0xCB), // 300
89        Color::new(0x5C, 0x6B, 0xC0), // 400
90        Color::new(0x3F, 0x51, 0xB5), // 500 (main)
91        Color::new(0x39, 0x49, 0xAB), // 600
92        Color::new(0x30, 0x3F, 0x9F), // 700
93        Color::new(0x28, 0x35, 0x93), // 800
94        Color::new(0x1A, 0x23, 0x7E), // 900
95    ],
96    // Blue
97    [
98        Color::new(0xE3, 0xF2, 0xFD), // 50
99        Color::new(0xBB, 0xDE, 0xFB), // 100
100        Color::new(0x90, 0xCA, 0xF9), // 200
101        Color::new(0x64, 0xB5, 0xF6), // 300
102        Color::new(0x42, 0xA5, 0xF5), // 400
103        Color::new(0x21, 0x96, 0xF3), // 500 (main)
104        Color::new(0x1E, 0x88, 0xE5), // 600
105        Color::new(0x19, 0x76, 0xD2), // 700
106        Color::new(0x15, 0x65, 0xC0), // 800
107        Color::new(0x0D, 0x47, 0xA1), // 900
108    ],
109    // Light Blue
110    [
111        Color::new(0xE1, 0xF5, 0xFE), // 50
112        Color::new(0xB3, 0xE5, 0xFC), // 100
113        Color::new(0x81, 0xD4, 0xFA), // 200
114        Color::new(0x4F, 0xC3, 0xF7), // 300
115        Color::new(0x29, 0xB6, 0xF6), // 400
116        Color::new(0x03, 0xA9, 0xF4), // 500 (main)
117        Color::new(0x03, 0x9B, 0xE5), // 600
118        Color::new(0x02, 0x88, 0xD1), // 700
119        Color::new(0x02, 0x77, 0xBD), // 800
120        Color::new(0x01, 0x57, 0x9B), // 900
121    ],
122    // Cyan
123    [
124        Color::new(0xE0, 0xF7, 0xFA), // 50
125        Color::new(0xB2, 0xEB, 0xF2), // 100
126        Color::new(0x80, 0xDE, 0xEA), // 200
127        Color::new(0x4D, 0xD0, 0xE1), // 300
128        Color::new(0x26, 0xC6, 0xDA), // 400
129        Color::new(0x00, 0xBC, 0xD4), // 500 (main)
130        Color::new(0x00, 0xAC, 0xC1), // 600
131        Color::new(0x00, 0x97, 0xA7), // 700
132        Color::new(0x00, 0x83, 0x8F), // 800
133        Color::new(0x00, 0x60, 0x64), // 900
134    ],
135    // Teal
136    [
137        Color::new(0xE0, 0xF2, 0xF1), // 50
138        Color::new(0xB2, 0xDF, 0xDB), // 100
139        Color::new(0x80, 0xCB, 0xC4), // 200
140        Color::new(0x4D, 0xB6, 0xAC), // 300
141        Color::new(0x26, 0xA6, 0x9A), // 400
142        Color::new(0x00, 0x96, 0x88), // 500 (main)
143        Color::new(0x00, 0x89, 0x7B), // 600
144        Color::new(0x00, 0x79, 0x6B), // 700
145        Color::new(0x00, 0x69, 0x5C), // 800
146        Color::new(0x00, 0x4D, 0x40), // 900
147    ],
148    // Green
149    [
150        Color::new(0xE8, 0xF5, 0xE9), // 50
151        Color::new(0xC8, 0xE6, 0xC9), // 100
152        Color::new(0xA5, 0xD6, 0xA7), // 200
153        Color::new(0x81, 0xC7, 0x84), // 300
154        Color::new(0x66, 0xBB, 0x6A), // 400
155        Color::new(0x4C, 0xAF, 0x50), // 500 (main)
156        Color::new(0x43, 0xA0, 0x47), // 600
157        Color::new(0x38, 0x8E, 0x3C), // 700
158        Color::new(0x2E, 0x7D, 0x32), // 800
159        Color::new(0x1B, 0x5E, 0x20), // 900
160    ],
161    // Light Green
162    [
163        Color::new(0xF1, 0xF8, 0xE9), // 50
164        Color::new(0xDC, 0xED, 0xC8), // 100
165        Color::new(0xC5, 0xE1, 0xA5), // 200
166        Color::new(0xAE, 0xD5, 0x81), // 300
167        Color::new(0x9C, 0xCC, 0x65), // 400
168        Color::new(0x8B, 0xC3, 0x4A), // 500 (main)
169        Color::new(0x7C, 0xB3, 0x42), // 600
170        Color::new(0x68, 0x9F, 0x38), // 700
171        Color::new(0x55, 0x8B, 0x2F), // 800
172        Color::new(0x33, 0x69, 0x1E), // 900
173    ],
174    // Lime
175    [
176        Color::new(0xF9, 0xFB, 0xE7), // 50
177        Color::new(0xF0, 0xF4, 0xC3), // 100
178        Color::new(0xE6, 0xEE, 0x9C), // 200
179        Color::new(0xDC, 0xE7, 0x75), // 300
180        Color::new(0xD4, 0xE1, 0x57), // 400
181        Color::new(0xCD, 0xDC, 0x39), // 500 (main)
182        Color::new(0xC0, 0xCA, 0x33), // 600
183        Color::new(0xAF, 0xB4, 0x2B), // 700
184        Color::new(0x9E, 0x9D, 0x24), // 800
185        Color::new(0x82, 0x77, 0x17), // 900
186    ],
187    // Yellow
188    [
189        Color::new(0xFF, 0xFD, 0xE7), // 50
190        Color::new(0xFF, 0xF9, 0xC4), // 100
191        Color::new(0xFF, 0xF5, 0x9D), // 200
192        Color::new(0xFF, 0xF1, 0x76), // 300
193        Color::new(0xFF, 0xEE, 0x58), // 400
194        Color::new(0xFF, 0xEB, 0x3B), // 500 (main)
195        Color::new(0xFD, 0xD8, 0x35), // 600
196        Color::new(0xFB, 0xC0, 0x2D), // 700
197        Color::new(0xF9, 0xA8, 0x25), // 800
198        Color::new(0xF5, 0x7F, 0x17), // 900
199    ],
200    // Amber
201    [
202        Color::new(0xFF, 0xF8, 0xE1), // 50
203        Color::new(0xFF, 0xEC, 0xB3), // 100
204        Color::new(0xFF, 0xE0, 0x82), // 200
205        Color::new(0xFF, 0xD5, 0x4F), // 300
206        Color::new(0xFF, 0xCA, 0x28), // 400
207        Color::new(0xFF, 0xC1, 0x07), // 500 (main)
208        Color::new(0xFF, 0xB3, 0x00), // 600
209        Color::new(0xFF, 0xA0, 0x00), // 700
210        Color::new(0xFF, 0x8F, 0x00), // 800
211        Color::new(0xFF, 0x6F, 0x00), // 900
212    ],
213    // Orange
214    [
215        Color::new(0xFF, 0xF3, 0xE0), // 50
216        Color::new(0xFF, 0xE0, 0xB2), // 100
217        Color::new(0xFF, 0xCC, 0x80), // 200
218        Color::new(0xFF, 0xB7, 0x4D), // 300
219        Color::new(0xFF, 0xA7, 0x26), // 400
220        Color::new(0xFF, 0x98, 0x00), // 500 (main)
221        Color::new(0xFB, 0x8C, 0x00), // 600
222        Color::new(0xF5, 0x7C, 0x00), // 700
223        Color::new(0xEF, 0x6C, 0x00), // 800
224        Color::new(0xE6, 0x51, 0x00), // 900
225    ],
226    // Deep Orange
227    [
228        Color::new(0xFB, 0xE9, 0xE7), // 50
229        Color::new(0xFF, 0xCC, 0xBC), // 100
230        Color::new(0xFF, 0xAB, 0x91), // 200
231        Color::new(0xFF, 0x8A, 0x65), // 300
232        Color::new(0xFF, 0x70, 0x43), // 400
233        Color::new(0xFF, 0x57, 0x22), // 500 (main)
234        Color::new(0xF4, 0x51, 0x1E), // 600
235        Color::new(0xE6, 0x4A, 0x19), // 700
236        Color::new(0xD8, 0x43, 0x15), // 800
237        Color::new(0xBF, 0x36, 0x0C), // 900
238    ],
239    // Brown
240    [
241        Color::new(0xEF, 0xEB, 0xE9), // 50
242        Color::new(0xD7, 0xCC, 0xC8), // 100
243        Color::new(0xBC, 0xAA, 0xA4), // 200
244        Color::new(0xA1, 0x88, 0x7F), // 300
245        Color::new(0x8D, 0x6E, 0x63), // 400
246        Color::new(0x79, 0x55, 0x48), // 500 (main)
247        Color::new(0x6D, 0x4C, 0x41), // 600
248        Color::new(0x5D, 0x40, 0x37), // 700
249        Color::new(0x4E, 0x34, 0x2E), // 800
250        Color::new(0x3E, 0x27, 0x23), // 900
251    ],
252    // Blue Grey
253    [
254        Color::new(0xEC, 0xEF, 0xF1), // 50
255        Color::new(0xCF, 0xD8, 0xDC), // 100
256        Color::new(0xB0, 0xBE, 0xC5), // 200
257        Color::new(0x90, 0xA4, 0xAE), // 300
258        Color::new(0x78, 0x90, 0x9C), // 400
259        Color::new(0x60, 0x7D, 0x8B), // 500 (main)
260        Color::new(0x54, 0x6E, 0x7A), // 600
261        Color::new(0x45, 0x5A, 0x64), // 700
262        Color::new(0x37, 0x47, 0x4F), // 800
263        Color::new(0x26, 0x32, 0x38), // 900
264    ],
265    // Grey
266    [
267        Color::new(0xFA, 0xFA, 0xFA), // 50
268        Color::new(0xF5, 0xF5, 0xF5), // 100
269        Color::new(0xEE, 0xEE, 0xEE), // 200
270        Color::new(0xE0, 0xE0, 0xE0), // 300
271        Color::new(0xBD, 0xBD, 0xBD), // 400
272        Color::new(0x9E, 0x9E, 0x9E), // 500 (main)
273        Color::new(0x75, 0x75, 0x75), // 600
274        Color::new(0x61, 0x61, 0x61), // 700
275        Color::new(0x42, 0x42, 0x42), // 800
276        Color::new(0x21, 0x21, 0x21), // 900
277    ],
278];
279
280impl Hue {
281    /// Get the index of this hue in the material colors array
282    const fn get_color_index(self) -> usize {
283        self as usize
284    }
285}
286
287#[derive(Clone, Copy, Debug, PartialEq)]
288pub enum Tone {
289    Tone50 = 0,
290    Tone100 = 1,
291    Tone200 = 2,
292    Tone300 = 3,
293    Tone400 = 4,
294    Tone500 = 5,
295    Tone600 = 6,
296    Tone700 = 7,
297    Tone800 = 8,
298    Tone900 = 9,
299}
300
301impl Tone {
302    pub const MAIN: Tone = Tone::Tone500;
303
304    /// Get the index of this tone in the material colors array
305    const fn get_tone_index(self) -> usize {
306        self as usize
307    }
308}
309
310/// Get a Material Design color from the palette
311/// This function is const-compliant and doesn't rely on LVGL
312pub const fn get(hue: Hue, tone: Tone) -> Color {
313    let color_index = hue.get_color_index();
314    let tone_index = tone.get_tone_index();
315    MATERIAL_COLORS[color_index][tone_index]
316}