Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- ;(function () {
- 'use strict';
- // https://www.w3.org/TR/css3-color/#svg-color
- const COLORS = {
- aliceblue: 0xF0F8FF,
- antiquewhite: 0xFAEBD7,
- aqua: 0x00FFFF,
- aquamarine: 0x7FFFD4,
- azure: 0xF0FFFF,
- beige: 0xF5F5DC,
- bisque: 0xFFE4C4,
- black: 0x000000,
- blanchedalmond: 0xFFEBCD,
- blue: 0x0000FF,
- blueviolet: 0x8A2BE2,
- brown: 0xA52A2A,
- burlywood: 0xDEB887,
- cadetblue: 0x5F9EA0,
- chartreuse: 0x7FFF00,
- chocolate: 0xD2691E,
- coral: 0xFF7F50,
- cornflowerblue: 0x6495ED,
- cornsilk: 0xFFF8DC,
- crimson: 0xDC143C,
- cyan: 0x00FFFF,
- darkblue: 0x00008B,
- darkcyan: 0x008B8B,
- darkgoldenrod: 0xB8860B,
- darkgray: 0xA9A9A9,
- darkgreen: 0x006400,
- darkgrey: 0xA9A9A9,
- darkkhaki: 0xBDB76B,
- darkmagenta: 0x8B008B,
- darkolivegreen: 0x556B2F,
- darkorange: 0xFF8C00,
- darkorchid: 0x9932CC,
- darkred: 0x8B0000,
- darksalmon: 0xE9967A,
- darkseagreen: 0x8FBC8F,
- darkslateblue: 0x483D8B,
- darkslategray: 0x2F4F4F,
- darkslategrey: 0x2F4F4F,
- darkturquoise: 0x00CED1,
- darkviolet: 0x9400D3,
- deeppink: 0xFF1493,
- deepskyblue: 0x00BFFF,
- dimgray: 0x696969,
- dimgrey: 0x696969,
- dodgerblue: 0x1E90FF,
- firebrick: 0xB22222,
- floralwhite: 0xFFFAF0,
- forestgreen: 0x228B22,
- fuchsia: 0xFF00FF,
- gainsboro: 0xDCDCDC,
- ghostwhite: 0xF8F8FF,
- gold: 0xFFD700,
- goldenrod: 0xDAA520,
- gray: 0x808080,
- green: 0x008000,
- greenyellow: 0xADFF2F,
- grey: 0x808080,
- honeydew: 0xF0FFF0,
- hotpink: 0xFF69B4,
- indianred: 0xCD5C5C,
- indigo: 0x4B0082,
- ivory: 0xFFFFF0,
- khaki: 0xF0E68C,
- lavender: 0xE6E6FA,
- lavenderblush: 0xFFF0F5,
- lawngreen: 0x7CFC00,
- lemonchiffon: 0xFFFACD,
- lightblue: 0xADD8E6,
- lightcoral: 0xF08080,
- lightcyan: 0xE0FFFF,
- lightgoldenrodyellow: 0xFAFAD2,
- lightgray: 0xD3D3D3,
- lightgreen: 0x90EE90,
- lightgrey: 0xD3D3D3,
- lightpink: 0xFFB6C1,
- lightsalmon: 0xFFA07A,
- lightseagreen: 0x20B2AA,
- lightskyblue: 0x87CEFA,
- lightslategray: 0x778899,
- lightslategrey: 0x778899,
- lightsteelblue: 0xB0C4DE,
- lightyellow: 0xFFFFE0,
- lime: 0x00FF00,
- limegreen: 0x32CD32,
- linen: 0xFAF0E6,
- magenta: 0xFF00FF,
- maroon: 0x800000,
- mediumaquamarine: 0x66CDAA,
- mediumblue: 0x0000CD,
- mediumorchid: 0xBA55D3,
- mediumpurple: 0x9370DB,
- mediumseagreen: 0x3CB371,
- mediumslateblue: 0x7B68EE,
- mediumspringgreen: 0x00FA9A,
- mediumturquoise: 0x48D1CC,
- mediumvioletred: 0xC71585,
- midnightblue: 0x191970,
- mintcream: 0xF5FFFA,
- mistyrose: 0xFFE4E1,
- moccasin: 0xFFE4B5,
- navajowhite: 0xFFDEAD,
- navy: 0x000080,
- oldlace: 0xFDF5E6,
- olive: 0x808000,
- olivedrab: 0x6B8E23,
- orange: 0xFFA500,
- orangered: 0xFF4500,
- orchid: 0xDA70D6,
- palegoldenrod: 0xEEE8AA,
- palegreen: 0x98FB98,
- paleturquoise: 0xAFEEEE,
- palevioletred: 0xDB7093,
- papayawhip: 0xFFEFD5,
- peachpuff: 0xFFDAB9,
- peru: 0xCD853F,
- pink: 0xFFC0CB,
- plum: 0xDDA0DD,
- powderblue: 0xB0E0E6,
- purple: 0x800080,
- red: 0xFF0000,
- rosybrown: 0xBC8F8F,
- royalblue: 0x4169E1,
- saddlebrown: 0x8B4513,
- salmon: 0xFA8072,
- sandybrown: 0xF4A460,
- seagreen: 0x2E8B57,
- seashell: 0xFFF5EE,
- sienna: 0xA0522D,
- silver: 0xC0C0C0,
- skyblue: 0x87CEEB,
- slateblue: 0x6A5ACD,
- slategray: 0x708090,
- slategrey: 0x708090,
- snow: 0xFFFAFA,
- springgreen: 0x00FF7F,
- steelblue: 0x4682B4,
- tan: 0xD2B48C,
- teal: 0x008080,
- thistle: 0xD8BFD8,
- tomato: 0xFF6347,
- turquoise: 0x40E0D0,
- violet: 0xEE82EE,
- wheat: 0xF5DEB3,
- white: 0xFFFFFF,
- whitesmoke: 0xF5F5F5,
- yellow: 0xFFFF00,
- yellowgreen: 0x9ACD32
- };
- // sRGB D65 http://www.brucelindbloom.com/index.html?Eqn_RGB_XYZ_Matrix.html
- const RGB_XYZ = [
- 0.4124564, 0.3575761, 0.1804375,
- 0.2126729, 0.7151522, 0.072175,
- 0.0193339, 0.119192, 0.9503041
- ];
- const XYZ_RGB = [
- 3.2404542, -1.5371385, -0.4985314,
- -0.969266, 1.8760108, 0.041556,
- 0.0556434, -0.2040259, 1.0572252
- ];
- const WHITE_REF = [0.95047, 1, 1.08883];
- function rgb2int(rgb) {
- return (rgb[0] & 255) << 16 | (rgb[1] & 255) << 8 | (rgb[2] & 255);
- }
- function int2rgb(v) {
- let rgb = new Uint8ClampedArray(3);
- rgb[0] = v >> 16;
- rgb[1] = v >> 8 & 255;
- rgb[2] = v & 255;
- return rgb;
- }
- function rgb2hex(rgb) {
- return '#' + (0x1000000 + rgb2int(rgb)).toString(16).slice(1);
- }
- function hex2rgb(h) {
- try {
- h = /^\s*#((?:[0-9A-Fa-f]{3}){1,2})\s*$/.exec(h)[1];
- } catch (e) {
- return null;
- }
- if (h.length === 3) {
- h = h[0] + h[0] + h[1] + h[1] + h[2] + h[2];
- }
- return int2rgb(parseInt(h, 16));
- }
- function name2rgb(c) {
- c = c.trim().toLowerCase();
- if (COLORS.hasOwnProperty(c)) {
- return int2rgb(COLORS[c]);
- }
- return null;
- }
- function rgb2xyz(rgb) {
- let f = c => c > 0.04045
- ? Math.pow((c + 0.055) / 1.055, 2.4)
- : c / 12.92;
- let r = f(rgb[0] / 255);
- let g = f(rgb[1] / 255);
- let b = f(rgb[2] / 255);
- let xyz = new Float64Array(3);
- xyz[0] = RGB_XYZ[0] * r + RGB_XYZ[1] * g + RGB_XYZ[2] * b;
- xyz[1] = RGB_XYZ[3] * r + RGB_XYZ[4] * g + RGB_XYZ[5] * b;
- xyz[2] = RGB_XYZ[6] * r + RGB_XYZ[7] * g + RGB_XYZ[8] * b;
- return xyz;
- }
- function xyz2rgb(xyz) {
- let f = c => c > 0.0031308
- ? 1.055 * Math.pow(c, 1 / 2.4) - 0.055
- : 12.92 * c;
- let r = XYZ_RGB[0] * xyz[0] + XYZ_RGB[1] * xyz[1] + XYZ_RGB[2] * xyz[2];
- let g = XYZ_RGB[3] * xyz[0] + XYZ_RGB[4] * xyz[1] + XYZ_RGB[5] * xyz[2];
- let b = XYZ_RGB[6] * xyz[0] + XYZ_RGB[7] * xyz[1] + XYZ_RGB[8] * xyz[2];
- let rgb = new Uint8ClampedArray(3);
- rgb[0] = f(r) * 255;
- rgb[1] = f(g) * 255;
- rgb[2] = f(b) * 255;
- return rgb;
- }
- // https://en.wikipedia.org/wiki/Lab_color_space
- function xyz2lab(xyz) {
- let f = t => t > 0.008856 ? Math.cbrt(t) : t / Math.pow(6 / 29, 2) + 4 / 29;
- let x = f(xyz[0] / WHITE_REF[0]);
- let y = f(xyz[1] / WHITE_REF[1]);
- let z = f(xyz[2] / WHITE_REF[2]);
- let lab = new Float64Array(3);
- lab[0] = 116 * y - 16;
- lab[1] = 500 * (x - y);
- lab[2] = 200 * (y - z);
- return lab;
- }
- function lab2xyz(lab) {
- let f = t => t > 6 / 29
- ? t * t * t
- : 3 * Math.pow(6 / 29, 2) * (t - 4 / 29);
- let xyz = new Float64Array(3);
- xyz[0] = WHITE_REF[0] * f((lab[0] + 16) / 116 + lab[1]/500);
- xyz[1] = WHITE_REF[1] * f((lab[0] + 16) / 116);
- xyz[2] = WHITE_REF[2] * f((lab[0] + 16) / 116 - lab[2]/200);
- return xyz;
- }
- function lab2lch(lab) {
- let h = Math.atan2(lab[2], lab[1]) * 180 / Math.PI;
- // Иногда угол получается отрицательным
- if (h < 0) {
- h += 360;
- }
- let lch = new Float64Array(3);
- lch[0] = lab[0];
- lch[1] = Math.sqrt(Math.pow(lab[1], 2) + Math.pow(lab[2], 2));
- lch[2] = h;
- return lch;
- }
- function lch2lab(lch) {
- let rads = lch[2] * Math.PI / 180;
- let lab = new Float64Array(3);
- lab[0] = lch[0];
- lab[1] = lch[1] * Math.cos(rads);
- lab[2] = lch[1] * Math.sin(rads);
- return lab;
- }
- function rgb2lab(rgb) {
- return xyz2lab(rgb2xyz(rgb));
- }
- function lab2rgb(lab) {
- return xyz2rgb(lab2xyz(lab));
- }
- function rgb2lch(rgb) {
- return lab2lch(rgb2lab(rgb));
- }
- function lch2rgb(lch) {
- return lab2rgb(lch2lab(lch));
- }
- function lighter(rgb, amount) {
- let lab = rgb2lab(rgb);
- lab[0] += (100 - lab[0]) * f;
- return lab2rgb(lab);
- }
- function darker(rgb, f = 0.5) {
- let lab = rgb2lab(rgb);
- lab[0] -= lab[0] * f;
- return lab2rgb(lab);
- }
- // Monochromatic colors
- // Add white
- // tints(name2rgb('orange')).forEach(showColor)
- function tints(rgb, amount = 5) {
- let lab = rgb2lab(rgb);
- let step = (100 - lab[0]) / amount;
- let ret = Array(amount + 1);
- ret[0] = rgb.slice();
- for (let i = 1; i <= amount; ++i) {
- ret[i] = lab2rgb([lab[0] + step * i, lab[1], lab[2]]);
- }
- return ret;
- }
- // Add black
- function shades(rgb, amount = 5) {
- let lab = rgb2lab(rgb);
- let step = lab[0] / amount;
- let ret = Array(amount + 1);
- ret[0] = rgb.slice();
- for (let i = 1; i <= amount; ++i) {
- ret[i] = lab2rgb([lab[0] - step * i, lab[1], lab[2]]);
- }
- return ret;
- }
- // Add grey
- function tones(rgb, amount = 5) {
- let lch = rgb2lch(rgb);
- let step = lch[1] / amount;
- let ret = Array(amount + 1);
- ret[0] = rgb.slice();
- for (let i = 1; i <= amount; ++i) {
- ret[i] = lch2rgb([lch[0], lch[1] - step * i, lch[2]]);
- }
- return ret;
- }
- function rotateHue(rgb, angle) {
- let lch = rgb2lch(rgb);
- // lch2rgb работает и с отрицательными углами
- lch[2] += angle;
- return lch2rgb(lch);
- }
- function complement(rgb) {
- return rotateHue(rgb, 180);
- }
- // Движемся по часовой стрелке
- function triad(rgb, angle = 120) {
- return [
- rgb.slice(),
- rotateHue(rgb, angle),
- rotateHue(rgb, -angle)
- ];
- }
- function splitComplements(rgb) {
- return triad(rgb, 150);
- }
- function analogous(rgb) {
- return triad(rgb, 30);
- }
- // Double split complementary
- function tetrad(rgb, angle = 90) {
- return [
- rgb.slice(),
- rotateHue(rgb, angle),
- complement(rgb),
- rotateHue(rgb, 180 + angle)
- ];
- }
- // https://www.w3.org/TR/WCAG20/#relativeluminancedef
- function luminance(rgb) {
- let f = c => c > 0.03928 ? Math.pow((c + 0.055) / 1.055, 2.4) : c / 12.92;
- let r = f(rgb[0] / 255);
- let g = f(rgb[1] / 255);
- let b = f(rgb[2] / 255);
- return 0.2126 * r + 0.7152 * g + 0.0722 * b;
- }
- // http://stackoverflow.com/a/3943023/2240578
- function getTextColor(rgb) {
- return luminance(rgb) > 0.179 ? 'black' : 'white';
- }
- function showColor(rgb) {
- let color = rgb2hex(rgb);
- let textColor = getTextColor(rgb);
- console.log('%c' + color, `background:${color};color:${textColor}`);
- }
- /*
- >>> found=re.findall(r'function\s+(\w+)', s)
- */
- let colorLib = {
- rgb2int,
- int2rgb,
- rgb2hex,
- hex2rgb,
- name2rgb,
- rgb2xyz,
- xyz2rgb,
- xyz2lab,
- lab2xyz,
- lab2lch,
- lch2lab,
- rgb2lab,
- lab2rgb,
- rgb2lch,
- lch2rgb,
- lighter,
- darker,
- tints,
- shades,
- tones,
- rotateHue,
- complement,
- triad,
- splitComplements,
- analogous,
- tetrad,
- luminance,
- getTextColor,
- showColor
- };
- if (typeof module === 'object' && module && module.exports) {
- module.exports = colorLib;
- } else {
- window.colorLib = colorLib;
- }
- })();
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement