UNPKG

color-space

Version:

Collection of color space conversions

1,888 lines (1,852 loc) 55.3 kB
// rgb.js var rgb = { name: "rgb", min: [0, 0, 0], max: [255, 255, 255], channel: ["red", "green", "blue"], alias: ["RGB"] }; var rgb_default = rgb; // hsl.js var hsl = { name: "hsl", min: [0, 0, 0], max: [360, 100, 100], channel: ["hue", "saturation", "lightness"], alias: ["HSL"], rgb: function(hsl2) { var h = hsl2[0] / 360, s = hsl2[1] / 100, l2 = hsl2[2] / 100, t1, t2, t3, rgb2, val, i2 = 0; if (s === 0) return val = l2 * 255, [val, val, val]; t2 = l2 < 0.5 ? l2 * (1 + s) : l2 + s - l2 * s; t1 = 2 * l2 - t2; rgb2 = [0, 0, 0]; for (; i2 < 3; ) { t3 = h + 1 / 3 * -(i2 - 1); t3 < 0 ? t3++ : t3 > 1 && t3--; val = 6 * t3 < 1 ? t1 + (t2 - t1) * 6 * t3 : 2 * t3 < 1 ? t2 : 3 * t3 < 2 ? t1 + (t2 - t1) * (2 / 3 - t3) * 6 : t1; rgb2[i2++] = val * 255; } return rgb2; } }; var hsl_default = hsl; rgb_default.hsl = function(rgb2) { var r2 = rgb2[0] / 255, g2 = rgb2[1] / 255, b = rgb2[2] / 255, min = Math.min(r2, g2, b), max = Math.max(r2, g2, b), delta = max - min, h, s, l2; if (max === min) { h = 0; } else if (r2 === max) { h = (g2 - b) / delta; } else if (g2 === max) { h = 2 + (b - r2) / delta; } else if (b === max) { h = 4 + (r2 - g2) / delta; } h = Math.min(h * 60, 360); if (h < 0) { h += 360; } l2 = (min + max) / 2; if (max === min) { s = 0; } else if (l2 <= 0.5) { s = delta / (max + min); } else { s = delta / (2 - max - min); } return [h, s * 100, l2 * 100]; }; // hsv.js var hsv = { name: "hsv", min: [0, 0, 0], max: [360, 100, 100], channel: ["hue", "saturation", "value"], alias: ["HSV", "HSB"], rgb: function(hsv2) { var h = hsv2[0] / 60, s = hsv2[1] / 100, v2 = hsv2[2] / 100, hi = Math.floor(h) % 6; var f2 = h - Math.floor(h), p2 = 255 * v2 * (1 - s), q2 = 255 * v2 * (1 - s * f2), t2 = 255 * v2 * (1 - s * (1 - f2)); v2 *= 255; switch (hi) { case 0: return [v2, t2, p2]; case 1: return [q2, v2, p2]; case 2: return [p2, v2, t2]; case 3: return [p2, q2, v2]; case 4: return [t2, p2, v2]; case 5: return [v2, p2, q2]; } }, hsl: function(hsv2) { var h = hsv2[0], s = hsv2[1] / 100, v2 = hsv2[2] / 100, sl, l2; l2 = (2 - s) * v2; sl = s * v2; sl /= l2 <= 1 ? l2 : 2 - l2; sl = sl || 0; l2 /= 2; return [h, sl * 100, l2 * 100]; } }; var hsv_default = hsv; rgb_default.hsv = function(rgb2) { var r2 = rgb2[0], g2 = rgb2[1], b = rgb2[2], min = Math.min(r2, g2, b), max = Math.max(r2, g2, b), delta = max - min, h, s, v2; if (max === 0) { s = 0; } else { s = delta / max * 100; } if (max === min) { h = 0; } else if (r2 === max) { h = (g2 - b) / delta; } else if (g2 === max) { h = 2 + (b - r2) / delta; } else if (b === max) { h = 4 + (r2 - g2) / delta; } h = Math.min(h * 60, 360); if (h < 0) { h += 360; } v2 = max / 255 * 1e3 / 10; return [h, s, v2]; }; hsl_default.hsv = function(hsl2) { var h = hsl2[0], s = hsl2[1] / 100, l2 = hsl2[2] / 100, sv, v2; l2 *= 2; s *= l2 <= 1 ? l2 : 2 - l2; v2 = (l2 + s) / 2; sv = 2 * s / (l2 + s) || 0; return [h, sv * 100, v2 * 100]; }; // hsi.js var hsi = { name: "hsi", min: [0, 0, 0], max: [360, 100, 255], channel: ["hue", "saturation", "intensity"], alias: ["HSI"] }; var hsi_default = hsi; hsi.rgb = function(hsi2) { var h = (hsi2[0] < 0 ? hsi2[0] % 360 + 360 : hsi2[0] % 360) * Math.PI / 180; var s = Math.max(0, Math.min(hsi2[1], 100)) / 100; var i2 = Math.max(0, Math.min(hsi2[2], 255)) / 255; var pi3 = Math.PI / 3; var r2, g2, b; if (h < 2 * pi3) { b = i2 * (1 - s); r2 = i2 * (1 + s * Math.cos(h) / Math.cos(pi3 - h)); g2 = i2 * (1 + s * (1 - Math.cos(h) / Math.cos(pi3 - h))); } else if (h < 4 * pi3) { h = h - 2 * pi3; r2 = i2 * (1 - s); g2 = i2 * (1 + s * Math.cos(h) / Math.cos(pi3 - h)); b = i2 * (1 + s * (1 - Math.cos(h) / Math.cos(pi3 - h))); } else { h = h - 4 * pi3; g2 = i2 * (1 - s); b = i2 * (1 + s * Math.cos(h) / Math.cos(pi3 - h)); r2 = i2 * (1 + s * (1 - Math.cos(h) / Math.cos(pi3 - h))); } return [r2 * 255, g2 * 255, b * 255]; }; rgb_default.hsi = function(rgb2) { var sum = rgb2[0] + rgb2[1] + rgb2[2]; var r2 = rgb2[0] / sum; var g2 = rgb2[1] / sum; var b = rgb2[2] / sum; var h = Math.acos( 0.5 * (r2 - g2 + (r2 - b)) / Math.sqrt((r2 - g2) * (r2 - g2) + (r2 - b) * (g2 - b)) ); if (b > g2) { h = 2 * Math.PI - h; } var s = 1 - 3 * Math.min(r2, g2, b); var i2 = sum / 3; return [h * 180 / Math.PI, s * 100, i2]; }; // hwb.js var hwb = { name: "hwb", min: [0, 0, 0], max: [360, 100, 100], channel: ["hue", "whiteness", "blackness"], alias: ["HWB"], // http://dev.w3.org/csswg/css-color/#hwb-to-rgb rgb: function(hwb2) { var h = hwb2[0] / 360, wh = hwb2[1] / 100, bl = hwb2[2] / 100, ratio = wh + bl, i2, v2, f2, n2; var r2, g2, b; if (ratio > 1) { wh /= ratio; bl /= ratio; } i2 = Math.floor(6 * h); v2 = 1 - bl; f2 = 6 * h - i2; if ((i2 & 1) !== 0) { f2 = 1 - f2; } n2 = wh + f2 * (v2 - wh); switch (i2) { default: case 6: case 0: r2 = v2; g2 = n2; b = wh; break; case 1: r2 = n2; g2 = v2; b = wh; break; case 2: r2 = wh; g2 = v2; b = n2; break; case 3: r2 = wh; g2 = n2; b = v2; break; case 4: r2 = n2; g2 = wh; b = v2; break; case 5: r2 = v2; g2 = wh; b = n2; break; } return [r2 * 255, g2 * 255, b * 255]; }, // http://alvyray.com/Papers/CG/HWB_JGTv208.pdf hsv: function(arg) { var h = arg[0], w = arg[1], b = arg[2], s, v2; if (w + b >= 100) { s = 0; v2 = 100 * w / (w + b); } else { s = 100 - w / (1 - b / 100); v2 = 100 - b; } return [h, s, v2]; }, hsl: function(arg) { return hsv_default.hsl(hwb.hsv(arg)); } }; var hwb_default = hwb; rgb_default.hwb = function(val) { var r2 = val[0], g2 = val[1], b = val[2], h = rgb_default.hsl(val)[0], w = 1 / 255 * Math.min(r2, Math.min(g2, b)); b = 1 - 1 / 255 * Math.max(r2, Math.max(g2, b)); return [h, w * 100, b * 100]; }; hsv_default.hwb = function(arg) { var h = arg[0], s = arg[1], v2 = arg[2]; return [h, v2 === 0 ? 0 : v2 * (1 - s / 100), 100 - v2]; }; hsl_default.hwb = function(arg) { return hsv_default.hwb(hsl_default.hsv(arg)); }; // cmyk.js var cmyk = { name: "cmyk", min: [0, 0, 0, 0], max: [100, 100, 100, 100], channel: ["cyan", "magenta", "yellow", "black"], alias: ["CMYK"], rgb: (cmyk2) => { let c = cmyk2[0] / 100, m2 = cmyk2[1] / 100, y = cmyk2[2] / 100, k2 = cmyk2[3] / 100, r2, g2, b; r2 = 1 - Math.min(1, c * (1 - k2) + k2), g2 = 1 - Math.min(1, m2 * (1 - k2) + k2), b = 1 - Math.min(1, y * (1 - k2) + k2); return [r2 * 255, g2 * 255, b * 255]; } }; rgb_default.cmyk = (rgb2) => { let r2 = rgb2[0] / 255, g2 = rgb2[1] / 255, b = rgb2[2] / 255, c, m2, y, k2; k2 = Math.min(1 - r2, 1 - g2, 1 - b); c = (1 - r2 - k2) / (1 - k2) || 0; m2 = (1 - g2 - k2) / (1 - k2) || 0; y = (1 - b - k2) / (1 - k2) || 0; return [c * 100, m2 * 100, y * 100, k2 * 100]; }; var cmyk_default = cmyk; // cmy.js var cmy = { name: "cmy", min: [0, 0, 0], max: [100, 100, 100], channel: ["cyan", "magenta", "yellow"], alias: ["CMY"] }; cmy.rgb = ([c, m2, y]) => [ (1 - c / 100) * 255, (1 - m2 / 100) * 255, (1 - y / 100) * 255 ]; rgb_default.cmy = ([r2, g2, b]) => [ (1 - r2 / 255) * 100 || 0, (1 - g2 / 255) * 100 || 0, (1 - b / 255) * 100 || 0 ]; var cmy_default = cmy; // xyz.js var xyz = { name: "xyz", min: [0, 0, 0], channel: ["X", "Y", "Z"], alias: ["XYZ", "ciexyz", "cie1931"], // Whitepoint reference values with observer/illuminant // http://en.wikipedia.org/wiki/Standard_illuminant whitepoint: { //1931 2° 2: { //incadescent A: [109.85, 100, 35.585], // B:[], C: [98.074, 100, 118.232], D50: [96.422, 100, 82.521], D55: [95.682, 100, 92.149], //daylight D65: [95.045592705167, 100, 108.9057750759878], D75: [94.972, 100, 122.638], //flourescent // F1: [], F2: [99.187, 100, 67.395], // F3: [], // F4: [], // F5: [], // F6:[], F7: [95.044, 100, 108.755], // F8: [], // F9: [], // F10: [], F11: [100.966, 100, 64.37], // F12: [], E: [100, 100, 100] }, //1964 10° 10: { //incadescent A: [111.144, 100, 35.2], C: [97.285, 100, 116.145], D50: [96.72, 100, 81.427], D55: [95.799, 100, 90.926], //daylight D65: [94.811, 100, 107.304], D75: [94.416, 100, 120.641], //flourescent F2: [103.28, 100, 69.026], F7: [95.792, 100, 107.687], F11: [103.866, 100, 65.627], E: [100, 100, 100] } } }; xyz.max = xyz.whitepoint[2].D65; xyz.rgb = function(_xyz, white) { white = white || xyz.whitepoint[2].E; var x = _xyz[0] / white[0], y = _xyz[1] / white[1], z = _xyz[2] / white[2], r2, g2, b; r2 = x * 3.240969941904521 + y * -1.537383177570093 + z * -0.498610760293; g2 = x * -0.96924363628087 + y * 1.87596750150772 + z * 0.041555057407175; b = x * 0.055630079696993 + y * -0.20397695888897 + z * 1.056971514242878; r2 = r2 > 31308e-7 ? 1.055 * Math.pow(r2, 1 / 2.4) - 0.055 : r2 = r2 * 12.92; g2 = g2 > 31308e-7 ? 1.055 * Math.pow(g2, 1 / 2.4) - 0.055 : g2 = g2 * 12.92; b = b > 31308e-7 ? 1.055 * Math.pow(b, 1 / 2.4) - 0.055 : b = b * 12.92; r2 = Math.min(Math.max(0, r2), 1); g2 = Math.min(Math.max(0, g2), 1); b = Math.min(Math.max(0, b), 1); return [r2 * 255, g2 * 255, b * 255]; }; rgb_default.xyz = function(rgb2, white) { var r2 = rgb2[0] / 255, g2 = rgb2[1] / 255, b = rgb2[2] / 255; r2 = r2 > 0.04045 ? Math.pow((r2 + 0.055) / 1.055, 2.4) : r2 / 12.92; g2 = g2 > 0.04045 ? Math.pow((g2 + 0.055) / 1.055, 2.4) : g2 / 12.92; b = b > 0.04045 ? Math.pow((b + 0.055) / 1.055, 2.4) : b / 12.92; var x = r2 * 0.41239079926595 + g2 * 0.35758433938387 + b * 0.18048078840183; var y = r2 * 0.21263900587151 + g2 * 0.71516867876775 + b * 0.072192315360733; var z = r2 * 0.019330818715591 + g2 * 0.11919477979462 + b * 0.95053215224966; white = white || xyz.whitepoint[2].E; return [x * white[0], y * white[1], z * white[2]]; }; var xyz_default = xyz; // xyy.js var xyy = { name: "xyy", min: [0, 0, 0], max: [1, 1, 100], channel: ["x", "y", "Y"], alias: ["xyY", "Yxy", "yxy"] }; xyy.xyz = function(arg) { var X, Y, Z, x, y; x = arg[0]; y = arg[1]; Y = arg[2]; if (y === 0) { return [0, 0, 0]; } X = x * Y / y; Z = (1 - x - y) * Y / y; return [X, Y, Z]; }; xyz_default.xyy = function(arg) { var sum, X, Y, Z; X = arg[0]; Y = arg[1]; Z = arg[2]; sum = X + Y + Z; if (sum === 0) { return [0, 0, Y]; } return [X / sum, Y / sum, Y]; }; var xyy_default = xyy; // yiq.js var yiq = { name: "yiq", min: [0, -0.5957, -0.5226], max: [1, 0.5957, 0.5226], channel: ["Y", "I", "Q"], alias: ["YIQ"] }; yiq.rgb = function(yiq2) { var y = yiq2[0], i2 = yiq2[1], q2 = yiq2[2], r2, g2, b; r2 = y * 1 + i2 * 0.956 + q2 * 0.621; g2 = y * 1 + i2 * -0.272 + q2 * -0.647; b = y * 1 + i2 * -1.108 + q2 * 1.705; r2 = Math.min(Math.max(0, r2), 1); g2 = Math.min(Math.max(0, g2), 1); b = Math.min(Math.max(0, b), 1); return [r2 * 255, g2 * 255, b * 255]; }; rgb_default.yiq = function(rgb2) { var r2 = rgb2[0] / 255, g2 = rgb2[1] / 255, b = rgb2[2] / 255; var y = r2 * 0.299 + g2 * 0.587 + b * 0.114; var i2 = 0, q2 = 0; if (r2 !== g2 || g2 !== b) { i2 = r2 * 0.596 + g2 * -0.275 + b * -0.321; q2 = r2 * 0.212 + g2 * -0.528 + b * 0.311; } return [y, i2, q2]; }; var yiq_default = yiq; // yuv.js var yuv = { name: "yuv", min: [0, -0.5, -0.5], max: [1, 0.5, 0.5], channel: ["Y", "U", "V"], alias: ["YUV", "EBU"] }; yuv.rgb = function(yuv2) { var y = yuv2[0], u2 = yuv2[1], v2 = yuv2[2], r2, g2, b; r2 = y * 1 + u2 * 0 + v2 * 1.13983; g2 = y * 1 + u2 * -0.39465 + v2 * -0.5806; b = y * 1 + u2 * 2.02311 + v2 * 0; r2 = Math.min(Math.max(0, r2), 1); g2 = Math.min(Math.max(0, g2), 1); b = Math.min(Math.max(0, b), 1); return [r2 * 255, g2 * 255, b * 255]; }; rgb_default.yuv = function(rgb2) { var r2 = rgb2[0] / 255, g2 = rgb2[1] / 255, b = rgb2[2] / 255; var y = r2 * 0.299 + g2 * 0.587 + b * 0.114; var u2 = r2 * -0.14713 + g2 * -0.28886 + b * 0.436; var v2 = r2 * 0.615 + g2 * -0.51499 + b * -0.10001; return [y, u2, v2]; }; var yuv_default = yuv; // ydbdr.js var ydbdr = { name: "ydbdr", min: [0, -1.333, -1.333], max: [1, 1.333, 1.333], channel: ["Y", "Db", "Dr"], alias: ["YDbDr"] }; ydbdr.rgb = function(ydbdr2) { var y = ydbdr2[0], db = ydbdr2[1], dr = ydbdr2[2]; var r2 = y + 92303716148e-15 * db - 0.525912630661865 * dr; var g2 = y - 0.129132898890509 * db + 0.267899328207599 * dr; var b = y + 0.664679059978955 * db - 79202543533e-15 * dr; return [r2 * 255, g2 * 255, b * 255]; }; rgb_default.ydbdr = function(rgb2) { var r2 = rgb2[0] / 255, g2 = rgb2[1] / 255, b = rgb2[2] / 255; return [ 0.299 * r2 + 0.587 * g2 + 0.114 * b, -0.45 * r2 - 0.883 * g2 + 1.333 * b, -1.333 * r2 + 1.116 * g2 + 0.217 * b ]; }; yuv_default.ydbdr = function(yuv2) { return [ yuv2[0], 3.059 * yuv2[1], -2.169 * yuv2[2] ]; }; ydbdr.yuv = function(ydbdr2) { return [ ydbdr2[0], ydbdr2[1] / 3.059, -ydbdr2[2] / 2.169 ]; }; var ydbdr_default = ydbdr; // ycgco.js var ycgco = { name: "ycgco", min: [0, -0.5, -0.5], max: [1, 0.5, 0.5], channel: ["Y", "Cg", "Co"], alias: ["YCgCo"] }; ycgco.rgb = function(arr) { var y = arr[0], cg = arr[1], co = arr[2]; var tmp = y - cg; return [ (tmp + co) * 255, (y + cg) * 255, (tmp - co) * 255 ]; }; rgb_default.ycgco = function(arr) { var r2 = arr[0] / 255, g2 = arr[1] / 255, b = arr[2] / 255; return [ 0.25 * r2 + 0.5 * g2 + 0.25 * b, -0.25 * r2 + 0.5 * g2 - 0.25 * b, 0.5 * r2 - 0.5 * b ]; }; var ycgco_default = ycgco; // ypbpr.js var ypbpr = { name: "ypbpr", min: [0, -0.5, -0.5], max: [1, 0.5, 0.5], channel: ["Y", "Pb", "Pr"], alias: ["YPbPr", "Y/PB/PR", "YPRPB", "PRPBY", "PBPRY", "Y/Pb/Pr", "YPrPb", "PrPbY", "PbPrY", "Y/R-Y/B-Y", "Y(R-Y)(B-Y)", "R-Y", "B-Y"] }; ypbpr.rgb = function(ypbpr2, kb, kr) { var y = ypbpr2[0], pb = ypbpr2[1], pr = ypbpr2[2]; kb = kb || 0.0722; kr = kr || 0.2126; var r2 = y + 2 * pr * (1 - kr); var b = y + 2 * pb * (1 - kb); var g2 = (y - kr * r2 - kb * b) / (1 - kr - kb); return [r2 * 255, g2 * 255, b * 255]; }; rgb_default.ypbpr = function(rgb2, kb, kr) { var r2 = rgb2[0] / 255, g2 = rgb2[1] / 255, b = rgb2[2] / 255; kb = kb || 0.0722; kr = kr || 0.2126; var y = kr * r2 + (1 - kr - kb) * g2 + kb * b; var pb = 0.5 * (b - y) / (1 - kb); var pr = 0.5 * (r2 - y) / (1 - kr); return [y, pb, pr]; }; var ypbpr_default = ypbpr; // ycbcr.js var ycbcr = { name: "ycbcr", min: [16, 16, 16], max: [235, 240, 240], channel: ["Y", "Cb", "Cr"], alias: ["YCbCr", "YCC"], /** * From digital to analog form. * Scale to min/max ranges */ ypbpr: function(ycbcr2) { var y = ycbcr2[0], cb = ycbcr2[1], cr = ycbcr2[2]; return [ (y - 16) / 219, (cb - 128) / 224, (cr - 128) / 224 ]; } }; ypbpr_default.ycbcr = function(ypbpr2) { var y = ypbpr2[0], pb = ypbpr2[1], pr = ypbpr2[2]; return [ 16 + 219 * y, 128 + 224 * pb, 128 + 224 * pr ]; }; ycbcr.rgb = function(arr, kb, kr) { return ypbpr_default.rgb(ycbcr.ypbpr(arr), kb, kr); }; rgb_default.ycbcr = function(arr, kb, kr) { return ypbpr_default.ycbcr(rgb_default.ypbpr(arr, kb, kr)); }; var ycbcr_default = ycbcr; // xvycc.js var xvycc = { name: "xvycc", min: [0, 0, 0], max: [255, 255, 255], channel: ["Y", "Cb", "Cr"], alias: ["xvYCC"], /** * From digital to analog form. * Scale to min/max ranges */ ypbpr: function(xvycc2) { var y = xvycc2[0], cb = xvycc2[1], cr = xvycc2[2]; return [ (y - 16) / 219, (cb - 128) / 224, (cr - 128) / 224 ]; }, /** * xvYCC to RGB * transform through analog form * * @param {Array<number>} arr RGB values * @param {number} kb * @param {number} kr * @return {Array<number>} xvYCC values */ rgb: function(arr, kb, kr) { return ypbpr_default.rgb(xvycc.ypbpr(arr), kb, kr); } }; var xvycc_default = xvycc; ypbpr_default.xvycc = function(ypbpr2) { var y = ypbpr2[0], pb = ypbpr2[1], pr = ypbpr2[2]; return [ 16 + 219 * y, 128 + 224 * pb, 128 + 224 * pr ]; }; rgb_default.xvycc = function(arr, kb, kr) { return ypbpr_default.xvycc(rgb_default.ypbpr(arr, kb, kr)); }; // yccbccrc.js var yccbccrc = { name: "yccbccrc", min: [0, -0.5, -0.5], max: [1, 0.5, 0.5], channel: ["Yc", "Cbc", "Crc"], alias: ["YcCbcCrc"] }; yccbccrc.rgb = function(yccbccrc2) { return ypbpr_default.rgb(yccbccrc2, 0.0593, 0.2627); }; rgb_default.yccbccrc = function(arr) { return rgb_default.ypbpr(arr, 0.0593, 0.2627); }; var yccbccrc_default = yccbccrc; // ucs.js var ucs = { name: "ucs", min: [0, 0, 0], max: [100, 100, 100], channel: ["U", "V", "W"], alias: ["UCS", "cie1960"] }; var ucs_default = ucs; ucs.xyz = function(ucs2) { var u2 = ucs2[0], v2 = ucs2[1], w = ucs2[2]; return [ 1.5 * u2, v2, 1.5 * u2 - 3 * v2 + 2 * w ]; }; xyz_default.ucs = function(xyz2) { var x = xyz2[0], y = xyz2[1], z = xyz2[2]; return [ x * 2 / 3, y, 0.5 * (-x + 3 * y + z) ]; }; // uvw.js var uvw = { name: "uvw", min: [-134, -140, 0], max: [224, 122, 100], channel: ["U", "V", "W"], alias: ["UVW", "cieuvw", "cie1964"] }; var uvw_default = uvw; uvw.xyz = function(arg, i2, o2) { var _u, _v, w, u2, v2, x, y, z, xn, yn, zn, un, vn; u2 = arg[0], v2 = arg[1], w = arg[2]; if (w === 0) return [0, 0, 0]; i2 = i2 || "D65"; o2 = o2 || 2; xn = xyz_default.whitepoint[o2][i2][0]; yn = xyz_default.whitepoint[o2][i2][1]; zn = xyz_default.whitepoint[o2][i2][2]; un = 4 * xn / (xn + 15 * yn + 3 * zn); vn = 6 * yn / (xn + 15 * yn + 3 * zn); y = Math.pow((w + 17) / 25, 3); _u = u2 / (13 * w) + un || 0; _v = v2 / (13 * w) + vn || 0; x = 6 / 4 * y * _u / _v; z = y * (2 / _v - 0.5 * _u / _v - 5); return [x, y, z]; }; xyz_default.uvw = function(arr, i2, o2) { var x = arr[0], y = arr[1], z = arr[2], xn, yn, zn, un, vn; i2 = i2 || "D65"; o2 = o2 || 2; xn = xyz_default.whitepoint[o2][i2][0]; yn = xyz_default.whitepoint[o2][i2][1]; zn = xyz_default.whitepoint[o2][i2][2]; un = 4 * xn / (xn + 15 * yn + 3 * zn); vn = 6 * yn / (xn + 15 * yn + 3 * zn); var _u = 4 * x / (x + 15 * y + 3 * z) || 0; var _v = 6 * y / (x + 15 * y + 3 * z) || 0; var w = 25 * Math.pow(y, 1 / 3) - 17; var u2 = 13 * w * (_u - un); var v2 = 13 * w * (_v - vn); return [u2, v2, w]; }; uvw.ucs = function(uvw2) { throw new Error("Not implemented"); }; ucs_default.uvw = function(ucs2) { throw new Error("Not implemented"); }; // jpeg.js var jpeg = { name: "jpeg", min: [0, 0, 0], max: [255, 255, 255], channel: ["Y", "Cb", "Cr"], alias: ["JPEG"] }; var jpeg_default = jpeg; jpeg.rgb = function(arr) { var y = arr[0], cb = arr[1], cr = arr[2]; return [ y + 1.402 * (cr - 128), y - 0.34414 * (cb - 128) - 0.71414 * (cr - 128), y + 1.772 * (cb - 128) ]; }; rgb_default.jpeg = function(arr) { var r2 = arr[0], g2 = arr[1], b = arr[2]; return [ 0.299 * r2 + 0.587 * g2 + 0.114 * b, 128 - 0.168736 * r2 - 0.331264 * g2 + 0.5 * b, 128 + 0.5 * r2 - 0.418688 * g2 - 0.081312 * b ]; }; // lab.js var lab = { name: "lab", min: [0, -100, -100], max: [100, 100, 100], channel: ["lightness", "a", "b"], alias: ["LAB", "cielab"] }; lab.xyz = ([l2, a, b]) => { var x, y, z, y2; if (l2 <= 8) { y = l2 * 100 / 903.3; y2 = 7.787 * (y / 100) + 16 / 116; } else { y = 100 * Math.pow((l2 + 16) / 116, 3); y2 = Math.pow(y / 100, 1 / 3); } x = x / 95.047 <= 8856e-6 ? x = 95.047 * (a / 500 + y2 - 16 / 116) / 7.787 : 95.047 * Math.pow(a / 500 + y2, 3); z = z / 108.883 <= 8859e-6 ? z = 108.883 * (y2 - b / 200 - 16 / 116) / 7.787 : 108.883 * Math.pow(y2 - b / 200, 3); return [x, y, z]; }; var lab_default = lab; xyz_default.lab = ([x, y, z]) => { var l2, a, b; x /= 95.047; y /= 100; z /= 108.883; x = x > 8856e-6 ? Math.pow(x, 1 / 3) : 7.787 * x + 16 / 116; y = y > 8856e-6 ? Math.pow(y, 1 / 3) : 7.787 * y + 16 / 116; z = z > 8856e-6 ? Math.pow(z, 1 / 3) : 7.787 * z + 16 / 116; l2 = 116 * y - 16; a = 500 * (x - y); b = 200 * (y - z); return [l2, a, b]; }; // labh.js var labh = { name: "labh", //mins/maxes are taken from colormine //FIXME: check whether mins/maxes correct min: [0, -128, -128], max: [100, 128, 128], channel: ["lightness", "a", "b"], alias: ["LABh", "hunter-lab", "hlab"], //maths are taken from EasyRGB xyz: function(lab2) { var l2 = lab2[0], a = lab2[1], b = lab2[2]; var _y = l2 / 10; var _x = a / 17.5 * l2 / 10; var _z = b / 7 * l2 / 10; var y = _y * _y; var x = (_x + y) / 1.02; var z = -(_z - y) / 0.847; return [x, y, z]; } }; var labh_default = labh; xyz_default.labh = function(xyz2) { var x = xyz2[0], y = xyz2[1], z = xyz2[2]; var _y12 = Math.sqrt(y); var l2 = 10 * _y12; var a = y === 0 ? 0 : 17.5 * ((1.02 * x - y) / _y12); var b = y === 0 ? 0 : 7 * ((y - 0.847 * z) / _y12); return [l2, a, b]; }; // lms.js var lms = { name: "lms", min: [0, 0, 0], max: [100, 100, 100], channel: ["long", "medium", "short"], //transform matrices matrix: { HPE: [ 0.38971, 0.68898, -0.07868, -0.22981, 1.1834, 0.04641, 0, 0, 1 ], VONKRIES: [ 0.4002, 0.7076, -0.0808, -0.2263, 1.1653, 0.0457, 0, 0, 0.9182 ], BFD: [ 0.8951, 0.2664, -0.1614, -0.7502, 1.7135, 0.0367, 0.0389, -0.0686, 1.0296 ], CAT97: [ 0.8562, 0.3372, -0.1934, -0.836, 1.8327, 33e-4, 0.0357, -469e-5, 1.0112 ], CAT00: [ 0.7982, 0.3389, -0.1371, -0.5918, 1.5512, 0.0406, 8e-4, 0.0239, 0.9753 ], CAT02: [ 0.7328, 0.4296, -0.1624, -0.7036, 1.6975, 61e-4, 3e-3, 0.0136, 0.9834 ] } }; var lms_default = lms; lms.xyz = function(arg, matrix) { var l2 = arg[0], m2 = arg[1], s = arg[2]; if (!matrix) { matrix = [ 1.096123820835514, -0.278869000218287, 0.182745179382773, 0.454369041975359, 0.473533154307412, 0.072097803717229, -0.009627608738429, -0.005698031216113, 1.015325639954543 ]; } return [ l2 * matrix[0] + m2 * matrix[1] + s * matrix[2], l2 * matrix[3] + m2 * matrix[4] + s * matrix[5], l2 * matrix[6] + m2 * matrix[7] + s * matrix[8] ]; }; xyz_default.lms = function(arg, matrix) { var x = arg[0], y = arg[1], z = arg[2]; if (!matrix) { matrix = lms.matrix.CAT02; } return [ x * matrix[0] + y * matrix[1] + z * matrix[2], x * matrix[3] + y * matrix[4] + z * matrix[5], x * matrix[6] + y * matrix[7] + z * matrix[8] ]; }; // lchab.js var lchab = { name: "lchab", min: [0, 0, 0], max: [100, 100, 360], channel: ["lightness", "chroma", "hue"], alias: ["LCHab", "cielch", "LCH", "HLC", "LSH"], xyz: function(arg) { return lab_default.xyz(lchab.lab(arg)); }, lab: function(lch) { var l2 = lch[0], c = lch[1], h = lch[2], a, b, hr; hr = h / 360 * 2 * Math.PI; a = c * Math.cos(hr); b = c * Math.sin(hr); return [l2, a, b]; } }; lab_default.lchab = function(lab2) { var l2 = lab2[0], a = lab2[1], b = lab2[2], hr, h, c; hr = Math.atan2(b, a); h = hr * 360 / 2 / Math.PI; if (h < 0) { h += 360; } c = Math.sqrt(a * a + b * b); return [l2, c, h]; }; xyz_default.lchab = function(arg) { return lab_default.lchab(xyz_default.lab(arg)); }; var lchab_default = lchab; // luv.js var luv = { name: "luv", //NOTE: luv has no rigidly defined limits //easyrgb fails to get proper coords //boronine states no rigid limits //colorMine refers this ones: min: [0, -134, -140], max: [100, 224, 122], channel: ["lightness", "u", "v"], alias: ["LUV", "cieluv", "cie1976"], xyz: function(arg, i2, o2) { var _u, _v, l2, u2, v2, x, y, z, xn, yn, zn, un, vn; l2 = arg[0], u2 = arg[1], v2 = arg[2]; if (l2 === 0) return [0, 0, 0]; var k2 = 0.0011070564598794539; i2 = i2 || "D65"; o2 = o2 || 2; xn = xyz_default.whitepoint[o2][i2][0]; yn = xyz_default.whitepoint[o2][i2][1]; zn = xyz_default.whitepoint[o2][i2][2]; un = 4 * xn / (xn + 15 * yn + 3 * zn); vn = 9 * yn / (xn + 15 * yn + 3 * zn); _u = u2 / (13 * l2) + un || 0; _v = v2 / (13 * l2) + vn || 0; y = l2 > 8 ? yn * Math.pow((l2 + 16) / 116, 3) : yn * l2 * k2; x = y * 9 * _u / (4 * _v) || 0; z = y * (12 - 3 * _u - 20 * _v) / (4 * _v) || 0; return [x, y, z]; } }; var luv_default = luv; xyz_default.luv = function(arg, i2, o2) { var _u, _v, l2, u2, v2, x, y, z, xn, yn, zn, un, vn; var e = 0.008856451679035631; var k2 = 903.2962962962961; i2 = i2 || "D65"; o2 = o2 || 2; xn = xyz_default.whitepoint[o2][i2][0]; yn = xyz_default.whitepoint[o2][i2][1]; zn = xyz_default.whitepoint[o2][i2][2]; un = 4 * xn / (xn + 15 * yn + 3 * zn); vn = 9 * yn / (xn + 15 * yn + 3 * zn); x = arg[0], y = arg[1], z = arg[2]; _u = 4 * x / (x + 15 * y + 3 * z) || 0; _v = 9 * y / (x + 15 * y + 3 * z) || 0; var yr = y / yn; l2 = yr <= e ? k2 * yr : 116 * Math.pow(yr, 1 / 3) - 16; u2 = 13 * l2 * (_u - un); v2 = 13 * l2 * (_v - vn); return [l2, u2, v2]; }; // lchuv.js var lchuv = { name: "lchuv", channel: ["lightness", "chroma", "hue"], alias: ["LCHuv", "cielchuv"], min: [0, 0, 0], max: [100, 100, 360], luv: function(luv2) { var l2 = luv2[0], c = luv2[1], h = luv2[2], u2, v2, hr; hr = h / 360 * 2 * Math.PI; u2 = c * Math.cos(hr); v2 = c * Math.sin(hr); return [l2, u2, v2]; }, xyz: function(arg) { return luv_default.xyz(lchuv.luv(arg)); } }; var lchuv_default = lchuv; luv_default.lchuv = function(luv2) { var l2 = luv2[0], u2 = luv2[1], v2 = luv2[2]; var c = Math.sqrt(u2 * u2 + v2 * v2); var hr = Math.atan2(v2, u2); var h = hr * 360 / 2 / Math.PI; if (h < 0) { h += 360; } return [l2, c, h]; }; xyz_default.lchuv = function(arg) { return luv_default.lchuv(xyz_default.luv(arg)); }; // hsluv.js function f(a) { var c = [], b = Math.pow(a + 16, 3) / 1560896; b = b > g ? b : a / k; for (var d = 0; 3 > d; ) { var e = d++, h = l[e][0], w = l[e][1]; e = l[e][2]; for (var x = 0; 2 > x; ) { var y = x++, z = (632260 * e - 126452 * w) * b + 126452 * y; c.push({ b: (284517 * h - 94839 * e) * b / z, a: ((838422 * e + 769860 * w + 731718 * h) * a * b - 769860 * y * a) / z }); } } return c; } function m(a) { a = f(a); for (var c = Infinity, b = 0; b < a.length; ) { var d = a[b]; ++b; c = Math.min(c, Math.abs(d.a) / Math.sqrt(Math.pow(d.b, 2) + 1)); } return c; } function n(a, c) { c = c / 360 * Math.PI * 2; a = f(a); for (var b = Infinity, d = 0; d < a.length; ) { var e = a[d]; ++d; e = e.a / (Math.sin(c) - e.b * Math.cos(c)); 0 <= e && (b = Math.min(b, e)); } return b; } function p(a, c) { for (var b = 0, d = 0, e = a.length; d < e; ) { var h = d++; b += a[h] * c[h]; } return b; } function q(a) { return 31308e-7 >= a ? 12.92 * a : 1.055 * Math.pow(a, 0.4166666666666667) - 0.055; } function r(a) { return 0.04045 < a ? Math.pow((a + 0.055) / 1.055, 2.4) : a / 12.92; } function t(a) { return [q(p(l[0], a)), q(p(l[1], a)), q(p(l[2], a))]; } function u(a) { a = [r(a[0]), r(a[1]), r(a[2])]; return [p(v[0], a), p(v[1], a), p(v[2], a)]; } function A(a) { var c = a[0], b = a[1]; a = c + 15 * b + 3 * a[2]; 0 != a ? (c = 4 * c / a, a = 9 * b / a) : a = c = NaN; b = b <= g ? b / B * k : 116 * Math.pow(b / B, 0.3333333333333333) - 16; return 0 == b ? [0, 0, 0] : [b, 13 * b * (c - C), 13 * b * (a - D)]; } function E(a) { var c = a[0]; if (0 == c) return [0, 0, 0]; var b = a[1] / (13 * c) + C; a = a[2] / (13 * c) + D; c = 8 >= c ? B * c / k : B * Math.pow((c + 16) / 116, 3); b = 0 - 9 * c * b / ((b - 4) * a - b * a); return [b, c, (9 * c - 15 * a * c - a * b) / (3 * a)]; } function F(a) { var c = a[0], b = a[1], d = a[2]; a = Math.sqrt(b * b + d * d); 1e-8 > a ? b = 0 : (b = 180 * Math.atan2(d, b) / Math.PI, 0 > b && (b = 360 + b)); return [c, a, b]; } function G(a) { var c = a[1], b = a[2] / 360 * 2 * Math.PI; return [a[0], Math.cos(b) * c, Math.sin(b) * c]; } function H(a) { var c = a[0], b = a[1]; a = a[2]; if (99.9999999 < a) return [100, 0, c]; if (1e-8 > a) return [0, 0, c]; b = n(a, c) / 100 * b; return [a, b, c]; } function I(a) { var c = a[0], b = a[1]; a = a[2]; if (99.9999999 < c) return [a, 0, 100]; if (1e-8 > c) return [a, 0, 0]; var d = n(c, a); return [a, b / d * 100, c]; } function J(a) { var c = a[0], b = a[1]; a = a[2]; if (99.9999999 < a) return [100, 0, c]; if (1e-8 > a) return [0, 0, c]; b = m(a) / 100 * b; return [a, b, c]; } function K(a) { var c = a[0], b = a[1]; a = a[2]; if (99.9999999 < c) return [a, 0, 100]; if (1e-8 > c) return [a, 0, 0]; var d = m(c); return [a, b / d * 100, c]; } function O(a) { return t(E(G(a))); } function P(a) { return F(A(u(a))); } function Q(a) { return O(H(a)); } function R(a) { return I(P(a)); } function S(a) { return O(J(a)); } function T(a) { return K(P(a)); } var l = [[3.240969941904521, -1.537383177570093, -0.498610760293], [-0.96924363628087, 1.87596750150772, 0.041555057407175], [0.055630079696993, -0.20397695888897, 1.056971514242878]]; var v = [[0.41239079926595, 0.35758433938387, 0.18048078840183], [0.21263900587151, 0.71516867876775, 0.072192315360733], [0.019330818715591, 0.11919477979462, 0.95053215224966]]; var B = 1; var C = 0.19783000664283; var D = 0.46831999493879; var k = 903.2962962; var g = 0.0088564516; var _hsluv = { hsluvToRgb: Q, hsluvToLch: H, rgbToHsluv: R, rgbToHpluv: T, rgbToXyz: u, rgbToLch: P, hpluvToRgb: S, hpluvToLch: J, lchToHpluv: K, lchToHsluv: I, lchToLuv: G, lchToRgb: O, luvToLch: F, luvToXyz: E, xyzToLuv: A, xyzToRgb: t }; var hsluv = { name: "hsluv", min: [0, 0, 0], max: [360, 100, 100], channel: ["hue", "saturation", "lightness"], alias: ["HSLuv", "HuSL"], lchuv: _hsluv.hsluvToLch, xyz: function(arg) { return lchuv_default.xyz(_hsluv.hsluvToLch(arg)); }, //a shorter way to convert to hpluv hpluv: function(arg) { return _hsluv.lchToHpluv(_hsluv.hsluvToLch(arg)); }, // export internal math _hsluv }; var hsluv_default = hsluv; lchuv_default.hsluv = _hsluv.lchToHsluv; xyz_default.hsluv = function(arg) { return _hsluv.lchToHsluv(xyz_default.lchuv(arg)); }; rgb_default.hsluv = _hsluv.rgbToHsluv; // hpluv.js var hpluv = { name: "hpluv", min: [0, 0, 0], max: [360, 100, 100], channel: ["hue", "saturation", "lightness"], alias: ["HPLuv", "HuSLp"], lchuv: _hsluv.hpluvToLch, xyz: function(arg) { return lchuv_default.xyz(_hsluv.hpluvToLch(arg)); }, //a shorter way to convert to husl hsluv: function(arg) { return _hsluv.lchToHsluv(_hsluv.hpluvToLch(arg)); } }; var hpluv_default = hpluv; lchuv_default.hpluv = _hsluv.lchToHpluv; xyz_default.hpluv = function(arg) { return _hsluv.lchToHpluv(xyz_default.lchuv(arg)); }; // oklab.js var oklab = { name: "oklab", min: [0, -0.4, -0.4], max: [1, 0.4, 0.4], channel: ["lightness", "a", "b"] }; var oklab_default = oklab; oklab.rgb = ([l2, a, b]) => { const l_ = l2 + 0.3963377774 * a + 0.2158037573 * b; const m_ = l2 - 0.1055613458 * a - 0.0638541728 * b; const s_ = l2 - 0.0894841775 * a - 1.291485548 * b; const l3 = l_ ** 3; const m3 = m_ ** 3; const s3 = s_ ** 3; return [ (4.0767416621 * l3 - 3.307711591 * m3 + 0.2309699292 * s3) * 255, (-1.2684380046 * l3 + 2.6097574011 * m3 - 0.3413193965 * s3) * 255, (-0.0041960863 * l3 - 0.7034186147 * m3 + 1.707614701 * s3) * 255 ]; }; rgb_default.oklab = ([r2, g2, b]) => { r2 /= 255, g2 /= 255, b /= 255; const l2 = 0.4122214708 * r2 + 0.5363325363 * g2 + 0.0514459929 * b; const m2 = 0.2119034982 * r2 + 0.6806995451 * g2 + 0.1073969566 * b; const s = 0.0883024619 * r2 + 0.2817188376 * g2 + 0.6299787005 * b; const l_ = Math.cbrt(l2); const m_ = Math.cbrt(m2); const s_ = Math.cbrt(s); return [ 0.2104542553 * l_ + 0.793617785 * m_ - 0.0040720468 * s_, // L 1.9779984951 * l_ - 2.428592205 * m_ + 0.4505937099 * s_, // a 0.0259040371 * l_ + 0.7827717662 * m_ - 0.808675766 * s_ // b ]; }; // cubehelix.js var defaults = { // 0..3 start: 0, // -10..10 rotation: 0.5, // 0..1+ hue: 1, // 0..2 gamma: 1 }; var cubehelix = { name: "cubehelix", channel: ["fraction"], min: [0], max: [1], defaults }; cubehelix.rgb = function(fraction, options = {}) { if (Array.isArray(fraction)) fraction = fraction[0]; var start = options.start !== void 0 ? options.start : defaults.start; var rotation = options.rotation !== void 0 ? options.rotation : defaults.rotation; var gamma = options.gamma !== void 0 ? options.gamma : defaults.gamma; var hue = options.hue !== void 0 ? options.hue : defaults.hue; var angle = 2 * Math.PI * (start / 3 + 1 + rotation * fraction); fraction = Math.pow(fraction, gamma); var amp = hue * fraction * (1 - fraction) / 2; var r2 = fraction + amp * (-0.14861 * Math.cos(angle) + 1.78277 * Math.sin(angle)); var g2 = fraction + amp * (-0.29227 * Math.cos(angle) - 0.90649 * Math.sin(angle)); var b = fraction + amp * (1.97294 * Math.cos(angle)); r2 = Math.max(1, Math.min(r2, 0)); g2 = Math.max(1, Math.min(g2, 0)); b = Math.max(1, Math.min(b, 0)); return [r2 * 255, g2 * 255, b * 255]; }; rgb_default.cubehelix = function(rgb2) { throw new Error("rgb.cubehelix conversion is not implemented yet"); }; var cubehelix_default = cubehelix; // coloroid.js var coloroid = { name: "coloroid", alias: ["ATV"], // hue, saturation, luminosity // note that hue values are ids, not the numbers - not every value is possible // e.g. 38 will be rounded to 36 channel: ["A", "T", "V"], min: [10, 0, 0], max: [76, 100, 100], // Coloroid table // Regression of values is almost impossible, as hues don’t correlate // Even angle values are picked very inconsistently, based on aesthetical evaluation. // - tgф, ctgф are removed, ф is searched instead // - eλ = xλ + yλ + zλ // - λ is removed as not used table: [ //A angle eλ xλ yλ [10, 59, 1.724349, 0.44987, 0.53641], [11, 55.3, 1.740844, 0.46248, 0.52444], [12, 51.7, 1.754985, 0.47451, 0.51298], [13, 48.2, 1.767087, 0.48601, 0.50325], [14, 44.8, 1.775953, 0.49578, 0.49052], [15, 41.5, 1.785073, 0.5079, 0.43035], [16, 38.2, 1.791104, 0.51874, 0.46934], [20, 34.9, 1.794831, 0.5298, 0.45783], [21, 31.5, 1.798664, 0.54137, 0.44559], [22, 28, 1.794819, 0.55367, 0.43253], [23, 24.4, 1.78961, 0.5668, 0.41811], [24, 20.6, 1.809483, 0.58128, 0.40176], [25, 16.6, 1.760983, 0.59766, 0.383], [26, 12.3, 1.723443, 0.61653, 0.36061], [30, 7.7, 1.652891, 0.63896, 0.33358], [31, 2.8, 1.502607, 0.66619, 0.2993], [32, -2.5, 1.0725, 0.70061, 0.26753], [33, -8.4, 1.136637, 0.63925, 0.22631], [34, -19.8, 1.232286, 0.53962, 0.19721], [35, -31.6, 1.31012, 0.5034, 0.17495], [40, -43.2, 1.37661, 0.46041, 0.15603], [41, -54.6, 1.438692, 0.42386, 0.13846], [42, -65.8, 1.501582, 0.38991, 0.12083], [43, -76.8, 1.570447, 0.35586, 0.10328], [44, -86.8, 1.645583, 0.32195, 0.08496], [45, -95.8, 1.732083, 0.28657, 0.05155], [46, -108.4, 1.915753, 0.22202, 0.01771], [50, -117.2, 2.14631, 0.15664, 0.05227], [51, -124.7, 1.649939, 0.12736, 0.0902], [52, -131.8, 1.273415, 0.10813, 0.12506], [53, -138.5, 1.080809, 0.09414, 0.15741], [54, -145.1, 0.957076, 0.03249, 0.18958], [55, -152, 0.868976, 0.07206, 0.24109], [56, -163.4, 0.771731, 0.05787, 0.30378], [60, -177.2, 0.697108, 0.04353, 0.35696], [61, 171.6, 0.655803, 0.03291, 0.41971], [62, 152.4, 0.623958, 0.0224, 0.49954], [63, 148.4, 0.596037, 0.01196, 0.60321], [64, 136.8, 0.607413, 425e-5, 0.73542], [65, 125.4, 0.659923, 0.01099, 0.83391], [66, 114.2, 0.859517, 0.0805, 0.77474], [70, 103.2, 1.195683, 0.20259, 0.7046], [71, 93.2, 1.407534, 0.28807, 0.6523], [72, 84.2, 1.532829, 0.34422, 0.6193], [73, 77.3, 1.603792, 0.37838, 0.59533], [74, 71.6, 1.649448, 0.4029, 0.57716], [75, 66.9, 1.68108, 0.42141, 0.56222], [76, 62.8, 1.704979, 0.43647, 0.54895] ], /** * Backwise - from coloroid to xyY * * @param {Array<number>} arg Coloroid values * * @return {Array<number>} xyY values */ xyy: function([A2, T2, V]) { var row; for (var i2 = 0; i2 < table.length; i2++) { if (A2 <= table[i2][0]) { row = table[i2]; break; } } var yl = row[4], el = row[2], xl = row[3]; var Y = V * V / 100; var Yl = yl * el * 100; var x = (100 * Y * x0 * ew + 100 * xl * el * T2 - Yl * T2 * x0 * ew) / (100 * T2 * el - Yl * T2 * ew + 100 * Y * ew); var y = (100 * Y + 100 * T2 * yl * el - Yl * T2) / (Y * ew * 100 + T2 * 100 * el - T2 * Yl * ew); return [x, y, Y]; } }; var table = coloroid.table; var angleTable = table.slice(-13).concat(table.slice(0, -13)); var i = "D65"; var o = 2; var Xn = xyz_default.whitepoint[o][i][0]; var Yn = xyz_default.whitepoint[o][i][1]; var Zn = xyz_default.whitepoint[o][i][2]; var y0 = Xn / (Xn + Yn + Zn); var x0 = Yn / (Xn + Yn + Zn); var ew = (Xn + Yn + Zn) / 100; xyy_default.coloroid = function(arg) { var x = arg[0], y = arg[1], Y = arg[2]; var V = 10 * Math.sqrt(Y); var angle = Math.atan2(y - y0, x - x0) * 180 / Math.PI; var row; var prev = angleTable.length - 1; for (var i2 = 0; i2 < angleTable.length; i2++) { if (angle > angleTable[i2][1]) { break; } prev = i2; } row = Math.abs(angleTable[i2 + 1][1] - angle) > Math.abs(angleTable[prev][1] - angle) ? angleTable[i2 + 1] : angleTable[prev]; var A2 = row[0]; var yl = row[4], el = row[2], xl = row[3]; var Yl = yl * el * 100; var T2 = 100 * Y * (x0 * ew - x * ew) / (100 * (x * el - xl * el) + Yl * (x0 * ew - x * ew)); return [A2, T2, V]; }; xyz_default.coloroid = function(arg) { return xyy_default.coloroid(xyz_default.xyy(arg)); }; coloroid.xyz = function(arg) { return xyy_default.xyz(coloroid.xyy(arg)); }; var coloroid_default = coloroid; // hcg.js var hcg = { name: "hcg", min: [0, 0, 0], max: [360, 100, 100], channel: ["hue", "chroma", "gray"], alias: ["HCG", "HSG"], rgb: function(hcg2) { var h = hcg2[0] / 360; var c = hcg2[1] / 100; var g2 = hcg2[2] / 100; if (c === 0) { return [g2 * 255, g2 * 255, g2 * 255]; } var hi = h % 1 * 6; var v2 = hi % 1; var pure = [0, 0, 0]; var w = 1 - v2; switch (Math.floor(hi)) { case 0: pure[0] = 1; pure[1] = v2; pure[2] = 0; break; case 1: pure[0] = w; pure[1] = 1; pure[2] = 0; break; case 2: pure[0] = 0; pure[1] = 1; pure[2] = v2; break; case 3: pure[0] = 0; pure[1] = w; pure[2] = 1; break; case 4: pure[0] = v2; pure[1] = 0; pure[2] = 1; break; default: pure[0] = 1; pure[1] = 0; pure[2] = w; } var mg = (1 - c) * g2; var rgb2 = [ (c * pure[0] + mg) * 255, (c * pure[1] + mg) * 255, (c * pure[2] + mg) * 255 ]; return rgb2; }, hsl: function(hcg2) { var c = hcg2[1] / 100; var g2 = hcg2[2] / 100; var l2 = g2 * (1 - c) + 0.5 * c; var s = 0; if (l2 < 1 && l2 > 0) { if (l2 < 0.5) { s = c / (2 * l2); } else { s = c / (2 * (1 - l2)); } } return [hcg2[0], s * 100, l2 * 100]; }, hsv: function(hcg2) { var c = hcg2[1] / 100; var g2 = hcg2[2] / 100; var v2 = c + g2 * (1 - c); var res; if (v2 > 0) { var f2 = c / v2; res = [hcg2[0], f2 * 100, v2 * 100]; } else { res = [hcg2[0], 0, v2 * 100]; } return res; }, hwb: function(hcg2) { var c = hcg2[1] / 100; var g2 = hcg2[2] / 100; var v2 = c + g2 * (1 - c); return [hcg2[0], (v2 - c) * 100, (1 - v2) * 100]; } }; var hcg_default = hcg; rgb_default.hcg = function(rgb2) { var r2 = rgb2[0] / 255; var g2 = rgb2[1] / 255; var b = rgb2[2] / 255; var max = Math.max(Math.max(r2, g2), b); var min = Math.min(Math.min(r2, g2), b); var chroma = max - min; var grayscale; var hue; if (chroma < 1) { grayscale = min / (1 - chroma); } else { grayscale = 0; } if (chroma > 0) { if (max === r2) { hue = (g2 - b) / chroma % 6; } else if (max === g2) { hue = 2 + (b - r2) / chroma; } else { hue = 4 + (r2 - g2) / chroma; } hue /= 6; hue = hue % 1; } else { hue = 0; } return [hue * 360, chroma * 100, grayscale * 100]; }; hsl_default.hcg = function(hsl2) { var s = hsl2[1] / 100; var l2 = hsl2[2] / 100; var c = 0; if (l2 < 0.5) { c = 2 * s * l2; } else { c = 2 * s * (1 - l2); } var res; if (c < 1) { var f2 = (l2 - 0.5 * c) / (1 - c); res = [hsl2[0], c * 100, f2 * 100]; } else { res = [hsl2[0], c * 100, 0]; } return res; }; hsv_default.hcg = function(hsv2) { var s = hsv2[1] / 100; var v2 = hsv2[2] / 100; var c = s * v2; var res; if (c < 1) { var f2 = (v2 - c) / (1 - c); res = [hsv2[0], c * 100, f2 * 100]; } else { res = [hsv2[0], c * 100, 0]; } return res; }; hwb_default.hcg = function(hwb2) { var w = hwb2[1] / 100; var b = hwb2[2] / 100; var v2 = 1 - b; var c = v2 - w; var g2 = 0; if (c < 1) { g2 = (v2 - c) / (1 - c); } return [hwb2[0], c * 100, g2 * 100]; }; // hcy.js var hcy = { name: "hcy", min: [0, 0, 0], max: [360, 100, 255], channel: ["hue", "chroma", "luminance"], alias: ["HCY"] }; var hcy_default = hcy; hcy.rgb = function(hcy2) { var h = (hcy2[0] < 0 ? hcy2[0] % 360 + 360 : hcy2[0] % 360) * Math.PI / 180; var s = Math.max(0, Math.min(hcy2[1], 100)) / 100; var i2 = Math.max(0, Math.min(hcy2[2], 255)) / 255; var pi3 = Math.PI / 3; var r2, g2, b; if (h < 2 * pi3) { b = i2 * (1 - s); r2 = i2 * (1 + s * Math.cos(h) / Math.cos(pi3 - h)); g2 = i2 * (1 + s * (1 - Math.cos(h) / Math.cos(pi3 - h))); } else if (h < 4 * pi3) { h = h - 2 * pi3; r2 = i2 * (1 - s); g2 = i2 * (1 + s * Math.cos(h) / Math.cos(pi3 - h)); b = i2 * (1 + s * (1 - Math.cos(h) / Math.cos(pi3 - h))); } else { h = h - 4 * pi3; g2 = i2 * (1 - s); b = i2 * (1 + s * Math.cos(h) / Math.cos(pi3 - h)); r2 = i2 * (1 + s * (1 - Math.cos(h) / Math.cos(pi3 - h))); } return [r2 * 255, g2 * 255, b * 255]; }; rgb_default.hcy = function(rgb2) { var sum = rgb2[0] + rgb2[1] + rgb2[2]; var r2 = rgb2[0] / sum; var g2 = rgb2[1] / sum; var b = rgb2[2] / sum; var h = Math.acos( 0.5 * (r2 - g2 + (r2 - b)) / Math.sqrt((r2 - g2) * (r2 - g2) + (r2 - b) * (g2 - b)) ); if (b > g2) { h = 2 * Math.PI - h; } var s = 1 - 3 * Math.min(r2, g2, b); var i2 = sum / 3; return [h * 180 / Math.PI, s * 100, i2]; }; // tsl.js var tsl = { name: "tsl", min: [0, 0, 0], max: [1, 1, 1], channel: ["tint", "saturation", "lightness"], alias: ["TSL"] }; var tsl_default = tsl; tsl.rgb = function(tsl2) { var T2 = tsl2[0], S2 = tsl2[1], L = tsl2[2]; var x = Math.tan(2 * Math.PI * (T2 - 1 / 4)); x *= x; var r2 = Math.sqrt(5 * S2 * S2 / (9 * (1 / x + 1))) + 1 / 3; var g2 = Math.sqrt(5 * S2 * S2 / (9 * (x + 1))) + 1 / 3; var k2 = L / (0.185 * r2 + 0.473 * g2 + 0.114); var B2 = k2 * (1 - r2 - g2); var G2 = k2 * g2; var R2 = k2 * r2; return [ R2 * 255, G2 * 255, B2 * 255 ]; }; rgb_default.tsl = function(rgb2) { var [r2, g2, b] = rgb2; var r_ = (r2 / (r2 + g2 + b) || 0) - 1 / 3, g_ = (g2 / (r2 + g2 + b) || 0) - 1 / 3, T2 = g_ != 0 ? 0.5 - Math.atan2(g_, r_) / 2 / Math.PI : 0, S2 = Math.sqrt(9 / 5 * (r_ * r_ + g_ * g_)), L = (r2 * 0.299 + g2 * 0.587 + b * 0.114) / 255; return [T2, S2, L]; }; // yes.js var yes = { name: "yes", min: [0, 0, 0], max: [1, 1, 1], channel: ["luminance", "e-factor", "s-factor"] }; yes.rgb = function(arg) { var y = arg[0], e = arg[1], s = arg[2]; var m2 = [ 1, 1.431, 0.126, 1, -0.569, 0.126, 1, 0.431, -1.874 ]; var r2 = y * m2[0] + e * m2[1] + s * m2[2], g2 = y * m2[3] + e * m2[4] + s * m2[5], b = y * m2[6] + e * m2[7] + s * m2[8]; return [r2 * 255, g2 * 255, b * 255]; }; rgb_default.yes = function(arg) { var r2 = arg[0] / 255, g2 = arg[1] / 255, b = arg[2] / 255; var m2 = [ 0.253, 0.684, 0.063, 0.5, -0.5, 0, 0.25, 0.25, -0.5 ]; return [ r2 * m2[0] + g2 * m2[1] + b * m2[2], r2 * m2[3] + g2 * m2[4] + b * m2[5], r2 * m2[6] + g2 * m2[7] + b * m2[8] ]; }; var yes_default = yes; // osaucs.js var osaucs = { name: "osaucs", alias: ["OSA-UCS"], channel: ["L", "j", "g"], min: [-10, -6, -10], max: [8, 12, 6] }; osaucs.xyz = function(arg) { var x, y, z; throw "Unimplemented"; return [x, y, z]; }; xyz_default.osaucs = function(arg) { var X = arg[0], Y = arg[1], Z = arg[2]; var x = X / (X + Y + Z); var y = Y / (X + Y + Z); var K2 = 4.4934 * x * x + 4.3034 * y * y - 4.276 * x * y - 1.3744 * x - 2.56439 * y + 1.8103; var Y0 = K2 * Y; var L_ = 5.9 * (Math.pow(Y0, 1 / 3) - 2 / 3 + 0.042 * Math.pow(Math.max(Y0, 30) - 30, 1 / 3)); var L = (L_ - 14.3993) / Math.sqrt(2); var C2 = L_ / (5.9 * (Math.pow(Y0, 1 / 3) - 2 / 3)); var R2 = 0.779 * X + 0.4194 * Y - 0.1648 * Z; var G2 = -0.4493 * X + 1.3265 * Y + 0.0927 * Z; var B2 = -0.1149 * X + 0.3394 * Y + 0.717 * Z; R2 = Math.pow(R2, 1 / 3) || 0; G2 = Math.pow(G2, 1 / 3) || 0; B2 = Math.pow(B2, 1 / 3) || 0; var a = -13.7 * R2 + 17.7 * G2 - 4 * B2; var b = 1.7 * R2 + 8 * G2 - 9.7 * B2; var g2 = C2 * a; var j = C2 * b; return [L, j, g2]; }; var osaucs_default = osaucs; // hsp.js var Pr = 0.299; var Pg = 0.587; var Pb = 0.114; var hsp = { name: "hsp", min: [0, 0, 0], max: [360, 100, 255], channel: ["hue", "saturation", "perceived_brightness"], alias: ["HSP"], rgb: function(hsp2) { var h = hsp2[0] / 360, s = hsp2[1] / 100, p2 = hsp2[2], r2, g2, b, part, minOverMax = 1 - s; if (minOverMax > 0) { if (h < 1 / 6) { h = 6 * (h - 0 / 6); part = 1 + h * (1 / minOverMax - 1); b = p2 / Math.sqrt(Pr / minOverMax / minOverMax + Pg * part * part + Pb); r2 = b / minOverMax; g2 = b + h * (r2 - b); } else if (h < 2 / 6) { h = 6 * (-h + 2 / 6); part = 1 + h * (1 / minOverMax - 1); b = p2 / Math.sqrt(Pg / minOverMax / minOverMax + Pr * part * part + Pb); g2 = b / minOverMax; r2 = b + h * (g2 - b); } else if (h < 3 / 6) { h = 6 * (h - 2 / 6); part = 1 + h * (1 / minOverMax - 1); r2 = p2 / Math.sqrt(Pg / minOverMax / minOverMax + Pb * part * part + Pr); g2 = r2 / minOverMax; b = r2 + h * (g2 - r2); } else if (h < 4 / 6) { h = 6 * (-h + 4 / 6); part = 1 + h * (1 / minOverMax - 1); r2 = p2 / Math.sqrt(Pb / minOverMax / minOverMax + Pg * part * part + Pr); b = r2 / minOverMax; g2 = r2 + h * (b - r2); } else if (h < 5 / 6) { h = 6 * (h - 4 / 6); part = 1 + h * (1 / minOverMax - 1); g2 = p2 / Math.sqrt(Pb / minOverMax / minOverMax + Pr * part * part + Pg); b = g2 / minOverMax; r2 = g2 + h * (b - g2); } else { h = 6 * (-h + 6 / 6); part = 1 + h * (1 / minOverMax - 1); g2 = p2 / Math.sqrt(Pr / minOverMax / minOverMax + Pb * part * part + Pg); r2 = g2 / minOverMax; b = g2 + h * (r2 - g2); } } else { if (h < 1 / 6) { h = 6 * (h - 0 / 6); r2 = Math.sqrt(p2 * p2 / (Pr + Pg * h * h)); g2 = r2 * h; b = 0; } else if (h < 2 / 6) { h = 6 * (-h + 2 / 6); g2 = Math.sqrt(p2 * p2 / (Pg + Pr * h * h)); r2 = g2 * h; b = 0; } else if (h < 3 / 6) { h = 6 * (h - 2 / 6); g2 = Math.sqrt(p2 * p2 / (Pg + Pb * h * h)); b = g2 * h; r2 = 0; } else if (h < 4 / 6) { h = 6 * (-h + 4 / 6); b = Math.sqrt(p2 * p2 / (Pb + Pg * h * h)); g2 = b * h; r2 = 0; } else if (h < 5 / 6) { h = 6 * (h - 4 / 6); b = Math.sqrt(p2 * p2 / (Pb + Pr * h * h)); r2 = b * h; g2 = 0; } else { h = 6 * (-h + 6 / 6); r2 = Math.sqrt(p2 * p2 / (Pr + Pb * h * h)); b = r2 * h; g2 = 0; } } return [Math.round(r2), Math.round(g2), Math.round(b)]; } }; var hsp_default = hsp; rgb_default.hsp = function(rgb2) { var r2 = parseInt(rgb2[0], 10), g2 = parseInt(rgb2[1], 10), b = parseInt(rgb2[2], 10), h, s, p2; p2 = Math.sqrt(r2 * r2 * Pr + g2 * g2 * Pg + b * b * Pb); if (r2 === g2 && r