diff --git a/lib/extract/extractColor.js b/lib/extract/extractColor.js index 570dcf13..454ffe4f 100644 --- a/lib/extract/extractColor.js +++ b/lib/extract/extractColor.js @@ -265,143 +265,142 @@ function hwbFromString(string) { return null; } -const convert = { - hsl: function hslToRgb(hsl) { - const h = hsl[0] / 360; - const s = hsl[1] / 100; - const l = hsl[2] / 100; - let t1; - let t2; - let t3; - let rgb; - let val; +function hslToRgb(hsl) { + const h = hsl[0] / 360; + const s = hsl[1] / 100; + const l = hsl[2] / 100; + let t1; + let t2; + let t3; + let rgb; + let val; - if (s === 0) { - val = l * 255; - return [val, val, val]; + if (s === 0) { + val = l * 255; + return [val, val, val]; + } + + if (l < 0.5) { + t2 = l * (1 + s); + } else { + t2 = l + s - l * s; + } + + t1 = 2 * l - t2; + + rgb = [0, 0, 0]; + for (let i = 0; i < 3; i++) { + t3 = h + (1 / 3) * -(i - 1); + if (t3 < 0) { + t3++; + } + if (t3 > 1) { + t3--; } - if (l < 0.5) { - t2 = l * (1 + s); + if (6 * t3 < 1) { + val = t1 + (t2 - t1) * 6 * t3; + } else if (2 * t3 < 1) { + val = t2; + } else if (3 * t3 < 2) { + val = t1 + (t2 - t1) * (2 / 3 - t3) * 6; } else { - t2 = l + s - l * s; + val = t1; } - t1 = 2 * l - t2; + rgb[i] = val * 255; + } - rgb = [0, 0, 0]; - for (let i = 0; i < 3; i++) { - t3 = h + (1 / 3) * -(i - 1); - if (t3 < 0) { - t3++; - } - if (t3 > 1) { - t3--; - } + return rgb; +} - if (6 * t3 < 1) { - val = t1 + (t2 - t1) * 6 * t3; - } else if (2 * t3 < 1) { - val = t2; - } else if (3 * t3 < 2) { - val = t1 + (t2 - t1) * (2 / 3 - t3) * 6; - } else { - val = t1; - } +function hwbToRgb(hwb) { + const h = hwb[0] / 360; + let wh = hwb[1] / 100; + let bl = hwb[2] / 100; + const ratio = wh + bl; + let i; + let v; + let f; + let n; - rgb[i] = val * 255; - } + // wh + bl cant be > 1 + if (ratio > 1) { + wh /= ratio; + bl /= ratio; + } - return rgb; - }, - hwb: function hwbToRgb(hwb) { - const h = hwb[0] / 360; - let wh = hwb[1] / 100; - let bl = hwb[2] / 100; - const ratio = wh + bl; - let i; - let v; - let f; - let n; + i = Math.floor(6 * h); + v = 1 - bl; + f = 6 * h - i; - // wh + bl cant be > 1 - if (ratio > 1) { - wh /= ratio; - bl /= ratio; - } + if ((i & 0x01) !== 0) { + f = 1 - f; + } - i = Math.floor(6 * h); - v = 1 - bl; - f = 6 * h - i; + n = wh + f * (v - wh); // linear interpolation - if ((i & 0x01) !== 0) { - f = 1 - f; - } + let r; + let g; + let b; + switch (i) { + default: + case 6: + case 0: + r = v; + g = n; + b = wh; + break; + case 1: + r = n; + g = v; + b = wh; + break; + case 2: + r = wh; + g = v; + b = n; + break; + case 3: + r = wh; + g = n; + b = v; + break; + case 4: + r = n; + g = wh; + b = v; + break; + case 5: + r = v; + g = wh; + b = n; + break; + } - n = wh + f * (v - wh); // linear interpolation + return [r * 255, g * 255, b * 255]; +} - let r; - let g; - let b; - switch (i) { - default: - case 6: - case 0: - r = v; - g = n; - b = wh; - break; - case 1: - r = n; - g = v; - b = wh; - break; - case 2: - r = wh; - g = v; - b = n; - break; - case 3: - r = wh; - g = n; - b = v; - break; - case 4: - r = n; - g = wh; - b = v; - break; - case 5: - r = v; - g = wh; - b = n; - break; - } - - return [r * 255, g * 255, b * 255]; - }, -}; - -function colorFromString(string) { +export default function extractColor(string) { if (!string || typeof string !== 'string') { return null; } const prefix = string.substring(0, 3).toLowerCase(); + let value; - let model; + let converter; switch (prefix) { case 'hsl': value = hslFromString(string); - model = 'hsl'; + converter = hslToRgb; break; case 'hwb': value = hwbFromString(string); - model = 'hwb'; + converter = hwbToRgb; break; default: value = rgbFromString(string); - model = 'rgb'; break; } @@ -409,15 +408,5 @@ function colorFromString(string) { return null; } - return [model, value]; -} - -export default function extractColor(color) { - const result = colorFromString(color); - if (!result) { - return null; - } - const model = result[0]; - const value = result[1]; - return model === 'rgb' ? value : convert[model](value).concat(value[3]); + return converter ? converter(value).concat(value[3]) : value; }