@@ -259,11 +259,18 @@ std::vector<std::string> split(const std::string& s, char delim) {
259
259
}
260
260
261
261
Color CSSColorParser::parse (const std::string& css_str) {
262
+ int length = css_str.length ();
263
+
264
+ if (length == 0 ) {
265
+ return {};
266
+ }
262
267
263
268
// #abc and #abc123 syntax.
264
- if (css_str.length () && css_str.front () == ' #' ) {
265
- if (css_str.length () == 4 ) {
266
- int64_t iv = parseInt (css_str.c_str ()+1 , 16 ); // TODO(deanm): Stricter parsing.
269
+ if (css_str.front () == ' #' ) {
270
+ const char * str = css_str.c_str ()+1 ;
271
+
272
+ if (length == 4 ) { // rgb
273
+ int64_t iv = parseInt (str, 16 ); // TODO(deanm): Stricter parsing.
267
274
if (!(iv >= 0 && iv <= 0xfff )) {
268
275
return {};
269
276
} else {
@@ -274,8 +281,8 @@ Color CSSColorParser::parse(const std::string& css_str) {
274
281
1
275
282
};
276
283
}
277
- } else if (css_str. length () == 7 ) {
278
- int64_t iv = parseInt (css_str. c_str ()+ 1 , 16 ); // TODO(deanm): Stricter parsing.
284
+ } else if (length == 7 ) { // rrggbb
285
+ int64_t iv = parseInt (str , 16 );
279
286
if (!(iv >= 0 && iv <= 0xffffff )) {
280
287
return {}; // Covers NaN.
281
288
} else {
@@ -286,8 +293,31 @@ Color CSSColorParser::parse(const std::string& css_str) {
286
293
1
287
294
};
288
295
}
296
+ } else if (length == 5 ) { // argb
297
+ int64_t iv = parseInt (str, 16 );
298
+ if (!(iv >= 0 && iv <= 0xffff )) {
299
+ return {};
300
+ } else {
301
+ return {
302
+ static_cast <uint8_t >(((iv & 0xf00 ) >> 4 ) | ((iv & 0xf00 ) >> 8 )),
303
+ static_cast <uint8_t >((iv & 0xf0 ) | ((iv & 0xf0 ) >> 4 )),
304
+ static_cast <uint8_t >((iv & 0xf ) | ((iv & 0xf ) << 4 )),
305
+ static_cast <uint8_t >((iv & 0xf000 ) >> 12 ) / 255 .0f ,
306
+ };
307
+ }
308
+ } else if (length == 9 ) { // aarrggbb
309
+ int64_t iv = parseInt (str, 16 );
310
+ if (!(iv >= 0 && iv <= 0xffffffff )) {
311
+ return {}; // Covers NaN.
312
+ } else {
313
+ return {
314
+ static_cast <uint8_t >((iv & 0xff0000 ) >> 16 ),
315
+ static_cast <uint8_t >((iv & 0xff00 ) >> 8 ),
316
+ static_cast <uint8_t >(iv & 0xff ),
317
+ static_cast <uint8_t >((iv & 0xff000000 ) >> 24 ) / 255 .0f ,
318
+ };
319
+ }
289
320
}
290
-
291
321
return {};
292
322
}
293
323
0 commit comments