From 76a1f4ac381d583c1ece86e76c108e81bec3e3c2 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Iv=C3=A1n=20S=C3=A1nchez=20Ortega?= Date: Tue, 21 Feb 2017 12:47:35 +0100 Subject: [PATCH 1/3] Accept #rgba and #rrggbbaa notation --- csscolorparser.js | 27 +++++++++++++++++++++------ 1 file changed, 21 insertions(+), 6 deletions(-) diff --git a/csscolorparser.js b/csscolorparser.js index 4dba075..e97759c 100644 --- a/csscolorparser.js +++ b/csscolorparser.js @@ -138,20 +138,35 @@ function parseCSSColor(css_str) { // #abc and #abc123 syntax. if (str[0] === '#') { + var iv = parseInt(str.substr(1), 16); // TODO(deanm): Stricter parsing. if (str.length === 4) { - var iv = parseInt(str.substr(1), 16); // TODO(deanm): Stricter parsing. + // #rgb if (!(iv >= 0 && iv <= 0xfff)) return null; // Covers NaN. return [((iv & 0xf00) >> 4) | ((iv & 0xf00) >> 8), - (iv & 0xf0) | ((iv & 0xf0) >> 4), - (iv & 0xf) | ((iv & 0xf) << 4), + (iv & 0x0f0) | ((iv & 0x0f0) >> 4), + ((iv & 0x00f) << 4) | (iv & 0x00f), 1]; } else if (str.length === 7) { - var iv = parseInt(str.substr(1), 16); // TODO(deanm): Stricter parsing. + // #rrggbb if (!(iv >= 0 && iv <= 0xffffff)) return null; // Covers NaN. return [(iv & 0xff0000) >> 16, - (iv & 0xff00) >> 8, - iv & 0xff, + (iv & 0x00ff00) >> 8, + iv & 0x0000ff, 1]; + } else if (str.length === 5) { + // #rgba + if (!(iv >= 0 && iv <= 0xffff)) return null; // Covers NaN. + return [((iv & 0xf000) >> 8) | ((iv & 0xf000) >> 12), + ((iv & 0x0f00) >> 4) | ((iv & 0x0f00) >> 8), + (iv & 0x00f0) | ((iv & 0x00f0) >> 4), + ((iv & 0x000f) << 4 | (iv & 0x000f)) / 256]; + } else if (str.length === 9) { + // #rrggbbaa + if (!(iv >= 0 && iv <= 0xffffffff)) return null; // Covers NaN. + return [(iv & 0xff000000) >> 24, + (iv & 0x00ff0000) >> 16, + (iv & 0x0000ff00) >> 8, + (iv & 0x000000ff) / 256]; } return null; From 1e15484d4aa53fe1c633b9f29d6ef8ad88754c19 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Iv=C3=A1n=20S=C3=A1nchez=20Ortega?= Date: Tue, 21 Feb 2017 14:11:52 +0100 Subject: [PATCH 2/3] Work around complement-2 negative numers when right-shifting 32-bit ints --- csscolorparser.js | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/csscolorparser.js b/csscolorparser.js index e97759c..c9c4159 100644 --- a/csscolorparser.js +++ b/csscolorparser.js @@ -163,10 +163,10 @@ function parseCSSColor(css_str) { } else if (str.length === 9) { // #rrggbbaa if (!(iv >= 0 && iv <= 0xffffffff)) return null; // Covers NaN. - return [(iv & 0xff000000) >> 24, - (iv & 0x00ff0000) >> 16, - (iv & 0x0000ff00) >> 8, - (iv & 0x000000ff) / 256]; + return [((iv & 0xff000000) >> 24) & 0xff, + (iv & 0x00ff0000) >> 16, + (iv & 0x0000ff00) >> 8, + (iv & 0x000000ff) / 256]; } return null; From 8e84a5b972054be1c2d1a15bd604dfd63380c91d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Iv=C3=A1n=20S=C3=A1nchez=20Ortega?= Date: Tue, 21 Feb 2017 15:11:09 +0100 Subject: [PATCH 3/3] Divide alpha byte by 255, not by 256, because 0xff => 1.0 --- csscolorparser.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/csscolorparser.js b/csscolorparser.js index c9c4159..d1be6a1 100644 --- a/csscolorparser.js +++ b/csscolorparser.js @@ -159,14 +159,14 @@ function parseCSSColor(css_str) { return [((iv & 0xf000) >> 8) | ((iv & 0xf000) >> 12), ((iv & 0x0f00) >> 4) | ((iv & 0x0f00) >> 8), (iv & 0x00f0) | ((iv & 0x00f0) >> 4), - ((iv & 0x000f) << 4 | (iv & 0x000f)) / 256]; + ((iv & 0x000f) << 4 | (iv & 0x000f)) / 255]; } else if (str.length === 9) { // #rrggbbaa if (!(iv >= 0 && iv <= 0xffffffff)) return null; // Covers NaN. return [((iv & 0xff000000) >> 24) & 0xff, (iv & 0x00ff0000) >> 16, (iv & 0x0000ff00) >> 8, - (iv & 0x000000ff) / 256]; + (iv & 0x000000ff) / 255]; } return null;