Advertisement
stuppid_bot

Color Lib

Jan 10th, 2017
295
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. ;(function () {
  2.   'use strict';
  3.  
  4.   // https://www.w3.org/TR/css3-color/#svg-color
  5.   const COLORS = {
  6.     aliceblue: 0xF0F8FF,
  7.     antiquewhite: 0xFAEBD7,
  8.     aqua: 0x00FFFF,
  9.     aquamarine: 0x7FFFD4,
  10.     azure: 0xF0FFFF,
  11.     beige: 0xF5F5DC,
  12.     bisque: 0xFFE4C4,
  13.     black: 0x000000,
  14.     blanchedalmond: 0xFFEBCD,
  15.     blue: 0x0000FF,
  16.     blueviolet: 0x8A2BE2,
  17.     brown: 0xA52A2A,
  18.     burlywood: 0xDEB887,
  19.     cadetblue: 0x5F9EA0,
  20.     chartreuse: 0x7FFF00,
  21.     chocolate: 0xD2691E,
  22.     coral: 0xFF7F50,
  23.     cornflowerblue: 0x6495ED,
  24.     cornsilk: 0xFFF8DC,
  25.     crimson: 0xDC143C,
  26.     cyan: 0x00FFFF,
  27.     darkblue: 0x00008B,
  28.     darkcyan: 0x008B8B,
  29.     darkgoldenrod: 0xB8860B,
  30.     darkgray: 0xA9A9A9,
  31.     darkgreen: 0x006400,
  32.     darkgrey: 0xA9A9A9,
  33.     darkkhaki: 0xBDB76B,
  34.     darkmagenta: 0x8B008B,
  35.     darkolivegreen: 0x556B2F,
  36.     darkorange: 0xFF8C00,
  37.     darkorchid: 0x9932CC,
  38.     darkred: 0x8B0000,
  39.     darksalmon: 0xE9967A,
  40.     darkseagreen: 0x8FBC8F,
  41.     darkslateblue: 0x483D8B,
  42.     darkslategray: 0x2F4F4F,
  43.     darkslategrey: 0x2F4F4F,
  44.     darkturquoise: 0x00CED1,
  45.     darkviolet: 0x9400D3,
  46.     deeppink: 0xFF1493,
  47.     deepskyblue: 0x00BFFF,
  48.     dimgray: 0x696969,
  49.     dimgrey: 0x696969,
  50.     dodgerblue: 0x1E90FF,
  51.     firebrick: 0xB22222,
  52.     floralwhite: 0xFFFAF0,
  53.     forestgreen: 0x228B22,
  54.     fuchsia: 0xFF00FF,
  55.     gainsboro: 0xDCDCDC,
  56.     ghostwhite: 0xF8F8FF,
  57.     gold: 0xFFD700,
  58.     goldenrod: 0xDAA520,
  59.     gray: 0x808080,
  60.     green: 0x008000,
  61.     greenyellow: 0xADFF2F,
  62.     grey: 0x808080,
  63.     honeydew: 0xF0FFF0,
  64.     hotpink: 0xFF69B4,
  65.     indianred: 0xCD5C5C,
  66.     indigo: 0x4B0082,
  67.     ivory: 0xFFFFF0,
  68.     khaki: 0xF0E68C,
  69.     lavender: 0xE6E6FA,
  70.     lavenderblush: 0xFFF0F5,
  71.     lawngreen: 0x7CFC00,
  72.     lemonchiffon: 0xFFFACD,
  73.     lightblue: 0xADD8E6,
  74.     lightcoral: 0xF08080,
  75.     lightcyan: 0xE0FFFF,
  76.     lightgoldenrodyellow: 0xFAFAD2,
  77.     lightgray: 0xD3D3D3,
  78.     lightgreen: 0x90EE90,
  79.     lightgrey: 0xD3D3D3,
  80.     lightpink: 0xFFB6C1,
  81.     lightsalmon: 0xFFA07A,
  82.     lightseagreen: 0x20B2AA,
  83.     lightskyblue: 0x87CEFA,
  84.     lightslategray: 0x778899,
  85.     lightslategrey: 0x778899,
  86.     lightsteelblue: 0xB0C4DE,
  87.     lightyellow: 0xFFFFE0,
  88.     lime: 0x00FF00,
  89.     limegreen: 0x32CD32,
  90.     linen: 0xFAF0E6,
  91.     magenta: 0xFF00FF,
  92.     maroon: 0x800000,
  93.     mediumaquamarine: 0x66CDAA,
  94.     mediumblue: 0x0000CD,
  95.     mediumorchid: 0xBA55D3,
  96.     mediumpurple: 0x9370DB,
  97.     mediumseagreen: 0x3CB371,
  98.     mediumslateblue: 0x7B68EE,
  99.     mediumspringgreen: 0x00FA9A,
  100.     mediumturquoise: 0x48D1CC,
  101.     mediumvioletred: 0xC71585,
  102.     midnightblue: 0x191970,
  103.     mintcream: 0xF5FFFA,
  104.     mistyrose: 0xFFE4E1,
  105.     moccasin: 0xFFE4B5,
  106.     navajowhite: 0xFFDEAD,
  107.     navy: 0x000080,
  108.     oldlace: 0xFDF5E6,
  109.     olive: 0x808000,
  110.     olivedrab: 0x6B8E23,
  111.     orange: 0xFFA500,
  112.     orangered: 0xFF4500,
  113.     orchid: 0xDA70D6,
  114.     palegoldenrod: 0xEEE8AA,
  115.     palegreen: 0x98FB98,
  116.     paleturquoise: 0xAFEEEE,
  117.     palevioletred: 0xDB7093,
  118.     papayawhip: 0xFFEFD5,
  119.     peachpuff: 0xFFDAB9,
  120.     peru: 0xCD853F,
  121.     pink: 0xFFC0CB,
  122.     plum: 0xDDA0DD,
  123.     powderblue: 0xB0E0E6,
  124.     purple: 0x800080,
  125.     red: 0xFF0000,
  126.     rosybrown: 0xBC8F8F,
  127.     royalblue: 0x4169E1,
  128.     saddlebrown: 0x8B4513,
  129.     salmon: 0xFA8072,
  130.     sandybrown: 0xF4A460,
  131.     seagreen: 0x2E8B57,
  132.     seashell: 0xFFF5EE,
  133.     sienna: 0xA0522D,
  134.     silver: 0xC0C0C0,
  135.     skyblue: 0x87CEEB,
  136.     slateblue: 0x6A5ACD,
  137.     slategray: 0x708090,
  138.     slategrey: 0x708090,
  139.     snow: 0xFFFAFA,
  140.     springgreen: 0x00FF7F,
  141.     steelblue: 0x4682B4,
  142.     tan: 0xD2B48C,
  143.     teal: 0x008080,
  144.     thistle: 0xD8BFD8,
  145.     tomato: 0xFF6347,
  146.     turquoise: 0x40E0D0,
  147.     violet: 0xEE82EE,
  148.     wheat: 0xF5DEB3,
  149.     white: 0xFFFFFF,
  150.     whitesmoke: 0xF5F5F5,
  151.     yellow: 0xFFFF00,
  152.     yellowgreen: 0x9ACD32
  153.   };
  154.  
  155.   // sRGB D65 http://www.brucelindbloom.com/index.html?Eqn_RGB_XYZ_Matrix.html
  156.   const RGB_XYZ = [
  157.     0.4124564, 0.3575761, 0.1804375,
  158.     0.2126729, 0.7151522, 0.072175,
  159.     0.0193339, 0.119192, 0.9503041
  160.   ];
  161.  
  162.   const XYZ_RGB = [
  163.     3.2404542, -1.5371385, -0.4985314,
  164.     -0.969266, 1.8760108, 0.041556,
  165.     0.0556434, -0.2040259, 1.0572252
  166.   ];
  167.  
  168.   const WHITE_REF = [0.95047, 1, 1.08883];
  169.  
  170.   function rgb2int(rgb) {
  171.     return (rgb[0] & 255) << 16 | (rgb[1] & 255) << 8 | (rgb[2] & 255);
  172.   }
  173.  
  174.   function int2rgb(v) {
  175.     let rgb = new Uint8ClampedArray(3);
  176.     rgb[0] = v >> 16;
  177.     rgb[1] = v >> 8 & 255;
  178.     rgb[2] = v & 255;
  179.     return rgb;
  180.   }
  181.  
  182.   function rgb2hex(rgb) {
  183.     return '#' + (0x1000000 + rgb2int(rgb)).toString(16).slice(1);
  184.   }
  185.  
  186.   function hex2rgb(h) {
  187.     try {
  188.       h = /^\s*#((?:[0-9A-Fa-f]{3}){1,2})\s*$/.exec(h)[1];
  189.     } catch (e) {
  190.       return null;
  191.     }
  192.     if (h.length === 3) {
  193.       h = h[0] + h[0] + h[1] + h[1] + h[2] + h[2];
  194.     }
  195.     return int2rgb(parseInt(h, 16));
  196.   }
  197.  
  198.   function name2rgb(c) {
  199.     c = c.trim().toLowerCase();
  200.     if (COLORS.hasOwnProperty(c)) {
  201.       return int2rgb(COLORS[c]);
  202.     }
  203.     return null;
  204.   }
  205.  
  206.   function rgb2xyz(rgb) {
  207.     let f = c => c > 0.04045
  208.       ? Math.pow((c + 0.055) / 1.055, 2.4)
  209.       : c / 12.92;
  210.     let r = f(rgb[0] / 255);
  211.     let g = f(rgb[1] / 255);
  212.     let b = f(rgb[2] / 255);
  213.     let xyz = new Float64Array(3);
  214.     xyz[0] = RGB_XYZ[0] * r + RGB_XYZ[1] * g + RGB_XYZ[2] * b;
  215.     xyz[1] = RGB_XYZ[3] * r + RGB_XYZ[4] * g + RGB_XYZ[5] * b;
  216.     xyz[2] = RGB_XYZ[6] * r + RGB_XYZ[7] * g + RGB_XYZ[8] * b;
  217.     return xyz;
  218.   }
  219.  
  220.   function xyz2rgb(xyz) {
  221.     let f = c => c > 0.0031308
  222.       ? 1.055 * Math.pow(c, 1 / 2.4) - 0.055
  223.       : 12.92 * c;
  224.     let r = XYZ_RGB[0] * xyz[0] + XYZ_RGB[1] * xyz[1] + XYZ_RGB[2] * xyz[2];
  225.     let g = XYZ_RGB[3] * xyz[0] + XYZ_RGB[4] * xyz[1] + XYZ_RGB[5] * xyz[2];
  226.     let b = XYZ_RGB[6] * xyz[0] + XYZ_RGB[7] * xyz[1] + XYZ_RGB[8] * xyz[2];
  227.     let rgb = new Uint8ClampedArray(3);
  228.     rgb[0] = f(r) * 255;
  229.     rgb[1] = f(g) * 255;
  230.     rgb[2] = f(b) * 255;
  231.     return rgb;
  232.   }
  233.  
  234.   // https://en.wikipedia.org/wiki/Lab_color_space
  235.   function xyz2lab(xyz) {
  236.     let f = t => t > 0.008856 ? Math.cbrt(t) : t / Math.pow(6 / 29, 2) + 4 / 29;
  237.     let x = f(xyz[0] / WHITE_REF[0]);
  238.     let y = f(xyz[1] / WHITE_REF[1]);
  239.     let z = f(xyz[2] / WHITE_REF[2]);
  240.     let lab = new Float64Array(3);
  241.     lab[0] = 116 * y - 16;
  242.     lab[1] = 500 * (x - y);
  243.     lab[2] = 200 * (y - z);
  244.     return lab;
  245.   }
  246.  
  247.   function lab2xyz(lab) {
  248.     let f = t => t > 6 / 29
  249.       ? t * t * t
  250.       : 3 * Math.pow(6 / 29, 2) * (t - 4 / 29);
  251.     let xyz = new Float64Array(3);
  252.     xyz[0] = WHITE_REF[0] * f((lab[0] + 16) / 116 + lab[1]/500);
  253.     xyz[1] = WHITE_REF[1] * f((lab[0] + 16) / 116);
  254.     xyz[2] = WHITE_REF[2] * f((lab[0] + 16) / 116 - lab[2]/200);
  255.     return xyz;
  256.   }
  257.  
  258.   function lab2lch(lab) {
  259.     let h = Math.atan2(lab[2], lab[1]) * 180 / Math.PI;
  260.     // Иногда угол получается отрицательным
  261.     if (h < 0) {
  262.       h += 360;
  263.     }
  264.     let lch = new Float64Array(3);
  265.     lch[0] = lab[0];
  266.     lch[1] = Math.sqrt(Math.pow(lab[1], 2) + Math.pow(lab[2], 2));
  267.     lch[2] = h;
  268.     return lch;
  269.   }
  270.  
  271.   function lch2lab(lch) {
  272.     let rads = lch[2] * Math.PI / 180;
  273.     let lab = new Float64Array(3);
  274.     lab[0] = lch[0];
  275.     lab[1] = lch[1] * Math.cos(rads);
  276.     lab[2] = lch[1] * Math.sin(rads);
  277.     return lab;
  278.   }
  279.  
  280.   function rgb2lab(rgb) {
  281.     return xyz2lab(rgb2xyz(rgb));
  282.   }
  283.  
  284.   function lab2rgb(lab) {
  285.     return xyz2rgb(lab2xyz(lab));
  286.   }
  287.  
  288.   function rgb2lch(rgb) {
  289.     return lab2lch(rgb2lab(rgb));
  290.   }
  291.  
  292.   function lch2rgb(lch) {
  293.     return lab2rgb(lch2lab(lch));
  294.   }
  295.  
  296.   function lighter(rgb, amount) {
  297.     let lab = rgb2lab(rgb);
  298.     lab[0] += (100 - lab[0]) * f;
  299.     return lab2rgb(lab);
  300.   }
  301.  
  302.   function darker(rgb, f = 0.5) {
  303.     let lab = rgb2lab(rgb);
  304.     lab[0] -= lab[0] * f;
  305.     return lab2rgb(lab);
  306.   }
  307.  
  308.   // Monochromatic colors
  309.  
  310.   // Add white
  311.   // tints(name2rgb('orange')).forEach(showColor)
  312.   function tints(rgb, amount = 5) {
  313.     let lab = rgb2lab(rgb);
  314.     let step = (100 - lab[0]) / amount;
  315.     let ret = Array(amount + 1);
  316.     ret[0] = rgb.slice();
  317.     for (let i = 1; i <= amount; ++i) {
  318.       ret[i] = lab2rgb([lab[0] + step * i, lab[1], lab[2]]);
  319.     }
  320.     return ret;
  321.   }
  322.  
  323.   // Add black
  324.   function shades(rgb, amount = 5) {
  325.     let lab = rgb2lab(rgb);
  326.     let step = lab[0] / amount;
  327.     let ret = Array(amount + 1);
  328.     ret[0] = rgb.slice();
  329.     for (let i = 1; i <= amount; ++i) {
  330.       ret[i] = lab2rgb([lab[0] - step * i, lab[1], lab[2]]);
  331.     }
  332.     return ret;
  333.   }
  334.  
  335.   // Add grey
  336.   function tones(rgb, amount = 5) {
  337.     let lch = rgb2lch(rgb);
  338.     let step = lch[1] / amount;
  339.     let ret = Array(amount + 1);
  340.     ret[0] = rgb.slice();
  341.     for (let i = 1; i <= amount; ++i) {
  342.       ret[i] = lch2rgb([lch[0], lch[1] - step * i, lch[2]]);
  343.     }
  344.     return ret;
  345.   }
  346.  
  347.   function rotateHue(rgb, angle) {
  348.     let lch = rgb2lch(rgb);
  349.     // lch2rgb работает и с отрицательными углами
  350.     lch[2] += angle;
  351.     return lch2rgb(lch);
  352.   }
  353.  
  354.   function complement(rgb) {
  355.     return rotateHue(rgb, 180);
  356.   }
  357.  
  358.   // Движемся по часовой стрелке
  359.   function triad(rgb, angle = 120) {
  360.     return [
  361.       rgb.slice(),
  362.       rotateHue(rgb, angle),
  363.       rotateHue(rgb, -angle)
  364.     ];
  365.   }
  366.  
  367.   function splitComplements(rgb) {
  368.     return triad(rgb, 150);
  369.   }
  370.  
  371.   function analogous(rgb) {
  372.     return triad(rgb, 30);
  373.   }
  374.  
  375.   // Double split complementary
  376.   function tetrad(rgb, angle = 90) {
  377.     return [
  378.       rgb.slice(),
  379.       rotateHue(rgb, angle),
  380.       complement(rgb),
  381.       rotateHue(rgb, 180 + angle)
  382.     ];
  383.   }
  384.  
  385.   // https://www.w3.org/TR/WCAG20/#relativeluminancedef
  386.   function luminance(rgb) {
  387.     let f = c => c > 0.03928 ? Math.pow((c + 0.055) / 1.055, 2.4) : c / 12.92;
  388.     let r = f(rgb[0] / 255);
  389.     let g = f(rgb[1] / 255);
  390.     let b = f(rgb[2] / 255);
  391.     return 0.2126 * r + 0.7152 * g + 0.0722 * b;
  392.   }
  393.  
  394.   // http://stackoverflow.com/a/3943023/2240578
  395.   function getTextColor(rgb) {
  396.     return luminance(rgb) > 0.179 ? 'black' : 'white';
  397.   }
  398.  
  399.   function showColor(rgb) {
  400.     let color = rgb2hex(rgb);
  401.     let textColor = getTextColor(rgb);
  402.     console.log('%c' + color, `background:${color};color:${textColor}`);
  403.   }
  404.  
  405.   /*
  406.   >>> found=re.findall(r'function\s+(\w+)', s)
  407.    */
  408.   let colorLib = {
  409.     rgb2int,
  410.     int2rgb,
  411.     rgb2hex,
  412.     hex2rgb,
  413.     name2rgb,
  414.     rgb2xyz,
  415.     xyz2rgb,
  416.     xyz2lab,
  417.     lab2xyz,
  418.     lab2lch,
  419.     lch2lab,
  420.     rgb2lab,
  421.     lab2rgb,
  422.     rgb2lch,
  423.     lch2rgb,
  424.     lighter,
  425.     darker,
  426.     tints,
  427.     shades,
  428.     tones,
  429.     rotateHue,
  430.     complement,
  431.     triad,
  432.     splitComplements,
  433.     analogous,
  434.     tetrad,
  435.     luminance,
  436.     getTextColor,
  437.     showColor
  438.   };
  439.   if (typeof module === 'object' && module && module.exports) {
  440.     module.exports = colorLib;
  441.   } else {
  442.     window.colorLib = colorLib;
  443.   }
  444. })();
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement