Build 533169stable
Module 531325
4,422 characters · in no known chunkDependencies
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(){var e=5,n=3,r=1e3,i=.75;function s(t,n,r){return(t<<2*e)+(n<<e)+r}function a(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 o(e,t,n,r,i,s,a){var o=this;o.r1=e,o.r2=t,o.g1=n,o.g2=r,o.b1=i,o.b2=s,o.histo=a}function l(){this.vboxes=new a(function(e,n){return t.naturalOrder(e.vbox.count()*e.vbox.volume(),n.vbox.count()*n.vbox.volume())})}function u(t){var r,i,a=Array(1<<3*e);return t.forEach(function(e){i=e[0]>>n,a[r=s(i,e[1]>>n,e[2]>>n)]=(a[r]||0)+1}),a}function c(e,t){var r,i,s,a=1e6,l=0,u=1e6,c=0,d=1e6,_=0;return e.forEach(function(e){r=e[0]>>n,i=e[1]>>n,s=e[2]>>n,r<a?a=r:r>l&&(l=r),i<u?u=i:i>c&&(c=i),s<d?d=s:s>_&&(_=s)}),new o(a,l,u,c,d,_,t)}function d(e,n){if(n.count()){var r=n.r2-n.r1+1,i=n.g2-n.g1+1,a=n.b2-n.b1+1,o=t.max([r,i,a]);if(1==n.count())return[n.copy()];var l,u,c,d,_,f=0,p=[],h=[];if(o==r)for(l=n.r1;l<=n.r2;l++){for(d=0,u=n.g1;u<=n.g2;u++)for(c=n.b1;c<=n.b2;c++)d+=e[_=s(l,u,c)]||0;f+=d,p[l]=f}else if(o==i)for(l=n.g1;l<=n.g2;l++){for(d=0,u=n.r1;u<=n.r2;u++)for(c=n.b1;c<=n.b2;c++)d+=e[_=s(u,l,c)]||0;f+=d,p[l]=f}else for(l=n.b1;l<=n.b2;l++){for(d=0,u=n.r1;u<=n.r2;u++)for(c=n.g1;c<=n.g2;c++)d+=e[_=s(u,c,l)]||0;f+=d,p[l]=f}return p.forEach(function(e,t){h[t]=f-e}),m(o==r?"r":o==i?"g":"b")}function m(e){var t,r,i,s,a,o=e+"1",u=e+"2",c=0;for(l=n[o];l<=n[u];l++)if(p[l]>f/2){for(i=n.copy(),s=n.copy(),a=(t=l-n[o])<=(r=n[u]-l)?Math.min(n[u]-1,~~(l+r/2)):Math.max(n[o],~~(l-1-t/2));!p[a];)a++;for(c=h[a];!c&&p[a-1];)c=h[--a];return i[u]=a,s[o]=i[u]+1,[i,s]}}}return o.prototype={volume:function(e){var t=this;return(!t._volume||e)&&(t._volume=(t.r2-t.r1+1)*(t.g2-t.g1+1)*(t.b2-t.b1+1)),t._volume},count:function(e){var t=this,n=t.histo;if(!t._count_set||e){var r,i,a,o=0;for(r=t.r1;r<=t.r2;r++)for(i=t.g1;i<=t.g2;i++)for(a=t.b1;a<=t.b2;a++)o+=n[s(r,i,a)]||0;t._count=o,t._count_set=!0}return t._count},copy:function(){var e=this;return new o(e.r1,e.r2,e.g1,e.g2,e.b1,e.b2,e.histo)},avg:function(t){var n=this,r=n.histo;if(!n._avg||t){var i,a,o,l,u=0,c=1<<8-e,d=0,_=0,f=0;for(a=n.r1;a<=n.r2;a++)for(o=n.g1;o<=n.g2;o++)for(l=n.b1;l<=n.b2;l++)u+=i=r[s(a,o,l)]||0,d+=i*(a+.5)*c,_+=i*(o+.5)*c,f+=i*(l+.5)*c;u?n._avg=[~~(d/u),~~(_/u),~~(f/u)]:n._avg=[~~(c*(n.r1+n.r2+1)/2),~~(c*(n.g1+n.g2+1)/2),~~(c*(n.b1+n.b2+1)/2)]}return n._avg},contains:function(e){var t=this,r=e[0]>>n;return gval=e[1]>>n,bval=e[2]>>n,r>=t.r1&&r<=t.r2&&gval>=t.g1&&gval<=t.g2&&bval>=t.b1&&bval<=t.b2}},l.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,s=0;s<i.size();s++)((n=Math.sqrt(Math.pow(e[0]-i.peek(s).color[0],2)+Math.pow(e[1]-i.peek(s).color[1],2)+Math.pow(e[2]-i.peek(s).color[2],2)))<t||void 0===t)&&(t=n,r=i.peek(s).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(e,n){if(!e.length||n<2||n>256)return!1;var s=u(e),o=0;s.forEach(function(){o++});var _=c(e,s),f=new a(function(e,n){return t.naturalOrder(e.count(),n.count())});function p(e,t){for(var n,i=1,a=0;a<r;){if(!(n=e.pop()).count()){e.push(n),a++;continue}var o=d(s,n),l=o[0],u=o[1];if(!l||(e.push(l),u&&(e.push(u),i++),i>=t||a++>r))return}}f.push(_),p(f,i*n);for(var h=new a(function(e,n){return t.naturalOrder(e.count()*e.volume(),n.count()*n.volume())});f.size();)h.push(f.pop());p(h,n-h.size());for(var m=new l;h.size();)m.push(h.pop());return m}}}().quantize}