| 1 | //! Named colors as defined in the CSS specification. |
| 2 | |
| 3 | use crate::pixelcolor::{ |
| 4 | Bgr555, Bgr565, Bgr666, Bgr888, PixelColor, Rgb555, Rgb565, Rgb666, Rgb888, RgbColor, |
| 5 | }; |
| 6 | |
| 7 | macro_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 | |
| 27 | macro_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 | |
| 49 | macro_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 | |
| 62 | macro_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] |
| 70 | web_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)] |
| 218 | mod 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 | |