1//! Named colors as defined in the CSS specification.
2
3use crate::pixelcolor::{
4 Bgr555, Bgr565, Bgr666, Bgr888, PixelColor, Rgb555, Rgb565, Rgb666, Rgb888, RgbColor,
5};
6
7macro_rules! color_doc {
8 (@internal $text:expr, $($rest:tt)*) => {
9 #[doc = $text]
10 $($rest)*
11 };
12
13 ($name:expr, ($r: expr, $g: expr, $b:expr), $($rest:tt)*) => {
14 color_doc!(@internal concat!(
15 "<span style=\"",
16 "background:rgb(", $r, ",", $g, ",", $b, ");",
17 "border-radius:3px;",
18 "display:inline-block;",
19 "width:0.9em;",
20 "height:0.9em",
21 "\"></span> ",
22 $name
23 ), $($rest)*);
24 };
25}
26
27macro_rules! web_colors_trait {
28 ([$(($ident:ident, $name:expr, ($r:expr, $g:expr, $b:expr)),)*]) => {
29 /// Named colors as defined in the CSS specification.
30 ///
31 /// This list includes the [basic color keywords] as well as all colors in the
32 /// [extended color keywords] list.
33 ///
34 /// Note that the `grEy` variants of some colors as defined in the spec are absent from this list.
35 /// The `grAy` variants of these colors should be used instead.
36 ///
37 /// [basic color keywords]: https://drafts.csswg.org/css-color-3/#html4
38 /// [extended color keywords]: https://drafts.csswg.org/css-color-3/#svg-color
39 #[rustfmt::skip]
40 pub trait WebColors: PixelColor + RgbColor {
41 $( color_doc! {
42 $name, ($r, $g, $b),
43 const $ident: Self;
44 } )*
45 }
46 };
47}
48
49macro_rules! impl_web_colors {
50 ($type:ty, [$(($ident:ident, $name:expr, ($r:expr, $g:expr, $b:expr)),)*]) => {
51 #[doc = "Named web colors."]
52 #[allow(unused)]
53 impl WebColors for $type {
54 $( color_doc! {
55 $name, ($r, $g, $b),
56 const $ident: Self = Self::with_rgb888($r, $g, $b);
57 } )*
58 }
59 };
60}
61
62macro_rules! web_colors {
63 (($($type:ty),*), $colors:tt) => {
64 web_colors_trait!($colors);
65 $( impl_web_colors!($type, $colors); )*
66 };
67}
68
69#[rustfmt::skip]
70web_colors!(
71 (Rgb555, Rgb565, Rgb666, Rgb888, Bgr555, Bgr565, Bgr666, Bgr888),
72 [
73 (CSS_ALICE_BLUE, "Alice Blue", (240, 248, 255)),
74 (CSS_ANTIQUE_WHITE, "Antique White", (250, 235, 215)),
75 (CSS_AQUA, "Aqua", (0, 255, 255)),
76 (CSS_AQUAMARINE, "Aquamarine", (127, 255, 212)),
77 (CSS_AZURE, "Azure", (240, 255, 255)),
78 (CSS_BEIGE, "Beige", (245, 245, 220)),
79 (CSS_BISQUE, "Bisque", (255, 228, 196)),
80 (CSS_BLACK, "Black", (0, 0, 0)),
81 (CSS_BLANCHED_ALMOND, "Blanched Almond", (255, 235, 205)),
82 (CSS_BLUE, "Blue", (0, 0, 255)),
83 (CSS_BLUE_VIOLET, "Blue Violet", (138, 43, 226)),
84 (CSS_BROWN, "Brown", (165, 42, 42)),
85 (CSS_BURLY_WOOD, "Burly Wood", (222, 184, 135)),
86 (CSS_CADET_BLUE, "Cadet Blue", (95, 158, 160)),
87 (CSS_CHARTREUSE, "Chartreuse", (127, 255, 0)),
88 (CSS_CHOCOLATE, "Chocolate", (210, 105, 30)),
89 (CSS_CORAL, "Coral", (255, 127, 80)),
90 (CSS_CORNFLOWER_BLUE, "Cornflower Blue", (100, 149, 237)),
91 (CSS_CORNSILK, "Cornsilk", (255, 248, 220)),
92 (CSS_CRIMSON, "Crimson", (220, 20, 60)),
93 (CSS_CYAN, "Cyan", (0, 255, 255)),
94 (CSS_DARK_BLUE, "Dark Blue", (0, 0, 139)),
95 (CSS_DARK_CYAN, "Dark Cyan", (0, 139, 139)),
96 (CSS_DARK_GOLDENROD, "Dark Goldenrod", (184, 134, 11)),
97 (CSS_DARK_GRAY, "Dark Gray", (169, 169, 169)),
98 (CSS_DARK_GREEN, "Dark Green", (0, 100, 0)),
99 (CSS_DARK_KHAKI, "Dark Khaki", (189, 183, 107)),
100 (CSS_DARK_MAGENTA, "Dark Magenta", (139, 0, 139)),
101 (CSS_DARK_OLIVE_GREEN, "Dark Olive Green", (85, 107, 47)),
102 (CSS_DARK_ORANGE, "Dark Orange", (255, 140, 0)),
103 (CSS_DARK_ORCHID, "Dark Orchid", (153, 50, 204)),
104 (CSS_DARK_RED, "Dark Red", (139, 0, 0)),
105 (CSS_DARK_SALMON, "Dark Salmon", (233, 150, 122)),
106 (CSS_DARK_SEA_GREEN, "Dark Sea Green", (143, 188, 143)),
107 (CSS_DARK_SLATE_BLUE, "Dark Slate Blue", (72, 61, 139)),
108 (CSS_DARK_SLATE_GRAY, "Dark Slate Gray", (47, 79, 79)),
109 (CSS_DARK_TURQUOISE, "Dark Turquoise", (0, 206, 209)),
110 (CSS_DARK_VIOLET, "Dark Violet", (148, 0, 211)),
111 (CSS_DEEP_PINK, "Deep Pink", (255, 20, 147)),
112 (CSS_DEEP_SKY_BLUE, "Deep Sky Blue", (0, 191, 255)),
113 (CSS_DIM_GRAY, "Dim Gray", (105, 105, 105)),
114 (CSS_DODGER_BLUE, "Dodger Blue", (30, 144, 255)),
115 (CSS_FIRE_BRICK, "Fire Brick", (178, 34, 34)),
116 (CSS_FLORAL_WHITE, "Floral White", (255, 250, 240)),
117 (CSS_FOREST_GREEN, "Forest Green", (34, 139, 34)),
118 (CSS_FUCHSIA, "Fuchsia", (255, 0, 255)),
119 (CSS_GAINSBORO, "Gainsboro", (220, 220, 220)),
120 (CSS_GHOST_WHITE, "Ghost White", (248, 248, 255)),
121 (CSS_GOLD, "Gold", (255, 215, 0)),
122 (CSS_GOLDENROD, "Goldenrod", (218, 165, 32)),
123 (CSS_GRAY, "Gray", (128, 128, 128)),
124 (CSS_GREEN, "Green", (0, 128, 0)),
125 (CSS_GREEN_YELLOW, "Green Yellow", (173, 255, 47)),
126 (CSS_HONEYDEW, "Honeydew", (240, 255, 240)),
127 (CSS_HOT_PINK, "Hot Pink", (255, 105, 180)),
128 (CSS_INDIAN_RED, "Indian Red", (205, 92, 92)),
129 (CSS_INDIGO, "Indigo", (75, 0, 130)),
130 (CSS_IVORY, "Ivory", (255, 255, 240)),
131 (CSS_KHAKI, "Khaki", (240, 230, 140)),
132 (CSS_LAVENDER, "Lavender", (230, 230, 250)),
133 (CSS_LAVENDER_BLUSH, "Lavender Blush", (255, 240, 245)),
134 (CSS_LAWN_GREEN, "Lawn Green", (124, 252, 0)),
135 (CSS_LEMON_CHIFFON, "Lemon Chiffon", (255, 250, 205)),
136 (CSS_LIGHT_BLUE, "Light Blue", (173, 216, 230)),
137 (CSS_LIGHT_CORAL, "Light Coral", (240, 128, 128)),
138 (CSS_LIGHT_CYAN, "Light Cyan", (224, 255, 255)),
139 (CSS_LIGHT_GOLDENROD_YELLOW, "Light Goldenrod Yellow", (250, 250, 210)),
140 (CSS_LIGHT_GRAY, "Light Gray", (211, 211, 211)),
141 (CSS_LIGHT_GREEN, "Light Green", (144, 238, 144)),
142 (CSS_LIGHT_PINK, "Light Pink", (255, 182, 193)),
143 (CSS_LIGHT_SALMON, "Light Salmon", (255, 160, 122)),
144 (CSS_LIGHT_SEA_GREEN, "Light Sea Green", (32, 178, 170)),
145 (CSS_LIGHT_SKY_BLUE, "Light Sky Blue", (135, 206, 250)),
146 (CSS_LIGHT_SLATE_GRAY, "Light Slate Gray", (119, 136, 153)),
147 (CSS_LIGHT_STEEL_BLUE, "Light Steel Blue", (176, 196, 222)),
148 (CSS_LIGHT_YELLOW, "Light Yellow", (255, 255, 224)),
149 (CSS_LIME, "Lime", (0, 255, 0)),
150 (CSS_LIME_GREEN, "Lime Green", (50, 205, 50)),
151 (CSS_LINEN, "Linen", (250, 240, 230)),
152 (CSS_MAGENTA, "Magenta", (255, 0, 255)),
153 (CSS_MAROON, "Maroon", (128, 0, 0)),
154 (CSS_MEDIUM_AQUAMARINE, "Medium Aquamarine", (102, 205, 170)),
155 (CSS_MEDIUM_BLUE, "Medium Blue", (0, 0, 205)),
156 (CSS_MEDIUM_ORCHID, "Medium Orchid", (186, 85, 211)),
157 (CSS_MEDIUM_PURPLE, "Medium Purple", (147, 112, 219)),
158 (CSS_MEDIUM_SEA_GREEN, "Medium Sea Green", (60, 179, 113)),
159 (CSS_MEDIUM_SLATE_BLUE, "Medium Slate Blue", (123, 104, 238)),
160 (CSS_MEDIUM_SPRING_GREEN, "Medium Spring Green", (0, 250, 154)),
161 (CSS_MEDIUM_TURQUOISE, "Medium Turquoise", (72, 209, 204)),
162 (CSS_MEDIUM_VIOLET_RED, "Medium Violet Red", (199, 21, 133)),
163 (CSS_MIDNIGHT_BLUE, "Midnight Blue", (25, 25, 112)),
164 (CSS_MINT_CREAM, "Mint Cream", (245, 255, 250)),
165 (CSS_MISTY_ROSE, "Misty Rose", (255, 228, 225)),
166 (CSS_MOCCASIN, "Moccasin", (255, 228, 181)),
167 (CSS_NAVAJO_WHITE, "Navajo White", (255, 222, 173)),
168 (CSS_NAVY, "Navy", (0, 0, 128)),
169 (CSS_OLD_LACE, "Old Lace", (253, 245, 230)),
170 (CSS_OLIVE, "Olive", (128, 128, 0)),
171 (CSS_OLIVE_DRAB, "Olive Drab", (107, 142, 35)),
172 (CSS_ORANGE, "Orange", (255, 165, 0)),
173 (CSS_ORANGE_RED, "Orange Red", (255, 69, 0)),
174 (CSS_ORCHID, "Orchid", (218, 112, 214)),
175 (CSS_PALE_GOLDENROD, "Pale Goldenrod", (238, 232, 170)),
176 (CSS_PALE_GREEN, "Pale Green", (152, 251, 152)),
177 (CSS_PALE_TURQUOISE, "Pale Turquoise", (175, 238, 238)),
178 (CSS_PALE_VIOLET_RED, "Pale Violet Red", (219, 112, 147)),
179 (CSS_PAPAYA_WHIP, "Papaya Whip", (255, 239, 213)),
180 (CSS_PEACH_PUFF, "Peach Puff", (255, 218, 185)),
181 (CSS_PERU, "Peru", (205, 133, 63)),
182 (CSS_PINK, "Pink", (255, 192, 203)),
183 (CSS_PLUM, "Plum", (221, 160, 221)),
184 (CSS_POWDER_BLUE, "Powder Blue", (176, 224, 230)),
185 (CSS_PURPLE, "Purple", (128, 0, 128)),
186 (CSS_REBECCAPURPLE, "Rebeccapurple", (102, 51, 153)),
187 (CSS_RED, "Red", (255, 0, 0)),
188 (CSS_ROSY_BROWN, "Rosy Brown", (188, 143, 143)),
189 (CSS_ROYAL_BLUE, "Royal Blue", (65, 105, 225)),
190 (CSS_SADDLE_BROWN, "Saddle Brown", (139, 69, 19)),
191 (CSS_SALMON, "Salmon", (250, 128, 114)),
192 (CSS_SANDY_BROWN, "Sandy Brown", (244, 164, 96)),
193 (CSS_SEA_GREEN, "Sea Green", (46, 139, 87)),
194 (CSS_SEASHELL, "Seashell", (255, 245, 238)),
195 (CSS_SIENNA, "Sienna", (160, 82, 45)),
196 (CSS_SILVER, "Silver", (192, 192, 192)),
197 (CSS_SKY_BLUE, "Sky Blue", (135, 206, 235)),
198 (CSS_SLATE_BLUE, "Slate Blue", (106, 90, 205)),
199 (CSS_SLATE_GRAY, "Slate Gray", (112, 128, 144)),
200 (CSS_SNOW, "Snow", (255, 250, 250)),
201 (CSS_SPRING_GREEN, "Spring Green", (0, 255, 127)),
202 (CSS_STEEL_BLUE, "Steel Blue", (70, 130, 180)),
203 (CSS_TAN, "Tan", (210, 180, 140)),
204 (CSS_TEAL, "Teal", (0, 128, 128)),
205 (CSS_THISTLE, "Thistle", (216, 191, 216)),
206 (CSS_TOMATO, "Tomato", (255, 99, 71)),
207 (CSS_TURQUOISE, "Turquoise", (64, 224, 208)),
208 (CSS_VIOLET, "Violet", (238, 130, 238)),
209 (CSS_WHEAT, "Wheat", (245, 222, 179)),
210 (CSS_WHITE, "White", (255, 255, 255)),
211 (CSS_WHITE_SMOKE, "White Smoke", (245, 245, 245)),
212 (CSS_YELLOW, "Yellow", (255, 255, 0)),
213 (CSS_YELLOW_GREEN, "Yellow Green", (154, 205, 50)),
214 ]
215);
216
217#[cfg(test)]
218mod tests {
219 use super::*;
220 use crate::pixelcolor::IntoStorage;
221
222 #[test]
223 fn max_channels() {
224 assert_eq!(Rgb555::WHITE, Rgb555::CSS_WHITE);
225 assert_eq!(Bgr555::WHITE, Bgr555::CSS_WHITE);
226 assert_eq!(Rgb565::WHITE, Rgb565::CSS_WHITE);
227 assert_eq!(Bgr565::WHITE, Bgr565::CSS_WHITE);
228 assert_eq!(Rgb666::WHITE, Rgb666::CSS_WHITE);
229 assert_eq!(Bgr666::WHITE, Bgr666::CSS_WHITE);
230 assert_eq!(Rgb888::WHITE, Rgb888::CSS_WHITE);
231 assert_eq!(Bgr888::WHITE, Bgr888::CSS_WHITE);
232
233 assert_eq!(Rgb555::RED, Rgb555::CSS_RED);
234 assert_eq!(Bgr555::RED, Bgr555::CSS_RED);
235 assert_eq!(Rgb565::RED, Rgb565::CSS_RED);
236 assert_eq!(Bgr565::RED, Bgr565::CSS_RED);
237 assert_eq!(Rgb666::RED, Rgb666::CSS_RED);
238 assert_eq!(Bgr666::RED, Bgr666::CSS_RED);
239 assert_eq!(Rgb888::RED, Rgb888::CSS_RED);
240 assert_eq!(Bgr888::RED, Bgr888::CSS_RED);
241
242 assert_eq!(Rgb555::GREEN, Rgb555::CSS_LIME);
243 assert_eq!(Bgr555::GREEN, Bgr555::CSS_LIME);
244 assert_eq!(Rgb565::GREEN, Rgb565::CSS_LIME);
245 assert_eq!(Bgr565::GREEN, Bgr565::CSS_LIME);
246 assert_eq!(Rgb666::GREEN, Rgb666::CSS_LIME);
247 assert_eq!(Bgr666::GREEN, Bgr666::CSS_LIME);
248 assert_eq!(Rgb888::GREEN, Rgb888::CSS_LIME);
249 assert_eq!(Bgr888::GREEN, Bgr888::CSS_LIME);
250
251 assert_eq!(Rgb555::BLUE, Rgb555::CSS_BLUE);
252 assert_eq!(Bgr555::BLUE, Bgr555::CSS_BLUE);
253 assert_eq!(Rgb565::BLUE, Rgb565::CSS_BLUE);
254 assert_eq!(Bgr565::BLUE, Bgr565::CSS_BLUE);
255 assert_eq!(Rgb666::BLUE, Rgb666::CSS_BLUE);
256 assert_eq!(Bgr666::BLUE, Bgr666::CSS_BLUE);
257 assert_eq!(Rgb888::BLUE, Rgb888::CSS_BLUE);
258 assert_eq!(Bgr888::BLUE, Bgr888::CSS_BLUE);
259 }
260
261 #[test]
262 fn conversion() {
263 // 24bit: 7FFF00
264 assert_eq!(Rgb565::CSS_CHARTREUSE.into_storage(), 0x7fe0);
265 }
266}
267