Build 584177stable
Module 531325
4,450 characters · in 17091.98ad4a4e4c98d2b2.jsDependencies
Source Raw
function(e){if(!t)var t={map:function(e,t){var n={};return t?e.map(function(e,r){return n.index=r,t.call(n,e)}):e.slice()},naturalOrder:function(e,t){return e<t?-1:+(e>t)},sum:function(e,t){var n={};return e.reduce(t?function(e,r,i){return n.index=i,e+t.call(n,r)}:function(e,t){return e+t},0)},max:function(e,n){return Math.max.apply(null,n?t.map(e,n):e)}};e.exports=function(){function e(e,t,n){return(e<<10)+(t<<5)+n}function n(e){var t=[],n=!1;function r(){t.sort(e),n=!0}return{push:function(e){t.push(e),n=!1},peek:function(e){return n||r(),void 0===e&&(e=t.length-1),t[e]},pop:function(){return n||r(),t.pop()},size:function(){return t.length},map:function(e){return t.map(e)},debug:function(){return n||r(),t}}}function r(e,t,n,r,i,a,o){this.r1=e,this.r2=t,this.g1=n,this.g2=r,this.b1=i,this.b2=a,this.histo=o}function i(){this.vboxes=new n(function(e,n){return t.naturalOrder(e.vbox.count()*e.vbox.volume(),n.vbox.count()*n.vbox.volume())})}return r.prototype={volume:function(e){return(!this._volume||e)&&(this._volume=(this.r2-this.r1+1)*(this.g2-this.g1+1)*(this.b2-this.b1+1)),this._volume},count:function(t){var n=this.histo;if(!this._count_set||t){var r,i,a,o=0;for(r=this.r1;r<=this.r2;r++)for(i=this.g1;i<=this.g2;i++)for(a=this.b1;a<=this.b2;a++)o+=n[e(r,i,a)]||0;this._count=o,this._count_set=!0}return this._count},copy:function(){return new r(this.r1,this.r2,this.g1,this.g2,this.b1,this.b2,this.histo)},avg:function(t){var n=this.histo;if(!this._avg||t){var r,i,a,o,s=0,l=0,u=0,c=0;for(i=this.r1;i<=this.r2;i++)for(a=this.g1;a<=this.g2;a++)for(o=this.b1;o<=this.b2;o++)s+=r=n[e(i,a,o)]||0,l+=r*(i+.5)*8,u+=r*(a+.5)*8,c+=r*(o+.5)*8;s?this._avg=[~~(l/s),~~(u/s),~~(c/s)]:this._avg=[~~(8*(this.r1+this.r2+1)/2),~~(8*(this.g1+this.g2+1)/2),~~(8*(this.b1+this.b2+1)/2)]}return this._avg},contains:function(e){var t=e[0]>>3;return gval=e[1]>>3,bval=e[2]>>3,t>=this.r1&&t<=this.r2&&gval>=this.g1&&gval<=this.g2&&bval>=this.b1&&bval<=this.b2}},i.prototype={push:function(e){this.vboxes.push({vbox:e,color:e.avg()})},palette:function(){return this.vboxes.map(function(e){return e.color})},size:function(){return this.vboxes.size()},map:function(e){for(var t=this.vboxes,n=0;n<t.size();n++)if(t.peek(n).vbox.contains(e))return t.peek(n).color;return this.nearest(e)},nearest:function(e){for(var t,n,r,i=this.vboxes,a=0;a<i.size();a++)((n=Math.sqrt(Math.pow(e[0]-i.peek(a).color[0],2)+Math.pow(e[1]-i.peek(a).color[1],2)+Math.pow(e[2]-i.peek(a).color[2],2)))<t||void 0===t)&&(t=n,r=i.peek(a).color);return r},forcebw:function(){var e=this.vboxes;e.sort(function(e,n){return t.naturalOrder(t.sum(e.color),t.sum(n.color))});var n=e[0].color;n[0]<5&&n[1]<5&&n[2]<5&&(e[0].color=[0,0,0]);var r=e.length-1,i=e[r].color;i[0]>251&&i[1]>251&&i[2]>251&&(e[r].color=[255,255,255])}},{quantize:function(a,o){if(!a.length||o<2||o>256)return!1;var s,l,u,c,d,f,p,h,m,g,v,y,b=(u=Array(32768),a.forEach(function(t){l=t[0]>>3,u[s=e(l,t[1]>>3,t[2]>>3)]=(u[s]||0)+1}),u),_=0;b.forEach(function(){_++});var w=(p=1e6,h=0,m=1e6,g=0,v=1e6,y=0,a.forEach(function(e){c=e[0]>>3,d=e[1]>>3,f=e[2]>>3,c<p?p=c:c>h&&(h=c),d<m?m=d:d>g&&(g=d),f<v?v=f:f>y&&(y=f)}),new r(p,h,m,g,v,y,b)),x=new n(function(e,n){return t.naturalOrder(e.count(),n.count())});function E(n,r){for(var i,a=1,o=0;o<1e3;){if(!(i=n.pop()).count()){n.push(i),o++;continue}var s=function(n,r){if(r.count()){var i=r.r2-r.r1+1,a=r.g2-r.g1+1,o=r.b2-r.b1+1,s=t.max([i,a,o]);if(1==r.count())return[r.copy()];var l,u,c,d,f=0,p=[],h=[];if(s==i)for(l=r.r1;l<=r.r2;l++){for(d=0,u=r.g1;u<=r.g2;u++)for(c=r.b1;c<=r.b2;c++)d+=n[e(l,u,c)]||0;f+=d,p[l]=f}else if(s==a)for(l=r.g1;l<=r.g2;l++){for(d=0,u=r.r1;u<=r.r2;u++)for(c=r.b1;c<=r.b2;c++)d+=n[e(u,l,c)]||0;f+=d,p[l]=f}else for(l=r.b1;l<=r.b2;l++){for(d=0,u=r.r1;u<=r.r2;u++)for(c=r.g1;c<=r.g2;c++)d+=n[e(u,c,l)]||0;f+=d,p[l]=f}return p.forEach(function(e,t){h[t]=f-e}),function(e){var t,n,i,a,o,s=e+"1",u=e+"2",c=0;for(l=r[s];l<=r[u];l++)if(p[l]>f/2){for(i=r.copy(),a=r.copy(),o=(t=l-r[s])<=(n=r[u]-l)?Math.min(r[u]-1,~~(l+n/2)):Math.max(r[s],~~(l-1-t/2));!p[o];)o++;for(c=h[o];!c&&p[o-1];)c=h[--o];return i[u]=o,a[s]=i[u]+1,[i,a]}}(s==i?"r":s==a?"g":"b")}}(b,i),l=s[0],u=s[1];if(!l||(n.push(l),u&&(n.push(u),a++),a>=r||o++>1e3))return}}x.push(w),E(x,.75*o);for(var S=new n(function(e,n){return t.naturalOrder(e.count()*e.volume(),n.count()*n.volume())});x.size();)S.push(x.pop());E(S,o-S.size());for(var k=new i;S.size();)k.push(S.pop());return k}}}().quantize}