diff --git a/CHANGELOG.md b/CHANGELOG.md index d0d5d87..8727252 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,10 @@ # Change Log +## v0.0.4 + + - add API `complement` for calculating complementary of colors. + + ## v0.0.3 - wrap code by lsc instead of wrapping manually so lsc generated functions can also be wrapped. diff --git a/README.md b/README.md index d5d82db..47b5896 100644 --- a/README.md +++ b/README.md @@ -66,7 +66,8 @@ ldcolor provides following API: - `int(color)` - convert `color` to 24bit integer. - `rand()` - randomize and return a color - `lighter(color, strength)` - make `color` lighter - - `darker(color, strength)` - maerk `color` darker + - `darker(color, strength)` - make `color` darker + - `complement(color)` - get complementary of `color` These API are also available as a member function in a `ldcolor` object: diff --git a/dist/ldcolor.js b/dist/ldcolor.js index ac4edfc..1cd01d1 100644 --- a/dist/ldcolor.js +++ b/dist/ldcolor.js @@ -415,6 +415,15 @@ a: 1 }; }, + complement: function(v){ + var rgb; + rgb = utils.rgb(v); + return utils.hsl({ + r: 255 - rgb.r, + g: 255 - rgb.g, + b: 255 - rgb.b + }); + }, lighter: function(v, k){ var hsl; v == null && (v = this); diff --git a/dist/ldcolor.min.js b/dist/ldcolor.min.js index 233416e..634dc13 100644 --- a/dist/ldcolor.min.js +++ b/dist/ldcolor.min.js @@ -1 +1 @@ -(function(){var ReI,ReN,ReP,re,parse,ldcolor,t0,t1,t2,t3,Xn,Yn,Zn,conv,utils,k,v;ReI="\\s*([+-]?\\d+|nan|NaN)\\s*";ReN="\\s*([+-]?\\d*\\.?\\d+(?:[eE][+-]?\\d+)?|nan|NaN)\\s*";ReP="\\s*([+-]?\\d*\\.?\\d+(?:[eE][+-]?\\d+)?)%\\s*";re={hex3:/^#([0-9a-fA-F]{3})$/,hex6:/^#([0-9a-fA-F]{6})$/,rgbint:new RegExp("^rgb\\("+[ReI,ReI,ReI]+"\\)$"),rgbp:new RegExp("^rgb\\("+[ReP,ReP,ReP]+"\\)$"),rgbaint:new RegExp("^rgba\\("+[ReI,ReI,ReI,ReN]+"\\)$"),rgbap:new RegExp("^rgba\\("+[ReP,ReP,ReP,ReN]+"\\)$"),hslp:new RegExp("^hsl\\("+[ReN,ReP,ReP]+"\\)$"),hslap:new RegExp("^hsla\\("+[ReN,ReP,ReP,ReN]+"\\)$")};parse={hex3:function(v){v=parseInt(v[1],16);return{r:(v>>8)*17,g:(v&240)*17>>4,b:(v&15)*17,a:1}},hex6:function(v){v=parseInt(v[1],16);return{r:v>>16,g:v>>8&255,b:v&255,a:1}},rgbint:function(v){return{r:+v[1],g:+v[2],b:+v[3],a:1}},rgbp:function(v){return{r:v[1]*255/100,g:+v[2]*255/100,b:+v[3]*255/100,a:1}},rgbaint:function(v){return{r:+v[1],g:+v[2],b:+v[3],a:+v[4]}},rgbap:function(v){return{r:v[1]*255/100,g:+v[2]*255/100,b:v[3]*255/100,a:+v[4]}},hslap:function(v){return{h:+v[1],s:v[2]/100,l:v[3]/100,a:+v[4]}},hslp:function(v){return{h:+v[1],s:v[2]/100,l:v[3]/100,a:1}},all:function(o){var that,ref$,k,v;if(typeof o==="object"){if(!(o.a!=null)){o.a=1}return o["@a"]?o=conv.lab2rgb(o):o["c"]?o=conv.hcl2rgb(o):o.hex?(that=re.hex3.exec(o.hex))?(ref$=parse.hex3(that)||{},ref$.a=o.a,ref$):(that=re.hex6.exec(o.hex))?(ref$=parse.hex6(that),ref$.a=o.a,ref$):o:o.value?parse.all(o.value):o}else if(typeof o==="number"){return conv.num2rgb(o)}o=(o+"").trim().toLowerCase();for(k in ref$=re){v=ref$[k];if(that=v.exec(o)){return parse[k](that)}else{continue}}if(typeof named!="undefined"&&named!==null&&named[o]){return conv.num2rgb(named[o])}if(o==="transparent"){return{r:NaN,g:NaN,b:NaN,a:0}}return{r:NaN,g:NaN,b:NaN,a:NaN}}};ldcolor=function(v){return import$(this,parse.all(v))};t0=4/29;t1=6/29;t2=3*t1*t1;t3=t1*t1*t1;Xn=.96422;Yn=1;Zn=.82521;conv={num2rgb:function(v){return{r:v>>16,g:v>>8&255,b:v&255,a:1}},_hsl2rgb:function(h,m1,m2){return(h<60?m1+(m2-m1)*h/60:h<180?m2:h<240?m1+(m2-m1)*(240-h)/60:m1)*255},hsl2rgb:function(arg$){var h,s,l,a,m2,m1,ref$;h=arg$.h,s=arg$.s,l=arg$.l,a=arg$.a;h=h%360+(h<0)*360;s=isNaN(h)||isNaN(s)?0:s;m2=l+(l<.5?l:1-l)*s;m1=2*l-m2;return{r:(ref$=this._hsl2rgb(h>=240?h-240:h+120,m1,m2))>0?ref$:0,g:(ref$=this._hsl2rgb(h,m1,m2))>0?ref$:0,b:(ref$=this._hsl2rgb(h<120?h+240:h-120,m1,m2))>0?ref$:0,a:a}},rgb2hsl:function(arg$){var r,g,b,a,ref$,Cmax,Cmin,delta,l,h,s;r=arg$.r,g=arg$.g,b=arg$.b,a=arg$.a;ref$=[r/255,g/255,b/255],r=ref$[0],g=ref$[1],b=ref$[2];Cmax=Math.max(r,g,b);Cmin=Math.min(r,g,b);delta=Cmax-Cmin;l=(Cmax+Cmin)/2;if(delta===0){ref$=[0,0],h=ref$[0],s=ref$[1]}else{h=function(){switch(false){case Cmax!==r:return 60*((g-b)/delta%6);case Cmax!==g:return 60*((b-r)/delta+2);case Cmax!==b:return 60*((r-g)/delta+4)}}();s=delta/(1-Math.abs(2*l-1))}h=(h+360)%360;return{h:h,s:s,l:l,a:a}},_rgb2lrgb:function(x){if((x/=255)<=.04045){return x/12.92}else{return Math.pow((x+.055)/1.055,2.4)}},_xyz2lab:function(t){if(t>t3){return Math.pow(t,1/3)}else{return t/t2+t0}},_lab2xyz:function(t){if(t>t1){return t*t*t}else{return t2*(t-t0)}},_lrgb2rgb:function(x){var ref$,ref1$;return(ref$=(ref1$=255*(x<=.0031308?12.92*x:1.055*Math.pow(x,1/2.4)-.055))<255?ref1$:255)>0?ref$:0},lab2rgb:function(v){var ref$,l,a,b,o,y,x,z;ref$=[v["@l"],v["@a"],v["@b"],v["a"]!=null?v["a"]:1],l=ref$[0],a=ref$[1],b=ref$[2],o=ref$[3];y=(l+16)/116;x=isNaN(a)?y:y+a/500;z=isNaN(b)?y:y-b/200;x=Xn*conv._lab2xyz(x);y=Yn*conv._lab2xyz(y);z=Zn*conv._lab2xyz(z);return{r:conv._lrgb2rgb(3.1338561*x-1.6168667*y-.4906146*z),g:conv._lrgb2rgb(-.9787684*x+1.9161415*y+.033454*z),b:conv._lrgb2rgb(.0719453*x-.2289914*y+1.4052427*z),a:o}},lab2hcl:function(v){var ref$,l,a,b,o,h;ref$=[v["@l"],v["@a"],v["@b"],v["a"]!=null?v["a"]:1],l=ref$[0],a=ref$[1],b=ref$[2],o=ref$[3];if(a===0&&b===0){return{h:NaN,c:0,l:l,a:o}}h=Math.atan2(b,a)*180/Math.PI;return{h:isNaN(h)?h:h<0?h+360:h>0?h:0,c:Math.sqrt(a*a+b*b),l:isNaN(l)?l:l>0?l:0,a:o}},hcl2lab:function(v){var h;v.a=v.a!=null?v.a:1;if(isNaN(v.h)){return{"@l":v.l,"@a":0,"@b":0,a:v.a}}h=v.h*Math.PI/180;return{"@l":v.l,"@a":Math.cos(h)*v.c,"@b":Math.sin(h)*v.c,a:v.a}},hcl2rgb:function(v){return this.lab2rgb(this.hcl2lab(v))}};utils={same:function(a,b){var ref$;b==null&&(b=this);ref$=[this.rgb(a),this.rgb(b)],a=ref$[0],b=ref$[1];return a.r===b.r&&a.g===b.g&&a.b===b.b&&a.a===b.a},rgb:function(v){var ret;v==null&&(v=this);ret=parse.all(v);if(ret.c!=null){return conv.lab2rgb(conv.hcl2lab(ret))}if(ret.h!=null){return conv.hsl2rgb(ret)}else{return ret}},rgbfv:function(v){var ret;v==null&&(v=this);ret=this.rgb(v);return[ret.r/255,ret.g/255,ret.b/255]},web:function(v,compact){var ret;v==null&&(v=this);compact==null&&(compact=false);ret=utils.rgb(v);if(ret.a!=null&&(isNaN(ret.a)||!ret.a&&["r","g","b"].filter(function(it){return ret[it]!=null&&isNaN(ret[it])}))){return"transparent"}if(ret.a<1){return this.rgbaStr(ret)}else{return this.hex(ret,compact)}},rgbaStr:function(v){var ret;v==null&&(v=this);ret=utils.rgb(v);return"rgba("+Math.round(ret.r)+", "+Math.round(ret.g)+", "+Math.round(ret.b)+", "+ret.a+")"},hsl:function(v){var ret;v==null&&(v=this);ret=parse.all(v);if(ret.r!=null){return conv.rgb2hsl(ret)}else{return ret}},hex:function(v,compact){var ref$,ret;v==null&&(v=this);compact==null&&(compact=false);if(v!=null&&typeof v==="boolean"){ref$=[this,v],v=ref$[0],compact=ref$[1]}ret=utils.rgb(v);ret=["r","g","b"].map(function(it){var v,ref$;v=((ref$=Math.round(ret[it]))<255?ref$:255).toString(16)+"";return v=repeatString$("0",2-v.length)+v}).join("");if(compact&&ret[0]===ret[1]&&ret[2]===ret[3]&&ret[4]===ret[5]){ret=ret[0]+ret[2]+ret[4]}return"#"+ret},lab:function(v){var ref$,r,g,b,a,y,x,z;v==null&&(v=this);if(v.c){return conv.hcl2lab(v)}ref$=utils.rgb(v),r=ref$.r,g=ref$.g,b=ref$.b,a=ref$.a;r=conv._rgb2lrgb(r);g=conv._rgb2lrgb(g);b=conv._rgb2lrgb(b);y=conv._xyz2lab((.2225045*r+.7168786*g+.0606169*b)/Yn);if(r===g&&g===b){x=z=y}else{x=conv._xyz2lab((.4360747*r+.3850649*g+.1430804*b)/Xn);z=conv._xyz2lab((.0139322*r+.0971045*g+.7141733*b)/Zn)}return{"@l":116*y-16,"@a":500*(x-y),"@b":200*(y-z),a:a}},hcl:function(v){v==null&&(v=this);return conv.lab2hcl(utils.lab(v))},int:function(v){v==null&&(v=this);v=utils.rgb(v);return(Math.round(v.r)<<16)+(Math.round(v.g)<<8)+Math.round(v.b)},rand:function(){return{h:Math.random()*360,s:Math.random(),l:Math.random(),a:1}},lighter:function(v,k){var hsl;v==null&&(v=this);k==null&&(k=1);hsl=utils.hsl(v);hsl.l*=Math.pow(1/.7,k);return hsl},darker:function(v,k){var hsl;v==null&&(v=this);k==null&&(k=1);hsl=utils.hsl(v);hsl.l*=Math.pow(.7,k);return hsl}};import$(ldcolor,utils);ldcolor.prototype=import$(Object.create(Object.prototype),utils);for(k in utils){v=utils[k];fn$(k,v)}if(typeof module!="undefined"&&module!==null){module.exports=ldcolor}else{window.ldColor=window.ldcolor=ldcolor}function import$(obj,src){var own={}.hasOwnProperty;for(var key in src)if(own.call(src,key))obj[key]=src[key];return obj}function repeatString$(str,n){for(var r="";n>0;(n>>=1)&&(str+=str))if(n&1)r+=str;return r}function fn$(k,v){return ldcolor.prototype[k]=function(){return v(this)}}}).call(this); +(function(){var ReI,ReN,ReP,re,parse,ldcolor,t0,t1,t2,t3,Xn,Yn,Zn,conv,utils,k,v;ReI="\\s*([+-]?\\d+|nan|NaN)\\s*";ReN="\\s*([+-]?\\d*\\.?\\d+(?:[eE][+-]?\\d+)?|nan|NaN)\\s*";ReP="\\s*([+-]?\\d*\\.?\\d+(?:[eE][+-]?\\d+)?)%\\s*";re={hex3:/^#([0-9a-fA-F]{3})$/,hex6:/^#([0-9a-fA-F]{6})$/,rgbint:new RegExp("^rgb\\("+[ReI,ReI,ReI]+"\\)$"),rgbp:new RegExp("^rgb\\("+[ReP,ReP,ReP]+"\\)$"),rgbaint:new RegExp("^rgba\\("+[ReI,ReI,ReI,ReN]+"\\)$"),rgbap:new RegExp("^rgba\\("+[ReP,ReP,ReP,ReN]+"\\)$"),hslp:new RegExp("^hsl\\("+[ReN,ReP,ReP]+"\\)$"),hslap:new RegExp("^hsla\\("+[ReN,ReP,ReP,ReN]+"\\)$")};parse={hex3:function(v){v=parseInt(v[1],16);return{r:(v>>8)*17,g:(v&240)*17>>4,b:(v&15)*17,a:1}},hex6:function(v){v=parseInt(v[1],16);return{r:v>>16,g:v>>8&255,b:v&255,a:1}},rgbint:function(v){return{r:+v[1],g:+v[2],b:+v[3],a:1}},rgbp:function(v){return{r:v[1]*255/100,g:+v[2]*255/100,b:+v[3]*255/100,a:1}},rgbaint:function(v){return{r:+v[1],g:+v[2],b:+v[3],a:+v[4]}},rgbap:function(v){return{r:v[1]*255/100,g:+v[2]*255/100,b:v[3]*255/100,a:+v[4]}},hslap:function(v){return{h:+v[1],s:v[2]/100,l:v[3]/100,a:+v[4]}},hslp:function(v){return{h:+v[1],s:v[2]/100,l:v[3]/100,a:1}},all:function(o){var that,ref$,k,v;if(typeof o==="object"){if(!(o.a!=null)){o.a=1}return o["@a"]?o=conv.lab2rgb(o):o["c"]?o=conv.hcl2rgb(o):o.hex?(that=re.hex3.exec(o.hex))?(ref$=parse.hex3(that)||{},ref$.a=o.a,ref$):(that=re.hex6.exec(o.hex))?(ref$=parse.hex6(that),ref$.a=o.a,ref$):o:o.value?parse.all(o.value):o}else if(typeof o==="number"){return conv.num2rgb(o)}o=(o+"").trim().toLowerCase();for(k in ref$=re){v=ref$[k];if(that=v.exec(o)){return parse[k](that)}else{continue}}if(typeof named!="undefined"&&named!==null&&named[o]){return conv.num2rgb(named[o])}if(o==="transparent"){return{r:NaN,g:NaN,b:NaN,a:0}}return{r:NaN,g:NaN,b:NaN,a:NaN}}};ldcolor=function(v){return import$(this,parse.all(v))};t0=4/29;t1=6/29;t2=3*t1*t1;t3=t1*t1*t1;Xn=.96422;Yn=1;Zn=.82521;conv={num2rgb:function(v){return{r:v>>16,g:v>>8&255,b:v&255,a:1}},_hsl2rgb:function(h,m1,m2){return(h<60?m1+(m2-m1)*h/60:h<180?m2:h<240?m1+(m2-m1)*(240-h)/60:m1)*255},hsl2rgb:function(arg$){var h,s,l,a,m2,m1,ref$;h=arg$.h,s=arg$.s,l=arg$.l,a=arg$.a;h=h%360+(h<0)*360;s=isNaN(h)||isNaN(s)?0:s;m2=l+(l<.5?l:1-l)*s;m1=2*l-m2;return{r:(ref$=this._hsl2rgb(h>=240?h-240:h+120,m1,m2))>0?ref$:0,g:(ref$=this._hsl2rgb(h,m1,m2))>0?ref$:0,b:(ref$=this._hsl2rgb(h<120?h+240:h-120,m1,m2))>0?ref$:0,a:a}},rgb2hsl:function(arg$){var r,g,b,a,ref$,Cmax,Cmin,delta,l,h,s;r=arg$.r,g=arg$.g,b=arg$.b,a=arg$.a;ref$=[r/255,g/255,b/255],r=ref$[0],g=ref$[1],b=ref$[2];Cmax=Math.max(r,g,b);Cmin=Math.min(r,g,b);delta=Cmax-Cmin;l=(Cmax+Cmin)/2;if(delta===0){ref$=[0,0],h=ref$[0],s=ref$[1]}else{h=function(){switch(false){case Cmax!==r:return 60*((g-b)/delta%6);case Cmax!==g:return 60*((b-r)/delta+2);case Cmax!==b:return 60*((r-g)/delta+4)}}();s=delta/(1-Math.abs(2*l-1))}h=(h+360)%360;return{h:h,s:s,l:l,a:a}},_rgb2lrgb:function(x){if((x/=255)<=.04045){return x/12.92}else{return Math.pow((x+.055)/1.055,2.4)}},_xyz2lab:function(t){if(t>t3){return Math.pow(t,1/3)}else{return t/t2+t0}},_lab2xyz:function(t){if(t>t1){return t*t*t}else{return t2*(t-t0)}},_lrgb2rgb:function(x){var ref$,ref1$;return(ref$=(ref1$=255*(x<=.0031308?12.92*x:1.055*Math.pow(x,1/2.4)-.055))<255?ref1$:255)>0?ref$:0},lab2rgb:function(v){var ref$,l,a,b,o,y,x,z;ref$=[v["@l"],v["@a"],v["@b"],v["a"]!=null?v["a"]:1],l=ref$[0],a=ref$[1],b=ref$[2],o=ref$[3];y=(l+16)/116;x=isNaN(a)?y:y+a/500;z=isNaN(b)?y:y-b/200;x=Xn*conv._lab2xyz(x);y=Yn*conv._lab2xyz(y);z=Zn*conv._lab2xyz(z);return{r:conv._lrgb2rgb(3.1338561*x-1.6168667*y-.4906146*z),g:conv._lrgb2rgb(-.9787684*x+1.9161415*y+.033454*z),b:conv._lrgb2rgb(.0719453*x-.2289914*y+1.4052427*z),a:o}},lab2hcl:function(v){var ref$,l,a,b,o,h;ref$=[v["@l"],v["@a"],v["@b"],v["a"]!=null?v["a"]:1],l=ref$[0],a=ref$[1],b=ref$[2],o=ref$[3];if(a===0&&b===0){return{h:NaN,c:0,l:l,a:o}}h=Math.atan2(b,a)*180/Math.PI;return{h:isNaN(h)?h:h<0?h+360:h>0?h:0,c:Math.sqrt(a*a+b*b),l:isNaN(l)?l:l>0?l:0,a:o}},hcl2lab:function(v){var h;v.a=v.a!=null?v.a:1;if(isNaN(v.h)){return{"@l":v.l,"@a":0,"@b":0,a:v.a}}h=v.h*Math.PI/180;return{"@l":v.l,"@a":Math.cos(h)*v.c,"@b":Math.sin(h)*v.c,a:v.a}},hcl2rgb:function(v){return this.lab2rgb(this.hcl2lab(v))}};utils={same:function(a,b){var ref$;b==null&&(b=this);ref$=[this.rgb(a),this.rgb(b)],a=ref$[0],b=ref$[1];return a.r===b.r&&a.g===b.g&&a.b===b.b&&a.a===b.a},rgb:function(v){var ret;v==null&&(v=this);ret=parse.all(v);if(ret.c!=null){return conv.lab2rgb(conv.hcl2lab(ret))}if(ret.h!=null){return conv.hsl2rgb(ret)}else{return ret}},rgbfv:function(v){var ret;v==null&&(v=this);ret=this.rgb(v);return[ret.r/255,ret.g/255,ret.b/255]},web:function(v,compact){var ret;v==null&&(v=this);compact==null&&(compact=false);ret=utils.rgb(v);if(ret.a!=null&&(isNaN(ret.a)||!ret.a&&["r","g","b"].filter(function(it){return ret[it]!=null&&isNaN(ret[it])}))){return"transparent"}if(ret.a<1){return this.rgbaStr(ret)}else{return this.hex(ret,compact)}},rgbaStr:function(v){var ret;v==null&&(v=this);ret=utils.rgb(v);return"rgba("+Math.round(ret.r)+", "+Math.round(ret.g)+", "+Math.round(ret.b)+", "+ret.a+")"},hsl:function(v){var ret;v==null&&(v=this);ret=parse.all(v);if(ret.r!=null){return conv.rgb2hsl(ret)}else{return ret}},hex:function(v,compact){var ref$,ret;v==null&&(v=this);compact==null&&(compact=false);if(v!=null&&typeof v==="boolean"){ref$=[this,v],v=ref$[0],compact=ref$[1]}ret=utils.rgb(v);ret=["r","g","b"].map(function(it){var v,ref$;v=((ref$=Math.round(ret[it]))<255?ref$:255).toString(16)+"";return v=repeatString$("0",2-v.length)+v}).join("");if(compact&&ret[0]===ret[1]&&ret[2]===ret[3]&&ret[4]===ret[5]){ret=ret[0]+ret[2]+ret[4]}return"#"+ret},lab:function(v){var ref$,r,g,b,a,y,x,z;v==null&&(v=this);if(v.c){return conv.hcl2lab(v)}ref$=utils.rgb(v),r=ref$.r,g=ref$.g,b=ref$.b,a=ref$.a;r=conv._rgb2lrgb(r);g=conv._rgb2lrgb(g);b=conv._rgb2lrgb(b);y=conv._xyz2lab((.2225045*r+.7168786*g+.0606169*b)/Yn);if(r===g&&g===b){x=z=y}else{x=conv._xyz2lab((.4360747*r+.3850649*g+.1430804*b)/Xn);z=conv._xyz2lab((.0139322*r+.0971045*g+.7141733*b)/Zn)}return{"@l":116*y-16,"@a":500*(x-y),"@b":200*(y-z),a:a}},hcl:function(v){v==null&&(v=this);return conv.lab2hcl(utils.lab(v))},int:function(v){v==null&&(v=this);v=utils.rgb(v);return(Math.round(v.r)<<16)+(Math.round(v.g)<<8)+Math.round(v.b)},rand:function(){return{h:Math.random()*360,s:Math.random(),l:Math.random(),a:1}},complement:function(v){var rgb;rgb=utils.rgb(v);return utils.hsl({r:255-rgb.r,g:255-rgb.g,b:255-rgb.b})},lighter:function(v,k){var hsl;v==null&&(v=this);k==null&&(k=1);hsl=utils.hsl(v);hsl.l*=Math.pow(1/.7,k);return hsl},darker:function(v,k){var hsl;v==null&&(v=this);k==null&&(k=1);hsl=utils.hsl(v);hsl.l*=Math.pow(.7,k);return hsl}};import$(ldcolor,utils);ldcolor.prototype=import$(Object.create(Object.prototype),utils);for(k in utils){v=utils[k];fn$(k,v)}if(typeof module!="undefined"&&module!==null){module.exports=ldcolor}else{window.ldColor=window.ldcolor=ldcolor}function import$(obj,src){var own={}.hasOwnProperty;for(var key in src)if(own.call(src,key))obj[key]=src[key];return obj}function repeatString$(str,n){for(var r="";n>0;(n>>=1)&&(str+=str))if(n&1)r+=str;return r}function fn$(k,v){return ldcolor.prototype[k]=function(){return v(this)}}}).call(this); diff --git a/dist/ldcolor.named.js b/dist/ldcolor.named.js index 5d43f50..901e98b 100644 --- a/dist/ldcolor.named.js +++ b/dist/ldcolor.named.js @@ -565,6 +565,15 @@ a: 1 }; }, + complement: function(v){ + var rgb; + rgb = utils.rgb(v); + return utils.hsl({ + r: 255 - rgb.r, + g: 255 - rgb.g, + b: 255 - rgb.b + }); + }, lighter: function(v, k){ var hsl; v == null && (v = this); diff --git a/dist/ldcolor.named.min.js b/dist/ldcolor.named.min.js index 36bff2e..0143487 100644 --- a/dist/ldcolor.named.min.js +++ b/dist/ldcolor.named.min.js @@ -1 +1 @@ -(function(){var named,ReI,ReN,ReP,re,parse,ldcolor,t0,t1,t2,t3,Xn,Yn,Zn,conv,utils,k,v;named={aliceblue:15792383,antiquewhite:16444375,aqua:65535,aquamarine:8388564,azure:15794175,beige:16119260,bisque:16770244,black:0,blanchedalmond:16772045,blue:255,blueviolet:9055202,brown:10824234,burlywood:14596231,cadetblue:6266528,chartreuse:8388352,chocolate:13789470,coral:16744272,cornflowerblue:6591981,cornsilk:16775388,crimson:14423100,cyan:65535,darkblue:139,darkcyan:35723,darkgoldenrod:12092939,darkgray:11119017,darkgreen:25600,darkgrey:11119017,darkkhaki:12433259,darkmagenta:9109643,darkolivegreen:5597999,darkorange:16747520,darkorchid:10040012,darkred:9109504,darksalmon:15308410,darkseagreen:9419919,darkslateblue:4734347,darkslategray:3100495,darkslategrey:3100495,darkturquoise:52945,darkviolet:9699539,deeppink:16716947,deepskyblue:49151,dimgray:6908265,dimgrey:6908265,dodgerblue:2003199,firebrick:11674146,floralwhite:16775920,forestgreen:2263842,fuchsia:16711935,gainsboro:14474460,ghostwhite:16316671,gold:16766720,goldenrod:14329120,gray:8421504,green:32768,greenyellow:11403055,grey:8421504,honeydew:15794160,hotpink:16738740,indianred:13458524,indigo:4915330,ivory:16777200,khaki:15787660,lavender:15132410,lavenderblush:16773365,lawngreen:8190976,lemonchiffon:16775885,lightblue:11393254,lightcoral:15761536,lightcyan:14745599,lightgoldenrodyellow:16448210,lightgray:13882323,lightgreen:9498256,lightgrey:13882323,lightpink:16758465,lightsalmon:16752762,lightseagreen:2142890,lightskyblue:8900346,lightslategray:7833753,lightslategrey:7833753,lightsteelblue:11584734,lightyellow:16777184,lime:65280,limegreen:3329330,linen:16445670,magenta:16711935,maroon:8388608,mediumaquamarine:6737322,mediumblue:205,mediumorchid:12211667,mediumpurple:9662683,mediumseagreen:3978097,mediumslateblue:8087790,mediumspringgreen:64154,mediumturquoise:4772300,mediumvioletred:13047173,midnightblue:1644912,mintcream:16121850,mistyrose:16770273,moccasin:16770229,navajowhite:16768685,navy:128,oldlace:16643558,olive:8421376,olivedrab:7048739,orange:16753920,orangered:16729344,orchid:14315734,palegoldenrod:15657130,palegreen:10025880,paleturquoise:11529966,palevioletred:14381203,papayawhip:16773077,peachpuff:16767673,peru:13468991,pink:16761035,plum:14524637,powderblue:11591910,purple:8388736,rebeccapurple:6697881,red:16711680,rosybrown:12357519,royalblue:4286945,saddlebrown:9127187,salmon:16416882,sandybrown:16032864,seagreen:3050327,seashell:16774638,sienna:10506797,silver:12632256,skyblue:8900331,slateblue:6970061,slategray:7372944,slategrey:7372944,snow:16775930,springgreen:65407,steelblue:4620980,tan:13808780,teal:32896,thistle:14204888,tomato:16737095,turquoise:4251856,violet:15631086,wheat:16113331,white:16777215,whitesmoke:16119285,yellow:16776960,yellowgreen:10145074};ReI="\\s*([+-]?\\d+|nan|NaN)\\s*";ReN="\\s*([+-]?\\d*\\.?\\d+(?:[eE][+-]?\\d+)?|nan|NaN)\\s*";ReP="\\s*([+-]?\\d*\\.?\\d+(?:[eE][+-]?\\d+)?)%\\s*";re={hex3:/^#([0-9a-fA-F]{3})$/,hex6:/^#([0-9a-fA-F]{6})$/,rgbint:new RegExp("^rgb\\("+[ReI,ReI,ReI]+"\\)$"),rgbp:new RegExp("^rgb\\("+[ReP,ReP,ReP]+"\\)$"),rgbaint:new RegExp("^rgba\\("+[ReI,ReI,ReI,ReN]+"\\)$"),rgbap:new RegExp("^rgba\\("+[ReP,ReP,ReP,ReN]+"\\)$"),hslp:new RegExp("^hsl\\("+[ReN,ReP,ReP]+"\\)$"),hslap:new RegExp("^hsla\\("+[ReN,ReP,ReP,ReN]+"\\)$")};parse={hex3:function(v){v=parseInt(v[1],16);return{r:(v>>8)*17,g:(v&240)*17>>4,b:(v&15)*17,a:1}},hex6:function(v){v=parseInt(v[1],16);return{r:v>>16,g:v>>8&255,b:v&255,a:1}},rgbint:function(v){return{r:+v[1],g:+v[2],b:+v[3],a:1}},rgbp:function(v){return{r:v[1]*255/100,g:+v[2]*255/100,b:+v[3]*255/100,a:1}},rgbaint:function(v){return{r:+v[1],g:+v[2],b:+v[3],a:+v[4]}},rgbap:function(v){return{r:v[1]*255/100,g:+v[2]*255/100,b:v[3]*255/100,a:+v[4]}},hslap:function(v){return{h:+v[1],s:v[2]/100,l:v[3]/100,a:+v[4]}},hslp:function(v){return{h:+v[1],s:v[2]/100,l:v[3]/100,a:1}},all:function(o){var that,ref$,k,v;if(typeof o==="object"){if(!(o.a!=null)){o.a=1}return o["@a"]?o=conv.lab2rgb(o):o["c"]?o=conv.hcl2rgb(o):o.hex?(that=re.hex3.exec(o.hex))?(ref$=parse.hex3(that)||{},ref$.a=o.a,ref$):(that=re.hex6.exec(o.hex))?(ref$=parse.hex6(that),ref$.a=o.a,ref$):o:o.value?parse.all(o.value):o}else if(typeof o==="number"){return conv.num2rgb(o)}o=(o+"").trim().toLowerCase();for(k in ref$=re){v=ref$[k];if(that=v.exec(o)){return parse[k](that)}else{continue}}if(named!=null&&named[o]){return conv.num2rgb(named[o])}if(o==="transparent"){return{r:NaN,g:NaN,b:NaN,a:0}}return{r:NaN,g:NaN,b:NaN,a:NaN}}};ldcolor=function(v){return import$(this,parse.all(v))};t0=4/29;t1=6/29;t2=3*t1*t1;t3=t1*t1*t1;Xn=.96422;Yn=1;Zn=.82521;conv={num2rgb:function(v){return{r:v>>16,g:v>>8&255,b:v&255,a:1}},_hsl2rgb:function(h,m1,m2){return(h<60?m1+(m2-m1)*h/60:h<180?m2:h<240?m1+(m2-m1)*(240-h)/60:m1)*255},hsl2rgb:function(arg$){var h,s,l,a,m2,m1,ref$;h=arg$.h,s=arg$.s,l=arg$.l,a=arg$.a;h=h%360+(h<0)*360;s=isNaN(h)||isNaN(s)?0:s;m2=l+(l<.5?l:1-l)*s;m1=2*l-m2;return{r:(ref$=this._hsl2rgb(h>=240?h-240:h+120,m1,m2))>0?ref$:0,g:(ref$=this._hsl2rgb(h,m1,m2))>0?ref$:0,b:(ref$=this._hsl2rgb(h<120?h+240:h-120,m1,m2))>0?ref$:0,a:a}},rgb2hsl:function(arg$){var r,g,b,a,ref$,Cmax,Cmin,delta,l,h,s;r=arg$.r,g=arg$.g,b=arg$.b,a=arg$.a;ref$=[r/255,g/255,b/255],r=ref$[0],g=ref$[1],b=ref$[2];Cmax=Math.max(r,g,b);Cmin=Math.min(r,g,b);delta=Cmax-Cmin;l=(Cmax+Cmin)/2;if(delta===0){ref$=[0,0],h=ref$[0],s=ref$[1]}else{h=function(){switch(false){case Cmax!==r:return 60*((g-b)/delta%6);case Cmax!==g:return 60*((b-r)/delta+2);case Cmax!==b:return 60*((r-g)/delta+4)}}();s=delta/(1-Math.abs(2*l-1))}h=(h+360)%360;return{h:h,s:s,l:l,a:a}},_rgb2lrgb:function(x){if((x/=255)<=.04045){return x/12.92}else{return Math.pow((x+.055)/1.055,2.4)}},_xyz2lab:function(t){if(t>t3){return Math.pow(t,1/3)}else{return t/t2+t0}},_lab2xyz:function(t){if(t>t1){return t*t*t}else{return t2*(t-t0)}},_lrgb2rgb:function(x){var ref$,ref1$;return(ref$=(ref1$=255*(x<=.0031308?12.92*x:1.055*Math.pow(x,1/2.4)-.055))<255?ref1$:255)>0?ref$:0},lab2rgb:function(v){var ref$,l,a,b,o,y,x,z;ref$=[v["@l"],v["@a"],v["@b"],v["a"]!=null?v["a"]:1],l=ref$[0],a=ref$[1],b=ref$[2],o=ref$[3];y=(l+16)/116;x=isNaN(a)?y:y+a/500;z=isNaN(b)?y:y-b/200;x=Xn*conv._lab2xyz(x);y=Yn*conv._lab2xyz(y);z=Zn*conv._lab2xyz(z);return{r:conv._lrgb2rgb(3.1338561*x-1.6168667*y-.4906146*z),g:conv._lrgb2rgb(-.9787684*x+1.9161415*y+.033454*z),b:conv._lrgb2rgb(.0719453*x-.2289914*y+1.4052427*z),a:o}},lab2hcl:function(v){var ref$,l,a,b,o,h;ref$=[v["@l"],v["@a"],v["@b"],v["a"]!=null?v["a"]:1],l=ref$[0],a=ref$[1],b=ref$[2],o=ref$[3];if(a===0&&b===0){return{h:NaN,c:0,l:l,a:o}}h=Math.atan2(b,a)*180/Math.PI;return{h:isNaN(h)?h:h<0?h+360:h>0?h:0,c:Math.sqrt(a*a+b*b),l:isNaN(l)?l:l>0?l:0,a:o}},hcl2lab:function(v){var h;v.a=v.a!=null?v.a:1;if(isNaN(v.h)){return{"@l":v.l,"@a":0,"@b":0,a:v.a}}h=v.h*Math.PI/180;return{"@l":v.l,"@a":Math.cos(h)*v.c,"@b":Math.sin(h)*v.c,a:v.a}},hcl2rgb:function(v){return this.lab2rgb(this.hcl2lab(v))}};utils={same:function(a,b){var ref$;b==null&&(b=this);ref$=[this.rgb(a),this.rgb(b)],a=ref$[0],b=ref$[1];return a.r===b.r&&a.g===b.g&&a.b===b.b&&a.a===b.a},rgb:function(v){var ret;v==null&&(v=this);ret=parse.all(v);if(ret.c!=null){return conv.lab2rgb(conv.hcl2lab(ret))}if(ret.h!=null){return conv.hsl2rgb(ret)}else{return ret}},rgbfv:function(v){var ret;v==null&&(v=this);ret=this.rgb(v);return[ret.r/255,ret.g/255,ret.b/255]},web:function(v,compact){var ret;v==null&&(v=this);compact==null&&(compact=false);ret=utils.rgb(v);if(ret.a!=null&&(isNaN(ret.a)||!ret.a&&["r","g","b"].filter(function(it){return ret[it]!=null&&isNaN(ret[it])}))){return"transparent"}if(ret.a<1){return this.rgbaStr(ret)}else{return this.hex(ret,compact)}},rgbaStr:function(v){var ret;v==null&&(v=this);ret=utils.rgb(v);return"rgba("+Math.round(ret.r)+", "+Math.round(ret.g)+", "+Math.round(ret.b)+", "+ret.a+")"},hsl:function(v){var ret;v==null&&(v=this);ret=parse.all(v);if(ret.r!=null){return conv.rgb2hsl(ret)}else{return ret}},hex:function(v,compact){var ref$,ret;v==null&&(v=this);compact==null&&(compact=false);if(v!=null&&typeof v==="boolean"){ref$=[this,v],v=ref$[0],compact=ref$[1]}ret=utils.rgb(v);ret=["r","g","b"].map(function(it){var v,ref$;v=((ref$=Math.round(ret[it]))<255?ref$:255).toString(16)+"";return v=repeatString$("0",2-v.length)+v}).join("");if(compact&&ret[0]===ret[1]&&ret[2]===ret[3]&&ret[4]===ret[5]){ret=ret[0]+ret[2]+ret[4]}return"#"+ret},lab:function(v){var ref$,r,g,b,a,y,x,z;v==null&&(v=this);if(v.c){return conv.hcl2lab(v)}ref$=utils.rgb(v),r=ref$.r,g=ref$.g,b=ref$.b,a=ref$.a;r=conv._rgb2lrgb(r);g=conv._rgb2lrgb(g);b=conv._rgb2lrgb(b);y=conv._xyz2lab((.2225045*r+.7168786*g+.0606169*b)/Yn);if(r===g&&g===b){x=z=y}else{x=conv._xyz2lab((.4360747*r+.3850649*g+.1430804*b)/Xn);z=conv._xyz2lab((.0139322*r+.0971045*g+.7141733*b)/Zn)}return{"@l":116*y-16,"@a":500*(x-y),"@b":200*(y-z),a:a}},hcl:function(v){v==null&&(v=this);return conv.lab2hcl(utils.lab(v))},int:function(v){v==null&&(v=this);v=utils.rgb(v);return(Math.round(v.r)<<16)+(Math.round(v.g)<<8)+Math.round(v.b)},rand:function(){return{h:Math.random()*360,s:Math.random(),l:Math.random(),a:1}},lighter:function(v,k){var hsl;v==null&&(v=this);k==null&&(k=1);hsl=utils.hsl(v);hsl.l*=Math.pow(1/.7,k);return hsl},darker:function(v,k){var hsl;v==null&&(v=this);k==null&&(k=1);hsl=utils.hsl(v);hsl.l*=Math.pow(.7,k);return hsl}};import$(ldcolor,utils);ldcolor.prototype=import$(Object.create(Object.prototype),utils);for(k in utils){v=utils[k];fn$(k,v)}if(typeof module!="undefined"&&module!==null){module.exports=ldcolor}else{window.ldColor=window.ldcolor=ldcolor}function import$(obj,src){var own={}.hasOwnProperty;for(var key in src)if(own.call(src,key))obj[key]=src[key];return obj}function repeatString$(str,n){for(var r="";n>0;(n>>=1)&&(str+=str))if(n&1)r+=str;return r}function fn$(k,v){return ldcolor.prototype[k]=function(){return v(this)}}}).call(this); +(function(){var named,ReI,ReN,ReP,re,parse,ldcolor,t0,t1,t2,t3,Xn,Yn,Zn,conv,utils,k,v;named={aliceblue:15792383,antiquewhite:16444375,aqua:65535,aquamarine:8388564,azure:15794175,beige:16119260,bisque:16770244,black:0,blanchedalmond:16772045,blue:255,blueviolet:9055202,brown:10824234,burlywood:14596231,cadetblue:6266528,chartreuse:8388352,chocolate:13789470,coral:16744272,cornflowerblue:6591981,cornsilk:16775388,crimson:14423100,cyan:65535,darkblue:139,darkcyan:35723,darkgoldenrod:12092939,darkgray:11119017,darkgreen:25600,darkgrey:11119017,darkkhaki:12433259,darkmagenta:9109643,darkolivegreen:5597999,darkorange:16747520,darkorchid:10040012,darkred:9109504,darksalmon:15308410,darkseagreen:9419919,darkslateblue:4734347,darkslategray:3100495,darkslategrey:3100495,darkturquoise:52945,darkviolet:9699539,deeppink:16716947,deepskyblue:49151,dimgray:6908265,dimgrey:6908265,dodgerblue:2003199,firebrick:11674146,floralwhite:16775920,forestgreen:2263842,fuchsia:16711935,gainsboro:14474460,ghostwhite:16316671,gold:16766720,goldenrod:14329120,gray:8421504,green:32768,greenyellow:11403055,grey:8421504,honeydew:15794160,hotpink:16738740,indianred:13458524,indigo:4915330,ivory:16777200,khaki:15787660,lavender:15132410,lavenderblush:16773365,lawngreen:8190976,lemonchiffon:16775885,lightblue:11393254,lightcoral:15761536,lightcyan:14745599,lightgoldenrodyellow:16448210,lightgray:13882323,lightgreen:9498256,lightgrey:13882323,lightpink:16758465,lightsalmon:16752762,lightseagreen:2142890,lightskyblue:8900346,lightslategray:7833753,lightslategrey:7833753,lightsteelblue:11584734,lightyellow:16777184,lime:65280,limegreen:3329330,linen:16445670,magenta:16711935,maroon:8388608,mediumaquamarine:6737322,mediumblue:205,mediumorchid:12211667,mediumpurple:9662683,mediumseagreen:3978097,mediumslateblue:8087790,mediumspringgreen:64154,mediumturquoise:4772300,mediumvioletred:13047173,midnightblue:1644912,mintcream:16121850,mistyrose:16770273,moccasin:16770229,navajowhite:16768685,navy:128,oldlace:16643558,olive:8421376,olivedrab:7048739,orange:16753920,orangered:16729344,orchid:14315734,palegoldenrod:15657130,palegreen:10025880,paleturquoise:11529966,palevioletred:14381203,papayawhip:16773077,peachpuff:16767673,peru:13468991,pink:16761035,plum:14524637,powderblue:11591910,purple:8388736,rebeccapurple:6697881,red:16711680,rosybrown:12357519,royalblue:4286945,saddlebrown:9127187,salmon:16416882,sandybrown:16032864,seagreen:3050327,seashell:16774638,sienna:10506797,silver:12632256,skyblue:8900331,slateblue:6970061,slategray:7372944,slategrey:7372944,snow:16775930,springgreen:65407,steelblue:4620980,tan:13808780,teal:32896,thistle:14204888,tomato:16737095,turquoise:4251856,violet:15631086,wheat:16113331,white:16777215,whitesmoke:16119285,yellow:16776960,yellowgreen:10145074};ReI="\\s*([+-]?\\d+|nan|NaN)\\s*";ReN="\\s*([+-]?\\d*\\.?\\d+(?:[eE][+-]?\\d+)?|nan|NaN)\\s*";ReP="\\s*([+-]?\\d*\\.?\\d+(?:[eE][+-]?\\d+)?)%\\s*";re={hex3:/^#([0-9a-fA-F]{3})$/,hex6:/^#([0-9a-fA-F]{6})$/,rgbint:new RegExp("^rgb\\("+[ReI,ReI,ReI]+"\\)$"),rgbp:new RegExp("^rgb\\("+[ReP,ReP,ReP]+"\\)$"),rgbaint:new RegExp("^rgba\\("+[ReI,ReI,ReI,ReN]+"\\)$"),rgbap:new RegExp("^rgba\\("+[ReP,ReP,ReP,ReN]+"\\)$"),hslp:new RegExp("^hsl\\("+[ReN,ReP,ReP]+"\\)$"),hslap:new RegExp("^hsla\\("+[ReN,ReP,ReP,ReN]+"\\)$")};parse={hex3:function(v){v=parseInt(v[1],16);return{r:(v>>8)*17,g:(v&240)*17>>4,b:(v&15)*17,a:1}},hex6:function(v){v=parseInt(v[1],16);return{r:v>>16,g:v>>8&255,b:v&255,a:1}},rgbint:function(v){return{r:+v[1],g:+v[2],b:+v[3],a:1}},rgbp:function(v){return{r:v[1]*255/100,g:+v[2]*255/100,b:+v[3]*255/100,a:1}},rgbaint:function(v){return{r:+v[1],g:+v[2],b:+v[3],a:+v[4]}},rgbap:function(v){return{r:v[1]*255/100,g:+v[2]*255/100,b:v[3]*255/100,a:+v[4]}},hslap:function(v){return{h:+v[1],s:v[2]/100,l:v[3]/100,a:+v[4]}},hslp:function(v){return{h:+v[1],s:v[2]/100,l:v[3]/100,a:1}},all:function(o){var that,ref$,k,v;if(typeof o==="object"){if(!(o.a!=null)){o.a=1}return o["@a"]?o=conv.lab2rgb(o):o["c"]?o=conv.hcl2rgb(o):o.hex?(that=re.hex3.exec(o.hex))?(ref$=parse.hex3(that)||{},ref$.a=o.a,ref$):(that=re.hex6.exec(o.hex))?(ref$=parse.hex6(that),ref$.a=o.a,ref$):o:o.value?parse.all(o.value):o}else if(typeof o==="number"){return conv.num2rgb(o)}o=(o+"").trim().toLowerCase();for(k in ref$=re){v=ref$[k];if(that=v.exec(o)){return parse[k](that)}else{continue}}if(named!=null&&named[o]){return conv.num2rgb(named[o])}if(o==="transparent"){return{r:NaN,g:NaN,b:NaN,a:0}}return{r:NaN,g:NaN,b:NaN,a:NaN}}};ldcolor=function(v){return import$(this,parse.all(v))};t0=4/29;t1=6/29;t2=3*t1*t1;t3=t1*t1*t1;Xn=.96422;Yn=1;Zn=.82521;conv={num2rgb:function(v){return{r:v>>16,g:v>>8&255,b:v&255,a:1}},_hsl2rgb:function(h,m1,m2){return(h<60?m1+(m2-m1)*h/60:h<180?m2:h<240?m1+(m2-m1)*(240-h)/60:m1)*255},hsl2rgb:function(arg$){var h,s,l,a,m2,m1,ref$;h=arg$.h,s=arg$.s,l=arg$.l,a=arg$.a;h=h%360+(h<0)*360;s=isNaN(h)||isNaN(s)?0:s;m2=l+(l<.5?l:1-l)*s;m1=2*l-m2;return{r:(ref$=this._hsl2rgb(h>=240?h-240:h+120,m1,m2))>0?ref$:0,g:(ref$=this._hsl2rgb(h,m1,m2))>0?ref$:0,b:(ref$=this._hsl2rgb(h<120?h+240:h-120,m1,m2))>0?ref$:0,a:a}},rgb2hsl:function(arg$){var r,g,b,a,ref$,Cmax,Cmin,delta,l,h,s;r=arg$.r,g=arg$.g,b=arg$.b,a=arg$.a;ref$=[r/255,g/255,b/255],r=ref$[0],g=ref$[1],b=ref$[2];Cmax=Math.max(r,g,b);Cmin=Math.min(r,g,b);delta=Cmax-Cmin;l=(Cmax+Cmin)/2;if(delta===0){ref$=[0,0],h=ref$[0],s=ref$[1]}else{h=function(){switch(false){case Cmax!==r:return 60*((g-b)/delta%6);case Cmax!==g:return 60*((b-r)/delta+2);case Cmax!==b:return 60*((r-g)/delta+4)}}();s=delta/(1-Math.abs(2*l-1))}h=(h+360)%360;return{h:h,s:s,l:l,a:a}},_rgb2lrgb:function(x){if((x/=255)<=.04045){return x/12.92}else{return Math.pow((x+.055)/1.055,2.4)}},_xyz2lab:function(t){if(t>t3){return Math.pow(t,1/3)}else{return t/t2+t0}},_lab2xyz:function(t){if(t>t1){return t*t*t}else{return t2*(t-t0)}},_lrgb2rgb:function(x){var ref$,ref1$;return(ref$=(ref1$=255*(x<=.0031308?12.92*x:1.055*Math.pow(x,1/2.4)-.055))<255?ref1$:255)>0?ref$:0},lab2rgb:function(v){var ref$,l,a,b,o,y,x,z;ref$=[v["@l"],v["@a"],v["@b"],v["a"]!=null?v["a"]:1],l=ref$[0],a=ref$[1],b=ref$[2],o=ref$[3];y=(l+16)/116;x=isNaN(a)?y:y+a/500;z=isNaN(b)?y:y-b/200;x=Xn*conv._lab2xyz(x);y=Yn*conv._lab2xyz(y);z=Zn*conv._lab2xyz(z);return{r:conv._lrgb2rgb(3.1338561*x-1.6168667*y-.4906146*z),g:conv._lrgb2rgb(-.9787684*x+1.9161415*y+.033454*z),b:conv._lrgb2rgb(.0719453*x-.2289914*y+1.4052427*z),a:o}},lab2hcl:function(v){var ref$,l,a,b,o,h;ref$=[v["@l"],v["@a"],v["@b"],v["a"]!=null?v["a"]:1],l=ref$[0],a=ref$[1],b=ref$[2],o=ref$[3];if(a===0&&b===0){return{h:NaN,c:0,l:l,a:o}}h=Math.atan2(b,a)*180/Math.PI;return{h:isNaN(h)?h:h<0?h+360:h>0?h:0,c:Math.sqrt(a*a+b*b),l:isNaN(l)?l:l>0?l:0,a:o}},hcl2lab:function(v){var h;v.a=v.a!=null?v.a:1;if(isNaN(v.h)){return{"@l":v.l,"@a":0,"@b":0,a:v.a}}h=v.h*Math.PI/180;return{"@l":v.l,"@a":Math.cos(h)*v.c,"@b":Math.sin(h)*v.c,a:v.a}},hcl2rgb:function(v){return this.lab2rgb(this.hcl2lab(v))}};utils={same:function(a,b){var ref$;b==null&&(b=this);ref$=[this.rgb(a),this.rgb(b)],a=ref$[0],b=ref$[1];return a.r===b.r&&a.g===b.g&&a.b===b.b&&a.a===b.a},rgb:function(v){var ret;v==null&&(v=this);ret=parse.all(v);if(ret.c!=null){return conv.lab2rgb(conv.hcl2lab(ret))}if(ret.h!=null){return conv.hsl2rgb(ret)}else{return ret}},rgbfv:function(v){var ret;v==null&&(v=this);ret=this.rgb(v);return[ret.r/255,ret.g/255,ret.b/255]},web:function(v,compact){var ret;v==null&&(v=this);compact==null&&(compact=false);ret=utils.rgb(v);if(ret.a!=null&&(isNaN(ret.a)||!ret.a&&["r","g","b"].filter(function(it){return ret[it]!=null&&isNaN(ret[it])}))){return"transparent"}if(ret.a<1){return this.rgbaStr(ret)}else{return this.hex(ret,compact)}},rgbaStr:function(v){var ret;v==null&&(v=this);ret=utils.rgb(v);return"rgba("+Math.round(ret.r)+", "+Math.round(ret.g)+", "+Math.round(ret.b)+", "+ret.a+")"},hsl:function(v){var ret;v==null&&(v=this);ret=parse.all(v);if(ret.r!=null){return conv.rgb2hsl(ret)}else{return ret}},hex:function(v,compact){var ref$,ret;v==null&&(v=this);compact==null&&(compact=false);if(v!=null&&typeof v==="boolean"){ref$=[this,v],v=ref$[0],compact=ref$[1]}ret=utils.rgb(v);ret=["r","g","b"].map(function(it){var v,ref$;v=((ref$=Math.round(ret[it]))<255?ref$:255).toString(16)+"";return v=repeatString$("0",2-v.length)+v}).join("");if(compact&&ret[0]===ret[1]&&ret[2]===ret[3]&&ret[4]===ret[5]){ret=ret[0]+ret[2]+ret[4]}return"#"+ret},lab:function(v){var ref$,r,g,b,a,y,x,z;v==null&&(v=this);if(v.c){return conv.hcl2lab(v)}ref$=utils.rgb(v),r=ref$.r,g=ref$.g,b=ref$.b,a=ref$.a;r=conv._rgb2lrgb(r);g=conv._rgb2lrgb(g);b=conv._rgb2lrgb(b);y=conv._xyz2lab((.2225045*r+.7168786*g+.0606169*b)/Yn);if(r===g&&g===b){x=z=y}else{x=conv._xyz2lab((.4360747*r+.3850649*g+.1430804*b)/Xn);z=conv._xyz2lab((.0139322*r+.0971045*g+.7141733*b)/Zn)}return{"@l":116*y-16,"@a":500*(x-y),"@b":200*(y-z),a:a}},hcl:function(v){v==null&&(v=this);return conv.lab2hcl(utils.lab(v))},int:function(v){v==null&&(v=this);v=utils.rgb(v);return(Math.round(v.r)<<16)+(Math.round(v.g)<<8)+Math.round(v.b)},rand:function(){return{h:Math.random()*360,s:Math.random(),l:Math.random(),a:1}},complement:function(v){var rgb;rgb=utils.rgb(v);return utils.hsl({r:255-rgb.r,g:255-rgb.g,b:255-rgb.b})},lighter:function(v,k){var hsl;v==null&&(v=this);k==null&&(k=1);hsl=utils.hsl(v);hsl.l*=Math.pow(1/.7,k);return hsl},darker:function(v,k){var hsl;v==null&&(v=this);k==null&&(k=1);hsl=utils.hsl(v);hsl.l*=Math.pow(.7,k);return hsl}};import$(ldcolor,utils);ldcolor.prototype=import$(Object.create(Object.prototype),utils);for(k in utils){v=utils[k];fn$(k,v)}if(typeof module!="undefined"&&module!==null){module.exports=ldcolor}else{window.ldColor=window.ldcolor=ldcolor}function import$(obj,src){var own={}.hasOwnProperty;for(var key in src)if(own.call(src,key))obj[key]=src[key];return obj}function repeatString$(str,n){for(var r="";n>0;(n>>=1)&&(str+=str))if(n&1)r+=str;return r}function fn$(k,v){return ldcolor.prototype[k]=function(){return v(this)}}}).call(this); diff --git a/package-lock.json b/package-lock.json index 1381f0e..3e2391c 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,12 +1,12 @@ { "name": "ldcolor", - "version": "0.0.3", + "version": "0.0.4", "lockfileVersion": 2, "requires": true, "packages": { "": { "name": "ldcolor", - "version": "0.0.3", + "version": "0.0.4", "license": "MIT", "dependencies": { "livescript": "^1.6.0", diff --git a/package.json b/package.json index 6edd324..3716212 100644 --- a/package.json +++ b/package.json @@ -7,7 +7,7 @@ "dist/**/*" ], "description": "tiny js color library", - "version": "0.0.3", + "version": "0.0.4", "homepage": "https://github.com/loadingio/ldColor", "repository": { "type": "git", diff --git a/src/ldcolor.ls b/src/ldcolor.ls index f4d75b2..a08c11d 100644 --- a/src/ldcolor.ls +++ b/src/ldcolor.ls @@ -177,10 +177,15 @@ utils = do rand: -> {h: Math.random!*360, s: Math.random!, l: Math.random!, a: 1} + complement: (v) -> + rgb = utils.rgb v + return utils.hsl({r: (255 - rgb.r), g: (255 - rgb.g), b: (255 - rgb.b)}) + lighter: (v = @, k = 1) -> hsl = utils.hsl(v) hsl.l *= ((1/0.7) ** k) return hsl + darker: (v = @, k = 1) -> hsl = utils.hsl(v) hsl.l *= ((0.7) ** k) diff --git a/test/main.ls b/test/main.ls index 220755f..7fe26a3 100644 --- a/test/main.ls +++ b/test/main.ls @@ -14,6 +14,11 @@ describe \API, -> assert.equal ldcolor.web((new ldcolor(\#123456)).lighter!), \#1a4a7b assert.equal ldcolor.web(ldcolor.lighter(\#123456)), \#1a4a7b + describe "complement", -> + that 'should be #edcba9 after complementing #123456', -> + assert.equal ldcolor.web((new ldcolor(\#123456)).complement!), \#edcba9 + assert.equal ldcolor.web(ldcolor.complement(\#123456)), \#edcba9 + describe \Transparency, -> describe 'color with NaN to web color', -> that "should return transparent when alpha is NaN, or alpha is 0 but there are NaN values", ->