Skip to content

Commit aa3c3e5

Browse files
committed
Use a static table in parse_color_keyword to reduce code size.
Instead of O(n) code, this should emit O(1) code + O(n) static data with hopefully a smaller constant factor.
1 parent 4e1e788 commit aa3c3e5

File tree

2 files changed

+185
-163
lines changed

2 files changed

+185
-163
lines changed

src/color.rs

Lines changed: 164 additions & 163 deletions
Original file line numberDiff line numberDiff line change
@@ -106,15 +106,15 @@ impl Color {
106106
}
107107
}
108108

109-
110-
#[inline]
111-
fn rgb(red: f32, green: f32, blue: f32) -> Result<Color, ()> {
112-
Ok(Color::RGBA(RGBA {
113-
red: red / 255.,
114-
green: green / 255.,
115-
blue: blue / 255.,
116-
alpha: 1.,
117-
}))
109+
macro_rules! rgb {
110+
($red: expr, $green: expr, $blue: expr) => {
111+
Color::RGBA(RGBA {
112+
red: $red / 255.,
113+
green: $green / 255.,
114+
blue: $blue / 255.,
115+
alpha: 1.,
116+
})
117+
}
118118
}
119119

120120
#[inline]
@@ -135,160 +135,159 @@ fn rgba(red: f32, green: f32, blue: f32, alpha: f32) -> Result<Color, ()> {
135135
/// (For example, the value of an `Ident` token is fine.)
136136
#[inline]
137137
pub fn parse_color_keyword(ident: &str) -> Result<Color, ()> {
138-
match_ignore_ascii_case! { ident,
139-
"black" => rgb(0., 0., 0.),
140-
"silver" => rgb(192., 192., 192.),
141-
"gray" => rgb(128., 128., 128.),
142-
"white" => rgb(255., 255., 255.),
143-
"maroon" => rgb(128., 0., 0.),
144-
"red" => rgb(255., 0., 0.),
145-
"purple" => rgb(128., 0., 128.),
146-
"fuchsia" => rgb(255., 0., 255.),
147-
"green" => rgb(0., 128., 0.),
148-
"lime" => rgb(0., 255., 0.),
149-
"olive" => rgb(128., 128., 0.),
150-
"yellow" => rgb(255., 255., 0.),
151-
"navy" => rgb(0., 0., 128.),
152-
"blue" => rgb(0., 0., 255.),
153-
"teal" => rgb(0., 128., 128.),
154-
"aqua" => rgb(0., 255., 255.),
138+
match_ignore_ascii_case_with_table! { ident => Color,
139+
"black" => rgb!(0., 0., 0.),
140+
"silver" => rgb!(192., 192., 192.),
141+
"gray" => rgb!(128., 128., 128.),
142+
"white" => rgb!(255., 255., 255.),
143+
"maroon" => rgb!(128., 0., 0.),
144+
"red" => rgb!(255., 0., 0.),
145+
"purple" => rgb!(128., 0., 128.),
146+
"fuchsia" => rgb!(255., 0., 255.),
147+
"green" => rgb!(0., 128., 0.),
148+
"lime" => rgb!(0., 255., 0.),
149+
"olive" => rgb!(128., 128., 0.),
150+
"yellow" => rgb!(255., 255., 0.),
151+
"navy" => rgb!(0., 0., 128.),
152+
"blue" => rgb!(0., 0., 255.),
153+
"teal" => rgb!(0., 128., 128.),
154+
"aqua" => rgb!(0., 255., 255.),
155155

156-
"aliceblue" => rgb(240., 248., 255.),
157-
"antiquewhite" => rgb(250., 235., 215.),
158-
"aquamarine" => rgb(127., 255., 212.),
159-
"azure" => rgb(240., 255., 255.),
160-
"beige" => rgb(245., 245., 220.),
161-
"bisque" => rgb(255., 228., 196.),
162-
"blanchedalmond" => rgb(255., 235., 205.),
163-
"blueviolet" => rgb(138., 43., 226.),
164-
"brown" => rgb(165., 42., 42.),
165-
"burlywood" => rgb(222., 184., 135.),
166-
"cadetblue" => rgb(95., 158., 160.),
167-
"chartreuse" => rgb(127., 255., 0.),
168-
"chocolate" => rgb(210., 105., 30.),
169-
"coral" => rgb(255., 127., 80.),
170-
"cornflowerblue" => rgb(100., 149., 237.),
171-
"cornsilk" => rgb(255., 248., 220.),
172-
"crimson" => rgb(220., 20., 60.),
173-
"cyan" => rgb(0., 255., 255.),
174-
"darkblue" => rgb(0., 0., 139.),
175-
"darkcyan" => rgb(0., 139., 139.),
176-
"darkgoldenrod" => rgb(184., 134., 11.),
177-
"darkgray" => rgb(169., 169., 169.),
178-
"darkgreen" => rgb(0., 100., 0.),
179-
"darkgrey" => rgb(169., 169., 169.),
180-
"darkkhaki" => rgb(189., 183., 107.),
181-
"darkmagenta" => rgb(139., 0., 139.),
182-
"darkolivegreen" => rgb(85., 107., 47.),
183-
"darkorange" => rgb(255., 140., 0.),
184-
"darkorchid" => rgb(153., 50., 204.),
185-
"darkred" => rgb(139., 0., 0.),
186-
"darksalmon" => rgb(233., 150., 122.),
187-
"darkseagreen" => rgb(143., 188., 143.),
188-
"darkslateblue" => rgb(72., 61., 139.),
189-
"darkslategray" => rgb(47., 79., 79.),
190-
"darkslategrey" => rgb(47., 79., 79.),
191-
"darkturquoise" => rgb(0., 206., 209.),
192-
"darkviolet" => rgb(148., 0., 211.),
193-
"deeppink" => rgb(255., 20., 147.),
194-
"deepskyblue" => rgb(0., 191., 255.),
195-
"dimgray" => rgb(105., 105., 105.),
196-
"dimgrey" => rgb(105., 105., 105.),
197-
"dodgerblue" => rgb(30., 144., 255.),
198-
"firebrick" => rgb(178., 34., 34.),
199-
"floralwhite" => rgb(255., 250., 240.),
200-
"forestgreen" => rgb(34., 139., 34.),
201-
"gainsboro" => rgb(220., 220., 220.),
202-
"ghostwhite" => rgb(248., 248., 255.),
203-
"gold" => rgb(255., 215., 0.),
204-
"goldenrod" => rgb(218., 165., 32.),
205-
"greenyellow" => rgb(173., 255., 47.),
206-
"grey" => rgb(128., 128., 128.),
207-
"honeydew" => rgb(240., 255., 240.),
208-
"hotpink" => rgb(255., 105., 180.),
209-
"indianred" => rgb(205., 92., 92.),
210-
"indigo" => rgb(75., 0., 130.),
211-
"ivory" => rgb(255., 255., 240.),
212-
"khaki" => rgb(240., 230., 140.),
213-
"lavender" => rgb(230., 230., 250.),
214-
"lavenderblush" => rgb(255., 240., 245.),
215-
"lawngreen" => rgb(124., 252., 0.),
216-
"lemonchiffon" => rgb(255., 250., 205.),
217-
"lightblue" => rgb(173., 216., 230.),
218-
"lightcoral" => rgb(240., 128., 128.),
219-
"lightcyan" => rgb(224., 255., 255.),
220-
"lightgoldenrodyellow" => rgb(250., 250., 210.),
221-
"lightgray" => rgb(211., 211., 211.),
222-
"lightgreen" => rgb(144., 238., 144.),
223-
"lightgrey" => rgb(211., 211., 211.),
224-
"lightpink" => rgb(255., 182., 193.),
225-
"lightsalmon" => rgb(255., 160., 122.),
226-
"lightseagreen" => rgb(32., 178., 170.),
227-
"lightskyblue" => rgb(135., 206., 250.),
228-
"lightslategray" => rgb(119., 136., 153.),
229-
"lightslategrey" => rgb(119., 136., 153.),
230-
"lightsteelblue" => rgb(176., 196., 222.),
231-
"lightyellow" => rgb(255., 255., 224.),
232-
"limegreen" => rgb(50., 205., 50.),
233-
"linen" => rgb(250., 240., 230.),
234-
"magenta" => rgb(255., 0., 255.),
235-
"mediumaquamarine" => rgb(102., 205., 170.),
236-
"mediumblue" => rgb(0., 0., 205.),
237-
"mediumorchid" => rgb(186., 85., 211.),
238-
"mediumpurple" => rgb(147., 112., 219.),
239-
"mediumseagreen" => rgb(60., 179., 113.),
240-
"mediumslateblue" => rgb(123., 104., 238.),
241-
"mediumspringgreen" => rgb(0., 250., 154.),
242-
"mediumturquoise" => rgb(72., 209., 204.),
243-
"mediumvioletred" => rgb(199., 21., 133.),
244-
"midnightblue" => rgb(25., 25., 112.),
245-
"mintcream" => rgb(245., 255., 250.),
246-
"mistyrose" => rgb(255., 228., 225.),
247-
"moccasin" => rgb(255., 228., 181.),
248-
"navajowhite" => rgb(255., 222., 173.),
249-
"oldlace" => rgb(253., 245., 230.),
250-
"olivedrab" => rgb(107., 142., 35.),
251-
"orange" => rgb(255., 165., 0.),
252-
"orangered" => rgb(255., 69., 0.),
253-
"orchid" => rgb(218., 112., 214.),
254-
"palegoldenrod" => rgb(238., 232., 170.),
255-
"palegreen" => rgb(152., 251., 152.),
256-
"paleturquoise" => rgb(175., 238., 238.),
257-
"palevioletred" => rgb(219., 112., 147.),
258-
"papayawhip" => rgb(255., 239., 213.),
259-
"peachpuff" => rgb(255., 218., 185.),
260-
"peru" => rgb(205., 133., 63.),
261-
"pink" => rgb(255., 192., 203.),
262-
"plum" => rgb(221., 160., 221.),
263-
"powderblue" => rgb(176., 224., 230.),
264-
"rebeccapurple" => rgb(102., 51., 153.),
265-
"rosybrown" => rgb(188., 143., 143.),
266-
"royalblue" => rgb(65., 105., 225.),
267-
"saddlebrown" => rgb(139., 69., 19.),
268-
"salmon" => rgb(250., 128., 114.),
269-
"sandybrown" => rgb(244., 164., 96.),
270-
"seagreen" => rgb(46., 139., 87.),
271-
"seashell" => rgb(255., 245., 238.),
272-
"sienna" => rgb(160., 82., 45.),
273-
"skyblue" => rgb(135., 206., 235.),
274-
"slateblue" => rgb(106., 90., 205.),
275-
"slategray" => rgb(112., 128., 144.),
276-
"slategrey" => rgb(112., 128., 144.),
277-
"snow" => rgb(255., 250., 250.),
278-
"springgreen" => rgb(0., 255., 127.),
279-
"steelblue" => rgb(70., 130., 180.),
280-
"tan" => rgb(210., 180., 140.),
281-
"thistle" => rgb(216., 191., 216.),
282-
"tomato" => rgb(255., 99., 71.),
283-
"turquoise" => rgb(64., 224., 208.),
284-
"violet" => rgb(238., 130., 238.),
285-
"wheat" => rgb(245., 222., 179.),
286-
"whitesmoke" => rgb(245., 245., 245.),
287-
"yellowgreen" => rgb(154., 205., 50.),
156+
"aliceblue" => rgb!(240., 248., 255.),
157+
"antiquewhite" => rgb!(250., 235., 215.),
158+
"aquamarine" => rgb!(127., 255., 212.),
159+
"azure" => rgb!(240., 255., 255.),
160+
"beige" => rgb!(245., 245., 220.),
161+
"bisque" => rgb!(255., 228., 196.),
162+
"blanchedalmond" => rgb!(255., 235., 205.),
163+
"blueviolet" => rgb!(138., 43., 226.),
164+
"brown" => rgb!(165., 42., 42.),
165+
"burlywood" => rgb!(222., 184., 135.),
166+
"cadetblue" => rgb!(95., 158., 160.),
167+
"chartreuse" => rgb!(127., 255., 0.),
168+
"chocolate" => rgb!(210., 105., 30.),
169+
"coral" => rgb!(255., 127., 80.),
170+
"cornflowerblue" => rgb!(100., 149., 237.),
171+
"cornsilk" => rgb!(255., 248., 220.),
172+
"crimson" => rgb!(220., 20., 60.),
173+
"cyan" => rgb!(0., 255., 255.),
174+
"darkblue" => rgb!(0., 0., 139.),
175+
"darkcyan" => rgb!(0., 139., 139.),
176+
"darkgoldenrod" => rgb!(184., 134., 11.),
177+
"darkgray" => rgb!(169., 169., 169.),
178+
"darkgreen" => rgb!(0., 100., 0.),
179+
"darkgrey" => rgb!(169., 169., 169.),
180+
"darkkhaki" => rgb!(189., 183., 107.),
181+
"darkmagenta" => rgb!(139., 0., 139.),
182+
"darkolivegreen" => rgb!(85., 107., 47.),
183+
"darkorange" => rgb!(255., 140., 0.),
184+
"darkorchid" => rgb!(153., 50., 204.),
185+
"darkred" => rgb!(139., 0., 0.),
186+
"darksalmon" => rgb!(233., 150., 122.),
187+
"darkseagreen" => rgb!(143., 188., 143.),
188+
"darkslateblue" => rgb!(72., 61., 139.),
189+
"darkslategray" => rgb!(47., 79., 79.),
190+
"darkslategrey" => rgb!(47., 79., 79.),
191+
"darkturquoise" => rgb!(0., 206., 209.),
192+
"darkviolet" => rgb!(148., 0., 211.),
193+
"deeppink" => rgb!(255., 20., 147.),
194+
"deepskyblue" => rgb!(0., 191., 255.),
195+
"dimgray" => rgb!(105., 105., 105.),
196+
"dimgrey" => rgb!(105., 105., 105.),
197+
"dodgerblue" => rgb!(30., 144., 255.),
198+
"firebrick" => rgb!(178., 34., 34.),
199+
"floralwhite" => rgb!(255., 250., 240.),
200+
"forestgreen" => rgb!(34., 139., 34.),
201+
"gainsboro" => rgb!(220., 220., 220.),
202+
"ghostwhite" => rgb!(248., 248., 255.),
203+
"gold" => rgb!(255., 215., 0.),
204+
"goldenrod" => rgb!(218., 165., 32.),
205+
"greenyellow" => rgb!(173., 255., 47.),
206+
"grey" => rgb!(128., 128., 128.),
207+
"honeydew" => rgb!(240., 255., 240.),
208+
"hotpink" => rgb!(255., 105., 180.),
209+
"indianred" => rgb!(205., 92., 92.),
210+
"indigo" => rgb!(75., 0., 130.),
211+
"ivory" => rgb!(255., 255., 240.),
212+
"khaki" => rgb!(240., 230., 140.),
213+
"lavender" => rgb!(230., 230., 250.),
214+
"lavenderblush" => rgb!(255., 240., 245.),
215+
"lawngreen" => rgb!(124., 252., 0.),
216+
"lemonchiffon" => rgb!(255., 250., 205.),
217+
"lightblue" => rgb!(173., 216., 230.),
218+
"lightcoral" => rgb!(240., 128., 128.),
219+
"lightcyan" => rgb!(224., 255., 255.),
220+
"lightgoldenrodyellow" => rgb!(250., 250., 210.),
221+
"lightgray" => rgb!(211., 211., 211.),
222+
"lightgreen" => rgb!(144., 238., 144.),
223+
"lightgrey" => rgb!(211., 211., 211.),
224+
"lightpink" => rgb!(255., 182., 193.),
225+
"lightsalmon" => rgb!(255., 160., 122.),
226+
"lightseagreen" => rgb!(32., 178., 170.),
227+
"lightskyblue" => rgb!(135., 206., 250.),
228+
"lightslategray" => rgb!(119., 136., 153.),
229+
"lightslategrey" => rgb!(119., 136., 153.),
230+
"lightsteelblue" => rgb!(176., 196., 222.),
231+
"lightyellow" => rgb!(255., 255., 224.),
232+
"limegreen" => rgb!(50., 205., 50.),
233+
"linen" => rgb!(250., 240., 230.),
234+
"magenta" => rgb!(255., 0., 255.),
235+
"mediumaquamarine" => rgb!(102., 205., 170.),
236+
"mediumblue" => rgb!(0., 0., 205.),
237+
"mediumorchid" => rgb!(186., 85., 211.),
238+
"mediumpurple" => rgb!(147., 112., 219.),
239+
"mediumseagreen" => rgb!(60., 179., 113.),
240+
"mediumslateblue" => rgb!(123., 104., 238.),
241+
"mediumspringgreen" => rgb!(0., 250., 154.),
242+
"mediumturquoise" => rgb!(72., 209., 204.),
243+
"mediumvioletred" => rgb!(199., 21., 133.),
244+
"midnightblue" => rgb!(25., 25., 112.),
245+
"mintcream" => rgb!(245., 255., 250.),
246+
"mistyrose" => rgb!(255., 228., 225.),
247+
"moccasin" => rgb!(255., 228., 181.),
248+
"navajowhite" => rgb!(255., 222., 173.),
249+
"oldlace" => rgb!(253., 245., 230.),
250+
"olivedrab" => rgb!(107., 142., 35.),
251+
"orange" => rgb!(255., 165., 0.),
252+
"orangered" => rgb!(255., 69., 0.),
253+
"orchid" => rgb!(218., 112., 214.),
254+
"palegoldenrod" => rgb!(238., 232., 170.),
255+
"palegreen" => rgb!(152., 251., 152.),
256+
"paleturquoise" => rgb!(175., 238., 238.),
257+
"palevioletred" => rgb!(219., 112., 147.),
258+
"papayawhip" => rgb!(255., 239., 213.),
259+
"peachpuff" => rgb!(255., 218., 185.),
260+
"peru" => rgb!(205., 133., 63.),
261+
"pink" => rgb!(255., 192., 203.),
262+
"plum" => rgb!(221., 160., 221.),
263+
"powderblue" => rgb!(176., 224., 230.),
264+
"rebeccapurple" => rgb!(102., 51., 153.),
265+
"rosybrown" => rgb!(188., 143., 143.),
266+
"royalblue" => rgb!(65., 105., 225.),
267+
"saddlebrown" => rgb!(139., 69., 19.),
268+
"salmon" => rgb!(250., 128., 114.),
269+
"sandybrown" => rgb!(244., 164., 96.),
270+
"seagreen" => rgb!(46., 139., 87.),
271+
"seashell" => rgb!(255., 245., 238.),
272+
"sienna" => rgb!(160., 82., 45.),
273+
"skyblue" => rgb!(135., 206., 235.),
274+
"slateblue" => rgb!(106., 90., 205.),
275+
"slategray" => rgb!(112., 128., 144.),
276+
"slategrey" => rgb!(112., 128., 144.),
277+
"snow" => rgb!(255., 250., 250.),
278+
"springgreen" => rgb!(0., 255., 127.),
279+
"steelblue" => rgb!(70., 130., 180.),
280+
"tan" => rgb!(210., 180., 140.),
281+
"thistle" => rgb!(216., 191., 216.),
282+
"tomato" => rgb!(255., 99., 71.),
283+
"turquoise" => rgb!(64., 224., 208.),
284+
"violet" => rgb!(238., 130., 238.),
285+
"wheat" => rgb!(245., 222., 179.),
286+
"whitesmoke" => rgb!(245., 245., 245.),
287+
"yellowgreen" => rgb!(154., 205., 50.),
288288

289-
"transparent" => Ok(Color::RGBA(RGBA { red: 0., green: 0., blue: 0., alpha: 0. })),
290-
"currentcolor" => Ok(Color::CurrentColor),
291-
_ => Err(())
289+
"transparent" => Color::RGBA(RGBA { red: 0., green: 0., blue: 0., alpha: 0. }),
290+
"currentcolor" => Color::CurrentColor,
292291
}
293292
}
294293

@@ -314,21 +313,23 @@ fn parse_color_hash(value: &str) -> Result<Color, ()> {
314313
(try!(from_hex(value[4])) * 16 + try!(from_hex(value[5]))) as f32,
315314
(try!(from_hex(value[6])) * 16 + try!(from_hex(value[7]))) as f32,
316315
),
317-
6 => rgb(
316+
6 => rgba(
318317
(try!(from_hex(value[0])) * 16 + try!(from_hex(value[1]))) as f32,
319318
(try!(from_hex(value[2])) * 16 + try!(from_hex(value[3]))) as f32,
320319
(try!(from_hex(value[4])) * 16 + try!(from_hex(value[5]))) as f32,
320+
255.
321321
),
322322
4 => rgba(
323323
(try!(from_hex(value[0])) * 17) as f32,
324324
(try!(from_hex(value[1])) * 17) as f32,
325325
(try!(from_hex(value[2])) * 17) as f32,
326326
(try!(from_hex(value[3])) * 17) as f32,
327327
),
328-
3 => rgb(
328+
3 => rgba(
329329
(try!(from_hex(value[0])) * 17) as f32,
330330
(try!(from_hex(value[1])) * 17) as f32,
331331
(try!(from_hex(value[2])) * 17) as f32,
332+
255.
332333
),
333334
_ => Err(())
334335
}

src/lib.rs

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -136,6 +136,27 @@ macro_rules! match_ignore_ascii_case {
136136
};
137137
}
138138

139+
macro_rules! match_ignore_ascii_case_with_table {
140+
( $input: expr => $ty: ty, $($keyword: expr => $value: expr,)* ) => {
141+
{
142+
use std::ascii::AsciiExt;
143+
static MATCH_IGNORE_ASCII_CASE_TABLE: &'static [(&'static str, $ty)] = &[
144+
$(
145+
($keyword, $value),
146+
)*
147+
];
148+
let mut result = Err(());
149+
let input = $input;
150+
for &(keyword, value) in MATCH_IGNORE_ASCII_CASE_TABLE {
151+
if keyword.eq_ignore_ascii_case(&input) {
152+
result = Ok(value)
153+
}
154+
}
155+
result
156+
}
157+
};
158+
}
159+
139160
mod rules_and_declarations;
140161

141162
#[cfg(feature = "dummy_match_byte")]

0 commit comments

Comments
 (0)