chromatism
Version:
A simple set of utility functions for colours.
2 lines (1 loc) • 13.8 kB
JavaScript
!function(r,n){"object"==typeof exports&&"undefined"!=typeof module?n(exports):"function"==typeof define&&define.amd?define(["exports"],n):n(r.chromatism=r.chromatism||{})}(this,function(r){"use strict";function n(r){return q[r]}function t(r,n){for(var t=[],u=0;u<r.length;u++){t[u]=[];for(var e=0;e<n[0].length;e++){for(var a=0,o=0;o<r[0].length;o++)a+=r[u][o]*n[o][e];t[u][e]=a}}return t}function u(r){return j[r]}function e(r){var n=V.find(function(n){return F[n](r)});if(!n)throw new Error("No type found for color "+r);return n}function a(r){return r*(Math.PI/180)}function o(r){return r*(180/Math.PI)}function h(r,n){return(r%n+n)%n}function i(r,n){return r<n[0]?r=n[0]:r>n[1]&&(r=n[1]),r}function c(r){return{r:ur(r.r),g:ur(r.g),b:ur(r.b)}}function s(r){if(Math.cbrt)return Math.cbrt(r);var n=Math.pow(Math.abs(r),1/3);return r<0?-n:n}function f(r,n,t){if(void 0===n)throw new Error("No value provided");var u=t||e(n);if(u===r)return n;if(Mr[u][r])return yr(u,r,n);var a=Yr[u],o="string"==typeof a?a:a[r]||a.default;return f(r,yr(u,o,n),o)}function l(r){var n={};return Xr.forEach(function(t){Object.defineProperty(n,t,{get:function(){return dr(t,r)},enumerable:!0})}),n}function v(r,e,a){var o=f("XYZ",r),h=f("lms",n(e)||n("D65")),i=f("lms",n(a)||n("D65")),c=u("BRADFORD"),s=t(t(t(u("INVERSE_BRADFORD"),[[h.rho/i.rho,0,0],[0,h.gamma/i.gamma,0],[0,0,h.beta/i.beta]]),c),[[o.X],[o.Y],[o.Z]]);return l({X:s[0][0],Y:s[1][0],Z:s[2][0]})}function b(r,n,t){for(var u=f("hsl",t),e=[{h:u.h,s:u.s,l:u.l}],a=0;a<n-1;a++)u.h=h(u.h+r,360),e.push({h:u.h,s:u.s,l:u.l});return l(e)}function g(r,n){var t=f("hsl",n);return t.l+=r,t.l<0?t.l=0:t.l>100&&(t.l=100),l(t)}function p(r){var n=f("hsl",r);return n.h=(n.h+180)%360,l(n)}function m(r,n){var t=f("rgb",n);return t.r=255*((t.r/255-.5)*r+.5),t.r<0?t.r=0:t.r>255&&(t.r=255),t.g=255*((t.g/255-.5)*r+.5),t.g<0?t.g=0:t.g>255&&(t.g=255),t.b=255*((t.b/255-.5)*r+.5),t.b<0?t.b=0:t.b>255&&(t.b=255),l(t)}function M(r){var n=f("rgb",r);return n=(299*n.r+587*n.g+114*n.b)/1e3>=128?{r:0,g:0,b:0}:{r:255,g:255,b:255},l(n)}function Y(r,n,t,u){t=t||1,u=u||1;var e=f("cielab",r),o=f("cielab",n),h=Math.sqrt(Math.pow(e.a,2)+Math.pow(e.b,2)),i=h-Math.sqrt(Math.pow(o.a,2)+Math.pow(o.b,2)),c=e.L-o.L,s=e.a-o.a,l=e.b-o.b,v=Math.sqrt(Math.pow(s,2)+Math.pow(l,2)-Math.pow(i,2)),b=e.L<16?.511:.040975*e.L/(1.01765*e.L),g=.0638*h/(1.0131*h),p=Math.atan2(e.b,e.a),m=p>=0?p:p+360,M=m>=164&&m<=345?.56+Math.abs(.2*Math.cos(a(m+168))):.36+Math.abs(.4*Math.cos(a(m+35))),Y=Math.pow(h,4)/(Math.pow(h,4)+1900),y=g*(Y*M+1-Y),X=Math.pow(c/(t*b),2),d=Math.pow(i/(u*g),2),Z=Math.pow(v/y,2);return Math.sqrt(X+d+Z)}function y(r,n){return r>2*n?y(r-2*n,n):r>n?2*n-r:r<0?y(r+2*n,n):r}function X(r,n,t){var u=f("rgb",n),e=f("rgb",t),a=[u];r-=1;for(var o=(e.r-u.r)/r,h=(e.g-u.g)/r,i=(e.b-u.b)/r,c={r:u.r,g:u.g,b:u.b},s=0;s<r-1;s++)c.r=y(c.r+o,255),c.g=y(c.g+h,255),c.b=y(c.b+i,255),a.push({r:c.r,g:c.g,b:c.b});return a.push(e),l(a)}function d(r){var n=f("rgb",r),t=(n.r+n.g+n.b)/3;return n={r:t,g:t,b:t},l(n)}function Z(r,n){var t=f("hsl",n);return t.h=h(t.h+r,360),l(t)}function L(r){var n=f("rgb",r);return n.r=h(255-n.r,255),n.g=h(255-n.g,255),n.b=h(255-n.b,255),l(n)}function w(r){var n=f("hsl",r);return n.l=100-n.l,l(n)}function R(r,n){var t=f("hsl",r),u=f("hsl",n);return l({h:(t.h+u.h)/2,s:(t.s+u.s)/2,l:(t.l+u.l)/2})}function E(r,n){var t=f("hsl",r),u=f("hsl",n),e={h:t.h,s:t.s,l:t.l/100*(u.l/100)*100};return e.l=e.l>100?100:e.l,e.l=e.l<0?0:e.l,l(e)}function D(r,n){var t=f("hsl",n);return t.s+=r,t.s<0?t.s=0:t.s>100&&(t.s=100),l(t)}function x(r){var n=f("rgb",r),t={};return t.r=.393*n.r+.769*n.g+.189*n.b,t.g=.349*n.r+.686*n.g+.168*n.b,t.b=.272*n.r+.534*n.g+.131*n.b,l(t)}function S(r,n){var t=f("hsv",n);return console.log(t),t.v+=r,t.v<0?t.v=0:t.v>100&&(t.v=100),console.log(t),l(t)}function _(r){var n=f("xyY",r),t=(n.x-.332)/(n.y-.1858);return-449*Math.pow(t,3)+3525*Math.pow(t,2)-6823.3*t+5520.33}function A(r){for(var n=f("hsl",r),t=[{h:n.h,s:n.s,l:n.l}],u=0;u<3;u++)n.h=(n.h+90)%360,t.push({h:n.h,s:n.s,l:n.l});return l(t)}function O(r){for(var n=f("hsl",r),t=[{h:n.h,s:n.s,l:n.l}],u=0;u<2;u++)n.h=(n.h+120)%360,t.push({h:n.h,s:n.s,l:n.l});return l(t)}function I(r){var n=f("hsluv",r);return n.hu=(n.hu+180)%360,l(n)}function k(r){for(var n=f("hsluv",r),t=[{hu:n.hu,s:n.s,l:n.l}],u=0;u<2;u++)n.hu=(n.hu+120)%360,t.push({h:n.hu,s:n.s,l:n.l});return l(t)}function B(r){for(var n=f("hsluv",r),t=[{hu:n.hu,s:n.s,l:n.l}],u=0;u<3;u++)n.hu=(n.hu+90)%360,t.push({h:n.hu,s:n.s,l:n.l});return l(t)}var q={A:{X:1.0985*100,Y:100,Z:35.585},B:{X:99.072,Y:100,Z:85.223},C:{X:98.074,Y:100,Z:118.232},D50:{X:96.422,Y:100,Z:82.521},D55:{X:95.682,Y:100,Z:92.149},D65:{X:95.047,Y:100,Z:108.883},D75:{X:94.972,Y:100,Z:122.638},E:{X:100,Y:100,Z:100},F2:{X:.99186*100,Y:100,Z:67.393},F7:{X:95.041,Y:100,Z:108.747},F11:{X:1.00962*100,Y:100,Z:64.35}},j={BRADFORD:[[.8951,.2664,-.1614],[-.7502,1.7135,.0367],[.0389,-.0685,1.0296]],INVERSE_BRADFORD:[[.9869929,-.1470543,.1599627],[.4323053,.5183603,.0492912],[-.0085287,.0400428,.9684867]],SRGB_XYZ:[[.4124,.3576,.1805],[.2126,.7152,.0722],[.0193,.1192,.9505]],INVERSE_SRGB_XYZ:[[3.2406,-1.5372,-.4986],[-.9689,1.8758,.0415],[.0557,-.204,1.057]]},N=function(r,n){var t=new Set(Object.keys(r));return n.every(function(r){return t.has(r)})},C=function(r,n){return"string"==typeof r&&r.slice(0,n.length)===n},F={hex:function(r){return C(r,"#")},rgb:function(r){return N(r,["r","g","b"])},cssrgb:function(r){return C(r,"rgb(")},hsl:function(r){return N(r,["h","s","l"])},csshsl:function(r){return C(r,"hsl(")},hsv:function(r){return N(r,["h","s","v"])},cmyk:function(r){return N(r,["c","m","y","k"])},yiq:function(r){return N(r,["y","i","q"])},XYZ:function(r){return N(r,["X","Y","Z"])},xyY:function(r){return N(r,["x","y","Y"])},lms:function(r){return N(r,["rho","gamma","beta"])},cielab:function(r){return N(r,["L","a","b"])},cieluv:function(r){return N(r,["L","u","v"])},cielch:function(r){return N(r,["L","C","h"])},hsluv:function(r){return N(r,["hu","s","l"])}},V=Object.keys(F),G=n("D65"),P=function(r){return Math.pow(r,3)>.008856?Math.pow(r,3):(116*r-16)/903.3},T={XYZ:function(r){var n=(r.L+16)/116,t=r.a/500+n,u=n-r.b/200,e=P(t),a=P(u),o=r.L>903.3*.008856?Math.pow(n,3):r.L/903.3;return{X:e*G.X,Y:o*G.Y,Z:a*G.Z}}},U={cieluv:function(r){var n=a(r.h),t=r.C*Math.cos(n),u=r.C*Math.sin(n);return{L:r.L,u:t,v:u}},hsluv:function(r){if(r.L>99.9999999)return{hu:r.h,s:0,l:100};if(r.L<1e-8)return{hu:r.h,s:0,l:0};for(var n=(r.L+16)/1560896,t=n>.008856?n:r.L/903.3,e=u("INVERSE_SRGB_XYZ"),o=[],h=0;h<3;h++)for(var i=e[h][0],c=e[h][1],s=e[h][2],f=0;f<2;f++){var l=(284517*i-94839*s)*t,v=(838422*s+769860*c+731718*i)*r.L*t-769860*f*r.L,b=(632260*s-126452*c)*t+126452*f;o.push({m:l/b,b:v/b})}var g=Number.MAX_VALUE,p=a(r.h);o.forEach(function(r){var n=r.b/(Math.sin(p)-r.m*Math.cos(p));n>=0&&(g=Math.min(g,n))});var m=g;return{hu:r.h,s:r.C/m*100,l:r.L}}},z={XYZ:function(r){var t=n("D65"),u=function(r){return 4*r.X/(r.X+15*r.Y+3*r.Z)}(t),e=function(r){return 9*r.Y/(r.X+15*r.Y+3*r.Z)}(t),a=1/3*(52*r.L/(r.u+13*r.L*u)-1),o=r.L>903.3*.008856?Math.pow((r.L+16)/116,3):r.L/903.3,h=-5*o,i=(o*(39*r.L/(r.v+13*r.L*e)-5)-h)/(a- -1/3);return{X:100*i,Y:100*o,Z:100*(i*a+h)}},cielch:function(r){var n=Math.sqrt(Math.pow(r.u,2)+Math.pow(r.v,2)),t=Math.atan2(r.v,r.u);return t<0&&(t+=2*Math.PI),t=o(t),{L:r.L,C:n,h:t}}},H=function(r){return{r:255*(1-r.c)*(1-r.k),g:255*(1-r.m)*(1-r.k),b:255*(1-r.y)*(1-r.k)}},J={rgb:H,cssrgb:function(r){var n=H(r),t=n.r,u=n.g,e=n.b;return"rgb("+Math.round(t)+","+Math.round(u)+","+Math.round(e)+")"}},K={hsl:function(r){var n=r.replace(/(hsl\(|\)|%|[\s]*)/g,"").split(",").map(function(r){return parseInt(r,10)});return{h:n[0],s:n[1],l:n[2]}}},Q={rgb:function(r){var n=r.replace(/((rgb\(|\))|[\s]*)/g,"").split(",").map(function(r){return parseInt(r,10)});return{r:n[0],g:n[1],b:n[2]}}},W={rgb:function(r){var n=r.replace("#","").match(/.{2}/g).map(function(r){return parseInt(r,16)});return{r:n[0],g:n[1],b:n[2]}}},$={rgb:function(r){if(0===r.s){var n=r.l/100*255;return{r:n,g:n,b:n}}var t,u,e;t=r.l>=50?r.l/100+r.s/100-r.l/100*(r.s/100):r.l/100*(1+r.s/100),u=r.l/100*2-t;var a,o,i,c=((e=r.h/360)+.333)%1,s=e,f=h(e-.333,1);return a=6*c<1?u+6*(t-u)*c:2*c<1?t:3*c<2?u+6*(.666-c)*(t-u):u,o=6*s<1?u+6*(t-u)*s:2*s<1?t:3*s<2?u+6*(.666-s)*(t-u):u,i=6*f<1?u+6*(t-u)*f:2*f<1?t:3*f<2?u+6*(.666-f)*(t-u):u,a<0&&(a=0),o<0&&(o=0),i<0&&(i=0),{r:255*a,g:255*o,b:255*i}},csshsl:function(r){return"hsl("+Math.round(r.h)+","+Math.round(r.s)+"%,"+Math.round(r.l)+"%)"},hsv:function(r){var n=Object.assign({},r,{s:r.s/100,l:r.l/100}),t=n.s*(n.l<.5?n.l:1-n.l);return{h:n.h,s:100*(2*t/(n.l+t)),v:100*(n.l+t)}}},rr={cielch:function(r){if(r.L>99.9999999)return{L:100,C:0,h:r.hu};if(r.L<1e-8)return{L:0,C:0,h:r.hu};for(var n=(r.l+16)/1560896,t=n>.008856?n:r.l/903.3,e=u("INVERSE_SRGB_XYZ"),o=[],h=0;h<3;h++)for(var i=e[h][0],c=e[h][1],s=e[h][2],f=0;f<2;f++){var l=(284517*i-94839*s)*t,v=(838422*s+769860*c+731718*i)*r.l*t-769860*f*r.l,b=(632260*s-126452*c)*t+126452*f;o.push({m:l/b,b:v/b})}var g=Number.MAX_VALUE,p=a(r.hu);o.forEach(function(r){var n=r.b/(Math.sin(p)-r.m*Math.cos(p));n>=0&&(g=Math.min(g,n))});var m=g;return{L:r.l,C:m/100*r.s,h:r.hu}}},nr={hsl:function(r){var n=Object.assign({},r,{h:r.h/360,s:r.s/100,v:r.v/100});return{h:360*n.h,s:100*((2-n.s)*n.v<1?n.s*n.v/((2-n.s)*n.v):n.s*n.v/(2-(2-n.s)*n.v)),l:100*((2-n.s)*n.v/2)}}},tr={XYZ:function(r){var n=[r.rho,r.gamma,r.beta],t=u("INVERSE_BRADFORD").map(function(r){return n.reduce(function(n,t,u){return r[u]*t+n},0)});return{X:100*t[0],Y:100*t[1],Z:100*t[2]}}},ur=function(r){return i(r,[0,255])},er=function(){function r(r,n){var t=[],u=!0,e=!1,a=void 0;try{for(var o,h=r[Symbol.iterator]();!(u=(o=h.next()).done)&&(t.push(o.value),!n||t.length!==n);u=!0);}catch(r){e=!0,a=r}finally{try{!u&&h.return&&h.return()}finally{if(e)throw a}}return t}return function(n,t){if(Array.isArray(n))return n;if(Symbol.iterator in Object(n))return r(n,t);throw new TypeError("Invalid attempt to destructure non-iterable instance")}}(),ar=n("D65"),or={rgb:function(r){var n=[r.X,r.Y,r.Z].map(function(r){return r/100}),t=u("INVERSE_SRGB_XYZ").map(function(r){return n.reduce(function(n,t,u){return r[u]*t+n},0)}).map(function(r){return r<=.0031308?12.92*r:1.055*Math.pow(r,1/2.4)-.055}).map(function(r){return 255*r}),e=er(t,3);return c({r:e[0],g:e[1],b:e[2]})},lms:function(r){var n=[r.X,r.Y,r.Z].map(function(r){return r/100}),t=u("BRADFORD").map(function(r){return n.reduce(function(n,t,u){return r[u]*t+n},0)});return{rho:t[0],gamma:t[1],beta:t[2]}},cielab:function(r){var n=r.X/ar.X,t=r.Y/ar.Y,u=r.Z/ar.Z,e=function(r){return r>.008856?s(r):(903.3*r+16)/116},a=e(n),o=e(t);return{L:116*o-16,a:500*(a-o),b:200*(o-e(u))}},cieluv:function(r){var n=r.Y/ar.Y,t=n>.008856?116*s(n)-16:903.3*n,u=function(r){return 4*r.X/(r.X+15*r.Y+3*r.Z)},e=function(r){return 9*r.Y/(r.X+15*r.Y+3*r.Z)};return{L:t,u:13*t*(u(r)-u(ar)),v:13*t*(e(r)-e(ar))}},xyY:function(r){return{x:r.X/(r.X+r.Y+r.Z),y:r.Y/(r.X+r.Y+r.Z),Y:r.Y}}},hr=or.lms,ir=or.cielab,cr=or.cieluv,sr=or.xyY,fr=function(r){var n,t,u=r.r/255,e=r.g/255,a=r.b/255,o=[u,e,a].sort(),h=(o[0]+o[2])/2*100;return o[0]===o[2]?(n=0,t=0):(n=h>=50?(o[2]-o[0])/(2-o[2]-o[0])*100:(o[2]-o[0])/(o[2]+o[0])*100,(t=o[2]===u?(e-a)/(o[2]-o[0])*60:o[2]===e?60*(2+(a-u)/(o[2]-o[0])):60*(4+(u-e)/(o[2]-o[0])))<0?t+=360:t>360&&(t%=360)),{h:t,s:n,l:h}},lr=function(r){return cr(vr(r))},vr=function(r){var n=[r.r,r.g,r.b].map(function(r){return r/255}).map(function(r){return r<=.04045?r/12.92:Math.pow((r+.055)/1.055,2.4)}),t=u("SRGB_XYZ").map(function(r){return n.reduce(function(n,t,u){return r[u]*t+n},0)}).map(function(r){return 100*r}),e=er(t,3);return{X:e[0],Y:e[1],Z:e[2]}},br={hex:function(r){var n=Math.round(r.r).toString(16);1===n.length&&(n="0"+n);var t=Math.round(r.g).toString(16);1===t.length&&(t="0"+t);var u=Math.round(r.b).toString(16);return 1===u.length&&(u="0"+u),"#"+n+t+u},cssrgb:function(r){return"rgb("+Math.round(r.r)+","+Math.round(r.g)+","+Math.round(r.b)+")"},hsl:fr,csshsl:function(r){var n=fr(r),t=n.h,u=n.s,e=n.l;return"hsl("+Math.round(t)+","+Math.round(u)+"%,"+Math.round(e)+"%)"},cmyk:function(r){var n=r.r/255,t=r.g/255,u=r.b/255,e=1-Math.max(n,t,u);return 1!==e?{c:(1-n-e)/(1-e),m:(1-t-e)/(1-e),y:(1-u-e)/(1-e),k:e}:{c:0,m:0,y:0,k:e}},yiq:function(r){var n=r.r/255*.299+r.g/255*.587+r.b/255*.114,t=r.r/255*.596+r.g/255*-.274+r.b/255*-.322,u=r.r/255*.211+r.g/255*-.523+r.b/255*.312;return t=i(t,[-.5957,.5957]),u=i(u,[-.5226,.5226]),{y:n,i:t,q:u}},XYZ:vr,lms:function(r){return hr(vr(r))},cielab:function(r){return ir(vr(r))},cieluv:lr,xyY:function(r){return sr(vr(r))}},gr={XYZ:function(r){var n=r.x,t=r.y,u=r.Y;return{X:u/t*n,Y:u,Z:u/t*(1-n-t)}}},pr=function(r){return i(r,[0,255])},mr={rgb:function(r){var n=i(r.i,[-.5957,.5957]),t=i(r.q,[-.5226,.5226]);return{r:255*pr(r.y+.956*n+.621*t),g:255*pr(r.y+-.272*n+-.647*t),b:255*pr(r.y+-1.106*n+-1.703*t)}}},Mr=Object.freeze({cielab:T,cielch:U,cieluv:z,cmyk:J,csshsl:K,cssrgb:Q,hex:W,hsl:$,hsluv:rr,hsv:nr,lms:tr,rgb:br,xyY:gr,XYZ:or,yiq:mr}),Yr={rgb:{default:"XYZ",csshsl:"hsl",hsv:"hsl"},hex:"rgb",hsl:"rgb",hsv:"hsl",csshsl:"hsl",cssrgb:"rgb",cmyk:"rgb",XYZ:{default:"rgb",cielch:"cieluv",hsluv:"cieluv"},xyY:"XYZ",lms:"XYZ",cieluv:{default:"XYZ",hsluv:"cielch"},cielch:"cieluv",cielab:"XYZ",yiq:"rgb",hsluv:"cielch"},yr=function(r,n,t){return Mr[r][n](t)},Xr=Object.keys(F),dr=function(r,n){return Array.isArray(n)?n.map(function(n){return f(r,n)}):f(r,n)};r.adapt=v,r.adjacent=b,r.brightness=g,r.complementary=p,r.contrast=m,r.contrastRatio=M,r.convert=l,r.difference=Y,r.fade=X,r.greyscale=d,r.hue=Z,r.invert=L,r.invertLightness=w,r.mid=R,r.multiply=E,r.saturation=D,r.sepia=x,r.shade=S,r.temperature=_,r.tetrad=A,r.triad=O,r.uniformComplementary=I,r.uniformTriad=k,r.uniformTetrad=B,Object.defineProperty(r,"__esModule",{value:!0})});