>>=v,p-=v),p<15&&(c+=k[n++]<>>=v=b>>>24,p-=v,!(16&(v=b>>>16&255))){if(0==(64&v)){b=m[(65535&b)+(c&(1<l){e.msg="invalid distance too far back",r.mode=30;break e}if(c>>>=v,p-=v,E>(v=a-o)){if((v=E-v)>u&&r.sane){e.msg="invalid distance too far back",r.mode=30;break e}if(x=0,S=d,0===h){if(x+=f-v,v2;)A[a++]=S[x++],A[a++]=S[x++],A[a++]=S[x++],w-=3;w&&(A[a++]=S[x++],w>1&&(A[a++]=S[x++]));}else{x=a-E;do{A[a++]=A[x++],A[a++]=A[x++],A[a++]=A[x++],w-=3;}while(w>2);w&&(A[a++]=A[x++],w>1&&(A[a++]=A[x++]));}break}}break}}while(n>3,c&=(1<<(p-=w<<3))-1,e.next_in=n,e.next_out=a,e.avail_in=n>>24&255)+(e>>>8&65280)+((65280&e)<<8)+((255&e)<<24)}function ie(e){var t;return e&&e.state?(t=e.state,e.total_in=e.total_out=t.total=0,e.msg="",t.wrap&&(e.adler=1&t.wrap),t.mode=E,t.last=0,t.havedict=0,t.dmax=32768,t.head=null,t.hold=0,t.bits=0,t.lencode=t.lendyn=new n.Buf32(ee),t.distcode=t.distdyn=new n.Buf32(te),t.sane=1,t.back=-1,p):_}function ae(e){var t;return e&&e.state?((t=e.state).wsize=0,t.whave=0,t.wnext=0,ie(e)):_}function oe(e,t){var r,n;return e&&e.state?(n=e.state,t<0?(r=0,t=-t):(r=1+(t>>4),t<48&&(t&=15)),t&&(t<8||t>15)?_:(null!==n.window&&n.wbits!==t&&(n.window=null),n.wrap=r,n.wbits=t,ae(e))):_}function se(e,t){var r,i;return e?(i=new function(){this.mode=0,this.last=!1,this.wrap=0,this.havedict=!1,this.flags=0,this.dmax=0,this.check=0,this.total=0,this.head=null,this.wbits=0,this.wsize=0,this.whave=0,this.wnext=0,this.window=null,this.hold=0,this.bits=0,this.length=0,this.offset=0,this.extra=0,this.lencode=null,this.distcode=null,this.lenbits=0,this.distbits=0,this.ncode=0,this.nlen=0,this.ndist=0,this.have=0,this.next=null,this.lens=new n.Buf16(320),this.work=new n.Buf16(288),this.lendyn=null,this.distdyn=null,this.sane=0,this.back=0,this.was=0;},e.state=i,i.window=null,(r=oe(e,t))!==p&&(e.state=null),r):_}var le,fe,ue=!0;function he(e){if(ue){var t;for(le=new n.Buf32(512),fe=new n.Buf32(32),t=0;t<144;)e.lens[t++]=8;for(;t<256;)e.lens[t++]=9;for(;t<280;)e.lens[t++]=7;for(;t<288;)e.lens[t++]=8;for(s(f,e.lens,0,288,le,0,e.work,{bits:9}),t=0;t<32;)e.lens[t++]=5;s(u,e.lens,0,32,fe,0,e.work,{bits:5}),ue=!1;}e.lencode=le,e.lenbits=9,e.distcode=fe,e.distbits=5;}function de(e,t,r,i){var a,o=e.state;return null===o.window&&(o.wsize=1<=o.wsize?(n.arraySet(o.window,t,r-o.wsize,o.wsize,0),o.wnext=0,o.whave=o.wsize):((a=o.wsize-o.wnext)>i&&(a=i),n.arraySet(o.window,t,r-i,a,o.wnext),(i-=a)?(n.arraySet(o.window,t,r-i,i,0),o.wnext=i,o.whave=o.wsize):(o.wnext+=a,o.wnext===o.wsize&&(o.wnext=0),o.whave>>8&255,r.check=a(r.check,Pe,2,0),se=0,le=0,r.mode=x;break}if(r.flags=0,r.head&&(r.head.done=!1),!(1&r.wrap)||(((255&se)<<8)+(se>>8))%31){e.msg="incorrect header check",r.mode=X;break}if((15&se)!==w){e.msg="unknown compression method",r.mode=X;break}if(le-=4,Ee=8+(15&(se>>>=4)),0===r.wbits)r.wbits=Ee;else if(Ee>r.wbits){e.msg="invalid window size",r.mode=X;break}r.dmax=1<>8&1),512&r.flags&&(Pe[0]=255&se,Pe[1]=se>>>8&255,r.check=a(r.check,Pe,2,0)),se=0,le=0,r.mode=S;case S:for(;le<32;){if(0===ae)break e;ae--,se+=ee[re++]<>>8&255,Pe[2]=se>>>16&255,Pe[3]=se>>>24&255,r.check=a(r.check,Pe,4,0)),se=0,le=0,r.mode=k;case k:for(;le<16;){if(0===ae)break e;ae--,se+=ee[re++]<>8),512&r.flags&&(Pe[0]=255&se,Pe[1]=se>>>8&255,r.check=a(r.check,Pe,2,0)),se=0,le=0,r.mode=A;case A:if(1024&r.flags){for(;le<16;){if(0===ae)break e;ae--,se+=ee[re++]<>>8&255,r.check=a(r.check,Pe,2,0)),se=0,le=0;}else r.head&&(r.head.extra=null);r.mode=P;case P:if(1024&r.flags&&((ce=r.length)>ae&&(ce=ae),ce&&(r.head&&(Ee=r.head.extra_len-r.length,r.head.extra||(r.head.extra=new Array(r.head.extra_len)),n.arraySet(r.head.extra,ee,re,ce,Ee)),512&r.flags&&(r.check=a(r.check,ee,ce,re)),ae-=ce,re+=ce,r.length-=ce),r.length))break e;r.length=0,r.mode=T;case T:if(2048&r.flags){if(0===ae)break e;ce=0;do{Ee=ee[re+ce++],r.head&&Ee&&r.length<65536&&(r.head.name+=String.fromCharCode(Ee));}while(Ee&&ce>9&1,r.head.done=!0),e.adler=r.check=0,r.mode=L;break;case I:for(;le<32;){if(0===ae)break e;ae--,se+=ee[re++]<>>=7&le,le-=7&le,r.mode=V;break}for(;le<3;){if(0===ae)break e;ae--,se+=ee[re++]<>>=1)){case 0:r.mode=B;break;case 1:if(he(r),r.mode=j,t===c){se>>>=2,le-=2;break e}break;case 2:r.mode=N;break;case 3:e.msg="invalid block type",r.mode=X;}se>>>=2,le-=2;break;case B:for(se>>>=7&le,le-=7≤le<32;){if(0===ae)break e;ae--,se+=ee[re++]<>>16^65535)){e.msg="invalid stored block lengths",r.mode=X;break}if(r.length=65535&se,se=0,le=0,r.mode=U,t===c)break e;case U:r.mode=M;case M:if(ce=r.length){if(ce>ae&&(ce=ae),ce>oe&&(ce=oe),0===ce)break e;n.arraySet(te,ee,re,ce,ie),ae-=ce,re+=ce,oe-=ce,ie+=ce,r.length-=ce;break}r.mode=L;break;case N:for(;le<14;){if(0===ae)break e;ae--,se+=ee[re++]<>>=5,le-=5,r.ndist=1+(31&se),se>>>=5,le-=5,r.ncode=4+(15&se),se>>>=4,le-=4,r.nlen>286||r.ndist>30){e.msg="too many length or distance symbols",r.mode=X;break}r.have=0,r.mode=z;case z:for(;r.have>>=3,le-=3;}for(;r.have<19;)r.lens[Te[r.have++]]=0;if(r.lencode=r.lendyn,r.lenbits=7,Se={bits:r.lenbits},xe=s(l,r.lens,0,19,r.lencode,0,r.work,Se),r.lenbits=Se.bits,xe){e.msg="invalid code lengths set",r.mode=X;break}r.have=0,r.mode=Z;case Z:for(;r.have>>16&255,ye=65535&Ae,!((me=Ae>>>24)<=le);){if(0===ae)break e;ae--,se+=ee[re++]<>>=me,le-=me,r.lens[r.have++]=ye;else{if(16===ye){for(ke=me+2;le>>=me,le-=me,0===r.have){e.msg="invalid bit length repeat",r.mode=X;break}Ee=r.lens[r.have-1],ce=3+(3&se),se>>>=2,le-=2;}else if(17===ye){for(ke=me+3;le>>=me)),se>>>=3,le-=3;}else{for(ke=me+7;le>>=me)),se>>>=7,le-=7;}if(r.have+ce>r.nlen+r.ndist){e.msg="invalid bit length repeat",r.mode=X;break}for(;ce--;)r.lens[r.have++]=Ee;}}if(r.mode===X)break;if(0===r.lens[256]){e.msg="invalid code -- missing end-of-block",r.mode=X;break}if(r.lenbits=9,Se={bits:r.lenbits},xe=s(f,r.lens,0,r.nlen,r.lencode,0,r.work,Se),r.lenbits=Se.bits,xe){e.msg="invalid literal/lengths set",r.mode=X;break}if(r.distbits=6,r.distcode=r.distdyn,Se={bits:r.distbits},xe=s(u,r.lens,r.nlen,r.ndist,r.distcode,0,r.work,Se),r.distbits=Se.bits,xe){e.msg="invalid distances set",r.mode=X;break}if(r.mode=j,t===c)break e;case j:r.mode=C;case C:if(ae>=6&&oe>=258){e.next_out=ie,e.avail_out=oe,e.next_in=re,e.avail_in=ae,r.hold=se,r.bits=le,o(e,ue),ie=e.next_out,te=e.output,oe=e.avail_out,re=e.next_in,ee=e.input,ae=e.avail_in,se=r.hold,le=r.bits,r.mode===L&&(r.back=-1);break}for(r.back=0;_e=(Ae=r.lencode[se&(1<>>16&255,ye=65535&Ae,!((me=Ae>>>24)<=le);){if(0===ae)break e;ae--,se+=ee[re++]<>be)])>>>16&255,ye=65535&Ae,!(be+(me=Ae>>>24)<=le);){if(0===ae)break e;ae--,se+=ee[re++]<>>=be,le-=be,r.back+=be;}if(se>>>=me,le-=me,r.back+=me,r.length=ye,0===_e){r.mode=G;break}if(32&_e){r.back=-1,r.mode=L;break}if(64&_e){e.msg="invalid literal/length code",r.mode=X;break}r.extra=15&_e,r.mode=q;case q:if(r.extra){for(ke=r.extra;le>>=r.extra,le-=r.extra,r.back+=r.extra;}r.was=r.length,r.mode=Y;case Y:for(;_e=(Ae=r.distcode[se&(1<>>16&255,ye=65535&Ae,!((me=Ae>>>24)<=le);){if(0===ae)break e;ae--,se+=ee[re++]<>be)])>>>16&255,ye=65535&Ae,!(be+(me=Ae>>>24)<=le);){if(0===ae)break e;ae--,se+=ee[re++]<>>=be,le-=be,r.back+=be;}if(se>>>=me,le-=me,r.back+=me,64&_e){e.msg="invalid distance code",r.mode=X;break}r.offset=ye,r.extra=15&_e,r.mode=W;case W:if(r.extra){for(ke=r.extra;le>>=r.extra,le-=r.extra,r.back+=r.extra;}if(r.offset>r.dmax){e.msg="invalid distance too far back",r.mode=X;break}r.mode=H;case H:if(0===oe)break e;if(ce=ue-oe,r.offset>ce){if((ce=r.offset-ce)>r.whave&&r.sane){e.msg="invalid distance too far back",r.mode=X;break}ce>r.wnext?(ce-=r.wnext,pe=r.wsize-ce):pe=r.wnext-ce,ce>r.length&&(ce=r.length),ge=r.window;}else ge=te,pe=ie-r.offset,ce=r.length;ce>oe&&(ce=oe),oe-=ce,r.length-=ce;do{te[ie++]=ge[pe++];}while(--ce);0===r.length&&(r.mode=C);break;case G:if(0===oe)break e;te[ie++]=r.length,oe--,r.mode=C;break;case V:if(r.wrap){for(;le<32;){if(0===ae)break e;ae--,se|=ee[re++]<=0;)e[t]=0;}var f=0,u=1,h=2,d=29,c=256,p=c+1+d,g=30,m=19,_=2*p+1,y=15,b=16,v=7,w=256,E=16,x=17,S=18,k=[0,0,0,0,0,0,0,0,1,1,1,1,2,2,2,2,3,3,3,3,4,4,4,4,5,5,5,5,0],A=[0,0,0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7,8,8,9,9,10,10,11,11,12,12,13,13],P=[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,3,7],T=[16,17,18,0,8,7,9,6,10,5,11,4,12,3,13,2,14,1,15],D=new Array(2*(p+2));l(D);var O=new Array(2*g);l(O);var I=new Array(512);l(I);var R=new Array(256);l(R);var L=new Array(d);l(L);var F,B,U,M=new Array(g);function N(e,t,r,n,i){this.static_tree=e,this.extra_bits=t,this.extra_base=r,this.elems=n,this.max_length=i,this.has_stree=e&&e.length;}function z(e,t){this.dyn_tree=e,this.max_code=0,this.stat_desc=t;}function Z(e){return e<256?I[e]:I[256+(e>>>7)]}function j(e,t){e.pending_buf[e.pending++]=255&t,e.pending_buf[e.pending++]=t>>>8&255;}function C(e,t,r){e.bi_valid>b-r?(e.bi_buf|=t<>b-e.bi_valid,e.bi_valid+=r-b):(e.bi_buf|=t<>>=1,r<<=1;}while(--t>0);return r>>>1}function W(e,t,r){var n,i,a=new Array(y+1),o=0;for(n=1;n<=y;n++)a[n]=o=o+r[n-1]<<1;for(i=0;i<=t;i++){var s=e[2*i+1];0!==s&&(e[2*i]=Y(a[s]++,s));}}function H(e){var t;for(t=0;t8?j(e,e.bi_buf):e.bi_valid>0&&(e.pending_buf[e.pending++]=e.bi_buf),e.bi_buf=0,e.bi_valid=0;}function V(e,t,r,n){var i=2*t,a=2*r;return e[i]>1;r>=1;r--)J(e,a,r);i=l;do{r=e.heap[1],e.heap[1]=e.heap[e.heap_len--],J(e,a,1),n=e.heap[1],e.heap[--e.heap_max]=r,e.heap[--e.heap_max]=n,a[2*i]=a[2*r]+a[2*n],e.depth[i]=(e.depth[r]>=e.depth[n]?e.depth[r]:e.depth[n])+1,a[2*r+1]=a[2*n+1]=i,e.heap[1]=i++,J(e,a,1);}while(e.heap_len>=2);e.heap[--e.heap_max]=e.heap[1],function(e,t){var r,n,i,a,o,s,l=t.dyn_tree,f=t.max_code,u=t.stat_desc.static_tree,h=t.stat_desc.has_stree,d=t.stat_desc.extra_bits,c=t.stat_desc.extra_base,p=t.stat_desc.max_length,g=0;for(a=0;a<=y;a++)e.bl_count[a]=0;for(l[2*e.heap[e.heap_max]+1]=0,r=e.heap_max+1;r<_;r++)(a=l[2*l[2*(n=e.heap[r])+1]+1]+1)>p&&(a=p,g++),l[2*n+1]=a,n>f||(e.bl_count[a]++,o=0,n>=c&&(o=d[n-c]),s=l[2*n],e.opt_len+=s*(a+o),h&&(e.static_len+=s*(u[2*n+1]+o)));if(0!==g){do{for(a=p-1;0===e.bl_count[a];)a--;e.bl_count[a]--,e.bl_count[a+1]+=2,e.bl_count[p]--,g-=2;}while(g>0);for(a=p;0!==a;a--)for(n=e.bl_count[a];0!==n;)(i=e.heap[--r])>f||(l[2*i+1]!==a&&(e.opt_len+=(a-l[2*i+1])*l[2*i],l[2*i+1]=a),n--);}}(e,t),W(a,f,e.bl_count);}function $(e,t,r){var n,i,a=-1,o=t[1],s=0,l=7,f=4;for(0===o&&(l=138,f=3),t[2*(r+1)+1]=65535,n=0;n<=r;n++)i=o,o=t[2*(n+1)+1],++s>=7;n0?(e.strm.data_type===s&&(e.strm.data_type=function(e){var t,r=4093624447;for(t=0;t<=31;t++,r>>>=1)if(1&r&&0!==e.dyn_ltree[2*t])return a;if(0!==e.dyn_ltree[18]||0!==e.dyn_ltree[20]||0!==e.dyn_ltree[26])return o;for(t=32;t=3&&0===e.bl_tree[2*T[t]+1];t--);return e.opt_len+=3*(t+1)+5+5+4,t}(e),l=e.opt_len+3+7>>>3,(f=e.static_len+3+7>>>3)<=l&&(l=f)):l=f=r+5,r+4<=l&&-1!==t?te(e,t,r,n):e.strategy===i||f===l?(C(e,(u<<1)+(n?1:0),3),K(e,D,O)):(C(e,(h<<1)+(n?1:0),3),function(e,t,r,n){var i;for(C(e,t-257,5),C(e,r-1,5),C(e,n-4,4),i=0;i>>8&255,e.pending_buf[e.d_buf+2*e.last_lit+1]=255&t,e.pending_buf[e.l_buf+e.last_lit]=255&r,e.last_lit++,0===t?e.dyn_ltree[2*r]++:(e.matches++,t--,e.dyn_ltree[2*(R[r]+c+1)]++,e.dyn_dtree[2*Z(t)]++),e.last_lit===e.lit_bufsize-1},t._tr_align=function(e){C(e,u<<1,3),q(e,w,D),function(e){16===e.bi_valid?(j(e,e.bi_buf),e.bi_buf=0,e.bi_valid=0):e.bi_valid>=8&&(e.pending_buf[e.pending++]=255&e.bi_buf,e.bi_buf>>=8,e.bi_valid-=8);}(e);};},function(e,t,r){var n,i=r(8),a=r(50),o=r(28),s=r(27),l=r(49),f=0,u=1,h=3,d=4,c=5,p=0,g=1,m=-2,_=-3,y=-5,b=-1,v=1,w=2,E=3,x=4,S=0,k=2,A=8,P=9,T=15,D=8,O=286,I=30,R=19,L=2*O+1,F=15,B=3,U=258,M=U+B+1,N=32,z=42,Z=69,j=73,C=91,q=103,Y=113,W=666,H=1,G=2,V=3,J=4,K=3;function X(e,t){return e.msg=l[t],t}function $(e){return (e<<1)-(e>4?9:0)}function Q(e){for(var t=e.length;--t>=0;)e[t]=0;}function ee(e){var t=e.state,r=t.pending;r>e.avail_out&&(r=e.avail_out),0!==r&&(i.arraySet(e.output,t.pending_buf,t.pending_out,r,e.next_out),e.next_out+=r,t.pending_out+=r,e.total_out+=r,e.avail_out-=r,t.pending-=r,0===t.pending&&(t.pending_out=0));}function te(e,t){a._tr_flush_block(e,e.block_start>=0?e.block_start:-1,e.strstart-e.block_start,t),e.block_start=e.strstart,ee(e.strm);}function re(e,t){e.pending_buf[e.pending++]=t;}function ne(e,t){e.pending_buf[e.pending++]=t>>>8&255,e.pending_buf[e.pending++]=255&t;}function ie(e,t){var r,n,i=e.max_chain_length,a=e.strstart,o=e.prev_length,s=e.nice_match,l=e.strstart>e.w_size-M?e.strstart-(e.w_size-M):0,f=e.window,u=e.w_mask,h=e.prev,d=e.strstart+U,c=f[a+o-1],p=f[a+o];e.prev_length>=e.good_match&&(i>>=2),s>e.lookahead&&(s=e.lookahead);do{if(f[(r=t)+o]===p&&f[r+o-1]===c&&f[r]===f[a]&&f[++r]===f[a+1]){a+=2,r++;do{}while(f[++a]===f[++r]&&f[++a]===f[++r]&&f[++a]===f[++r]&&f[++a]===f[++r]&&f[++a]===f[++r]&&f[++a]===f[++r]&&f[++a]===f[++r]&&f[++a]===f[++r]&&ao){if(e.match_start=t,o=n,n>=s)break;c=f[a+o-1],p=f[a+o];}}}while((t=h[t&u])>l&&0!=--i);return o<=e.lookahead?o:e.lookahead}function ae(e){var t,r,n,a,l,f,u,h,d,c,p=e.w_size;do{if(a=e.window_size-e.lookahead-e.strstart,e.strstart>=p+(p-M)){i.arraySet(e.window,e.window,p,p,0),e.match_start-=p,e.strstart-=p,e.block_start-=p,t=r=e.hash_size;do{n=e.head[--t],e.head[t]=n>=p?n-p:0;}while(--r);t=r=p;do{n=e.prev[--t],e.prev[t]=n>=p?n-p:0;}while(--r);a+=p;}if(0===e.strm.avail_in)break;if(f=e.strm,u=e.window,h=e.strstart+e.lookahead,d=a,c=void 0,(c=f.avail_in)>d&&(c=d),r=0===c?0:(f.avail_in-=c,i.arraySet(u,f.input,f.next_in,c,h),1===f.state.wrap?f.adler=o(f.adler,u,c,h):2===f.state.wrap&&(f.adler=s(f.adler,u,c,h)),f.next_in+=c,f.total_in+=c,c),e.lookahead+=r,e.lookahead+e.insert>=B)for(l=e.strstart-e.insert,e.ins_h=e.window[l],e.ins_h=(e.ins_h<=B&&(e.ins_h=(e.ins_h<=B)if(n=a._tr_tally(e,e.strstart-e.match_start,e.match_length-B),e.lookahead-=e.match_length,e.match_length<=e.max_lazy_match&&e.lookahead>=B){e.match_length--;do{e.strstart++,e.ins_h=(e.ins_h<=B&&(e.ins_h=(e.ins_h<4096)&&(e.match_length=B-1)),e.prev_length>=B&&e.match_length<=e.prev_length){i=e.strstart+e.lookahead-B,n=a._tr_tally(e,e.strstart-1-e.prev_match,e.prev_length-B),e.lookahead-=e.prev_length-1,e.prev_length-=2;do{++e.strstart<=i&&(e.ins_h=(e.ins_h<15&&(s=2,n-=16),a<1||a>P||r!==A||n<8||n>15||t<0||t>9||o<0||o>x)return X(e,m);8===n&&(n=9);var l=new function(){this.strm=null,this.status=0,this.pending_buf=null,this.pending_buf_size=0,this.pending_out=0,this.pending=0,this.wrap=0,this.gzhead=null,this.gzindex=0,this.method=A,this.last_flush=-1,this.w_size=0,this.w_bits=0,this.w_mask=0,this.window=null,this.window_size=0,this.prev=null,this.head=null,this.ins_h=0,this.hash_size=0,this.hash_bits=0,this.hash_mask=0,this.hash_shift=0,this.block_start=0,this.match_length=0,this.prev_match=0,this.match_available=0,this.strstart=0,this.match_start=0,this.lookahead=0,this.prev_length=0,this.max_chain_length=0,this.max_lazy_match=0,this.level=0,this.strategy=0,this.good_match=0,this.nice_match=0,this.dyn_ltree=new i.Buf16(2*L),this.dyn_dtree=new i.Buf16(2*(2*I+1)),this.bl_tree=new i.Buf16(2*(2*R+1)),Q(this.dyn_ltree),Q(this.dyn_dtree),Q(this.bl_tree),this.l_desc=null,this.d_desc=null,this.bl_desc=null,this.bl_count=new i.Buf16(F+1),this.heap=new i.Buf16(2*O+1),Q(this.heap),this.heap_len=0,this.heap_max=0,this.depth=new i.Buf16(2*O+1),Q(this.depth),this.l_buf=0,this.lit_bufsize=0,this.last_lit=0,this.d_buf=0,this.opt_len=0,this.static_len=0,this.matches=0,this.insert=0,this.bi_buf=0,this.bi_valid=0;};return e.state=l,l.strm=e,l.wrap=s,l.gzhead=null,l.w_bits=n,l.w_size=1<e.pending_buf_size-5&&(r=e.pending_buf_size-5);;){if(e.lookahead<=1){if(ae(e),0===e.lookahead&&t===f)return H;if(0===e.lookahead)break}e.strstart+=e.lookahead,e.lookahead=0;var n=e.block_start+r;if((0===e.strstart||e.strstart>=n)&&(e.lookahead=e.strstart-n,e.strstart=n,te(e,!1),0===e.strm.avail_out))return H;if(e.strstart-e.block_start>=e.w_size-M&&(te(e,!1),0===e.strm.avail_out))return H}return e.insert=0,t===d?(te(e,!0),0===e.strm.avail_out?V:J):(e.strstart>e.block_start&&(te(e,!1),e.strm.avail_out),H)}),new le(4,4,8,4,oe),new le(4,5,16,8,oe),new le(4,6,32,32,oe),new le(4,4,16,16,se),new le(8,16,32,32,se),new le(8,16,128,128,se),new le(8,32,128,256,se),new le(32,128,258,1024,se),new le(32,258,258,4096,se)],t.deflateInit=function(e,t){return he(e,t,A,T,D,S)},t.deflateInit2=he,t.deflateReset=ue,t.deflateResetKeep=fe,t.deflateSetHeader=function(e,t){return e&&e.state?2!==e.state.wrap?m:(e.state.gzhead=t,p):m},t.deflate=function(e,t){var r,i,o,l;if(!e||!e.state||t>c||t<0)return e?X(e,m):m;if(i=e.state,!e.output||!e.input&&0!==e.avail_in||i.status===W&&t!==d)return X(e,0===e.avail_out?y:m);if(i.strm=e,r=i.last_flush,i.last_flush=t,i.status===z)if(2===i.wrap)e.adler=0,re(i,31),re(i,139),re(i,8),i.gzhead?(re(i,(i.gzhead.text?1:0)+(i.gzhead.hcrc?2:0)+(i.gzhead.extra?4:0)+(i.gzhead.name?8:0)+(i.gzhead.comment?16:0)),re(i,255&i.gzhead.time),re(i,i.gzhead.time>>8&255),re(i,i.gzhead.time>>16&255),re(i,i.gzhead.time>>24&255),re(i,9===i.level?2:i.strategy>=w||i.level<2?4:0),re(i,255&i.gzhead.os),i.gzhead.extra&&i.gzhead.extra.length&&(re(i,255&i.gzhead.extra.length),re(i,i.gzhead.extra.length>>8&255)),i.gzhead.hcrc&&(e.adler=s(e.adler,i.pending_buf,i.pending,0)),i.gzindex=0,i.status=Z):(re(i,0),re(i,0),re(i,0),re(i,0),re(i,0),re(i,9===i.level?2:i.strategy>=w||i.level<2?4:0),re(i,K),i.status=Y);else{var _=A+(i.w_bits-8<<4)<<8;_|=(i.strategy>=w||i.level<2?0:i.level<6?1:6===i.level?2:3)<<6,0!==i.strstart&&(_|=N),_+=31-_%31,i.status=Y,ne(i,_),0!==i.strstart&&(ne(i,e.adler>>>16),ne(i,65535&e.adler)),e.adler=1;}if(i.status===Z)if(i.gzhead.extra){for(o=i.pending;i.gzindex<(65535&i.gzhead.extra.length)&&(i.pending!==i.pending_buf_size||(i.gzhead.hcrc&&i.pending>o&&(e.adler=s(e.adler,i.pending_buf,i.pending-o,o)),ee(e),o=i.pending,i.pending!==i.pending_buf_size));)re(i,255&i.gzhead.extra[i.gzindex]),i.gzindex++;i.gzhead.hcrc&&i.pending>o&&(e.adler=s(e.adler,i.pending_buf,i.pending-o,o)),i.gzindex===i.gzhead.extra.length&&(i.gzindex=0,i.status=j);}else i.status=j;if(i.status===j)if(i.gzhead.name){o=i.pending;do{if(i.pending===i.pending_buf_size&&(i.gzhead.hcrc&&i.pending>o&&(e.adler=s(e.adler,i.pending_buf,i.pending-o,o)),ee(e),o=i.pending,i.pending===i.pending_buf_size)){l=1;break}l=i.gzindexo&&(e.adler=s(e.adler,i.pending_buf,i.pending-o,o)),0===l&&(i.gzindex=0,i.status=C);}else i.status=C;if(i.status===C)if(i.gzhead.comment){o=i.pending;do{if(i.pending===i.pending_buf_size&&(i.gzhead.hcrc&&i.pending>o&&(e.adler=s(e.adler,i.pending_buf,i.pending-o,o)),ee(e),o=i.pending,i.pending===i.pending_buf_size)){l=1;break}l=i.gzindexo&&(e.adler=s(e.adler,i.pending_buf,i.pending-o,o)),0===l&&(i.status=q);}else i.status=q;if(i.status===q&&(i.gzhead.hcrc?(i.pending+2>i.pending_buf_size&&ee(e),i.pending+2<=i.pending_buf_size&&(re(i,255&e.adler),re(i,e.adler>>8&255),e.adler=0,i.status=Y)):i.status=Y),0!==i.pending){if(ee(e),0===e.avail_out)return i.last_flush=-1,p}else if(0===e.avail_in&&$(t)<=$(r)&&t!==d)return X(e,y);if(i.status===W&&0!==e.avail_in)return X(e,y);if(0!==e.avail_in||0!==i.lookahead||t!==f&&i.status!==W){var b=i.strategy===w?function(e,t){for(var r;;){if(0===e.lookahead&&(ae(e),0===e.lookahead)){if(t===f)return H;break}if(e.match_length=0,r=a._tr_tally(e,0,e.window[e.strstart]),e.lookahead--,e.strstart++,r&&(te(e,!1),0===e.strm.avail_out))return H}return e.insert=0,t===d?(te(e,!0),0===e.strm.avail_out?V:J):e.last_lit&&(te(e,!1),0===e.strm.avail_out)?H:G}(i,t):i.strategy===E?function(e,t){for(var r,n,i,o,s=e.window;;){if(e.lookahead<=U){if(ae(e),e.lookahead<=U&&t===f)return H;if(0===e.lookahead)break}if(e.match_length=0,e.lookahead>=B&&e.strstart>0&&(n=s[i=e.strstart-1])===s[++i]&&n===s[++i]&&n===s[++i]){o=e.strstart+U;do{}while(n===s[++i]&&n===s[++i]&&n===s[++i]&&n===s[++i]&&n===s[++i]&&n===s[++i]&&n===s[++i]&&n===s[++i]&&ie.lookahead&&(e.match_length=e.lookahead);}if(e.match_length>=B?(r=a._tr_tally(e,1,e.match_length-B),e.lookahead-=e.match_length,e.strstart+=e.match_length,e.match_length=0):(r=a._tr_tally(e,0,e.window[e.strstart]),e.lookahead--,e.strstart++),r&&(te(e,!1),0===e.strm.avail_out))return H}return e.insert=0,t===d?(te(e,!0),0===e.strm.avail_out?V:J):e.last_lit&&(te(e,!1),0===e.strm.avail_out)?H:G}(i,t):n[i.level].func(i,t);if(b!==V&&b!==J||(i.status=W),b===H||b===V)return 0===e.avail_out&&(i.last_flush=-1),p;if(b===G&&(t===u?a._tr_align(i):t!==c&&(a._tr_stored_block(i,0,0,!1),t===h&&(Q(i.head),0===i.lookahead&&(i.strstart=0,i.block_start=0,i.insert=0))),ee(e),0===e.avail_out))return i.last_flush=-1,p}return t!==d?p:i.wrap<=0?g:(2===i.wrap?(re(i,255&e.adler),re(i,e.adler>>8&255),re(i,e.adler>>16&255),re(i,e.adler>>24&255),re(i,255&e.total_in),re(i,e.total_in>>8&255),re(i,e.total_in>>16&255),re(i,e.total_in>>24&255)):(ne(i,e.adler>>>16),ne(i,65535&e.adler)),ee(e),i.wrap>0&&(i.wrap=-i.wrap),0!==i.pending?p:g)},t.deflateEnd=function(e){var t;return e&&e.state?(t=e.state.status)!==z&&t!==Z&&t!==j&&t!==C&&t!==q&&t!==Y&&t!==W?X(e,m):(e.state=null,t===Y?X(e,_):p):m},t.deflateSetDictionary=function(e,t){var r,n,a,s,l,f,u,h,d=t.length;if(!e||!e.state)return m;if(2===(s=(r=e.state).wrap)||1===s&&r.status!==z||r.lookahead)return m;for(1===s&&(e.adler=o(e.adler,t,d,0)),r.wrap=0,d>=r.w_size&&(0===s&&(Q(r.head),r.strstart=0,r.block_start=0,r.insert=0),h=new i.Buf8(r.w_size),i.arraySet(h,t,d-r.w_size,r.w_size,0),t=h,d=r.w_size),l=e.avail_in,f=e.next_in,u=e.input,e.avail_in=d,e.next_in=0,e.input=t,ae(r);r.lookahead>=B;){n=r.strstart,a=r.lookahead-(B-1);do{r.ins_h=(r.ins_h<t.UNZIP)throw new TypeError("Bad argument");this.dictionary=null,this.err=0,this.flush=0,this.init_done=!1,this.level=0,this.memLevel=0,this.mode=e,this.strategy=0,this.windowBits=0,this.write_in_progress=!1,this.pending_close=!1,this.gzip_id_bytes_read=0;}u.prototype.close=function(){this.write_in_progress?this.pending_close=!0:(this.pending_close=!1,i(this.init_done,"close before init"),i(this.mode<=t.UNZIP),this.mode===t.DEFLATE||this.mode===t.GZIP||this.mode===t.DEFLATERAW?o.deflateEnd(this.strm):this.mode!==t.INFLATE&&this.mode!==t.GUNZIP&&this.mode!==t.INFLATERAW&&this.mode!==t.UNZIP||s.inflateEnd(this.strm),this.mode=t.NONE,this.dictionary=null);},u.prototype.write=function(e,t,r,n,i,a,o){return this._write(!0,e,t,r,n,i,a,o)},u.prototype.writeSync=function(e,t,r,n,i,a,o){return this._write(!1,e,t,r,n,i,a,o)},u.prototype._write=function(r,a,o,s,l,f,u,h){if(i.equal(arguments.length,8),i(this.init_done,"write before init"),i(this.mode!==t.NONE,"already finalized"),i.equal(!1,this.write_in_progress,"write already in progress"),i.equal(!1,this.pending_close,"close is pending"),this.write_in_progress=!0,i.equal(!1,void 0===a,"must provide flush value"),this.write_in_progress=!0,a!==t.Z_NO_FLUSH&&a!==t.Z_PARTIAL_FLUSH&&a!==t.Z_SYNC_FLUSH&&a!==t.Z_FULL_FLUSH&&a!==t.Z_FINISH&&a!==t.Z_BLOCK)throw new Error("Invalid flush value");if(null==o&&(o=e.alloc(0),l=0,s=0),this.strm.avail_in=l,this.strm.input=o,this.strm.next_in=s,this.strm.avail_out=h,this.strm.output=f,this.strm.next_out=u,this.flush=a,!r)return this._process(),this._checkError()?this._afterSync():void 0;var d=this;return n.nextTick(function(){d._process(),d._after();}),this},u.prototype._afterSync=function(){var e=this.strm.avail_out,t=this.strm.avail_in;return this.write_in_progress=!1,[t,e]},u.prototype._process=function(){var e=null;switch(this.mode){case t.DEFLATE:case t.GZIP:case t.DEFLATERAW:this.err=o.deflate(this.strm,this.flush);break;case t.UNZIP:switch(this.strm.avail_in>0&&(e=this.strm.next_in),this.gzip_id_bytes_read){case 0:if(null===e)break;if(31!==this.strm.input[e]){this.mode=t.INFLATE;break}if(this.gzip_id_bytes_read=1,e++,1===this.strm.avail_in)break;case 1:if(null===e)break;139===this.strm.input[e]?(this.gzip_id_bytes_read=2,this.mode=t.GUNZIP):this.mode=t.INFLATE;break;default:throw new Error("invalid number of gzip magic number bytes read")}case t.INFLATE:case t.GUNZIP:case t.INFLATERAW:for(this.err=s.inflate(this.strm,this.flush),this.err===t.Z_NEED_DICT&&this.dictionary&&(this.err=s.inflateSetDictionary(this.strm,this.dictionary),this.err===t.Z_OK?this.err=s.inflate(this.strm,this.flush):this.err===t.Z_DATA_ERROR&&(this.err=t.Z_NEED_DICT));this.strm.avail_in>0&&this.mode===t.GUNZIP&&this.err===t.Z_STREAM_END&&0!==this.strm.next_in[0];)this.reset(),this.err=s.inflate(this.strm,this.flush);break;default:throw new Error("Unknown mode "+this.mode)}},u.prototype._checkError=function(){switch(this.err){case t.Z_OK:case t.Z_BUF_ERROR:if(0!==this.strm.avail_out&&this.flush===t.Z_FINISH)return this._error("unexpected end of file"),!1;break;case t.Z_STREAM_END:break;case t.Z_NEED_DICT:return null==this.dictionary?this._error("Missing dictionary"):this._error("Bad dictionary"),!1;default:return this._error("Zlib error"),!1}return !0},u.prototype._after=function(){if(this._checkError()){var e=this.strm.avail_out,t=this.strm.avail_in;this.write_in_progress=!1,this.callback(t,e),this.pending_close&&this.close();}},u.prototype._error=function(e){this.strm.msg&&(e=this.strm.msg),this.onerror(e,this.err),this.write_in_progress=!1,this.pending_close&&this.close();},u.prototype.init=function(e,r,n,a,o){i(4===arguments.length||5===arguments.length,"init(windowBits, level, memLevel, strategy, [dictionary])"),i(e>=8&&e<=15,"invalid windowBits"),i(r>=-1&&r<=9,"invalid compression level"),i(n>=1&&n<=9,"invalid memlevel"),i(a===t.Z_FILTERED||a===t.Z_HUFFMAN_ONLY||a===t.Z_RLE||a===t.Z_FIXED||a===t.Z_DEFAULT_STRATEGY,"invalid strategy"),this._init(r,e,n,a,o),this._setDictionary();},u.prototype.params=function(){throw new Error("deflateParams Not supported")},u.prototype.reset=function(){this._reset(),this._setDictionary();},u.prototype._init=function(e,r,n,i,l){switch(this.level=e,this.windowBits=r,this.memLevel=n,this.strategy=i,this.flush=t.Z_NO_FLUSH,this.err=t.Z_OK,this.mode!==t.GZIP&&this.mode!==t.GUNZIP||(this.windowBits+=16),this.mode===t.UNZIP&&(this.windowBits+=32),this.mode!==t.DEFLATERAW&&this.mode!==t.INFLATERAW||(this.windowBits=-1*this.windowBits),this.strm=new a,this.mode){case t.DEFLATE:case t.GZIP:case t.DEFLATERAW:this.err=o.deflateInit2(this.strm,this.level,t.Z_DEFLATED,this.windowBits,this.memLevel,this.strategy);break;case t.INFLATE:case t.GUNZIP:case t.INFLATERAW:case t.UNZIP:this.err=s.inflateInit2(this.strm,this.windowBits);break;default:throw new Error("Unknown mode "+this.mode)}this.err!==t.Z_OK&&this._error("Init error"),this.dictionary=l,this.write_in_progress=!1,this.init_done=!0;},u.prototype._setDictionary=function(){if(null!=this.dictionary){switch(this.err=t.Z_OK,this.mode){case t.DEFLATE:case t.DEFLATERAW:this.err=o.deflateSetDictionary(this.strm,this.dictionary);}this.err!==t.Z_OK&&this._error("Failed to set dictionary");}},u.prototype._reset=function(){switch(this.err=t.Z_OK,this.mode){case t.DEFLATE:case t.DEFLATERAW:case t.GZIP:this.err=o.deflateReset(this.strm);break;case t.INFLATE:case t.INFLATERAW:case t.GUNZIP:this.err=s.inflateReset(this.strm);}this.err!==t.Z_OK&&this._error("Failed to reset stream");},t.Zlib=u;}).call(this,r(1).Buffer,r(3));},function(e,t,r){e.exports=r(19).PassThrough;},function(e,t,r){e.exports=r(19).Transform;},function(e,t,r){e.exports=r(2);},function(e,t,r){e.exports=r(18);},function(e,t,r){e.exports=a;var n=r(31),i=r(6);function a(e){if(!(this instanceof a))return new a(e);n.call(this,e);}i.inherits=r(5),i.inherits(a,n),a.prototype._transform=function(e,t,r){r(null,e);};},function(e,t,r){(function(t){function r(e){try{if(!t.localStorage)return !1}catch(e){return !1}var r=t.localStorage[e];return null!=r&&"true"===String(r).toLowerCase()}e.exports=function(e,t){if(r("noDeprecation"))return e;var n=!1;return function(){if(!n){if(r("throwDeprecation"))throw new Error(t);r("traceDeprecation")?console.trace(t):console.warn(t),n=!0;}return e.apply(this,arguments)}};}).call(this,r(0));},function(e,t,r){(function(e,t){!function(e,r){if(!e.setImmediate){var n,i,a,o,s,l=1,f={},u=!1,h=e.document,d=Object.getPrototypeOf&&Object.getPrototypeOf(e);d=d&&d.setTimeout?d:e,"[object process]"==={}.toString.call(e.process)?n=function(e){t.nextTick(function(){p(e);});}:!function(){if(e.postMessage&&!e.importScripts){var t=!0,r=e.onmessage;return e.onmessage=function(){t=!1;},e.postMessage("","*"),e.onmessage=r,t}}()?e.MessageChannel?((a=new MessageChannel).port1.onmessage=function(e){p(e.data);},n=function(e){a.port2.postMessage(e);}):h&&"onreadystatechange"in h.createElement("script")?(i=h.documentElement,n=function(e){var t=h.createElement("script");t.onreadystatechange=function(){p(e),t.onreadystatechange=null,i.removeChild(t),t=null;},i.appendChild(t);}):n=function(e){setTimeout(p,0,e);}:(o="setImmediate$"+Math.random()+"$",s=function(t){t.source===e&&"string"==typeof t.data&&0===t.data.indexOf(o)&&p(+t.data.slice(o.length));},e.addEventListener?e.addEventListener("message",s,!1):e.attachEvent("onmessage",s),n=function(t){e.postMessage(o+t,"*");}),d.setImmediate=function(e){"function"!=typeof e&&(e=new Function(""+e));for(var t=new Array(arguments.length-1),r=0;r=0&&(e._idleTimeoutId=setTimeout(function(){e._onTimeout&&e._onTimeout();},t));},r(62),t.setImmediate="undefined"!=typeof self&&self.setImmediate||void 0!==e&&e.setImmediate||this&&this.setImmediate,t.clearImmediate="undefined"!=typeof self&&self.clearImmediate||void 0!==e&&e.clearImmediate||this&&this.clearImmediate;}).call(this,r(0));},function(e,t){},function(e,t,r){var n=r(9).Buffer,i=r(64);e.exports=function(){function e(){!function(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}(this,e),this.head=null,this.tail=null,this.length=0;}return e.prototype.push=function(e){var t={data:e,next:null};this.length>0?this.tail.next=t:this.head=t,this.tail=t,++this.length;},e.prototype.unshift=function(e){var t={data:e,next:this.head};0===this.length&&(this.tail=t),this.head=t,++this.length;},e.prototype.shift=function(){if(0!==this.length){var e=this.head.data;return 1===this.length?this.head=this.tail=null:this.head=this.head.next,--this.length,e}},e.prototype.clear=function(){this.head=this.tail=null,this.length=0;},e.prototype.join=function(e){if(0===this.length)return "";for(var t=this.head,r=""+t.data;t=t.next;)r+=e+t.data;return r},e.prototype.concat=function(e){if(0===this.length)return n.alloc(0);if(1===this.length)return this.head.data;for(var t,r,i,a=n.allocUnsafe(e>>>0),o=this.head,s=0;o;)t=o.data,r=a,i=s,t.copy(r,i),s+=o.data.length,o=o.next;return a},e}(),i&&i.inspect&&i.inspect.custom&&(e.exports.prototype[i.inspect.custom]=function(){var e=i.inspect({length:this.length});return this.constructor.name+" "+e});},function(e,t){},function(e,t,r){e.exports=i;var n=r(20).EventEmitter;function i(){n.call(this);}r(5)(i,n),i.Readable=r(19),i.Writable=r(59),i.Duplex=r(58),i.Transform=r(57),i.PassThrough=r(56),i.Stream=i,i.prototype.pipe=function(e,t){var r=this;function i(t){e.writable&&!1===e.write(t)&&r.pause&&r.pause();}function a(){r.readable&&r.resume&&r.resume();}r.on("data",i),e.on("drain",a),e._isStdio||t&&!1===t.end||(r.on("end",s),r.on("close",l));var o=!1;function s(){o||(o=!0,e.end());}function l(){o||(o=!0,"function"==typeof e.destroy&&e.destroy());}function f(e){if(u(),0===n.listenerCount(this,"error"))throw e}function u(){r.removeListener("data",i),e.removeListener("drain",a),r.removeListener("end",s),r.removeListener("close",l),r.removeListener("error",f),e.removeListener("error",f),r.removeListener("end",u),r.removeListener("close",u),e.removeListener("close",u);}return r.on("error",f),e.on("error",f),r.on("end",u),r.on("close",u),e.on("close",u),e.emit("pipe",r),e};},function(e,t,r){(function(e){var n=r(1).Buffer,i=r(67).Transform,a=r(55),o=r(29),s=r(30).ok,l=r(1).kMaxLength,f="Cannot create final Buffer. It would be larger than 0x"+l.toString(16)+" bytes";a.Z_MIN_WINDOWBITS=8,a.Z_MAX_WINDOWBITS=15,a.Z_DEFAULT_WINDOWBITS=15,a.Z_MIN_CHUNK=64,a.Z_MAX_CHUNK=1/0,a.Z_DEFAULT_CHUNK=16384,a.Z_MIN_MEMLEVEL=1,a.Z_MAX_MEMLEVEL=9,a.Z_DEFAULT_MEMLEVEL=8,a.Z_MIN_LEVEL=-1,a.Z_MAX_LEVEL=9,a.Z_DEFAULT_LEVEL=a.Z_DEFAULT_COMPRESSION;for(var u=Object.keys(a),h=0;h=l?o=new RangeError(f):t=n.concat(i,a),i=[],e.close(),r(o,t);}e.on("error",function(t){e.removeListener("end",s),e.removeListener("readable",o),r(t);}),e.on("end",s),e.end(t),o();}function y(e,t){if("string"==typeof t&&(t=n.from(t)),!n.isBuffer(t))throw new TypeError("Not a string or buffer");var r=e._finishFlushFlag;return e._processChunk(t,r)}function b(e){if(!(this instanceof b))return new b(e);P.call(this,e,a.DEFLATE);}function v(e){if(!(this instanceof v))return new v(e);P.call(this,e,a.INFLATE);}function w(e){if(!(this instanceof w))return new w(e);P.call(this,e,a.GZIP);}function E(e){if(!(this instanceof E))return new E(e);P.call(this,e,a.GUNZIP);}function x(e){if(!(this instanceof x))return new x(e);P.call(this,e,a.DEFLATERAW);}function S(e){if(!(this instanceof S))return new S(e);P.call(this,e,a.INFLATERAW);}function k(e){if(!(this instanceof k))return new k(e);P.call(this,e,a.UNZIP);}function A(e){return e===a.Z_NO_FLUSH||e===a.Z_PARTIAL_FLUSH||e===a.Z_SYNC_FLUSH||e===a.Z_FULL_FLUSH||e===a.Z_FINISH||e===a.Z_BLOCK}function P(e,r){var o=this;if(this._opts=e=e||{},this._chunkSize=e.chunkSize||t.Z_DEFAULT_CHUNK,i.call(this,e),e.flush&&!A(e.flush))throw new Error("Invalid flush flag: "+e.flush);if(e.finishFlush&&!A(e.finishFlush))throw new Error("Invalid flush flag: "+e.finishFlush);if(this._flushFlag=e.flush||a.Z_NO_FLUSH,this._finishFlushFlag=void 0!==e.finishFlush?e.finishFlush:a.Z_FINISH,e.chunkSize&&(e.chunkSizet.Z_MAX_CHUNK))throw new Error("Invalid chunk size: "+e.chunkSize);if(e.windowBits&&(e.windowBitst.Z_MAX_WINDOWBITS))throw new Error("Invalid windowBits: "+e.windowBits);if(e.level&&(e.levelt.Z_MAX_LEVEL))throw new Error("Invalid compression level: "+e.level);if(e.memLevel&&(e.memLevelt.Z_MAX_MEMLEVEL))throw new Error("Invalid memLevel: "+e.memLevel);if(e.strategy&&e.strategy!=t.Z_FILTERED&&e.strategy!=t.Z_HUFFMAN_ONLY&&e.strategy!=t.Z_RLE&&e.strategy!=t.Z_FIXED&&e.strategy!=t.Z_DEFAULT_STRATEGY)throw new Error("Invalid strategy: "+e.strategy);if(e.dictionary&&!n.isBuffer(e.dictionary))throw new Error("Invalid dictionary: it should be a Buffer instance");this._handle=new a.Zlib(r);var s=this;this._hadError=!1,this._handle.onerror=function(e,r){T(s),s._hadError=!0;var n=new Error(e);n.errno=r,n.code=t.codes[r],s.emit("error",n);};var l=t.Z_DEFAULT_COMPRESSION;"number"==typeof e.level&&(l=e.level);var f=t.Z_DEFAULT_STRATEGY;"number"==typeof e.strategy&&(f=e.strategy),this._handle.init(e.windowBits||t.Z_DEFAULT_WINDOWBITS,l,e.memLevel||t.Z_DEFAULT_MEMLEVEL,f,e.dictionary),this._buffer=n.allocUnsafe(this._chunkSize),this._offset=0,this._level=l,this._strategy=f,this.once("end",this.close),Object.defineProperty(this,"_closed",{get:function(){return !o._handle},configurable:!0,enumerable:!0});}function T(t,r){r&&e.nextTick(r),t._handle&&(t._handle.close(),t._handle=null);}function D(e){e.emit("close");}Object.defineProperty(t,"codes",{enumerable:!0,value:Object.freeze(c),writable:!1}),t.Deflate=b,t.Inflate=v,t.Gzip=w,t.Gunzip=E,t.DeflateRaw=x,t.InflateRaw=S,t.Unzip=k,t.createDeflate=function(e){return new b(e)},t.createInflate=function(e){return new v(e)},t.createDeflateRaw=function(e){return new x(e)},t.createInflateRaw=function(e){return new S(e)},t.createGzip=function(e){return new w(e)},t.createGunzip=function(e){return new E(e)},t.createUnzip=function(e){return new k(e)},t.deflate=function(e,t,r){return "function"==typeof t&&(r=t,t={}),_(new b(t),e,r)},t.deflateSync=function(e,t){return y(new b(t),e)},t.gzip=function(e,t,r){return "function"==typeof t&&(r=t,t={}),_(new w(t),e,r)},t.gzipSync=function(e,t){return y(new w(t),e)},t.deflateRaw=function(e,t,r){return "function"==typeof t&&(r=t,t={}),_(new x(t),e,r)},t.deflateRawSync=function(e,t){return y(new x(t),e)},t.unzip=function(e,t,r){return "function"==typeof t&&(r=t,t={}),_(new k(t),e,r)},t.unzipSync=function(e,t){return y(new k(t),e)},t.inflate=function(e,t,r){return "function"==typeof t&&(r=t,t={}),_(new v(t),e,r)},t.inflateSync=function(e,t){return y(new v(t),e)},t.gunzip=function(e,t,r){return "function"==typeof t&&(r=t,t={}),_(new E(t),e,r)},t.gunzipSync=function(e,t){return y(new E(t),e)},t.inflateRaw=function(e,t,r){return "function"==typeof t&&(r=t,t={}),_(new S(t),e,r)},t.inflateRawSync=function(e,t){return y(new S(t),e)},o.inherits(P,i),P.prototype.params=function(r,n,i){if(rt.Z_MAX_LEVEL)throw new RangeError("Invalid compression level: "+r);if(n!=t.Z_FILTERED&&n!=t.Z_HUFFMAN_ONLY&&n!=t.Z_RLE&&n!=t.Z_FIXED&&n!=t.Z_DEFAULT_STRATEGY)throw new TypeError("Invalid strategy: "+n);if(this._level!==r||this._strategy!==n){var o=this;this.flush(a.Z_SYNC_FLUSH,function(){s(o._handle,"zlib binding closed"),o._handle.params(r,n),o._hadError||(o._level=r,o._strategy=n,i&&i());});}else e.nextTick(i);},P.prototype.reset=function(){return s(this._handle,"zlib binding closed"),this._handle.reset()},P.prototype._flush=function(e){this._transform(n.alloc(0),"",e);},P.prototype.flush=function(t,r){var i=this,o=this._writableState;("function"==typeof t||void 0===t&&!r)&&(r=t,t=a.Z_FULL_FLUSH),o.ended?r&&e.nextTick(r):o.ending?r&&this.once("end",r):o.needDrain?r&&this.once("drain",function(){return i.flush(t,r)}):(this._flushFlag=t,this.write(n.alloc(0),"",r));},P.prototype.close=function(t){T(this,t),e.nextTick(D,this);},P.prototype._transform=function(e,t,r){var i,o=this._writableState,s=(o.ending||o.ended)&&(!e||o.length===e.length);return null===e||n.isBuffer(e)?this._handle?(s?i=this._finishFlushFlag:(i=this._flushFlag,e.length>=o.length&&(this._flushFlag=this._opts.flush||a.Z_NO_FLUSH)),void this._processChunk(e,i,r)):r(new Error("zlib binding closed")):r(new Error("invalid input"))},P.prototype._processChunk=function(e,t,r){var i=e&&e.length,a=this._chunkSize-this._offset,o=0,u=this,h="function"==typeof r;if(!h){var d,c=[],p=0;this.on("error",function(e){d=e;}),s(this._handle,"zlib binding closed");do{var g=this._handle.writeSync(t,e,o,i,this._buffer,this._offset,a);}while(!this._hadError&&y(g[0],g[1]));if(this._hadError)throw d;if(p>=l)throw T(this),new RangeError(f);var m=n.concat(c,p);return T(this),m}s(this._handle,"zlib binding closed");var _=this._handle.write(t,e,o,i,this._buffer,this._offset,a);function y(l,f){if(this&&(this.buffer=null,this.callback=null),!u._hadError){var d=a-f;if(s(d>=0,"have should not go down"),d>0){var g=u._buffer.slice(u._offset,u._offset+d);u._offset+=d,h?u.push(g):(c.push(g),p+=g.length);}if((0===f||u._offset>=u._chunkSize)&&(a=u._chunkSize,u._offset=0,u._buffer=n.allocUnsafe(u._chunkSize)),0===f){if(o+=i-l,i=l,!h)return !0;var m=u._handle.write(t,e,o,i,u._buffer,u._offset,u._chunkSize);return m.callback=y,void(m.buffer=e)}if(!h)return !1;r();}}_.buffer=e,_.callback=y;},o.inherits(b,P),o.inherits(v,P),o.inherits(w,P),o.inherits(E,P),o.inherits(x,P),o.inherits(S,P),o.inherits(k,P);}).call(this,r(3));},function(e,t){e.exports=function(e){return e.webpackPolyfill||(e.deprecate=function(){},e.paths=[],e.children||(e.children=[]),Object.defineProperty(e,"loaded",{enumerable:!0,get:function(){return e.l}}),Object.defineProperty(e,"id",{enumerable:!0,get:function(){return e.i}}),e.webpackPolyfill=1),e};},function(e,t,r){(function(e){Object.defineProperty(t,"__esModule",{value:!0}),t.default=function(t,d){if(void 0===t)throw"dicomParser.parseDicom: missing required parameter 'byteArray'";function c(l){var c=function(e){if(void 0===e.elements.x00020010)throw"dicomParser.parseDicom: missing required meta header attribute 0002,0010";var r=e.elements.x00020010;return u.readFixedString(t,r.dataOffset,r.length)}(l),p=function(e){if("1.2.840.10008.1.2"===e)return !1;return !0}(c),g=function(o,l){if("1.2.840.10008.1.2.1.99"===o){if(d&&d.inflater){var u=d.inflater(t,l);return new a.default(s.default,u,0)}if(void 0!==e&&this.module!==e){var h=r(68),c=(0, f.default)(t,l,t.length-l),p=h.inflateRawSync(c),g=(0, n.default)(t,p.length+l);return t.copy(g,0,0,l),p.copy(g,l),new a.default(s.default,g,0)}if("undefined"!=typeof pako){var m=t.slice(l),_=pako.inflateRaw(m),y=(0, n.default)(t,_.length+l);return y.set(t.slice(0,l),0),y.set(_,l),new a.default(s.default,y,0)}throw"dicomParser.parseDicom: no inflater available to handle deflate transfer syntax"}if("1.2.840.10008.1.2.2"===o)return new a.default(i.default,t,l);return new a.default(s.default,t,l)}(c,l.position),m=new o.default(g.byteArrayParser,g.byteArray,{});m.warnings=g.warnings;try{p?h.parseDicomDataSetExplicit(m,g,g.byteArray.length,d):h.parseDicomDataSetImplicit(m,g,g.byteArray.length,d);}catch(e){var _={exception:e,dataSet:m};throw _}return m}return p=(0, l.default)(t,d),g=c(p),function(e,t){for(var r in e.elements)e.elements.hasOwnProperty(r)&&(t.elements[r]=e.elements[r]);return void 0!==e.warnings&&(t.warnings=e.warnings.concat(t.warnings)),t}(p,g);var p,g;};var n=c(r(22)),i=c(r(37)),a=c(r(12)),o=c(r(7)),s=c(r(21)),l=c(r(36)),f=c(r(11)),u=d(r(14)),h=d(r(16));function d(e){if(e&&e.__esModule)return e;var t={};if(null!=e)for(var r in e)Object.prototype.hasOwnProperty.call(e,r)&&(t[r]=e[r]);return t.default=e,t}function c(e){return e&&e.__esModule?e:{default:e}}}).call(this,r(69)(e));},function(e,t,r){Object.defineProperty(t,"__esModule",{value:!0}),t.default="1.8.2";},function(e,t){t.read=function(e,t,r,n,i){var a,o,s=8*i-n-1,l=(1<>1,u=-7,h=r?i-1:0,d=r?-1:1,c=e[t+h];for(h+=d,a=c&(1<<-u)-1,c>>=-u,u+=s;u>0;a=256*a+e[t+h],h+=d,u-=8);for(o=a&(1<<-u)-1,a>>=-u,u+=n;u>0;o=256*o+e[t+h],h+=d,u-=8);if(0===a)a=1-f;else{if(a===l)return o?NaN:1/0*(c?-1:1);o+=Math.pow(2,n),a-=f;}return (c?-1:1)*o*Math.pow(2,a-n)},t.write=function(e,t,r,n,i,a){var o,s,l,f=8*a-i-1,u=(1<>1,d=23===i?Math.pow(2,-24)-Math.pow(2,-77):0,c=n?0:a-1,p=n?1:-1,g=t<0||0===t&&1/t<0?1:0;for(t=Math.abs(t),isNaN(t)||t===1/0?(s=isNaN(t)?1:0,o=u):(o=Math.floor(Math.log(t)/Math.LN2),t*(l=Math.pow(2,-o))<1&&(o--,l*=2),(t+=o+h>=1?d/l:d*Math.pow(2,1-h))*l>=2&&(o++,l/=2),o+h>=u?(s=0,o=u):o+h>=1?(s=(t*l-1)*Math.pow(2,i),o+=h):(s=t*Math.pow(2,h-1)*Math.pow(2,i),o=0));i>=8;e[r+c]=255&s,c+=p,s/=256,i-=8);for(o=o<0;e[r+c]=255&o,c+=p,o/=256,f-=8);e[r+c-p]|=128*g;};},function(e,t,r){t.byteLength=function(e){return 3*e.length/4-f(e)},t.toByteArray=function(e){var t,r,n,o,s,l=e.length;o=f(e),s=new a(3*l/4-o),r=o>0?l-4:l;var u=0;for(t=0;t>16&255,s[u++]=n>>8&255,s[u++]=255&n;2===o?(n=i[e.charCodeAt(t)]<<2|i[e.charCodeAt(t+1)]>>4,s[u++]=255&n):1===o&&(n=i[e.charCodeAt(t)]<<10|i[e.charCodeAt(t+1)]<<4|i[e.charCodeAt(t+2)]>>2,s[u++]=n>>8&255,s[u++]=255&n);return s},t.fromByteArray=function(e){for(var t,r=e.length,i=r%3,a="",o=[],s=0,l=r-i;sl?l:s+16383));1===i?(t=e[r-1],a+=n[t>>2],a+=n[t<<4&63],a+="=="):2===i&&(t=(e[r-2]<<8)+e[r-1],a+=n[t>>10],a+=n[t>>4&63],a+=n[t<<2&63],a+="=");return o.push(a),o.join("")};for(var n=[],i=[],a="undefined"!=typeof Uint8Array?Uint8Array:Array,o="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/",s=0,l=o.length;s0)throw new Error("Invalid string. Length must be a multiple of 4");return "="===e[t-2]?2:"="===e[t-1]?1:0}function u(e,t,r){for(var i,a,o=[],s=t;s>18&63]+n[a>>12&63]+n[a>>6&63]+n[63&a]);return o.join("")}i["-".charCodeAt(0)]=62,i["_".charCodeAt(0)]=63;},function(e,t,r){function n(e,t){return 255===e.byteArray[t]&&217===e.byteArray[t+1]}function i(e,t,r){var i=t.fragments[r];return !(!n(e,i.position+i.length-2)&&!n(e,i.position+i.length-3))}function a(e,t,r){for(var n=r;n0&&t<=12&&e>0&&e<=function(e,t){switch(e){case 2:return t%4==0&&t%100||t%400==0?29:28;case 9:case 4:case 6:case 11:return 30;default:return 31}}(t,r)}(i,n,r))throw"invalid DA '"+e+"'";return {year:r,month:n,day:i}}if(t)throw"invalid DA '"+e+"'";return};},function(e,t,r){Object.defineProperty(t,"__esModule",{value:!0}),t.default=function(e,t){if(e.length>=2){var r=parseInt(e.substring(0,2),10),n=e.length>=4?parseInt(e.substring(2,4),10):void 0,i=e.length>=6?parseInt(e.substring(4,6),10):void 0,a=e.length>=8?parseInt(e.substring(7,13),10):void 0;if(t&&(isNaN(r)||void 0!==n&&isNaN(n)||void 0!==i&&isNaN(i)||void 0!==a&&isNaN(a)||r<0||r>23||n&&(n<0||n>59)||i&&(i<0||i>59)||a&&(a<0||a>999999)))throw"invalid TM '"+e+"'";return {hours:r,minutes:n,seconds:i,fractionalSeconds:a}}if(t)throw"invalid TM '"+e+"'";return};},function(e,t,r){Object.defineProperty(t,"__esModule",{value:!0}),t.createJPEGBasicOffsetTable=t.explicitDataSetToJS=t.explicitElementToString=t.parseDA=t.parseTM=t.parsePN=t.isPrivateTag=t.isStringVr=void 0;var n=r(25),i=f(r(77)),a=f(r(76)),o=f(r(43)),s=f(r(75)),l=f(r(74));function f(e){return e&&e.__esModule?e:{default:e}}t.isStringVr=n.isStringVr,t.isPrivateTag=n.isPrivateTag,t.parsePN=n.parsePN,t.parseTM=i.default,t.parseDA=a.default,t.explicitElementToString=o.default,t.explicitDataSetToJS=s.default,t.createJPEGBasicOffsetTable=l.default;},function(e,t,r){Object.defineProperty(t,"__esModule",{value:!0}),t.readTag=t.readSequenceItem=t.readSequenceItemsImplicit=t.readSequenceItemsExplicit=t.readPart10Header=t.readEncapsulatedPixelDataFromFragments=t.readEncapsulatedPixelData=t.readEncapsulatedImageFrame=t.readDicomElementImplicit=t.readDicomElementExplicit=t.parseDicom=t.littleEndianByteArrayParser=t.findItemDelimitationItemAndSetElementLength=t.findEndOfEncapsulatedElement=t.findAndSetUNElementLength=t.DataSet=t.sharedCopy=t.ByteStream=t.bigEndianByteArrayParser=t.version=t.alloc=t.readFixedString=t.parseDicomDataSetImplicit=t.parseDicomDataSetExplicit=t.createJPEGBasicOffsetTable=t.explicitDataSetToJS=t.explicitElementToString=t.parseDA=t.parseTM=t.parsePN=t.isPrivateTag=t.isStringVr=void 0;var n=r(78),i=r(16),a=r(14),o=P(r(22)),s=P(r(71)),l=P(r(37)),f=P(r(12)),u=P(r(11)),h=P(r(7)),d=P(r(41)),c=P(r(42)),p=P(r(24)),g=P(r(21)),m=P(r(70)),_=P(r(15)),y=P(r(23)),b=P(r(26)),v=P(r(44)),w=P(r(17)),E=P(r(36)),x=P(r(40)),S=P(r(39)),k=P(r(13)),A=P(r(4));function P(e){return e&&e.__esModule?e:{default:e}}var T={isStringVr:n.isStringVr,isPrivateTag:n.isPrivateTag,parsePN:n.parsePN,parseTM:n.parseTM,parseDA:n.parseDA,explicitElementToString:n.explicitElementToString,explicitDataSetToJS:n.explicitDataSetToJS,createJPEGBasicOffsetTable:n.createJPEGBasicOffsetTable,parseDicomDataSetExplicit:i.parseDicomDataSetExplicit,parseDicomDataSetImplicit:i.parseDicomDataSetImplicit,readFixedString:a.readFixedString,alloc:o.default,version:s.default,bigEndianByteArrayParser:l.default,ByteStream:f.default,sharedCopy:u.default,DataSet:h.default,findAndSetUNElementLength:d.default,findEndOfEncapsulatedElement:c.default,findItemDelimitationItemAndSetElementLength:p.default,littleEndianByteArrayParser:g.default,parseDicom:m.default,readDicomElementExplicit:_.default,readDicomElementImplicit:y.default,readEncapsulatedImageFrame:b.default,readEncapsulatedPixelData:v.default,readEncapsulatedPixelDataFromFragments:w.default,readPart10Header:E.default,readSequenceItemsExplicit:x.default,readSequenceItemsImplicit:S.default,readSequenceItem:k.default,readTag:A.default};t.isStringVr=n.isStringVr,t.isPrivateTag=n.isPrivateTag,t.parsePN=n.parsePN,t.parseTM=n.parseTM,t.parseDA=n.parseDA,t.explicitElementToString=n.explicitElementToString,t.explicitDataSetToJS=n.explicitDataSetToJS,t.createJPEGBasicOffsetTable=n.createJPEGBasicOffsetTable,t.parseDicomDataSetExplicit=i.parseDicomDataSetExplicit,t.parseDicomDataSetImplicit=i.parseDicomDataSetImplicit,t.readFixedString=a.readFixedString,t.alloc=o.default,t.version=s.default,t.bigEndianByteArrayParser=l.default,t.ByteStream=f.default,t.sharedCopy=u.default,t.DataSet=h.default,t.findAndSetUNElementLength=d.default,t.findEndOfEncapsulatedElement=c.default,t.findItemDelimitationItemAndSetElementLength=p.default,t.littleEndianByteArrayParser=g.default,t.parseDicom=m.default,t.readDicomElementExplicit=_.default,t.readDicomElementImplicit=y.default,t.readEncapsulatedImageFrame=b.default,t.readEncapsulatedPixelData=v.default,t.readEncapsulatedPixelDataFromFragments=w.default,t.readPart10Header=E.default,t.readSequenceItemsExplicit=x.default,t.readSequenceItemsImplicit=S.default,t.readSequenceItem=k.default,t.readTag=A.default,t.default=T;}])});
+
+});
+
+var dicomParser = unwrapExports(dicomParser_min);
+
+var cornerstone$2 = createCommonjsModule(function (module, exports) {
+/*! cornerstone-core - 2.2.8 - 2018-12-05 | (c) 2016 Chris Hafey | https://github.com/cornerstonejs/cornerstone */
+(function webpackUniversalModuleDefinition(root, factory) {
+ module.exports = factory();
+})(window, function() {
+return /******/ (function(modules) { // webpackBootstrap
+/******/ function hotDisposeChunk(chunkId) {
+/******/ delete installedChunks[chunkId];
+/******/ }
+/******/ var parentHotUpdateCallback = window["webpackHotUpdate"];
+/******/ window["webpackHotUpdate"] = // eslint-disable-next-line no-unused-vars
+/******/ function webpackHotUpdateCallback(chunkId, moreModules) {
+/******/ hotAddUpdateChunk(chunkId, moreModules);
+/******/ if (parentHotUpdateCallback) parentHotUpdateCallback(chunkId, moreModules);
+/******/ } ;
+/******/
+/******/ // eslint-disable-next-line no-unused-vars
+/******/ function hotDownloadUpdateChunk(chunkId) {
+/******/ var head = document.getElementsByTagName("head")[0];
+/******/ var script = document.createElement("script");
+/******/ script.charset = "utf-8";
+/******/ script.src = __webpack_require__.p + "" + chunkId + "." + hotCurrentHash + ".hot-update.js";
+/******/ head.appendChild(script);
+/******/ }
+/******/
+/******/ // eslint-disable-next-line no-unused-vars
+/******/ function hotDownloadManifest(requestTimeout) {
+/******/ requestTimeout = requestTimeout || 10000;
+/******/ return new Promise(function(resolve, reject) {
+/******/ if (typeof XMLHttpRequest === "undefined") {
+/******/ return reject(new Error("No browser support"));
+/******/ }
+/******/ try {
+/******/ var request = new XMLHttpRequest();
+/******/ var requestPath = __webpack_require__.p + "" + hotCurrentHash + ".hot-update.json";
+/******/ request.open("GET", requestPath, true);
+/******/ request.timeout = requestTimeout;
+/******/ request.send(null);
+/******/ } catch (err) {
+/******/ return reject(err);
+/******/ }
+/******/ request.onreadystatechange = function() {
+/******/ if (request.readyState !== 4) return;
+/******/ if (request.status === 0) {
+/******/ // timeout
+/******/ reject(
+/******/ new Error("Manifest request to " + requestPath + " timed out.")
+/******/ );
+/******/ } else if (request.status === 404) {
+/******/ // no update available
+/******/ resolve();
+/******/ } else if (request.status !== 200 && request.status !== 304) {
+/******/ // other failure
+/******/ reject(new Error("Manifest request to " + requestPath + " failed."));
+/******/ } else {
+/******/ // success
+/******/ try {
+/******/ var update = JSON.parse(request.responseText);
+/******/ } catch (e) {
+/******/ reject(e);
+/******/ return;
+/******/ }
+/******/ resolve(update);
+/******/ }
+/******/ };
+/******/ });
+/******/ }
+/******/
+/******/ var hotApplyOnUpdate = true;
+/******/ // eslint-disable-next-line no-unused-vars
+/******/ var hotCurrentHash = "72ed982d5a0046aad5fa";
+/******/ var hotRequestTimeout = 10000;
+/******/ var hotCurrentModuleData = {};
+/******/ var hotCurrentChildModule;
+/******/ // eslint-disable-next-line no-unused-vars
+/******/ var hotCurrentParents = [];
+/******/ // eslint-disable-next-line no-unused-vars
+/******/ var hotCurrentParentsTemp = [];
+/******/
+/******/ // eslint-disable-next-line no-unused-vars
+/******/ function hotCreateRequire(moduleId) {
+/******/ var me = installedModules[moduleId];
+/******/ if (!me) return __webpack_require__;
+/******/ var fn = function(request) {
+/******/ if (me.hot.active) {
+/******/ if (installedModules[request]) {
+/******/ if (installedModules[request].parents.indexOf(moduleId) === -1) {
+/******/ installedModules[request].parents.push(moduleId);
+/******/ }
+/******/ } else {
+/******/ hotCurrentParents = [moduleId];
+/******/ hotCurrentChildModule = request;
+/******/ }
+/******/ if (me.children.indexOf(request) === -1) {
+/******/ me.children.push(request);
+/******/ }
+/******/ } else {
+/******/ console.warn(
+/******/ "[HMR] unexpected require(" +
+/******/ request +
+/******/ ") from disposed module " +
+/******/ moduleId
+/******/ );
+/******/ hotCurrentParents = [];
+/******/ }
+/******/ return __webpack_require__(request);
+/******/ };
+/******/ var ObjectFactory = function ObjectFactory(name) {
+/******/ return {
+/******/ configurable: true,
+/******/ enumerable: true,
+/******/ get: function() {
+/******/ return __webpack_require__[name];
+/******/ },
+/******/ set: function(value) {
+/******/ __webpack_require__[name] = value;
+/******/ }
+/******/ };
+/******/ };
+/******/ for (var name in __webpack_require__) {
+/******/ if (
+/******/ Object.prototype.hasOwnProperty.call(__webpack_require__, name) &&
+/******/ name !== "e" &&
+/******/ name !== "t"
+/******/ ) {
+/******/ Object.defineProperty(fn, name, ObjectFactory(name));
+/******/ }
+/******/ }
+/******/ fn.e = function(chunkId) {
+/******/ if (hotStatus === "ready") hotSetStatus("prepare");
+/******/ hotChunksLoading++;
+/******/ return __webpack_require__.e(chunkId).then(finishChunkLoading, function(err) {
+/******/ finishChunkLoading();
+/******/ throw err;
+/******/ });
+/******/
+/******/ function finishChunkLoading() {
+/******/ hotChunksLoading--;
+/******/ if (hotStatus === "prepare") {
+/******/ if (!hotWaitingFilesMap[chunkId]) {
+/******/ hotEnsureUpdateChunk(chunkId);
+/******/ }
+/******/ if (hotChunksLoading === 0 && hotWaitingFiles === 0) {
+/******/ hotUpdateDownloaded();
+/******/ }
+/******/ }
+/******/ }
+/******/ };
+/******/ fn.t = function(value, mode) {
+/******/ if (mode & 1) value = fn(value);
+/******/ return __webpack_require__.t(value, mode & ~1);
+/******/ };
+/******/ return fn;
+/******/ }
+/******/
+/******/ // eslint-disable-next-line no-unused-vars
+/******/ function hotCreateModule(moduleId) {
+/******/ var hot = {
+/******/ // private stuff
+/******/ _acceptedDependencies: {},
+/******/ _declinedDependencies: {},
+/******/ _selfAccepted: false,
+/******/ _selfDeclined: false,
+/******/ _disposeHandlers: [],
+/******/ _main: hotCurrentChildModule !== moduleId,
+/******/
+/******/ // Module API
+/******/ active: true,
+/******/ accept: function(dep, callback) {
+/******/ if (dep === undefined) hot._selfAccepted = true;
+/******/ else if (typeof dep === "function") hot._selfAccepted = dep;
+/******/ else if (typeof dep === "object")
+/******/ for (var i = 0; i < dep.length; i++)
+/******/ hot._acceptedDependencies[dep[i]] = callback || function() {};
+/******/ else hot._acceptedDependencies[dep] = callback || function() {};
+/******/ },
+/******/ decline: function(dep) {
+/******/ if (dep === undefined) hot._selfDeclined = true;
+/******/ else if (typeof dep === "object")
+/******/ for (var i = 0; i < dep.length; i++)
+/******/ hot._declinedDependencies[dep[i]] = true;
+/******/ else hot._declinedDependencies[dep] = true;
+/******/ },
+/******/ dispose: function(callback) {
+/******/ hot._disposeHandlers.push(callback);
+/******/ },
+/******/ addDisposeHandler: function(callback) {
+/******/ hot._disposeHandlers.push(callback);
+/******/ },
+/******/ removeDisposeHandler: function(callback) {
+/******/ var idx = hot._disposeHandlers.indexOf(callback);
+/******/ if (idx >= 0) hot._disposeHandlers.splice(idx, 1);
+/******/ },
+/******/
+/******/ // Management API
+/******/ check: hotCheck,
+/******/ apply: hotApply,
+/******/ status: function(l) {
+/******/ if (!l) return hotStatus;
+/******/ hotStatusHandlers.push(l);
+/******/ },
+/******/ addStatusHandler: function(l) {
+/******/ hotStatusHandlers.push(l);
+/******/ },
+/******/ removeStatusHandler: function(l) {
+/******/ var idx = hotStatusHandlers.indexOf(l);
+/******/ if (idx >= 0) hotStatusHandlers.splice(idx, 1);
+/******/ },
+/******/
+/******/ //inherit from previous dispose call
+/******/ data: hotCurrentModuleData[moduleId]
+/******/ };
+/******/ hotCurrentChildModule = undefined;
+/******/ return hot;
+/******/ }
+/******/
+/******/ var hotStatusHandlers = [];
+/******/ var hotStatus = "idle";
+/******/
+/******/ function hotSetStatus(newStatus) {
+/******/ hotStatus = newStatus;
+/******/ for (var i = 0; i < hotStatusHandlers.length; i++)
+/******/ hotStatusHandlers[i].call(null, newStatus);
+/******/ }
+/******/
+/******/ // while downloading
+/******/ var hotWaitingFiles = 0;
+/******/ var hotChunksLoading = 0;
+/******/ var hotWaitingFilesMap = {};
+/******/ var hotRequestedFilesMap = {};
+/******/ var hotAvailableFilesMap = {};
+/******/ var hotDeferred;
+/******/
+/******/ // The update info
+/******/ var hotUpdate, hotUpdateNewHash;
+/******/
+/******/ function toModuleId(id) {
+/******/ var isNumber = +id + "" === id;
+/******/ return isNumber ? +id : id;
+/******/ }
+/******/
+/******/ function hotCheck(apply) {
+/******/ if (hotStatus !== "idle") {
+/******/ throw new Error("check() is only allowed in idle status");
+/******/ }
+/******/ hotApplyOnUpdate = apply;
+/******/ hotSetStatus("check");
+/******/ return hotDownloadManifest(hotRequestTimeout).then(function(update) {
+/******/ if (!update) {
+/******/ hotSetStatus("idle");
+/******/ return null;
+/******/ }
+/******/ hotRequestedFilesMap = {};
+/******/ hotWaitingFilesMap = {};
+/******/ hotAvailableFilesMap = update.c;
+/******/ hotUpdateNewHash = update.h;
+/******/
+/******/ hotSetStatus("prepare");
+/******/ var promise = new Promise(function(resolve, reject) {
+/******/ hotDeferred = {
+/******/ resolve: resolve,
+/******/ reject: reject
+/******/ };
+/******/ });
+/******/ hotUpdate = {};
+/******/ var chunkId = "cornerstone";
+/******/ // eslint-disable-next-line no-lone-blocks
+/******/ {
+/******/ /*globals chunkId */
+/******/ hotEnsureUpdateChunk(chunkId);
+/******/ }
+/******/ if (
+/******/ hotStatus === "prepare" &&
+/******/ hotChunksLoading === 0 &&
+/******/ hotWaitingFiles === 0
+/******/ ) {
+/******/ hotUpdateDownloaded();
+/******/ }
+/******/ return promise;
+/******/ });
+/******/ }
+/******/
+/******/ // eslint-disable-next-line no-unused-vars
+/******/ function hotAddUpdateChunk(chunkId, moreModules) {
+/******/ if (!hotAvailableFilesMap[chunkId] || !hotRequestedFilesMap[chunkId])
+/******/ return;
+/******/ hotRequestedFilesMap[chunkId] = false;
+/******/ for (var moduleId in moreModules) {
+/******/ if (Object.prototype.hasOwnProperty.call(moreModules, moduleId)) {
+/******/ hotUpdate[moduleId] = moreModules[moduleId];
+/******/ }
+/******/ }
+/******/ if (--hotWaitingFiles === 0 && hotChunksLoading === 0) {
+/******/ hotUpdateDownloaded();
+/******/ }
+/******/ }
+/******/
+/******/ function hotEnsureUpdateChunk(chunkId) {
+/******/ if (!hotAvailableFilesMap[chunkId]) {
+/******/ hotWaitingFilesMap[chunkId] = true;
+/******/ } else {
+/******/ hotRequestedFilesMap[chunkId] = true;
+/******/ hotWaitingFiles++;
+/******/ hotDownloadUpdateChunk(chunkId);
+/******/ }
+/******/ }
+/******/
+/******/ function hotUpdateDownloaded() {
+/******/ hotSetStatus("ready");
+/******/ var deferred = hotDeferred;
+/******/ hotDeferred = null;
+/******/ if (!deferred) return;
+/******/ if (hotApplyOnUpdate) {
+/******/ // Wrap deferred object in Promise to mark it as a well-handled Promise to
+/******/ // avoid triggering uncaught exception warning in Chrome.
+/******/ // See https://bugs.chromium.org/p/chromium/issues/detail?id=465666
+/******/ Promise.resolve()
+/******/ .then(function() {
+/******/ return hotApply(hotApplyOnUpdate);
+/******/ })
+/******/ .then(
+/******/ function(result) {
+/******/ deferred.resolve(result);
+/******/ },
+/******/ function(err) {
+/******/ deferred.reject(err);
+/******/ }
+/******/ );
+/******/ } else {
+/******/ var outdatedModules = [];
+/******/ for (var id in hotUpdate) {
+/******/ if (Object.prototype.hasOwnProperty.call(hotUpdate, id)) {
+/******/ outdatedModules.push(toModuleId(id));
+/******/ }
+/******/ }
+/******/ deferred.resolve(outdatedModules);
+/******/ }
+/******/ }
+/******/
+/******/ function hotApply(options) {
+/******/ if (hotStatus !== "ready")
+/******/ throw new Error("apply() is only allowed in ready status");
+/******/ options = options || {};
+/******/
+/******/ var cb;
+/******/ var i;
+/******/ var j;
+/******/ var module;
+/******/ var moduleId;
+/******/
+/******/ function getAffectedStuff(updateModuleId) {
+/******/ var outdatedModules = [updateModuleId];
+/******/ var outdatedDependencies = {};
+/******/
+/******/ var queue = outdatedModules.slice().map(function(id) {
+/******/ return {
+/******/ chain: [id],
+/******/ id: id
+/******/ };
+/******/ });
+/******/ while (queue.length > 0) {
+/******/ var queueItem = queue.pop();
+/******/ var moduleId = queueItem.id;
+/******/ var chain = queueItem.chain;
+/******/ module = installedModules[moduleId];
+/******/ if (!module || module.hot._selfAccepted) continue;
+/******/ if (module.hot._selfDeclined) {
+/******/ return {
+/******/ type: "self-declined",
+/******/ chain: chain,
+/******/ moduleId: moduleId
+/******/ };
+/******/ }
+/******/ if (module.hot._main) {
+/******/ return {
+/******/ type: "unaccepted",
+/******/ chain: chain,
+/******/ moduleId: moduleId
+/******/ };
+/******/ }
+/******/ for (var i = 0; i < module.parents.length; i++) {
+/******/ var parentId = module.parents[i];
+/******/ var parent = installedModules[parentId];
+/******/ if (!parent) continue;
+/******/ if (parent.hot._declinedDependencies[moduleId]) {
+/******/ return {
+/******/ type: "declined",
+/******/ chain: chain.concat([parentId]),
+/******/ moduleId: moduleId,
+/******/ parentId: parentId
+/******/ };
+/******/ }
+/******/ if (outdatedModules.indexOf(parentId) !== -1) continue;
+/******/ if (parent.hot._acceptedDependencies[moduleId]) {
+/******/ if (!outdatedDependencies[parentId])
+/******/ outdatedDependencies[parentId] = [];
+/******/ addAllToSet(outdatedDependencies[parentId], [moduleId]);
+/******/ continue;
+/******/ }
+/******/ delete outdatedDependencies[parentId];
+/******/ outdatedModules.push(parentId);
+/******/ queue.push({
+/******/ chain: chain.concat([parentId]),
+/******/ id: parentId
+/******/ });
+/******/ }
+/******/ }
+/******/
+/******/ return {
+/******/ type: "accepted",
+/******/ moduleId: updateModuleId,
+/******/ outdatedModules: outdatedModules,
+/******/ outdatedDependencies: outdatedDependencies
+/******/ };
+/******/ }
+/******/
+/******/ function addAllToSet(a, b) {
+/******/ for (var i = 0; i < b.length; i++) {
+/******/ var item = b[i];
+/******/ if (a.indexOf(item) === -1) a.push(item);
+/******/ }
+/******/ }
+/******/
+/******/ // at begin all updates modules are outdated
+/******/ // the "outdated" status can propagate to parents if they don't accept the children
+/******/ var outdatedDependencies = {};
+/******/ var outdatedModules = [];
+/******/ var appliedUpdate = {};
+/******/
+/******/ var warnUnexpectedRequire = function warnUnexpectedRequire() {
+/******/ console.warn(
+/******/ "[HMR] unexpected require(" + result.moduleId + ") to disposed module"
+/******/ );
+/******/ };
+/******/
+/******/ for (var id in hotUpdate) {
+/******/ if (Object.prototype.hasOwnProperty.call(hotUpdate, id)) {
+/******/ moduleId = toModuleId(id);
+/******/ /** @type {TODO} */
+/******/ var result;
+/******/ if (hotUpdate[id]) {
+/******/ result = getAffectedStuff(moduleId);
+/******/ } else {
+/******/ result = {
+/******/ type: "disposed",
+/******/ moduleId: id
+/******/ };
+/******/ }
+/******/ /** @type {Error|false} */
+/******/ var abortError = false;
+/******/ var doApply = false;
+/******/ var doDispose = false;
+/******/ var chainInfo = "";
+/******/ if (result.chain) {
+/******/ chainInfo = "\nUpdate propagation: " + result.chain.join(" -> ");
+/******/ }
+/******/ switch (result.type) {
+/******/ case "self-declined":
+/******/ if (options.onDeclined) options.onDeclined(result);
+/******/ if (!options.ignoreDeclined)
+/******/ abortError = new Error(
+/******/ "Aborted because of self decline: " +
+/******/ result.moduleId +
+/******/ chainInfo
+/******/ );
+/******/ break;
+/******/ case "declined":
+/******/ if (options.onDeclined) options.onDeclined(result);
+/******/ if (!options.ignoreDeclined)
+/******/ abortError = new Error(
+/******/ "Aborted because of declined dependency: " +
+/******/ result.moduleId +
+/******/ " in " +
+/******/ result.parentId +
+/******/ chainInfo
+/******/ );
+/******/ break;
+/******/ case "unaccepted":
+/******/ if (options.onUnaccepted) options.onUnaccepted(result);
+/******/ if (!options.ignoreUnaccepted)
+/******/ abortError = new Error(
+/******/ "Aborted because " + moduleId + " is not accepted" + chainInfo
+/******/ );
+/******/ break;
+/******/ case "accepted":
+/******/ if (options.onAccepted) options.onAccepted(result);
+/******/ doApply = true;
+/******/ break;
+/******/ case "disposed":
+/******/ if (options.onDisposed) options.onDisposed(result);
+/******/ doDispose = true;
+/******/ break;
+/******/ default:
+/******/ throw new Error("Unexception type " + result.type);
+/******/ }
+/******/ if (abortError) {
+/******/ hotSetStatus("abort");
+/******/ return Promise.reject(abortError);
+/******/ }
+/******/ if (doApply) {
+/******/ appliedUpdate[moduleId] = hotUpdate[moduleId];
+/******/ addAllToSet(outdatedModules, result.outdatedModules);
+/******/ for (moduleId in result.outdatedDependencies) {
+/******/ if (
+/******/ Object.prototype.hasOwnProperty.call(
+/******/ result.outdatedDependencies,
+/******/ moduleId
+/******/ )
+/******/ ) {
+/******/ if (!outdatedDependencies[moduleId])
+/******/ outdatedDependencies[moduleId] = [];
+/******/ addAllToSet(
+/******/ outdatedDependencies[moduleId],
+/******/ result.outdatedDependencies[moduleId]
+/******/ );
+/******/ }
+/******/ }
+/******/ }
+/******/ if (doDispose) {
+/******/ addAllToSet(outdatedModules, [result.moduleId]);
+/******/ appliedUpdate[moduleId] = warnUnexpectedRequire;
+/******/ }
+/******/ }
+/******/ }
+/******/
+/******/ // Store self accepted outdated modules to require them later by the module system
+/******/ var outdatedSelfAcceptedModules = [];
+/******/ for (i = 0; i < outdatedModules.length; i++) {
+/******/ moduleId = outdatedModules[i];
+/******/ if (
+/******/ installedModules[moduleId] &&
+/******/ installedModules[moduleId].hot._selfAccepted
+/******/ )
+/******/ outdatedSelfAcceptedModules.push({
+/******/ module: moduleId,
+/******/ errorHandler: installedModules[moduleId].hot._selfAccepted
+/******/ });
+/******/ }
+/******/
+/******/ // Now in "dispose" phase
+/******/ hotSetStatus("dispose");
+/******/ Object.keys(hotAvailableFilesMap).forEach(function(chunkId) {
+/******/ if (hotAvailableFilesMap[chunkId] === false) {
+/******/ hotDisposeChunk(chunkId);
+/******/ }
+/******/ });
+/******/
+/******/ var idx;
+/******/ var queue = outdatedModules.slice();
+/******/ while (queue.length > 0) {
+/******/ moduleId = queue.pop();
+/******/ module = installedModules[moduleId];
+/******/ if (!module) continue;
+/******/
+/******/ var data = {};
+/******/
+/******/ // Call dispose handlers
+/******/ var disposeHandlers = module.hot._disposeHandlers;
+/******/ for (j = 0; j < disposeHandlers.length; j++) {
+/******/ cb = disposeHandlers[j];
+/******/ cb(data);
+/******/ }
+/******/ hotCurrentModuleData[moduleId] = data;
+/******/
+/******/ // disable module (this disables requires from this module)
+/******/ module.hot.active = false;
+/******/
+/******/ // remove module from cache
+/******/ delete installedModules[moduleId];
+/******/
+/******/ // when disposing there is no need to call dispose handler
+/******/ delete outdatedDependencies[moduleId];
+/******/
+/******/ // remove "parents" references from all children
+/******/ for (j = 0; j < module.children.length; j++) {
+/******/ var child = installedModules[module.children[j]];
+/******/ if (!child) continue;
+/******/ idx = child.parents.indexOf(moduleId);
+/******/ if (idx >= 0) {
+/******/ child.parents.splice(idx, 1);
+/******/ }
+/******/ }
+/******/ }
+/******/
+/******/ // remove outdated dependency from module children
+/******/ var dependency;
+/******/ var moduleOutdatedDependencies;
+/******/ for (moduleId in outdatedDependencies) {
+/******/ if (
+/******/ Object.prototype.hasOwnProperty.call(outdatedDependencies, moduleId)
+/******/ ) {
+/******/ module = installedModules[moduleId];
+/******/ if (module) {
+/******/ moduleOutdatedDependencies = outdatedDependencies[moduleId];
+/******/ for (j = 0; j < moduleOutdatedDependencies.length; j++) {
+/******/ dependency = moduleOutdatedDependencies[j];
+/******/ idx = module.children.indexOf(dependency);
+/******/ if (idx >= 0) module.children.splice(idx, 1);
+/******/ }
+/******/ }
+/******/ }
+/******/ }
+/******/
+/******/ // Not in "apply" phase
+/******/ hotSetStatus("apply");
+/******/
+/******/ hotCurrentHash = hotUpdateNewHash;
+/******/
+/******/ // insert new code
+/******/ for (moduleId in appliedUpdate) {
+/******/ if (Object.prototype.hasOwnProperty.call(appliedUpdate, moduleId)) {
+/******/ modules[moduleId] = appliedUpdate[moduleId];
+/******/ }
+/******/ }
+/******/
+/******/ // call accept handlers
+/******/ var error = null;
+/******/ for (moduleId in outdatedDependencies) {
+/******/ if (
+/******/ Object.prototype.hasOwnProperty.call(outdatedDependencies, moduleId)
+/******/ ) {
+/******/ module = installedModules[moduleId];
+/******/ if (module) {
+/******/ moduleOutdatedDependencies = outdatedDependencies[moduleId];
+/******/ var callbacks = [];
+/******/ for (i = 0; i < moduleOutdatedDependencies.length; i++) {
+/******/ dependency = moduleOutdatedDependencies[i];
+/******/ cb = module.hot._acceptedDependencies[dependency];
+/******/ if (cb) {
+/******/ if (callbacks.indexOf(cb) !== -1) continue;
+/******/ callbacks.push(cb);
+/******/ }
+/******/ }
+/******/ for (i = 0; i < callbacks.length; i++) {
+/******/ cb = callbacks[i];
+/******/ try {
+/******/ cb(moduleOutdatedDependencies);
+/******/ } catch (err) {
+/******/ if (options.onErrored) {
+/******/ options.onErrored({
+/******/ type: "accept-errored",
+/******/ moduleId: moduleId,
+/******/ dependencyId: moduleOutdatedDependencies[i],
+/******/ error: err
+/******/ });
+/******/ }
+/******/ if (!options.ignoreErrored) {
+/******/ if (!error) error = err;
+/******/ }
+/******/ }
+/******/ }
+/******/ }
+/******/ }
+/******/ }
+/******/
+/******/ // Load self accepted modules
+/******/ for (i = 0; i < outdatedSelfAcceptedModules.length; i++) {
+/******/ var item = outdatedSelfAcceptedModules[i];
+/******/ moduleId = item.module;
+/******/ hotCurrentParents = [moduleId];
+/******/ try {
+/******/ __webpack_require__(moduleId);
+/******/ } catch (err) {
+/******/ if (typeof item.errorHandler === "function") {
+/******/ try {
+/******/ item.errorHandler(err);
+/******/ } catch (err2) {
+/******/ if (options.onErrored) {
+/******/ options.onErrored({
+/******/ type: "self-accept-error-handler-errored",
+/******/ moduleId: moduleId,
+/******/ error: err2,
+/******/ originalError: err
+/******/ });
+/******/ }
+/******/ if (!options.ignoreErrored) {
+/******/ if (!error) error = err2;
+/******/ }
+/******/ if (!error) error = err;
+/******/ }
+/******/ } else {
+/******/ if (options.onErrored) {
+/******/ options.onErrored({
+/******/ type: "self-accept-errored",
+/******/ moduleId: moduleId,
+/******/ error: err
+/******/ });
+/******/ }
+/******/ if (!options.ignoreErrored) {
+/******/ if (!error) error = err;
+/******/ }
+/******/ }
+/******/ }
+/******/ }
+/******/
+/******/ // handle errors in accept handlers and self accepted module load
+/******/ if (error) {
+/******/ hotSetStatus("fail");
+/******/ return Promise.reject(error);
+/******/ }
+/******/
+/******/ hotSetStatus("idle");
+/******/ return new Promise(function(resolve) {
+/******/ resolve(outdatedModules);
+/******/ });
+/******/ }
+/******/
+/******/ // The module cache
+/******/ var installedModules = {};
+/******/
+/******/ // The require function
+/******/ function __webpack_require__(moduleId) {
+/******/
+/******/ // Check if module is in cache
+/******/ if(installedModules[moduleId]) {
+/******/ return installedModules[moduleId].exports;
+/******/ }
+/******/ // Create a new module (and put it into the cache)
+/******/ var module = installedModules[moduleId] = {
+/******/ i: moduleId,
+/******/ l: false,
+/******/ exports: {},
+/******/ hot: hotCreateModule(moduleId),
+/******/ parents: (hotCurrentParentsTemp = hotCurrentParents, hotCurrentParents = [], hotCurrentParentsTemp),
+/******/ children: []
+/******/ };
+/******/
+/******/ // Execute the module function
+/******/ modules[moduleId].call(module.exports, module, module.exports, hotCreateRequire(moduleId));
+/******/
+/******/ // Flag the module as loaded
+/******/ module.l = true;
+/******/
+/******/ // Return the exports of the module
+/******/ return module.exports;
+/******/ }
+/******/
+/******/
+/******/ // expose the modules object (__webpack_modules__)
+/******/ __webpack_require__.m = modules;
+/******/
+/******/ // expose the module cache
+/******/ __webpack_require__.c = installedModules;
+/******/
+/******/ // define getter function for harmony exports
+/******/ __webpack_require__.d = function(exports, name, getter) {
+/******/ if(!__webpack_require__.o(exports, name)) {
+/******/ Object.defineProperty(exports, name, { enumerable: true, get: getter });
+/******/ }
+/******/ };
+/******/
+/******/ // define __esModule on exports
+/******/ __webpack_require__.r = function(exports) {
+/******/ if(typeof Symbol !== 'undefined' && Symbol.toStringTag) {
+/******/ Object.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });
+/******/ }
+/******/ Object.defineProperty(exports, '__esModule', { value: true });
+/******/ };
+/******/
+/******/ // create a fake namespace object
+/******/ // mode & 1: value is a module id, require it
+/******/ // mode & 2: merge all properties of value into the ns
+/******/ // mode & 4: return value when already ns object
+/******/ // mode & 8|1: behave like require
+/******/ __webpack_require__.t = function(value, mode) {
+/******/ if(mode & 1) value = __webpack_require__(value);
+/******/ if(mode & 8) return value;
+/******/ if((mode & 4) && typeof value === 'object' && value && value.__esModule) return value;
+/******/ var ns = Object.create(null);
+/******/ __webpack_require__.r(ns);
+/******/ Object.defineProperty(ns, 'default', { enumerable: true, value: value });
+/******/ if(mode & 2 && typeof value != 'string') for(var key in value) __webpack_require__.d(ns, key, function(key) { return value[key]; }.bind(null, key));
+/******/ return ns;
+/******/ };
+/******/
+/******/ // getDefaultExport function for compatibility with non-harmony modules
+/******/ __webpack_require__.n = function(module) {
+/******/ var getter = module && module.__esModule ?
+/******/ function getDefault() { return module['default']; } :
+/******/ function getModuleExports() { return module; };
+/******/ __webpack_require__.d(getter, 'a', getter);
+/******/ return getter;
+/******/ };
+/******/
+/******/ // Object.prototype.hasOwnProperty.call
+/******/ __webpack_require__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); };
+/******/
+/******/ // __webpack_public_path__
+/******/ __webpack_require__.p = "";
+/******/
+/******/ // __webpack_hash__
+/******/ __webpack_require__.h = function() { return hotCurrentHash; };
+/******/
+/******/
+/******/ // Load entry module and return exports
+/******/ return hotCreateRequire("./index.js")(__webpack_require__.s = "./index.js");
+/******/ })
+/************************************************************************/
+/******/ ({
+
+/***/ "./canvasToPixel.js":
+/*!**************************!*\
+ !*** ./canvasToPixel.js ***!
+ \**************************/
+/*! exports provided: default */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+__webpack_require__.r(__webpack_exports__);
+/* harmony import */ var _enabledElements_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./enabledElements.js */ "./enabledElements.js");
+/* harmony import */ var _internal_getTransform_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./internal/getTransform.js */ "./internal/getTransform.js");
+
+
+/**
+ * Converts a point in the canvas coordinate system to the pixel coordinate system
+ * system. This can be used to reset tools' image coordinates after modifications
+ * have been made in canvas space (e.g. moving a tool by a few cm, independent of
+ * image resolution).
+ *
+ * @param {HTMLElement} element The Cornerstone element within which the input point lies
+ * @param {{x: Number, y: Number}} pt The input point in the canvas coordinate system
+ *
+ * @returns {{x: Number, y: Number}} The transformed point in the pixel coordinate system
+ * @memberof PixelCoordinateSystem
+ */
+
+/* harmony default export */ __webpack_exports__["default"] = (function (element, pt) {
+ var enabledElement = Object(_enabledElements_js__WEBPACK_IMPORTED_MODULE_0__["getEnabledElement"])(element);
+ var transform = Object(_internal_getTransform_js__WEBPACK_IMPORTED_MODULE_1__["default"])(enabledElement);
+ transform.invert();
+ return transform.transformPoint(pt.x, pt.y);
+});
+
+/***/ }),
+
+/***/ "./colors/colormap.js":
+/*!****************************!*\
+ !*** ./colors/colormap.js ***!
+ \****************************/
+/*! exports provided: getColormapsList, getColormap */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+__webpack_require__.r(__webpack_exports__);
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "getColormapsList", function() { return getColormapsList; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "getColormap", function() { return getColormap; });
+/* harmony import */ var _lookupTable_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./lookupTable.js */ "./colors/lookupTable.js");
+
+var COLOR_TRANSPARENT = [0, 0, 0, 0]; // Colormaps
+//
+// Hot Iron, PET, Hot Metal Blue and PET 20 Step are color palettes
+// Defined by the DICOM standard
+// http://dicom.nema.org/dicom/2013/output/chtml/part06/chapter_B.html
+//
+// All Linear Segmented Colormaps were copied from matplotlib
+// https://github.com/stefanv/matplotlib/blob/master/lib/matplotlib/_cm.py
+
+var colormapsData = {
+ hotIron: {
+ name: 'Hot Iron',
+ numOfColors: 256,
+ colors: [[0, 0, 0, 255], [2, 0, 0, 255], [4, 0, 0, 255], [6, 0, 0, 255], [8, 0, 0, 255], [10, 0, 0, 255], [12, 0, 0, 255], [14, 0, 0, 255], [16, 0, 0, 255], [18, 0, 0, 255], [20, 0, 0, 255], [22, 0, 0, 255], [24, 0, 0, 255], [26, 0, 0, 255], [28, 0, 0, 255], [30, 0, 0, 255], [32, 0, 0, 255], [34, 0, 0, 255], [36, 0, 0, 255], [38, 0, 0, 255], [40, 0, 0, 255], [42, 0, 0, 255], [44, 0, 0, 255], [46, 0, 0, 255], [48, 0, 0, 255], [50, 0, 0, 255], [52, 0, 0, 255], [54, 0, 0, 255], [56, 0, 0, 255], [58, 0, 0, 255], [60, 0, 0, 255], [62, 0, 0, 255], [64, 0, 0, 255], [66, 0, 0, 255], [68, 0, 0, 255], [70, 0, 0, 255], [72, 0, 0, 255], [74, 0, 0, 255], [76, 0, 0, 255], [78, 0, 0, 255], [80, 0, 0, 255], [82, 0, 0, 255], [84, 0, 0, 255], [86, 0, 0, 255], [88, 0, 0, 255], [90, 0, 0, 255], [92, 0, 0, 255], [94, 0, 0, 255], [96, 0, 0, 255], [98, 0, 0, 255], [100, 0, 0, 255], [102, 0, 0, 255], [104, 0, 0, 255], [106, 0, 0, 255], [108, 0, 0, 255], [110, 0, 0, 255], [112, 0, 0, 255], [114, 0, 0, 255], [116, 0, 0, 255], [118, 0, 0, 255], [120, 0, 0, 255], [122, 0, 0, 255], [124, 0, 0, 255], [126, 0, 0, 255], [128, 0, 0, 255], [130, 0, 0, 255], [132, 0, 0, 255], [134, 0, 0, 255], [136, 0, 0, 255], [138, 0, 0, 255], [140, 0, 0, 255], [142, 0, 0, 255], [144, 0, 0, 255], [146, 0, 0, 255], [148, 0, 0, 255], [150, 0, 0, 255], [152, 0, 0, 255], [154, 0, 0, 255], [156, 0, 0, 255], [158, 0, 0, 255], [160, 0, 0, 255], [162, 0, 0, 255], [164, 0, 0, 255], [166, 0, 0, 255], [168, 0, 0, 255], [170, 0, 0, 255], [172, 0, 0, 255], [174, 0, 0, 255], [176, 0, 0, 255], [178, 0, 0, 255], [180, 0, 0, 255], [182, 0, 0, 255], [184, 0, 0, 255], [186, 0, 0, 255], [188, 0, 0, 255], [190, 0, 0, 255], [192, 0, 0, 255], [194, 0, 0, 255], [196, 0, 0, 255], [198, 0, 0, 255], [200, 0, 0, 255], [202, 0, 0, 255], [204, 0, 0, 255], [206, 0, 0, 255], [208, 0, 0, 255], [210, 0, 0, 255], [212, 0, 0, 255], [214, 0, 0, 255], [216, 0, 0, 255], [218, 0, 0, 255], [220, 0, 0, 255], [222, 0, 0, 255], [224, 0, 0, 255], [226, 0, 0, 255], [228, 0, 0, 255], [230, 0, 0, 255], [232, 0, 0, 255], [234, 0, 0, 255], [236, 0, 0, 255], [238, 0, 0, 255], [240, 0, 0, 255], [242, 0, 0, 255], [244, 0, 0, 255], [246, 0, 0, 255], [248, 0, 0, 255], [250, 0, 0, 255], [252, 0, 0, 255], [254, 0, 0, 255], [255, 0, 0, 255], [255, 2, 0, 255], [255, 4, 0, 255], [255, 6, 0, 255], [255, 8, 0, 255], [255, 10, 0, 255], [255, 12, 0, 255], [255, 14, 0, 255], [255, 16, 0, 255], [255, 18, 0, 255], [255, 20, 0, 255], [255, 22, 0, 255], [255, 24, 0, 255], [255, 26, 0, 255], [255, 28, 0, 255], [255, 30, 0, 255], [255, 32, 0, 255], [255, 34, 0, 255], [255, 36, 0, 255], [255, 38, 0, 255], [255, 40, 0, 255], [255, 42, 0, 255], [255, 44, 0, 255], [255, 46, 0, 255], [255, 48, 0, 255], [255, 50, 0, 255], [255, 52, 0, 255], [255, 54, 0, 255], [255, 56, 0, 255], [255, 58, 0, 255], [255, 60, 0, 255], [255, 62, 0, 255], [255, 64, 0, 255], [255, 66, 0, 255], [255, 68, 0, 255], [255, 70, 0, 255], [255, 72, 0, 255], [255, 74, 0, 255], [255, 76, 0, 255], [255, 78, 0, 255], [255, 80, 0, 255], [255, 82, 0, 255], [255, 84, 0, 255], [255, 86, 0, 255], [255, 88, 0, 255], [255, 90, 0, 255], [255, 92, 0, 255], [255, 94, 0, 255], [255, 96, 0, 255], [255, 98, 0, 255], [255, 100, 0, 255], [255, 102, 0, 255], [255, 104, 0, 255], [255, 106, 0, 255], [255, 108, 0, 255], [255, 110, 0, 255], [255, 112, 0, 255], [255, 114, 0, 255], [255, 116, 0, 255], [255, 118, 0, 255], [255, 120, 0, 255], [255, 122, 0, 255], [255, 124, 0, 255], [255, 126, 0, 255], [255, 128, 4, 255], [255, 130, 8, 255], [255, 132, 12, 255], [255, 134, 16, 255], [255, 136, 20, 255], [255, 138, 24, 255], [255, 140, 28, 255], [255, 142, 32, 255], [255, 144, 36, 255], [255, 146, 40, 255], [255, 148, 44, 255], [255, 150, 48, 255], [255, 152, 52, 255], [255, 154, 56, 255], [255, 156, 60, 255], [255, 158, 64, 255], [255, 160, 68, 255], [255, 162, 72, 255], [255, 164, 76, 255], [255, 166, 80, 255], [255, 168, 84, 255], [255, 170, 88, 255], [255, 172, 92, 255], [255, 174, 96, 255], [255, 176, 100, 255], [255, 178, 104, 255], [255, 180, 108, 255], [255, 182, 112, 255], [255, 184, 116, 255], [255, 186, 120, 255], [255, 188, 124, 255], [255, 190, 128, 255], [255, 192, 132, 255], [255, 194, 136, 255], [255, 196, 140, 255], [255, 198, 144, 255], [255, 200, 148, 255], [255, 202, 152, 255], [255, 204, 156, 255], [255, 206, 160, 255], [255, 208, 164, 255], [255, 210, 168, 255], [255, 212, 172, 255], [255, 214, 176, 255], [255, 216, 180, 255], [255, 218, 184, 255], [255, 220, 188, 255], [255, 222, 192, 255], [255, 224, 196, 255], [255, 226, 200, 255], [255, 228, 204, 255], [255, 230, 208, 255], [255, 232, 212, 255], [255, 234, 216, 255], [255, 236, 220, 255], [255, 238, 224, 255], [255, 240, 228, 255], [255, 242, 232, 255], [255, 244, 236, 255], [255, 246, 240, 255], [255, 248, 244, 255], [255, 250, 248, 255], [255, 252, 252, 255], [255, 255, 255, 255]]
+ },
+ pet: {
+ name: 'PET',
+ numColors: 256,
+ colors: [[0, 0, 0, 255], [0, 2, 1, 255], [0, 4, 3, 255], [0, 6, 5, 255], [0, 8, 7, 255], [0, 10, 9, 255], [0, 12, 11, 255], [0, 14, 13, 255], [0, 16, 15, 255], [0, 18, 17, 255], [0, 20, 19, 255], [0, 22, 21, 255], [0, 24, 23, 255], [0, 26, 25, 255], [0, 28, 27, 255], [0, 30, 29, 255], [0, 32, 31, 255], [0, 34, 33, 255], [0, 36, 35, 255], [0, 38, 37, 255], [0, 40, 39, 255], [0, 42, 41, 255], [0, 44, 43, 255], [0, 46, 45, 255], [0, 48, 47, 255], [0, 50, 49, 255], [0, 52, 51, 255], [0, 54, 53, 255], [0, 56, 55, 255], [0, 58, 57, 255], [0, 60, 59, 255], [0, 62, 61, 255], [0, 65, 63, 255], [0, 67, 65, 255], [0, 69, 67, 255], [0, 71, 69, 255], [0, 73, 71, 255], [0, 75, 73, 255], [0, 77, 75, 255], [0, 79, 77, 255], [0, 81, 79, 255], [0, 83, 81, 255], [0, 85, 83, 255], [0, 87, 85, 255], [0, 89, 87, 255], [0, 91, 89, 255], [0, 93, 91, 255], [0, 95, 93, 255], [0, 97, 95, 255], [0, 99, 97, 255], [0, 101, 99, 255], [0, 103, 101, 255], [0, 105, 103, 255], [0, 107, 105, 255], [0, 109, 107, 255], [0, 111, 109, 255], [0, 113, 111, 255], [0, 115, 113, 255], [0, 117, 115, 255], [0, 119, 117, 255], [0, 121, 119, 255], [0, 123, 121, 255], [0, 125, 123, 255], [0, 128, 125, 255], [1, 126, 127, 255], [3, 124, 129, 255], [5, 122, 131, 255], [7, 120, 133, 255], [9, 118, 135, 255], [11, 116, 137, 255], [13, 114, 139, 255], [15, 112, 141, 255], [17, 110, 143, 255], [19, 108, 145, 255], [21, 106, 147, 255], [23, 104, 149, 255], [25, 102, 151, 255], [27, 100, 153, 255], [29, 98, 155, 255], [31, 96, 157, 255], [33, 94, 159, 255], [35, 92, 161, 255], [37, 90, 163, 255], [39, 88, 165, 255], [41, 86, 167, 255], [43, 84, 169, 255], [45, 82, 171, 255], [47, 80, 173, 255], [49, 78, 175, 255], [51, 76, 177, 255], [53, 74, 179, 255], [55, 72, 181, 255], [57, 70, 183, 255], [59, 68, 185, 255], [61, 66, 187, 255], [63, 64, 189, 255], [65, 63, 191, 255], [67, 61, 193, 255], [69, 59, 195, 255], [71, 57, 197, 255], [73, 55, 199, 255], [75, 53, 201, 255], [77, 51, 203, 255], [79, 49, 205, 255], [81, 47, 207, 255], [83, 45, 209, 255], [85, 43, 211, 255], [86, 41, 213, 255], [88, 39, 215, 255], [90, 37, 217, 255], [92, 35, 219, 255], [94, 33, 221, 255], [96, 31, 223, 255], [98, 29, 225, 255], [100, 27, 227, 255], [102, 25, 229, 255], [104, 23, 231, 255], [106, 21, 233, 255], [108, 19, 235, 255], [110, 17, 237, 255], [112, 15, 239, 255], [114, 13, 241, 255], [116, 11, 243, 255], [118, 9, 245, 255], [120, 7, 247, 255], [122, 5, 249, 255], [124, 3, 251, 255], [126, 1, 253, 255], [128, 0, 255, 255], [130, 2, 252, 255], [132, 4, 248, 255], [134, 6, 244, 255], [136, 8, 240, 255], [138, 10, 236, 255], [140, 12, 232, 255], [142, 14, 228, 255], [144, 16, 224, 255], [146, 18, 220, 255], [148, 20, 216, 255], [150, 22, 212, 255], [152, 24, 208, 255], [154, 26, 204, 255], [156, 28, 200, 255], [158, 30, 196, 255], [160, 32, 192, 255], [162, 34, 188, 255], [164, 36, 184, 255], [166, 38, 180, 255], [168, 40, 176, 255], [170, 42, 172, 255], [171, 44, 168, 255], [173, 46, 164, 255], [175, 48, 160, 255], [177, 50, 156, 255], [179, 52, 152, 255], [181, 54, 148, 255], [183, 56, 144, 255], [185, 58, 140, 255], [187, 60, 136, 255], [189, 62, 132, 255], [191, 64, 128, 255], [193, 66, 124, 255], [195, 68, 120, 255], [197, 70, 116, 255], [199, 72, 112, 255], [201, 74, 108, 255], [203, 76, 104, 255], [205, 78, 100, 255], [207, 80, 96, 255], [209, 82, 92, 255], [211, 84, 88, 255], [213, 86, 84, 255], [215, 88, 80, 255], [217, 90, 76, 255], [219, 92, 72, 255], [221, 94, 68, 255], [223, 96, 64, 255], [225, 98, 60, 255], [227, 100, 56, 255], [229, 102, 52, 255], [231, 104, 48, 255], [233, 106, 44, 255], [235, 108, 40, 255], [237, 110, 36, 255], [239, 112, 32, 255], [241, 114, 28, 255], [243, 116, 24, 255], [245, 118, 20, 255], [247, 120, 16, 255], [249, 122, 12, 255], [251, 124, 8, 255], [253, 126, 4, 255], [255, 128, 0, 255], [255, 130, 4, 255], [255, 132, 8, 255], [255, 134, 12, 255], [255, 136, 16, 255], [255, 138, 20, 255], [255, 140, 24, 255], [255, 142, 28, 255], [255, 144, 32, 255], [255, 146, 36, 255], [255, 148, 40, 255], [255, 150, 44, 255], [255, 152, 48, 255], [255, 154, 52, 255], [255, 156, 56, 255], [255, 158, 60, 255], [255, 160, 64, 255], [255, 162, 68, 255], [255, 164, 72, 255], [255, 166, 76, 255], [255, 168, 80, 255], [255, 170, 85, 255], [255, 172, 89, 255], [255, 174, 93, 255], [255, 176, 97, 255], [255, 178, 101, 255], [255, 180, 105, 255], [255, 182, 109, 255], [255, 184, 113, 255], [255, 186, 117, 255], [255, 188, 121, 255], [255, 190, 125, 255], [255, 192, 129, 255], [255, 194, 133, 255], [255, 196, 137, 255], [255, 198, 141, 255], [255, 200, 145, 255], [255, 202, 149, 255], [255, 204, 153, 255], [255, 206, 157, 255], [255, 208, 161, 255], [255, 210, 165, 255], [255, 212, 170, 255], [255, 214, 174, 255], [255, 216, 178, 255], [255, 218, 182, 255], [255, 220, 186, 255], [255, 222, 190, 255], [255, 224, 194, 255], [255, 226, 198, 255], [255, 228, 202, 255], [255, 230, 206, 255], [255, 232, 210, 255], [255, 234, 214, 255], [255, 236, 218, 255], [255, 238, 222, 255], [255, 240, 226, 255], [255, 242, 230, 255], [255, 244, 234, 255], [255, 246, 238, 255], [255, 248, 242, 255], [255, 250, 246, 255], [255, 252, 250, 255], [255, 255, 255, 255]]
+ },
+ hotMetalBlue: {
+ name: 'Hot Metal Blue',
+ numColors: 256,
+ colors: [[0, 0, 0, 255], [0, 0, 2, 255], [0, 0, 4, 255], [0, 0, 6, 255], [0, 0, 8, 255], [0, 0, 10, 255], [0, 0, 12, 255], [0, 0, 14, 255], [0, 0, 16, 255], [0, 0, 17, 255], [0, 0, 19, 255], [0, 0, 21, 255], [0, 0, 23, 255], [0, 0, 25, 255], [0, 0, 27, 255], [0, 0, 29, 255], [0, 0, 31, 255], [0, 0, 33, 255], [0, 0, 35, 255], [0, 0, 37, 255], [0, 0, 39, 255], [0, 0, 41, 255], [0, 0, 43, 255], [0, 0, 45, 255], [0, 0, 47, 255], [0, 0, 49, 255], [0, 0, 51, 255], [0, 0, 53, 255], [0, 0, 55, 255], [0, 0, 57, 255], [0, 0, 59, 255], [0, 0, 61, 255], [0, 0, 63, 255], [0, 0, 65, 255], [0, 0, 67, 255], [0, 0, 69, 255], [0, 0, 71, 255], [0, 0, 73, 255], [0, 0, 75, 255], [0, 0, 77, 255], [0, 0, 79, 255], [0, 0, 81, 255], [0, 0, 83, 255], [0, 0, 84, 255], [0, 0, 86, 255], [0, 0, 88, 255], [0, 0, 90, 255], [0, 0, 92, 255], [0, 0, 94, 255], [0, 0, 96, 255], [0, 0, 98, 255], [0, 0, 100, 255], [0, 0, 102, 255], [0, 0, 104, 255], [0, 0, 106, 255], [0, 0, 108, 255], [0, 0, 110, 255], [0, 0, 112, 255], [0, 0, 114, 255], [0, 0, 116, 255], [0, 0, 117, 255], [0, 0, 119, 255], [0, 0, 121, 255], [0, 0, 123, 255], [0, 0, 125, 255], [0, 0, 127, 255], [0, 0, 129, 255], [0, 0, 131, 255], [0, 0, 133, 255], [0, 0, 135, 255], [0, 0, 137, 255], [0, 0, 139, 255], [0, 0, 141, 255], [0, 0, 143, 255], [0, 0, 145, 255], [0, 0, 147, 255], [0, 0, 149, 255], [0, 0, 151, 255], [0, 0, 153, 255], [0, 0, 155, 255], [0, 0, 157, 255], [0, 0, 159, 255], [0, 0, 161, 255], [0, 0, 163, 255], [0, 0, 165, 255], [0, 0, 167, 255], [3, 0, 169, 255], [6, 0, 171, 255], [9, 0, 173, 255], [12, 0, 175, 255], [15, 0, 177, 255], [18, 0, 179, 255], [21, 0, 181, 255], [24, 0, 183, 255], [26, 0, 184, 255], [29, 0, 186, 255], [32, 0, 188, 255], [35, 0, 190, 255], [38, 0, 192, 255], [41, 0, 194, 255], [44, 0, 196, 255], [47, 0, 198, 255], [50, 0, 200, 255], [52, 0, 197, 255], [55, 0, 194, 255], [57, 0, 191, 255], [59, 0, 188, 255], [62, 0, 185, 255], [64, 0, 182, 255], [66, 0, 179, 255], [69, 0, 176, 255], [71, 0, 174, 255], [74, 0, 171, 255], [76, 0, 168, 255], [78, 0, 165, 255], [81, 0, 162, 255], [83, 0, 159, 255], [85, 0, 156, 255], [88, 0, 153, 255], [90, 0, 150, 255], [93, 2, 144, 255], [96, 4, 138, 255], [99, 6, 132, 255], [102, 8, 126, 255], [105, 9, 121, 255], [108, 11, 115, 255], [111, 13, 109, 255], [114, 15, 103, 255], [116, 17, 97, 255], [119, 19, 91, 255], [122, 21, 85, 255], [125, 23, 79, 255], [128, 24, 74, 255], [131, 26, 68, 255], [134, 28, 62, 255], [137, 30, 56, 255], [140, 32, 50, 255], [143, 34, 47, 255], [146, 36, 44, 255], [149, 38, 41, 255], [152, 40, 38, 255], [155, 41, 35, 255], [158, 43, 32, 255], [161, 45, 29, 255], [164, 47, 26, 255], [166, 49, 24, 255], [169, 51, 21, 255], [172, 53, 18, 255], [175, 55, 15, 255], [178, 56, 12, 255], [181, 58, 9, 255], [184, 60, 6, 255], [187, 62, 3, 255], [190, 64, 0, 255], [194, 66, 0, 255], [198, 68, 0, 255], [201, 70, 0, 255], [205, 72, 0, 255], [209, 73, 0, 255], [213, 75, 0, 255], [217, 77, 0, 255], [221, 79, 0, 255], [224, 81, 0, 255], [228, 83, 0, 255], [232, 85, 0, 255], [236, 87, 0, 255], [240, 88, 0, 255], [244, 90, 0, 255], [247, 92, 0, 255], [251, 94, 0, 255], [255, 96, 0, 255], [255, 98, 3, 255], [255, 100, 6, 255], [255, 102, 9, 255], [255, 104, 12, 255], [255, 105, 15, 255], [255, 107, 18, 255], [255, 109, 21, 255], [255, 111, 24, 255], [255, 113, 26, 255], [255, 115, 29, 255], [255, 117, 32, 255], [255, 119, 35, 255], [255, 120, 38, 255], [255, 122, 41, 255], [255, 124, 44, 255], [255, 126, 47, 255], [255, 128, 50, 255], [255, 130, 53, 255], [255, 132, 56, 255], [255, 134, 59, 255], [255, 136, 62, 255], [255, 137, 65, 255], [255, 139, 68, 255], [255, 141, 71, 255], [255, 143, 74, 255], [255, 145, 76, 255], [255, 147, 79, 255], [255, 149, 82, 255], [255, 151, 85, 255], [255, 152, 88, 255], [255, 154, 91, 255], [255, 156, 94, 255], [255, 158, 97, 255], [255, 160, 100, 255], [255, 162, 103, 255], [255, 164, 106, 255], [255, 166, 109, 255], [255, 168, 112, 255], [255, 169, 115, 255], [255, 171, 118, 255], [255, 173, 121, 255], [255, 175, 124, 255], [255, 177, 126, 255], [255, 179, 129, 255], [255, 181, 132, 255], [255, 183, 135, 255], [255, 184, 138, 255], [255, 186, 141, 255], [255, 188, 144, 255], [255, 190, 147, 255], [255, 192, 150, 255], [255, 194, 153, 255], [255, 196, 156, 255], [255, 198, 159, 255], [255, 200, 162, 255], [255, 201, 165, 255], [255, 203, 168, 255], [255, 205, 171, 255], [255, 207, 174, 255], [255, 209, 176, 255], [255, 211, 179, 255], [255, 213, 182, 255], [255, 215, 185, 255], [255, 216, 188, 255], [255, 218, 191, 255], [255, 220, 194, 255], [255, 222, 197, 255], [255, 224, 200, 255], [255, 226, 203, 255], [255, 228, 206, 255], [255, 229, 210, 255], [255, 231, 213, 255], [255, 233, 216, 255], [255, 235, 219, 255], [255, 237, 223, 255], [255, 239, 226, 255], [255, 240, 229, 255], [255, 242, 232, 255], [255, 244, 236, 255], [255, 246, 239, 255], [255, 248, 242, 255], [255, 250, 245, 255], [255, 251, 249, 255], [255, 253, 252, 255], [255, 255, 255, 255]]
+ },
+ pet20Step: {
+ name: 'PET 20 Step',
+ numColors: 256,
+ colors: [[0, 0, 0, 255], [0, 0, 0, 255], [0, 0, 0, 255], [0, 0, 0, 255], [0, 0, 0, 255], [0, 0, 0, 255], [0, 0, 0, 255], [0, 0, 0, 255], [0, 0, 0, 255], [0, 0, 0, 255], [0, 0, 0, 255], [0, 0, 0, 255], [0, 0, 0, 255], [96, 0, 80, 255], [96, 0, 80, 255], [96, 0, 80, 255], [96, 0, 80, 255], [96, 0, 80, 255], [96, 0, 80, 255], [96, 0, 80, 255], [96, 0, 80, 255], [96, 0, 80, 255], [96, 0, 80, 255], [96, 0, 80, 255], [96, 0, 80, 255], [96, 0, 80, 255], [48, 48, 80, 255], [48, 48, 80, 255], [48, 48, 80, 255], [48, 48, 80, 255], [48, 48, 80, 255], [48, 48, 80, 255], [48, 48, 80, 255], [48, 48, 80, 255], [48, 48, 80, 255], [48, 48, 80, 255], [48, 48, 80, 255], [48, 48, 80, 255], [48, 48, 80, 255], [48, 48, 112, 255], [48, 48, 112, 255], [48, 48, 112, 255], [48, 48, 112, 255], [48, 48, 112, 255], [48, 48, 112, 255], [48, 48, 112, 255], [48, 48, 112, 255], [48, 48, 112, 255], [48, 48, 112, 255], [48, 48, 112, 255], [48, 48, 112, 255], [80, 80, 128, 255], [80, 80, 128, 255], [80, 80, 128, 255], [80, 80, 128, 255], [80, 80, 128, 255], [80, 80, 128, 255], [80, 80, 128, 255], [80, 80, 128, 255], [80, 80, 128, 255], [80, 80, 128, 255], [80, 80, 128, 255], [80, 80, 128, 255], [80, 80, 128, 255], [96, 96, 176, 255], [96, 96, 176, 255], [96, 96, 176, 255], [96, 96, 176, 255], [96, 96, 176, 255], [96, 96, 176, 255], [96, 96, 176, 255], [96, 96, 176, 255], [96, 96, 176, 255], [96, 96, 176, 255], [96, 96, 176, 255], [96, 96, 176, 255], [96, 96, 176, 255], [112, 112, 192, 255], [112, 112, 192, 255], [112, 112, 192, 255], [112, 112, 192, 255], [112, 112, 192, 255], [112, 112, 192, 255], [112, 112, 192, 255], [112, 112, 192, 255], [112, 112, 192, 255], [112, 112, 192, 255], [112, 112, 192, 255], [112, 112, 192, 255], [112, 112, 192, 255], [128, 128, 224, 255], [128, 128, 224, 255], [128, 128, 224, 255], [128, 128, 224, 255], [128, 128, 224, 255], [128, 128, 224, 255], [128, 128, 224, 255], [128, 128, 224, 255], [128, 128, 224, 255], [128, 128, 224, 255], [128, 128, 224, 255], [128, 128, 224, 255], [48, 96, 48, 255], [48, 96, 48, 255], [48, 96, 48, 255], [48, 96, 48, 255], [48, 96, 48, 255], [48, 96, 48, 255], [48, 96, 48, 255], [48, 96, 48, 255], [48, 96, 48, 255], [48, 96, 48, 255], [48, 96, 48, 255], [48, 96, 48, 255], [48, 96, 48, 255], [48, 144, 48, 255], [48, 144, 48, 255], [48, 144, 48, 255], [48, 144, 48, 255], [48, 144, 48, 255], [48, 144, 48, 255], [48, 144, 48, 255], [48, 144, 48, 255], [48, 144, 48, 255], [48, 144, 48, 255], [48, 144, 48, 255], [48, 144, 48, 255], [48, 144, 48, 255], [80, 192, 80, 255], [80, 192, 80, 255], [80, 192, 80, 255], [80, 192, 80, 255], [80, 192, 80, 255], [80, 192, 80, 255], [80, 192, 80, 255], [80, 192, 80, 255], [80, 192, 80, 255], [80, 192, 80, 255], [80, 192, 80, 255], [80, 192, 80, 255], [80, 192, 80, 255], [64, 224, 64, 255], [64, 224, 64, 255], [64, 224, 64, 255], [64, 224, 64, 255], [64, 224, 64, 255], [64, 224, 64, 255], [64, 224, 64, 255], [64, 224, 64, 255], [64, 224, 64, 255], [64, 224, 64, 255], [64, 224, 64, 255], [64, 224, 64, 255], [224, 224, 80, 255], [224, 224, 80, 255], [224, 224, 80, 255], [224, 224, 80, 255], [224, 224, 80, 255], [224, 224, 80, 255], [224, 224, 80, 255], [224, 224, 80, 255], [224, 224, 80, 255], [224, 224, 80, 255], [224, 224, 80, 255], [224, 224, 80, 255], [224, 224, 80, 255], [208, 208, 96, 255], [208, 208, 96, 255], [208, 208, 96, 255], [208, 208, 96, 255], [208, 208, 96, 255], [208, 208, 96, 255], [208, 208, 96, 255], [208, 208, 96, 255], [208, 208, 96, 255], [208, 208, 96, 255], [208, 208, 96, 255], [208, 208, 96, 255], [208, 208, 96, 255], [208, 176, 64, 255], [208, 176, 64, 255], [208, 176, 64, 255], [208, 176, 64, 255], [208, 176, 64, 255], [208, 176, 64, 255], [208, 176, 64, 255], [208, 176, 64, 255], [208, 176, 64, 255], [208, 176, 64, 255], [208, 176, 64, 255], [208, 176, 64, 255], [208, 176, 64, 255], [208, 144, 0, 255], [208, 144, 0, 255], [208, 144, 0, 255], [208, 144, 0, 255], [208, 144, 0, 255], [208, 144, 0, 255], [208, 144, 0, 255], [208, 144, 0, 255], [208, 144, 0, 255], [208, 144, 0, 255], [208, 144, 0, 255], [208, 144, 0, 255], [192, 96, 0, 255], [192, 96, 0, 255], [192, 96, 0, 255], [192, 96, 0, 255], [192, 96, 0, 255], [192, 96, 0, 255], [192, 96, 0, 255], [192, 96, 0, 255], [192, 96, 0, 255], [192, 96, 0, 255], [192, 96, 0, 255], [192, 96, 0, 255], [192, 96, 0, 255], [176, 48, 0, 255], [176, 48, 0, 255], [176, 48, 0, 255], [176, 48, 0, 255], [176, 48, 0, 255], [176, 48, 0, 255], [176, 48, 0, 255], [176, 48, 0, 255], [176, 48, 0, 255], [176, 48, 0, 255], [176, 48, 0, 255], [176, 48, 0, 255], [176, 48, 0, 255], [255, 0, 0, 255], [255, 0, 0, 255], [255, 0, 0, 255], [255, 0, 0, 255], [255, 0, 0, 255], [255, 0, 0, 255], [255, 0, 0, 255], [255, 0, 0, 255], [255, 0, 0, 255], [255, 0, 0, 255], [255, 0, 0, 255], [255, 0, 0, 255], [255, 0, 0, 255], [255, 255, 255, 255], [255, 255, 255, 255], [255, 255, 255, 255], [255, 255, 255, 255], [255, 255, 255, 255], [255, 255, 255, 255], [255, 255, 255, 255], [255, 255, 255, 255], [255, 255, 255, 255], [255, 255, 255, 255], [255, 255, 255, 255], [255, 255, 255, 255], [255, 255, 255, 255]]
+ },
+ gray: {
+ name: 'Gray',
+ numColors: 256,
+ gamma: 1,
+ segmentedData: {
+ red: [[0, 0, 0], [1, 1, 1]],
+ green: [[0, 0, 0], [1, 1, 1]],
+ blue: [[0, 0, 0], [1, 1, 1]]
+ }
+ },
+ jet: {
+ name: 'Jet',
+ numColors: 256,
+ gamma: 1,
+ segmentedData: {
+ red: [[0, 0, 0], [0.35, 0, 0], [0.66, 1, 1], [0.89, 1, 1], [1, 0.5, 0.5]],
+ green: [[0, 0, 0], [0.125, 0, 0], [0.375, 1, 1], [0.64, 1, 1], [0.91, 0, 0], [1, 0, 0]],
+ blue: [[0, 0.5, 0.5], [0.11, 1, 1], [0.34, 1, 1], [0.65, 0, 0], [1, 0, 0]]
+ }
+ },
+ hsv: {
+ name: 'HSV',
+ numColors: 256,
+ gamma: 1,
+ segmentedData: {
+ red: [[0, 1, 1], [0.158730, 1, 1], [0.174603, 0.968750, 0.968750], [0.333333, 0.031250, 0.031250], [0.349206, 0, 0], [0.666667, 0, 0], [0.682540, 0.031250, 0.031250], [0.841270, 0.968750, 0.968750], [0.857143, 1, 1], [1, 1, 1]],
+ green: [[0, 0, 0], [0.158730, 0.937500, 0.937500], [0.174603, 1, 1], [0.507937, 1, 1], [0.666667, 0.062500, 0.062500], [0.682540, 0, 0], [1, 0, 0]],
+ blue: [[0, 0, 0], [0.333333, 0, 0], [0.349206, 0.062500, 0.062500], [0.507937, 1, 1], [0.841270, 1, 1], [0.857143, 0.937500, 0.937500], [1, 0.09375, 0.09375]]
+ }
+ },
+ hot: {
+ name: 'Hot',
+ numColors: 256,
+ gamma: 1,
+ segmentedData: {
+ red: [[0, 0.0416, 0.0416], [0.365079, 1, 1], [1, 1, 1]],
+ green: [[0, 0, 0], [0.365079, 0, 0], [0.746032, 1, 1], [1, 1, 1]],
+ blue: [[0, 0, 0], [0.746032, 0, 0], [1, 1, 1]]
+ }
+ },
+ cool: {
+ name: 'Cool',
+ numColors: 256,
+ gamma: 1,
+ segmentedData: {
+ red: [[0, 0, 0], [1, 1, 1]],
+ green: [[0, 1, 1], [1, 0, 0]],
+ blue: [[0, 1, 1], [1, 1, 1]]
+ }
+ },
+ spring: {
+ name: 'Spring',
+ numColors: 256,
+ gamma: 1,
+ segmentedData: {
+ red: [[0, 1, 1], [1, 1, 1]],
+ green: [[0, 0, 0], [1, 1, 1]],
+ blue: [[0, 1, 1], [1, 0, 0]]
+ }
+ },
+ summer: {
+ name: 'Summer',
+ numColors: 256,
+ gamma: 1,
+ segmentedData: {
+ red: [[0, 0, 0], [1, 1, 1]],
+ green: [[0, 0.5, 0.5], [1, 1, 1]],
+ blue: [[0, 0.4, 0.4], [1, 0.4, 0.4]]
+ }
+ },
+ autumn: {
+ name: 'Autumn',
+ numColors: 256,
+ gamma: 1,
+ segmentedData: {
+ red: [[0, 1, 1], [1, 1, 1]],
+ green: [[0, 0, 0], [1, 1, 1]],
+ blue: [[0, 0, 0], [1, 0, 0]]
+ }
+ },
+ winter: {
+ name: 'Winter',
+ numColors: 256,
+ gamma: 1,
+ segmentedData: {
+ red: [[0, 0, 0], [1, 0, 0]],
+ green: [[0, 0, 0], [1, 1, 1]],
+ blue: [[0, 1, 1], [1, 0.5, 0.5]]
+ }
+ },
+ bone: {
+ name: 'Bone',
+ numColors: 256,
+ gamma: 1,
+ segmentedData: {
+ red: [[0, 0, 0], [0.746032, 0.652778, 0.652778], [1, 1, 1]],
+ green: [[0, 0, 0], [0.365079, 0.319444, 0.319444], [0.746032, 0.777778, 0.777778], [1, 1, 1]],
+ blue: [[0, 0, 0], [0.365079, 0.444444, 0.444444], [1, 1, 1]]
+ }
+ },
+ copper: {
+ name: 'Copper',
+ numColors: 256,
+ gamma: 1,
+ segmentedData: {
+ red: [[0, 0, 0], [0.809524, 1, 1], [1, 1, 1]],
+ green: [[0, 0, 0], [1, 0.7812, 0.7812]],
+ blue: [[0, 0, 0], [1, 0.4975, 0.4975]]
+ }
+ },
+ spectral: {
+ name: 'Spectral',
+ numColors: 256,
+ gamma: 1,
+ segmentedData: {
+ red: [[0, 0, 0], [0.05, 0.4667, 0.4667], [0.10, 0.5333, 0.5333], [0.15, 0, 0], [0.20, 0, 0], [0.25, 0, 0], [0.30, 0, 0], [0.35, 0, 0], [0.40, 0, 0], [0.45, 0, 0], [0.50, 0, 0], [0.55, 0, 0], [0.60, 0, 0], [0.65, 0.7333, 0.7333], [0.70, 0.9333, 0.9333], [0.75, 1, 1], [0.80, 1, 1], [0.85, 1, 1], [0.90, 0.8667, 0.8667], [0.95, 0.80, 0.80], [1, 0.80, 0.80]],
+ green: [[0, 0, 0], [0.05, 0, 0], [0.10, 0, 0], [0.15, 0, 0], [0.20, 0, 0], [0.25, 0.4667, 0.4667], [0.30, 0.6000, 0.6000], [0.35, 0.6667, 0.6667], [0.40, 0.6667, 0.6667], [0.45, 0.6000, 0.6000], [0.50, 0.7333, 0.7333], [0.55, 0.8667, 0.8667], [0.60, 1, 1], [0.65, 1, 1], [0.70, 0.9333, 0.9333], [0.75, 0.8000, 0.8000], [0.80, 0.6000, 0.6000], [0.85, 0, 0], [0.90, 0, 0], [0.95, 0, 0], [1, 0.80, 0.80]],
+ blue: [[0, 0, 0], [0.05, 0.5333, 0.5333], [0.10, 0.6000, 0.6000], [0.15, 0.6667, 0.6667], [0.20, 0.8667, 0.8667], [0.25, 0.8667, 0.8667], [0.30, 0.8667, 0.8667], [0.35, 0.6667, 0.6667], [0.40, 0.5333, 0.5333], [0.45, 0, 0], [0.5, 0, 0], [0.55, 0, 0], [0.60, 0, 0], [0.65, 0, 0], [0.70, 0, 0], [0.75, 0, 0], [0.80, 0, 0], [0.85, 0, 0], [0.90, 0, 0], [0.95, 0, 0], [1, 0.80, 0.80]]
+ }
+ },
+ coolwarm: {
+ name: 'CoolWarm',
+ numColors: 256,
+ gamma: 1,
+ segmentedData: {
+ red: [[0, 0.2298057, 0.2298057], [0.03125, 0.26623388, 0.26623388], [0.0625, 0.30386891, 0.30386891], [0.09375, 0.342804478, 0.342804478], [0.125, 0.38301334, 0.38301334], [0.15625, 0.424369608, 0.424369608], [0.1875, 0.46666708, 0.46666708], [0.21875, 0.509635204, 0.509635204], [0.25, 0.552953156, 0.552953156], [0.28125, 0.596262162, 0.596262162], [0.3125, 0.639176211, 0.639176211], [0.34375, 0.681291281, 0.681291281], [0.375, 0.722193294, 0.722193294], [0.40625, 0.761464949, 0.761464949], [0.4375, 0.798691636, 0.798691636], [0.46875, 0.833466556, 0.833466556], [0.5, 0.865395197, 0.865395197], [0.53125, 0.897787179, 0.897787179], [0.5625, 0.924127593, 0.924127593], [0.59375, 0.944468518, 0.944468518], [0.625, 0.958852946, 0.958852946], [0.65625, 0.96732803, 0.96732803], [0.6875, 0.969954137, 0.969954137], [0.71875, 0.966811177, 0.966811177], [0.75, 0.958003065, 0.958003065], [0.78125, 0.943660866, 0.943660866], [0.8125, 0.923944917, 0.923944917], [0.84375, 0.89904617, 0.89904617], [0.875, 0.869186849, 0.869186849], [0.90625, 0.834620542, 0.834620542], [0.9375, 0.795631745, 0.795631745], [0.96875, 0.752534934, 0.752534934], [1, 0.705673158, 0.705673158]],
+ green: [[0, 0.298717966, 0.298717966], [0.03125, 0.353094838, 0.353094838], [0.0625, 0.406535296, 0.406535296], [0.09375, 0.458757618, 0.458757618], [0.125, 0.50941904, 0.50941904], [0.15625, 0.558148092, 0.558148092], [0.1875, 0.604562568, 0.604562568], [0.21875, 0.648280772, 0.648280772], [0.25, 0.688929332, 0.688929332], [0.28125, 0.726149107, 0.726149107], [0.3125, 0.759599947, 0.759599947], [0.34375, 0.788964712, 0.788964712], [0.375, 0.813952739, 0.813952739], [0.40625, 0.834302879, 0.834302879], [0.4375, 0.849786142, 0.849786142], [0.46875, 0.860207984, 0.860207984], [0.5, 0.86541021, 0.86541021], [0.53125, 0.848937047, 0.848937047], [0.5625, 0.827384882, 0.827384882], [0.59375, 0.800927443, 0.800927443], [0.625, 0.769767752, 0.769767752], [0.65625, 0.734132809, 0.734132809], [0.6875, 0.694266682, 0.694266682], [0.71875, 0.650421156, 0.650421156], [0.75, 0.602842431, 0.602842431], [0.78125, 0.551750968, 0.551750968], [0.8125, 0.49730856, 0.49730856], [0.84375, 0.439559467, 0.439559467], [0.875, 0.378313092, 0.378313092], [0.90625, 0.312874446, 0.312874446], [0.9375, 0.24128379, 0.24128379], [0.96875, 0.157246067, 0.157246067], [1, 0.01555616, 0.01555616]],
+ blue: [[0, 0.753683153, 0.753683153], [0.03125, 0.801466763, 0.801466763], [0.0625, 0.84495867, 0.84495867], [0.09375, 0.883725899, 0.883725899], [0.125, 0.917387822, 0.917387822], [0.15625, 0.945619588, 0.945619588], [0.1875, 0.968154911, 0.968154911], [0.21875, 0.98478814, 0.98478814], [0.25, 0.995375608, 0.995375608], [0.28125, 0.999836203, 0.999836203], [0.3125, 0.998151185, 0.998151185], [0.34375, 0.990363227, 0.990363227], [0.375, 0.976574709, 0.976574709], [0.40625, 0.956945269, 0.956945269], [0.4375, 0.931688648, 0.931688648], [0.46875, 0.901068838, 0.901068838], [0.5, 0.865395561, 0.865395561], [0.53125, 0.820880546, 0.820880546], [0.5625, 0.774508472, 0.774508472], [0.59375, 0.726736146, 0.726736146], [0.625, 0.678007945, 0.678007945], [0.65625, 0.628751763, 0.628751763], [0.6875, 0.579375448, 0.579375448], [0.71875, 0.530263762, 0.530263762], [0.75, 0.481775914, 0.481775914], [0.78125, 0.434243684, 0.434243684], [0.8125, 0.387970225, 0.387970225], [0.84375, 0.343229596, 0.343229596], [0.875, 0.300267182, 0.300267182], [0.90625, 0.259301199, 0.259301199], [0.9375, 0.220525627, 0.220525627], [0.96875, 0.184115123, 0.184115123], [1, 0.150232812, 0.150232812]]
+ }
+ },
+ blues: {
+ name: 'Blues',
+ numColors: 256,
+ gamma: 1,
+ segmentedData: {
+ red: [[0, 0.9686274528503418, 0.9686274528503418], [0.125, 0.87058824300765991, 0.87058824300765991], [0.25, 0.7764706015586853, 0.7764706015586853], [0.375, 0.61960786581039429, 0.61960786581039429], [0.5, 0.41960784792900085, 0.41960784792900085], [0.625, 0.25882354378700256, 0.25882354378700256], [0.75, 0.12941177189350128, 0.12941177189350128], [0.875, 0.031372550874948502, 0.031372550874948502], [1, 0.031372550874948502, 0.031372550874948502]],
+ green: [[0, 0.9843137264251709, 0.9843137264251709], [0.125, 0.92156863212585449, 0.92156863212585449], [0.25, 0.85882353782653809, 0.85882353782653809], [0.375, 0.7921568751335144, 0.7921568751335144], [0.5, 0.68235296010971069, 0.68235296010971069], [0.625, 0.57254904508590698, 0.57254904508590698], [0.75, 0.44313725829124451, 0.44313725829124451], [0.875, 0.31764706969261169, 0.31764706969261169], [1, 0.18823529779911041, 0.18823529779911041]],
+ blue: [[0, 1, 1], [0.125, 0.9686274528503418, 0.9686274528503418], [0.25, 0.93725490570068359, 0.93725490570068359], [0.375, 0.88235294818878174, 0.88235294818878174], [0.5, 0.83921569585800171, 0.83921569585800171], [0.625, 0.7764706015586853, 0.7764706015586853], [0.75, 0.70980393886566162, 0.70980393886566162], [0.875, 0.61176472902297974, 0.61176472902297974], [1, 0.41960784792900085, 0.41960784792900085]]
+ }
+ }
+};
+/**
+ * Generate linearly spaced vectors
+* http://cens.ioc.ee/local/man/matlab/techdoc/ref/linspace.html
+ * @param {Number} a A number representing the first vector
+ * @param {Number} b A number representing the second vector
+ * @param {Number} n The number of linear spaced vectors to generate
+ * @returns {Array} An array of points representing linear spaced vectors.
+ * @memberof Colors
+ */
+
+function linspace(a, b, n) {
+ n = n === null ? 100 : n;
+ var increment = (b - a) / (n - 1);
+ var vector = [];
+
+ while (n-- > 0) {
+ vector.push(a);
+ a += increment;
+ } // Make sure the last item will always be "b" because most of the
+ // Time we'll get numbers like 1.0000000000000002 instead of 1.
+
+
+ vector[vector.length - 1] = b;
+ return vector;
+}
+/**
+ * Returns the "rank/index" of the element in a sorted array if found or the highest index if not. Uses (binary search)
+ * @param {Array} array A sorted array to search in
+ * @param {any} elem the element in the array to search for
+ * @returns {number} The rank/index of the element in the given array
+ * @memberof Colors
+ */
+
+
+function getRank(array, elem) {
+ var left = 0;
+ var right = array.length - 1;
+
+ while (left <= right) {
+ var mid = left + Math.floor((right - left) / 2);
+ var midElem = array[mid];
+
+ if (midElem === elem) {
+ return mid;
+ } else if (elem < midElem) {
+ right = mid - 1;
+ } else {
+ left = mid + 1;
+ }
+ }
+
+ return left;
+}
+/**
+ * Find the indices into a sorted array a such that, if the corresponding elements
+ * In v were inserted before the indices, the order of a would be preserved.
+ * http://lagrange.univ-lyon1.fr/docs/numpy/1.11.0/reference/generated/numpy.searchsorted.html
+ * @param {Array} inputArray The array where the values will be inserted
+ * @param {Array} values An array of the values to be inserted into the inputArray
+ * @returns {Array} The indices where elements should be inserted to maintain order.
+ * @memberof Colors
+ */
+
+
+function searchSorted(inputArray, values) {
+ var i;
+ var indexes = [];
+ var len = values.length;
+ inputArray.sort(function (a, b) {
+ return a - b;
+ });
+
+ for (i = 0; i < len; i++) {
+ indexes[i] = getRank(inputArray, values[i]);
+ }
+
+ return indexes;
+}
+/**
+ * Creates an *N* -element 1-d lookup table
+ * @param {Number} N The number of elements in the result lookup table
+ * @param {Array} data represented by a list of x,y0,y1 mapping correspondences. Each element in this
+ * List represents how a value between 0 and 1 (inclusive) represented by x is mapped to
+ * A corresponding value between 0 and 1 (inclusive). The two values of y are to allow for
+ * Discontinuous mapping functions (say as might be found in a sawtooth) where y0 represents
+ * The value of y for values of x <= to that given, and y1 is the value to be used for x >
+ * Than that given). The list must start with x=0, end with x=1, and all values of x must be
+ * In increasing order. Values between the given mapping points are determined by simple linear
+ * Interpolation.
+ * @param {any} gamma value denotes a "gamma curve" value which adjusts the brightness
+ * at the bottom and top of the map.
+ * @returns {any[]} an array "result" where result[x*(N-1)] gives the closest value for
+ * Values of x between 0 and 1.
+ * @memberof Colors
+ */
+
+
+function makeMappingArray(N, data, gamma) {
+ var i;
+ var x = [];
+ var y0 = [];
+ var y1 = [];
+ var lut = [];
+ gamma = gamma === null ? 1 : gamma;
+
+ for (i = 0; i < data.length; i++) {
+ var element = data[i];
+ x.push((N - 1) * element[0]);
+ y0.push(element[1]);
+ y1.push(element[1]);
+ }
+
+ var xLinSpace = linspace(0, 1, N);
+
+ for (i = 0; i < N; i++) {
+ xLinSpace[i] = (N - 1) * Math.pow(xLinSpace[i], gamma);
+ }
+
+ var xLinSpaceIndexes = searchSorted(x, xLinSpace);
+
+ for (i = 1; i < N - 1; i++) {
+ var index = xLinSpaceIndexes[i];
+ var colorPercent = (xLinSpace[i] - x[index - 1]) / (x[index] - x[index - 1]);
+ var colorDelta = y0[index] - y1[index - 1];
+ lut[i] = colorPercent * colorDelta + y1[index - 1];
+ }
+
+ lut[0] = y1[0];
+ lut[N - 1] = y0[data.length - 1];
+ return lut;
+}
+/**
+ * Creates a Colormap based on lookup tables using linear segments.
+ * @param {{red:Array, green:Array, blue:Array}} segmentedData An object with a red, green and blue entries.
+ * Each entry should be a list of x, y0, y1 tuples, forming rows in a table.
+ * @param {Number} N The number of elements in the result Colormap
+ * @param {any} gamma value denotes a "gamma curve" value which adjusts the brightness
+ * at the bottom and top of the Colormap.
+ * @returns {Array} The created Colormap object
+ * @description The lookup table is generated using linear interpolation for each
+ * Primary color, with the 0-1 domain divided into any number of
+ * Segments.
+ * https://github.com/stefanv/matplotlib/blob/3f1a23755e86fef97d51e30e106195f34425c9e3/lib/matplotlib/colors.py#L663
+ * @memberof Colors
+ */
+
+
+function createLinearSegmentedColormap(segmentedData, N, gamma) {
+ var i;
+ var lut = [];
+ N = N === null ? 256 : N;
+ gamma = gamma === null ? 1 : gamma;
+ var redLut = makeMappingArray(N, segmentedData.red, gamma);
+ var greenLut = makeMappingArray(N, segmentedData.green, gamma);
+ var blueLut = makeMappingArray(N, segmentedData.blue, gamma);
+
+ for (i = 0; i < N; i++) {
+ var red = Math.round(redLut[i] * 255);
+ var green = Math.round(greenLut[i] * 255);
+ var blue = Math.round(blueLut[i] * 255);
+ var rgba = [red, green, blue, 255];
+ lut.push(rgba);
+ }
+
+ return lut;
+}
+/**
+ * Return all available colormaps (id and name)
+ * @returns {Array<{id,key}>} An array of colormaps with an object containing the "id" and display "name"
+ * @memberof Colors
+ */
+
+
+function getColormapsList() {
+ var colormaps = [];
+ var keys = Object.keys(colormapsData);
+ keys.forEach(function (key) {
+ if (colormapsData.hasOwnProperty(key)) {
+ var colormap = colormapsData[key];
+ colormaps.push({
+ id: key,
+ name: colormap.name
+ });
+ }
+ });
+ colormaps.sort(function (a, b) {
+ var aName = a.name.toLowerCase();
+ var bName = b.name.toLowerCase();
+
+ if (aName === bName) {
+ return 0;
+ }
+
+ return aName < bName ? -1 : 1;
+ });
+ return colormaps;
+}
+/**
+ * Return a colorMap object with the provided id and colormapData
+ * if the Id matches existent colorMap objects (check colormapsData) the colormapData is ignored.
+ * if the colormapData is not empty, the colorMap will be added to the colormapsData list. Otherwise, an empty colorMap object is returned.
+ * @param {string} id The ID of the colormap
+ * @param {Object} colormapData - An object that can contain a name, numColors, gama, segmentedData and/or colors
+ * @returns {*} The Colormap Object
+ * @memberof Colors
+*/
+
+function getColormap(id, colormapData) {
+ var colormap = colormapsData[id];
+
+ if (!colormap) {
+ colormap = colormapsData[id] = colormapData || {
+ name: '',
+ colors: []
+ };
+ }
+
+ if (!colormap.colors && colormap.segmentedData) {
+ colormap.colors = createLinearSegmentedColormap(colormap.segmentedData, colormap.numColors, colormap.gamma);
+ }
+
+ return {
+ getId: function getId() {
+ return id;
+ },
+ getColorSchemeName: function getColorSchemeName() {
+ return colormap.name;
+ },
+ setColorSchemeName: function setColorSchemeName(name) {
+ colormap.name = name;
+ },
+ getNumberOfColors: function getNumberOfColors() {
+ return colormap.colors.length;
+ },
+ setNumberOfColors: function setNumberOfColors(numColors) {
+ while (colormap.colors.length < numColors) {
+ colormap.colors.push(COLOR_TRANSPARENT);
+ }
+
+ colormap.colors.length = numColors;
+ },
+ getColor: function getColor(index) {
+ if (this.isValidIndex(index)) {
+ return colormap.colors[index];
+ }
+
+ return COLOR_TRANSPARENT;
+ },
+ getColorRepeating: function getColorRepeating(index) {
+ var numColors = colormap.colors.length;
+ index = numColors ? index % numColors : 0;
+ return this.getColor(index);
+ },
+ setColor: function setColor(index, rgba) {
+ if (this.isValidIndex(index)) {
+ colormap.colors[index] = rgba;
+ }
+ },
+ addColor: function addColor(rgba) {
+ colormap.colors.push(rgba);
+ },
+ insertColor: function insertColor(index, rgba) {
+ if (this.isValidIndex(index)) {
+ colormap.colors.splice(index, 1, rgba);
+ }
+ },
+ removeColor: function removeColor(index) {
+ if (this.isValidIndex(index)) {
+ colormap.colors.splice(index, 1);
+ }
+ },
+ clearColors: function clearColors() {
+ colormap.colors = [];
+ },
+ buildLookupTable: function buildLookupTable(lut) {
+ if (!lut) {
+ return;
+ }
+
+ var numColors = colormap.colors.length;
+ lut.setNumberOfTableValues(numColors);
+
+ for (var i = 0; i < numColors; i++) {
+ lut.setTableValue(i, colormap.colors[i]);
+ }
+ },
+ createLookupTable: function createLookupTable() {
+ var lut = new _lookupTable_js__WEBPACK_IMPORTED_MODULE_0__["default"]();
+ this.buildLookupTable(lut);
+ return lut;
+ },
+ isValidIndex: function isValidIndex(index) {
+ return index >= 0 && index < colormap.colors.length;
+ }
+ };
+}
+
+/***/ }),
+
+/***/ "./colors/index.js":
+/*!*************************!*\
+ !*** ./colors/index.js ***!
+ \*************************/
+/*! exports provided: default */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+__webpack_require__.r(__webpack_exports__);
+/* harmony import */ var _colormap_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./colormap.js */ "./colors/colormap.js");
+/* harmony import */ var _lookupTable_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./lookupTable.js */ "./colors/lookupTable.js");
+
+
+/* harmony default export */ __webpack_exports__["default"] = ({
+ getColormap: _colormap_js__WEBPACK_IMPORTED_MODULE_0__["getColormap"],
+ getColormapsList: _colormap_js__WEBPACK_IMPORTED_MODULE_0__["getColormapsList"],
+ LookupTable: _lookupTable_js__WEBPACK_IMPORTED_MODULE_1__["default"]
+});
+
+/***/ }),
+
+/***/ "./colors/lookupTable.js":
+/*!*******************************!*\
+ !*** ./colors/lookupTable.js ***!
+ \*******************************/
+/*! exports provided: default */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+__webpack_require__.r(__webpack_exports__);
+function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }
+
+function _defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } }
+
+function _createClass(Constructor, protoProps, staticProps) { if (protoProps) _defineProperties(Constructor.prototype, protoProps); if (staticProps) _defineProperties(Constructor, staticProps); return Constructor; }
+
+// This code was created based on vtkLookupTable
+// http://www.vtk.org/doc/release/5.0/html/a01697.html
+// https://github.com/Kitware/VTK/blob/master/Common/Core/vtkLookupTable.cxx
+var BELOW_RANGE_COLOR_INDEX = 0;
+var ABOVE_RANGE_COLOR_INDEX = 1;
+var NAN_COLOR_INDEX = 2;
+/**
+ * Converts an HSV (Hue, Saturation, Value) color to RGB (Red, Green, Blue) color value
+ * @param {Number} hue A number representing the hue color value
+ * @param {any} sat A number representing the saturation color value
+ * @param {any} val A number representing the value color value
+ * @returns {Numberp[]} An RGB color array
+ */
+
+function HSVToRGB(hue, sat, val) {
+ if (hue > 1) {
+ throw new Error('HSVToRGB expects hue < 1');
+ }
+
+ var rgb = [];
+
+ if (sat === 0) {
+ rgb[0] = val;
+ rgb[1] = val;
+ rgb[2] = val;
+ return rgb;
+ }
+
+ var hueCase = Math.floor(hue * 6);
+ var frac = 6 * hue - hueCase;
+ var lx = val * (1 - sat);
+ var ly = val * (1 - sat * frac);
+ var lz = val * (1 - sat * (1 - frac));
+
+ switch (hueCase) {
+ /* 0 p.Range[1]) {
+ dIndex = p.MaxIndex + ABOVE_RANGE_COLOR_INDEX + 1.5;
+ } else {
+ dIndex = (v + p.Shift) * p.Scale;
+ }
+
+ return Math.floor(dIndex);
+}
+/**
+ * Maps scalar values into colors via a lookup table
+ * LookupTable is an object that is used by mapper objects to map scalar values into rgba (red-green-blue-alpha transparency) color specification,
+ * or rgba into scalar values. The color table can be created by direct insertion of color values, or by specifying hue, saturation, value, and alpha range and generating a table
+ */
+
+
+var LookupTable =
+/*#__PURE__*/
+function () {
+ /**
+ * Creates a default linear LookupTable object with 256 colors.
+ */
+ function LookupTable() {
+ _classCallCheck(this, LookupTable);
+
+ this.NumberOfColors = 256;
+ this.Ramp = 'linear';
+ this.TableRange = [0, 255];
+ this.HueRange = [0, 0.66667];
+ this.SaturationRange = [1, 1];
+ this.ValueRange = [1, 1];
+ this.AlphaRange = [1, 1];
+ this.NaNColor = [128, 0, 0, 255];
+ this.BelowRangeColor = [0, 0, 0, 255];
+ this.UseBelowRangeColor = true;
+ this.AboveRangeColor = [255, 255, 255, 255];
+ this.UseAboveRangeColor = true;
+ this.InputRange = [0, 255];
+ this.Table = [];
+ }
+ /**
+ * Specify the number of values (i.e., colors) in the lookup table.
+ * @param {Number} number The number of colors in he LookupTable
+ * @returns {void}
+ * @memberof Colors
+ */
+
+
+ _createClass(LookupTable, [{
+ key: "setNumberOfTableValues",
+ value: function setNumberOfTableValues(number) {
+ this.NumberOfColors = number;
+ }
+ /**
+ * Set the shape of the table ramp to either 'linear', 'scurve' or 'sqrt'
+ * @param {String} ramp A string value representing the shape of the table. Allowed values are 'linear', 'scurve' or 'sqrt'
+ * @returns {void}
+ * @memberof Colors
+ */
+
+ }, {
+ key: "setRamp",
+ value: function setRamp(ramp) {
+ this.Ramp = ramp;
+ }
+ /**
+ * Sets the minimum/maximum scalar values for scalar mapping.
+ * Scalar values less than minimum range value are clamped to minimum range value.
+ * Scalar values greater than maximum range value are clamped to maximum range value.
+ * @param {Number} start A double representing the minimum scaler value of the LookupTable
+ * @param {any} end A double representing the maximum scaler value of the LookupTable
+ * @returns {void}
+ * @memberof Colors
+ */
+
+ }, {
+ key: "setTableRange",
+ value: function setTableRange(start, end) {
+ this.TableRange[0] = start;
+ this.TableRange[1] = end;
+ }
+ /**
+ * Set the range in hue (using automatic generation). Hue ranges between [0,1].
+ * @param {Number} start A double representing the minimum hue value in a range. Min. is 0
+ * @param {Number} end A double representing the maximum hue value in a range. Max. is 1
+ * @returns {void}
+ * @memberof Colors
+ */
+
+ }, {
+ key: "setHueRange",
+ value: function setHueRange(start, end) {
+ this.HueRange[0] = start;
+ this.HueRange[1] = end;
+ }
+ /**
+ * Set the range in saturation (using automatic generation). Saturation ranges between [0,1].
+ * @param {Number} start A double representing the minimum Saturation value in a range. Min. is 0
+ * @param {Number} end A double representing the maximum Saturation value in a range. Max. is 1
+ * @returns {void}
+ * @memberof Colors
+ */
+
+ }, {
+ key: "setSaturationRange",
+ value: function setSaturationRange(start, end) {
+ this.SaturationRange[0] = start;
+ this.SaturationRange[1] = end;
+ }
+ /**
+ * Set the range in value (using automatic generation). Value ranges between [0,1].
+ * @param {Numeber } start A double representing the minimum value in a range. Min. is 0
+ * @param {Numeber} end A double representing the maximum value in a range. Max. is 1
+ * @returns {void}
+ * @memberof Colors
+ */
+
+ }, {
+ key: "setValueRange",
+ value: function setValueRange(start, end) {
+ // Set the range in value (using automatic generation). Value ranges between [0,1].
+ this.ValueRange[0] = start;
+ this.ValueRange[1] = end;
+ }
+ /**
+ * (Not Used) Sets the range of scalars which will be mapped.
+ * @param {Number} start the minimum scalar value in the range
+ * @param {Number} end the maximum scalar value in the range
+ * @returns {void}
+ * @memberof Colors
+ */
+
+ }, {
+ key: "setRange",
+ value: function setRange(start, end) {
+ this.InputRange[0] = start;
+ this.InputRange[1] = end;
+ }
+ /**
+ * Set the range in alpha (using automatic generation). Alpha ranges from [0,1].
+ * @param {Number} start A double representing the minimum alpha value
+ * @param {Number} end A double representing the maximum alpha value
+ * @returns {void}
+ * @memberof Colors
+ */
+
+ }, {
+ key: "setAlphaRange",
+ value: function setAlphaRange(start, end) {
+ // Set the range in alpha (using automatic generation). Alpha ranges from [0,1].
+ this.AlphaRange[0] = start;
+ this.AlphaRange[1] = end;
+ }
+ /**
+ * Map one value through the lookup table and return the color as an
+ * RGBA array of doubles between 0 and 1.
+ * @param {Number} scalar A double scalar value which will be mapped to a color in the LookupTable
+ * @returns {Number[]} An RGBA array of doubles between 0 and 1
+ * @memberof Colors
+ */
+
+ }, {
+ key: "getColor",
+ value: function getColor(scalar) {
+ return this.mapValue(scalar);
+ }
+ /**
+ * Generate lookup table from hue, saturation, value, alpha min/max values. Table is built from linear ramp of each value.
+ * @param {Boolean} force true to force the build of the LookupTable. Otherwie, false. This is useful if a lookup table has been defined manually
+ * (using SetTableValue) and then an application decides to rebuild the lookup table using the implicit process.
+ * @returns {void}
+ * @memberof Colors
+ */
+
+ }, {
+ key: "build",
+ value: function build(force) {
+ if (this.Table.length > 1 && !force) {
+ return;
+ } // Clear the table
+
+
+ this.Table = [];
+ var maxIndex = this.NumberOfColors - 1;
+ var hinc, sinc, vinc, ainc;
+
+ if (maxIndex) {
+ hinc = (this.HueRange[1] - this.HueRange[0]) / maxIndex;
+ sinc = (this.SaturationRange[1] - this.SaturationRange[0]) / maxIndex;
+ vinc = (this.ValueRange[1] - this.ValueRange[0]) / maxIndex;
+ ainc = (this.AlphaRange[1] - this.AlphaRange[0]) / maxIndex;
+ } else {
+ hinc = sinc = vinc = ainc = 0.0;
+ }
+
+ for (var i = 0; i <= maxIndex; i++) {
+ var hue = this.HueRange[0] + i * hinc;
+ var sat = this.SaturationRange[0] + i * sinc;
+ var val = this.ValueRange[0] + i * vinc;
+ var alpha = this.AlphaRange[0] + i * ainc;
+ var rgb = HSVToRGB(hue, sat, val);
+ var c_rgba = [];
+
+ switch (this.Ramp) {
+ case 'scurve':
+ c_rgba[0] = Math.floor(127.5 * (1.0 + Math.cos((1.0 - rgb[0]) * Math.PI)));
+ c_rgba[1] = Math.floor(127.5 * (1.0 + Math.cos((1.0 - rgb[1]) * Math.PI)));
+ c_rgba[2] = Math.floor(127.5 * (1.0 + Math.cos((1.0 - rgb[2]) * Math.PI)));
+ c_rgba[3] = Math.floor(alpha * 255);
+ break;
+
+ case 'linear':
+ c_rgba[0] = Math.floor(rgb[0] * 255 + 0.5);
+ c_rgba[1] = Math.floor(rgb[1] * 255 + 0.5);
+ c_rgba[2] = Math.floor(rgb[2] * 255 + 0.5);
+ c_rgba[3] = Math.floor(alpha * 255 + 0.5);
+ break;
+
+ case 'sqrt':
+ c_rgba[0] = Math.floor(Math.sqrt(rgb[0]) * 255 + 0.5);
+ c_rgba[1] = Math.floor(Math.sqrt(rgb[1]) * 255 + 0.5);
+ c_rgba[2] = Math.floor(Math.sqrt(rgb[2]) * 255 + 0.5);
+ c_rgba[3] = Math.floor(Math.sqrt(alpha) * 255 + 0.5);
+ break;
+
+ default:
+ throw new Error("Invalid Ramp value (".concat(this.Ramp, ")"));
+ }
+
+ this.Table.push(c_rgba);
+ }
+
+ this.buildSpecialColors();
+ }
+ /**
+ * Ensures the out-of-range colors (Below range and Above range) are set correctly.
+ * @returns {void}
+ * @memberof Colors
+ */
+
+ }, {
+ key: "buildSpecialColors",
+ value: function buildSpecialColors() {
+ var numberOfColors = this.NumberOfColors;
+ var belowRangeColorIndex = numberOfColors + BELOW_RANGE_COLOR_INDEX;
+ var aboveRangeColorIndex = numberOfColors + ABOVE_RANGE_COLOR_INDEX;
+ var nanColorIndex = numberOfColors + NAN_COLOR_INDEX; // Below range color
+
+ if (this.UseBelowRangeColor || numberOfColors === 0) {
+ this.Table[belowRangeColorIndex] = this.BelowRangeColor;
+ } else {
+ // Duplicate the first color in the table.
+ this.Table[belowRangeColorIndex] = this.Table[0];
+ } // Above range color
+
+
+ if (this.UseAboveRangeColor || numberOfColors === 0) {
+ this.Table[aboveRangeColorIndex] = this.AboveRangeColor;
+ } else {
+ // Duplicate the last color in the table.
+ this.Table[aboveRangeColorIndex] = this.Table[numberOfColors - 1];
+ } // Always use NanColor
+
+
+ this.Table[nanColorIndex] = this.NaNColor;
+ }
+ /**
+ * Similar to GetColor - Map one value through the lookup table and return the color as an
+ * RGBA array of doubles between 0 and 1.
+ * @param {Numeber} v A double scalar value which will be mapped to a color in the LookupTable
+ * @returns {Number[]} An RGBA array of doubles between 0 and 1
+ * @memberof Colors
+ */
+
+ }, {
+ key: "mapValue",
+ value: function mapValue(v) {
+ var index = this.getIndex(v);
+
+ if (index < 0) {
+ return this.NaNColor;
+ } else if (index === 0) {
+ if (this.UseBelowRangeColor && v < this.TableRange[0]) {
+ return this.BelowRangeColor;
+ }
+ } else if (index === this.NumberOfColors - 1) {
+ if (this.UseAboveRangeColor && v > this.TableRange[1]) {
+ return this.AboveRangeColor;
+ }
+ }
+
+ return this.Table[index];
+ }
+ /**
+ * Return the table index associated with a particular value.
+ * @param {Number} v A double value which table index will be returned.
+ * @returns {Number} The index in the LookupTable
+ * @memberof Colors
+ */
+
+ }, {
+ key: "getIndex",
+ value: function getIndex(v) {
+ var p = {};
+ p.Range = [];
+ p.MaxIndex = this.NumberOfColors - 1; // This was LookupShiftAndScale
+
+ p.Shift = -this.TableRange[0];
+
+ if (this.TableRange[1] <= this.TableRange[0]) {
+ p.Scale = Number.MAX_VALUE;
+ } else {
+ p.Scale = p.MaxIndex / (this.TableRange[1] - this.TableRange[0]);
+ }
+
+ p.Range[0] = this.TableRange[0];
+ p.Range[1] = this.TableRange[1]; // First, check whether we have a number...
+
+ if (isNaN(v)) {
+ // For backwards compatibility
+ return -1;
+ } // Map to an index:
+
+
+ var index = linearIndexLookupMain(v, p); // For backwards compatibility, if the index indicates an
+ // Out-of-range value, truncate to index range for in-range colors.
+
+ if (index === this.NumberOfColors + BELOW_RANGE_COLOR_INDEX) {
+ index = 0;
+ } else if (index === this.NumberOfColors + ABOVE_RANGE_COLOR_INDEX) {
+ index = this.NumberOfColors - 1;
+ }
+
+ return index;
+ }
+ /**
+ * Directly load color into lookup table. Use [0,1] double values for color component specification.
+ * Make sure that you've either used the Build() method or used SetNumberOfTableValues() prior to using this method.
+ * @param {Number} index The index in the LookupTable of where to insert the color value
+ * @param {Number[]} rgba An array of [0,1] double values for an RGBA color component
+ * @returns {void}
+ * @memberof Colors
+ */
+
+ }, {
+ key: "setTableValue",
+ value: function setTableValue(index, rgba) {
+ // Check if it index, red, green, blue and alpha were passed as parameter
+ if (arguments.length === 5) {
+ rgba = Array.prototype.slice.call(arguments, 1);
+ } // Check the index to make sure it is valid
+
+
+ if (index < 0) {
+ throw new Error("Can't set the table value for negative index (".concat(index, ")"));
+ }
+
+ if (index >= this.NumberOfColors) {
+ new Error("Index ".concat(index, " is greater than the number of colors ").concat(this.NumberOfColors));
+ }
+
+ this.Table[index] = rgba;
+
+ if (index === 0 || index === this.NumberOfColors - 1) {
+ // This is needed due to the way the special colors are stored in
+ // The internal table. If Above/BelowRangeColors are not used and
+ // The min/max colors are changed in the table with this member
+ // Function, then the colors used for values outside the range may
+ // Be incorrect. Calling this here ensures the out-of-range colors
+ // Are set correctly.
+ this.buildSpecialColors();
+ }
+ }
+ }]);
+
+ return LookupTable;
+}();
+
+/* harmony default export */ __webpack_exports__["default"] = (LookupTable);
+
+/***/ }),
+
+/***/ "./disable.js":
+/*!********************!*\
+ !*** ./disable.js ***!
+ \********************/
+/*! exports provided: default */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+__webpack_require__.r(__webpack_exports__);
+/* harmony import */ var _enabledElements_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./enabledElements.js */ "./enabledElements.js");
+/* harmony import */ var _triggerEvent_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./triggerEvent.js */ "./triggerEvent.js");
+/* harmony import */ var _events_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./events.js */ "./events.js");
+
+
+
+/**
+ * Disable an HTML element for further use in Cornerstone
+ *
+ * @param {HTMLElement} element An HTML Element enabled for Cornerstone
+ * @returns {void}
+ * @memberof Enable
+ */
+
+/* harmony default export */ __webpack_exports__["default"] = (function (element) {
+ if (element === undefined) {
+ throw new Error('disable: element must not be undefined');
+ } // Search for this element in this list of enabled elements
+
+
+ var enabledElements = Object(_enabledElements_js__WEBPACK_IMPORTED_MODULE_0__["getEnabledElements"])();
+
+ for (var i = 0; i < enabledElements.length; i++) {
+ if (enabledElements[i].element === element) {
+ // We found it!
+ // Fire an event so dependencies can cleanup
+ var eventData = {
+ element: element
+ };
+ Object(_triggerEvent_js__WEBPACK_IMPORTED_MODULE_1__["default"])(element, _events_js__WEBPACK_IMPORTED_MODULE_2__["default"].ELEMENT_DISABLED, eventData);
+ Object(_triggerEvent_js__WEBPACK_IMPORTED_MODULE_1__["default"])(_events_js__WEBPACK_IMPORTED_MODULE_2__["events"], _events_js__WEBPACK_IMPORTED_MODULE_2__["default"].ELEMENT_DISABLED, eventData); // Remove the child DOM elements that we created (e.g.canvas)
+
+ enabledElements[i].element.removeChild(enabledElements[i].canvas);
+ enabledElements[i].canvas = undefined; // Remove this element from the list of enabled elements
+
+ enabledElements.splice(i, 1);
+ break;
+ }
+ }
+});
+
+/***/ }),
+
+/***/ "./displayImage.js":
+/*!*************************!*\
+ !*** ./displayImage.js ***!
+ \*************************/
+/*! exports provided: default */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+__webpack_require__.r(__webpack_exports__);
+/* harmony import */ var _enabledElements_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./enabledElements.js */ "./enabledElements.js");
+/* harmony import */ var _internal_getDefaultViewport_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./internal/getDefaultViewport.js */ "./internal/getDefaultViewport.js");
+/* harmony import */ var _updateImage_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./updateImage.js */ "./updateImage.js");
+/* harmony import */ var _internal_now_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./internal/now.js */ "./internal/now.js");
+/* harmony import */ var _layers_js__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./layers.js */ "./layers.js");
+/* harmony import */ var _triggerEvent_js__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ./triggerEvent.js */ "./triggerEvent.js");
+/* harmony import */ var _events_js__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ./events.js */ "./events.js");
+
+
+
+
+
+
+
+/**
+ * Sets a new image object for a given element.
+ *
+ * Will also apply an optional viewport setting.
+ *
+ * @param {HTMLElement} element An HTML Element enabled for Cornerstone
+ * @param {Object} image An Image loaded by a Cornerstone Image Loader
+ * @param {Object} [viewport] A set of Cornerstone viewport parameters
+ * @returns {void}
+ * @memberof Drawing
+ */
+
+/* harmony default export */ __webpack_exports__["default"] = (function (element, image, viewport) {
+ if (element === undefined) {
+ throw new Error('displayImage: parameter element must not be undefined');
+ }
+
+ if (image === undefined) {
+ throw new Error('displayImage: parameter image must not be undefined');
+ }
+
+ var enabledElement = Object(_enabledElements_js__WEBPACK_IMPORTED_MODULE_0__["getEnabledElement"])(element);
+ var oldImage = enabledElement.image;
+ enabledElement.image = image;
+
+ if (enabledElement.layers && enabledElement.layers.length) {
+ Object(_layers_js__WEBPACK_IMPORTED_MODULE_4__["setLayerImage"])(element, image);
+ }
+
+ if (enabledElement.viewport === undefined) {
+ enabledElement.viewport = Object(_internal_getDefaultViewport_js__WEBPACK_IMPORTED_MODULE_1__["default"])(enabledElement.canvas, image);
+ } // Merge viewport
+
+
+ if (viewport) {
+ for (var attrname in viewport) {
+ if (viewport[attrname] !== null) {
+ enabledElement.viewport[attrname] = viewport[attrname];
+ }
+ }
+ }
+
+ var frameRate;
+
+ if (enabledElement.lastImageTimeStamp !== undefined) {
+ var timeSinceLastImage = Object(_internal_now_js__WEBPACK_IMPORTED_MODULE_3__["default"])() - enabledElement.lastImageTimeStamp;
+ frameRate = (1000 / timeSinceLastImage).toFixed();
+ }
+
+ enabledElement.lastImageTimeStamp = Object(_internal_now_js__WEBPACK_IMPORTED_MODULE_3__["default"])();
+ var newImageEventData = {
+ viewport: enabledElement.viewport,
+ element: enabledElement.element,
+ image: enabledElement.image,
+ oldImage: oldImage,
+ enabledElement: enabledElement,
+ frameRate: frameRate
+ };
+ Object(_triggerEvent_js__WEBPACK_IMPORTED_MODULE_5__["default"])(enabledElement.element, _events_js__WEBPACK_IMPORTED_MODULE_6__["default"].NEW_IMAGE, newImageEventData);
+ Object(_updateImage_js__WEBPACK_IMPORTED_MODULE_2__["default"])(element);
+});
+
+/***/ }),
+
+/***/ "./draw.js":
+/*!*****************!*\
+ !*** ./draw.js ***!
+ \*****************/
+/*! exports provided: default */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+__webpack_require__.r(__webpack_exports__);
+/* harmony import */ var _enabledElements_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./enabledElements.js */ "./enabledElements.js");
+/* harmony import */ var _internal_drawImage_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./internal/drawImage.js */ "./internal/drawImage.js");
+
+
+/**
+ * Immediately draws the enabled element
+ *
+ * @param {HTMLElement} element An HTML Element enabled for Cornerstone
+ * @returns {void}
+ * @memberof Drawing
+ */
+
+/* harmony default export */ __webpack_exports__["default"] = (function (element) {
+ var enabledElement = Object(_enabledElements_js__WEBPACK_IMPORTED_MODULE_0__["getEnabledElement"])(element);
+
+ if (enabledElement.image === undefined) {
+ throw new Error('draw: image has not been loaded yet');
+ }
+
+ Object(_internal_drawImage_js__WEBPACK_IMPORTED_MODULE_1__["default"])(enabledElement);
+});
+
+/***/ }),
+
+/***/ "./drawInvalidated.js":
+/*!****************************!*\
+ !*** ./drawInvalidated.js ***!
+ \****************************/
+/*! exports provided: default */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+__webpack_require__.r(__webpack_exports__);
+/* harmony import */ var _enabledElements_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./enabledElements.js */ "./enabledElements.js");
+/* harmony import */ var _internal_drawImage_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./internal/drawImage.js */ "./internal/drawImage.js");
+/**
+ * This module is responsible for drawing invalidated enabled elements
+ */
+
+
+/**
+ * Draws all invalidated enabled elements and clears the invalid flag after drawing it
+ *
+ * @returns {void}
+ * @memberof Drawing
+ */
+
+/* harmony default export */ __webpack_exports__["default"] = (function () {
+ var enabledElements = Object(_enabledElements_js__WEBPACK_IMPORTED_MODULE_0__["getEnabledElements"])();
+
+ for (var i = 0; i < enabledElements.length; i++) {
+ var ee = enabledElements[i];
+
+ if (ee.invalid === true) {
+ Object(_internal_drawImage_js__WEBPACK_IMPORTED_MODULE_1__["default"])(ee, true);
+ }
+ }
+});
+
+/***/ }),
+
+/***/ "./enable.js":
+/*!*******************!*\
+ !*** ./enable.js ***!
+ \*******************/
+/*! exports provided: default */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+__webpack_require__.r(__webpack_exports__);
+/* harmony import */ var _enabledElements_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./enabledElements.js */ "./enabledElements.js");
+/* harmony import */ var _resize_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./resize.js */ "./resize.js");
+/* harmony import */ var _internal_drawImageSync_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./internal/drawImageSync.js */ "./internal/drawImageSync.js");
+/* harmony import */ var _internal_requestAnimationFrame_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./internal/requestAnimationFrame.js */ "./internal/requestAnimationFrame.js");
+/* harmony import */ var _internal_tryEnableWebgl_js__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./internal/tryEnableWebgl.js */ "./internal/tryEnableWebgl.js");
+/* harmony import */ var _triggerEvent_js__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ./triggerEvent.js */ "./triggerEvent.js");
+/* harmony import */ var _generateUUID_js__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ./generateUUID.js */ "./generateUUID.js");
+/* harmony import */ var _events_js__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ./events.js */ "./events.js");
+/* harmony import */ var _internal_getCanvas_js__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ./internal/getCanvas.js */ "./internal/getCanvas.js");
+
+
+
+
+
+
+
+
+
+/**
+ * @module Enable
+ * This module is responsible for enabling an element to display images with cornerstone
+ */
+
+/**
+ * Returns whether or not an Enabled Element has either a currently active image or
+ * a non-empty Array of Enabled Element Layers.
+ *
+ * @param {EnabledElement} enabledElement An Enabled Element
+ * @return {Boolean} Whether or not the Enabled Element has an active image or valid set of layers
+ * @memberof Enable
+ */
+
+function hasImageOrLayers(enabledElement) {
+ return enabledElement.image !== undefined || enabledElement.layers.length > 0;
+}
+/**
+ * Enable an HTML Element for use in Cornerstone
+ *
+ * - If there is a Canvas already present within the HTMLElement, and it has the class
+ * 'cornerstone-canvas', this function will use this existing Canvas instead of creating
+ * a new one. This may be helpful when using libraries (e.g. React, Vue) which don't
+ * want third parties to change the DOM.
+ *
+ * @param {HTMLElement} element An HTML Element enabled for Cornerstone
+ * @param {Object} options Options for the enabledElement
+ *
+ * @return {void}
+ * @memberof Enable
+ */
+
+
+/* harmony default export */ __webpack_exports__["default"] = (function (element, options) {
+ if (element === undefined) {
+ throw new Error('enable: parameter element cannot be undefined');
+ } // If this enabled element has the option set for WebGL, we should
+ // Check if this device actually supports it
+
+
+ if (options && options.renderer && options.renderer.toLowerCase() === 'webgl') {
+ Object(_internal_tryEnableWebgl_js__WEBPACK_IMPORTED_MODULE_4__["default"])(options);
+ }
+
+ var canvas = Object(_internal_getCanvas_js__WEBPACK_IMPORTED_MODULE_8__["default"])(element);
+ var enabledElement = {
+ element: element,
+ canvas: canvas,
+ image: undefined,
+ // Will be set once image is loaded
+ invalid: false,
+ // True if image needs to be drawn, false if not
+ needsRedraw: true,
+ options: options,
+ layers: [],
+ data: {},
+ renderingTools: {},
+ uuid: Object(_generateUUID_js__WEBPACK_IMPORTED_MODULE_6__["default"])()
+ };
+ Object(_enabledElements_js__WEBPACK_IMPORTED_MODULE_0__["addEnabledElement"])(enabledElement);
+ Object(_triggerEvent_js__WEBPACK_IMPORTED_MODULE_5__["default"])(_events_js__WEBPACK_IMPORTED_MODULE_7__["events"], _events_js__WEBPACK_IMPORTED_MODULE_7__["default"].ELEMENT_ENABLED, enabledElement);
+ Object(_resize_js__WEBPACK_IMPORTED_MODULE_1__["default"])(element, true);
+ /**
+ * Draw the image immediately
+ *
+ * @param {DOMHighResTimeStamp} timestamp The current time for when requestAnimationFrame starts to fire callbacks
+ * @returns {void}
+ * @memberof Drawing
+ */
+
+ function draw(timestamp) {
+ if (enabledElement.canvas === undefined) {
+ return;
+ }
+
+ var eventDetails = {
+ enabledElement: enabledElement,
+ timestamp: timestamp
+ };
+ Object(_triggerEvent_js__WEBPACK_IMPORTED_MODULE_5__["default"])(enabledElement.element, _events_js__WEBPACK_IMPORTED_MODULE_7__["default"].PRE_RENDER, eventDetails);
+
+ if (enabledElement.needsRedraw && hasImageOrLayers(enabledElement)) {
+ Object(_internal_drawImageSync_js__WEBPACK_IMPORTED_MODULE_2__["default"])(enabledElement, enabledElement.invalid);
+ }
+
+ Object(_internal_requestAnimationFrame_js__WEBPACK_IMPORTED_MODULE_3__["default"])(draw);
+ }
+
+ draw();
+});
+
+/***/ }),
+
+/***/ "./enabledElementData.js":
+/*!*******************************!*\
+ !*** ./enabledElementData.js ***!
+ \*******************************/
+/*! exports provided: getElementData, removeElementData */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+__webpack_require__.r(__webpack_exports__);
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "getElementData", function() { return getElementData; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "removeElementData", function() { return removeElementData; });
+/* harmony import */ var _enabledElements_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./enabledElements.js */ "./enabledElements.js");
+
+/**
+ * Retrieves any data for a Cornerstone enabledElement for a specific string
+ * dataType
+ *
+ * @param {HTMLElement} element An HTML Element enabled for Cornerstone
+ * @param {string} dataType A string name for an arbitrary set of data
+ * @returns {*} Whatever data is stored for this enabled element
+ */
+
+function getElementData(element, dataType) {
+ var ee = Object(_enabledElements_js__WEBPACK_IMPORTED_MODULE_0__["getEnabledElement"])(element);
+
+ if (ee.data.hasOwnProperty(dataType) === false) {
+ ee.data[dataType] = {};
+ }
+
+ return ee.data[dataType];
+}
+/**
+ * Clears any data for a Cornerstone enabledElement for a specific string
+ * dataType
+ *
+ * @param {HTMLElement} element An HTML Element enabled for Cornerstone
+ * @param {string} dataType A string name for an arbitrary set of data
+ *
+ * @returns {void}
+ */
+
+function removeElementData(element, dataType) {
+ var ee = Object(_enabledElements_js__WEBPACK_IMPORTED_MODULE_0__["getEnabledElement"])(element);
+ delete ee.data[dataType];
+}
+
+/***/ }),
+
+/***/ "./enabledElements.js":
+/*!****************************!*\
+ !*** ./enabledElements.js ***!
+ \****************************/
+/*! exports provided: getEnabledElement, addEnabledElement, getEnabledElementsByImageId, getEnabledElements */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+__webpack_require__.r(__webpack_exports__);
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "getEnabledElement", function() { return getEnabledElement; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "addEnabledElement", function() { return addEnabledElement; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "getEnabledElementsByImageId", function() { return getEnabledElementsByImageId; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "getEnabledElements", function() { return getEnabledElements; });
+var enabledElements = [];
+/**
+ * @module EnabledElements
+ */
+
+/**
+ * @module Objects
+ */
+
+/**
+ * A two-dimensional vector
+ *
+ * @typedef {Object} vec2
+ * @memberof Objects
+ * @param {Number} x - The x distance
+ * @param {Number} y - The y distance
+ */
+
+/**
+ * VOI
+ *
+ * @typedef {Object} VOI
+ * @memberof Objects
+ * @param {Number} windowWidth - Window Width for display
+ * @param {Number} windowCenter - Window Center for display
+ */
+
+/**
+ * Lookup Table Array
+ *
+ * @typedef {Object} LUT
+ * @memberof Objects
+ * @property {Number} firstValueMapped
+ * @property {Number} numBitsPerEntry
+ * @property {Array} lut
+ */
+
+/**
+ * Image Statistics Object
+ *
+ * @typedef {Object} ImageStats
+ * @memberof Objects
+ * @property {Number} [lastGetPixelDataTime] The time in ms taken to retrieve stored pixels required to draw the image
+ * @property {Number} [lastStoredPixelDataToCanvasImageDataTime] The time in ms taken to map from stored pixel array to canvas pixel array
+ * @property {Number} [lastPutImageDataTime] The time in ms taken for putImageData to put the canvas pixel data into the canvas context
+ * @property {Number} [lastRenderTime] The total time in ms taken for the entire rendering function to run
+ * @property {Number} [lastLutGenerateTime] The time in ms taken to generate the lookup table for the image
+ */
+
+/**
+ * An Image Object in Cornerstone
+ *
+ * @typedef {Object} Image
+ * @memberof Objects
+ * @property {string} imageId - The imageId associated with this image object
+ * @property {Number} minPixelValue - the minimum stored pixel value in the image
+ * @property {Number} maxPixelValue - the maximum stored pixel value in the image
+ * @property {Number} slope - the rescale slope to convert stored pixel values to modality pixel values or 1 if not specified
+ * @property {Number} intercept - the rescale intercept used to convert stored pixel values to modality values or 0 if not specified
+ * @property {Number} windowCenter - the default windowCenter to apply to the image
+ * @property {Number} windowWidth - the default windowWidth to apply to the image
+ * @property {function} getPixelData - a function that returns the underlying pixel data. An array of integers for grayscale and an array of RGBA for color
+ * @property {function} getImageData - a function that returns a canvas imageData object for the image. This is only needed for color images
+ * @property {function} getCanvas - a function that returns a canvas element with the image loaded into it. This is only needed for color images.
+ * @property {function} getImage - a function that returns a JavaScript Image object with the image data. This is optional and typically used for images encoded in standard web JPEG and PNG formats
+ * @property {Number} rows - number of rows in the image. This is the same as height but duplicated for convenience
+ * @property {Number} columns - number of columns in the image. This is the same as width but duplicated for convenience
+ * @property {Number} height - the height of the image. This is the same as rows but duplicated for convenience
+ * @property {Number} width - the width of the image. This is the same as columns but duplicated for convenience
+ * @property {Boolean} color - true if pixel data is RGB, false if grayscale
+ * @property {Object} lut - The Lookup Table
+ * @property {Boolean} rgba - Is the color pixel data stored in RGBA?
+ * @property {Number} columnPixelSpacing - horizontal distance between the middle of each pixel (or width of each pixel) in mm or undefined if not known
+ * @property {Number} rowPixelSpacing - vertical distance between the middle of each pixel (or height of each pixel) in mm or undefined if not known
+ * @property {Boolean} invert - true if the the image should initially be displayed be inverted, false if not. This is here mainly to support DICOM images with a photometric interpretation of MONOCHROME1
+ * @property {Number} sizeInBytes - the number of bytes used to store the pixels for this image.
+ * @property {Boolean} [falseColor=false] - Whether or not the image has undergone false color mapping
+ * @property {Array} [origPixelData] - Original pixel data for an image after it has undergone false color mapping
+ * @property {ImageStats} [stats] - Statistics for the last redraw of the image
+ * @property {Object} cachedLut - Cached Lookup Table for this image.
+ * @property {String|Colormap} [colormap] - Depreacted. Use viewport.colormap instead. an optional colormap ID or colormap object (from colors/colormap.js). This will be applied during rendering to convert the image to pseudocolor
+ * @property {Boolean} [labelmap=false] - whether or not to render this image as a label map (i.e. skip modality and VOI LUT pipelines and use only a color lookup table)
+ */
+
+/**
+ * A Viewport Settings Object Cornerstone
+ *
+ * @typedef {Object} Viewport
+ * @memberof Objects
+ * @property {Number} [scale=1.0] - The scale applied to the image. A scale of 1.0 will display no zoom (one image pixel takes up one screen pixel). A scale of 2.0 will be double zoom and a scale of .5 will be zoomed out by 2x
+ * @property {vec2} [translation] - An object with properties x and y which describe the translation to apply in the pixel coordinate system. Note that the image is initially displayed centered in the enabled element with a x and y translation of 0 and 0 respectively.
+ * @property {VOI} [voi] - an object with properties windowWidth and windowCenter.
+ * @property {boolean} [invert=false] - Whether or not the image is inverted.
+ * @property {boolean} [pixelReplication=false] - true if the image smooth / interpolation should be used when zoomed in on the image or false if pixel replication should be used.
+ * @property {boolean} [hflip=false] - true if the image is flipped horizontally. Default is false
+ * @property {boolean} [vflip=false] - true if the image is flipped vertically. Default is false
+ * @property {Number} [rotation=0] - the rotation of the image (90 degree increments). Default is 0
+ * @property {LUT} [modalityLUT] - the modality LUT to apply or undefined if none
+ * @property {LUT} [voiLUT] - the modality LUT to apply or undefined if none
+ * @property {String|Colormap} [colormap] - an optional colormap ID or colormap object (from colors/colormap.js). This will be applied during rendering to convert the image to pseudocolor
+ * @property {Boolean} [labelmap=false] - whether or not to render this image as a label map (i.e. skip modality and VOI LUT pipelines and use only a color lookup table)
+ */
+
+/**
+ * An Enabled Element in Cornerstone
+ *
+ * @typedef {Object} EnabledElement
+ * @memberof Objects
+ * @property {HTMLElement} element - The DOM element which has been enabled for use by Cornerstone
+ * @property {Image} [image] - The image currently displayed in the enabledElement
+ * @property {Viewport} [viewport] - The current viewport settings of the enabledElement
+ * @property {HTMLCanvasElement} [canvas] - The current canvas for this enabledElement
+ * @property {Boolean} invalid - Whether or not the image pixel data underlying the enabledElement has been changed, necessitating a redraw
+ * @property {Boolean} needsRedraw - A flag for triggering a redraw of the canvas without re-retrieving the pixel data, since it remains valid
+ * @property {EnabledElementLayer[]} [layers] - The layers that have been added to the enabledElement
+ * @property {Boolean} [syncViewports] - Whether or not to synchronize the viewport parameters
+ * for each of the enabled element's layers
+ * @property {Boolean} [lastSyncViewportsState] - The previous state for the sync viewport boolean
+ */
+
+/**
+ * An Enabled Element Layer in Cornerstone
+ *
+ * @typedef {Object} EnabledElementLayer
+ * @memberof Objects
+ * @property {HTMLElement} element - The DOM element which has been enabled for use by Cornerstone
+ * @property {Image} [image] - The image currently displayed in the enabledElement
+ * @property {Viewport} [viewport] - The current viewport settings of the enabledElement
+ * @property {HTMLCanvasElement} [canvas] - The current canvas for this enabledElement
+ * @property {Object} [options] - Layer drawing options
+ * @property {Boolean} invalid - Whether or not the image pixel data underlying the enabledElement has been changed, necessitating a redraw
+ * @property {Boolean} needsRedraw - A flag for triggering a redraw of the canvas without re-retrieving the pixel data, since it remains valid
+ */
+
+/**
+ * An Image Load Object
+ *
+ * @typedef {Object} ImageLoadObject
+ * @memberof Objects
+ * @property {Promise} promise - The Promise tracking the loading of this image
+ * @property {Function|undefined} cancelFn - A function to cancel the image load request
+ */
+
+/**
+ * Retrieves a Cornerstone Enabled Element object
+ *
+ * @param {HTMLElement} element An HTML Element enabled for Cornerstone
+ *
+ * @returns {EnabledElement} A Cornerstone Enabled Element
+ * @memberof EnabledElements
+ */
+
+function getEnabledElement(element) {
+ if (element === undefined) {
+ throw new Error('getEnabledElement: parameter element must not be undefined');
+ }
+
+ for (var i = 0; i < enabledElements.length; i++) {
+ if (enabledElements[i].element === element) {
+ return enabledElements[i];
+ }
+ }
+
+ throw new Error('element not enabled');
+}
+/**
+ * Adds a Cornerstone Enabled Element object to the central store of enabledElements
+ *
+ * @param {EnabledElement} enabledElement A Cornerstone enabledElement Object
+ * @returns {void}
+ * @memberof EnabledElements
+ */
+
+function addEnabledElement(enabledElement) {
+ if (enabledElement === undefined) {
+ throw new Error('getEnabledElement: enabledElement element must not be undefined');
+ }
+
+ enabledElements.push(enabledElement);
+}
+/**
+ * Adds a Cornerstone Enabled Element object to the central store of enabledElements
+ *
+ * @param {string} imageId A Cornerstone Image ID
+ * @returns {EnabledElement[]} An Array of Cornerstone enabledElement Objects
+ * @memberof EnabledElements
+ */
+
+function getEnabledElementsByImageId(imageId) {
+ var ees = [];
+ enabledElements.forEach(function (enabledElement) {
+ if (enabledElement.image && enabledElement.image.imageId === imageId) {
+ ees.push(enabledElement);
+ }
+ });
+ return ees;
+}
+/**
+ * Retrieve all of the currently enabled Cornerstone elements
+ *
+ * @return {EnabledElement[]} An Array of Cornerstone enabledElement Objects
+ * @memberof EnabledElements
+ */
+
+function getEnabledElements() {
+ return enabledElements;
+}
+
+/***/ }),
+
+/***/ "./events.js":
+/*!*******************!*\
+ !*** ./events.js ***!
+ \*******************/
+/*! exports provided: default, events */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+__webpack_require__.r(__webpack_exports__);
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "events", function() { return events; });
+function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }
+
+function _defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } }
+
+function _createClass(Constructor, protoProps, staticProps) { if (protoProps) _defineProperties(Constructor.prototype, protoProps); if (staticProps) _defineProperties(Constructor, staticProps); return Constructor; }
+
+var EVENTS = {
+ NEW_IMAGE: 'cornerstonenewimage',
+ INVALIDATED: 'cornerstoneinvalidated',
+ PRE_RENDER: 'cornerstoneprerender',
+ IMAGE_CACHE_MAXIMUM_SIZE_CHANGED: 'cornerstoneimagecachemaximumsizechanged',
+ IMAGE_CACHE_PROMISE_REMOVED: 'cornerstoneimagecachepromiseremoved',
+ IMAGE_CACHE_FULL: 'cornerstoneimagecachefull',
+ IMAGE_CACHE_CHANGED: 'cornerstoneimagecachechanged',
+ WEBGL_TEXTURE_REMOVED: 'cornerstonewebgltextureremoved',
+ WEBGL_TEXTURE_CACHE_FULL: 'cornerstonewebgltexturecachefull',
+ IMAGE_LOADED: 'cornerstoneimageloaded',
+ IMAGE_LOAD_FAILED: 'cornerstoneimageloadfailed',
+ ELEMENT_RESIZED: 'cornerstoneelementresized',
+ IMAGE_RENDERED: 'cornerstoneimagerendered',
+ LAYER_ADDED: 'cornerstonelayeradded',
+ LAYER_REMOVED: 'cornerstonelayerremoved',
+ ACTIVE_LAYER_CHANGED: 'cornerstoneactivelayerchanged',
+ ELEMENT_DISABLED: 'cornerstoneelementdisabled',
+ ELEMENT_ENABLED: 'cornerstoneelementenabled'
+};
+/* harmony default export */ __webpack_exports__["default"] = (EVENTS);
+/**
+ * EventTarget - Provides the [EventTarget](https://developer.mozilla.org/en-US/docs/Web/API/EventTarget) interface
+ *
+ * @class
+ * @memberof Polyfills
+ */
+
+var EventTarget =
+/*#__PURE__*/
+function () {
+ function EventTarget() {
+ _classCallCheck(this, EventTarget);
+
+ this.listeners = {};
+ this.namespaces = {};
+ }
+
+ _createClass(EventTarget, [{
+ key: "addEventNamespaceListener",
+ value: function addEventNamespaceListener(type, callback) {
+ if (type.indexOf('.') <= 0) {
+ return;
+ }
+
+ this.namespaces[type] = callback;
+ this.addEventListener(type.split('.')[0], callback);
+ }
+ }, {
+ key: "removeEventNamespaceListener",
+ value: function removeEventNamespaceListener(type) {
+ if (type.indexOf('.') <= 0 || !this.namespaces[type]) {
+ return;
+ }
+
+ this.removeEventListener(type.split('.')[0], this.namespaces[type]);
+ delete this.namespaces[type];
+ }
+ }, {
+ key: "addEventListener",
+ value: function addEventListener(type, callback) {
+ // Check if it is an event namespace
+ if (type.indexOf('.') > 0) {
+ this.addEventNamespaceListener(type, callback);
+ return;
+ }
+
+ if (!(type in this.listeners)) {
+ this.listeners[type] = [];
+ }
+
+ this.listeners[type].push(callback);
+ }
+ }, {
+ key: "removeEventListener",
+ value: function removeEventListener(type, callback) {
+ // Check if it is an event namespace
+ if (type.indexOf('.') > 0) {
+ this.removeEventNamespaceListener(type);
+ return;
+ }
+
+ if (!(type in this.listeners)) {
+ return;
+ }
+
+ var stack = this.listeners[type];
+
+ for (var i = 0, l = stack.length; i < l; i++) {
+ if (stack[i] === callback) {
+ stack.splice(i, 1);
+ return;
+ }
+ }
+ }
+ }, {
+ key: "dispatchEvent",
+ value: function dispatchEvent(event) {
+ if (!(event.type in this.listeners)) {
+ return true;
+ }
+
+ var stack = this.listeners[event.type];
+
+ for (var i = 0, l = stack.length; i < l; i++) {
+ stack[i].call(this, event);
+ }
+
+ return !event.defaultPrevented;
+ }
+ }]);
+
+ return EventTarget;
+}();
+
+var events = new EventTarget();
+
+/***/ }),
+
+/***/ "./falseColorMapping.js":
+/*!******************************!*\
+ !*** ./falseColorMapping.js ***!
+ \******************************/
+/*! exports provided: convertImageToFalseColorImage, convertToFalseColorImage, restoreImage */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+__webpack_require__.r(__webpack_exports__);
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "convertImageToFalseColorImage", function() { return convertImageToFalseColorImage; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "convertToFalseColorImage", function() { return convertToFalseColorImage; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "restoreImage", function() { return restoreImage; });
+/* harmony import */ var _enabledElements_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./enabledElements.js */ "./enabledElements.js");
+/* harmony import */ var _pixelDataToFalseColorData_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./pixelDataToFalseColorData.js */ "./pixelDataToFalseColorData.js");
+/* harmony import */ var _colors_colormap_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./colors/colormap.js */ "./colors/colormap.js");
+
+
+
+/**
+ * Retrieves the minimum and maximum pixel values from an Array of pixel data
+ *
+ * @param {Array} pixelData The input pixel data array
+ *
+ * @returns {{minPixelValue: Number, maxPixelValue: Number}} The minimum and maximum pixel values in the input Array
+ */
+
+function getPixelValues(pixelData) {
+ var minPixelValue = Number.MAX_VALUE;
+ var maxPixelValue = Number.MIN_VALUE;
+ var len = pixelData.length;
+ var pixel;
+
+ for (var i = 0; i < len; i++) {
+ pixel = pixelData[i];
+ minPixelValue = minPixelValue < pixel ? minPixelValue : pixel;
+ maxPixelValue = maxPixelValue > pixel ? maxPixelValue : pixel;
+ }
+
+ return {
+ minPixelValue: minPixelValue,
+ maxPixelValue: maxPixelValue
+ };
+}
+/**
+ * Retrieve a function that will allow an image object to be reset to its original form
+ * after a false color mapping transformation
+ *
+ * @param {Image} image A Cornerstone Image Object
+ *
+ * @return {Function} A function for resetting an Image Object to its original form
+ */
+
+
+function getRestoreImageMethod(image) {
+ if (image.restore) {
+ return image.restore;
+ }
+
+ var color = image.color;
+ var rgba = image.rgba;
+ var cachedLut = image.cachedLut;
+ var slope = image.slope;
+ var windowWidth = image.windowWidth;
+ var windowCenter = image.windowCenter;
+ var minPixelValue = image.minPixelValue;
+ var maxPixelValue = image.maxPixelValue;
+ return function () {
+ image.color = color;
+ image.rgba = rgba;
+ image.cachedLut = cachedLut;
+ image.slope = slope;
+ image.windowWidth = windowWidth;
+ image.windowCenter = windowCenter;
+ image.minPixelValue = minPixelValue;
+ image.maxPixelValue = maxPixelValue;
+
+ if (image.origPixelData) {
+ var pixelData = image.origPixelData;
+
+ image.getPixelData = function () {
+ return pixelData;
+ };
+ } // Remove some attributes added by false color mapping
+
+
+ image.origPixelData = undefined;
+ image.colormapId = undefined;
+ image.falseColor = undefined;
+ };
+} //
+// Then we need to make sure it will be converted into a colormap object if it's as string.
+
+/**
+ * User can pass a colormap or its id as string to some of these public functions.
+ * Then we need to make sure it will be converted into a colormap object if it's a string.
+ *
+ * @param {*} colormap A colormap ID or Object
+ * @return {*} The colormap
+ */
+
+
+function ensuresColormap(colormap) {
+ if (colormap && typeof colormap === 'string') {
+ colormap = Object(_colors_colormap_js__WEBPACK_IMPORTED_MODULE_2__["getColormap"])(colormap);
+ }
+
+ return colormap;
+}
+/**
+ * Restores a false color image to its original version
+ *
+ * @param {Image} image A Cornerstone Image Object
+ * @returns {Boolean} True if the image object had a valid restore function, which was run. Otherwise, false.
+ */
+
+
+function restoreImage(image) {
+ if (image.restore && typeof image.restore === 'function') {
+ image.restore();
+ return true;
+ }
+
+ return false;
+}
+/**
+ * Convert an image to a false color image
+ *
+ * @param {Image} image A Cornerstone Image Object
+ * @param {String|Object} colormap - it can be a colormap object or a colormap id (string)
+ *
+ * @returns {Boolean} - Whether or not the image has been converted to a false color image
+ */
+
+
+function convertImageToFalseColorImage(image, colormap) {
+ if (image.color && !image.falseColor) {
+ throw new Error('Color transforms are not implemented yet');
+ } // User can pass a colormap id or a colormap object
+
+
+ colormap = ensuresColormap(colormap);
+ var colormapId = colormap.getId(); // Doesn't do anything if colormapId hasn't changed
+
+ if (image.colormapId === colormapId) {
+ // It has already being converted into a false color image
+ // Using the colormapId passed as parameter
+ return false;
+ } // Restore the image attributes updated when converting to a false color image
+
+
+ restoreImage(image); // Convert the image to a false color image
+
+ if (colormapId) {
+ var minPixelValue = image.minPixelValue || 0;
+ var maxPixelValue = image.maxPixelValue || 255;
+ image.restore = getRestoreImageMethod(image);
+ var lookupTable = colormap.createLookupTable();
+ lookupTable.setTableRange(minPixelValue, maxPixelValue); // Update the pixel data and render the new image
+
+ Object(_pixelDataToFalseColorData_js__WEBPACK_IMPORTED_MODULE_1__["default"])(image, lookupTable); // Update min and max pixel values
+
+ var pixelValues = getPixelValues(image.getPixelData());
+ image.minPixelValue = pixelValues.minPixelValue;
+ image.maxPixelValue = pixelValues.maxPixelValue;
+ image.windowWidth = 255;
+ image.windowCenter = 128; // Cache the last colormapId used for performance
+ // Then it doesn't need to be re-rendered on next
+ // Time if the user hasn't updated it
+
+ image.colormapId = colormapId;
+ } // Return `true` to tell the caller that the image has got updated
+
+
+ return true;
+}
+/**
+ * Convert the image of a element to a false color image
+ *
+ * @param {HTMLElement} element The Cornerstone element
+ * @param {*} colormap - it can be a colormap object or a colormap id (string)
+ *
+ * @returns {void}
+ */
+
+
+function convertToFalseColorImage(element, colormap) {
+ var enabledElement = Object(_enabledElements_js__WEBPACK_IMPORTED_MODULE_0__["getEnabledElement"])(element);
+ return convertImageToFalseColorImage(enabledElement.image, colormap);
+}
+
+
+
+/***/ }),
+
+/***/ "./fitToWindow.js":
+/*!************************!*\
+ !*** ./fitToWindow.js ***!
+ \************************/
+/*! exports provided: default */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+__webpack_require__.r(__webpack_exports__);
+/* harmony import */ var _enabledElements_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./enabledElements.js */ "./enabledElements.js");
+/* harmony import */ var _updateImage_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./updateImage.js */ "./updateImage.js");
+/* harmony import */ var _internal_getImageFitScale_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./internal/getImageFitScale.js */ "./internal/getImageFitScale.js");
+
+
+
+/**
+ * Adjusts an image's scale and translation so the image is centered and all pixels
+ * in the image are viewable.
+ *
+ * @param {HTMLElement} element The Cornerstone element to update
+ * @returns {void}
+ */
+
+/* harmony default export */ __webpack_exports__["default"] = (function (element) {
+ var enabledElement = Object(_enabledElements_js__WEBPACK_IMPORTED_MODULE_0__["getEnabledElement"])(element);
+ var image = enabledElement.image; // The new scale is the minimum of the horizontal and vertical scale values
+
+ enabledElement.viewport.scale = Object(_internal_getImageFitScale_js__WEBPACK_IMPORTED_MODULE_2__["default"])(enabledElement.canvas, image, enabledElement.viewport.rotation).scaleFactor;
+ enabledElement.viewport.translation.x = 0;
+ enabledElement.viewport.translation.y = 0;
+ Object(_updateImage_js__WEBPACK_IMPORTED_MODULE_1__["default"])(element);
+});
+
+/***/ }),
+
+/***/ "./generateUUID.js":
+/*!*************************!*\
+ !*** ./generateUUID.js ***!
+ \*************************/
+/*! exports provided: default */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+__webpack_require__.r(__webpack_exports__);
+/**
+* Generates a UUID for the enabledElement.
+*
+* @return {String} the UUID.
+*/
+/* harmony default export */ __webpack_exports__["default"] = (function () {
+ // https://stackoverflow.com/a/8809472/9208320 Public Domain/MIT
+
+ /* eslint no-bitwise: ["error", { "allow": ["&","|"] }] */
+ var d = new Date().getTime();
+
+ if (typeof performance !== 'undefined' && typeof performance.now === 'function') {
+ d += performance.now(); // Use high-precision timer if available
+ }
+
+ return 'x.x.x.x.x.x.xxxx.xxx.x.x.xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx'.replace(/[xy]/g, function (c) {
+ var r = (d + Math.random() * 16) % 16 | 0;
+ d = Math.floor(d / 16);
+ return (c === 'x' ? r : r & 0x3 | 0x8).toString(16);
+ });
+});
+
+/***/ }),
+
+/***/ "./getDefaultViewportForImage.js":
+/*!***************************************!*\
+ !*** ./getDefaultViewportForImage.js ***!
+ \***************************************/
+/*! exports provided: default */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+__webpack_require__.r(__webpack_exports__);
+/* harmony import */ var _enabledElements_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./enabledElements.js */ "./enabledElements.js");
+/* harmony import */ var _internal_getDefaultViewport_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./internal/getDefaultViewport.js */ "./internal/getDefaultViewport.js");
+
+
+/**
+ * Returns a default viewport for display the specified image on the specified
+ * enabled element. The default viewport is fit to window
+ *
+ * @param {HTMLElement} element The DOM element enabled for Cornerstone
+ * @param {Image} image A Cornerstone Image Object
+ *
+ * @returns {Viewport} The default viewport for the image
+ */
+
+/* harmony default export */ __webpack_exports__["default"] = (function (element, image) {
+ var enabledElement = Object(_enabledElements_js__WEBPACK_IMPORTED_MODULE_0__["getEnabledElement"])(element);
+ return Object(_internal_getDefaultViewport_js__WEBPACK_IMPORTED_MODULE_1__["default"])(enabledElement.canvas, image);
+});
+
+/***/ }),
+
+/***/ "./getImage.js":
+/*!*********************!*\
+ !*** ./getImage.js ***!
+ \*********************/
+/*! exports provided: default */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+__webpack_require__.r(__webpack_exports__);
+/* harmony import */ var _enabledElements_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./enabledElements.js */ "./enabledElements.js");
+
+/**
+ * Returns the currently displayed image for an element or undefined if no image has
+ * been displayed yet
+ *
+ * @param {HTMLElement} element The DOM element enabled for Cornerstone
+ * @returns {Image} The Cornerstone Image Object displayed in this element
+ */
+
+/* harmony default export */ __webpack_exports__["default"] = (function (element) {
+ var enabledElement = Object(_enabledElements_js__WEBPACK_IMPORTED_MODULE_0__["getEnabledElement"])(element);
+ return enabledElement.image;
+});
+
+/***/ }),
+
+/***/ "./getPixels.js":
+/*!**********************!*\
+ !*** ./getPixels.js ***!
+ \**********************/
+/*! exports provided: default */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+__webpack_require__.r(__webpack_exports__);
+/* harmony import */ var _enabledElements_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./enabledElements.js */ "./enabledElements.js");
+/* harmony import */ var _getStoredPixels_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./getStoredPixels.js */ "./getStoredPixels.js");
+/* harmony import */ var _internal_getModalityLUT_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./internal/getModalityLUT.js */ "./internal/getModalityLUT.js");
+
+
+
+/**
+ * Retrieves an array of pixels from a rectangular region with modality LUT transformation applied
+ *
+ * @param {HTMLElement} element The DOM element enabled for Cornerstone
+ * @param {Number} x The x coordinate of the top left corner of the sampling rectangle in image coordinates
+ * @param {Number} y The y coordinate of the top left corner of the sampling rectangle in image coordinates
+ * @param {Number} width The width of the of the sampling rectangle in image coordinates
+ * @param {Number} height The height of the of the sampling rectangle in image coordinates
+ * @returns {Array} The modality pixel value of the pixels in the sampling rectangle
+ */
+
+/* harmony default export */ __webpack_exports__["default"] = (function (element, x, y, width, height) {
+ var storedPixels = Object(_getStoredPixels_js__WEBPACK_IMPORTED_MODULE_1__["default"])(element, x, y, width, height);
+ var ee = Object(_enabledElements_js__WEBPACK_IMPORTED_MODULE_0__["getEnabledElement"])(element);
+ var mlutfn = Object(_internal_getModalityLUT_js__WEBPACK_IMPORTED_MODULE_2__["default"])(ee.image.slope, ee.image.intercept, ee.viewport.modalityLUT);
+ return storedPixels.map(mlutfn);
+});
+
+/***/ }),
+
+/***/ "./getStoredPixels.js":
+/*!****************************!*\
+ !*** ./getStoredPixels.js ***!
+ \****************************/
+/*! exports provided: default */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+__webpack_require__.r(__webpack_exports__);
+/* harmony import */ var _enabledElements_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./enabledElements.js */ "./enabledElements.js");
+
+/**
+ * Retrieves an array of stored pixel values from a rectangular region of an image
+ *
+ * @param {HTMLElement} element The DOM element enabled for Cornerstone
+ * @param {Number} x The x coordinate of the top left corner of the sampling rectangle in image coordinates
+ * @param {Number} y The y coordinate of the top left corner of the sampling rectangle in image coordinates
+ * @param {Number} width The width of the of the sampling rectangle in image coordinates
+ * @param {Number} height The height of the of the sampling rectangle in image coordinates
+ * @returns {Array} The stored pixel value of the pixels in the sampling rectangle
+ */
+
+/* harmony default export */ __webpack_exports__["default"] = (function (element, x, y, width, height) {
+ if (element === undefined) {
+ throw new Error('getStoredPixels: parameter element must not be undefined');
+ }
+
+ x = Math.round(x);
+ y = Math.round(y);
+ var enabledElement = Object(_enabledElements_js__WEBPACK_IMPORTED_MODULE_0__["getEnabledElement"])(element);
+ var storedPixels = [];
+ var index = 0;
+ var pixelData = enabledElement.image.getPixelData();
+
+ for (var row = 0; row < height; row++) {
+ for (var column = 0; column < width; column++) {
+ var spIndex = (row + y) * enabledElement.image.columns + (column + x);
+ storedPixels[index++] = pixelData[spIndex];
+ }
+ }
+
+ return storedPixels;
+});
+
+/***/ }),
+
+/***/ "./getViewport.js":
+/*!************************!*\
+ !*** ./getViewport.js ***!
+ \************************/
+/*! exports provided: default */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+__webpack_require__.r(__webpack_exports__);
+/* harmony import */ var _enabledElements_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./enabledElements.js */ "./enabledElements.js");
+
+/**
+ * Retrieves the viewport for the specified enabled element
+ *
+ * @param {HTMLElement} element The DOM element enabled for Cornerstone
+ * @returns {Viewport|undefined} The Cornerstone Viewport settings for this element, if they exist. Otherwise, undefined
+ * @memberof ViewportSettings
+ */
+
+/* harmony default export */ __webpack_exports__["default"] = (function (element) {
+ var enabledElement = Object(_enabledElements_js__WEBPACK_IMPORTED_MODULE_0__["getEnabledElement"])(element);
+ var viewport = enabledElement.viewport;
+
+ if (viewport === undefined) {
+ return;
+ } // Return a copy of the viewport
+
+
+ return Object.assign({}, viewport);
+});
+
+/***/ }),
+
+/***/ "./imageCache.js":
+/*!***********************!*\
+ !*** ./imageCache.js ***!
+ \***********************/
+/*! exports provided: cachedImages, setMaximumSizeBytes, putImageLoadObject, getImageLoadObject, removeImageLoadObject, getCacheInfo, purgeCache, changeImageIdCacheSize, default */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+__webpack_require__.r(__webpack_exports__);
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "cachedImages", function() { return cachedImages; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "setMaximumSizeBytes", function() { return setMaximumSizeBytes; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "putImageLoadObject", function() { return putImageLoadObject; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "getImageLoadObject", function() { return getImageLoadObject; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "removeImageLoadObject", function() { return removeImageLoadObject; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "getCacheInfo", function() { return getCacheInfo; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "purgeCache", function() { return purgeCache; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "changeImageIdCacheSize", function() { return changeImageIdCacheSize; });
+/* harmony import */ var _events_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./events.js */ "./events.js");
+/* harmony import */ var _triggerEvent_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./triggerEvent.js */ "./triggerEvent.js");
+
+
+/**
+ * This module deals with caching images
+ * @module ImageCache
+ */
+
+var maximumSizeInBytes = 1024 * 1024 * 1024; // 1 GB
+
+var cacheSizeInBytes = 0; // Dictionary of imageId to cachedImage objects
+
+var imageCacheDict = {}; // Array of cachedImage objects
+
+var cachedImages = [];
+/** Sets the maximum size of cache and purges cache contents if necessary.
+ *
+ * @param {number} numBytes The maximun size that the cache should occupy.
+ * @returns {void}
+ */
+
+function setMaximumSizeBytes(numBytes) {
+ if (numBytes === undefined) {
+ throw new Error('setMaximumSizeBytes: parameter numBytes must not be undefined');
+ }
+
+ if (numBytes.toFixed === undefined) {
+ throw new Error('setMaximumSizeBytes: parameter numBytes must be a number');
+ }
+
+ maximumSizeInBytes = numBytes;
+ Object(_triggerEvent_js__WEBPACK_IMPORTED_MODULE_1__["default"])(_events_js__WEBPACK_IMPORTED_MODULE_0__["events"], _events_js__WEBPACK_IMPORTED_MODULE_0__["default"].IMAGE_CACHE_MAXIMUM_SIZE_CHANGED);
+ purgeCacheIfNecessary();
+}
+/**
+ * Purges the cache if size exceeds maximum
+ * @returns {void}
+ */
+
+function purgeCacheIfNecessary() {
+ // If max cache size has not been exceeded, do nothing
+ if (cacheSizeInBytes <= maximumSizeInBytes) {
+ return;
+ } // Cache size has been exceeded, create list of images sorted by timeStamp
+ // So we can purge the least recently used image
+
+
+ function compare(a, b) {
+ if (a.timeStamp > b.timeStamp) {
+ return -1;
+ }
+
+ if (a.timeStamp < b.timeStamp) {
+ return 1;
+ }
+
+ return 0;
+ }
+
+ cachedImages.sort(compare); // Remove images as necessary)
+
+ while (cacheSizeInBytes > maximumSizeInBytes) {
+ var lastCachedImage = cachedImages[cachedImages.length - 1];
+ var imageId = lastCachedImage.imageId;
+ removeImageLoadObject(imageId);
+ Object(_triggerEvent_js__WEBPACK_IMPORTED_MODULE_1__["default"])(_events_js__WEBPACK_IMPORTED_MODULE_0__["events"], _events_js__WEBPACK_IMPORTED_MODULE_0__["default"].IMAGE_CACHE_PROMISE_REMOVED, {
+ imageId: imageId
+ });
+ }
+
+ var cacheInfo = getCacheInfo();
+ Object(_triggerEvent_js__WEBPACK_IMPORTED_MODULE_1__["default"])(_events_js__WEBPACK_IMPORTED_MODULE_0__["events"], _events_js__WEBPACK_IMPORTED_MODULE_0__["default"].IMAGE_CACHE_FULL, cacheInfo);
+}
+/**
+ * Puts a new image loader into the cache
+ *
+ * @param {string} imageId ImageId of the image loader
+ * @param {Object} imageLoadObject The object that is loading or loaded the image
+ * @returns {void}
+ */
+
+
+function putImageLoadObject(imageId, imageLoadObject) {
+ if (imageId === undefined) {
+ throw new Error('putImageLoadObject: imageId must not be undefined');
+ }
+
+ if (imageLoadObject.promise === undefined) {
+ throw new Error('putImageLoadObject: imageLoadObject.promise must not be undefined');
+ }
+
+ if (imageCacheDict.hasOwnProperty(imageId) === true) {
+ throw new Error('putImageLoadObject: imageId already in cache');
+ }
+
+ if (imageLoadObject.cancelFn && typeof imageLoadObject.cancelFn !== 'function') {
+ throw new Error('putImageLoadObject: imageLoadObject.cancelFn must be a function');
+ }
+
+ var cachedImage = {
+ loaded: false,
+ imageId: imageId,
+ sharedCacheKey: undefined,
+ // The sharedCacheKey for this imageId. undefined by default
+ imageLoadObject: imageLoadObject,
+ timeStamp: Date.now(),
+ sizeInBytes: 0
+ };
+ imageCacheDict[imageId] = cachedImage;
+ cachedImages.push(cachedImage);
+ imageLoadObject.promise.then(function (image) {
+ if (cachedImages.indexOf(cachedImage) === -1) {
+ // If the image has been purged before being loaded, we stop here.
+ return;
+ }
+
+ cachedImage.loaded = true;
+ cachedImage.image = image;
+
+ if (image.sizeInBytes === undefined) {
+ throw new Error('putImageLoadObject: image.sizeInBytes must not be undefined');
+ }
+
+ if (image.sizeInBytes.toFixed === undefined) {
+ throw new Error('putImageLoadObject: image.sizeInBytes is not a number');
+ }
+
+ cachedImage.sizeInBytes = image.sizeInBytes;
+ cacheSizeInBytes += cachedImage.sizeInBytes;
+ var eventDetails = {
+ action: 'addImage',
+ image: cachedImage
+ };
+ Object(_triggerEvent_js__WEBPACK_IMPORTED_MODULE_1__["default"])(_events_js__WEBPACK_IMPORTED_MODULE_0__["events"], _events_js__WEBPACK_IMPORTED_MODULE_0__["default"].IMAGE_CACHE_CHANGED, eventDetails);
+ cachedImage.sharedCacheKey = image.sharedCacheKey;
+ purgeCacheIfNecessary();
+ }, function () {
+ var cachedImage = imageCacheDict[imageId];
+ cachedImages.splice(cachedImages.indexOf(cachedImage), 1);
+ delete imageCacheDict[imageId];
+ });
+}
+/**
+ * Retuns the object that is loading a given imageId
+ *
+ * @param {string} imageId Image ID
+ * @returns {void}
+ */
+
+function getImageLoadObject(imageId) {
+ if (imageId === undefined) {
+ throw new Error('getImageLoadObject: imageId must not be undefined');
+ }
+
+ var cachedImage = imageCacheDict[imageId];
+
+ if (cachedImage === undefined) {
+ return;
+ } // Bump time stamp for cached image
+
+
+ cachedImage.timeStamp = Date.now();
+ return cachedImage.imageLoadObject;
+}
+/**
+ * Removes the image loader associated with a given Id from the cache
+ *
+ * @param {string} imageId Image ID
+ * @returns {void}
+ */
+
+function removeImageLoadObject(imageId) {
+ if (imageId === undefined) {
+ throw new Error('removeImageLoadObject: imageId must not be undefined');
+ }
+
+ var cachedImage = imageCacheDict[imageId];
+
+ if (cachedImage === undefined) {
+ throw new Error('removeImageLoadObject: imageId was not present in imageCache');
+ }
+
+ cachedImages.splice(cachedImages.indexOf(cachedImage), 1);
+ cacheSizeInBytes -= cachedImage.sizeInBytes;
+ var eventDetails = {
+ action: 'deleteImage',
+ image: cachedImage
+ };
+ Object(_triggerEvent_js__WEBPACK_IMPORTED_MODULE_1__["default"])(_events_js__WEBPACK_IMPORTED_MODULE_0__["events"], _events_js__WEBPACK_IMPORTED_MODULE_0__["default"].IMAGE_CACHE_CHANGED, eventDetails);
+ decache(cachedImage.imageLoadObject);
+ delete imageCacheDict[imageId];
+}
+/**
+ * @typedef {Object} CacheInformation
+ * @property {number} maximumSizeInBytes The maximum size of the cache in bytes
+ * @property {number} cacheSizeInBytes Currently occupied space in the cache in bytes
+ * @property {number} numberOfImagesCached Number of ImageLoaders in the cache
+ * @returns {void}
+ */
+
+/**
+ * Gets the current state of the cache
+ * @returns {void}
+ */
+
+function getCacheInfo() {
+ return {
+ maximumSizeInBytes: maximumSizeInBytes,
+ cacheSizeInBytes: cacheSizeInBytes,
+ numberOfImagesCached: cachedImages.length
+ };
+} // This method should only be called by `removeImageLoadObject` because it's
+// The one that knows how to deal with shared cache keys and cache size.
+
+/**
+ * INTERNAL: Removes and ImageLoader from the cache
+ *
+ * @param {Object} imageLoadObject Image Loader Object to remove
+ * @returns {void}
+ */
+
+function decache(imageLoadObject) {
+ imageLoadObject.promise.then(function () {
+ if (imageLoadObject.decache) {
+ imageLoadObject.decache();
+ }
+ }, function () {
+ if (imageLoadObject.decache) {
+ imageLoadObject.decache();
+ }
+ });
+}
+/**
+ * Removes all images from cache
+ * @returns {void}
+ */
+
+
+function purgeCache() {
+ while (cachedImages.length > 0) {
+ var removedCachedImage = cachedImages[0];
+ removeImageLoadObject(removedCachedImage.imageId);
+ }
+}
+/**
+ * Updates the space than an image is using in the cache
+ *
+ * @param {string} imageId Image ID
+ * @param {number} newCacheSize New image size
+ * @returns {void}
+ */
+
+function changeImageIdCacheSize(imageId, newCacheSize) {
+ var cacheEntry = imageCacheDict[imageId];
+
+ if (cacheEntry) {
+ cacheEntry.imageLoadObject.promise.then(function (image) {
+ var cacheSizeDifference = newCacheSize - image.sizeInBytes;
+ image.sizeInBytes = newCacheSize;
+ cacheEntry.sizeInBytes = newCacheSize;
+ cacheSizeInBytes += cacheSizeDifference;
+ var eventDetails = {
+ action: 'changeImageSize',
+ image: image
+ };
+ Object(_triggerEvent_js__WEBPACK_IMPORTED_MODULE_1__["default"])(_events_js__WEBPACK_IMPORTED_MODULE_0__["events"], _events_js__WEBPACK_IMPORTED_MODULE_0__["default"].IMAGE_CACHE_CHANGED, eventDetails);
+ });
+ }
+}
+/* harmony default export */ __webpack_exports__["default"] = ({
+ imageCache: imageCacheDict,
+ cachedImages: cachedImages,
+ setMaximumSizeBytes: setMaximumSizeBytes,
+ putImageLoadObject: putImageLoadObject,
+ getImageLoadObject: getImageLoadObject,
+ removeImageLoadObject: removeImageLoadObject,
+ getCacheInfo: getCacheInfo,
+ purgeCache: purgeCache,
+ changeImageIdCacheSize: changeImageIdCacheSize
+});
+
+/***/ }),
+
+/***/ "./imageLoader.js":
+/*!************************!*\
+ !*** ./imageLoader.js ***!
+ \************************/
+/*! exports provided: loadImage, loadAndCacheImage, registerImageLoader, registerUnknownImageLoader */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+__webpack_require__.r(__webpack_exports__);
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "loadImage", function() { return loadImage; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "loadAndCacheImage", function() { return loadAndCacheImage; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "registerImageLoader", function() { return registerImageLoader; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "registerUnknownImageLoader", function() { return registerUnknownImageLoader; });
+/* harmony import */ var _imageCache_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./imageCache.js */ "./imageCache.js");
+/* harmony import */ var _events_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./events.js */ "./events.js");
+/* harmony import */ var _triggerEvent_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./triggerEvent.js */ "./triggerEvent.js");
+
+
+
+/**
+ * This module deals with ImageLoaders, loading images and caching images
+ * @module ImageLoader
+ */
+
+var imageLoaders = {};
+var unknownImageLoader;
+/**
+ * Load an image using a registered Cornerstone Image Loader.
+ *
+ * The image loader that is used will be
+ * determined by the image loader scheme matching against the imageId.
+ *
+ * @param {String} imageId A Cornerstone Image Object's imageId
+ * @param {Object} [options] Options to be passed to the Image Loader
+ *
+ * @returns {ImageLoadObject} An Object which can be used to act after an image is loaded or loading fails
+ * @memberof ImageLoader
+ */
+
+function loadImageFromImageLoader(imageId, options) {
+ var colonIndex = imageId.indexOf(':');
+ var scheme = imageId.substring(0, colonIndex);
+ var loader = imageLoaders[scheme];
+
+ if (loader === undefined || loader === null) {
+ if (unknownImageLoader !== undefined) {
+ return unknownImageLoader(imageId);
+ }
+
+ throw new Error('loadImageFromImageLoader: no image loader for imageId');
+ }
+
+ var imageLoadObject = loader(imageId, options); // Broadcast an image loaded event once the image is loaded
+
+ imageLoadObject.promise.then(function (image) {
+ Object(_triggerEvent_js__WEBPACK_IMPORTED_MODULE_2__["default"])(_events_js__WEBPACK_IMPORTED_MODULE_1__["events"], _events_js__WEBPACK_IMPORTED_MODULE_1__["default"].IMAGE_LOADED, {
+ image: image
+ });
+ }, function (error) {
+ var errorObject = {
+ imageId: imageId,
+ error: error
+ };
+ Object(_triggerEvent_js__WEBPACK_IMPORTED_MODULE_2__["default"])(_events_js__WEBPACK_IMPORTED_MODULE_1__["events"], _events_js__WEBPACK_IMPORTED_MODULE_1__["default"].IMAGE_LOAD_FAILED, errorObject);
+ });
+ return imageLoadObject;
+}
+/**
+ * Loads an image given an imageId and optional priority and returns a promise which will resolve to
+ * the loaded image object or fail if an error occurred. The loaded image is not stored in the cache.
+ *
+ * @param {String} imageId A Cornerstone Image Object's imageId
+ * @param {Object} [options] Options to be passed to the Image Loader
+ *
+ * @returns {ImageLoadObject} An Object which can be used to act after an image is loaded or loading fails
+ * @memberof ImageLoader
+ */
+
+
+function loadImage(imageId, options) {
+ if (imageId === undefined) {
+ throw new Error('loadImage: parameter imageId must not be undefined');
+ }
+
+ var imageLoadObject = Object(_imageCache_js__WEBPACK_IMPORTED_MODULE_0__["getImageLoadObject"])(imageId);
+
+ if (imageLoadObject !== undefined) {
+ return imageLoadObject.promise;
+ }
+
+ return loadImageFromImageLoader(imageId, options).promise;
+} //
+
+/**
+ * Loads an image given an imageId and optional priority and returns a promise which will resolve to
+ * the loaded image object or fail if an error occurred. The image is stored in the cache.
+ *
+ * @param {String} imageId A Cornerstone Image Object's imageId
+ * @param {Object} [options] Options to be passed to the Image Loader
+ *
+ * @returns {ImageLoadObject} Image Loader Object
+ * @memberof ImageLoader
+ */
+
+function loadAndCacheImage(imageId, options) {
+ if (imageId === undefined) {
+ throw new Error('loadAndCacheImage: parameter imageId must not be undefined');
+ }
+
+ var imageLoadObject = Object(_imageCache_js__WEBPACK_IMPORTED_MODULE_0__["getImageLoadObject"])(imageId);
+
+ if (imageLoadObject !== undefined) {
+ return imageLoadObject.promise;
+ }
+
+ imageLoadObject = loadImageFromImageLoader(imageId, options);
+ Object(_imageCache_js__WEBPACK_IMPORTED_MODULE_0__["putImageLoadObject"])(imageId, imageLoadObject);
+ return imageLoadObject.promise;
+}
+/**
+ * Registers an imageLoader plugin with cornerstone for the specified scheme
+ *
+ * @param {String} scheme The scheme to use for this image loader (e.g. 'dicomweb', 'wadouri', 'http')
+ * @param {Function} imageLoader A Cornerstone Image Loader function
+ * @returns {void}
+ * @memberof ImageLoader
+ */
+
+function registerImageLoader(scheme, imageLoader) {
+ imageLoaders[scheme] = imageLoader;
+}
+/**
+ * Registers a new unknownImageLoader and returns the previous one
+ *
+ * @param {Function} imageLoader A Cornerstone Image Loader
+ *
+ * @returns {Function|Undefined} The previous Unknown Image Loader
+ * @memberof ImageLoader
+ */
+
+function registerUnknownImageLoader(imageLoader) {
+ var oldImageLoader = unknownImageLoader;
+ unknownImageLoader = imageLoader;
+ return oldImageLoader;
+}
+
+/***/ }),
+
+/***/ "./index.js":
+/*!******************!*\
+ !*** ./index.js ***!
+ \******************/
+/*! exports provided: drawImage, generateLut, getDefaultViewport, requestAnimationFrame, storedPixelDataToCanvasImageData, storedColorPixelDataToCanvasImageData, storedPixelDataToCanvasImageDataColorLUT, storedPixelDataToCanvasImageDataPseudocolorLUT, internal, renderLabelMapImage, renderPseudoColorImage, renderColorImage, renderGrayscaleImage, renderWebImage, renderToCanvas, canvasToPixel, disable, displayImage, draw, drawInvalidated, enable, getElementData, removeElementData, getEnabledElement, addEnabledElement, getEnabledElementsByImageId, getEnabledElements, addLayer, removeLayer, getLayer, getLayers, getVisibleLayers, setActiveLayer, getActiveLayer, purgeLayers, setLayerImage, fitToWindow, getDefaultViewportForImage, getImage, getPixels, getStoredPixels, getViewport, loadImage, loadAndCacheImage, registerImageLoader, registerUnknownImageLoader, invalidate, invalidateImageId, pageToPixel, pixelToCanvas, reset, resize, setToPixelCoordinateSystem, setViewport, updateImage, pixelDataToFalseColorData, rendering, imageCache, metaData, webGL, colors, convertImageToFalseColorImage, convertToFalseColorImage, restoreImage, EVENTS, events, triggerEvent, default */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+__webpack_require__.r(__webpack_exports__);
+/* harmony import */ var _internal_drawImage_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./internal/drawImage.js */ "./internal/drawImage.js");
+/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "drawImage", function() { return _internal_drawImage_js__WEBPACK_IMPORTED_MODULE_0__["default"]; });
+
+/* harmony import */ var _internal_generateLut_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./internal/generateLut.js */ "./internal/generateLut.js");
+/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "generateLut", function() { return _internal_generateLut_js__WEBPACK_IMPORTED_MODULE_1__["default"]; });
+
+/* harmony import */ var _internal_getDefaultViewport_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./internal/getDefaultViewport.js */ "./internal/getDefaultViewport.js");
+/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "getDefaultViewport", function() { return _internal_getDefaultViewport_js__WEBPACK_IMPORTED_MODULE_2__["default"]; });
+
+/* harmony import */ var _internal_requestAnimationFrame_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./internal/requestAnimationFrame.js */ "./internal/requestAnimationFrame.js");
+/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "requestAnimationFrame", function() { return _internal_requestAnimationFrame_js__WEBPACK_IMPORTED_MODULE_3__["default"]; });
+
+/* harmony import */ var _internal_storedPixelDataToCanvasImageData_js__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./internal/storedPixelDataToCanvasImageData.js */ "./internal/storedPixelDataToCanvasImageData.js");
+/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "storedPixelDataToCanvasImageData", function() { return _internal_storedPixelDataToCanvasImageData_js__WEBPACK_IMPORTED_MODULE_4__["default"]; });
+
+/* harmony import */ var _internal_storedColorPixelDataToCanvasImageData_js__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ./internal/storedColorPixelDataToCanvasImageData.js */ "./internal/storedColorPixelDataToCanvasImageData.js");
+/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "storedColorPixelDataToCanvasImageData", function() { return _internal_storedColorPixelDataToCanvasImageData_js__WEBPACK_IMPORTED_MODULE_5__["default"]; });
+
+/* harmony import */ var _internal_storedPixelDataToCanvasImageDataColorLUT_js__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ./internal/storedPixelDataToCanvasImageDataColorLUT.js */ "./internal/storedPixelDataToCanvasImageDataColorLUT.js");
+/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "storedPixelDataToCanvasImageDataColorLUT", function() { return _internal_storedPixelDataToCanvasImageDataColorLUT_js__WEBPACK_IMPORTED_MODULE_6__["default"]; });
+
+/* harmony import */ var _internal_storedPixelDataToCanvasImageDataPseudocolorLUT_js__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ./internal/storedPixelDataToCanvasImageDataPseudocolorLUT.js */ "./internal/storedPixelDataToCanvasImageDataPseudocolorLUT.js");
+/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "storedPixelDataToCanvasImageDataPseudocolorLUT", function() { return _internal_storedPixelDataToCanvasImageDataPseudocolorLUT_js__WEBPACK_IMPORTED_MODULE_7__["default"]; });
+
+/* harmony import */ var _internal_index_js__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ./internal/index.js */ "./internal/index.js");
+/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "internal", function() { return _internal_index_js__WEBPACK_IMPORTED_MODULE_8__["default"]; });
+
+/* harmony import */ var _rendering_renderLabelMapImage_js__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! ./rendering/renderLabelMapImage.js */ "./rendering/renderLabelMapImage.js");
+/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "renderLabelMapImage", function() { return _rendering_renderLabelMapImage_js__WEBPACK_IMPORTED_MODULE_9__["renderLabelMapImage"]; });
+
+/* harmony import */ var _rendering_renderPseudoColorImage_js__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(/*! ./rendering/renderPseudoColorImage.js */ "./rendering/renderPseudoColorImage.js");
+/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "renderPseudoColorImage", function() { return _rendering_renderPseudoColorImage_js__WEBPACK_IMPORTED_MODULE_10__["renderPseudoColorImage"]; });
+
+/* harmony import */ var _rendering_renderColorImage_js__WEBPACK_IMPORTED_MODULE_11__ = __webpack_require__(/*! ./rendering/renderColorImage.js */ "./rendering/renderColorImage.js");
+/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "renderColorImage", function() { return _rendering_renderColorImage_js__WEBPACK_IMPORTED_MODULE_11__["renderColorImage"]; });
+
+/* harmony import */ var _rendering_renderGrayscaleImage_js__WEBPACK_IMPORTED_MODULE_12__ = __webpack_require__(/*! ./rendering/renderGrayscaleImage.js */ "./rendering/renderGrayscaleImage.js");
+/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "renderGrayscaleImage", function() { return _rendering_renderGrayscaleImage_js__WEBPACK_IMPORTED_MODULE_12__["renderGrayscaleImage"]; });
+
+/* harmony import */ var _rendering_renderWebImage_js__WEBPACK_IMPORTED_MODULE_13__ = __webpack_require__(/*! ./rendering/renderWebImage.js */ "./rendering/renderWebImage.js");
+/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "renderWebImage", function() { return _rendering_renderWebImage_js__WEBPACK_IMPORTED_MODULE_13__["renderWebImage"]; });
+
+/* harmony import */ var _rendering_renderToCanvas_js__WEBPACK_IMPORTED_MODULE_14__ = __webpack_require__(/*! ./rendering/renderToCanvas.js */ "./rendering/renderToCanvas.js");
+/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "renderToCanvas", function() { return _rendering_renderToCanvas_js__WEBPACK_IMPORTED_MODULE_14__["default"]; });
+
+/* harmony import */ var _canvasToPixel_js__WEBPACK_IMPORTED_MODULE_15__ = __webpack_require__(/*! ./canvasToPixel.js */ "./canvasToPixel.js");
+/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "canvasToPixel", function() { return _canvasToPixel_js__WEBPACK_IMPORTED_MODULE_15__["default"]; });
+
+/* harmony import */ var _disable_js__WEBPACK_IMPORTED_MODULE_16__ = __webpack_require__(/*! ./disable.js */ "./disable.js");
+/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "disable", function() { return _disable_js__WEBPACK_IMPORTED_MODULE_16__["default"]; });
+
+/* harmony import */ var _displayImage_js__WEBPACK_IMPORTED_MODULE_17__ = __webpack_require__(/*! ./displayImage.js */ "./displayImage.js");
+/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "displayImage", function() { return _displayImage_js__WEBPACK_IMPORTED_MODULE_17__["default"]; });
+
+/* harmony import */ var _draw_js__WEBPACK_IMPORTED_MODULE_18__ = __webpack_require__(/*! ./draw.js */ "./draw.js");
+/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "draw", function() { return _draw_js__WEBPACK_IMPORTED_MODULE_18__["default"]; });
+
+/* harmony import */ var _drawInvalidated_js__WEBPACK_IMPORTED_MODULE_19__ = __webpack_require__(/*! ./drawInvalidated.js */ "./drawInvalidated.js");
+/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "drawInvalidated", function() { return _drawInvalidated_js__WEBPACK_IMPORTED_MODULE_19__["default"]; });
+
+/* harmony import */ var _enable_js__WEBPACK_IMPORTED_MODULE_20__ = __webpack_require__(/*! ./enable.js */ "./enable.js");
+/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "enable", function() { return _enable_js__WEBPACK_IMPORTED_MODULE_20__["default"]; });
+
+/* harmony import */ var _enabledElementData_js__WEBPACK_IMPORTED_MODULE_21__ = __webpack_require__(/*! ./enabledElementData.js */ "./enabledElementData.js");
+/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "getElementData", function() { return _enabledElementData_js__WEBPACK_IMPORTED_MODULE_21__["getElementData"]; });
+
+/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "removeElementData", function() { return _enabledElementData_js__WEBPACK_IMPORTED_MODULE_21__["removeElementData"]; });
+
+/* harmony import */ var _enabledElements_js__WEBPACK_IMPORTED_MODULE_22__ = __webpack_require__(/*! ./enabledElements.js */ "./enabledElements.js");
+/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "getEnabledElement", function() { return _enabledElements_js__WEBPACK_IMPORTED_MODULE_22__["getEnabledElement"]; });
+
+/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "addEnabledElement", function() { return _enabledElements_js__WEBPACK_IMPORTED_MODULE_22__["addEnabledElement"]; });
+
+/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "getEnabledElementsByImageId", function() { return _enabledElements_js__WEBPACK_IMPORTED_MODULE_22__["getEnabledElementsByImageId"]; });
+
+/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "getEnabledElements", function() { return _enabledElements_js__WEBPACK_IMPORTED_MODULE_22__["getEnabledElements"]; });
+
+/* harmony import */ var _layers_js__WEBPACK_IMPORTED_MODULE_23__ = __webpack_require__(/*! ./layers.js */ "./layers.js");
+/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "addLayer", function() { return _layers_js__WEBPACK_IMPORTED_MODULE_23__["addLayer"]; });
+
+/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "removeLayer", function() { return _layers_js__WEBPACK_IMPORTED_MODULE_23__["removeLayer"]; });
+
+/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "getLayer", function() { return _layers_js__WEBPACK_IMPORTED_MODULE_23__["getLayer"]; });
+
+/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "getLayers", function() { return _layers_js__WEBPACK_IMPORTED_MODULE_23__["getLayers"]; });
+
+/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "getVisibleLayers", function() { return _layers_js__WEBPACK_IMPORTED_MODULE_23__["getVisibleLayers"]; });
+
+/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "setActiveLayer", function() { return _layers_js__WEBPACK_IMPORTED_MODULE_23__["setActiveLayer"]; });
+
+/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "getActiveLayer", function() { return _layers_js__WEBPACK_IMPORTED_MODULE_23__["getActiveLayer"]; });
+
+/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "purgeLayers", function() { return _layers_js__WEBPACK_IMPORTED_MODULE_23__["purgeLayers"]; });
+
+/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "setLayerImage", function() { return _layers_js__WEBPACK_IMPORTED_MODULE_23__["setLayerImage"]; });
+
+/* harmony import */ var _fitToWindow_js__WEBPACK_IMPORTED_MODULE_24__ = __webpack_require__(/*! ./fitToWindow.js */ "./fitToWindow.js");
+/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "fitToWindow", function() { return _fitToWindow_js__WEBPACK_IMPORTED_MODULE_24__["default"]; });
+
+/* harmony import */ var _getDefaultViewportForImage_js__WEBPACK_IMPORTED_MODULE_25__ = __webpack_require__(/*! ./getDefaultViewportForImage.js */ "./getDefaultViewportForImage.js");
+/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "getDefaultViewportForImage", function() { return _getDefaultViewportForImage_js__WEBPACK_IMPORTED_MODULE_25__["default"]; });
+
+/* harmony import */ var _getImage_js__WEBPACK_IMPORTED_MODULE_26__ = __webpack_require__(/*! ./getImage.js */ "./getImage.js");
+/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "getImage", function() { return _getImage_js__WEBPACK_IMPORTED_MODULE_26__["default"]; });
+
+/* harmony import */ var _getPixels_js__WEBPACK_IMPORTED_MODULE_27__ = __webpack_require__(/*! ./getPixels.js */ "./getPixels.js");
+/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "getPixels", function() { return _getPixels_js__WEBPACK_IMPORTED_MODULE_27__["default"]; });
+
+/* harmony import */ var _getStoredPixels_js__WEBPACK_IMPORTED_MODULE_28__ = __webpack_require__(/*! ./getStoredPixels.js */ "./getStoredPixels.js");
+/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "getStoredPixels", function() { return _getStoredPixels_js__WEBPACK_IMPORTED_MODULE_28__["default"]; });
+
+/* harmony import */ var _getViewport_js__WEBPACK_IMPORTED_MODULE_29__ = __webpack_require__(/*! ./getViewport.js */ "./getViewport.js");
+/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "getViewport", function() { return _getViewport_js__WEBPACK_IMPORTED_MODULE_29__["default"]; });
+
+/* harmony import */ var _imageLoader_js__WEBPACK_IMPORTED_MODULE_30__ = __webpack_require__(/*! ./imageLoader.js */ "./imageLoader.js");
+/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "loadImage", function() { return _imageLoader_js__WEBPACK_IMPORTED_MODULE_30__["loadImage"]; });
+
+/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "loadAndCacheImage", function() { return _imageLoader_js__WEBPACK_IMPORTED_MODULE_30__["loadAndCacheImage"]; });
+
+/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "registerImageLoader", function() { return _imageLoader_js__WEBPACK_IMPORTED_MODULE_30__["registerImageLoader"]; });
+
+/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "registerUnknownImageLoader", function() { return _imageLoader_js__WEBPACK_IMPORTED_MODULE_30__["registerUnknownImageLoader"]; });
+
+/* harmony import */ var _invalidate_js__WEBPACK_IMPORTED_MODULE_31__ = __webpack_require__(/*! ./invalidate.js */ "./invalidate.js");
+/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "invalidate", function() { return _invalidate_js__WEBPACK_IMPORTED_MODULE_31__["default"]; });
+
+/* harmony import */ var _invalidateImageId_js__WEBPACK_IMPORTED_MODULE_32__ = __webpack_require__(/*! ./invalidateImageId.js */ "./invalidateImageId.js");
+/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "invalidateImageId", function() { return _invalidateImageId_js__WEBPACK_IMPORTED_MODULE_32__["default"]; });
+
+/* harmony import */ var _pageToPixel_js__WEBPACK_IMPORTED_MODULE_33__ = __webpack_require__(/*! ./pageToPixel.js */ "./pageToPixel.js");
+/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "pageToPixel", function() { return _pageToPixel_js__WEBPACK_IMPORTED_MODULE_33__["default"]; });
+
+/* harmony import */ var _pixelToCanvas_js__WEBPACK_IMPORTED_MODULE_34__ = __webpack_require__(/*! ./pixelToCanvas.js */ "./pixelToCanvas.js");
+/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "pixelToCanvas", function() { return _pixelToCanvas_js__WEBPACK_IMPORTED_MODULE_34__["default"]; });
+
+/* harmony import */ var _reset_js__WEBPACK_IMPORTED_MODULE_35__ = __webpack_require__(/*! ./reset.js */ "./reset.js");
+/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "reset", function() { return _reset_js__WEBPACK_IMPORTED_MODULE_35__["default"]; });
+
+/* harmony import */ var _resize_js__WEBPACK_IMPORTED_MODULE_36__ = __webpack_require__(/*! ./resize.js */ "./resize.js");
+/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "resize", function() { return _resize_js__WEBPACK_IMPORTED_MODULE_36__["default"]; });
+
+/* harmony import */ var _setToPixelCoordinateSystem_js__WEBPACK_IMPORTED_MODULE_37__ = __webpack_require__(/*! ./setToPixelCoordinateSystem.js */ "./setToPixelCoordinateSystem.js");
+/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "setToPixelCoordinateSystem", function() { return _setToPixelCoordinateSystem_js__WEBPACK_IMPORTED_MODULE_37__["default"]; });
+
+/* harmony import */ var _setViewport_js__WEBPACK_IMPORTED_MODULE_38__ = __webpack_require__(/*! ./setViewport.js */ "./setViewport.js");
+/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "setViewport", function() { return _setViewport_js__WEBPACK_IMPORTED_MODULE_38__["default"]; });
+
+/* harmony import */ var _updateImage_js__WEBPACK_IMPORTED_MODULE_39__ = __webpack_require__(/*! ./updateImage.js */ "./updateImage.js");
+/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "updateImage", function() { return _updateImage_js__WEBPACK_IMPORTED_MODULE_39__["default"]; });
+
+/* harmony import */ var _pixelDataToFalseColorData_js__WEBPACK_IMPORTED_MODULE_40__ = __webpack_require__(/*! ./pixelDataToFalseColorData.js */ "./pixelDataToFalseColorData.js");
+/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "pixelDataToFalseColorData", function() { return _pixelDataToFalseColorData_js__WEBPACK_IMPORTED_MODULE_40__["default"]; });
+
+/* harmony import */ var _rendering_index_js__WEBPACK_IMPORTED_MODULE_41__ = __webpack_require__(/*! ./rendering/index.js */ "./rendering/index.js");
+/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "rendering", function() { return _rendering_index_js__WEBPACK_IMPORTED_MODULE_41__["default"]; });
+
+/* harmony import */ var _imageCache_js__WEBPACK_IMPORTED_MODULE_42__ = __webpack_require__(/*! ./imageCache.js */ "./imageCache.js");
+/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "imageCache", function() { return _imageCache_js__WEBPACK_IMPORTED_MODULE_42__["default"]; });
+
+/* harmony import */ var _metaData_js__WEBPACK_IMPORTED_MODULE_43__ = __webpack_require__(/*! ./metaData.js */ "./metaData.js");
+/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "metaData", function() { return _metaData_js__WEBPACK_IMPORTED_MODULE_43__["default"]; });
+
+/* harmony import */ var _webgl_index_js__WEBPACK_IMPORTED_MODULE_44__ = __webpack_require__(/*! ./webgl/index.js */ "./webgl/index.js");
+/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "webGL", function() { return _webgl_index_js__WEBPACK_IMPORTED_MODULE_44__["default"]; });
+
+/* harmony import */ var _colors_index_js__WEBPACK_IMPORTED_MODULE_45__ = __webpack_require__(/*! ./colors/index.js */ "./colors/index.js");
+/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "colors", function() { return _colors_index_js__WEBPACK_IMPORTED_MODULE_45__["default"]; });
+
+/* harmony import */ var _falseColorMapping_js__WEBPACK_IMPORTED_MODULE_46__ = __webpack_require__(/*! ./falseColorMapping.js */ "./falseColorMapping.js");
+/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "convertImageToFalseColorImage", function() { return _falseColorMapping_js__WEBPACK_IMPORTED_MODULE_46__["convertImageToFalseColorImage"]; });
+
+/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "convertToFalseColorImage", function() { return _falseColorMapping_js__WEBPACK_IMPORTED_MODULE_46__["convertToFalseColorImage"]; });
+
+/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "restoreImage", function() { return _falseColorMapping_js__WEBPACK_IMPORTED_MODULE_46__["restoreImage"]; });
+
+/* harmony import */ var _events_js__WEBPACK_IMPORTED_MODULE_47__ = __webpack_require__(/*! ./events.js */ "./events.js");
+/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "EVENTS", function() { return _events_js__WEBPACK_IMPORTED_MODULE_47__["default"]; });
+
+/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "events", function() { return _events_js__WEBPACK_IMPORTED_MODULE_47__["events"]; });
+
+/* harmony import */ var _triggerEvent_js__WEBPACK_IMPORTED_MODULE_48__ = __webpack_require__(/*! ./triggerEvent.js */ "./triggerEvent.js");
+/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "triggerEvent", function() { return _triggerEvent_js__WEBPACK_IMPORTED_MODULE_48__["default"]; });
+
+// Internal (some of these are from old internal/legacy expose)
+
+
+
+
+
+
+
+
+ // Rendering
+
+
+
+
+
+
+
+/**
+ * @module PixelCoordinateSystem
+ */
+
+/**
+ * @module ViewportSettings
+ */
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+var cornerstone = {
+ drawImage: _internal_drawImage_js__WEBPACK_IMPORTED_MODULE_0__["default"],
+ generateLut: _internal_generateLut_js__WEBPACK_IMPORTED_MODULE_1__["default"],
+ getDefaultViewport: _internal_getDefaultViewport_js__WEBPACK_IMPORTED_MODULE_2__["default"],
+ requestAnimationFrame: _internal_requestAnimationFrame_js__WEBPACK_IMPORTED_MODULE_3__["default"],
+ storedPixelDataToCanvasImageData: _internal_storedPixelDataToCanvasImageData_js__WEBPACK_IMPORTED_MODULE_4__["default"],
+ storedColorPixelDataToCanvasImageData: _internal_storedColorPixelDataToCanvasImageData_js__WEBPACK_IMPORTED_MODULE_5__["default"],
+ storedPixelDataToCanvasImageDataColorLUT: _internal_storedPixelDataToCanvasImageDataColorLUT_js__WEBPACK_IMPORTED_MODULE_6__["default"],
+ storedPixelDataToCanvasImageDataPseudocolorLUT: _internal_storedPixelDataToCanvasImageDataPseudocolorLUT_js__WEBPACK_IMPORTED_MODULE_7__["default"],
+ internal: _internal_index_js__WEBPACK_IMPORTED_MODULE_8__["default"],
+ renderLabelMapImage: _rendering_renderLabelMapImage_js__WEBPACK_IMPORTED_MODULE_9__["renderLabelMapImage"],
+ renderPseudoColorImage: _rendering_renderPseudoColorImage_js__WEBPACK_IMPORTED_MODULE_10__["renderPseudoColorImage"],
+ renderColorImage: _rendering_renderColorImage_js__WEBPACK_IMPORTED_MODULE_11__["renderColorImage"],
+ renderGrayscaleImage: _rendering_renderGrayscaleImage_js__WEBPACK_IMPORTED_MODULE_12__["renderGrayscaleImage"],
+ renderWebImage: _rendering_renderWebImage_js__WEBPACK_IMPORTED_MODULE_13__["renderWebImage"],
+ renderToCanvas: _rendering_renderToCanvas_js__WEBPACK_IMPORTED_MODULE_14__["default"],
+ canvasToPixel: _canvasToPixel_js__WEBPACK_IMPORTED_MODULE_15__["default"],
+ disable: _disable_js__WEBPACK_IMPORTED_MODULE_16__["default"],
+ displayImage: _displayImage_js__WEBPACK_IMPORTED_MODULE_17__["default"],
+ draw: _draw_js__WEBPACK_IMPORTED_MODULE_18__["default"],
+ drawInvalidated: _drawInvalidated_js__WEBPACK_IMPORTED_MODULE_19__["default"],
+ enable: _enable_js__WEBPACK_IMPORTED_MODULE_20__["default"],
+ getElementData: _enabledElementData_js__WEBPACK_IMPORTED_MODULE_21__["getElementData"],
+ removeElementData: _enabledElementData_js__WEBPACK_IMPORTED_MODULE_21__["removeElementData"],
+ getEnabledElement: _enabledElements_js__WEBPACK_IMPORTED_MODULE_22__["getEnabledElement"],
+ addEnabledElement: _enabledElements_js__WEBPACK_IMPORTED_MODULE_22__["addEnabledElement"],
+ getEnabledElementsByImageId: _enabledElements_js__WEBPACK_IMPORTED_MODULE_22__["getEnabledElementsByImageId"],
+ getEnabledElements: _enabledElements_js__WEBPACK_IMPORTED_MODULE_22__["getEnabledElements"],
+ addLayer: _layers_js__WEBPACK_IMPORTED_MODULE_23__["addLayer"],
+ removeLayer: _layers_js__WEBPACK_IMPORTED_MODULE_23__["removeLayer"],
+ getLayer: _layers_js__WEBPACK_IMPORTED_MODULE_23__["getLayer"],
+ getLayers: _layers_js__WEBPACK_IMPORTED_MODULE_23__["getLayers"],
+ getVisibleLayers: _layers_js__WEBPACK_IMPORTED_MODULE_23__["getVisibleLayers"],
+ setActiveLayer: _layers_js__WEBPACK_IMPORTED_MODULE_23__["setActiveLayer"],
+ getActiveLayer: _layers_js__WEBPACK_IMPORTED_MODULE_23__["getActiveLayer"],
+ purgeLayers: _layers_js__WEBPACK_IMPORTED_MODULE_23__["purgeLayers"],
+ setLayerImage: _layers_js__WEBPACK_IMPORTED_MODULE_23__["setLayerImage"],
+ fitToWindow: _fitToWindow_js__WEBPACK_IMPORTED_MODULE_24__["default"],
+ getDefaultViewportForImage: _getDefaultViewportForImage_js__WEBPACK_IMPORTED_MODULE_25__["default"],
+ getImage: _getImage_js__WEBPACK_IMPORTED_MODULE_26__["default"],
+ getPixels: _getPixels_js__WEBPACK_IMPORTED_MODULE_27__["default"],
+ getStoredPixels: _getStoredPixels_js__WEBPACK_IMPORTED_MODULE_28__["default"],
+ getViewport: _getViewport_js__WEBPACK_IMPORTED_MODULE_29__["default"],
+ loadImage: _imageLoader_js__WEBPACK_IMPORTED_MODULE_30__["loadImage"],
+ loadAndCacheImage: _imageLoader_js__WEBPACK_IMPORTED_MODULE_30__["loadAndCacheImage"],
+ registerImageLoader: _imageLoader_js__WEBPACK_IMPORTED_MODULE_30__["registerImageLoader"],
+ registerUnknownImageLoader: _imageLoader_js__WEBPACK_IMPORTED_MODULE_30__["registerUnknownImageLoader"],
+ invalidate: _invalidate_js__WEBPACK_IMPORTED_MODULE_31__["default"],
+ invalidateImageId: _invalidateImageId_js__WEBPACK_IMPORTED_MODULE_32__["default"],
+ pageToPixel: _pageToPixel_js__WEBPACK_IMPORTED_MODULE_33__["default"],
+ pixelToCanvas: _pixelToCanvas_js__WEBPACK_IMPORTED_MODULE_34__["default"],
+ reset: _reset_js__WEBPACK_IMPORTED_MODULE_35__["default"],
+ resize: _resize_js__WEBPACK_IMPORTED_MODULE_36__["default"],
+ setToPixelCoordinateSystem: _setToPixelCoordinateSystem_js__WEBPACK_IMPORTED_MODULE_37__["default"],
+ setViewport: _setViewport_js__WEBPACK_IMPORTED_MODULE_38__["default"],
+ updateImage: _updateImage_js__WEBPACK_IMPORTED_MODULE_39__["default"],
+ pixelDataToFalseColorData: _pixelDataToFalseColorData_js__WEBPACK_IMPORTED_MODULE_40__["default"],
+ rendering: _rendering_index_js__WEBPACK_IMPORTED_MODULE_41__["default"],
+ imageCache: _imageCache_js__WEBPACK_IMPORTED_MODULE_42__["default"],
+ metaData: _metaData_js__WEBPACK_IMPORTED_MODULE_43__["default"],
+ webGL: _webgl_index_js__WEBPACK_IMPORTED_MODULE_44__["default"],
+ colors: _colors_index_js__WEBPACK_IMPORTED_MODULE_45__["default"],
+ convertImageToFalseColorImage: _falseColorMapping_js__WEBPACK_IMPORTED_MODULE_46__["convertImageToFalseColorImage"],
+ convertToFalseColorImage: _falseColorMapping_js__WEBPACK_IMPORTED_MODULE_46__["convertToFalseColorImage"],
+ restoreImage: _falseColorMapping_js__WEBPACK_IMPORTED_MODULE_46__["restoreImage"],
+ EVENTS: _events_js__WEBPACK_IMPORTED_MODULE_47__["default"],
+ events: _events_js__WEBPACK_IMPORTED_MODULE_47__["events"],
+ triggerEvent: _triggerEvent_js__WEBPACK_IMPORTED_MODULE_48__["default"]
+};
+
+/* harmony default export */ __webpack_exports__["default"] = (cornerstone);
+
+/***/ }),
+
+/***/ "./internal/calculateTransform.js":
+/*!****************************************!*\
+ !*** ./internal/calculateTransform.js ***!
+ \****************************************/
+/*! exports provided: default */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+__webpack_require__.r(__webpack_exports__);
+/* harmony import */ var _transform_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./transform.js */ "./internal/transform.js");
+
+/**
+ * Calculate the transform for a Cornerstone enabled element
+ *
+ * @param {EnabledElement} enabledElement The Cornerstone Enabled Element
+ * @param {Number} [scale] The viewport scale
+ * @return {Transform} The current transform
+ * @memberof Internal
+ */
+
+/* harmony default export */ __webpack_exports__["default"] = (function (enabledElement, scale) {
+ var transform = new _transform_js__WEBPACK_IMPORTED_MODULE_0__["Transform"](); // Move to center of canvas
+
+ transform.translate(enabledElement.canvas.width / 2, enabledElement.canvas.height / 2); // Apply the rotation before scaling for non square pixels
+
+ var angle = enabledElement.viewport.rotation;
+
+ if (angle !== 0) {
+ transform.rotate(angle * Math.PI / 180);
+ } // Apply the scale
+
+
+ var widthScale = enabledElement.viewport.scale;
+ var heightScale = enabledElement.viewport.scale;
+ var width = enabledElement.viewport.displayedArea.brhc.x - (enabledElement.viewport.displayedArea.tlhc.x - 1);
+ var height = enabledElement.viewport.displayedArea.brhc.y - (enabledElement.viewport.displayedArea.tlhc.y - 1);
+
+ if (enabledElement.viewport.displayedArea.presentationSizeMode === 'NONE') {
+ if (enabledElement.image.rowPixelSpacing < enabledElement.image.columnPixelSpacing) {
+ widthScale *= enabledElement.image.columnPixelSpacing / enabledElement.image.rowPixelSpacing;
+ } else if (enabledElement.image.columnPixelSpacing < enabledElement.image.rowPixelSpacing) {
+ heightScale *= enabledElement.image.rowPixelSpacing / enabledElement.image.columnPixelSpacing;
+ }
+ } else {
+ // These should be good for "TRUE SIZE" and "MAGNIFY"
+ widthScale = enabledElement.viewport.displayedArea.columnPixelSpacing;
+ heightScale = enabledElement.viewport.displayedArea.rowPixelSpacing;
+
+ if (enabledElement.viewport.displayedArea.presentationSizeMode === 'SCALE TO FIT') {
+ // Fit TRUE IMAGE image (width/height) to window
+ var verticalScale = enabledElement.canvas.height / (height * heightScale);
+ var horizontalScale = enabledElement.canvas.width / (width * widthScale); // Apply new scale
+
+ widthScale = heightScale = Math.min(horizontalScale, verticalScale);
+
+ if (enabledElement.viewport.displayedArea.rowPixelSpacing < enabledElement.viewport.displayedArea.columnPixelSpacing) {
+ widthScale *= enabledElement.viewport.displayedArea.columnPixelSpacing / enabledElement.viewport.displayedArea.rowPixelSpacing;
+ } else if (enabledElement.viewport.displayedArea.columnPixelSpacing < enabledElement.viewport.displayedArea.rowPixelSpacing) {
+ heightScale *= enabledElement.viewport.displayedArea.rowPixelSpacing / enabledElement.viewport.displayedArea.columnPixelSpacing;
+ }
+ }
+ }
+
+ transform.scale(widthScale, heightScale); // Unrotate to so we can translate unrotated
+
+ if (angle !== 0) {
+ transform.rotate(-angle * Math.PI / 180);
+ } // Apply the pan offset
+
+
+ transform.translate(enabledElement.viewport.translation.x, enabledElement.viewport.translation.y); // Rotate again so we can apply general scale
+
+ if (angle !== 0) {
+ transform.rotate(angle * Math.PI / 180);
+ }
+
+ if (scale !== undefined) {
+ // Apply the font scale
+ transform.scale(scale, scale);
+ } // Apply Flip if required
+
+
+ if (enabledElement.viewport.hflip) {
+ transform.scale(-1, 1);
+ }
+
+ if (enabledElement.viewport.vflip) {
+ transform.scale(1, -1);
+ } // Move back from center of image
+
+
+ transform.translate(-width / 2, -height / 2);
+ return transform;
+});
+
+/***/ }),
+
+/***/ "./internal/computeAutoVoi.js":
+/*!************************************!*\
+ !*** ./internal/computeAutoVoi.js ***!
+ \************************************/
+/*! exports provided: default */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+__webpack_require__.r(__webpack_exports__);
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "default", function() { return computeAutoVoi; });
+/**
+ * Computes the VOI to display all the pixels if no VOI LUT data (Window Width/Window Center or voiLUT) exists on the viewport object.
+ *
+ * @param {Viewport} viewport - Object containing the viewport properties
+ * @param {Object} image An Image loaded by a Cornerstone Image Loader
+ * @returns {void}
+ * @memberof Internal
+ */
+function computeAutoVoi(viewport, image) {
+ if (hasVoi(viewport)) {
+ return;
+ }
+
+ var maxVoi = image.maxPixelValue * image.slope + image.intercept;
+ var minVoi = image.minPixelValue * image.slope + image.intercept;
+ var ww = maxVoi - minVoi;
+ var wc = (maxVoi + minVoi) / 2;
+
+ if (viewport.voi === undefined) {
+ viewport.voi = {
+ windowWidth: ww,
+ windowCenter: wc
+ };
+ } else {
+ viewport.voi.windowWidth = ww;
+ viewport.voi.windowCenter = wc;
+ }
+}
+/**
+ * Check if viewport has voi LUT data
+ * @param {any} viewport The viewport to check for voi LUT data
+ * @returns {Boolean} true viewport has LUT data (Window Width/Window Center or voiLUT). Otherwise, false.
+ * @memberof Internal
+ */
+
+function hasVoi(viewport) {
+ var hasLut = viewport.voiLUT && viewport.voiLUT.lut && viewport.voiLUT.lut.length > 0;
+ return hasLut || viewport.voi.windowWidth !== undefined && viewport.voi.windowCenter !== undefined;
+}
+
+/***/ }),
+
+/***/ "./internal/drawCompositeImage.js":
+/*!****************************************!*\
+ !*** ./internal/drawCompositeImage.js ***!
+ \****************************************/
+/*! exports provided: default */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+__webpack_require__.r(__webpack_exports__);
+/* harmony import */ var _layers_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../layers.js */ "./layers.js");
+/* harmony import */ var _rendering_renderGrayscaleImage_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../rendering/renderGrayscaleImage.js */ "./rendering/renderGrayscaleImage.js");
+/* harmony import */ var _rendering_renderColorImage_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../rendering/renderColorImage.js */ "./rendering/renderColorImage.js");
+/* harmony import */ var _rendering_renderPseudoColorImage_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../rendering/renderPseudoColorImage.js */ "./rendering/renderPseudoColorImage.js");
+/* harmony import */ var _rendering_renderLabelMapImage_js__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../rendering/renderLabelMapImage.js */ "./rendering/renderLabelMapImage.js");
+/* harmony import */ var _setToPixelCoordinateSystem_js__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../setToPixelCoordinateSystem.js */ "./setToPixelCoordinateSystem.js");
+
+
+
+
+
+
+
+function getViewportRatio(baseLayer, targetLayer) {
+ if (!baseLayer.syncProps) {
+ updateLayerSyncProps(baseLayer);
+ }
+
+ if (!targetLayer.syncProps) {
+ updateLayerSyncProps(targetLayer);
+ }
+
+ return targetLayer.syncProps.originalScale / baseLayer.syncProps.originalScale;
+}
+
+function updateLayerSyncProps(layer) {
+ var syncProps = layer.syncProps || {}; // This is used to keep each of the layers' viewports in sync with the active layer
+
+ syncProps.originalScale = layer.viewport.scale;
+ layer.syncProps = syncProps;
+} // Sync all viewports based on active layer's viewport
+
+
+function syncViewports(layers, activeLayer) {
+ // If we intend to keep the viewport's scale, translation and rotation in sync,
+ // loop through the layers
+ layers.forEach(function (layer) {
+ // Don't do anything to the active layer
+ // Don't do anything if this layer has no viewport
+ if (layer === activeLayer || !layer.viewport || !activeLayer.viewport) {
+ return;
+ }
+
+ if (!layer.syncProps) {
+ updateLayerSyncProps(layer);
+ }
+
+ var viewportRatio = getViewportRatio(activeLayer, layer); // Update the layer's translation and scale to keep them in sync with the first image
+ // based on the ratios between the images
+
+ layer.viewport.scale = activeLayer.viewport.scale * viewportRatio;
+ layer.viewport.rotation = activeLayer.viewport.rotation;
+ layer.viewport.translation = {
+ x: activeLayer.viewport.translation.x / viewportRatio,
+ y: activeLayer.viewport.translation.y / viewportRatio
+ };
+ layer.viewport.hflip = activeLayer.viewport.hflip;
+ layer.viewport.vflip = activeLayer.viewport.vflip;
+ });
+}
+/**
+ * Internal function to render all layers for a Cornerstone enabled element
+ *
+ * @param {CanvasRenderingContext2D} context Canvas context to draw upon
+ * @param {EnabledElementLayer[]} layers The array of all layers for this enabled element
+ * @param {Boolean} invalidated A boolean whether or not this image has been invalidated and must be redrawn
+ * @returns {void}
+ * @memberof Internal
+ */
+
+
+function renderLayers(context, layers, invalidated) {
+ // Loop through each layer and draw it to the canvas
+ layers.forEach(function (layer, index) {
+ if (!layer.image) {
+ return;
+ }
+
+ context.save(); // Set the layer's canvas to the pixel coordinate system
+
+ layer.canvas = context.canvas;
+ Object(_setToPixelCoordinateSystem_js__WEBPACK_IMPORTED_MODULE_5__["default"])(layer, context); // Render into the layer's canvas
+
+ var colormap = layer.viewport.colormap || layer.options.colormap;
+ var labelmap = layer.viewport.labelmap;
+ var isInvalid = layer.invalid || invalidated;
+
+ if (colormap && colormap !== '' && labelmap === true) {
+ Object(_rendering_renderLabelMapImage_js__WEBPACK_IMPORTED_MODULE_4__["addLabelMapLayer"])(layer, isInvalid);
+ } else if (colormap && colormap !== '') {
+ Object(_rendering_renderPseudoColorImage_js__WEBPACK_IMPORTED_MODULE_3__["addPseudoColorLayer"])(layer, isInvalid);
+ } else if (layer.image.color === true) {
+ Object(_rendering_renderColorImage_js__WEBPACK_IMPORTED_MODULE_2__["addColorLayer"])(layer, isInvalid);
+ } else {
+ // If this is the base layer, use the alpha channel for rendering of the grayscale image
+ var useAlphaChannel = index === 0;
+ Object(_rendering_renderGrayscaleImage_js__WEBPACK_IMPORTED_MODULE_1__["addGrayscaleLayer"])(layer, isInvalid, useAlphaChannel);
+ } // Apply any global opacity settings that have been defined for this layer
+
+
+ if (layer.options && layer.options.opacity) {
+ context.globalAlpha = layer.options.opacity;
+ } else {
+ context.globalAlpha = 1;
+ }
+
+ if (layer.options && layer.options.fillStyle) {
+ context.fillStyle = layer.options.fillStyle;
+ } // Set the pixelReplication property before drawing from the layer into the
+ // composite canvas
+
+
+ context.imageSmoothingEnabled = !layer.viewport.pixelReplication;
+ context.mozImageSmoothingEnabled = context.imageSmoothingEnabled; // Draw from the current layer's canvas onto the enabled element's canvas
+
+ var sx = layer.viewport.displayedArea.tlhc.x - 1;
+ var sy = layer.viewport.displayedArea.tlhc.y - 1;
+ var width = layer.viewport.displayedArea.brhc.x - sx;
+ var height = layer.viewport.displayedArea.brhc.y - sy;
+ context.drawImage(layer.canvas, sx, sy, width, height, 0, 0, width, height);
+ context.restore();
+ layer.invalid = false;
+ });
+}
+/**
+ * Internal API function to draw a composite image to a given enabled element
+ *
+ * @param {EnabledElement} enabledElement An enabled element to draw into
+ * @param {Boolean} invalidated - true if pixel data has been invalidated and cached rendering should not be used
+ * @returns {void}
+ */
+
+
+/* harmony default export */ __webpack_exports__["default"] = (function (enabledElement, invalidated) {
+ var element = enabledElement.element;
+ var allLayers = Object(_layers_js__WEBPACK_IMPORTED_MODULE_0__["getLayers"])(element);
+ var activeLayer = Object(_layers_js__WEBPACK_IMPORTED_MODULE_0__["getActiveLayer"])(element);
+ var visibleLayers = Object(_layers_js__WEBPACK_IMPORTED_MODULE_0__["getVisibleLayers"])(element);
+ var resynced = !enabledElement.lastSyncViewportsState && enabledElement.syncViewports; // This state will help us to determine if the user has re-synced the
+ // layers allowing us to make a new copy of the viewports
+
+ enabledElement.lastSyncViewportsState = enabledElement.syncViewports; // Stores a copy of all viewports if the user has just synced them then we can use the
+ // copies to calculate anything later (ratio, translation offset, rotation offset, etc)
+
+ if (resynced) {
+ allLayers.forEach(function (layer) {
+ if (layer.viewport) {
+ updateLayerSyncProps(layer);
+ }
+ });
+ } // Sync all viewports in case it's activated
+
+
+ if (enabledElement.syncViewports === true) {
+ syncViewports(visibleLayers, activeLayer);
+ } // Get the enabled element's canvas so we can draw to it
+
+
+ var context = enabledElement.canvas.getContext('2d');
+ context.setTransform(1, 0, 0, 1, 0, 0); // Clear the canvas
+
+ context.fillStyle = 'black';
+ context.fillRect(0, 0, enabledElement.canvas.width, enabledElement.canvas.height); // Render all visible layers
+
+ renderLayers(context, visibleLayers, invalidated);
+});
+
+/***/ }),
+
+/***/ "./internal/drawImage.js":
+/*!*******************************!*\
+ !*** ./internal/drawImage.js ***!
+ \*******************************/
+/*! exports provided: default */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+__webpack_require__.r(__webpack_exports__);
+/**
+ * Internal API function to draw an image to a given enabled element
+ *
+ * @param {EnabledElement} enabledElement The Cornerstone Enabled Element to redraw
+ * @param {Boolean} [invalidated = false] - true if pixel data has been invalidated and cached rendering should not be used
+ * @returns {void}
+ * @memberof Internal
+ */
+/* harmony default export */ __webpack_exports__["default"] = (function (enabledElement) {
+ var invalidated = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : false;
+ enabledElement.needsRedraw = true;
+
+ if (invalidated) {
+ enabledElement.invalid = true;
+ }
+});
+
+/***/ }),
+
+/***/ "./internal/drawImageSync.js":
+/*!***********************************!*\
+ !*** ./internal/drawImageSync.js ***!
+ \***********************************/
+/*! exports provided: default */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+__webpack_require__.r(__webpack_exports__);
+/* harmony import */ var _now_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./now.js */ "./internal/now.js");
+/* harmony import */ var _drawCompositeImage_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./drawCompositeImage.js */ "./internal/drawCompositeImage.js");
+/* harmony import */ var _rendering_renderColorImage_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../rendering/renderColorImage.js */ "./rendering/renderColorImage.js");
+/* harmony import */ var _rendering_renderGrayscaleImage_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../rendering/renderGrayscaleImage.js */ "./rendering/renderGrayscaleImage.js");
+/* harmony import */ var _rendering_renderPseudoColorImage_js__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../rendering/renderPseudoColorImage.js */ "./rendering/renderPseudoColorImage.js");
+/* harmony import */ var _rendering_renderLabelMapImage_js__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../rendering/renderLabelMapImage.js */ "./rendering/renderLabelMapImage.js");
+/* harmony import */ var _triggerEvent_js__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ../triggerEvent.js */ "./triggerEvent.js");
+/* harmony import */ var _events_js__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ../events.js */ "./events.js");
+
+
+
+
+
+
+
+
+/**
+ * Draw an image to a given enabled element synchronously
+ *
+ * @param {EnabledElement} enabledElement An enabled element to draw into
+ * @param {Boolean} invalidated - true if pixel data has been invalidated and cached rendering should not be used
+ * @returns {void}
+ * @memberof Internal
+ */
+
+/* harmony default export */ __webpack_exports__["default"] = (function (enabledElement, invalidated) {
+ var image = enabledElement.image;
+ var element = enabledElement.element;
+ var layers = enabledElement.layers || []; // Check if enabledElement can be redrawn
+
+ if (!enabledElement.canvas || !(enabledElement.image || layers.length)) {
+ return;
+ } // Start measuring the time needed to draw the image/layers
+
+
+ var start = Object(_now_js__WEBPACK_IMPORTED_MODULE_0__["default"])();
+ image.stats = {
+ lastGetPixelDataTime: -1.0,
+ lastStoredPixelDataToCanvasImageDataTime: -1.0,
+ lastPutImageDataTime: -1.0,
+ lastRenderTime: -1.0,
+ lastLutGenerateTime: -1.0
+ };
+
+ if (layers && layers.length) {
+ Object(_drawCompositeImage_js__WEBPACK_IMPORTED_MODULE_1__["default"])(enabledElement, invalidated);
+ } else if (image) {
+ var render = image.render;
+
+ if (!render) {
+ if (enabledElement.viewport.colormap && enabledElement.viewport.colormap !== '' && enabledElement.image.labelmap === true) {
+ render = _rendering_renderLabelMapImage_js__WEBPACK_IMPORTED_MODULE_5__["renderLabelMapImage"];
+ } else if (enabledElement.viewport.colormap && enabledElement.viewport.colormap !== '') {
+ render = _rendering_renderPseudoColorImage_js__WEBPACK_IMPORTED_MODULE_4__["renderPseudoColorImage"];
+ } else if (image.color) {
+ render = _rendering_renderColorImage_js__WEBPACK_IMPORTED_MODULE_2__["renderColorImage"];
+ } else {
+ render = _rendering_renderGrayscaleImage_js__WEBPACK_IMPORTED_MODULE_3__["renderGrayscaleImage"];
+ }
+ }
+
+ render(enabledElement, invalidated);
+ } // Calculate how long it took to draw the image/layers
+
+
+ var renderTimeInMs = Object(_now_js__WEBPACK_IMPORTED_MODULE_0__["default"])() - start;
+ var eventData = {
+ viewport: enabledElement.viewport,
+ element: element,
+ image: image,
+ enabledElement: enabledElement,
+ canvasContext: enabledElement.canvas.getContext('2d'),
+ renderTimeInMs: renderTimeInMs
+ };
+ image.stats.lastRenderTime = renderTimeInMs;
+ enabledElement.invalid = false;
+ enabledElement.needsRedraw = false;
+ Object(_triggerEvent_js__WEBPACK_IMPORTED_MODULE_6__["default"])(element, _events_js__WEBPACK_IMPORTED_MODULE_7__["default"].IMAGE_RENDERED, eventData);
+});
+
+/***/ }),
+
+/***/ "./internal/generateColorLut.js":
+/*!**************************************!*\
+ !*** ./internal/generateColorLut.js ***!
+ \**************************************/
+/*! exports provided: default */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+__webpack_require__.r(__webpack_exports__);
+/* harmony import */ var _getVOILut_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./getVOILut.js */ "./internal/getVOILut.js");
+
+/**
+ * Creates a LUT used while rendering to convert stored pixel values to
+ * display pixels
+ *
+ * @param {Image} image A Cornerstone Image Object
+ * @param {Number} windowWidth The Window Width
+ * @param {Number} windowCenter The Window Center
+ * @param {Boolean} invert A boolean describing whether or not the image has been inverted
+ * @param {Array} [voiLUT] A Volume of Interest Lookup Table
+ *
+ * @returns {Uint8ClampedArray} A lookup table to apply to the image
+ * @memberof Internal
+ */
+
+/* harmony default export */ __webpack_exports__["default"] = (function (image, windowWidth, windowCenter, invert, voiLUT) {
+ var maxPixelValue = image.maxPixelValue;
+ var minPixelValue = image.minPixelValue;
+ var offset = Math.min(minPixelValue, 0);
+
+ if (image.cachedLut === undefined) {
+ var length = maxPixelValue - offset + 1;
+ image.cachedLut = {};
+ image.cachedLut.lutArray = new Uint8ClampedArray(length);
+ }
+
+ var lut = image.cachedLut.lutArray;
+ var vlutfn = Object(_getVOILut_js__WEBPACK_IMPORTED_MODULE_0__["default"])(windowWidth, windowCenter, voiLUT);
+
+ if (invert === true) {
+ for (var storedValue = minPixelValue; storedValue <= maxPixelValue; storedValue++) {
+ lut[storedValue + -offset] = 255 - vlutfn(storedValue);
+ }
+ } else {
+ for (var _storedValue = minPixelValue; _storedValue <= maxPixelValue; _storedValue++) {
+ lut[_storedValue + -offset] = vlutfn(_storedValue);
+ }
+ }
+
+ return lut;
+});
+
+/***/ }),
+
+/***/ "./internal/generateLut.js":
+/*!*********************************!*\
+ !*** ./internal/generateLut.js ***!
+ \*********************************/
+/*! exports provided: default */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+__webpack_require__.r(__webpack_exports__);
+/* harmony import */ var _getModalityLUT_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./getModalityLUT.js */ "./internal/getModalityLUT.js");
+/* harmony import */ var _getVOILut_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./getVOILut.js */ "./internal/getVOILut.js");
+
+
+/**
+ * Creates a LUT used while rendering to convert stored pixel values to
+ * display pixels
+ *
+ * @param {Image} image A Cornerstone Image Object
+ * @param {Number} windowWidth The Window Width
+ * @param {Number} windowCenter The Window Center
+ * @param {Boolean} invert A boolean describing whether or not the image has been inverted
+ * @param {Array} [modalityLUT] A modality Lookup Table
+ * @param {Array} [voiLUT] A Volume of Interest Lookup Table
+ *
+ * @returns {Uint8ClampedArray} A lookup table to apply to the image
+ * @memberof Internal
+ */
+
+/* harmony default export */ __webpack_exports__["default"] = (function (image, windowWidth, windowCenter, invert, modalityLUT, voiLUT) {
+ var maxPixelValue = image.maxPixelValue;
+ var minPixelValue = image.minPixelValue;
+ var offset = Math.min(minPixelValue, 0);
+
+ if (image.cachedLut === undefined) {
+ var length = maxPixelValue - offset + 1;
+ image.cachedLut = {};
+ image.cachedLut.lutArray = new Uint8ClampedArray(length);
+ }
+
+ var lut = image.cachedLut.lutArray;
+ var mlutfn = Object(_getModalityLUT_js__WEBPACK_IMPORTED_MODULE_0__["default"])(image.slope, image.intercept, modalityLUT);
+ var vlutfn = Object(_getVOILut_js__WEBPACK_IMPORTED_MODULE_1__["default"])(windowWidth, windowCenter, voiLUT);
+
+ if (invert === true) {
+ for (var storedValue = minPixelValue; storedValue <= maxPixelValue; storedValue++) {
+ lut[storedValue + -offset] = 255 - vlutfn(mlutfn(storedValue));
+ }
+ } else {
+ for (var _storedValue = minPixelValue; _storedValue <= maxPixelValue; _storedValue++) {
+ lut[_storedValue + -offset] = vlutfn(mlutfn(_storedValue));
+ }
+ }
+
+ return lut;
+});
+
+/***/ }),
+
+/***/ "./internal/getCanvas.js":
+/*!*******************************!*\
+ !*** ./internal/getCanvas.js ***!
+ \*******************************/
+/*! exports provided: default */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+__webpack_require__.r(__webpack_exports__);
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "default", function() { return getCanvas; });
+var CANVAS_CSS_CLASS = 'cornerstone-canvas';
+/**
+ * Create a canvas and append it to the element
+ *
+ * @param {HTMLElement} element An HTML Element
+ * @return {HTMLElement} canvas A Canvas DOM element
+ */
+
+function createCanvas(element) {
+ var canvas = document.createElement('canvas');
+ canvas.style.display = 'block';
+ canvas.classList.add(CANVAS_CSS_CLASS);
+ element.appendChild(canvas);
+ return canvas;
+}
+/**
+ * Create a canvas or returns the one that already exists for a given element
+ *
+ * @param {HTMLElement} element An HTML Element
+ * @return {HTMLElement} canvas A Canvas DOM element
+ */
+
+
+function getCanvas(element) {
+ var selector = "canvas.".concat(CANVAS_CSS_CLASS);
+ return element.querySelector(selector) || createCanvas(element);
+}
+
+/***/ }),
+
+/***/ "./internal/getDefaultViewport.js":
+/*!****************************************!*\
+ !*** ./internal/getDefaultViewport.js ***!
+ \****************************************/
+/*! exports provided: default */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+__webpack_require__.r(__webpack_exports__);
+/* harmony import */ var _getImageFitScale_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./getImageFitScale.js */ "./internal/getImageFitScale.js");
+
+/**
+ * Creates a new viewport object containing default values
+ *
+ * @returns {Viewport} viewport object
+ * @memberof Internal
+ */
+
+function createViewport() {
+ var displayedArea = createDefaultDisplayedArea();
+ return {
+ scale: 1,
+ translation: {
+ x: 0,
+ y: 0
+ },
+ voi: {
+ windowWidth: undefined,
+ windowCenter: undefined
+ },
+ invert: false,
+ pixelReplication: false,
+ rotation: 0,
+ hflip: false,
+ vflip: false,
+ modalityLUT: undefined,
+ voiLUT: undefined,
+ colormap: undefined,
+ labelmap: false,
+ displayedArea: displayedArea
+ };
+}
+/**
+ * Creates the default displayed area.
+ * C.10.4 Displayed Area Module: This Module describes Attributes required to define a Specified Displayed Area space.
+ *
+ * @returns {tlhc: {x,y}, brhc: {x, y},rowPixelSpacing: Number, columnPixelSpacing: Number, presentationSizeMode: Number} displayedArea object
+ * @memberof Internal
+ */
+
+
+function createDefaultDisplayedArea() {
+ return {
+ // Top Left Hand Corner
+ tlhc: {
+ x: 1,
+ y: 1
+ },
+ // Bottom Right Hand Corner
+ brhc: {
+ x: 1,
+ y: 1
+ },
+ rowPixelSpacing: 1,
+ columnPixelSpacing: 1,
+ presentationSizeMode: 'NONE'
+ };
+}
+/**
+ * Creates a new viewport object containing default values for the image and canvas
+ *
+ * @param {HTMLElement} canvas A Canvas DOM element
+ * @param {Image} image A Cornerstone Image Object
+ * @returns {Viewport} viewport object
+ * @memberof Internal
+ */
+
+
+/* harmony default export */ __webpack_exports__["default"] = (function (canvas, image) {
+ if (canvas === undefined) {
+ throw new Error('getDefaultViewport: parameter canvas must not be undefined');
+ }
+
+ if (image === undefined) {
+ return createViewport();
+ } // Fit image to window
+
+
+ var scale = Object(_getImageFitScale_js__WEBPACK_IMPORTED_MODULE_0__["default"])(canvas, image, 0).scaleFactor;
+ return {
+ scale: scale,
+ translation: {
+ x: 0,
+ y: 0
+ },
+ voi: {
+ windowWidth: image.windowWidth,
+ windowCenter: image.windowCenter
+ },
+ invert: image.invert,
+ pixelReplication: false,
+ rotation: 0,
+ hflip: false,
+ vflip: false,
+ modalityLUT: image.modalityLUT,
+ voiLUT: image.voiLUT,
+ colormap: image.colormap,
+ labelmap: Boolean(image.labelmap),
+ displayedArea: {
+ tlhc: {
+ x: 1,
+ y: 1
+ },
+ brhc: {
+ x: image.columns,
+ y: image.rows
+ },
+ rowPixelSpacing: image.rowPixelSpacing === undefined ? 1 : image.rowPixelSpacing,
+ columnPixelSpacing: image.columnPixelSpacing === undefined ? 1 : image.columnPixelSpacing,
+ presentationSizeMode: 'NONE'
+ }
+ };
+});
+
+/***/ }),
+
+/***/ "./internal/getImageFitScale.js":
+/*!**************************************!*\
+ !*** ./internal/getImageFitScale.js ***!
+ \**************************************/
+/*! exports provided: default */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+__webpack_require__.r(__webpack_exports__);
+/* harmony import */ var _validator_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./validator.js */ "./internal/validator.js");
+/* harmony import */ var _getImageSize_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./getImageSize.js */ "./internal/getImageSize.js");
+
+
+/**
+ * Calculates the horizontal, vertical and minimum scale factor for an image
+ @param {{width, height}} windowSize The window size where the image is displayed. This can be any HTML element or structure with a width, height fields (e.g. canvas).
+ * @param {any} image The cornerstone image object
+ * @param {Number} rotation Optional. The rotation angle of the image.
+ * @return {{horizontalScale, verticalScale, scaleFactor}} The calculated horizontal, vertical and minimum scale factor
+ * @memberof Internal
+ */
+
+/* harmony default export */ __webpack_exports__["default"] = (function (windowSize, image) {
+ var rotation = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : null;
+ Object(_validator_js__WEBPACK_IMPORTED_MODULE_0__["validateParameterUndefinedOrNull"])(windowSize, 'getImageScale: parameter windowSize must not be undefined');
+ Object(_validator_js__WEBPACK_IMPORTED_MODULE_0__["validateParameterUndefinedOrNull"])(image, 'getImageScale: parameter image must not be undefined');
+ var imageSize = Object(_getImageSize_js__WEBPACK_IMPORTED_MODULE_1__["default"])(image, rotation);
+ var rowPixelSpacing = image.rowPixelSpacing || 1;
+ var columnPixelSpacing = image.columnPixelSpacing || 1;
+ var verticalRatio = 1;
+ var horizontalRatio = 1;
+
+ if (rowPixelSpacing < columnPixelSpacing) {
+ horizontalRatio = columnPixelSpacing / rowPixelSpacing;
+ } else {
+ // even if they are equal we want to calculate this ratio (the ration might be 0.5)
+ verticalRatio = rowPixelSpacing / columnPixelSpacing;
+ }
+
+ var verticalScale = windowSize.height / imageSize.height / verticalRatio;
+ var horizontalScale = windowSize.width / imageSize.width / horizontalRatio; // Fit image to window
+
+ return {
+ verticalScale: verticalScale,
+ horizontalScale: horizontalScale,
+ scaleFactor: Math.min(horizontalScale, verticalScale)
+ };
+});
+
+/***/ }),
+
+/***/ "./internal/getImageSize.js":
+/*!**********************************!*\
+ !*** ./internal/getImageSize.js ***!
+ \**********************************/
+/*! exports provided: default */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+__webpack_require__.r(__webpack_exports__);
+/* harmony import */ var _validator_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./validator.js */ "./internal/validator.js");
+
+/**
+ * Check if the angle is rotated
+ * @param {Number} rotation the rotation angle
+ * @returns {Boolean} true if the angle is rotated; Otherwise, false.
+ * @memberof Internal
+ */
+
+function isRotated(rotation) {
+ return !(rotation === null || rotation === undefined || rotation === 0 || rotation === 180);
+}
+/**
+ * Retrieves the current image dimensions given an enabled element
+ *
+ * @param {any} image The Cornerstone image.
+ * @param {Number} rotation Optional. The rotation angle of the image.
+ * @return {{width:Number, height:Number}} The Image dimensions
+ * @memberof Internal
+ */
+
+
+/* harmony default export */ __webpack_exports__["default"] = (function (image) {
+ var rotation = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : null;
+ Object(_validator_js__WEBPACK_IMPORTED_MODULE_0__["validateParameterUndefinedOrNull"])(image, 'getImageSize: parameter image must not be undefined');
+ Object(_validator_js__WEBPACK_IMPORTED_MODULE_0__["validateParameterUndefinedOrNull"])(image.width, 'getImageSize: parameter image must have width');
+ Object(_validator_js__WEBPACK_IMPORTED_MODULE_0__["validateParameterUndefinedOrNull"])(image.height, 'getImageSize: parameter image must have height');
+
+ if (isRotated(rotation)) {
+ return {
+ height: image.width,
+ width: image.height
+ };
+ }
+
+ return {
+ width: image.width,
+ height: image.height
+ };
+});
+
+/***/ }),
+
+/***/ "./internal/getModalityLUT.js":
+/*!************************************!*\
+ !*** ./internal/getModalityLUT.js ***!
+ \************************************/
+/*! exports provided: default */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+__webpack_require__.r(__webpack_exports__);
+/**
+ * Generates a linear modality transformation function
+ *
+ * See DICOM PS3.3 C.11.1 Modality LUT Module
+ *
+ * http://dicom.nema.org/medical/Dicom/current/output/chtml/part03/sect_C.11.html
+ *
+ * @param {Number} slope m in the equation specified by Rescale Intercept (0028,1052).
+ * @param {Number} intercept The value b in relationship between stored values (SV) and the output units specified in Rescale Type (0028,1054).
+
+ Output units = m*SV + b.
+ * @return {function(*): *} A linear modality LUT function. Given a stored pixel it returns the modality pixel value
+ * @memberof Internal
+ */
+function generateLinearModalityLUT(slope, intercept) {
+ return function (storedPixelValue) {
+ return storedPixelValue * slope + intercept;
+ };
+}
+
+function generateNonLinearModalityLUT(modalityLUT) {
+ var minValue = modalityLUT.lut[0];
+ var maxValue = modalityLUT.lut[modalityLUT.lut.length - 1];
+ var maxValueMapped = modalityLUT.firstValueMapped + modalityLUT.lut.length;
+ return function (storedPixelValue) {
+ if (storedPixelValue < modalityLUT.firstValueMapped) {
+ return minValue;
+ } else if (storedPixelValue >= maxValueMapped) {
+ return maxValue;
+ }
+
+ return modalityLUT.lut[storedPixelValue];
+ };
+}
+/**
+ * Get the appropriate Modality LUT for the current situation.
+ *
+ * @param {Number} [slope] m in the equation specified by Rescale Intercept (0028,1052).
+ * @param {Number} [intercept] The value b in relationship between stored values (SV) and the output units specified in Rescale Type (0028,1054).
+ * @param {Function} [modalityLUT] A modality LUT function. Given a stored pixel it returns the modality pixel value.
+ *
+ * @return {function(*): *} A modality LUT function. Given a stored pixel it returns the modality pixel value.
+ * @memberof Internal
+ */
+
+
+/* harmony default export */ __webpack_exports__["default"] = (function (slope, intercept, modalityLUT) {
+ if (modalityLUT) {
+ return generateNonLinearModalityLUT(modalityLUT);
+ }
+
+ return generateLinearModalityLUT(slope, intercept);
+});
+
+/***/ }),
+
+/***/ "./internal/getTransform.js":
+/*!**********************************!*\
+ !*** ./internal/getTransform.js ***!
+ \**********************************/
+/*! exports provided: default */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+__webpack_require__.r(__webpack_exports__);
+/* harmony import */ var _calculateTransform_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./calculateTransform.js */ "./internal/calculateTransform.js");
+
+/* harmony default export */ __webpack_exports__["default"] = (function (enabledElement) {
+ // For now we will calculate it every time it is requested.
+ // In the future, we may want to cache it in the enabled element to speed things up.
+ return Object(_calculateTransform_js__WEBPACK_IMPORTED_MODULE_0__["default"])(enabledElement);
+});
+
+/***/ }),
+
+/***/ "./internal/getVOILut.js":
+/*!*******************************!*\
+ !*** ./internal/getVOILut.js ***!
+ \*******************************/
+/*! exports provided: default */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+__webpack_require__.r(__webpack_exports__);
+function _toConsumableArray(arr) { return _arrayWithoutHoles(arr) || _iterableToArray(arr) || _nonIterableSpread(); }
+
+function _nonIterableSpread() { throw new TypeError("Invalid attempt to spread non-iterable instance"); }
+
+function _iterableToArray(iter) { if (Symbol.iterator in Object(iter) || Object.prototype.toString.call(iter) === "[object Arguments]") return Array.from(iter); }
+
+function _arrayWithoutHoles(arr) { if (Array.isArray(arr)) { for (var i = 0, arr2 = new Array(arr.length); i < arr.length; i++) { arr2[i] = arr[i]; } return arr2; } }
+
+/* eslint no-bitwise: 0 */
+
+/**
+ * Volume of Interest Lookup Table Function
+ *
+ * @typedef {Function} VOILUTFunction
+ *
+ * @param {Number} modalityLutValue
+ * @returns {Number} transformed value
+ * @memberof Objects
+ */
+
+/**
+ * @module: VOILUT
+ */
+
+/**
+ *
+ * @param {Number} windowWidth Window Width
+ * @param {Number} windowCenter Window Center
+ * @returns {VOILUTFunction} VOI LUT mapping function
+ * @memberof VOILUT
+ */
+function generateLinearVOILUT(windowWidth, windowCenter) {
+ return function (modalityLutValue) {
+ return ((modalityLutValue - windowCenter) / windowWidth + 0.5) * 255.0;
+ };
+}
+/**
+ * Generate a non-linear volume of interest lookup table
+ *
+ * @param {LUT} voiLUT Volume of Interest Lookup Table Object
+ *
+ * @returns {VOILUTFunction} VOI LUT mapping function
+ * @memberof VOILUT
+ */
+
+
+function generateNonLinearVOILUT(voiLUT) {
+ // We don't trust the voiLUT.numBitsPerEntry, mainly thanks to Agfa!
+ var bitsPerEntry = Math.max.apply(Math, _toConsumableArray(voiLUT.lut)).toString(2).length;
+ var shift = bitsPerEntry - 8;
+ var minValue = voiLUT.lut[0] >> shift;
+ var maxValue = voiLUT.lut[voiLUT.lut.length - 1] >> shift;
+ var maxValueMapped = voiLUT.firstValueMapped + voiLUT.lut.length - 1;
+ return function (modalityLutValue) {
+ if (modalityLutValue < voiLUT.firstValueMapped) {
+ return minValue;
+ } else if (modalityLutValue >= maxValueMapped) {
+ return maxValue;
+ }
+
+ return voiLUT.lut[modalityLutValue - voiLUT.firstValueMapped] >> shift;
+ };
+}
+/**
+ * Retrieve a VOI LUT mapping function given the current windowing settings
+ * and the VOI LUT for the image
+ *
+ * @param {Number} windowWidth Window Width
+ * @param {Number} windowCenter Window Center
+ * @param {LUT} [voiLUT] Volume of Interest Lookup Table Object
+ *
+ * @return {VOILUTFunction} VOI LUT mapping function
+ * @memberof VOILUT
+ */
+
+
+/* harmony default export */ __webpack_exports__["default"] = (function (windowWidth, windowCenter, voiLUT) {
+ if (voiLUT) {
+ return generateNonLinearVOILUT(voiLUT);
+ }
+
+ return generateLinearVOILUT(windowWidth, windowCenter);
+});
+
+/***/ }),
+
+/***/ "./internal/guid.js":
+/*!**************************!*\
+ !*** ./internal/guid.js ***!
+ \**************************/
+/*! exports provided: default */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+__webpack_require__.r(__webpack_exports__);
+function s4() {
+ return Math.floor((1 + Math.random()) * 0x10000).toString(16).substring(1);
+}
+/**
+ * Generate a unique identifier
+ *
+ * @return {string} A unique identifier
+ * @memberof Internal
+ */
+
+
+/* harmony default export */ __webpack_exports__["default"] = (function () {
+ return "".concat(s4() + s4(), "-").concat(s4(), "-").concat(s4(), "-").concat(s4(), "-").concat(s4()).concat(s4()).concat(s4());
+});
+
+/***/ }),
+
+/***/ "./internal/index.js":
+/*!***************************!*\
+ !*** ./internal/index.js ***!
+ \***************************/
+/*! exports provided: default */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+__webpack_require__.r(__webpack_exports__);
+/* harmony import */ var _drawImage_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./drawImage.js */ "./internal/drawImage.js");
+/* harmony import */ var _generateLut_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./generateLut.js */ "./internal/generateLut.js");
+/* harmony import */ var _getDefaultViewport_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./getDefaultViewport.js */ "./internal/getDefaultViewport.js");
+/* harmony import */ var _requestAnimationFrame_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./requestAnimationFrame.js */ "./internal/requestAnimationFrame.js");
+/* harmony import */ var _storedPixelDataToCanvasImageData_js__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./storedPixelDataToCanvasImageData.js */ "./internal/storedPixelDataToCanvasImageData.js");
+/* harmony import */ var _storedPixelDataToCanvasImageDataRGBA_js__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ./storedPixelDataToCanvasImageDataRGBA.js */ "./internal/storedPixelDataToCanvasImageDataRGBA.js");
+/* harmony import */ var _storedColorPixelDataToCanvasImageData_js__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ./storedColorPixelDataToCanvasImageData.js */ "./internal/storedColorPixelDataToCanvasImageData.js");
+/* harmony import */ var _storedPixelDataToCanvasImageDataColorLUT_js__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ./storedPixelDataToCanvasImageDataColorLUT.js */ "./internal/storedPixelDataToCanvasImageDataColorLUT.js");
+/* harmony import */ var _storedPixelDataToCanvasImageDataPseudocolorLUT_js__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ./storedPixelDataToCanvasImageDataPseudocolorLUT.js */ "./internal/storedPixelDataToCanvasImageDataPseudocolorLUT.js");
+/* harmony import */ var _getTransform_js__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! ./getTransform.js */ "./internal/getTransform.js");
+/* harmony import */ var _calculateTransform_js__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(/*! ./calculateTransform.js */ "./internal/calculateTransform.js");
+/* harmony import */ var _transform_js__WEBPACK_IMPORTED_MODULE_11__ = __webpack_require__(/*! ./transform.js */ "./internal/transform.js");
+
+
+
+
+
+
+
+
+
+
+
+
+/**
+ * @module Internal
+ */
+
+/* harmony default export */ __webpack_exports__["default"] = ({
+ drawImage: _drawImage_js__WEBPACK_IMPORTED_MODULE_0__["default"],
+ generateLut: _generateLut_js__WEBPACK_IMPORTED_MODULE_1__["default"],
+ getDefaultViewport: _getDefaultViewport_js__WEBPACK_IMPORTED_MODULE_2__["default"],
+ requestAnimationFrame: _requestAnimationFrame_js__WEBPACK_IMPORTED_MODULE_3__["default"],
+ storedPixelDataToCanvasImageData: _storedPixelDataToCanvasImageData_js__WEBPACK_IMPORTED_MODULE_4__["default"],
+ storedPixelDataToCanvasImageDataRGBA: _storedPixelDataToCanvasImageDataRGBA_js__WEBPACK_IMPORTED_MODULE_5__["default"],
+ storedPixelDataToCanvasImageDataColorLUT: _storedPixelDataToCanvasImageDataColorLUT_js__WEBPACK_IMPORTED_MODULE_7__["default"],
+ storedPixelDataToCanvasImageDataPseudocolorLUT: _storedPixelDataToCanvasImageDataPseudocolorLUT_js__WEBPACK_IMPORTED_MODULE_8__["default"],
+ storedColorPixelDataToCanvasImageData: _storedColorPixelDataToCanvasImageData_js__WEBPACK_IMPORTED_MODULE_6__["default"],
+ getTransform: _getTransform_js__WEBPACK_IMPORTED_MODULE_9__["default"],
+ calculateTransform: _calculateTransform_js__WEBPACK_IMPORTED_MODULE_10__["default"],
+ Transform: _transform_js__WEBPACK_IMPORTED_MODULE_11__["Transform"]
+});
+
+/***/ }),
+
+/***/ "./internal/now.js":
+/*!*************************!*\
+ !*** ./internal/now.js ***!
+ \*************************/
+/*! exports provided: default */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+__webpack_require__.r(__webpack_exports__);
+/**
+ * @module Polyfills
+ */
+
+/**
+ * Use the performance.now() method if possible, and if not, use Date.now()
+ *
+ * @return {number} Time elapsed since the time origin
+ * @memberof Polyfills
+ */
+/* harmony default export */ __webpack_exports__["default"] = (function () {
+ if (window.performance) {
+ return performance.now();
+ }
+
+ return Date.now();
+});
+
+/***/ }),
+
+/***/ "./internal/requestAnimationFrame.js":
+/*!*******************************************!*\
+ !*** ./internal/requestAnimationFrame.js ***!
+ \*******************************************/
+/*! exports provided: default */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+__webpack_require__.r(__webpack_exports__);
+function requestFrame(callback) {
+ window.setTimeout(callback, 1000 / 60);
+}
+/**
+ * Polyfills requestAnimationFrame for older browsers.
+ *
+ * @param {Function} callback A parameter specifying a function to call when it's time to update your animation for the next repaint. The callback has one single argument, a DOMHighResTimeStamp, which indicates the current time (the time returned from performance.now() ) for when requestAnimationFrame starts to fire callbacks.
+ *
+ * @return {Number} A long integer value, the request id, that uniquely identifies the entry in the callback list. This is a non-zero value, but you may not make any other assumptions about its value. You can pass this value to window.cancelAnimationFrame() to cancel the refresh callback request.
+ * @memberof Polyfills
+ */
+
+
+/* harmony default export */ __webpack_exports__["default"] = (function (callback) {
+ return window.requestAnimationFrame(callback) || window.webkitRequestAnimationFrame(callback) || window.mozRequestAnimationFrame(callback) || window.oRequestAnimationFrame(callback) || window.msRequestAnimationFrame(callback) || requestFrame(callback);
+});
+
+/***/ }),
+
+/***/ "./internal/storedColorPixelDataToCanvasImageData.js":
+/*!***********************************************************!*\
+ !*** ./internal/storedColorPixelDataToCanvasImageData.js ***!
+ \***********************************************************/
+/*! exports provided: default */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+__webpack_require__.r(__webpack_exports__);
+/* harmony import */ var _now_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./now.js */ "./internal/now.js");
+
+/**
+ * Converts stored color pixel values to display pixel values using a LUT.
+ *
+ * Note: Skips alpha value for any input image pixel data.
+ *
+ * @param {Image} image A Cornerstone Image Object
+ * @param {Array} lut Lookup table array
+ * @param {Uint8ClampedArray} canvasImageDataData canvasImageData.data buffer filled with white pixels
+ *
+ * @returns {void}
+ * @memberof Internal
+ */
+
+/* harmony default export */ __webpack_exports__["default"] = (function (image, lut, canvasImageDataData) {
+ var start = Object(_now_js__WEBPACK_IMPORTED_MODULE_0__["default"])();
+ var pixelData = image.getPixelData();
+ image.stats.lastGetPixelDataTime = Object(_now_js__WEBPACK_IMPORTED_MODULE_0__["default"])() - start;
+ var minPixelValue = image.minPixelValue;
+ var canvasImageDataIndex = 0;
+ var storedPixelDataIndex = 0;
+ var numPixels = pixelData.length; // NOTE: As of Nov 2014, most javascript engines have lower performance when indexing negative indexes.
+ // We have a special code path for this case that improves performance. Thanks to @jpambrun for this enhancement
+
+ start = Object(_now_js__WEBPACK_IMPORTED_MODULE_0__["default"])();
+
+ if (minPixelValue < 0) {
+ while (storedPixelDataIndex < numPixels) {
+ canvasImageDataData[canvasImageDataIndex++] = lut[pixelData[storedPixelDataIndex++] + -minPixelValue]; // Red
+
+ canvasImageDataData[canvasImageDataIndex++] = lut[pixelData[storedPixelDataIndex++] + -minPixelValue]; // Green
+
+ canvasImageDataData[canvasImageDataIndex] = lut[pixelData[storedPixelDataIndex] + -minPixelValue]; // Blue
+
+ storedPixelDataIndex += 2;
+ canvasImageDataIndex += 2;
+ }
+ } else {
+ while (storedPixelDataIndex < numPixels) {
+ canvasImageDataData[canvasImageDataIndex++] = lut[pixelData[storedPixelDataIndex++]]; // Red
+
+ canvasImageDataData[canvasImageDataIndex++] = lut[pixelData[storedPixelDataIndex++]]; // Green
+
+ canvasImageDataData[canvasImageDataIndex] = lut[pixelData[storedPixelDataIndex]]; // Blue
+
+ storedPixelDataIndex += 2;
+ canvasImageDataIndex += 2;
+ }
+ }
+
+ image.stats.lastStoredPixelDataToCanvasImageDataTime = Object(_now_js__WEBPACK_IMPORTED_MODULE_0__["default"])() - start;
+});
+
+/***/ }),
+
+/***/ "./internal/storedPixelDataToCanvasImageData.js":
+/*!******************************************************!*\
+ !*** ./internal/storedPixelDataToCanvasImageData.js ***!
+ \******************************************************/
+/*! exports provided: default */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+__webpack_require__.r(__webpack_exports__);
+/* harmony import */ var _now_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./now.js */ "./internal/now.js");
+
+/**
+ * This function transforms stored pixel values into a canvas image data buffer
+ * by using a LUT. This is the most performance sensitive code in cornerstone and
+ * we use a special trick to make this go as fast as possible. Specifically we
+ * use the alpha channel only to control the luminance rather than the red, green and
+ * blue channels which makes it over 3x faster. The canvasImageDataData buffer needs
+ * to be previously filled with white pixels.
+ *
+ * NOTE: Attribution would be appreciated if you use this technique!
+ *
+ * @param {Image} image A Cornerstone Image Object
+ * @param {Array} lut Lookup table array
+ * @param {Uint8ClampedArray} canvasImageDataData canvasImageData.data buffer filled with white pixels
+ *
+ * @returns {void}
+ * @memberof Internal
+ */
+
+/* harmony default export */ __webpack_exports__["default"] = (function (image, lut, canvasImageDataData) {
+ var start = Object(_now_js__WEBPACK_IMPORTED_MODULE_0__["default"])();
+ var pixelData = image.getPixelData();
+ image.stats.lastGetPixelDataTime = Object(_now_js__WEBPACK_IMPORTED_MODULE_0__["default"])() - start;
+ var numPixels = pixelData.length;
+ var minPixelValue = image.minPixelValue;
+ var canvasImageDataIndex = 3;
+ var storedPixelDataIndex = 0; // NOTE: As of Nov 2014, most javascript engines have lower performance when indexing negative indexes.
+ // We have a special code path for this case that improves performance. Thanks to @jpambrun for this enhancement
+ // Added two paths (Int16Array, Uint16Array) to avoid polymorphic deoptimization in chrome.
+
+ start = Object(_now_js__WEBPACK_IMPORTED_MODULE_0__["default"])();
+
+ if (pixelData instanceof Int16Array) {
+ if (minPixelValue < 0) {
+ while (storedPixelDataIndex < numPixels) {
+ canvasImageDataData[canvasImageDataIndex] = lut[pixelData[storedPixelDataIndex++] + -minPixelValue]; // Alpha
+
+ canvasImageDataIndex += 4;
+ }
+ } else {
+ while (storedPixelDataIndex < numPixels) {
+ canvasImageDataData[canvasImageDataIndex] = lut[pixelData[storedPixelDataIndex++]]; // Alpha
+
+ canvasImageDataIndex += 4;
+ }
+ }
+ } else if (pixelData instanceof Uint16Array) {
+ while (storedPixelDataIndex < numPixels) {
+ canvasImageDataData[canvasImageDataIndex] = lut[pixelData[storedPixelDataIndex++]]; // Alpha
+
+ canvasImageDataIndex += 4;
+ }
+ } else if (minPixelValue < 0) {
+ while (storedPixelDataIndex < numPixels) {
+ canvasImageDataData[canvasImageDataIndex] = lut[pixelData[storedPixelDataIndex++] + -minPixelValue]; // Alpha
+
+ canvasImageDataIndex += 4;
+ }
+ } else {
+ while (storedPixelDataIndex < numPixels) {
+ canvasImageDataData[canvasImageDataIndex] = lut[pixelData[storedPixelDataIndex++]]; // Alpha
+
+ canvasImageDataIndex += 4;
+ }
+ }
+
+ image.stats.lastStoredPixelDataToCanvasImageDataTime = Object(_now_js__WEBPACK_IMPORTED_MODULE_0__["default"])() - start;
+});
+
+/***/ }),
+
+/***/ "./internal/storedPixelDataToCanvasImageDataColorLUT.js":
+/*!**************************************************************!*\
+ !*** ./internal/storedPixelDataToCanvasImageDataColorLUT.js ***!
+ \**************************************************************/
+/*! exports provided: default */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+__webpack_require__.r(__webpack_exports__);
+/* harmony import */ var _colors_index_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../colors/index.js */ "./colors/index.js");
+/* harmony import */ var _now_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./now.js */ "./internal/now.js");
+
+
+/**
+ *
+ * @param {Image} image A Cornerstone Image Object
+ * @param {LookupTable|Array} colorLut Lookup table array
+ * @param {Uint8ClampedArray} canvasImageDataData canvasImageData.data buffer filled with white pixels
+ *
+ * @returns {void}
+ * @memberof Internal
+ */
+
+function storedPixelDataToCanvasImageDataColorLUT(image, colorLut, canvasImageDataData) {
+ var start = Object(_now_js__WEBPACK_IMPORTED_MODULE_1__["default"])();
+ var pixelData = image.getPixelData();
+ image.stats.lastGetPixelDataTime = Object(_now_js__WEBPACK_IMPORTED_MODULE_1__["default"])() - start;
+ var numPixels = pixelData.length;
+ var minPixelValue = image.minPixelValue;
+ var canvasImageDataIndex = 0;
+ var storedPixelDataIndex = 0;
+ var rgba;
+ var clut;
+ start = Object(_now_js__WEBPACK_IMPORTED_MODULE_1__["default"])();
+
+ if (colorLut instanceof _colors_index_js__WEBPACK_IMPORTED_MODULE_0__["default"].LookupTable) {
+ clut = colorLut.Table;
+ } else {
+ clut = colorLut;
+ }
+
+ if (minPixelValue < 0) {
+ while (storedPixelDataIndex < numPixels) {
+ rgba = clut[pixelData[storedPixelDataIndex++] + -minPixelValue];
+ canvasImageDataData[canvasImageDataIndex++] = rgba[0];
+ canvasImageDataData[canvasImageDataIndex++] = rgba[1];
+ canvasImageDataData[canvasImageDataIndex++] = rgba[2];
+ canvasImageDataData[canvasImageDataIndex++] = rgba[3];
+ }
+ } else {
+ while (storedPixelDataIndex < numPixels) {
+ rgba = clut[pixelData[storedPixelDataIndex++]];
+ canvasImageDataData[canvasImageDataIndex++] = rgba[0];
+ canvasImageDataData[canvasImageDataIndex++] = rgba[1];
+ canvasImageDataData[canvasImageDataIndex++] = rgba[2];
+ canvasImageDataData[canvasImageDataIndex++] = rgba[3];
+ }
+ }
+
+ image.stats.lastStoredPixelDataToCanvasImageDataTime = Object(_now_js__WEBPACK_IMPORTED_MODULE_1__["default"])() - start;
+}
+
+/* harmony default export */ __webpack_exports__["default"] = (storedPixelDataToCanvasImageDataColorLUT);
+
+/***/ }),
+
+/***/ "./internal/storedPixelDataToCanvasImageDataPseudocolorLUT.js":
+/*!********************************************************************!*\
+ !*** ./internal/storedPixelDataToCanvasImageDataPseudocolorLUT.js ***!
+ \********************************************************************/
+/*! exports provided: default */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+__webpack_require__.r(__webpack_exports__);
+/* harmony import */ var _colors_index_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../colors/index.js */ "./colors/index.js");
+/* harmony import */ var _now_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./now.js */ "./internal/now.js");
+
+
+/**
+ *
+ * @param {Image} image A Cornerstone Image Object
+ * @param {Array} grayscaleLut Lookup table array
+ * @param {LookupTable|Array} colorLut Lookup table array
+ * @param {Uint8ClampedArray} canvasImageDataData canvasImageData.data buffer filled with white pixels
+ *
+ * @returns {void}
+ * @memberof Internal
+ */
+
+function storedPixelDataToCanvasImageDataPseudocolorLUT(image, grayscaleLut, colorLut, canvasImageDataData) {
+ var start = Object(_now_js__WEBPACK_IMPORTED_MODULE_1__["default"])();
+ var pixelData = image.getPixelData();
+ image.stats.lastGetPixelDataTime = Object(_now_js__WEBPACK_IMPORTED_MODULE_1__["default"])() - start;
+ var numPixels = pixelData.length;
+ var minPixelValue = image.minPixelValue;
+ var canvasImageDataIndex = 0;
+ var storedPixelDataIndex = 0;
+ var grayscale;
+ var rgba;
+ var clut;
+ start = Object(_now_js__WEBPACK_IMPORTED_MODULE_1__["default"])();
+
+ if (colorLut instanceof _colors_index_js__WEBPACK_IMPORTED_MODULE_0__["default"].LookupTable) {
+ clut = colorLut.Table;
+ } else {
+ clut = colorLut;
+ }
+
+ if (minPixelValue < 0) {
+ while (storedPixelDataIndex < numPixels) {
+ grayscale = grayscaleLut[pixelData[storedPixelDataIndex++] + -minPixelValue];
+ rgba = clut[grayscale];
+ canvasImageDataData[canvasImageDataIndex++] = rgba[0];
+ canvasImageDataData[canvasImageDataIndex++] = rgba[1];
+ canvasImageDataData[canvasImageDataIndex++] = rgba[2];
+ canvasImageDataData[canvasImageDataIndex++] = rgba[3];
+ }
+ } else {
+ while (storedPixelDataIndex < numPixels) {
+ grayscale = grayscaleLut[pixelData[storedPixelDataIndex++]];
+ rgba = clut[grayscale];
+ canvasImageDataData[canvasImageDataIndex++] = rgba[0];
+ canvasImageDataData[canvasImageDataIndex++] = rgba[1];
+ canvasImageDataData[canvasImageDataIndex++] = rgba[2];
+ canvasImageDataData[canvasImageDataIndex++] = rgba[3];
+ }
+ }
+
+ image.stats.lastStoredPixelDataToCanvasImageDataTime = Object(_now_js__WEBPACK_IMPORTED_MODULE_1__["default"])() - start;
+}
+
+/* harmony default export */ __webpack_exports__["default"] = (storedPixelDataToCanvasImageDataPseudocolorLUT);
+
+/***/ }),
+
+/***/ "./internal/storedPixelDataToCanvasImageDataRGBA.js":
+/*!**********************************************************!*\
+ !*** ./internal/storedPixelDataToCanvasImageDataRGBA.js ***!
+ \**********************************************************/
+/*! exports provided: default */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+__webpack_require__.r(__webpack_exports__);
+/* harmony import */ var _now_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./now.js */ "./internal/now.js");
+
+/**
+ * This function transforms stored pixel values into a canvas image data buffer
+ * by using a LUT.
+ *
+ * @param {Image} image A Cornerstone Image Object
+ * @param {Array} lut Lookup table array
+ * @param {Uint8ClampedArray} canvasImageDataData canvasImageData.data buffer filled with white pixels
+ *
+ * @returns {void}
+ * @memberof Internal
+ */
+
+/* harmony default export */ __webpack_exports__["default"] = (function (image, lut, canvasImageDataData) {
+ var start = Object(_now_js__WEBPACK_IMPORTED_MODULE_0__["default"])();
+ var pixelData = image.getPixelData();
+ image.stats.lastGetPixelDataTime = Object(_now_js__WEBPACK_IMPORTED_MODULE_0__["default"])() - start;
+ var numPixels = pixelData.length;
+ var minPixelValue = image.minPixelValue;
+ var canvasImageDataIndex = 0;
+ var storedPixelDataIndex = 0;
+ var pixelValue; // NOTE: As of Nov 2014, most javascript engines have lower performance when indexing negative indexes.
+ // We have a special code path for this case that improves performance. Thanks to @jpambrun for this enhancement
+ // Added two paths (Int16Array, Uint16Array) to avoid polymorphic deoptimization in chrome.
+
+ start = Object(_now_js__WEBPACK_IMPORTED_MODULE_0__["default"])();
+
+ if (pixelData instanceof Int16Array) {
+ if (minPixelValue < 0) {
+ while (storedPixelDataIndex < numPixels) {
+ pixelValue = lut[pixelData[storedPixelDataIndex++] + -minPixelValue];
+ canvasImageDataData[canvasImageDataIndex++] = pixelValue;
+ canvasImageDataData[canvasImageDataIndex++] = pixelValue;
+ canvasImageDataData[canvasImageDataIndex++] = pixelValue;
+ canvasImageDataData[canvasImageDataIndex++] = 255; // Alpha
+ }
+ } else {
+ while (storedPixelDataIndex < numPixels) {
+ pixelValue = lut[pixelData[storedPixelDataIndex++]];
+ canvasImageDataData[canvasImageDataIndex++] = pixelValue;
+ canvasImageDataData[canvasImageDataIndex++] = pixelValue;
+ canvasImageDataData[canvasImageDataIndex++] = pixelValue;
+ canvasImageDataData[canvasImageDataIndex++] = 255; // Alpha
+ }
+ }
+ } else if (pixelData instanceof Uint16Array) {
+ while (storedPixelDataIndex < numPixels) {
+ pixelValue = lut[pixelData[storedPixelDataIndex++]];
+ canvasImageDataData[canvasImageDataIndex++] = pixelValue;
+ canvasImageDataData[canvasImageDataIndex++] = pixelValue;
+ canvasImageDataData[canvasImageDataIndex++] = pixelValue;
+ canvasImageDataData[canvasImageDataIndex++] = 255; // Alpha
+ }
+ } else if (minPixelValue < 0) {
+ while (storedPixelDataIndex < numPixels) {
+ pixelValue = lut[pixelData[storedPixelDataIndex++] + -minPixelValue];
+ canvasImageDataData[canvasImageDataIndex++] = pixelValue;
+ canvasImageDataData[canvasImageDataIndex++] = pixelValue;
+ canvasImageDataData[canvasImageDataIndex++] = pixelValue;
+ canvasImageDataData[canvasImageDataIndex++] = 255; // Alpha
+ }
+ } else {
+ while (storedPixelDataIndex < numPixels) {
+ pixelValue = lut[pixelData[storedPixelDataIndex++]];
+ canvasImageDataData[canvasImageDataIndex++] = pixelValue;
+ canvasImageDataData[canvasImageDataIndex++] = pixelValue;
+ canvasImageDataData[canvasImageDataIndex++] = pixelValue;
+ canvasImageDataData[canvasImageDataIndex++] = 255; // Alpha
+ }
+ }
+
+ image.stats.lastStoredPixelDataToCanvasImageDataTime = Object(_now_js__WEBPACK_IMPORTED_MODULE_0__["default"])() - start;
+});
+
+/***/ }),
+
+/***/ "./internal/storedRGBAPixelDataToCanvasImageData.js":
+/*!**********************************************************!*\
+ !*** ./internal/storedRGBAPixelDataToCanvasImageData.js ***!
+ \**********************************************************/
+/*! exports provided: default */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+__webpack_require__.r(__webpack_exports__);
+/* harmony import */ var _now_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./now.js */ "./internal/now.js");
+
+/**
+ * Converts stored RGBA color pixel values to display pixel values using a LUT.
+ *
+ * @param {Image} image A Cornerstone Image Object
+ * @param {Array} lut Lookup table array
+ * @param {Uint8ClampedArray} canvasImageDataData canvasImageData.data buffer filled with white pixels
+ *
+ * @returns {void}
+ * @memberof Internal
+ */
+
+/* harmony default export */ __webpack_exports__["default"] = (function (image, lut, canvasImageDataData) {
+ var start = Object(_now_js__WEBPACK_IMPORTED_MODULE_0__["default"])();
+ var pixelData = image.getPixelData();
+ image.stats.lastGetPixelDataTime = Object(_now_js__WEBPACK_IMPORTED_MODULE_0__["default"])() - start;
+ var minPixelValue = image.minPixelValue;
+ var canvasImageDataIndex = 0;
+ var storedPixelDataIndex = 0;
+ var numPixels = pixelData.length; // NOTE: As of Nov 2014, most javascript engines have lower performance when indexing negative indexes.
+ // We have a special code path for this case that improves performance. Thanks to @jpambrun for this enhancement
+
+ start = Object(_now_js__WEBPACK_IMPORTED_MODULE_0__["default"])();
+
+ if (minPixelValue < 0) {
+ while (storedPixelDataIndex < numPixels) {
+ canvasImageDataData[canvasImageDataIndex++] = lut[pixelData[storedPixelDataIndex++] + -minPixelValue]; // Red
+
+ canvasImageDataData[canvasImageDataIndex++] = lut[pixelData[storedPixelDataIndex++] + -minPixelValue]; // Green
+
+ canvasImageDataData[canvasImageDataIndex++] = lut[pixelData[storedPixelDataIndex++] + -minPixelValue]; // Blue
+
+ canvasImageDataData[canvasImageDataIndex++] = pixelData[storedPixelDataIndex++];
+ }
+ } else {
+ while (storedPixelDataIndex < numPixels) {
+ canvasImageDataData[canvasImageDataIndex++] = lut[pixelData[storedPixelDataIndex++]]; // Red
+
+ canvasImageDataData[canvasImageDataIndex++] = lut[pixelData[storedPixelDataIndex++]]; // Green
+
+ canvasImageDataData[canvasImageDataIndex++] = lut[pixelData[storedPixelDataIndex++]]; // Blue
+
+ canvasImageDataData[canvasImageDataIndex++] = pixelData[storedPixelDataIndex++];
+ }
+ }
+
+ image.stats.lastStoredPixelDataToCanvasImageDataTime = Object(_now_js__WEBPACK_IMPORTED_MODULE_0__["default"])() - start;
+});
+
+/***/ }),
+
+/***/ "./internal/transform.js":
+/*!*******************************!*\
+ !*** ./internal/transform.js ***!
+ \*******************************/
+/*! exports provided: Transform */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+__webpack_require__.r(__webpack_exports__);
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "Transform", function() { return Transform; });
+function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }
+
+function _defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } }
+
+function _createClass(Constructor, protoProps, staticProps) { if (protoProps) _defineProperties(Constructor.prototype, protoProps); if (staticProps) _defineProperties(Constructor, staticProps); return Constructor; }
+
+// By Simon Sarris
+// Www.simonsarris.com
+// Sarris@acm.org
+//
+// Free to use and distribute at will
+// So long as you are nice to people, etc
+// Simple class for keeping track of the current transformation matrix
+// For instance:
+// Var t = new Transform();
+// T.rotate(5);
+// Var m = t.m;
+// Ctx.setTransform(m[0], m[1], m[2], m[3], m[4], m[5]);
+// Is equivalent to:
+// Ctx.rotate(5);
+// But now you can retrieve it :)
+// Remember that this does not account for any CSS transforms applied to the canvas
+var Transform =
+/*#__PURE__*/
+function () {
+ function Transform() {
+ _classCallCheck(this, Transform);
+
+ this.reset();
+ }
+
+ _createClass(Transform, [{
+ key: "reset",
+ value: function reset() {
+ this.m = [1, 0, 0, 1, 0, 0];
+ }
+ }, {
+ key: "clone",
+ value: function clone() {
+ var transform = new Transform();
+ transform.m[0] = this.m[0];
+ transform.m[1] = this.m[1];
+ transform.m[2] = this.m[2];
+ transform.m[3] = this.m[3];
+ transform.m[4] = this.m[4];
+ transform.m[5] = this.m[5];
+ return transform;
+ }
+ }, {
+ key: "multiply",
+ value: function multiply(matrix) {
+ var m11 = this.m[0] * matrix.m[0] + this.m[2] * matrix.m[1];
+ var m12 = this.m[1] * matrix.m[0] + this.m[3] * matrix.m[1];
+ var m21 = this.m[0] * matrix.m[2] + this.m[2] * matrix.m[3];
+ var m22 = this.m[1] * matrix.m[2] + this.m[3] * matrix.m[3];
+ var dx = this.m[0] * matrix.m[4] + this.m[2] * matrix.m[5] + this.m[4];
+ var dy = this.m[1] * matrix.m[4] + this.m[3] * matrix.m[5] + this.m[5];
+ this.m[0] = m11;
+ this.m[1] = m12;
+ this.m[2] = m21;
+ this.m[3] = m22;
+ this.m[4] = dx;
+ this.m[5] = dy;
+ }
+ }, {
+ key: "invert",
+ value: function invert() {
+ var d = 1 / (this.m[0] * this.m[3] - this.m[1] * this.m[2]);
+ var m0 = this.m[3] * d;
+ var m1 = -this.m[1] * d;
+ var m2 = -this.m[2] * d;
+ var m3 = this.m[0] * d;
+ var m4 = d * (this.m[2] * this.m[5] - this.m[3] * this.m[4]);
+ var m5 = d * (this.m[1] * this.m[4] - this.m[0] * this.m[5]);
+ this.m[0] = m0;
+ this.m[1] = m1;
+ this.m[2] = m2;
+ this.m[3] = m3;
+ this.m[4] = m4;
+ this.m[5] = m5;
+ }
+ }, {
+ key: "rotate",
+ value: function rotate(rad) {
+ var c = Math.cos(rad);
+ var s = Math.sin(rad);
+ var m11 = this.m[0] * c + this.m[2] * s;
+ var m12 = this.m[1] * c + this.m[3] * s;
+ var m21 = this.m[0] * -s + this.m[2] * c;
+ var m22 = this.m[1] * -s + this.m[3] * c;
+ this.m[0] = m11;
+ this.m[1] = m12;
+ this.m[2] = m21;
+ this.m[3] = m22;
+ }
+ }, {
+ key: "translate",
+ value: function translate(x, y) {
+ this.m[4] += this.m[0] * x + this.m[2] * y;
+ this.m[5] += this.m[1] * x + this.m[3] * y;
+ }
+ }, {
+ key: "scale",
+ value: function scale(sx, sy) {
+ this.m[0] *= sx;
+ this.m[1] *= sx;
+ this.m[2] *= sy;
+ this.m[3] *= sy;
+ }
+ }, {
+ key: "transformPoint",
+ value: function transformPoint(px, py) {
+ var x = px;
+ var y = py;
+ px = x * this.m[0] + y * this.m[2] + this.m[4];
+ py = x * this.m[1] + y * this.m[3] + this.m[5];
+ return {
+ x: px,
+ y: py
+ };
+ }
+ }]);
+
+ return Transform;
+}();
+
+/***/ }),
+
+/***/ "./internal/tryEnableWebgl.js":
+/*!************************************!*\
+ !*** ./internal/tryEnableWebgl.js ***!
+ \************************************/
+/*! exports provided: default */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+__webpack_require__.r(__webpack_exports__);
+/* harmony import */ var _webgl_index_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../webgl/index.js */ "./webgl/index.js");
+
+/**
+ * Checks if webGL is supported and initializes the rendering engine.
+ * @param {any} options Options to check if webgl rendering is requested (e.g. enable webgl by passing {renderer: 'webgl'})
+ * @returns {Boolean} true if webgl rendering has been successfully initialized. Otherwise, false.
+ */
+
+/* harmony default export */ __webpack_exports__["default"] = (function (options) {
+ if (_webgl_index_js__WEBPACK_IMPORTED_MODULE_0__["default"].renderer.isWebGLAvailable()) {
+ // If WebGL is available on the device, initialize the renderer
+ // And return the renderCanvas from the WebGL rendering path
+ _webgl_index_js__WEBPACK_IMPORTED_MODULE_0__["default"].renderer.initRenderer();
+ options.renderer = 'webgl';
+ return true;
+ } // If WebGL is not available on this device, we will fall back
+ // To using the Canvas renderer
+
+
+ console.error('WebGL not available, falling back to Canvas renderer');
+ delete options.renderer;
+ return false;
+});
+
+/***/ }),
+
+/***/ "./internal/validator.js":
+/*!*******************************!*\
+ !*** ./internal/validator.js ***!
+ \*******************************/
+/*! exports provided: validateParameterUndefined, validateParameterUndefinedOrNull */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+__webpack_require__.r(__webpack_exports__);
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "validateParameterUndefined", function() { return validateParameterUndefined; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "validateParameterUndefinedOrNull", function() { return validateParameterUndefinedOrNull; });
+/**
+ * Check if the supplied parameter is undefined and throws and error
+ * @param {any} checkParam the parameter to validate for undefined
+ * @param {any} errorMsg the error message to be thrown
+ * @returns {void}
+ * @memberof internal
+ */
+function validateParameterUndefined(checkParam, errorMsg) {
+ if (checkParam === undefined) {
+ throw new Error(errorMsg);
+ }
+}
+/**
+ * Check if the supplied parameter is undefined or null and throws and error
+ * @param {any} checkParam the parameter to validate for undefined
+ * @param {any} errorMsg the error message to be thrown
+ * @returns {void}
+ * @memberof internal
+ */
+
+function validateParameterUndefinedOrNull(checkParam, errorMsg) {
+ if (checkParam === undefined || checkParam === null) {
+ throw new Error(errorMsg);
+ }
+}
+
+/***/ }),
+
+/***/ "./invalidate.js":
+/*!***********************!*\
+ !*** ./invalidate.js ***!
+ \***********************/
+/*! exports provided: default */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+__webpack_require__.r(__webpack_exports__);
+/* harmony import */ var _enabledElements_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./enabledElements.js */ "./enabledElements.js");
+/* harmony import */ var _triggerEvent_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./triggerEvent.js */ "./triggerEvent.js");
+/* harmony import */ var _events_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./events.js */ "./events.js");
+
+
+
+/**
+ * Sets the invalid flag on the enabled element and fire an event
+ * @param {HTMLElement} element The DOM element enabled for Cornerstone
+ * @returns {void}
+ * @memberof Drawing
+ */
+
+/* harmony default export */ __webpack_exports__["default"] = (function (element) {
+ var enabledElement = Object(_enabledElements_js__WEBPACK_IMPORTED_MODULE_0__["getEnabledElement"])(element);
+ enabledElement.invalid = true;
+ enabledElement.needsRedraw = true;
+ var eventData = {
+ element: element
+ };
+ Object(_triggerEvent_js__WEBPACK_IMPORTED_MODULE_1__["default"])(element, _events_js__WEBPACK_IMPORTED_MODULE_2__["default"].INVALIDATED, eventData);
+});
+
+/***/ }),
+
+/***/ "./invalidateImageId.js":
+/*!******************************!*\
+ !*** ./invalidateImageId.js ***!
+ \******************************/
+/*! exports provided: default */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+__webpack_require__.r(__webpack_exports__);
+/* harmony import */ var _enabledElements_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./enabledElements.js */ "./enabledElements.js");
+/* harmony import */ var _internal_drawImage_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./internal/drawImage.js */ "./internal/drawImage.js");
+
+
+/**
+ * Forces the image to be updated/redrawn for the all enabled elements
+ * displaying the specified imageId
+ *
+ * @param {string} imageId The imageId of the Cornerstone Image Object to redraw
+ * @returns {void}
+ * @memberof Drawing
+ */
+
+/* harmony default export */ __webpack_exports__["default"] = (function (imageId) {
+ var enabledElements = Object(_enabledElements_js__WEBPACK_IMPORTED_MODULE_0__["getEnabledElementsByImageId"])(imageId);
+ enabledElements.forEach(function (enabledElement) {
+ Object(_internal_drawImage_js__WEBPACK_IMPORTED_MODULE_1__["default"])(enabledElement, true);
+ });
+});
+
+/***/ }),
+
+/***/ "./layers.js":
+/*!*******************!*\
+ !*** ./layers.js ***!
+ \*******************/
+/*! exports provided: rescaleImage, addLayer, removeLayer, getLayer, getLayers, getVisibleLayers, setActiveLayer, setLayerImage, getActiveLayer, purgeLayers */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+__webpack_require__.r(__webpack_exports__);
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "rescaleImage", function() { return rescaleImage; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "addLayer", function() { return addLayer; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "removeLayer", function() { return removeLayer; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "getLayer", function() { return getLayer; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "getLayers", function() { return getLayers; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "getVisibleLayers", function() { return getVisibleLayers; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "setActiveLayer", function() { return setActiveLayer; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "setLayerImage", function() { return setLayerImage; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "getActiveLayer", function() { return getActiveLayer; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "purgeLayers", function() { return purgeLayers; });
+/* harmony import */ var _internal_guid_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./internal/guid.js */ "./internal/guid.js");
+/* harmony import */ var _enabledElements_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./enabledElements.js */ "./enabledElements.js");
+/* harmony import */ var _internal_getDefaultViewport_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./internal/getDefaultViewport.js */ "./internal/getDefaultViewport.js");
+/* harmony import */ var _updateImage_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./updateImage.js */ "./updateImage.js");
+/* harmony import */ var _triggerEvent_js__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./triggerEvent.js */ "./triggerEvent.js");
+/* harmony import */ var _events_js__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ./events.js */ "./events.js");
+
+
+
+
+
+
+/**
+ * @module EnabledElementLayers
+ */
+
+/**
+ * Helper function to trigger an event on a Cornerstone element with
+ * a specific layerId
+ *
+ * @param {String} eventName The event name (e.g. CornerstoneLayerAdded)
+ * @param {EnabledElement} enabledElement The Cornerstone enabled element
+ * @param {String} layerId The layer's unique identifier
+ * @returns {void}
+ * @memberof EnabledElementLayers
+ */
+
+function triggerEventForLayer(eventName, enabledElement, layerId) {
+ var element = enabledElement.element;
+ var eventData = {
+ viewport: enabledElement.viewport,
+ element: enabledElement.element,
+ image: enabledElement.image,
+ enabledElement: enabledElement,
+ layerId: layerId
+ };
+ Object(_triggerEvent_js__WEBPACK_IMPORTED_MODULE_4__["default"])(element, eventName, eventData);
+}
+/**
+ * Rescale the target layer to the base layer based on the
+ * relative size of each image and their pixel dimensions.
+ *
+ * This function will update the Viewport parameters of the
+ * target layer to a new scale.
+ *
+ * @param {EnabledElementLayer} baseLayer The base layer
+ * @param {EnabledElementLayer} targetLayer The target layer to rescale
+ * @returns {void}
+ * @memberof EnabledElementLayers
+ */
+
+
+function rescaleImage(baseLayer, targetLayer) {
+ if (baseLayer.layerId === targetLayer.layerId) {
+ throw new Error('rescaleImage: both arguments represent the same layer');
+ }
+
+ var baseImage = baseLayer.image;
+ var targetImage = targetLayer.image; // Return if these images don't have an imageId (e.g. for dynamic images)
+
+ if (!baseImage.imageId || !targetImage.imageId) {
+ return;
+ } // Column pixel spacing need to be considered when calculating the
+ // ratio between the layer added and base layer images
+
+
+ var colRelative = targetLayer.viewport.displayedArea.columnPixelSpacing * targetImage.width / (baseLayer.viewport.displayedArea.columnPixelSpacing * baseImage.width);
+ var viewportRatio = targetLayer.viewport.scale / baseLayer.viewport.scale * colRelative;
+ targetLayer.viewport.scale = baseLayer.viewport.scale * viewportRatio;
+}
+/**
+ * Add a layer to a Cornerstone element
+ *
+ * @param {HTMLElement} element The DOM element enabled for Cornerstone
+ * @param {Image} image A Cornerstone Image object to add as a new layer
+ * @param {Object} options Options for the layer
+ *
+ * @returns {String} layerId The new layer's unique identifier
+ * @memberof EnabledElementLayers
+ */
+
+function addLayer(element, image, options) {
+ var layerId = Object(_internal_guid_js__WEBPACK_IMPORTED_MODULE_0__["default"])();
+ var enabledElement = Object(_enabledElements_js__WEBPACK_IMPORTED_MODULE_1__["getEnabledElement"])(element);
+ var layers = enabledElement.layers;
+ var viewport;
+
+ if (image) {
+ viewport = Object(_internal_getDefaultViewport_js__WEBPACK_IMPORTED_MODULE_2__["default"])(enabledElement.canvas, image); // Override the defaults if any optional viewport settings
+ // have been specified
+
+ if (options && options.viewport) {
+ viewport = Object.assign(viewport, options.viewport);
+ }
+ } // Set syncViewports to true by default when a new layer is added
+
+
+ if (enabledElement.syncViewports !== false) {
+ enabledElement.syncViewports = true;
+ }
+
+ var newLayer = {
+ image: image,
+ layerId: layerId,
+ viewport: viewport,
+ options: options || {},
+ renderingTools: {}
+ }; // Rescale the new layer based on the base layer to make sure
+ // they will have a proportional size (pixel spacing)
+
+ if (layers.length && image) {
+ rescaleImage(layers[0], newLayer);
+ }
+
+ layers.push(newLayer);
+ triggerEventForLayer(_events_js__WEBPACK_IMPORTED_MODULE_5__["default"].LAYER_ADDED, enabledElement, layerId); // Set the layer as active if it's the first layer added
+
+ if (layers.length === 1 && image) {
+ setActiveLayer(element, layerId);
+ }
+
+ return layerId;
+}
+/**
+ * Remove a layer from a Cornerstone element given a layer ID
+ *
+ * @param {HTMLElement} element The DOM element enabled for Cornerstone
+ * @param {String} layerId The unique identifier for the layer
+ * @returns {void}
+ * @memberof EnabledElementLayers
+ */
+
+function removeLayer(element, layerId) {
+ var enabledElement = Object(_enabledElements_js__WEBPACK_IMPORTED_MODULE_1__["getEnabledElement"])(element);
+ var layers = enabledElement.layers;
+ var index = enabledElement.layers.findIndex(function (layer) {
+ return layer.layerId === layerId;
+ });
+
+ if (index !== -1) {
+ layers.splice(index, 1); // If the current layer is active, and we have other layers,
+ // switch to the first layer that remains in the array
+
+ if (layerId === enabledElement.activeLayerId && layers.length) {
+ setActiveLayer(element, layers[0].layerId);
+ }
+
+ triggerEventForLayer(_events_js__WEBPACK_IMPORTED_MODULE_5__["default"].LAYER_REMOVED, enabledElement, layerId);
+ }
+}
+/**
+ * Retrieve a layer from a Cornerstone element given a layer ID
+ *
+ * @param {HTMLElement} element The DOM element enabled for Cornerstone
+ * @param {String} layerId The unique identifier for the layer
+ * @return {EnabledElementLayer} The layer
+ * @memberof EnabledElementLayers
+ */
+
+function getLayer(element, layerId) {
+ var enabledElement = Object(_enabledElements_js__WEBPACK_IMPORTED_MODULE_1__["getEnabledElement"])(element);
+ return enabledElement.layers.find(function (layer) {
+ return layer.layerId === layerId;
+ });
+}
+/**
+ * Retrieve all layers for a Cornerstone element
+ *
+ * @param {HTMLElement} element The DOM element enabled for Cornerstone
+ *
+ * @return {EnabledElementLayer[]} An array of layers
+ * @memberof EnabledElementLayers
+ */
+
+function getLayers(element) {
+ var enabledElement = Object(_enabledElements_js__WEBPACK_IMPORTED_MODULE_1__["getEnabledElement"])(element);
+ return enabledElement.layers;
+}
+/**
+ * Retrieve all visible layers for a Cornerstone element
+ *
+ * @param {HTMLElement} element The DOM element enabled for Cornerstone
+ *
+ * @return {EnabledElementLayer[]} An array of layers
+ * @memberof EnabledElementLayers
+ */
+
+function getVisibleLayers(element) {
+ var enabledElement = Object(_enabledElements_js__WEBPACK_IMPORTED_MODULE_1__["getEnabledElement"])(element);
+ return enabledElement.layers.filter(function (layer) {
+ return layer.options && layer.options.visible !== false && layer.options.opacity !== 0;
+ });
+}
+/**
+ * Set the active layer for a Cornerstone element
+ *
+ * @param {HTMLElement} element The DOM element enabled for Cornerstone
+ * @param {String} layerId The unique identifier for the layer
+ * @returns {void}
+ * @memberof EnabledElementLayers
+ */
+
+function setActiveLayer(element, layerId) {
+ var enabledElement = Object(_enabledElements_js__WEBPACK_IMPORTED_MODULE_1__["getEnabledElement"])(element); // Stop here if this layer is already active
+
+ if (enabledElement.activeLayerId === layerId) {
+ return;
+ }
+
+ var index = enabledElement.layers.findIndex(function (layer) {
+ return layer.layerId === layerId;
+ });
+
+ if (index === -1) {
+ throw new Error('setActiveLayer: layer not found in layers array');
+ }
+
+ var layer = enabledElement.layers[index];
+
+ if (!layer.image) {
+ throw new Error('setActiveLayer: layer with undefined image cannot be set as active.');
+ }
+
+ enabledElement.activeLayerId = layerId;
+ enabledElement.image = layer.image;
+ enabledElement.viewport = layer.viewport;
+ Object(_updateImage_js__WEBPACK_IMPORTED_MODULE_3__["default"])(element);
+ triggerEventForLayer(_events_js__WEBPACK_IMPORTED_MODULE_5__["default"].ACTIVE_LAYER_CHANGED, enabledElement, layerId);
+}
+/**
+ * Set a new image for a specific layerId
+ *
+ * @param {HTMLElement} element The DOM element enabled for Cornerstone
+ * @param {Image} image The image to be displayed in this layer
+ * @param {String} [layerId] The unique identifier for the layer
+ * @returns {void}
+ * @memberof EnabledElementLayers
+ */
+
+function setLayerImage(element, image, layerId) {
+ var enabledElement = Object(_enabledElements_js__WEBPACK_IMPORTED_MODULE_1__["getEnabledElement"])(element);
+ var baseLayer = enabledElement.layers[0];
+ var layer;
+
+ if (layerId) {
+ layer = getLayer(element, layerId);
+ } else {
+ layer = getActiveLayer(element);
+ }
+
+ if (!layer) {
+ throw new Error('setLayerImage: Layer not found');
+ }
+
+ layer.image = image;
+
+ if (!image) {
+ layer.viewport = undefined;
+ return;
+ }
+
+ if (!layer.viewport) {
+ var defaultViewport = Object(_internal_getDefaultViewport_js__WEBPACK_IMPORTED_MODULE_2__["default"])(enabledElement.canvas, image); // Override the defaults if any optional viewport settings
+ // have been specified
+
+ if (layer.options && layer.options.viewport) {
+ layer.viewport = Object.assign(defaultViewport, layer.options.viewport);
+ }
+
+ if (baseLayer.layerId !== layerId) {
+ rescaleImage(baseLayer, layer);
+ }
+ }
+}
+/**
+ * Retrieve the currently active layer for a Cornerstone element
+ *
+ * @param {HTMLElement} element The DOM element enabled for Cornerstone
+ * @return {EnabledElementLayer} The currently active layer
+ * @memberof EnabledElementLayers
+ */
+
+function getActiveLayer(element) {
+ var enabledElement = Object(_enabledElements_js__WEBPACK_IMPORTED_MODULE_1__["getEnabledElement"])(element);
+ return enabledElement.layers.find(function (layer) {
+ return layer.layerId === enabledElement.activeLayerId;
+ });
+}
+/**
+ * Purge the layers
+ *
+ * @param {HTMLElement} element The DOM element enabled for Cornerstone
+ *
+ * @returns {void}
+ */
+
+function purgeLayers(element) {
+ var enabledElement = Object(_enabledElements_js__WEBPACK_IMPORTED_MODULE_1__["getEnabledElement"])(element);
+ enabledElement.layers = [];
+ delete enabledElement.activeLayerId;
+ delete enabledElement.lastSyncViewportsState;
+}
+
+/***/ }),
+
+/***/ "./metaData.js":
+/*!*********************!*\
+ !*** ./metaData.js ***!
+ \*********************/
+/*! exports provided: addProvider, removeProvider, default */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+__webpack_require__.r(__webpack_exports__);
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "addProvider", function() { return addProvider; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "removeProvider", function() { return removeProvider; });
+// This module defines a way to access various metadata about an imageId. This layer of abstraction exists
+// So metadata can be provided in different ways (e.g. by parsing DICOM P10 or by a WADO-RS document)
+var providers = [];
+/**
+ * @module Metadata
+ */
+
+/**
+ * Adds a metadata provider with the specified priority
+ * @param {Function} provider Metadata provider function
+ * @param {Number} [priority=0] - 0 is default/normal, > 0 is high, < 0 is low
+ *
+ * @returns {void}
+ * @memberof Metadata
+ */
+
+function addProvider(provider) {
+ var priority = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 0;
+ var i; // Find the right spot to insert this provider based on priority
+
+ for (i = 0; i < providers.length; i++) {
+ if (providers[i].priority <= priority) {
+ break;
+ }
+ } // Insert the decode task at position i
+
+
+ providers.splice(i, 0, {
+ priority: priority,
+ provider: provider
+ });
+}
+/**
+ * Removes the specified provider
+ *
+ * @param {Function} provider Metadata provider function
+ *
+ * @returns {void}
+ * @memberof Metadata
+ */
+
+function removeProvider(provider) {
+ for (var i = 0; i < providers.length; i++) {
+ if (providers[i].provider === provider) {
+ providers.splice(i, 1);
+ break;
+ }
+ }
+}
+/**
+ * Gets metadata from the registered metadata providers. Will call each one from highest priority to lowest
+ * until one responds
+ *
+ * @param {String} type The type of metadata requested from the metadata store
+ * @param {String} imageId The Cornerstone Image Object's imageId
+ *
+ * @returns {*} The metadata retrieved from the metadata store
+ * @memberof Metadata
+ */
+
+function getMetaData(type, imageId) {
+ // Invoke each provider in priority order until one returns something
+ for (var i = 0; i < providers.length; i++) {
+ var result = providers[i].provider(type, imageId);
+
+ if (result !== undefined) {
+ return result;
+ }
+ }
+}
+
+/* harmony default export */ __webpack_exports__["default"] = ({
+ addProvider: addProvider,
+ removeProvider: removeProvider,
+ get: getMetaData
+});
+
+/***/ }),
+
+/***/ "./pageToPixel.js":
+/*!************************!*\
+ !*** ./pageToPixel.js ***!
+ \************************/
+/*! exports provided: default */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+__webpack_require__.r(__webpack_exports__);
+/* harmony import */ var _enabledElements_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./enabledElements.js */ "./enabledElements.js");
+/* harmony import */ var _internal_getTransform_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./internal/getTransform.js */ "./internal/getTransform.js");
+
+
+/**
+ * Converts a point in the page coordinate system to the pixel coordinate
+ * system
+ *
+ * @param {HTMLElement} element The Cornerstone element within which the input point lies
+ * @param {Number} pageX The x value in the page coordinate system
+ * @param {Number} pageY The y value in the page coordinate system
+ *
+ * @returns {{x: Number, y: Number}} The transformed point in the pixel coordinate system
+ */
+
+/* harmony default export */ __webpack_exports__["default"] = (function (element, pageX, pageY) {
+ var enabledElement = Object(_enabledElements_js__WEBPACK_IMPORTED_MODULE_0__["getEnabledElement"])(element);
+
+ if (enabledElement.image === undefined) {
+ throw new Error('image has not been loaded yet');
+ } // Convert the pageX and pageY to the canvas client coordinates
+
+
+ var rect = element.getBoundingClientRect();
+ var clientX = pageX - rect.left - window.pageXOffset;
+ var clientY = pageY - rect.top - window.pageYOffset;
+ var pt = {
+ x: clientX,
+ y: clientY
+ };
+ var transform = Object(_internal_getTransform_js__WEBPACK_IMPORTED_MODULE_1__["default"])(enabledElement);
+ transform.invert();
+ return transform.transformPoint(pt.x, pt.y);
+});
+
+/***/ }),
+
+/***/ "./pixelDataToFalseColorData.js":
+/*!**************************************!*\
+ !*** ./pixelDataToFalseColorData.js ***!
+ \**************************************/
+/*! exports provided: default */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+__webpack_require__.r(__webpack_exports__);
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "default", function() { return pixelDataToFalseColorData; });
+/* harmony import */ var _colors_index_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./colors/index.js */ "./colors/index.js");
+
+/**
+ * Converts the image pixel data into a false color data
+ *
+ * @param {Image} image A Cornerstone Image Object
+ * @param {Object} lookupTable A lookup table Object
+ *
+ * @returns {void}
+ * @deprecated This function is superseded by the ability to set the Viewport parameters
+ * to include colormaps.
+ */
+
+function pixelDataToFalseColorData(image, lookupTable) {
+ if (image.color && !image.falseColor) {
+ throw new Error('Color transforms are not implemented yet');
+ }
+
+ var minPixelValue = image.minPixelValue;
+ var canvasImageDataIndex = 0;
+ var storedPixelDataIndex = 0;
+ var numPixels = image.width * image.height;
+ var origPixelData = image.origPixelData || image.getPixelData();
+ var storedColorPixelData = new Uint8Array(numPixels * 4);
+ var sp;
+ var mapped;
+ image.color = true;
+ image.falseColor = true;
+ image.origPixelData = origPixelData;
+
+ if (lookupTable instanceof _colors_index_js__WEBPACK_IMPORTED_MODULE_0__["default"].LookupTable) {
+ lookupTable.build();
+
+ while (storedPixelDataIndex < numPixels) {
+ sp = origPixelData[storedPixelDataIndex++];
+ mapped = lookupTable.mapValue(sp);
+ storedColorPixelData[canvasImageDataIndex++] = mapped[0];
+ storedColorPixelData[canvasImageDataIndex++] = mapped[1];
+ storedColorPixelData[canvasImageDataIndex++] = mapped[2];
+ storedColorPixelData[canvasImageDataIndex++] = mapped[3];
+ }
+ } else if (minPixelValue < 0) {
+ while (storedPixelDataIndex < numPixels) {
+ sp = origPixelData[storedPixelDataIndex++];
+ storedColorPixelData[canvasImageDataIndex++] = lookupTable[sp + -minPixelValue][0]; // Red
+
+ storedColorPixelData[canvasImageDataIndex++] = lookupTable[sp + -minPixelValue][1]; // Green
+
+ storedColorPixelData[canvasImageDataIndex++] = lookupTable[sp + -minPixelValue][2]; // Blue
+
+ storedColorPixelData[canvasImageDataIndex++] = lookupTable[sp + -minPixelValue][3]; // Alpha
+ }
+ } else {
+ while (storedPixelDataIndex < numPixels) {
+ sp = origPixelData[storedPixelDataIndex++];
+ storedColorPixelData[canvasImageDataIndex++] = lookupTable[sp][0]; // Red
+
+ storedColorPixelData[canvasImageDataIndex++] = lookupTable[sp][1]; // Green
+
+ storedColorPixelData[canvasImageDataIndex++] = lookupTable[sp][2]; // Blue
+
+ storedColorPixelData[canvasImageDataIndex++] = lookupTable[sp][3]; // Alpha
+ }
+ }
+
+ image.rgba = true;
+ image.cachedLut = undefined;
+ image.render = undefined;
+ image.slope = 1;
+ image.intercept = 0;
+ image.minPixelValue = 0;
+ image.maxPixelValue = 255;
+ image.windowWidth = 255;
+ image.windowCenter = 128;
+
+ image.getPixelData = function () {
+ return storedColorPixelData;
+ };
+}
+
+/***/ }),
+
+/***/ "./pixelToCanvas.js":
+/*!**************************!*\
+ !*** ./pixelToCanvas.js ***!
+ \**************************/
+/*! exports provided: default */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+__webpack_require__.r(__webpack_exports__);
+/* harmony import */ var _enabledElements_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./enabledElements.js */ "./enabledElements.js");
+/* harmony import */ var _internal_getTransform_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./internal/getTransform.js */ "./internal/getTransform.js");
+
+
+/**
+ * Converts a point in the pixel coordinate system to the canvas coordinate system
+ * system. This can be used to render using canvas context without having the weird
+ * side effects that come from scaling and non square pixels
+ *
+ * @param {HTMLElement} element An HTML Element enabled for Cornerstone
+ * @param {{x: Number, y: Number}} pt The transformed point in the pixel coordinate system
+ *
+ * @returns {{x: Number, y: Number}} The input point in the canvas coordinate system
+ * @memberof PixelCoordinateSystem
+ */
+
+/* harmony default export */ __webpack_exports__["default"] = (function (element, pt) {
+ var enabledElement = Object(_enabledElements_js__WEBPACK_IMPORTED_MODULE_0__["getEnabledElement"])(element);
+ var transform = Object(_internal_getTransform_js__WEBPACK_IMPORTED_MODULE_1__["default"])(enabledElement);
+ return transform.transformPoint(pt.x, pt.y);
+});
+
+/***/ }),
+
+/***/ "./rendering/doesImageNeedToBeRendered.js":
+/*!************************************************!*\
+ !*** ./rendering/doesImageNeedToBeRendered.js ***!
+ \************************************************/
+/*! exports provided: default */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+__webpack_require__.r(__webpack_exports__);
+/**
+ * Determine whether or not an Enabled Element needs to be re-rendered.
+ *
+ * If the imageId has changed, or if any of the last rendered viewport
+ * parameters have changed, this function will return true.
+ *
+ * @param {EnabledElement} enabledElement An Enabled Element
+ * @param {Image} image An Image
+ * @return {boolean} Whether or not the Enabled Element needs to re-render its image
+ * @memberof rendering
+ */
+/* harmony default export */ __webpack_exports__["default"] = (function (enabledElement, image) {
+ var lastRenderedImageId = enabledElement.renderingTools.lastRenderedImageId;
+ var lastRenderedViewport = enabledElement.renderingTools.lastRenderedViewport;
+ return image.imageId !== lastRenderedImageId || !lastRenderedViewport || lastRenderedViewport.windowCenter !== enabledElement.viewport.voi.windowCenter || lastRenderedViewport.windowWidth !== enabledElement.viewport.voi.windowWidth || lastRenderedViewport.invert !== enabledElement.viewport.invert || lastRenderedViewport.rotation !== enabledElement.viewport.rotation || lastRenderedViewport.hflip !== enabledElement.viewport.hflip || lastRenderedViewport.vflip !== enabledElement.viewport.vflip || lastRenderedViewport.modalityLUT !== enabledElement.viewport.modalityLUT || lastRenderedViewport.voiLUT !== enabledElement.viewport.voiLUT || lastRenderedViewport.colormap !== enabledElement.viewport.colormap;
+});
+
+/***/ }),
+
+/***/ "./rendering/getLut.js":
+/*!*****************************!*\
+ !*** ./rendering/getLut.js ***!
+ \*****************************/
+/*! exports provided: default */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+__webpack_require__.r(__webpack_exports__);
+/* harmony import */ var _internal_computeAutoVoi_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../internal/computeAutoVoi.js */ "./internal/computeAutoVoi.js");
+/* harmony import */ var _lutMatches_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./lutMatches.js */ "./rendering/lutMatches.js");
+/* harmony import */ var _internal_generateLut_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../internal/generateLut.js */ "./internal/generateLut.js");
+
+
+
+/**
+ * Retrieve or generate a LUT Array for an Image and Viewport
+ *
+ * @param {Image} image An Image Object
+ * @param {Viewport} viewport An Viewport Object
+ * @param {Boolean} invalidated Whether or not the LUT data has been invalidated
+ * (e.g. by a change to the windowWidth, windowCenter, or invert viewport parameters).
+ * @return {Uint8ClampedArray} LUT Array
+ * @memberof rendering
+ */
+
+/* harmony default export */ __webpack_exports__["default"] = (function (image, viewport, invalidated) {
+ // If we have a cached lut and it has the right values, return it immediately
+ if (image.cachedLut !== undefined && image.cachedLut.windowCenter === viewport.voi.windowCenter && image.cachedLut.windowWidth === viewport.voi.windowWidth && Object(_lutMatches_js__WEBPACK_IMPORTED_MODULE_1__["default"])(image.cachedLut.modalityLUT, viewport.modalityLUT) && Object(_lutMatches_js__WEBPACK_IMPORTED_MODULE_1__["default"])(image.cachedLut.voiLUT, viewport.voiLUT) && image.cachedLut.invert === viewport.invert && invalidated !== true) {
+ return image.cachedLut.lutArray;
+ }
+
+ Object(_internal_computeAutoVoi_js__WEBPACK_IMPORTED_MODULE_0__["default"])(viewport, image); // Lut is invalid or not present, regenerate it and cache it
+
+ Object(_internal_generateLut_js__WEBPACK_IMPORTED_MODULE_2__["default"])(image, viewport.voi.windowWidth, viewport.voi.windowCenter, viewport.invert, viewport.modalityLUT, viewport.voiLUT);
+ image.cachedLut.windowWidth = viewport.voi.windowWidth;
+ image.cachedLut.windowCenter = viewport.voi.windowCenter;
+ image.cachedLut.invert = viewport.invert;
+ image.cachedLut.voiLUT = viewport.voiLUT;
+ image.cachedLut.modalityLUT = viewport.modalityLUT;
+ return image.cachedLut.lutArray;
+});
+
+/***/ }),
+
+/***/ "./rendering/index.js":
+/*!****************************!*\
+ !*** ./rendering/index.js ***!
+ \****************************/
+/*! exports provided: default */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+__webpack_require__.r(__webpack_exports__);
+/* harmony import */ var _renderColorImage_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./renderColorImage.js */ "./rendering/renderColorImage.js");
+/* harmony import */ var _renderGrayscaleImage_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./renderGrayscaleImage.js */ "./rendering/renderGrayscaleImage.js");
+/* harmony import */ var _renderWebImage_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./renderWebImage.js */ "./rendering/renderWebImage.js");
+/* harmony import */ var _renderPseudoColorImage_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./renderPseudoColorImage.js */ "./rendering/renderPseudoColorImage.js");
+/* harmony import */ var _renderLabelMapImage_js__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./renderLabelMapImage.js */ "./rendering/renderLabelMapImage.js");
+/* harmony import */ var _renderToCanvas_js__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ./renderToCanvas.js */ "./rendering/renderToCanvas.js");
+
+
+
+
+
+
+/**
+ * @module rendering
+ */
+
+/* harmony default export */ __webpack_exports__["default"] = ({
+ colorImage: _renderColorImage_js__WEBPACK_IMPORTED_MODULE_0__["renderColorImage"],
+ grayscaleImage: _renderGrayscaleImage_js__WEBPACK_IMPORTED_MODULE_1__["renderGrayscaleImage"],
+ webImage: _renderWebImage_js__WEBPACK_IMPORTED_MODULE_2__["renderWebImage"],
+ pseudoColorImage: _renderPseudoColorImage_js__WEBPACK_IMPORTED_MODULE_3__["renderPseudoColorImage"],
+ labelMapImage: _renderLabelMapImage_js__WEBPACK_IMPORTED_MODULE_4__["renderLabelMapImage"],
+ toCanvas: _renderToCanvas_js__WEBPACK_IMPORTED_MODULE_5__["default"]
+});
+
+/***/ }),
+
+/***/ "./rendering/initializeRenderCanvas.js":
+/*!*********************************************!*\
+ !*** ./rendering/initializeRenderCanvas.js ***!
+ \*********************************************/
+/*! exports provided: default */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+__webpack_require__.r(__webpack_exports__);
+/**
+ * Sets size and clears canvas
+ *
+ * @param {Object} enabledElement Cornerstone Enabled Element
+ * @param {Object} image Image to be rendered
+ * @returns {void}
+ * @memberof rendering
+ */
+/* harmony default export */ __webpack_exports__["default"] = (function (enabledElement, image) {
+ var renderCanvas = enabledElement.renderingTools.renderCanvas; // Resize the canvas
+
+ renderCanvas.width = image.width;
+ renderCanvas.height = image.height;
+ var canvasContext = renderCanvas.getContext('2d'); // NOTE - we need to fill the render canvas with white pixels since we
+ // control the luminance using the alpha channel to improve rendering performance.
+
+ canvasContext.fillStyle = 'white';
+ canvasContext.fillRect(0, 0, renderCanvas.width, renderCanvas.height);
+ var renderCanvasData = canvasContext.getImageData(0, 0, image.width, image.height);
+ enabledElement.renderingTools.renderCanvasContext = canvasContext;
+ enabledElement.renderingTools.renderCanvasData = renderCanvasData;
+});
+
+/***/ }),
+
+/***/ "./rendering/lutMatches.js":
+/*!*********************************!*\
+ !*** ./rendering/lutMatches.js ***!
+ \*********************************/
+/*! exports provided: default */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+__webpack_require__.r(__webpack_exports__);
+/**
+ * Check if two lookup tables match
+ *
+ * @param {LUT} a A lookup table function
+ * @param {LUT} b Another lookup table function
+ * @return {boolean} Whether or not they match
+ * @memberof rendering
+ */
+/* harmony default export */ __webpack_exports__["default"] = (function (a, b) {
+ // If undefined, they are equal
+ if (!a && !b) {
+ return true;
+ } // If one is undefined, not equal
+
+
+ if (!a || !b) {
+ return false;
+ } // Check the unique ids
+
+
+ return a.id === b.id;
+});
+
+/***/ }),
+
+/***/ "./rendering/renderColorImage.js":
+/*!***************************************!*\
+ !*** ./rendering/renderColorImage.js ***!
+ \***************************************/
+/*! exports provided: renderColorImage, addColorLayer */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+__webpack_require__.r(__webpack_exports__);
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "renderColorImage", function() { return renderColorImage; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "addColorLayer", function() { return addColorLayer; });
+/* harmony import */ var _internal_now_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../internal/now.js */ "./internal/now.js");
+/* harmony import */ var _internal_generateColorLut_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../internal/generateColorLut.js */ "./internal/generateColorLut.js");
+/* harmony import */ var _internal_storedColorPixelDataToCanvasImageData_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../internal/storedColorPixelDataToCanvasImageData.js */ "./internal/storedColorPixelDataToCanvasImageData.js");
+/* harmony import */ var _internal_storedRGBAPixelDataToCanvasImageData_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../internal/storedRGBAPixelDataToCanvasImageData.js */ "./internal/storedRGBAPixelDataToCanvasImageData.js");
+/* harmony import */ var _setToPixelCoordinateSystem_js__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../setToPixelCoordinateSystem.js */ "./setToPixelCoordinateSystem.js");
+/* harmony import */ var _webgl_index_js__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../webgl/index.js */ "./webgl/index.js");
+/* harmony import */ var _doesImageNeedToBeRendered_js__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ./doesImageNeedToBeRendered.js */ "./rendering/doesImageNeedToBeRendered.js");
+/* harmony import */ var _initializeRenderCanvas_js__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ./initializeRenderCanvas.js */ "./rendering/initializeRenderCanvas.js");
+/* harmony import */ var _saveLastRendered_js__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ./saveLastRendered.js */ "./rendering/saveLastRendered.js");
+
+
+
+
+
+
+
+
+
+/**
+ * Generates an appropriate Look Up Table to render the given image with the given window width and level (specified in the viewport)
+ * Uses an internal cache for performance
+ *
+ * @param {Object} image The image to be rendered
+ * @param {Object} viewport The viewport values used for rendering
+ * @returns {Uint8ClampedArray} Look Up Table array.
+ * @memberof rendering
+ */
+
+function getLut(image, viewport) {
+ // If we have a cached lut and it has the right values, return it immediately
+ if (image.cachedLut !== undefined && image.cachedLut.windowCenter === viewport.voi.windowCenter && image.cachedLut.windowWidth === viewport.voi.windowWidth && image.cachedLut.invert === viewport.invert) {
+ return image.cachedLut.lutArray;
+ } // Lut is invalid or not present, regenerate it and cache it
+
+
+ Object(_internal_generateColorLut_js__WEBPACK_IMPORTED_MODULE_1__["default"])(image, viewport.voi.windowWidth, viewport.voi.windowCenter, viewport.invert);
+ image.cachedLut.windowWidth = viewport.voi.windowWidth;
+ image.cachedLut.windowCenter = viewport.voi.windowCenter;
+ image.cachedLut.invert = viewport.invert;
+ return image.cachedLut.lutArray;
+}
+/**
+ * Returns an appropriate canvas to render the Image. If the canvas available in the cache is appropriate
+ * it is returned, otherwise adjustments are made. It also sets the color transfer functions.
+ *
+ * @param {Object} enabledElement The cornerstone enabled element
+ * @param {Object} image The image to be rendered
+ * @param {Boolean} invalidated Is pixel data valid
+ * @returns {HTMLCanvasElement} An appropriate canvas for rendering the image
+ * @memberof rendering
+ */
+
+
+function getRenderCanvas(enabledElement, image, invalidated) {
+ var canvasWasColor = enabledElement.renderingTools.lastRenderedIsColor === true;
+
+ if (!enabledElement.renderingTools.renderCanvas || !canvasWasColor) {
+ enabledElement.renderingTools.renderCanvas = document.createElement('canvas');
+ }
+
+ var renderCanvas = enabledElement.renderingTools.renderCanvas; // The ww/wc is identity and not inverted - get a canvas with the image rendered into it for
+ // Fast drawing
+
+ if (enabledElement.viewport.voi.windowWidth === 255 && enabledElement.viewport.voi.windowCenter === 128 && enabledElement.viewport.invert === false && image.getCanvas && image.getCanvas()) {
+ return image.getCanvas();
+ } // Apply the lut to the stored pixel data onto the render canvas
+
+
+ if (Object(_doesImageNeedToBeRendered_js__WEBPACK_IMPORTED_MODULE_6__["default"])(enabledElement, image) === false && invalidated !== true) {
+ return renderCanvas;
+ } // If our render canvas does not match the size of this image reset it
+ // NOTE: This might be inefficient if we are updating multiple images of different
+ // Sizes frequently.
+
+
+ if (renderCanvas.width !== image.width || renderCanvas.height !== image.height) {
+ Object(_initializeRenderCanvas_js__WEBPACK_IMPORTED_MODULE_7__["default"])(enabledElement, image);
+ } // Get the lut to use
+
+
+ var start = Object(_internal_now_js__WEBPACK_IMPORTED_MODULE_0__["default"])();
+ var colorLut = getLut(image, enabledElement.viewport);
+ image.stats = image.stats || {};
+ image.stats.lastLutGenerateTime = Object(_internal_now_js__WEBPACK_IMPORTED_MODULE_0__["default"])() - start;
+ var renderCanvasData = enabledElement.renderingTools.renderCanvasData;
+ var renderCanvasContext = enabledElement.renderingTools.renderCanvasContext; // The color image voi/invert has been modified - apply the lut to the underlying
+ // Pixel data and put it into the renderCanvas
+
+ if (image.rgba) {
+ Object(_internal_storedRGBAPixelDataToCanvasImageData_js__WEBPACK_IMPORTED_MODULE_3__["default"])(image, colorLut, renderCanvasData.data);
+ } else {
+ Object(_internal_storedColorPixelDataToCanvasImageData_js__WEBPACK_IMPORTED_MODULE_2__["default"])(image, colorLut, renderCanvasData.data);
+ }
+
+ start = Object(_internal_now_js__WEBPACK_IMPORTED_MODULE_0__["default"])();
+ renderCanvasContext.putImageData(renderCanvasData, 0, 0);
+ image.stats.lastPutImageDataTime = Object(_internal_now_js__WEBPACK_IMPORTED_MODULE_0__["default"])() - start;
+ return renderCanvas;
+}
+/**
+ * API function to render a color image to an enabled element
+ *
+ * @param {EnabledElement} enabledElement The Cornerstone Enabled Element to redraw
+ * @param {Boolean} invalidated - true if pixel data has been invalidated and cached rendering should not be used
+ * @returns {void}
+ * @memberof rendering
+ */
+
+
+function renderColorImage(enabledElement, invalidated) {
+ if (enabledElement === undefined) {
+ throw new Error('renderColorImage: enabledElement parameter must not be undefined');
+ }
+
+ var image = enabledElement.image;
+
+ if (image === undefined) {
+ throw new Error('renderColorImage: image must be loaded before it can be drawn');
+ } // Get the canvas context and reset the transform
+
+
+ var context = enabledElement.canvas.getContext('2d');
+ context.setTransform(1, 0, 0, 1, 0, 0); // Clear the canvas
+
+ context.fillStyle = 'black';
+ context.fillRect(0, 0, enabledElement.canvas.width, enabledElement.canvas.height); // Turn off image smooth/interpolation if pixelReplication is set in the viewport
+
+ context.imageSmoothingEnabled = !enabledElement.viewport.pixelReplication;
+ context.mozImageSmoothingEnabled = context.imageSmoothingEnabled; // Save the canvas context state and apply the viewport properties
+
+ Object(_setToPixelCoordinateSystem_js__WEBPACK_IMPORTED_MODULE_4__["default"])(enabledElement, context);
+ var renderCanvas;
+
+ if (enabledElement.options && enabledElement.options.renderer && enabledElement.options.renderer.toLowerCase() === 'webgl') {
+ // If this enabled element has the option set for WebGL, we should
+ // User it as our renderer.
+ renderCanvas = _webgl_index_js__WEBPACK_IMPORTED_MODULE_5__["default"].renderer.render(enabledElement);
+ } else {
+ // If no options are set we will retrieve the renderCanvas through the
+ // Normal Canvas rendering path
+ renderCanvas = getRenderCanvas(enabledElement, image, invalidated);
+ }
+
+ var sx = enabledElement.viewport.displayedArea.tlhc.x - 1;
+ var sy = enabledElement.viewport.displayedArea.tlhc.y - 1;
+ var width = enabledElement.viewport.displayedArea.brhc.x - sx;
+ var height = enabledElement.viewport.displayedArea.brhc.y - sy;
+ context.drawImage(renderCanvas, sx, sy, width, height, 0, 0, width, height);
+ enabledElement.renderingTools = Object(_saveLastRendered_js__WEBPACK_IMPORTED_MODULE_8__["default"])(enabledElement);
+}
+function addColorLayer(layer, invalidated) {
+ if (layer === undefined) {
+ throw new Error('addColorLayer: layer parameter must not be undefined');
+ }
+
+ var image = layer.image;
+
+ if (image === undefined) {
+ throw new Error('addColorLayer: image must be loaded before it can be drawn');
+ } // All multi-layer images should include the alpha value
+
+
+ image.rgba = true;
+ layer.canvas = getRenderCanvas(layer, image, invalidated);
+ var context = layer.canvas.getContext('2d'); // Turn off image smooth/interpolation if pixelReplication is set in the viewport
+
+ context.imageSmoothingEnabled = !layer.viewport.pixelReplication;
+ context.mozImageSmoothingEnabled = context.imageSmoothingEnabled;
+ layer.renderingTools = Object(_saveLastRendered_js__WEBPACK_IMPORTED_MODULE_8__["default"])(layer);
+}
+
+/***/ }),
+
+/***/ "./rendering/renderGrayscaleImage.js":
+/*!*******************************************!*\
+ !*** ./rendering/renderGrayscaleImage.js ***!
+ \*******************************************/
+/*! exports provided: renderGrayscaleImage, addGrayscaleLayer */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+__webpack_require__.r(__webpack_exports__);
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "renderGrayscaleImage", function() { return renderGrayscaleImage; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "addGrayscaleLayer", function() { return addGrayscaleLayer; });
+/* harmony import */ var _internal_storedPixelDataToCanvasImageData_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../internal/storedPixelDataToCanvasImageData.js */ "./internal/storedPixelDataToCanvasImageData.js");
+/* harmony import */ var _internal_storedPixelDataToCanvasImageDataRGBA_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../internal/storedPixelDataToCanvasImageDataRGBA.js */ "./internal/storedPixelDataToCanvasImageDataRGBA.js");
+/* harmony import */ var _setToPixelCoordinateSystem_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../setToPixelCoordinateSystem.js */ "./setToPixelCoordinateSystem.js");
+/* harmony import */ var _internal_now_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../internal/now.js */ "./internal/now.js");
+/* harmony import */ var _webgl_index_js__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../webgl/index.js */ "./webgl/index.js");
+/* harmony import */ var _getLut_js__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ./getLut.js */ "./rendering/getLut.js");
+/* harmony import */ var _doesImageNeedToBeRendered_js__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ./doesImageNeedToBeRendered.js */ "./rendering/doesImageNeedToBeRendered.js");
+/* harmony import */ var _initializeRenderCanvas_js__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ./initializeRenderCanvas.js */ "./rendering/initializeRenderCanvas.js");
+/* harmony import */ var _saveLastRendered_js__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ./saveLastRendered.js */ "./rendering/saveLastRendered.js");
+
+
+
+
+
+
+
+
+
+/**
+ * Returns an appropriate canvas to render the Image. If the canvas available in the cache is appropriate
+ * it is returned, otherwise adjustments are made. It also sets the color transfer functions.
+ *
+ * @param {Object} enabledElement The cornerstone enabled element
+ * @param {Object} image The image to be rendered
+ * @param {Boolean} invalidated Is pixel data valid
+ * @param {Boolean} [useAlphaChannel = true] Will an alpha channel be used
+ * @returns {HTMLCanvasElement} An appropriate canvas for rendering the image
+ * @memberof rendering
+ */
+
+function getRenderCanvas(enabledElement, image, invalidated) {
+ var useAlphaChannel = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : true;
+ var canvasWasColor = enabledElement.renderingTools.lastRenderedIsColor === true;
+
+ if (!enabledElement.renderingTools.renderCanvas || canvasWasColor) {
+ enabledElement.renderingTools.renderCanvas = document.createElement('canvas');
+ Object(_initializeRenderCanvas_js__WEBPACK_IMPORTED_MODULE_7__["default"])(enabledElement, image);
+ }
+
+ var renderCanvas = enabledElement.renderingTools.renderCanvas;
+
+ if (Object(_doesImageNeedToBeRendered_js__WEBPACK_IMPORTED_MODULE_6__["default"])(enabledElement, image) === false && invalidated !== true) {
+ return renderCanvas;
+ } // If our render canvas does not match the size of this image reset it
+ // NOTE: This might be inefficient if we are updating multiple images of different
+ // Sizes frequently.
+
+
+ if (renderCanvas.width !== image.width || renderCanvas.height !== image.height) {
+ Object(_initializeRenderCanvas_js__WEBPACK_IMPORTED_MODULE_7__["default"])(enabledElement, image);
+ } // Get the lut to use
+
+
+ var start = Object(_internal_now_js__WEBPACK_IMPORTED_MODULE_3__["default"])();
+ var lut = Object(_getLut_js__WEBPACK_IMPORTED_MODULE_5__["default"])(image, enabledElement.viewport, invalidated);
+ image.stats = image.stats || {};
+ image.stats.lastLutGenerateTime = Object(_internal_now_js__WEBPACK_IMPORTED_MODULE_3__["default"])() - start;
+ var renderCanvasData = enabledElement.renderingTools.renderCanvasData;
+ var renderCanvasContext = enabledElement.renderingTools.renderCanvasContext; // Gray scale image - apply the lut and put the resulting image onto the render canvas
+
+ if (useAlphaChannel) {
+ Object(_internal_storedPixelDataToCanvasImageData_js__WEBPACK_IMPORTED_MODULE_0__["default"])(image, lut, renderCanvasData.data);
+ } else {
+ Object(_internal_storedPixelDataToCanvasImageDataRGBA_js__WEBPACK_IMPORTED_MODULE_1__["default"])(image, lut, renderCanvasData.data);
+ }
+
+ start = Object(_internal_now_js__WEBPACK_IMPORTED_MODULE_3__["default"])();
+ renderCanvasContext.putImageData(renderCanvasData, 0, 0);
+ image.stats.lastPutImageDataTime = Object(_internal_now_js__WEBPACK_IMPORTED_MODULE_3__["default"])() - start;
+ return renderCanvas;
+}
+/**
+ * API function to draw a grayscale image to a given enabledElement
+ *
+ * @param {EnabledElement} enabledElement The Cornerstone Enabled Element to redraw
+ * @param {Boolean} invalidated - true if pixel data has been invalidated and cached rendering should not be used
+ * @returns {void}
+ * @memberof rendering
+ */
+
+
+function renderGrayscaleImage(enabledElement, invalidated) {
+ if (enabledElement === undefined) {
+ throw new Error('drawImage: enabledElement parameter must not be undefined');
+ }
+
+ var image = enabledElement.image;
+
+ if (image === undefined) {
+ throw new Error('drawImage: image must be loaded before it can be drawn');
+ } // Get the canvas context and reset the transform
+
+
+ var context = enabledElement.canvas.getContext('2d');
+ context.setTransform(1, 0, 0, 1, 0, 0); // Clear the canvas
+
+ context.fillStyle = 'black';
+ context.fillRect(0, 0, enabledElement.canvas.width, enabledElement.canvas.height); // Turn off image smooth/interpolation if pixelReplication is set in the viewport
+
+ context.imageSmoothingEnabled = !enabledElement.viewport.pixelReplication;
+ context.mozImageSmoothingEnabled = context.imageSmoothingEnabled; // Save the canvas context state and apply the viewport properties
+
+ Object(_setToPixelCoordinateSystem_js__WEBPACK_IMPORTED_MODULE_2__["default"])(enabledElement, context);
+ var renderCanvas;
+
+ if (enabledElement.options && enabledElement.options.renderer && enabledElement.options.renderer.toLowerCase() === 'webgl') {
+ // If this enabled element has the option set for WebGL, we should
+ // User it as our renderer.
+ renderCanvas = _webgl_index_js__WEBPACK_IMPORTED_MODULE_4__["default"].renderer.render(enabledElement);
+ } else {
+ // If no options are set we will retrieve the renderCanvas through the
+ // Normal Canvas rendering path
+ renderCanvas = getRenderCanvas(enabledElement, image, invalidated);
+ }
+
+ var sx = enabledElement.viewport.displayedArea.tlhc.x - 1;
+ var sy = enabledElement.viewport.displayedArea.tlhc.y - 1;
+ var width = enabledElement.viewport.displayedArea.brhc.x - sx;
+ var height = enabledElement.viewport.displayedArea.brhc.y - sy;
+ context.drawImage(renderCanvas, sx, sy, width, height, 0, 0, width, height);
+ enabledElement.renderingTools = Object(_saveLastRendered_js__WEBPACK_IMPORTED_MODULE_8__["default"])(enabledElement);
+}
+/**
+ * API function to draw a grayscale image to a given layer
+ *
+ * @param {EnabledElementLayer} layer The layer that the image will be added to
+ * @param {Boolean} invalidated - true if pixel data has been invalidated and cached rendering should not be used
+ * @param {Boolean} [useAlphaChannel] - Whether or not to render the grayscale image using only the alpha channel.
+ This does not work if this layer is not the first layer in the enabledElement.
+ * @returns {void}
+ */
+
+function addGrayscaleLayer(layer, invalidated) {
+ var useAlphaChannel = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : false;
+
+ if (layer === undefined) {
+ throw new Error('addGrayscaleLayer: layer parameter must not be undefined');
+ }
+
+ var image = layer.image;
+
+ if (image === undefined) {
+ throw new Error('addGrayscaleLayer: image must be loaded before it can be drawn');
+ }
+
+ layer.canvas = getRenderCanvas(layer, image, invalidated, useAlphaChannel);
+ var context = layer.canvas.getContext('2d'); // Turn off image smooth/interpolation if pixelReplication is set in the viewport
+
+ context.imageSmoothingEnabled = !layer.viewport.pixelReplication;
+ context.mozImageSmoothingEnabled = context.imageSmoothingEnabled;
+ layer.renderingTools = Object(_saveLastRendered_js__WEBPACK_IMPORTED_MODULE_8__["default"])(layer);
+}
+
+/***/ }),
+
+/***/ "./rendering/renderLabelMapImage.js":
+/*!******************************************!*\
+ !*** ./rendering/renderLabelMapImage.js ***!
+ \******************************************/
+/*! exports provided: renderLabelMapImage, addLabelMapLayer */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+__webpack_require__.r(__webpack_exports__);
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "renderLabelMapImage", function() { return renderLabelMapImage; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "addLabelMapLayer", function() { return addLabelMapLayer; });
+/* harmony import */ var _setToPixelCoordinateSystem_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../setToPixelCoordinateSystem.js */ "./setToPixelCoordinateSystem.js");
+/* harmony import */ var _internal_now_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../internal/now.js */ "./internal/now.js");
+/* harmony import */ var _initializeRenderCanvas_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./initializeRenderCanvas.js */ "./rendering/initializeRenderCanvas.js");
+/* harmony import */ var _saveLastRendered_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./saveLastRendered.js */ "./rendering/saveLastRendered.js");
+/* harmony import */ var _doesImageNeedToBeRendered_js__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./doesImageNeedToBeRendered.js */ "./rendering/doesImageNeedToBeRendered.js");
+/* harmony import */ var _internal_storedPixelDataToCanvasImageDataColorLUT_js__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../internal/storedPixelDataToCanvasImageDataColorLUT.js */ "./internal/storedPixelDataToCanvasImageDataColorLUT.js");
+/* harmony import */ var _colors_index_js__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ../colors/index.js */ "./colors/index.js");
+
+
+
+
+
+
+
+/**
+ * Returns an appropriate canvas to render the Image. If the canvas available in the cache is appropriate
+ * it is returned, otherwise adjustments are made. It also sets the color transfer functions.
+ *
+ * @param {Object} enabledElement The cornerstone enabled element
+ * @param {Object} image The image to be rendered
+ * @param {Boolean} invalidated Is pixel data valid
+ * @returns {HTMLCanvasElement} An appropriate canvas for rendering the image
+ * @memberof rendering
+ */
+
+function getRenderCanvas(enabledElement, image, invalidated) {
+ if (!enabledElement.renderingTools.renderCanvas) {
+ enabledElement.renderingTools.renderCanvas = document.createElement('canvas');
+ }
+
+ var renderCanvas = enabledElement.renderingTools.renderCanvas;
+ var colormap = enabledElement.viewport.colormap || enabledElement.options.colormap;
+
+ if (enabledElement.options.colormap) {
+ console.warn('enabledElement.options.colormap is deprecated. Use enabledElement.viewport.colormap instead');
+ }
+
+ if (colormap && typeof colormap === 'string') {
+ colormap = _colors_index_js__WEBPACK_IMPORTED_MODULE_6__["default"].getColormap(colormap);
+ }
+
+ if (!colormap) {
+ throw new Error('renderLabelMapImage: colormap not found.');
+ }
+
+ var colormapId = colormap.getId();
+
+ if (Object(_doesImageNeedToBeRendered_js__WEBPACK_IMPORTED_MODULE_4__["default"])(enabledElement, image) === false && invalidated !== true && enabledElement.renderingTools.colormapId === colormapId) {
+ return renderCanvas;
+ } // If our render canvas does not match the size of this image reset it
+ // NOTE: This might be inefficient if we are updating multiple images of different
+ // Sizes frequently.
+
+
+ if (renderCanvas.width !== image.width || renderCanvas.height !== image.height) {
+ Object(_initializeRenderCanvas_js__WEBPACK_IMPORTED_MODULE_2__["default"])(enabledElement, image);
+ } // Get the lut to use
+
+
+ var start = Object(_internal_now_js__WEBPACK_IMPORTED_MODULE_1__["default"])();
+
+ if (!enabledElement.renderingTools.colorLut || invalidated || enabledElement.renderingTools.colormapId !== colormapId) {
+ enabledElement.renderingTools.colorLut = colormap.createLookupTable();
+ enabledElement.renderingTools.colormapId = colormapId;
+ }
+
+ image.stats = image.stats || {};
+ image.stats.lastLutGenerateTime = Object(_internal_now_js__WEBPACK_IMPORTED_MODULE_1__["default"])() - start;
+ var colorLut = enabledElement.renderingTools.colorLut;
+ var renderCanvasData = enabledElement.renderingTools.renderCanvasData;
+ var renderCanvasContext = enabledElement.renderingTools.renderCanvasContext;
+ Object(_internal_storedPixelDataToCanvasImageDataColorLUT_js__WEBPACK_IMPORTED_MODULE_5__["default"])(image, colorLut, renderCanvasData.data);
+ start = Object(_internal_now_js__WEBPACK_IMPORTED_MODULE_1__["default"])();
+ renderCanvasContext.putImageData(renderCanvasData, 0, 0);
+ image.stats.lastPutImageDataTime = Object(_internal_now_js__WEBPACK_IMPORTED_MODULE_1__["default"])() - start;
+ return renderCanvas;
+}
+/**
+ * API function to draw a label map image to a given enabledElement
+ *
+ * @param {EnabledElement} enabledElement The Cornerstone Enabled Element to redraw
+ * @param {Boolean} invalidated - true if pixel data has been invalidated and cached rendering should not be used
+ * @returns {void}
+ * @memberof rendering
+ */
+
+
+function renderLabelMapImage(enabledElement, invalidated) {
+ if (enabledElement === undefined) {
+ throw new Error('renderLabelMapImage: enabledElement parameter must not be undefined');
+ }
+
+ var image = enabledElement.image;
+
+ if (image === undefined) {
+ throw new Error('renderLabelMapImage: image must be loaded before it can be drawn');
+ } // Get the canvas context and reset the transform
+
+
+ var context = enabledElement.canvas.getContext('2d');
+ context.setTransform(1, 0, 0, 1, 0, 0); // Clear the canvas
+
+ context.fillStyle = 'black';
+ context.fillRect(0, 0, enabledElement.canvas.width, enabledElement.canvas.height); // Turn off image smooth/interpolation if pixelReplication is set in the viewport
+
+ context.imageSmoothingEnabled = !enabledElement.viewport.pixelReplication;
+ context.mozImageSmoothingEnabled = context.imageSmoothingEnabled; // Save the canvas context state and apply the viewport properties
+
+ Object(_setToPixelCoordinateSystem_js__WEBPACK_IMPORTED_MODULE_0__["default"])(enabledElement, context); // If no options are set we will retrieve the renderCanvas through the
+ // Normal Canvas rendering path
+ // TODO: Add WebGL support for label map pipeline
+
+ var renderCanvas = getRenderCanvas(enabledElement, image, invalidated);
+ var sx = enabledElement.viewport.displayedArea.tlhc.x - 1;
+ var sy = enabledElement.viewport.displayedArea.tlhc.y - 1;
+ var width = enabledElement.viewport.displayedArea.brhc.x - sx;
+ var height = enabledElement.viewport.displayedArea.brhc.y - sy;
+ context.drawImage(renderCanvas, sx, sy, width, height, 0, 0, width, height);
+ enabledElement.renderingTools = Object(_saveLastRendered_js__WEBPACK_IMPORTED_MODULE_3__["default"])(enabledElement);
+}
+/**
+ * API function to draw a pseudo-color image to a given layer
+ *
+ * @param {EnabledElementLayer} layer The layer that the image will be added to
+ * @param {Boolean} invalidated - true if pixel data has been invalidated and cached rendering should not be used
+ * @returns {void}
+ */
+
+function addLabelMapLayer(layer, invalidated) {
+ if (layer === undefined) {
+ throw new Error('addLabelMapLayer: layer parameter must not be undefined');
+ }
+
+ var image = layer.image;
+
+ if (image === undefined) {
+ throw new Error('addLabelMapLayer: image must be loaded before it can be drawn');
+ }
+
+ layer.canvas = getRenderCanvas(layer, image, invalidated);
+ var context = layer.canvas.getContext('2d'); // Turn off image smooth/interpolation if pixelReplication is set in the viewport
+
+ context.imageSmoothingEnabled = !layer.viewport.pixelReplication;
+ context.mozImageSmoothingEnabled = context.imageSmoothingEnabled;
+ layer.renderingTools = Object(_saveLastRendered_js__WEBPACK_IMPORTED_MODULE_3__["default"])(layer);
+}
+
+/***/ }),
+
+/***/ "./rendering/renderPseudoColorImage.js":
+/*!*********************************************!*\
+ !*** ./rendering/renderPseudoColorImage.js ***!
+ \*********************************************/
+/*! exports provided: renderPseudoColorImage, addPseudoColorLayer */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+__webpack_require__.r(__webpack_exports__);
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "renderPseudoColorImage", function() { return renderPseudoColorImage; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "addPseudoColorLayer", function() { return addPseudoColorLayer; });
+/* harmony import */ var _setToPixelCoordinateSystem_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../setToPixelCoordinateSystem.js */ "./setToPixelCoordinateSystem.js");
+/* harmony import */ var _internal_now_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../internal/now.js */ "./internal/now.js");
+/* harmony import */ var _initializeRenderCanvas_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./initializeRenderCanvas.js */ "./rendering/initializeRenderCanvas.js");
+/* harmony import */ var _getLut_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./getLut.js */ "./rendering/getLut.js");
+/* harmony import */ var _saveLastRendered_js__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./saveLastRendered.js */ "./rendering/saveLastRendered.js");
+/* harmony import */ var _doesImageNeedToBeRendered_js__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ./doesImageNeedToBeRendered.js */ "./rendering/doesImageNeedToBeRendered.js");
+/* harmony import */ var _internal_storedPixelDataToCanvasImageDataPseudocolorLUT_js__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ../internal/storedPixelDataToCanvasImageDataPseudocolorLUT.js */ "./internal/storedPixelDataToCanvasImageDataPseudocolorLUT.js");
+/* harmony import */ var _colors_index_js__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ../colors/index.js */ "./colors/index.js");
+
+
+
+
+
+
+
+
+/**
+ * Returns an appropriate canvas to render the Image. If the canvas available in the cache is appropriate
+ * it is returned, otherwise adjustments are made. It also sets the color transfer functions.
+ *
+ * @param {Object} enabledElement The cornerstone enabled element
+ * @param {Object} image The image to be rendered
+ * @param {Boolean} invalidated Is pixel data valid
+ * @returns {HTMLCanvasElement} An appropriate canvas for rendering the image
+ * @memberof rendering
+ */
+
+function getRenderCanvas(enabledElement, image, invalidated) {
+ if (!enabledElement.renderingTools.renderCanvas) {
+ enabledElement.renderingTools.renderCanvas = document.createElement('canvas');
+ }
+
+ var renderCanvas = enabledElement.renderingTools.renderCanvas;
+ var colormap = enabledElement.viewport.colormap || enabledElement.options.colormap;
+
+ if (enabledElement.options.colormap) {
+ console.warn('enabledElement.options.colormap is deprecated. Use enabledElement.viewport.colormap instead');
+ }
+
+ if (colormap && typeof colormap === 'string') {
+ colormap = _colors_index_js__WEBPACK_IMPORTED_MODULE_7__["default"].getColormap(colormap);
+ }
+
+ if (!colormap) {
+ throw new Error('renderPseudoColorImage: colormap not found.');
+ }
+
+ var colormapId = colormap.getId();
+
+ if (Object(_doesImageNeedToBeRendered_js__WEBPACK_IMPORTED_MODULE_5__["default"])(enabledElement, image) === false && invalidated !== true && enabledElement.renderingTools.colormapId === colormapId) {
+ return renderCanvas;
+ } // If our render canvas does not match the size of this image reset it
+ // NOTE: This might be inefficient if we are updating multiple images of different
+ // Sizes frequently.
+
+
+ if (renderCanvas.width !== image.width || renderCanvas.height !== image.height) {
+ Object(_initializeRenderCanvas_js__WEBPACK_IMPORTED_MODULE_2__["default"])(enabledElement, image);
+ } // Get the lut to use
+
+
+ var start = Object(_internal_now_js__WEBPACK_IMPORTED_MODULE_1__["default"])();
+
+ if (!enabledElement.renderingTools.colorLut || invalidated || enabledElement.renderingTools.colormapId !== colormapId) {
+ colormap.setNumberOfColors(256);
+ enabledElement.renderingTools.colorLut = colormap.createLookupTable();
+ enabledElement.renderingTools.colormapId = colormapId;
+ }
+
+ var lut = Object(_getLut_js__WEBPACK_IMPORTED_MODULE_3__["default"])(image, enabledElement.viewport, invalidated);
+ image.stats = image.stats || {};
+ image.stats.lastLutGenerateTime = Object(_internal_now_js__WEBPACK_IMPORTED_MODULE_1__["default"])() - start;
+ var colorLut = enabledElement.renderingTools.colorLut;
+ var renderCanvasData = enabledElement.renderingTools.renderCanvasData;
+ var renderCanvasContext = enabledElement.renderingTools.renderCanvasContext;
+ Object(_internal_storedPixelDataToCanvasImageDataPseudocolorLUT_js__WEBPACK_IMPORTED_MODULE_6__["default"])(image, lut, colorLut, renderCanvasData.data);
+ start = Object(_internal_now_js__WEBPACK_IMPORTED_MODULE_1__["default"])();
+ renderCanvasContext.putImageData(renderCanvasData, 0, 0);
+ image.stats.lastPutImageDataTime = Object(_internal_now_js__WEBPACK_IMPORTED_MODULE_1__["default"])() - start;
+ return renderCanvas;
+}
+/**
+ * API function to draw a pseudo-color image to a given enabledElement
+ *
+ * @param {EnabledElement} enabledElement The Cornerstone Enabled Element to redraw
+ * @param {Boolean} invalidated - true if pixel data has been invalidated and cached rendering should not be used
+ * @returns {void}
+ * @memberof rendering
+ */
+
+
+function renderPseudoColorImage(enabledElement, invalidated) {
+ if (enabledElement === undefined) {
+ throw new Error('drawImage: enabledElement parameter must not be undefined');
+ }
+
+ var image = enabledElement.image;
+
+ if (image === undefined) {
+ throw new Error('drawImage: image must be loaded before it can be drawn');
+ } // Get the canvas context and reset the transform
+
+
+ var context = enabledElement.canvas.getContext('2d');
+ context.setTransform(1, 0, 0, 1, 0, 0); // Clear the canvas
+
+ context.fillStyle = 'black';
+ context.fillRect(0, 0, enabledElement.canvas.width, enabledElement.canvas.height); // Turn off image smooth/interpolation if pixelReplication is set in the viewport
+
+ context.imageSmoothingEnabled = !enabledElement.viewport.pixelReplication;
+ context.mozImageSmoothingEnabled = context.imageSmoothingEnabled; // Save the canvas context state and apply the viewport properties
+
+ Object(_setToPixelCoordinateSystem_js__WEBPACK_IMPORTED_MODULE_0__["default"])(enabledElement, context); // If no options are set we will retrieve the renderCanvas through the
+ // Normal Canvas rendering path
+ // TODO: Add WebGL support for pseudocolor pipeline
+
+ var renderCanvas = getRenderCanvas(enabledElement, image, invalidated);
+ var sx = enabledElement.viewport.displayedArea.tlhc.x - 1;
+ var sy = enabledElement.viewport.displayedArea.tlhc.y - 1;
+ var width = enabledElement.viewport.displayedArea.brhc.x - sx;
+ var height = enabledElement.viewport.displayedArea.brhc.y - sy;
+ context.drawImage(renderCanvas, sx, sy, width, height, 0, 0, width, height);
+ enabledElement.renderingTools = Object(_saveLastRendered_js__WEBPACK_IMPORTED_MODULE_4__["default"])(enabledElement);
+}
+/**
+ * API function to draw a pseudo-color image to a given layer
+ *
+ * @param {EnabledElementLayer} layer The layer that the image will be added to
+ * @param {Boolean} invalidated - true if pixel data has been invalidated and cached rendering should not be used
+ * @returns {void}
+ */
+
+function addPseudoColorLayer(layer, invalidated) {
+ if (layer === undefined) {
+ throw new Error('addPseudoColorLayer: layer parameter must not be undefined');
+ }
+
+ var image = layer.image;
+
+ if (image === undefined) {
+ throw new Error('addPseudoColorLayer: image must be loaded before it can be drawn');
+ }
+
+ layer.canvas = getRenderCanvas(layer, image, invalidated);
+ var context = layer.canvas.getContext('2d'); // Turn off image smooth/interpolation if pixelReplication is set in the viewport
+
+ context.imageSmoothingEnabled = !layer.viewport.pixelReplication;
+ context.mozImageSmoothingEnabled = context.imageSmoothingEnabled;
+ layer.renderingTools = Object(_saveLastRendered_js__WEBPACK_IMPORTED_MODULE_4__["default"])(layer);
+}
+
+/***/ }),
+
+/***/ "./rendering/renderToCanvas.js":
+/*!*************************************!*\
+ !*** ./rendering/renderToCanvas.js ***!
+ \*************************************/
+/*! exports provided: default */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+__webpack_require__.r(__webpack_exports__);
+/* harmony import */ var _triggerEvent_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../triggerEvent.js */ "./triggerEvent.js");
+/* harmony import */ var _events_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../events.js */ "./events.js");
+/* harmony import */ var _internal_drawImageSync_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../internal/drawImageSync.js */ "./internal/drawImageSync.js");
+/* harmony import */ var _internal_getDefaultViewport_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../internal/getDefaultViewport.js */ "./internal/getDefaultViewport.js");
+/* harmony import */ var _internal_tryEnableWebgl_js__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../internal/tryEnableWebgl.js */ "./internal/tryEnableWebgl.js");
+
+
+
+
+
+/**
+ * @typedef {Object} EnabledElementStub
+ * @property {HTMLElement} element The enabled element
+ * @property {HTMLCanvasElement} canvas The current canvas
+ * @property {Object} image Currently displayed image
+ * @property {Boolean} invalid Whether or not the image pixel data has been changed
+ * @property {Boolean} needsRedraw A flag for triggering a redraw of the canvas without re-retrieving the pixel data, since it remains valid
+ * @property {Object} options Layer drawing options
+ * @property {Object[]} layers Layers added to the EnabledElement
+ * @property {Object} data
+ * @property {Object} renderingTools
+ * @property {Object} viewport The current viewport
+ * @memberof rendering
+ */
+
+/**
+ * creates a dummy enabled element
+ *
+ * @param {HTMLCanvasElement} canvas the canvas that will be assigned to the enabled element.
+ * @param {any} image An Image loaded by a Cornerstone Image Loader
+ * @param { any } options Options for rendering the image (e.g.enable webgl by {renderer: 'webgl' })
+ * @param { any } viewport A set of Cornerstone viewport parameters
+ * @returns {EnabledElementStub} a dummy enabled element
+ * @memberof rendering
+ */
+
+function createEnabledElementStub(canvas, image, options, viewport) {
+ return {
+ element: canvas,
+ canvas: canvas,
+ image: image,
+ invalid: true,
+ // True if image needs to be drawn, false if not
+ needsRedraw: true,
+ options: options,
+ layers: [],
+ data: {},
+ renderingTools: {},
+ viewport: viewport
+ };
+}
+/**
+ * Render the image to the provided canvas immediately.
+ * @param {any} canvas The HTML canvas where the image will be rendered.
+ * @param {any} image An Image loaded by a Cornerstone Image Loader
+ * @param {any} [viewport = null] A set of Cornerstone viewport parameters
+ * @param {any} [options = null] Options for rendering the image (e.g. enable webgl by {renderer: 'webgl'})
+ * @returns {void}
+ * @memberof rendering
+ */
+
+
+/* harmony default export */ __webpack_exports__["default"] = (function (canvas, image) {
+ var viewport = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : null;
+ var options = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : null;
+
+ if (canvas === undefined) {
+ throw new Error('renderToCanvas: parameter canvas cannot be undefined');
+ } // If this enabled element has the option set for WebGL, we should
+ // Check if this device actually supports it
+
+
+ if (options && options.renderer && options.renderer.toLowerCase() === 'webgl') {
+ Object(_internal_tryEnableWebgl_js__WEBPACK_IMPORTED_MODULE_4__["default"])(options);
+ }
+
+ var defaultViewport = Object(_internal_getDefaultViewport_js__WEBPACK_IMPORTED_MODULE_3__["default"])(canvas, image);
+
+ if (viewport) {
+ Object.assign(defaultViewport, viewport);
+ }
+
+ var enabledElementStub = createEnabledElementStub(canvas, image, options, defaultViewport);
+ var eventDetails = {
+ enabledElement: enabledElementStub,
+ timestamp: Date.now()
+ };
+ Object(_triggerEvent_js__WEBPACK_IMPORTED_MODULE_0__["default"])(enabledElementStub.element, _events_js__WEBPACK_IMPORTED_MODULE_1__["default"].PRE_RENDER, eventDetails);
+ Object(_internal_drawImageSync_js__WEBPACK_IMPORTED_MODULE_2__["default"])(enabledElementStub, enabledElementStub.invalid);
+});
+
+/***/ }),
+
+/***/ "./rendering/renderWebImage.js":
+/*!*************************************!*\
+ !*** ./rendering/renderWebImage.js ***!
+ \*************************************/
+/*! exports provided: renderWebImage */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+__webpack_require__.r(__webpack_exports__);
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "renderWebImage", function() { return renderWebImage; });
+/* harmony import */ var _setToPixelCoordinateSystem_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../setToPixelCoordinateSystem.js */ "./setToPixelCoordinateSystem.js");
+/* harmony import */ var _renderColorImage_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./renderColorImage.js */ "./rendering/renderColorImage.js");
+
+
+/**
+ * API function to draw a standard web image (PNG, JPG) to an enabledImage
+ *
+ * @param {EnabledElement} enabledElement The Cornerstone Enabled Element to redraw
+ * @param {Boolean} invalidated - true if pixel data has been invalidated and cached rendering should not be used
+ * @returns {void}
+ * @memberof rendering
+ */
+
+function renderWebImage(enabledElement, invalidated) {
+ if (enabledElement === undefined) {
+ throw new Error('renderWebImage: enabledElement parameter must not be undefined');
+ }
+
+ var image = enabledElement.image;
+
+ if (image === undefined) {
+ throw new Error('renderWebImage: image must be loaded before it can be drawn');
+ } // If the viewport ww/wc and invert all match the initial state of the image, we can draw the image
+ // Directly. If any of those are changed, we call renderColorImage() to apply the lut
+
+
+ if (enabledElement.viewport.voi.windowWidth === enabledElement.image.windowWidth && enabledElement.viewport.voi.windowCenter === enabledElement.image.windowCenter && enabledElement.viewport.invert === false) {
+ // Get the canvas context and reset the transform
+ var context = enabledElement.canvas.getContext('2d');
+ context.setTransform(1, 0, 0, 1, 0, 0); // Clear the canvas
+
+ context.fillStyle = 'black';
+ context.fillRect(0, 0, enabledElement.canvas.width, enabledElement.canvas.height); // Turn off image smooth/interpolation if pixelReplication is set in the viewport
+
+ context.imageSmoothingEnabled = !enabledElement.viewport.pixelReplication;
+ context.mozImageSmoothingEnabled = context.imageSmoothingEnabled; // Save the canvas context state and apply the viewport properties
+
+ Object(_setToPixelCoordinateSystem_js__WEBPACK_IMPORTED_MODULE_0__["default"])(enabledElement, context);
+ var sx = enabledElement.viewport.displayedArea.tlhc.x - 1;
+ var sy = enabledElement.viewport.displayedArea.tlhc.y - 1;
+ var width = enabledElement.viewport.displayedArea.brhc.x - sx;
+ var height = enabledElement.viewport.displayedArea.brhc.y - sy;
+ context.drawImage(image.getImage(), sx, sy, width, height, 0, 0, width, height);
+ } else {
+ Object(_renderColorImage_js__WEBPACK_IMPORTED_MODULE_1__["renderColorImage"])(enabledElement, invalidated);
+ }
+}
+
+/***/ }),
+
+/***/ "./rendering/saveLastRendered.js":
+/*!***************************************!*\
+ !*** ./rendering/saveLastRendered.js ***!
+ \***************************************/
+/*! exports provided: default */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+__webpack_require__.r(__webpack_exports__);
+/**
+ * Saves the parameters of the last render into renderingTools, used later to decide if data can be reused.
+ *
+ * @param {Object} enabledElement Cornerstone EnabledElement
+ * @returns {Object} enabledElement.renderingTools
+ * @memberof rendering
+ */
+/* harmony default export */ __webpack_exports__["default"] = (function (enabledElement) {
+ var imageId = enabledElement.image.imageId;
+ var viewport = enabledElement.viewport;
+ var isColor = enabledElement.image.color;
+ enabledElement.renderingTools.lastRenderedImageId = imageId;
+ enabledElement.renderingTools.lastRenderedIsColor = isColor;
+ enabledElement.renderingTools.lastRenderedViewport = {
+ windowCenter: viewport.voi.windowCenter,
+ windowWidth: viewport.voi.windowWidth,
+ invert: viewport.invert,
+ rotation: viewport.rotation,
+ hflip: viewport.hflip,
+ vflip: viewport.vflip,
+ modalityLUT: viewport.modalityLUT,
+ voiLUT: viewport.voiLUT,
+ colormap: viewport.colormap
+ };
+ return enabledElement.renderingTools;
+});
+
+/***/ }),
+
+/***/ "./reset.js":
+/*!******************!*\
+ !*** ./reset.js ***!
+ \******************/
+/*! exports provided: default */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+__webpack_require__.r(__webpack_exports__);
+/* harmony import */ var _enabledElements_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./enabledElements.js */ "./enabledElements.js");
+/* harmony import */ var _internal_getDefaultViewport_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./internal/getDefaultViewport.js */ "./internal/getDefaultViewport.js");
+/* harmony import */ var _updateImage_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./updateImage.js */ "./updateImage.js");
+
+
+
+/**
+ * Resets the viewport to the default settings
+ *
+ * @param {HTMLElement} element An HTML Element enabled for Cornerstone
+ * @returns {void}
+ */
+
+/* harmony default export */ __webpack_exports__["default"] = (function (element) {
+ var enabledElement = Object(_enabledElements_js__WEBPACK_IMPORTED_MODULE_0__["getEnabledElement"])(element);
+ enabledElement.viewport = Object(_internal_getDefaultViewport_js__WEBPACK_IMPORTED_MODULE_1__["default"])(enabledElement.canvas, enabledElement.image);
+ Object(_updateImage_js__WEBPACK_IMPORTED_MODULE_2__["default"])(element);
+});
+
+/***/ }),
+
+/***/ "./resize.js":
+/*!*******************!*\
+ !*** ./resize.js ***!
+ \*******************/
+/*! exports provided: default */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+__webpack_require__.r(__webpack_exports__);
+/* harmony import */ var _enabledElements_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./enabledElements.js */ "./enabledElements.js");
+/* harmony import */ var _fitToWindow_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./fitToWindow.js */ "./fitToWindow.js");
+/* harmony import */ var _updateImage_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./updateImage.js */ "./updateImage.js");
+/* harmony import */ var _triggerEvent_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./triggerEvent.js */ "./triggerEvent.js");
+/* harmony import */ var _internal_getImageSize_js__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./internal/getImageSize.js */ "./internal/getImageSize.js");
+/* harmony import */ var _events_js__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ./events.js */ "./events.js");
+
+
+
+
+
+
+/**
+ * This module is responsible for enabling an element to display images with cornerstone
+ *
+ * @param {HTMLElement} element The DOM element enabled for Cornerstone
+ * @param {HTMLElement} canvas The Canvas DOM element within the DOM element enabled for Cornerstone
+ * @returns {void}
+ */
+
+function setCanvasSize(element, canvas) {
+ // The device pixel ratio is 1.0 for normal displays and > 1.0
+ // For high DPI displays like Retina
+
+ /*
+ This functionality is disabled due to buggy behavior on systems with mixed DPI's. If the canvas
+ is created on a display with high DPI (e.g. 2.0) and then the browser window is dragged to
+ a different display with a different DPI (e.g. 1.0), the canvas is not recreated so the pageToPixel
+ produces incorrect results. I couldn't find any way to determine when the DPI changed other than
+ by polling which is not very clean. If anyone has any ideas here, please let me know, but for now
+ we will disable this functionality. We may want
+ to add a mechanism to optionally enable this functionality if we can determine it is safe to do
+ so (e.g. iPad or iPhone or perhaps enumerate the displays on the system. I am choosing
+ to be cautious here since I would rather not have bug reports or safety issues related to this
+ scenario.
+ var devicePixelRatio = window.devicePixelRatio;
+ if(devicePixelRatio === undefined) {
+ devicePixelRatio = 1.0;
+ }
+ */
+ // Avoid setting the same value because it flashes the canvas with IE and Edge
+ if (canvas.width !== element.clientWidth) {
+ canvas.width = element.clientWidth;
+ canvas.style.width = "".concat(element.clientWidth, "px");
+ } // Avoid setting the same value because it flashes the canvas with IE and Edge
+
+
+ if (canvas.height !== element.clientHeight) {
+ canvas.height = element.clientHeight;
+ canvas.style.height = "".concat(element.clientHeight, "px");
+ }
+}
+/**
+ * Checks if the image of a given enabled element fitted the window
+ * before the resize
+ *
+ * @param {EnabledElement} enabledElement The Cornerstone Enabled Element
+ * @param {number} oldCanvasWidth The width of the canvas before the resize
+ * @param {number} oldCanvasHeight The height of the canvas before the resize
+ * @return {Boolean} true if it fitted the windows, false otherwise
+ */
+
+
+function wasFitToWindow(enabledElement, oldCanvasWidth, oldCanvasHeight) {
+ var scale = enabledElement.viewport.scale;
+ var imageSize = Object(_internal_getImageSize_js__WEBPACK_IMPORTED_MODULE_4__["default"])(enabledElement.image, enabledElement.viewport.rotation);
+ var imageWidth = Math.round(imageSize.width * scale);
+ var imageHeight = Math.round(imageSize.height * scale);
+ var x = enabledElement.viewport.translation.x;
+ var y = enabledElement.viewport.translation.y;
+ return imageWidth === oldCanvasWidth && imageHeight <= oldCanvasHeight || imageWidth <= oldCanvasWidth && imageHeight === oldCanvasHeight && x === 0 && y === 0;
+}
+/**
+ * Rescale the image relative to the changed size of the canvas
+ *
+ * @param {EnabledElement} enabledElement The Cornerstone Enabled Element
+ * @param {number} oldCanvasWidth The width of the canvas before the resize
+ * @param {number} oldCanvasHeight The height of the canvas before the resize
+ * @return {void}
+ */
+
+
+function relativeRescale(enabledElement, oldCanvasWidth, oldCanvasHeight) {
+ var scale = enabledElement.viewport.scale;
+ var canvasWidth = enabledElement.canvas.width;
+ var canvasHeight = enabledElement.canvas.height;
+ var relWidthChange = canvasWidth / oldCanvasWidth;
+ var relHeightChange = canvasHeight / oldCanvasHeight;
+ var relChange = Math.sqrt(relWidthChange * relHeightChange);
+ enabledElement.viewport.scale = relChange * scale;
+}
+/**
+ * Resizes an enabled element and optionally fits the image to window
+ *
+ * @param {HTMLElement} element The DOM element enabled for Cornerstone
+ * @param {Boolean} forceFitToWindow true to to force a refit, false to rescale accordingly
+ * @returns {void}
+ */
+
+
+/* harmony default export */ __webpack_exports__["default"] = (function (element, forceFitToWindow) {
+ var enabledElement = Object(_enabledElements_js__WEBPACK_IMPORTED_MODULE_0__["getEnabledElement"])(element);
+ var oldCanvasWidth = enabledElement.canvas.width;
+ var oldCanvasHeight = enabledElement.canvas.height;
+ setCanvasSize(element, enabledElement.canvas);
+ var eventData = {
+ element: element
+ };
+ Object(_triggerEvent_js__WEBPACK_IMPORTED_MODULE_3__["default"])(element, _events_js__WEBPACK_IMPORTED_MODULE_5__["default"].ELEMENT_RESIZED, eventData);
+
+ if (enabledElement.image === undefined) {
+ return;
+ }
+
+ if (forceFitToWindow || wasFitToWindow(enabledElement, oldCanvasWidth, oldCanvasHeight)) {
+ // Fit the image to the window again if it fitted before the resize
+ Object(_fitToWindow_js__WEBPACK_IMPORTED_MODULE_1__["default"])(element);
+ } else {
+ // Adapt the scale of a zoomed or panned image relative to the size change
+ relativeRescale(enabledElement, oldCanvasWidth, oldCanvasHeight);
+ Object(_updateImage_js__WEBPACK_IMPORTED_MODULE_2__["default"])(element);
+ }
+});
+
+/***/ }),
+
+/***/ "./setToPixelCoordinateSystem.js":
+/*!***************************************!*\
+ !*** ./setToPixelCoordinateSystem.js ***!
+ \***************************************/
+/*! exports provided: default */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+__webpack_require__.r(__webpack_exports__);
+/* harmony import */ var _internal_calculateTransform_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./internal/calculateTransform.js */ "./internal/calculateTransform.js");
+
+/**
+ * Sets the canvas context transformation matrix to the pixel coordinate system. This allows
+ * geometry to be driven using the canvas context using coordinates in the pixel coordinate system
+ * @param {EnabledElement} enabledElement The
+ * @param {CanvasRenderingContext2D} context The CanvasRenderingContext2D for the enabledElement's Canvas
+ * @param {Number} [scale] Optional scale to apply
+ * @returns {void}
+ */
+
+/* harmony default export */ __webpack_exports__["default"] = (function (enabledElement, context, scale) {
+ if (enabledElement === undefined) {
+ throw new Error('setToPixelCoordinateSystem: parameter enabledElement must not be undefined');
+ }
+
+ if (context === undefined) {
+ throw new Error('setToPixelCoordinateSystem: parameter context must not be undefined');
+ }
+
+ var transform = Object(_internal_calculateTransform_js__WEBPACK_IMPORTED_MODULE_0__["default"])(enabledElement, scale);
+ context.setTransform(transform.m[0], transform.m[1], transform.m[2], transform.m[3], transform.m[4], transform.m[5]);
+});
+
+/***/ }),
+
+/***/ "./setViewport.js":
+/*!************************!*\
+ !*** ./setViewport.js ***!
+ \************************/
+/*! exports provided: default */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+__webpack_require__.r(__webpack_exports__);
+/* harmony import */ var _internal_getDefaultViewport_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./internal/getDefaultViewport.js */ "./internal/getDefaultViewport.js");
+/* harmony import */ var _enabledElements_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./enabledElements.js */ "./enabledElements.js");
+/* harmony import */ var _updateImage_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./updateImage.js */ "./updateImage.js");
+
+
+
+var MIN_WINDOW_WIDTH = 0.000001;
+var MIN_VIEWPORT_SCALE = 0.0001;
+/**
+ * Sets/updates viewport of a given enabled element
+ *
+ * @param {HTMLElement} element - DOM element of the enabled element
+ * @param {Viewport} [viewport] - Object containing the viewport properties
+ * @returns {void}
+ * @memberof ViewportSettings
+ */
+
+/* harmony default export */ __webpack_exports__["default"] = (function (element, viewport) {
+ var enabledElement = Object(_enabledElements_js__WEBPACK_IMPORTED_MODULE_1__["getEnabledElement"])(element); // If viewport is not already set, start with default and merge new
+ // viewport options later
+
+ if (enabledElement.viewport === undefined) {
+ enabledElement.viewport = Object(_internal_getDefaultViewport_js__WEBPACK_IMPORTED_MODULE_0__["default"])(enabledElement.canvas);
+ } // Merge viewport
+
+
+ if (viewport) {
+ for (var attrname in viewport) {
+ if (viewport[attrname] !== null) {
+ enabledElement.viewport[attrname] = viewport[attrname];
+ }
+ }
+ } // Prevent window width from being too small (note that values close to zero are valid and can occur with
+ // PET images in particular)
+
+
+ if (enabledElement.viewport.voi.windowWidth) {
+ enabledElement.viewport.voi.windowWidth = Math.max(viewport.voi.windowWidth, MIN_WINDOW_WIDTH);
+ } // Prevent scale from getting too small
+
+
+ if (enabledElement.viewport.scale) {
+ enabledElement.viewport.scale = Math.max(viewport.scale, MIN_VIEWPORT_SCALE);
+ } // Normalize the rotation value to a positive rotation in degrees
+
+
+ enabledElement.viewport.rotation %= 360;
+
+ if (enabledElement.viewport.rotation < 0) {
+ enabledElement.viewport.rotation += 360;
+ }
+
+ if (enabledElement.image) {
+ // Force the image to be updated since the viewport has been modified
+ Object(_updateImage_js__WEBPACK_IMPORTED_MODULE_2__["default"])(element);
+ }
+});
+
+/***/ }),
+
+/***/ "./triggerEvent.js":
+/*!*************************!*\
+ !*** ./triggerEvent.js ***!
+ \*************************/
+/*! exports provided: default */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+__webpack_require__.r(__webpack_exports__);
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "default", function() { return triggerEvent; });
+/**
+ * Trigger a CustomEvent
+ *
+ * @param {EventTarget} el The element or EventTarget to trigger the event upon
+ * @param {String} type The event type name
+ * @param {Object|null} detail=null The event data to be sent
+ * @returns {Boolean} The return value is false if at least one event listener called preventDefault(). Otherwise it returns true.
+ */
+function triggerEvent(el, type) {
+ var detail = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : null;
+ var event; // This check is needed to polyfill CustomEvent on IE11-
+
+ if (typeof window.CustomEvent === 'function') {
+ event = new CustomEvent(type, {
+ detail: detail,
+ cancelable: true
+ });
+ } else {
+ event = document.createEvent('CustomEvent');
+ event.initCustomEvent(type, true, true, detail);
+ }
+
+ return el.dispatchEvent(event);
+}
+
+/***/ }),
+
+/***/ "./updateImage.js":
+/*!************************!*\
+ !*** ./updateImage.js ***!
+ \************************/
+/*! exports provided: default */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+__webpack_require__.r(__webpack_exports__);
+/* harmony import */ var _enabledElements_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./enabledElements.js */ "./enabledElements.js");
+/* harmony import */ var _internal_drawImage_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./internal/drawImage.js */ "./internal/drawImage.js");
+
+
+/**
+ * Forces the image to be updated/redrawn for the specified enabled element
+ * @param {HTMLElement} element An HTML Element enabled for Cornerstone
+ * @param {Boolean} [invalidated=false] Whether or not the image pixel data has been changed, necessitating a redraw
+ *
+ * @returns {void}
+ * @memberof Drawing
+ */
+
+/* harmony default export */ __webpack_exports__["default"] = (function (element) {
+ var invalidated = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : false;
+ var enabledElement = Object(_enabledElements_js__WEBPACK_IMPORTED_MODULE_0__["getEnabledElement"])(element);
+
+ if (enabledElement.image === undefined && !enabledElement.layers.length) {
+ throw new Error('updateImage: image has not been loaded yet');
+ }
+
+ Object(_internal_drawImage_js__WEBPACK_IMPORTED_MODULE_1__["default"])(enabledElement, invalidated);
+});
+
+/***/ }),
+
+/***/ "./webgl/createProgramFromString.js":
+/*!******************************************!*\
+ !*** ./webgl/createProgramFromString.js ***!
+ \******************************************/
+/*! exports provided: default */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+__webpack_require__.r(__webpack_exports__);
+/**
+ * Creates and compiles a shader.
+ *
+ * @param {!WebGLRenderingContext} gl The WebGL Context.
+ * @param {string} shaderSource The GLSL source code for the shader.
+ * @param {number} shaderType The type of shader, VERTEX_SHADER or FRAGMENT_SHADER.
+ *
+ * @return {!WebGLShader} The shader.
+ * @memberof WebGLRendering
+ */
+function compileShader(gl, shaderSource, shaderType) {
+ // Create the shader object
+ var shader = gl.createShader(shaderType); // Set the shader source code.
+
+ gl.shaderSource(shader, shaderSource); // Compile the shader
+
+ gl.compileShader(shader); // Check if it compiled
+
+ var success = gl.getShaderParameter(shader, gl.COMPILE_STATUS);
+
+ if (!success && !gl.isContextLost()) {
+ // Something went wrong during compilation; get the error
+ var infoLog = gl.getShaderInfoLog(shader);
+ console.error("Could not compile shader:\n".concat(infoLog));
+ }
+
+ return shader;
+}
+/**
+ * Creates a program from 2 shaders.
+ *
+ * @param {!WebGLRenderingContext} gl The WebGL context.
+ * @param {!WebGLShader} vertexShader A vertex shader.
+ * @param {!WebGLShader} fragmentShader A fragment shader.
+ * @return {!WebGLProgram} A program.
+ * @memberof WebGLRendering
+ */
+
+
+function createProgram(gl, vertexShader, fragmentShader) {
+ // Create a program.
+ var program = gl.createProgram(); // Attach the shaders.
+
+ gl.attachShader(program, vertexShader);
+ gl.attachShader(program, fragmentShader); // Link the program.
+
+ gl.linkProgram(program); // Check if it linked.
+
+ var success = gl.getProgramParameter(program, gl.LINK_STATUS);
+
+ if (!success && !gl.isContextLost()) {
+ // Something went wrong with the link
+ var infoLog = gl.getProgramInfoLog(program);
+ console.error("WebGL program filed to link:\n".concat(infoLog));
+ }
+
+ return program;
+}
+/**
+ * Creates a program from 2 shaders source (Strings)
+ * @param {!WebGLRenderingContext} gl The WebGL context.
+ * @param {!WebGLShader} vertexShaderSrc Vertex shader string
+ * @param {!WebGLShader} fragShaderSrc Fragment shader string
+ * @return {!WebGLProgram} A program
+ * @memberof WebGLRendering
+ */
+
+
+/* harmony default export */ __webpack_exports__["default"] = (function (gl, vertexShaderSrc, fragShaderSrc) {
+ var vertexShader = compileShader(gl, vertexShaderSrc, gl.VERTEX_SHADER);
+ var fragShader = compileShader(gl, fragShaderSrc, gl.FRAGMENT_SHADER);
+ return createProgram(gl, vertexShader, fragShader);
+});
+
+/***/ }),
+
+/***/ "./webgl/index.js":
+/*!************************!*\
+ !*** ./webgl/index.js ***!
+ \************************/
+/*! exports provided: default */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+__webpack_require__.r(__webpack_exports__);
+/* harmony import */ var _renderer_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./renderer.js */ "./webgl/renderer.js");
+/* harmony import */ var _createProgramFromString_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./createProgramFromString.js */ "./webgl/createProgramFromString.js");
+/* harmony import */ var _textureCache_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./textureCache.js */ "./webgl/textureCache.js");
+
+
+
+/**
+ * @module WebGLRendering
+ */
+
+var mod = {
+ createProgramFromString: _createProgramFromString_js__WEBPACK_IMPORTED_MODULE_1__["default"],
+ renderer: {
+ render: _renderer_js__WEBPACK_IMPORTED_MODULE_0__["render"],
+ initRenderer: _renderer_js__WEBPACK_IMPORTED_MODULE_0__["initRenderer"],
+ getRenderCanvas: _renderer_js__WEBPACK_IMPORTED_MODULE_0__["getRenderCanvas"],
+ isWebGLAvailable: _renderer_js__WEBPACK_IMPORTED_MODULE_0__["isWebGLAvailable"]
+ },
+ textureCache: _textureCache_js__WEBPACK_IMPORTED_MODULE_2__["default"]
+};
+Object.defineProperty(mod, 'isWebGLInitialized', {
+ enumerable: true,
+ configurable: false,
+ get: function get() {
+ return _renderer_js__WEBPACK_IMPORTED_MODULE_0__["isWebGLInitialized"];
+ }
+});
+/* harmony default export */ __webpack_exports__["default"] = (mod);
+
+/***/ }),
+
+/***/ "./webgl/renderer.js":
+/*!***************************!*\
+ !*** ./webgl/renderer.js ***!
+ \***************************/
+/*! exports provided: isWebGLInitialized, getRenderCanvas, initRenderer, render, isWebGLAvailable */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+__webpack_require__.r(__webpack_exports__);
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "isWebGLInitialized", function() { return isWebGLInitialized; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "getRenderCanvas", function() { return getRenderCanvas; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "initRenderer", function() { return initRenderer; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "render", function() { return render; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "isWebGLAvailable", function() { return isWebGLAvailable; });
+/* harmony import */ var _shaders_index_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./shaders/index.js */ "./webgl/shaders/index.js");
+/* harmony import */ var _vertexShader_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./vertexShader.js */ "./webgl/vertexShader.js");
+/* harmony import */ var _textureCache_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./textureCache.js */ "./webgl/textureCache.js");
+/* harmony import */ var _createProgramFromString_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./createProgramFromString.js */ "./webgl/createProgramFromString.js");
+/* eslint no-bitwise: 0 */
+
+
+
+
+var renderCanvas = document.createElement('canvas');
+var gl;
+var texCoordBuffer;
+var positionBuffer;
+var isWebGLInitialized = false;
+
+function getRenderCanvas() {
+ return renderCanvas;
+}
+
+function initShaders() {
+ for (var id in _shaders_index_js__WEBPACK_IMPORTED_MODULE_0__["shaders"]) {
+ // Console.log("WEBGL: Loading shader", id);
+ var shader = _shaders_index_js__WEBPACK_IMPORTED_MODULE_0__["shaders"][id];
+ shader.attributes = {};
+ shader.uniforms = {};
+ shader.vert = _vertexShader_js__WEBPACK_IMPORTED_MODULE_1__["vertexShader"];
+ shader.program = Object(_createProgramFromString_js__WEBPACK_IMPORTED_MODULE_3__["default"])(gl, shader.vert, shader.frag);
+ shader.attributes.texCoordLocation = gl.getAttribLocation(shader.program, 'a_texCoord');
+ gl.enableVertexAttribArray(shader.attributes.texCoordLocation);
+ shader.attributes.positionLocation = gl.getAttribLocation(shader.program, 'a_position');
+ gl.enableVertexAttribArray(shader.attributes.positionLocation);
+ shader.uniforms.resolutionLocation = gl.getUniformLocation(shader.program, 'u_resolution');
+ }
+}
+
+function initRenderer() {
+ if (isWebGLInitialized === true) {
+ // Console.log("WEBGL Renderer already initialized");
+ return;
+ }
+
+ if (initWebGL(renderCanvas)) {
+ initBuffers();
+ initShaders(); // Console.log("WEBGL Renderer initialized!");
+
+ isWebGLInitialized = true;
+ }
+}
+
+function updateRectangle(gl, width, height) {
+ gl.bufferData(gl.ARRAY_BUFFER, new Float32Array([width, height, 0, height, width, 0, 0, 0]), gl.STATIC_DRAW);
+}
+
+function handleLostContext(event) {
+ event.preventDefault();
+ console.warn('WebGL Context Lost!');
+}
+
+function handleRestoredContext(event) {
+ event.preventDefault();
+ isWebGLInitialized = false;
+ _textureCache_js__WEBPACK_IMPORTED_MODULE_2__["default"].purgeCache();
+ initRenderer(); // Console.log('WebGL Context Restored.');
+}
+
+function initWebGL(canvas) {
+ gl = null;
+
+ try {
+ // Try to grab the standard context. If it fails, fallback to experimental.
+ var options = {
+ preserveDrawingBuffer: true // Preserve buffer so we can copy to display canvas element
+
+ }; // ---------------- Testing purposes -------------
+ // If (debug === true && WebGLDebugUtils) {
+ // RenderCanvas = WebGLDebugUtils.makeLostContextSimulatingCanvas(renderCanvas);
+ // }
+ // ---------------- Testing purposes -------------
+
+ gl = canvas.getContext('webgl', options) || canvas.getContext('experimental-webgl', options); // Set up event listeners for context lost / context restored
+
+ canvas.removeEventListener('webglcontextlost', handleLostContext, false);
+ canvas.addEventListener('webglcontextlost', handleLostContext, false);
+ canvas.removeEventListener('webglcontextrestored', handleRestoredContext, false);
+ canvas.addEventListener('webglcontextrestored', handleRestoredContext, false);
+ } catch (error) {
+ throw new Error('Error creating WebGL context');
+ } // If we don't have a GL context, give up now
+
+
+ if (!gl) {
+ console.error('Unable to initialize WebGL. Your browser may not support it.');
+ gl = null;
+ }
+
+ return gl;
+}
+/**
+ * Returns the image data type as a string representation.
+ * @param {any} image The cornerstone image object
+ * @returns {string} image data type (rgb, iint16, uint16, int8 and uint8)
+ * @memberof WebGLRendering
+ */
+
+
+function getImageDataType(image) {
+ if (image.color) {
+ return 'rgb';
+ }
+
+ var pixelData = image.getPixelData();
+
+ if (pixelData instanceof Int16Array) {
+ return 'int16';
+ }
+
+ if (pixelData instanceof Uint16Array) {
+ return 'uint16';
+ }
+
+ if (pixelData instanceof Int8Array) {
+ return 'int8';
+ }
+
+ return 'uint8';
+}
+
+function getShaderProgram(image) {
+ var datatype = getImageDataType(image); // We need a mechanism for
+ // Choosing the shader based on the image datatype
+ // Console.log("Datatype: " + datatype);
+
+ if (_shaders_index_js__WEBPACK_IMPORTED_MODULE_0__["shaders"].hasOwnProperty(datatype)) {
+ return _shaders_index_js__WEBPACK_IMPORTED_MODULE_0__["shaders"][datatype];
+ }
+
+ return _shaders_index_js__WEBPACK_IMPORTED_MODULE_0__["shaders"].rgb;
+}
+
+function generateTexture(image) {
+ var TEXTURE_FORMAT = {
+ uint8: gl.LUMINANCE,
+ int8: gl.LUMINANCE_ALPHA,
+ uint16: gl.LUMINANCE_ALPHA,
+ int16: gl.RGB,
+ rgb: gl.RGB
+ };
+ var TEXTURE_BYTES = {
+ int8: 1,
+ // Luminance
+ uint16: 2,
+ // Luminance + Alpha
+ int16: 3,
+ // RGB
+ rgb: 3 // RGB
+
+ };
+ var imageDataType = getImageDataType(image);
+ var format = TEXTURE_FORMAT[imageDataType]; // GL texture configuration
+
+ var texture = gl.createTexture();
+ gl.bindTexture(gl.TEXTURE_2D, texture);
+ gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, gl.NEAREST);
+ gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, gl.NEAREST);
+ gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_S, gl.CLAMP_TO_EDGE);
+ gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_T, gl.CLAMP_TO_EDGE);
+ gl.pixelStorei(gl.UNPACK_ALIGNMENT, 1);
+ var imageData = _shaders_index_js__WEBPACK_IMPORTED_MODULE_0__["dataUtilities"][imageDataType].storedPixelDataToImageData(image, image.width, image.height);
+ gl.texImage2D(gl.TEXTURE_2D, 0, format, image.width, image.height, 0, format, gl.UNSIGNED_BYTE, imageData); // Calculate the size in bytes of this image in memory
+
+ var sizeInBytes = image.width * image.height * TEXTURE_BYTES[imageDataType];
+ return {
+ texture: texture,
+ sizeInBytes: sizeInBytes
+ };
+}
+
+function getImageTexture(image) {
+ var imageTexture = _textureCache_js__WEBPACK_IMPORTED_MODULE_2__["default"].getImageTexture(image.imageId);
+
+ if (!imageTexture) {
+ // Console.log("Generating texture for imageid: ", image.imageId);
+ imageTexture = generateTexture(image);
+ _textureCache_js__WEBPACK_IMPORTED_MODULE_2__["default"].putImageTexture(image, imageTexture);
+ }
+
+ return imageTexture.texture;
+}
+
+function initBuffers() {
+ positionBuffer = gl.createBuffer();
+ gl.bindBuffer(gl.ARRAY_BUFFER, positionBuffer);
+ gl.bufferData(gl.ARRAY_BUFFER, new Float32Array([1, 1, 0, 1, 1, 0, 0, 0]), gl.STATIC_DRAW);
+ texCoordBuffer = gl.createBuffer();
+ gl.bindBuffer(gl.ARRAY_BUFFER, texCoordBuffer);
+ gl.bufferData(gl.ARRAY_BUFFER, new Float32Array([1.0, 1.0, 0.0, 1.0, 1.0, 0.0, 0.0, 0.0]), gl.STATIC_DRAW);
+}
+
+function renderQuad(shader, parameters, texture, width, height) {
+ gl.clearColor(1.0, 0.0, 0.0, 1.0);
+ gl.viewport(0, 0, width, height);
+ gl.clear(gl.COLOR_BUFFER_BIT | gl.DEPTH_BUFFER_BIT);
+ gl.useProgram(shader.program);
+ gl.bindBuffer(gl.ARRAY_BUFFER, texCoordBuffer);
+ gl.vertexAttribPointer(shader.attributes.texCoordLocation, 2, gl.FLOAT, false, 0, 0);
+ gl.bindBuffer(gl.ARRAY_BUFFER, positionBuffer);
+ gl.vertexAttribPointer(shader.attributes.positionLocation, 2, gl.FLOAT, false, 0, 0);
+
+ for (var key in parameters) {
+ var uniformLocation = gl.getUniformLocation(shader.program, key);
+
+ if (!uniformLocation) {
+ continue; // Disabling this error for now since RGB requires minPixelValue
+ // but the other shaders do not.
+ // throw `Could not access location for uniform: ${key}`;
+ }
+
+ var uniform = parameters[key];
+ var type = uniform.type;
+ var value = uniform.value;
+
+ if (type === 'i') {
+ gl.uniform1i(uniformLocation, value);
+ } else if (type === 'f') {
+ gl.uniform1f(uniformLocation, value);
+ } else if (type === '2f') {
+ gl.uniform2f(uniformLocation, value[0], value[1]);
+ }
+ }
+
+ updateRectangle(gl, width, height);
+ gl.activeTexture(gl.TEXTURE0);
+ gl.bindTexture(gl.TEXTURE_2D, texture);
+ gl.drawArrays(gl.TRIANGLE_STRIP, 0, 4);
+}
+
+function render(enabledElement) {
+ // Resize the canvas
+ var image = enabledElement.image;
+ renderCanvas.width = image.width;
+ renderCanvas.height = image.height;
+ var viewport = enabledElement.viewport; // Render the current image
+
+ var shader = getShaderProgram(image);
+ var texture = getImageTexture(image);
+ var parameters = {
+ u_resolution: {
+ type: '2f',
+ value: [image.width, image.height]
+ },
+ wc: {
+ type: 'f',
+ value: viewport.voi.windowCenter
+ },
+ ww: {
+ type: 'f',
+ value: viewport.voi.windowWidth
+ },
+ slope: {
+ type: 'f',
+ value: image.slope
+ },
+ intercept: {
+ type: 'f',
+ value: image.intercept
+ },
+ minPixelValue: {
+ type: 'f',
+ value: image.minPixelValue
+ },
+ invert: {
+ type: 'i',
+ value: viewport.invert ? 1 : 0
+ }
+ };
+ renderQuad(shader, parameters, texture, image.width, image.height);
+ return renderCanvas;
+}
+function isWebGLAvailable() {
+ // Adapted from
+ // http://stackoverflow.com/questions/9899807/three-js-detect-webgl-support-and-fallback-to-regular-canvas
+ var options = {
+ failIfMajorPerformanceCaveat: true
+ };
+
+ try {
+ var canvas = document.createElement('canvas');
+ return Boolean(window.WebGLRenderingContext) && (canvas.getContext('webgl', options) || canvas.getContext('experimental-webgl', options));
+ } catch (e) {
+ return false;
+ }
+}
+
+/***/ }),
+
+/***/ "./webgl/shaders/index.js":
+/*!********************************!*\
+ !*** ./webgl/shaders/index.js ***!
+ \********************************/
+/*! exports provided: shaders, dataUtilities */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+__webpack_require__.r(__webpack_exports__);
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "shaders", function() { return shaders; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "dataUtilities", function() { return dataUtilities; });
+/* harmony import */ var _int16_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./int16.js */ "./webgl/shaders/int16.js");
+/* harmony import */ var _int8_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./int8.js */ "./webgl/shaders/int8.js");
+/* harmony import */ var _rgb_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./rgb.js */ "./webgl/shaders/rgb.js");
+/* harmony import */ var _uint16_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./uint16.js */ "./webgl/shaders/uint16.js");
+/* harmony import */ var _uint8_js__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./uint8.js */ "./webgl/shaders/uint8.js");
+
+
+
+
+
+var shaders = {
+ int16: _int16_js__WEBPACK_IMPORTED_MODULE_0__["int16Shader"],
+ int8: _int8_js__WEBPACK_IMPORTED_MODULE_1__["int8Shader"],
+ rgb: _rgb_js__WEBPACK_IMPORTED_MODULE_2__["rgbShader"],
+ uint16: _uint16_js__WEBPACK_IMPORTED_MODULE_3__["uint16Shader"],
+ uint8: _uint8_js__WEBPACK_IMPORTED_MODULE_4__["uint8Shader"]
+};
+var dataUtilities = {
+ int16: _int16_js__WEBPACK_IMPORTED_MODULE_0__["int16DataUtilities"],
+ int8: _int8_js__WEBPACK_IMPORTED_MODULE_1__["int8DataUtilities"],
+ rgb: _rgb_js__WEBPACK_IMPORTED_MODULE_2__["rgbDataUtilities"],
+ uint16: _uint16_js__WEBPACK_IMPORTED_MODULE_3__["uint16DataUtilities"],
+ uint8: _uint8_js__WEBPACK_IMPORTED_MODULE_4__["uint8DataUtilities"]
+};
+
+
+/***/ }),
+
+/***/ "./webgl/shaders/int16.js":
+/*!********************************!*\
+ !*** ./webgl/shaders/int16.js ***!
+ \********************************/
+/*! exports provided: int16DataUtilities, int16Shader */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+__webpack_require__.r(__webpack_exports__);
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "int16DataUtilities", function() { return int16DataUtilities; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "int16Shader", function() { return int16Shader; });
+/* eslint no-bitwise: 0 */
+var int16Shader = {};
+/**
+ * Convert stored pixel data to image data.
+ *
+ * Pack int16 into three uint8 channels (r, g, b)
+ *
+ * @param {Image} image A Cornerstone Image Object
+ * @returns {Uint8Array} The image data for use by the WebGL shader
+ * @memberof WebGLRendering
+ */
+
+function storedPixelDataToImageData(image) {
+ // Transfer image data to alpha and luminance channels of WebGL texture
+ // Credit to @jpambrun and @fernandojsg
+ // Pack int16 into three uint8 channels (r, g, b)
+ var pixelData = image.getPixelData();
+ var numberOfChannels = 3;
+ var data = new Uint8Array(image.width * image.height * numberOfChannels);
+ var offset = 0;
+
+ for (var i = 0; i < pixelData.length; i++) {
+ var val = Math.abs(pixelData[i]);
+ data[offset++] = val & 0xFF;
+ data[offset++] = val >> 8;
+ data[offset++] = pixelData[i] < 0 ? 0 : 1; // 0 For negative, 1 for positive
+ }
+
+ return data;
+}
+
+var int16DataUtilities = {
+ storedPixelDataToImageData: storedPixelDataToImageData
+};
+int16Shader.frag = 'precision mediump float;' + 'uniform sampler2D u_image;' + 'uniform float ww;' + 'uniform float wc;' + 'uniform float slope;' + 'uniform float intercept;' + 'uniform int invert;' + 'varying vec2 v_texCoord;' + 'void main() {' + // Get texture
+'vec4 color = texture2D(u_image, v_texCoord);' + // Calculate luminance from packed texture
+'float intensity = color.r*256.0 + color.g*65536.0;' + 'if (color.b == 0.0)' + 'intensity = -intensity;' + // Rescale based on slope and window settings
+'intensity = intensity * slope + intercept;' + 'float center0 = wc - 0.5;' + 'float width0 = max(ww, 1.0);' + 'intensity = (intensity - center0) / width0 + 0.5;' + // Clamp intensity
+'intensity = clamp(intensity, 0.0, 1.0);' + // RGBA output
+'gl_FragColor = vec4(intensity, intensity, intensity, 1.0);' + // Apply any inversion necessary
+'if (invert == 1)' + 'gl_FragColor.rgb = 1.0 - gl_FragColor.rgb;' + '}';
+
+
+/***/ }),
+
+/***/ "./webgl/shaders/int8.js":
+/*!*******************************!*\
+ !*** ./webgl/shaders/int8.js ***!
+ \*******************************/
+/*! exports provided: int8DataUtilities, int8Shader */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+__webpack_require__.r(__webpack_exports__);
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "int8DataUtilities", function() { return int8DataUtilities; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "int8Shader", function() { return int8Shader; });
+var int8Shader = {};
+/**
+ * Convert stored pixel data to image data.
+ *
+ * Store data in Uint8Array
+ *
+ * @param {Image} image A Cornerstone Image Object
+ * @returns {Uint8Array} The image data for use by the WebGL shader
+ * @memberof WebGLRendering
+ */
+
+function storedPixelDataToImageData(image) {
+ // Transfer image data to alpha channel of WebGL texture
+ // Store data in Uint8Array
+ var pixelData = image.getPixelData();
+ var numberOfChannels = 2;
+ var data = new Uint8Array(image.width * image.height * numberOfChannels);
+ var offset = 0;
+
+ for (var i = 0; i < pixelData.length; i++) {
+ data[offset++] = pixelData[i];
+ data[offset++] = pixelData[i] < 0 ? 0 : 1; // 0 For negative, 1 for positive
+ }
+
+ return data;
+}
+
+var int8DataUtilities = {
+ storedPixelDataToImageData: storedPixelDataToImageData
+};
+int8Shader.frag = 'precision mediump float;' + 'uniform sampler2D u_image;' + 'uniform float ww;' + 'uniform float wc;' + 'uniform float slope;' + 'uniform float intercept;' + 'uniform int invert;' + 'varying vec2 v_texCoord;' + 'void main() {' + // Get texture
+'vec4 color = texture2D(u_image, v_texCoord);' + // Calculate luminance from packed texture
+'float intensity = color.r*256.;' + 'if (color.a == 0.0)' + 'intensity = -intensity;' + // Rescale based on slope and window settings
+'intensity = intensity * slope + intercept;' + 'float center0 = wc - 0.5;' + 'float width0 = max(ww, 1.0);' + 'intensity = (intensity - center0) / width0 + 0.5;' + // Clamp intensity
+'intensity = clamp(intensity, 0.0, 1.0);' + // RGBA output
+'gl_FragColor = vec4(intensity, intensity, intensity, 1.0);' + // Apply any inversion necessary
+'if (invert == 1)' + 'gl_FragColor.rgb = 1.0 - gl_FragColor.rgb;' + '}';
+
+
+/***/ }),
+
+/***/ "./webgl/shaders/rgb.js":
+/*!******************************!*\
+ !*** ./webgl/shaders/rgb.js ***!
+ \******************************/
+/*! exports provided: rgbDataUtilities, rgbShader */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+__webpack_require__.r(__webpack_exports__);
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "rgbDataUtilities", function() { return rgbDataUtilities; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "rgbShader", function() { return rgbShader; });
+var rgbShader = {};
+/**
+ * Convert stored pixel data to image data.
+ *
+ * Pack RGB images into a 3-channel RGB texture
+ *
+ * @param {Image} image A Cornerstone Image Object
+ * @returns {Uint8Array} The image data for use by the WebGL shader
+ * @memberof WebGLRendering
+ */
+
+function storedPixelDataToImageData(image) {
+ var minPixelValue = image.minPixelValue;
+ var canvasImageDataIndex = 0;
+ var storedPixelDataIndex = 0; // Only 3 channels, since we use WebGL's RGB texture format
+
+ var numStoredPixels = image.width * image.height * 4;
+ var numOutputPixels = image.width * image.height * 3;
+ var storedPixelData = image.getPixelData();
+ var data = new Uint8Array(numOutputPixels); // NOTE: As of Nov 2014, most javascript engines have lower performance when indexing negative indexes.
+ // We have a special code path for this case that improves performance. Thanks to @jpambrun for this enhancement
+
+ if (minPixelValue < 0) {
+ while (storedPixelDataIndex < numStoredPixels) {
+ data[canvasImageDataIndex++] = storedPixelData[storedPixelDataIndex++] + -minPixelValue; // Red
+
+ data[canvasImageDataIndex++] = storedPixelData[storedPixelDataIndex++] + -minPixelValue; // Green
+
+ data[canvasImageDataIndex++] = storedPixelData[storedPixelDataIndex++] + -minPixelValue; // Blue
+
+ storedPixelDataIndex += 1; // The stored pixel data has 4 channels
+ }
+ } else {
+ while (storedPixelDataIndex < numStoredPixels) {
+ data[canvasImageDataIndex++] = storedPixelData[storedPixelDataIndex++]; // Red
+
+ data[canvasImageDataIndex++] = storedPixelData[storedPixelDataIndex++]; // Green
+
+ data[canvasImageDataIndex++] = storedPixelData[storedPixelDataIndex++]; // Blue
+
+ storedPixelDataIndex += 1; // The stored pixel data has 4 channels
+ }
+ }
+
+ return data;
+}
+
+var rgbDataUtilities = {
+ storedPixelDataToImageData: storedPixelDataToImageData
+};
+rgbShader.frag = 'precision mediump float;' + 'uniform sampler2D u_image;' + 'uniform float ww;' + 'uniform float wc;' + 'uniform float slope;' + 'uniform float intercept;' + 'uniform float minPixelValue;' + 'uniform int invert;' + 'varying vec2 v_texCoord;' + 'void main() {' + // Get texture
+'vec3 color = texture2D(u_image, v_texCoord).xyz;' + // Rescale based on slope and intercept
+'color = color * 256.0 * slope + intercept;' + // Apply window settings
+'float center0 = wc - 0.5 - minPixelValue;' + 'float width0 = max(ww, 1.0);' + 'color = (color - center0) / width0 + 0.5;' + // RGBA output
+'gl_FragColor = vec4(color, 1);' + // Apply any inversion necessary
+'if (invert == 1)' + 'gl_FragColor.rgb = 1. - gl_FragColor.rgb;' + '}';
+
+
+/***/ }),
+
+/***/ "./webgl/shaders/uint16.js":
+/*!*********************************!*\
+ !*** ./webgl/shaders/uint16.js ***!
+ \*********************************/
+/*! exports provided: uint16DataUtilities, uint16Shader */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+__webpack_require__.r(__webpack_exports__);
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "uint16DataUtilities", function() { return uint16DataUtilities; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "uint16Shader", function() { return uint16Shader; });
+/* eslint no-bitwise: 0 */
+var uint16Shader = {};
+/**
+ * Convert stored pixel data to image data.
+ *
+ * For uint16 pack uint16 into two uint8 channels (r and a).
+ *
+ * @param {Image} image A Cornerstone Image Object
+ * @returns {Uint8Array} The image data for use by the WebGL shader
+ * @memberof WebGLRendering
+ */
+
+function storedPixelDataToImageData(image) {
+ // Transfer image data to alpha and luminance channels of WebGL texture
+ // Credit to @jpambrun and @fernandojsg
+ // Pack uint16 into two uint8 channels (r and a)
+ var pixelData = image.getPixelData();
+ var numberOfChannels = 2;
+ var data = new Uint8Array(image.width * image.height * numberOfChannels);
+ var offset = 0;
+
+ for (var i = 0; i < pixelData.length; i++) {
+ var val = pixelData[i];
+ data[offset++] = val & 0xFF;
+ data[offset++] = val >> 8;
+ }
+
+ return data;
+}
+
+var uint16DataUtilities = {
+ storedPixelDataToImageData: storedPixelDataToImageData
+};
+uint16Shader.frag = 'precision mediump float;' + 'uniform sampler2D u_image;' + 'uniform float ww;' + 'uniform float wc;' + 'uniform float slope;' + 'uniform float intercept;' + 'uniform int invert;' + 'varying vec2 v_texCoord;' + 'void main() {' + // Get texture
+'vec4 color = texture2D(u_image, v_texCoord);' + // Calculate luminance from packed texture
+'float intensity = color.r*256.0 + color.a*65536.0;' + // Rescale based on slope and window settings
+'intensity = intensity * slope + intercept;' + 'float center0 = wc - 0.5;' + 'float width0 = max(ww, 1.0);' + 'intensity = (intensity - center0) / width0 + 0.5;' + // Clamp intensity
+'intensity = clamp(intensity, 0.0, 1.0);' + // RGBA output
+'gl_FragColor = vec4(intensity, intensity, intensity, 1.0);' + // Apply any inversion necessary
+'if (invert == 1)' + 'gl_FragColor.rgb = 1.0 - gl_FragColor.rgb;' + '}';
+
+
+/***/ }),
+
+/***/ "./webgl/shaders/uint8.js":
+/*!********************************!*\
+ !*** ./webgl/shaders/uint8.js ***!
+ \********************************/
+/*! exports provided: uint8DataUtilities, uint8Shader */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+__webpack_require__.r(__webpack_exports__);
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "uint8DataUtilities", function() { return uint8DataUtilities; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "uint8Shader", function() { return uint8Shader; });
+var uint8Shader = {};
+/**
+ * Convert stored pixel data to image data. Here we will store
+ * all data in the alpha channel.
+ *
+ * @param {Image} image A Cornerstone Image Object
+ * @returns {Uint8Array} The image data for use by the WebGL shader
+ * @memberof WebGLRendering
+ */
+
+function storedPixelDataToImageData(image) {
+ // Transfer image data to alpha channel of WebGL texture
+ return image.getPixelData();
+}
+
+var uint8DataUtilities = {
+ storedPixelDataToImageData: storedPixelDataToImageData
+};
+uint8Shader.frag = 'precision mediump float;' + 'uniform sampler2D u_image;' + 'uniform float ww;' + 'uniform float wc;' + 'uniform float slope;' + 'uniform float intercept;' + 'uniform int invert;' + 'varying vec2 v_texCoord;' + 'void main() {' + // Get texture
+'vec4 color = texture2D(u_image, v_texCoord);' + // Calculate luminance from packed texture
+'float intensity = color.r*256.0;' + // Rescale based on slope and window settings
+'intensity = intensity * slope + intercept;' + 'float center0 = wc - 0.5;' + 'float width0 = max(ww, 1.0);' + 'intensity = (intensity - center0) / width0 + 0.5;' + // Clamp intensity
+'intensity = clamp(intensity, 0.0, 1.0);' + // RGBA output
+'gl_FragColor = vec4(intensity, intensity, intensity, 1.0);' + // Apply any inversion necessary
+'if (invert == 1)' + 'gl_FragColor.rgb = 1.0 - gl_FragColor.rgb;' + '}';
+
+
+/***/ }),
+
+/***/ "./webgl/textureCache.js":
+/*!*******************************!*\
+ !*** ./webgl/textureCache.js ***!
+ \*******************************/
+/*! exports provided: default */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+__webpack_require__.r(__webpack_exports__);
+/* harmony import */ var _events_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../events.js */ "./events.js");
+/* harmony import */ var _triggerEvent_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../triggerEvent.js */ "./triggerEvent.js");
+
+
+/**
+ * This module deals with caching image textures in VRAM for WebGL
+ * @module WebGLTextureCache
+ */
+
+var imageCache = {};
+var cachedImages = [];
+var maximumSizeInBytes = 1024 * 1024 * 256; // 256 MB
+
+var cacheSizeInBytes = 0;
+
+function getCacheInfo() {
+ return {
+ maximumSizeInBytes: maximumSizeInBytes,
+ cacheSizeInBytes: cacheSizeInBytes,
+ numberOfImagesCached: cachedImages.length
+ };
+}
+
+function purgeCacheIfNecessary() {
+ // If max cache size has not been exceeded, do nothing
+ if (cacheSizeInBytes <= maximumSizeInBytes) {
+ return;
+ } // Cache size has been exceeded, create list of images sorted by timeStamp
+ // So we can purge the least recently used image
+
+
+ function compare(a, b) {
+ if (a.timeStamp > b.timeStamp) {
+ return -1;
+ }
+
+ if (a.timeStamp < b.timeStamp) {
+ return 1;
+ }
+
+ return 0;
+ }
+
+ cachedImages.sort(compare); // Remove images as necessary
+
+ while (cacheSizeInBytes > maximumSizeInBytes) {
+ var lastCachedImage = cachedImages[cachedImages.length - 1];
+ cacheSizeInBytes -= lastCachedImage.sizeInBytes;
+ delete imageCache[lastCachedImage.imageId];
+ cachedImages.pop();
+ Object(_triggerEvent_js__WEBPACK_IMPORTED_MODULE_1__["default"])(_events_js__WEBPACK_IMPORTED_MODULE_0__["events"], _events_js__WEBPACK_IMPORTED_MODULE_0__["default"].WEBGL_TEXTURE_REMOVED, {
+ imageId: lastCachedImage.imageId
+ });
+ }
+
+ var cacheInfo = getCacheInfo();
+ Object(_triggerEvent_js__WEBPACK_IMPORTED_MODULE_1__["default"])(_events_js__WEBPACK_IMPORTED_MODULE_0__["events"], _events_js__WEBPACK_IMPORTED_MODULE_0__["default"].WEBGL_TEXTURE_CACHE_FULL, cacheInfo);
+}
+
+function setMaximumSizeBytes(numBytes) {
+ if (numBytes === undefined) {
+ throw new Error('setMaximumSizeBytes: parameter numBytes must not be undefined');
+ }
+
+ if (numBytes.toFixed === undefined) {
+ throw new Error('setMaximumSizeBytes: parameter numBytes must be a number');
+ }
+
+ maximumSizeInBytes = numBytes;
+ purgeCacheIfNecessary();
+}
+
+function putImageTexture(image, imageTexture) {
+ var imageId = image.imageId;
+
+ if (image === undefined) {
+ throw new Error('putImageTexture: image must not be undefined');
+ }
+
+ if (imageId === undefined) {
+ throw new Error('putImageTexture: imageId must not be undefined');
+ }
+
+ if (imageTexture === undefined) {
+ throw new Error('putImageTexture: imageTexture must not be undefined');
+ }
+
+ if (Object.prototype.hasOwnProperty.call(imageCache, imageId) === true) {
+ throw new Error('putImageTexture: imageId already in cache');
+ }
+
+ var cachedImage = {
+ imageId: imageId,
+ imageTexture: imageTexture,
+ timeStamp: new Date(),
+ sizeInBytes: imageTexture.sizeInBytes
+ };
+ imageCache[imageId] = cachedImage;
+ cachedImages.push(cachedImage);
+
+ if (imageTexture.sizeInBytes === undefined) {
+ throw new Error('putImageTexture: imageTexture.sizeInBytes must not be undefined');
+ }
+
+ if (imageTexture.sizeInBytes.toFixed === undefined) {
+ throw new Error('putImageTexture: imageTexture.sizeInBytes is not a number');
+ }
+
+ cacheSizeInBytes += cachedImage.sizeInBytes;
+ purgeCacheIfNecessary();
+}
+
+function getImageTexture(imageId) {
+ if (imageId === undefined) {
+ throw new Error('getImageTexture: imageId must not be undefined');
+ }
+
+ var cachedImage = imageCache[imageId];
+
+ if (cachedImage === undefined) {
+ return;
+ } // Bump time stamp for cached image
+
+
+ cachedImage.timeStamp = new Date();
+ return cachedImage.imageTexture;
+}
+
+function removeImageTexture(imageId) {
+ if (imageId === undefined) {
+ throw new Error('removeImageTexture: imageId must not be undefined');
+ }
+
+ var cachedImage = imageCache[imageId];
+
+ if (cachedImage === undefined) {
+ throw new Error('removeImageTexture: imageId must not be undefined');
+ }
+
+ cachedImages.splice(cachedImages.indexOf(cachedImage), 1);
+ cacheSizeInBytes -= cachedImage.sizeInBytes;
+ delete imageCache[imageId];
+ return cachedImage.imageTexture;
+}
+
+function purgeCache() {
+ while (cachedImages.length > 0) {
+ var removedCachedImage = cachedImages.pop();
+ delete imageCache[removedCachedImage.imageId];
+ }
+
+ cacheSizeInBytes = 0;
+}
+
+/* harmony default export */ __webpack_exports__["default"] = ({
+ purgeCache: purgeCache,
+ getImageTexture: getImageTexture,
+ putImageTexture: putImageTexture,
+ removeImageTexture: removeImageTexture,
+ setMaximumSizeBytes: setMaximumSizeBytes
+});
+
+/***/ }),
+
+/***/ "./webgl/vertexShader.js":
+/*!*******************************!*\
+ !*** ./webgl/vertexShader.js ***!
+ \*******************************/
+/*! exports provided: vertexShader */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+__webpack_require__.r(__webpack_exports__);
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "vertexShader", function() { return vertexShader; });
+var vertexShader = 'attribute vec2 a_position;' + 'attribute vec2 a_texCoord;' + 'uniform vec2 u_resolution;' + 'varying vec2 v_texCoord;' + 'void main() {' + 'vec2 zeroToOne = a_position / u_resolution;' + 'vec2 zeroToTwo = zeroToOne * 2.0;' + 'vec2 clipSpace = zeroToTwo - 1.0;' + 'gl_Position = vec4(clipSpace * vec2(1, -1), 0, 1);' + 'v_texCoord = a_texCoord;' + '}';
+
+/***/ })
+
+/******/ });
+});
+
+});
+
+var cornerstone$3 = unwrapExports(cornerstone$2);
+
+var cornerstoneWADOImageLoader_min = createCommonjsModule(function (module, exports) {
+/*! cornerstone-wado-image-loader - 2.2.2 - 2018-12-05 | (c) 2016 Chris Hafey | https://github.com/cornerstonejs/cornerstoneWADOImageLoader */
+!function(e,t){module.exports=t();}(commonjsGlobal,function(){return function(r){var a={};function n(e){if(a[e])return a[e].exports;var t=a[e]={i:e,l:!1,exports:{}};return r[e].call(t.exports,t,t.exports,n),t.l=!0,t.exports}return n.m=r,n.c=a,n.d=function(e,t,r){n.o(e,t)||Object.defineProperty(e,t,{enumerable:!0,get:r});},n.r=function(e){"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(e,"__esModule",{value:!0});},n.t=function(t,e){if(1&e&&(t=n(t)),8&e)return t;if(4&e&&"object"==typeof t&&t&&t.__esModule)return t;var r=Object.create(null);if(n.r(r),Object.defineProperty(r,"default",{enumerable:!0,value:t}),2&e&&"string"!=typeof t)for(var a in t)n.d(r,a,function(e){return t[e]}.bind(null,a));return r},n.n=function(e){var t=e&&e.__esModule?function(){return e.default}:function(){return e};return n.d(t,"a",t),t},n.o=function(e,t){return Object.prototype.hasOwnProperty.call(e,t)},n.p="",n(n.s=6)}([function(e,t,r){t.a=function(e){for(var t,r=e[0],a=e[0],n=e.length,o=1;o>8&255;}else 8===e.bitsAllocated&&(e.pixelData=t);var i;return e};var d=function(e,t){if(8===e.bitsAllocated)return e.planarConfiguration?function(e,t){for(var r=t,a=e.rows*e.columns,n=new ArrayBuffer(a*e.samplesPerPixel),o=new DataView(r.buffer,r.byteOffset),i=new Int8Array(r.buffer,r.byteOffset),l=new Int8Array(n),s=0,u=o.getInt32(0,!0),c=0;c>l;var u=(new Date).getTime();return e.decodeTimeInMS=u-o,e};},function(e,t,r){r.r(t);var a=function(e,t){if(void 0===e)throw new Error("decodeRGB: rgbBuffer must not be undefined");if(e.length%3!=0)throw new Error("decodeRGB: rgbBuffer length must be divisible by 3");for(var r=e.length/3,a=0,n=0,o=0;o>t;return a}var l=function(e,t){for(var r=e.columns*e.rows,a=e.pixelData,n=e.redPaletteColorLookupTableData,o=e.greenPaletteColorLookupTableData,i=e.bluePaletteColorLookupTableData,l=e.redPaletteColorLookupTableData.length,s=0,u=0,c=e.redPaletteColorLookupTableDescriptor[1],f=8===e.redPaletteColorLookupTableDescriptor[2]?0:8,d=x(n,f),p=x(o,f),m=x(i,f),g=0;gt.length)return !1;for(var a=r,n=0;n=E.maxWebWorkers)){var e=new Worker(E.webWorkerPath);R.push({worker:e,status:"initializing"}),e.addEventListener("message",F),e.postMessage({taskType:"initialize",workerIndex:R.length-1,config:E});}}function G(e){if(e=e||W,E)throw new Error("WebWorkerManager already initialized");if((E=e).maxWebWorkers=E.maxWebWorkers||navigator.hardwareConcurrency||1,!E.startWebWorkersOnDemand)for(var t=0;t=e.byteArray.length)throw new Error("frame exceeds size of pixelData");return new Uint8Array(e.byteArray.buffer,r,u)}if(16===n){if((r=s+t*u*2)>=e.byteArray.length)throw new Error("frame exceeds size of pixelData");return new Uint8Array(e.byteArray.buffer,r,2*u)}if(1===n){if((r=s+t*u*.125)>=e.byteArray.length)throw new Error("frame exceeds size of pixelData");return Pe(e.byteArray,r,u)}if(32!==n)throw new Error("unsupported pixel format");if((r=s+t*u*4)>=e.byteArray.length)throw new Error("frame exceeds size of pixelData");return new Uint8Array(e.byteArray.buffer,r,4*u)};var Ie=function(e){var t=de(e),r=parseInt(t.url,10),a=be.get(r);return new Promise(function(r,e){var t=new FileReader;t.onload=function(e){var t=e.target.result;r(t);},t.onerror=e,t.readAsArrayBuffer(a);})};var Te=function(e){var t=1i?i:t},e.degToRad=function(t){return t*(Math.PI/180)},e.radToDeg=function(t){return t*(180/Math.PI)},e.sign=function(t){return "number"==typeof t?t?t<0?-1:1:t==t?0:NaN:NaN};},function(t,e,i){Object.defineProperty(e,"__esModule",{value:!0});var n,o=i(3),s=(n=o)&&n.__esModule?n:{default:n},r=i(0);var a,h,u,c,l,f=function(t,e,i){this.x=t||0,this.y=e||0,this.z=i||0;};f.prototype={constructor:f,set:function(t,e,i){return this.x=t,this.y=e,this.z=i,this},setX:function(t){return this.x=t,this},setY:function(t){return this.y=t,this},setZ:function(t){return this.z=t,this},setComponent:function(t,e){switch(t){case 0:this.x=e;break;case 1:this.y=e;break;case 2:this.z=e;break;default:throw new Error("index is out of range: "+t)}},getComponent:function(t){switch(t){case 0:return this.x;case 1:return this.y;case 2:return this.z;default:throw new Error("index is out of range: "+t)}},copy:function(t){return this.x=t.x,this.y=t.y,this.z=t.z,this},add:function(t,e){return void 0!==e?(console.warn("DEPRECATED: Vector3's .add() now only accepts one argument. Use .addVectors( a, b ) instead."),this.addVectors(t,e)):(this.x+=t.x,this.y+=t.y,this.z+=t.z,this)},addScalar:function(t){return this.x+=t,this.y+=t,this.z+=t,this},addVectors:function(t,e){return this.x=t.x+e.x,this.y=t.y+e.y,this.z=t.z+e.z,this},sub:function(t,e){return void 0!==e?(console.warn("DEPRECATED: Vector3's .sub() now only accepts one argument. Use .subVectors( a, b ) instead."),this.subVectors(t,e)):(this.x-=t.x,this.y-=t.y,this.z-=t.z,this)},subVectors:function(t,e){return this.x=t.x-e.x,this.y=t.y-e.y,this.z=t.z-e.z,this},multiply:function(t,e){return void 0!==e?(console.warn("DEPRECATED: Vector3's .multiply() now only accepts one argument. Use .multiplyVectors( a, b ) instead."),this.multiplyVectors(t,e)):(this.x*=t.x,this.y*=t.y,this.z*=t.z,this)},multiplyScalar:function(t){return this.x*=t,this.y*=t,this.z*=t,this},multiplyVectors:function(t,e){return this.x=t.x*e.x,this.y=t.y*e.y,this.z=t.z*e.z,this},applyAxisAngle:(l=void 0,function(t,e){return void 0===l&&(l=new s.default),this.applyQuaternion(l.setFromAxisAngle(t.normalize(),e)),this}),applyMatrix3:function(t){var e=this.x,i=this.y,n=this.z,o=t.elements;return this.x=o[0]*e+o[3]*i+o[6]*n,this.y=o[1]*e+o[4]*i+o[7]*n,this.z=o[2]*e+o[5]*i+o[8]*n,this},applyMatrix4:function(t){var e=this.x,i=this.y,n=this.z,o=t.elements;return this.x=o[0]*e+o[4]*i+o[8]*n+o[12],this.y=o[1]*e+o[5]*i+o[9]*n+o[13],this.z=o[2]*e+o[6]*i+o[10]*n+o[14],this},applyProjection:function(t){var e=this.x,i=this.y,n=this.z,o=t.elements,s=1/(o[3]*e+o[7]*i+o[11]*n+o[15]);return this.x=(o[0]*e+o[4]*i+o[8]*n+o[12])*s,this.y=(o[1]*e+o[5]*i+o[9]*n+o[13])*s,this.z=(o[2]*e+o[6]*i+o[10]*n+o[14])*s,this},applyQuaternion:function(t){var e=this.x,i=this.y,n=this.z,o=t.x,s=t.y,r=t.z,a=t.w,h=a*e+s*n-r*i,u=a*i+r*e-o*n,c=a*n+o*i-s*e,l=-o*e-s*i-r*n;return this.x=h*a+l*-o+u*-r-c*-s,this.y=u*a+l*-s+c*-o-h*-r,this.z=c*a+l*-r+h*-s-u*-o,this},transformDirection:function(t){var e=this.x,i=this.y,n=this.z,o=t.elements;return this.x=o[0]*e+o[4]*i+o[8]*n,this.y=o[1]*e+o[5]*i+o[9]*n,this.z=o[2]*e+o[6]*i+o[10]*n,this.normalize(),this},divide:function(t){return this.x/=t.x,this.y/=t.y,this.z/=t.z,this},divideScalar:function(t){if(0!==t){var e=1/t;this.x*=e,this.y*=e,this.z*=e;}else this.x=0,this.y=0,this.z=0;return this},min:function(t){return this.x>t.x&&(this.x=t.x),this.y>t.y&&(this.y=t.y),this.z>t.z&&(this.z=t.z),this},max:function(t){return this.xe.x&&(this.x=e.x),this.ye.y&&(this.y=e.y),this.ze.z&&(this.z=e.z),this},clampScalar:(u=void 0,c=void 0,function(t,e){return void 0===u&&(u=new f,c=new f),u.set(t,t,t),c.set(e,e,e),this.clamp(u,c)}),floor:function(){return this.x=Math.floor(this.x),this.y=Math.floor(this.y),this.z=Math.floor(this.z),this},ceil:function(){return this.x=Math.ceil(this.x),this.y=Math.ceil(this.y),this.z=Math.ceil(this.z),this},round:function(){return this.x=Math.round(this.x),this.y=Math.round(this.y),this.z=Math.round(this.z),this},roundToZero:function(){return this.x=this.x<0?Math.ceil(this.x):Math.floor(this.x),this.y=this.y<0?Math.ceil(this.y):Math.floor(this.y),this.z=this.z<0?Math.ceil(this.z):Math.floor(this.z),this},negate:function(){return this.multiplyScalar(-1)},dot:function(t){return this.x*t.x+this.y*t.y+this.z*t.z},lengthSq:function(){return this.x*this.x+this.y*this.y+this.z*this.z},length:function(){return Math.sqrt(this.x*this.x+this.y*this.y+this.z*this.z)},lengthManhattan:function(){return Math.abs(this.x)+Math.abs(this.y)+Math.abs(this.z)},normalize:function(){return this.divideScalar(this.length())},setLength:function(t){var e=this.length();return 0!==e&&t!==e&&this.multiplyScalar(t/e),this},lerp:function(t,e){return this.x+=(t.x-this.x)*e,this.y+=(t.y-this.y)*e,this.z+=(t.z-this.z)*e,this},cross:function(t,e){if(void 0!==e)return console.warn("DEPRECATED: Vector3's .cross() now only accepts one argument. Use .crossVectors( a, b ) instead."),this.crossVectors(t,e);var i=this.x,n=this.y,o=this.z;return this.x=n*t.z-o*t.y,this.y=o*t.x-i*t.z,this.z=i*t.y-n*t.x,this},crossVectors:function(t,e){var i=t.x,n=t.y,o=t.z,s=e.x,r=e.y,a=e.z;return this.x=n*a-o*r,this.y=o*s-i*a,this.z=i*r-n*s,this},projectOnVector:(a=void 0,h=void 0,function(t){return void 0===a&&(a=new f),a.copy(t).normalize(),h=this.dot(a),this.copy(a).multiplyScalar(h)}),projectOnPlane:function(){var t=void 0;return function(e){return void 0===t&&(t=new f),t.copy(this).projectOnVector(e),this.sub(t)}}(),reflect:function(){var t=void 0;return function(e){return void 0===t&&(t=new f),this.sub(t.copy(e).multiplyScalar(2*this.dot(e)))}}(),angleTo:function(t){var e=this.dot(t)/(this.length()*t.length());return Math.acos((0, r.clamp)(e,-1,1))},distanceTo:function(t){return Math.sqrt(this.distanceToSquared(t))},distanceToSquared:function(t){var e=this.x-t.x,i=this.y-t.y,n=this.z-t.z;return e*e+i*i+n*n},setFromMatrixPosition:function(t){return this.x=t.elements[12],this.y=t.elements[13],this.z=t.elements[14],this},setFromMatrixScale:function(t){var e=this.set(t.elements[0],t.elements[1],t.elements[2]).length(),i=this.set(t.elements[4],t.elements[5],t.elements[6]).length(),n=this.set(t.elements[8],t.elements[9],t.elements[10]).length();return this.x=e,this.y=i,this.z=n,this},setFromMatrixColumn:function(t,e){var i=4*t,n=e.elements;return this.x=n[i],this.y=n[i+1],this.z=n[i+2],this},equals:function(t){return t.x===this.x&&t.y===this.y&&t.z===this.z},fromArray:function(t){return this.x=t[0],this.y=t[1],this.z=t[2],this},toArray:function(){return [this.x,this.y,this.z]},clone:function(){return new f(this.x,this.y,this.z)}},e.default=f;},function(t,e,i){Object.defineProperty(e,"__esModule",{value:!0});var n=i(0);function o(t){return t*t}function s(t,e){return o(t.x-e.x)+o(t.y-e.y)}var r={distanceToPoint:function(t,e){return Math.sqrt(function(t,e){var i=s(t.start,t.end);if(0===i)return s(e,t.start);var n=((e.x-t.start.x)*(t.end.x-t.start.x)+(e.y-t.start.y)*(t.end.y-t.start.y))/i;return s(e,n<0?t.start:n>1?t.end:{x:t.start.x+n*(t.end.x-t.start.x),y:t.start.y+n*(t.end.y-t.start.y)})}(t,e))},intersectLine:function(t,e){var i,o,s,r,a,h,u,c,l,f,y,d={},p=t.start.x,x=t.start.y,m=t.end.x,v=t.end.y,g=e.start.x,z=e.start.y,b=e.end.x,M=e.end.y,w=void 0;if(f=(i=v-x)*b+(s=p-m)*M+(a=m*x-p*v),(0===(l=i*g+s*z+a)||0===f||(0, n.sign)(l)!==(0, n.sign)(f))&&(c=(o=M-z)*m+(r=g-b)*v+(h=b*z-g*M),0===(u=o*p+r*x+h)||0===c||(0, n.sign)(u)!==(0, n.sign)(c))){y=i*r-o*s,w=s*h-r*a;var R=parseFloat(w/y);w=o*a-i*h;var P=parseFloat(w/y);return d.x=R,d.y=P,d}}};e.default=r;},function(t,e,i){Object.defineProperty(e,"__esModule",{value:!0});var n=function(t,e,i,n){this.x=t||0,this.y=e||0,this.z=i||0,this.w=void 0!==n?n:1;};n.prototype.setFromAxisAngle=function(t,e){var i=e/2,n=Math.sin(i);return this.x=t.x*n,this.y=t.y*n,this.z=t.z*n,this.w=Math.cos(i),this},n.prototype.multiplyQuaternions=function(t,e){var i=t.x,n=t.y,o=t.z,s=t.w,r=e.x,a=e.y,h=e.z,u=e.w;return this.x=i*u+s*r+n*h-o*a,this.y=n*u+s*a+o*r-i*h,this.z=o*u+s*h+i*a-n*r,this.w=s*u-i*r-n*a-o*h,this},n.prototype.setFromRotationMatrix=function(t){var e=t.elements,i=e[0],n=e[4],o=e[8],s=e[1],r=e[5],a=e[9],h=e[2],u=e[6],c=e[10],l=i+r+c,f=void 0;return l>0?(f=.5/Math.sqrt(l+1),this.w=.25/f,this.x=(u-a)*f,this.y=(o-h)*f,this.z=(s-n)*f):i>r&&i>c?(f=2*Math.sqrt(1+i-r-c),this.w=(u-a)/f,this.x=.25*f,this.y=(n+s)/f,this.z=(o+h)/f):r>c?(f=2*Math.sqrt(1+r-i-c),this.w=(o-h)/f,this.x=(n+s)/f,this.y=.25*f,this.z=(a+u)/f):(f=2*Math.sqrt(1+c-i-r),this.w=(s-n)/f,this.x=(o+h)/f,this.y=(a+u)/f,this.z=.25*f),this},e.default=n;},function(t,e,i){Object.defineProperty(e,"__esModule",{value:!0});var n,o=i(2),s=(n=o)&&n.__esModule?n:{default:n};function r(t){return {topLeft:{x:t.left,y:t.top},bottomRight:{x:t.left+t.width,y:t.top+t.height}}}var a={distanceToPoint:function(t,e){var i=655535;return function(t){return [{start:{x:t.left,y:t.top},end:{x:t.left+t.width,y:t.top}},{start:{x:t.left+t.width,y:t.top},end:{x:t.left+t.width,y:t.top+t.height}},{start:{x:t.left+t.width,y:t.top+t.height},end:{x:t.left,y:t.top+t.height}},{start:{x:t.left,y:t.top+t.height},end:{x:t.left,y:t.top}}]}(t).forEach(function(t){var n=s.default.distanceToPoint(t,e);n=0?e.width>=0?!(o.bottomRight.x<=s.topLeft.x||s.bottomRight.x<=o.topLeft.x):!(o.bottomRight.x<=s.bottomRight.x||s.topLeft.x<=o.topLeft.x):e.width>=0?!(o.topLeft.x<=s.topLeft.x||s.bottomRight.x<=o.bottomRight.x):!(o.topLeft.x<=s.bottomRight.x||s.topLeft.x<=o.bottomRight.x),n=t.height>=0?e.height>=0?!(o.bottomRight.y<=s.topLeft.y||s.bottomRight.y<=o.topLeft.y):!(o.bottomRight.y<=s.bottomRight.y||s.topLeft.y<=o.topLeft.y):e.height>=0?!(o.topLeft.y<=s.topLeft.y||s.bottomRight.y<=o.bottomRight.y):!(o.topLeft.y<=s.bottomRight.y||s.top<=o.bottomRight.y),i&&n}(t,e)){var n=r(t),o=r(e);return t.width>=0?e.width>=0?(i.topLeft.x=Math.max(n.topLeft.x,o.topLeft.x),i.bottomRight.x=Math.min(n.bottomRight.x,o.bottomRight.x)):(i.topLeft.x=Math.max(n.topLeft.x,o.bottomRight.x),i.bottomRight.x=Math.min(n.bottomRight.x,o.topLeft.x)):e.width>=0?(i.topLeft.x=Math.min(n.topLeft.x,o.bottomRight.x),i.bottomRight.x=Math.max(n.bottomRight.x,o.topLeft.x)):(i.topLeft.x=Math.min(n.topLeft.x,o.topLeft.x),i.bottomRight.x=Math.max(n.bottomRight.x,o.bottomRight.x)),t.height>=0?e.height>=0?(i.topLeft.y=Math.max(n.topLeft.y,o.topLeft.y),i.bottomRight.y=Math.min(n.bottomRight.y,o.bottomRight.y)):(i.topLeft.y=Math.max(n.topLeft.y,o.bottomRight.y),i.bottomRight.y=Math.min(n.bottomRight.y,o.topLeft.y)):e.height>=0?(i.topLeft.y=Math.min(n.topLeft.y,o.bottomRight.y),i.bottomRight.y=Math.max(n.bottomRight.y,o.topLeft.y)):(i.topLeft.y=Math.min(n.topLeft.y,o.topLeft.y),i.bottomRight.y=Math.max(n.bottomRight.y,o.bottomRight.y)),i}}};e.default=a;},function(t,e,i){function n(t,e){return {x:t.x-e.x,y:t.y-e.y}}function o(t,e){return Math.sqrt(s(t,e))}function s(t,e){var i=n(t,e);return i.x*i.x+i.y*i.y}Object.defineProperty(e,"__esModule",{value:!0});var r={subtract:n,copy:function(t){return {x:t.x,y:t.y}},pageToPoint:function(t){return {x:t.pageX,y:t.pageY}},distance:o,distanceSquared:s,insideRect:function(t,e){return !(t.xe.left+e.width||t.ye.top+e.height)},findClosestPoint:function(t,e){var i=[],n=void 0;return t.forEach(function(t,s){var r=o(t,e);i.push(r),n=0===s?r:Math.min(r,n);}),t[i.indexOf(n)]}};e.default=r;},function(t,e,i){Object.defineProperty(e,"__esModule",{value:!0});var n,o=i(1),s=(n=o)&&n.__esModule?n:{default:n};var r,a,h=function(t,e){this.normal=void 0!==t?t:new s.default(1,0,0),this.constant=void 0!==e?e:0;};h.prototype={constructor:h,set:function(t,e){return this.normal.copy(t),this.constant=e,this},setComponents:function(t,e,i,n){return this.normal.set(t,e,i),this.constant=n,this},setFromNormalAndCoplanarPoint:function(t,e){return this.normal.copy(t),this.constant=-e.dot(this.normal),this},setFromCoplanarPoints:(r=new s.default,a=new s.default,function(t,e,i){var n=r.subVectors(i,e).cross(a.subVectors(t,e)).normalize();return this.setFromNormalAndCoplanarPoint(n,t),this}),copy:function(t){return this.normal.copy(t.normal),this.constant=t.constant,this},normalize:function(){var t=1/this.normal.length();return this.normal.multiplyScalar(t),this.constant*=t,this},negate:function(){return this.constant*=-1,this.normal.negate(),this},distanceToPoint:function(t){return this.normal.dot(t)+this.constant},distanceToSphere:function(t){return this.distanceToPoint(t.center)-t.radius},projectPoint:function(t,e){return this.orthoPoint(t,e).sub(t).negate()},orthoPoint:function(t,e){var i=this.distanceToPoint(t);return (e||new s.default).copy(this.normal).multiplyScalar(i)},isIntersectionLine:function(t){var e=this.distanceToPoint(t.start),i=this.distanceToPoint(t.end);return e<0&&i>0||i<0&&e>0},intersectLine:function(){var t=new s.default;return function(e,i){var n=i||new s.default,o=e.delta(t),r=this.normal.dot(o);if(0===r)return 0===this.distanceToPoint(e.start)?n.copy(e.start):void 0;var a=-(e.start.dot(this.normal)+this.constant)/r;return a<0||a>1?void 0:n.copy(o).multiplyScalar(a).add(e.start)}}(),intersectPlane:function(t){var e=this.normal.clone().cross(t.normal),i={origin:new s.default,direction:e};if(this.normal.clone().cross(t.normal).length<1e-10)return i.direction=new s.default,i;var n=this.constant,o=t.constant,r=this.normal.clone().dot(t.normal),a=-(n-o*r)/(1-r*r),h=-(o-n*r)/(1-r*r);return i.origin=this.normal.clone().multiplyScalar(a).add(t.normal.clone().multiplyScalar(h)),i},coplanarPoint:function(t){return (t||new s.default).copy(this.normal).multiplyScalar(-this.constant)},translate:function(t){return this.constant=this.constant-t.dot(this.normal),this},equals:function(t){return t.normal.equals(this.normal)&&t.constant===this.constant},clone:function(){return (new h).copy(this)}},e.default=h;},function(t,e,i){Object.defineProperty(e,"__esModule",{value:!0});var n,o=i(1),s=(n=o)&&n.__esModule?n:{default:n};var r=function(t,e,i,n,o,s,r,a,h,u,c,l,f,y,d,p){this.elements=new Float32Array(16);var x=this.elements;x[0]=void 0!==t?t:1,x[4]=e||0,x[8]=i||0,x[12]=n||0,x[1]=o||0,x[5]=void 0!==s?s:1,x[9]=r||0,x[13]=a||0,x[2]=h||0,x[6]=u||0,x[10]=void 0!==c?c:1,x[14]=l||0,x[3]=f||0,x[7]=y||0,x[11]=d||0,x[15]=void 0!==p?p:1;};r.prototype.makeRotationFromQuaternion=function(t){var e=this.elements,i=t.x,n=t.y,o=t.z,s=t.w,r=i+i,a=n+n,h=o+o,u=i*r,c=i*a,l=i*h,f=n*a,y=n*h,d=o*h,p=s*r,x=s*a,m=s*h;return e[0]=1-(f+d),e[4]=c-m,e[8]=l+x,e[1]=c+m,e[5]=1-(u+d),e[9]=y-p,e[2]=l-x,e[6]=y+p,e[10]=1-(u+f),e[3]=0,e[7]=0,e[11]=0,e[12]=0,e[13]=0,e[14]=0,e[15]=1,this},r.prototype.multiplyMatrices=function(t,e){var i=t.elements,n=e.elements,o=this.elements,s=i[0],r=i[4],a=i[8],h=i[12],u=i[1],c=i[5],l=i[9],f=i[13],y=i[2],d=i[6],p=i[10],x=i[14],m=i[3],v=i[7],g=i[11],z=i[15],b=n[0],M=n[4],w=n[8],R=n[12],P=n[1],L=n[5],T=n[9],S=n[13],_=n[2],V=n[6],q=n[10],j=n[14],E=n[3],k=n[7],O=n[11],A=n[15];return o[0]=s*b+r*P+a*_+h*E,o[4]=s*M+r*L+a*V+h*k,o[8]=s*w+r*T+a*q+h*O,o[12]=s*R+r*S+a*j+h*A,o[1]=u*b+c*P+l*_+f*E,o[5]=u*M+c*L+l*V+f*k,o[9]=u*w+c*T+l*q+f*O,o[13]=u*R+c*S+l*j+f*A,o[2]=y*b+d*P+p*_+x*E,o[6]=y*M+d*L+p*V+x*k,o[10]=y*w+d*T+p*q+x*O,o[14]=y*R+d*S+p*j+x*A,o[3]=m*b+v*P+g*_+z*E,o[7]=m*M+v*L+g*V+z*k,o[11]=m*w+v*T+g*q+z*O,o[15]=m*R+v*S+g*j+z*A,this},r.prototype.multiply=function(t,e){return void 0!==e?(console.warn("DEPRECATED: Matrix4's .multiply() now only accepts one argument. Use .multiplyMatrices( a, b ) instead."),this.multiplyMatrices(t,e)):this.multiplyMatrices(this,t)},r.prototype.getInverse=function(t,e){var i=this.elements,n=t.elements,o=n[0],s=n[4],r=n[8],a=n[12],h=n[1],u=n[5],c=n[9],l=n[13],f=n[2],y=n[6],d=n[10],p=n[14],x=n[3],m=n[7],v=n[11],g=n[15];i[0]=c*p*m-l*d*m+l*y*v-u*p*v-c*y*g+u*d*g,i[4]=a*d*m-r*p*m-a*y*v+s*p*v+r*y*g-s*d*g,i[8]=r*l*m-a*c*m+a*u*v-s*l*v-r*u*g+s*c*g,i[12]=a*c*y-r*l*y-a*u*d+s*l*d+r*u*p-s*c*p,i[1]=l*d*x-c*p*x-l*f*v+h*p*v+c*f*g-h*d*g,i[5]=r*p*x-a*d*x+a*f*v-o*p*v-r*f*g+o*d*g,i[9]=a*c*x-r*l*x-a*h*v+o*l*v+r*h*g-o*c*g,i[13]=r*l*f-a*c*f+a*h*d-o*l*d-r*h*p+o*c*p,i[2]=u*p*x-l*y*x+l*f*m-h*p*m-u*f*g+h*y*g,i[6]=a*y*x-s*p*x-a*f*m+o*p*m+s*f*g-o*y*g,i[10]=s*l*x-a*u*x+a*h*m-o*l*m-s*h*g+o*u*g,i[14]=a*u*f-s*l*f-a*h*y+o*l*y+s*h*p-o*u*p,i[3]=c*y*x-u*d*x-c*f*m+h*d*m+u*f*v-h*y*v,i[7]=s*d*x-r*y*x+r*f*m-o*d*m-s*f*v+o*y*v,i[11]=r*u*x-s*c*x-r*h*m+o*c*m+s*h*v-o*u*v,i[15]=s*c*f-r*u*f+r*h*y-o*c*y-s*h*d+o*u*d;var z=o*i[0]+h*i[4]+f*i[8]+x*i[12];if(0===z){var b="Matrix4.getInverse(): can't invert matrix, determinant is 0";if(e)throw new Error(b);return console.warn(b),this.identity(),this}return this.multiplyScalar(1/z),this},r.prototype.applyToVector3Array=function(){var t=new s.default;return function(e,i,n){void 0===i&&(i=0),void 0===n&&(n=e.length);for(var o=0,s=i;o1||isNaN(r))){var a=this.start.clone().add(e.clone().multiplyScalar(r));return a.clone().sub(t.start).lengthSq()+a.clone().sub(t.end).lengthSq()<=t.distanceSq()?a:void 0}}}}]),t}();e.default=h;},function(t,e,i){Object.defineProperty(e,"__esModule",{value:!0}),e.Vector3=e.rect=e.quaternion=e.point=e.Plane=e.Matrix4=e.sign=e.radToDeg=e.degToRad=e.clamp=e.lineSegment=e.Line3=void 0;var n=f(i(8)),o=f(i(2)),s=i(0),r=f(i(7)),a=f(i(6)),h=f(i(5)),u=f(i(3)),c=f(i(4)),l=f(i(1));function f(t){return t&&t.__esModule?t:{default:t}}var y={Line3:n.default,lineSegment:o.default,clamp:s.clamp,degToRad:s.degToRad,radToDeg:s.radToDeg,sign:s.sign,Matrix4:r.default,Plane:a.default,point:h.default,quaternion:u.default,rect:c.default,Vector3:l.default};e.Line3=n.default,e.lineSegment=o.default,e.clamp=s.clamp,e.degToRad=s.degToRad,e.radToDeg=s.radToDeg,e.sign=s.sign,e.Matrix4=r.default,e.Plane=a.default,e.point=h.default,e.quaternion=u.default,e.rect=c.default,e.Vector3=l.default,e.default=y;}])});
+
+});
+
+var cornerstoneMath$1 = unwrapExports(cornerstoneMath_min);
+
+var cornerstoneTools_min = createCommonjsModule(function (module, exports) {
+/*! cornerstone-tools - 3.0.0-b.1512 - 2018-12-17 | (c) 2017 Chris Hafey | https://github.com/cornerstonejs/cornerstoneTools */
+!function(e,t){module.exports=t();}(window,function(){return function(e){var t={};function n(a){if(t[a])return t[a].exports;var o=t[a]={i:a,l:!1,exports:{}};return e[a].call(o.exports,o,o.exports,n),o.l=!0,o.exports}return n.m=e,n.c=t,n.d=function(e,t,a){n.o(e,t)||Object.defineProperty(e,t,{configurable:!1,enumerable:!0,get:a});},n.r=function(e){Object.defineProperty(e,"__esModule",{value:!0});},n.n=function(e){var t=e&&e.__esModule?function(){return e.default}:function(){return e};return n.d(t,"a",t),t},n.o=function(e,t){return Object.prototype.hasOwnProperty.call(e,t)},n.p="",n(n.s=10)}([function(e,t){e.exports=function(e){if(void 0===e)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return e};},function(e,t){e.exports=function(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")};},function(e,t){function n(e,t){for(var n=0;n2&&void 0!==arguments[2]?arguments[2]:null;return "function"==typeof window.CustomEvent?n=new CustomEvent(t,{detail:a,cancelable:!0}):(n=document.createEvent("CustomEvent")).initCustomEvent(t,!0,!0,a),e.dispatchEvent(n)}var b={drawColorId:0,radius:10,minRadius:1,maxRadius:50,alpha:.4,renderBrushIfHiddenButActive:!0,hiddenButActiveAlpha:.2,colorMapId:"BrushColorMap",visibleSegmentations:{},imageBitmapCache:{},segmentationMetadata:{}},E={radius:function(e){b.radius=Math.min(Math.max(e,b.minRadius),b.maxRadius);},brushColorMap:function(e){var t=f.cornerstone.colors.getColormap(b.colorMapId);t.setNumberOfColors(e.length);for(var n=0;n2&&void 0!==arguments[2])||arguments[2];b.visibleSegmentations[e]||(b.imageBitmapCache[e]=[]),b.visibleSegmentations[e][t]=n;},imageBitmapCacheForElement:function(e,t,n){b.imageBitmapCache[e]||(b.imageBitmapCache[e]=[]),b.imageBitmapCache[e][t]=n;},clearImageBitmapCacheForElement:function(e){b.imageBitmapCache[e]=[];},metadata:function(e,t,n){b.segmentationMetadata[e]||(b.segmentationMetadata[e]=[]),b.segmentationMetadata[e][t]=n;}};var M={state:b,onRegisterCallback:function(){!function(){var e=f.cornerstone.colors.getColormap(b.colorMapId);e.setNumberOfColors(19);for(var t=0;t<19;t++)t0}).forEach(function(t){var n=!1;t.supportedInteractionTypes.forEach(function(e){t.options["is".concat(e,"Active")]&&(n=!0);}),n||(console.info("Setting tool ".concat(t.name,"'s to PASSIVE")),N(e,t.name));});}(e,o,n,a),o.supportedInteractionTypes.forEach(function(e){void 0===a||a.includes(e)?n["is".concat(e,"Active")]=!0:n["is".concat(e,"Active")]=!1;})),F("active",null,e,t,n);},L=function(e,t,n){z("active",e,t,n),_.state.enabledElements.forEach(function(a){D(a,e,t,n);});},A=F.bind(null,"disabled",null),H=V.bind(null,"disabled",null),R=F.bind(null,"enabled",null),U=V.bind(null,"enabled",null),N=F.bind(null,"passive",x.TOOL_DEACTIVATED),B=V.bind(null,"passive",x.TOOL_DEACTIVATED);function F(e,t,n,a,o){var i=O(n,a);i?(o=G(o),Array.isArray(o.mouseButtonMask)&&0!==o.mouseButtonMask.length&&Array.isArray(i.options.mouseButtonMask)&&(o.mouseButtonMask=o.mouseButtonMask.concat(i.options.mouseButtonMask)),i.mode=e,i.mergeOptions(o),i["".concat(e,"Callback")]&&i["".concat(e,"Callback")](n,o),t&&T(n,t,{options:o,toolName:a,type:t})):console.warn("Unable to find tool '".concat(a,"' for enabledElement"));}function V(e,t,n,a){z(e,n,a),_.state.enabledElements.forEach(function(o){F(e,t,o,n,a);});}function j(e,t,n,a){var o=_.state.tools.find(function(t){return t.element===n&&"active"===t.mode&&!0===t.options["is".concat(e,"Active")]});o&&(console.info("Setting tool ".concat(o.name,"'s is").concat(e,"Active to false")),o.options["is".concat(e,"Active")]=!1);}function z(e,t,n,a){if(_.modules.globalConfiguration.state.globalToolSyncEnabled){var o={mode:e,args:[t,n]};a&&o.push(a),_.state.globalToolChangeHistory.push(o);_.state.globalToolChangeHistory.length>50&&_.state.globalToolChangeHistory.shift();var i=_.state.globalTools[t];if("active"===e){var r=function(e,t,n){void 0===n&&Array.isArray(t)&&(n=t,t=null);var a=[],o=_.state.globalTools[e];if(o){var i=new o.tool(o.configuration);i.supportedInteractionTypes.forEach(function(e){if(void 0===n||n.includes(e))if("Mouse"===e){var o=G(t).mouseButtonMask;Array.isArray(o)&&o.length>0?o.forEach(function(t){return a.push("".concat(e,"-").concat(t))}):Array.isArray(o)&&0===o.length&&a.push("".concat(e,"-DELETE"));}else"MultiTouch"===e?a.push("".concat(e,"-").concat(i.configuration.touchPointers)):a.push(e);});}return a}(t,n,a);Object.keys(_.state.globalTools).forEach(function(e){var t=_.state.globalTools[e];t.activeBindings=t.activeBindings.filter(function(e){return !r.includes(e)});}),r.some(function(e){return e.includes("Mouse-DELETE")})&&(i.activeBindings=i.activeBindings.filter(function(e){return !e.includes("Mouse")}),r=r.filter(function(e){return !e.includes("Mouse")})),i.activeBindings=i.activeBindings.concat(r);}else i.activeBindings=[];}}var W={Mouse:function(e,t,n){var a=G(n).mouseButtonMask;if(Array.isArray(a)&&a.length>0){var o=_.state.tools.find(function(e){return e.element===t&&"active"===e.mode&&!0===e.options.isMouseActive&&Array.isArray(e.options.mouseButtonMask)&&e.options.mouseButtonMask.some(function(e){return a.includes(e)})});o&&(o.options.mouseButtonMask=o.options.mouseButtonMask.filter(function(e){return !a.includes(e)}),0===o.options.mouseButtonMask.length&&(o.options.isMouseActive=!1));}},MouseWheel:j.bind(void 0,"MouseWheel"),Touch:function(e,t,n){var a=_.state.tools.find(function(e){return e.element===t&&"active"===e.mode&&!0===e.options.isTouchActive}),o=_.state.tools.find(function(e){return e.element===t&&"active"===e.mode&&!0===e.options.isMultiTouchActive&&1===e.configuration.touchPointers});a&&(console.info("Setting tool ".concat(a.name,"'s isTouchActive to false")),a.options.isTouchActive=!1),o&&(console.info("Setting tool ".concat(o.name,"'s isTouchActive to false")),o.options.isMultiTouchActive=!1);},TouchPinch:j.bind(void 0,"TouchPinch"),TouchRotate:j.bind(void 0,"TouchRotate"),DoubleTap:j.bind(void 0,"DoubleTap"),MultiTouch:function(e,t,n){var a,o=_.state.tools.find(function(n){return n.element===t&&"active"===n.mode&&!0===n.options.isMultiTouchActive&&n.configuration.touchPointers===e.configuration.touchPointers});1===e.configuration.touchPointers&&(a=_.state.tools.find(function(e){return e.element===t&&"active"===e.mode&&!0===e.options.isTouchActive})),o&&(console.info("Setting tool ".concat(o.name,"'s isMultiTouchActive to false")),o.options.isMultiTouchActive=!1),a&&(console.info("Setting tool ".concat(a.name,"'s isTouchActive to false")),a.options.isTouchActive=!1);}};function G(e){if(e!==Object(e)||Array.isArray(e))if("number"==typeof e){var t=[];t.push(e),e={mouseButtonMask:0===e?[]:t};}else null===e?e={mouseButtonMask:[]}:(console.info("No options provided when changing tool mode"),e={});else if(0===e.mouseButtonMask||null===e.mouseButtonMask)e.mouseButtonMask=[];else if("number"==typeof e.mouseButtonMask){var n=[];n.push(e.mouseButtonMask),e.mouseButtonMask=n;}return e}var q={activeOrDisabledBinaryTool:{passiveCallback:function(e){A(e,this.name);},enabledCallback:function(e){D(e,this.name);}},enabledOrDisabledBinaryTool:{passiveCallback:function(e){A(e,this.name);},activeCallback:function(e){R(e,this.name);}}},Y=function(){function e(){var t=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{},n=t.name,a=t.strategies,i=t.defaultStrategy,r=t.configuration,s=t.supportedInteractionTypes,l=t.mixins;o()(this,e),this.name=n,this.mode="disabled",this.element=void 0,this.supportedInteractionTypes=s||[],this.strategies=a||{},this.defaultStrategy=i||Object.keys(this.strategies)[0]||void 0,this.activeStrategy=this.defaultStrategy,this._options={},this._configuration=Object.assign({},r),this.hasCursor=!1,l&&l.length&&this._applyMixins(l);}return r()(e,[{key:"mergeOptions",value:function(e){this._options=Object.assign({},this._options,e);}},{key:"clearOptions",value:function(){this._options={};}},{key:"applyActiveStrategy",value:function(e){return this.strategies[this.activeStrategy](e,this.configuration)}},{key:"_applyMixins",value:function(e){for(var t=0;t4&&void 0!==arguments[4]?arguments[4]:{}),i=arguments.length>5&&void 0!==arguments[5]?arguments[5]:"mouse";o=Object.assign({deleteIfHandleOutsideImage:S.deleteIfHandleOutsideImage,preventHandleOutsideImage:S.preventHandleOutsideImage},o);var r=function(e,t){var n=arguments.length>2&&void 0!==arguments[2]?arguments[2]:{},a=arguments.length>3?arguments[3]:void 0,o=a.detail,i=o.element,r=o.image,s=a.detail.deltaPoints.image,l=s.x,c=s.y;t.active=!0;for(var u=Object.keys(t.handles),d=0;d2&&void 0!==arguments[2]?arguments[2]:{},a=arguments.length>3?arguments[3]:void 0,o=arguments.length>4?arguments[4]:void 0,i=o.dragHandler,r=o.upOrEndHandler,s=arguments.length>5?arguments[5]:void 0,l=s.detail,c=s.detail.element;t.active=!1,t.invalidated=!0,S.isToolLocked=!1,ce[a].forEach(function(e){c.removeEventListener(e,i);}),ue[a].forEach(function(e){c.removeEventListener(e,r);}),n.deleteIfHandleOutsideImage&&re(l,t.handles)&&$(c,e,t);"function"==typeof n.doneMovingCallback&&n.doneMovingCallback();f.cornerstone.updateImage(c);}(t,n,o,i,{dragHandler:r,upOrEndHandler:e},a);};n.active=!0,S.isToolLocked=!0,ce[i].forEach(function(e){a.addEventListener(e,r);}),ue[i].forEach(function(e){a.addEventListener(e,s);});};var he={value:!1},ve={mouse:[x.MOUSE_DRAG],touch:[x.TOUCH_DRAG]},ge={mouse:[x.MOUSE_UP,x.MOUSE_CLICK],touch:[x.TOUCH_END,x.TOUCH_DRAG_END,x.TOUCH_PINCH,x.TOUCH_PRESS,x.TAP]},me=function(e,t,n,a){var o=arguments.length>4&&void 0!==arguments[4]?arguments[4]:{},i=arguments.length>5&&void 0!==arguments[5]?arguments[5]:"mouse";o=Object.assign({deleteIfHandleOutsideImage:S.deleteIfHandleOutsideImage,preventHandleOutsideImage:S.preventHandleOutsideImage},o);var r=e.element,s=function(e,t,n,a,o,i){var r=i.detail,s=r.image,l=r.currentPoints,c=r.element,u=l.page,d=f.cornerstone.pageToPixel(c,u.x,"touch"===o?u.y+-57:u.y);!1===n.hasMoved&&(n.hasMoved=!0);he.value=!1,n.active=!0,n.x=d.x,n.y=d.y,a.preventHandleOutsideImage&&le(n,s);f.cornerstone.updateImage(c);var h=x.MEASUREMENT_MODIFIED;T(c,h,{toolName:e,element:c,measurementData:t});}.bind(this,t,n,a,o,i),l=function r(l){!function(e,t,n,a){var o=arguments.length>4&&void 0!==arguments[4]?arguments[4]:{},i=arguments.length>5?arguments[5]:void 0,r=arguments.length>6?arguments[6]:void 0,s=r.dragHandler,l=r.upOrEndHandler,c=arguments.length>7?arguments[7]:void 0,u=t.currentPoints.image,d=c.detail.element;a.active=!1,n.active=!1,n.invalidated=!0,S.isToolLocked=!1,he.value=!1,ve[i].forEach(function(e){d.removeEventListener(e,s);}),ge[i].forEach(function(e){d.removeEventListener(e,l);}),o.deleteIfHandleOutsideImage&&re(t,n.handles)&&$(d,e,n);c.type===x.TOUCH_PRESS&&(c.detail.handlePressed=n,a.x=u.x,a.y=u.y);"function"==typeof o.doneMovingCallback&&o.doneMovingCallback();f.cornerstone.updateImage(d);}(t,e,n,a,o,i,{dragHandler:s,upOrEndHandler:r},l);};if(a.active=!0,n.active=!0,S.isToolLocked=!0,ve[i].forEach(function(e){r.addEventListener(e,s);}),ge[i].forEach(function(e){r.addEventListener(e,l);}),"touch"===i){he.value=!0;var c=f.cornerstone.getEnabledElement(r),u={x:e.currentPoints.page.x,y:e.currentPoints.page.y+-57},d=f.cornerstone.pageToPixel(r,u.x,u.y);!function e(t,n,a,o){if(!n.value)return;var i=Math.abs(t.y-o.y);var r=i/10;if(i<1)return t.y=o.y,void(n.value=!1);t.y>o.y?t.y-=r:t.y5&&void 0!==arguments[5]?arguments[5]:"mouse";o=Object.assign({deleteIfHandleOutsideImage:S.deleteIfHandleOutsideImage,preventHandleOutsideImage:S.preventHandleOutsideImage},o);var r=e.element;S.isToolLocked=!0,a.active=!0,n.active=!0;var s=function(e,t,n,a,o,i){var r=i.detail,s=r.currentPoints,l=r.image,c=r.element,u=s.page,d=f.cornerstone.pageToPixel(c,"touch"===o?u.x+-57:u.x,"touch"===o?u.y+-57:u.y);n.active=!0,n.x=d.x,n.y=d.y,a&&a.preventHandleOutsideImage&&le(n,l);f.cornerstone.updateImage(c);var h=x.MEASUREMENT_MODIFIED;T(c,h,{toolName:e,element:c,measurementData:t});}.bind(this,t,n,a,o,i),l=function e(r){!function(e,t,n,a,o,i,r){var s=i.moveHandler,l=i.moveEndHandler,c=r.detail,u=c.element,d=c.currentPoints.page,h=f.cornerstone.pageToPixel(u,"touch"===o?d.x+-57:d.x,"touch"===o?d.y+-57:d.y);if(n.active=!1,t.active=!1,S.isToolLocked=!1,n.x=h.x,n.y=h.y,fe[o].forEach(function(e){u.removeEventListener(e,s);}),pe[o].forEach(function(e){u.removeEventListener(e,l);}),u.removeEventListener(x.TOUCH_START,xe),r.type===x.TOUCH_PINCH||r.type===x.TOUCH_PRESS)return n.active=!1,f.cornerstone.updateImage(u),void("function"==typeof a.doneMovingCallback&&a.doneMovingCallback());a.preventHandleOutsideImage&&le(n,r.detail.image);a.deleteIfHandleOutsideImage&&re(r.detail,t.handles)&&$(u,e,t);"function"==typeof a.doneMovingCallback&&a.doneMovingCallback();f.cornerstone.updateImage(u);}(t,n,a,o,i,{moveHandler:s,moveEndHandler:e},r);};fe[i].forEach(function(e){r.addEventListener(e,s);}),pe[i].forEach(function(e){r.addEventListener(e,l);}),r.addEventListener(x.TOUCH_START,xe);};function xe(e){return e.stopImmediatePropagation(),!1}var Te=function(e,t,n,a,o){n.active=!0,S.isToolLocked=!0,me(e.detail,t.name,n,a,t.options,o),e.stopImmediatePropagation(),e.stopPropagation(),e.preventDefault();},be=function(e,t,n,a){for(var o=arguments.length>4&&void 0!==arguments[4]?arguments[4]:"mouse",i=0;i3&&void 0!==arguments[3]?arguments[3]:"mouse",o=Object.assign({},{doneMovingCallback:function(){n.active=!1,S.isToolLocked=!1;}},t.options);n.active=!0,S.isToolLocked=!0,de(e.detail,t.name,n,null,o,a),e.stopImmediatePropagation(),e.stopPropagation(),e.preventDefault();},Me=function(e){function t(e){var n=e.name,a=e.strategies,i=e.defaultStrategy,r=e.configuration,s=e.supportedInteractionTypes,c=e.mixins;return o()(this,t),l()(this,u()(t).call(this,{name:n,strategies:a,defaultStrategy:i,configuration:r,supportedInteractionTypes:s,mixins:c}))}return h()(t,e),r()(t,[{key:"createNewMeasurement",value:function(e){throw new Error("Method createNewMeasurement not implemented for ".concat(this.name,"."))}},{key:"pointNearTool",value:function(e,t,n){throw new Error("Method pointNearTool not implemented for ".concat(this.name,"."))}},{key:"distanceFromPoint",value:function(e,t,n){throw new Error("Method distanceFromPoint not implemented for ".concat(this.name,"."))}},{key:"renderToolData",value:function(e){throw new Error("renderToolData not implemented for ".concat(this.name,"."))}},{key:"mouseMoveCallback",value:function(e){for(var t=e.detail,n=t.element,a=t.currentPoints.canvas,o=Q(n,this.name),i=!1,r=0;r3&&void 0!==arguments[3]?arguments[3]:"mouse";Te(e,this,t,n,a);}},{key:"toolSelectedCallback",value:function(e,t){var n=arguments.length>2&&void 0!==arguments[2]?arguments[2]:"mouse";Ee(e,this,t,n);}}]),t}(Y),Ce=1,we=2;var Ie={setToolWidth:function(e){Ce=e;},getToolWidth:function(){return Ce},setActiveWidth:function(e){we=e;},getActiveWidth:function(){return we}},Se="white",ke="greenyellow",Pe="transparent";var _e={setFillColor:function(e){Pe=e;},getFillColor:function(){return Pe},setToolColor:function(e){Se=e;},getToolColor:function(){return Se},setActiveColor:function(e){ke=e;},getActiveColor:function(){return ke},getColorIfActive:function(e){return e.color?e.color:e.active?ke:Se}},Oe=function(e,t){e.save(),t(e),e.restore();},De=function(e){var t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{},n=arguments.length>2?arguments[2]:void 0,a=t.color,o=t.lineWidth,i=t.fillStyle,r=t.lineDash;e.beginPath(),e.strokeStyle=a||e.strokeStyle,e.lineWidth=o||void 0===o&&Ie.getToolWidth()||e.lineWidth,r&&e.setLineDash(r),n(e),i&&(e.fillStyle=i,e.fill()),e.stroke(),r&&e.setLineDash([]);};function Le(e,t,n,a,o){var i=arguments.length>5&&void 0!==arguments[5]?arguments[5]:"pixel";De(e,o,function(e){"pixel"===i&&(n=f.cornerstone.pixelToCanvas(t,n),a=f.cornerstone.pixelToCanvas(t,a)),e.moveTo(n.x,n.y),e.lineTo(a.x,a.y);});}var Ae=function(e,t,n,a,o){var i=arguments.length>5&&void 0!==arguments[5]?arguments[5]:"pixel";De(e,o,function(e){"pixel"===i&&(n=f.cornerstone.pixelToCanvas(t,n),a=a.map(function(e){return f.cornerstone.pixelToCanvas(t,e)})),e.moveTo(n.x,n.y),a.forEach(function(t){var n=t.x,a=t.y;e.lineTo(n,a);});});},He=function(e,t,n,a,o){var i=Math.atan2(n.y-t.y,n.x-t.x),r={color:a,lineWidth:o};Le(e,void 0,t,n,r,"canvas"),r={color:a,lineWidth:o,fillStyle:a};var s=[{x:n.x-10*Math.cos(i-Math.PI/7),y:n.y-10*Math.sin(i-Math.PI/7)},{x:n.x-10*Math.cos(i+Math.PI/7),y:n.y-10*Math.sin(i+Math.PI/7)},n];Ae(e,void 0,n,s,r,"canvas");},Re=function(e,t,n,a,o){"pixel"===(arguments.length>5&&void 0!==arguments[5]?arguments[5]:"pixel")&&(n=f.cornerstone.pixelToCanvas(t,n)),De(e,o,function(e){e.arc(n.x,n.y,a,0,2*Math.PI);});},Ue=function(e,t,n,a,o){"pixel"===(arguments.length>5&&void 0!==arguments[5]?arguments[5]:"pixel")&&(n=f.cornerstone.pixelToCanvas(t,n),a=f.cornerstone.pixelToCanvas(t,a));var i=Math.min(n.x,a.x),r=Math.min(n.y,a.y),s=Math.abs(n.x-a.x),l=Math.abs(n.y-a.y),c=s/2*.5522848,u=l/2*.5522848,d=i+s,h=r+l,v=i+s/2,g=r+l/2;De(e,o,function(e){e.moveTo(i,g),e.bezierCurveTo(i,g-u,v-c,r,v,r),e.bezierCurveTo(v+c,r,d,g-u,d,g),e.bezierCurveTo(d,g+u,v+c,h,v,h),e.bezierCurveTo(v-c,h,i,g+u,i,g),e.closePath();});},Ne=function(e,t,n){var a=arguments.length>3&&void 0!==arguments[3]?arguments[3]:{},o=t.element,i=_e.getToolColor();e.strokeStyle=a.color||i;for(var r=Object.keys(n),s=function(t){var i=r[t],s=n[i];if(!0===s.drawnIndependently)return "continue";if(!0===a.drawHandlesIfActive&&!s.active)return "continue";var l=s.active?Ie.getActiveWidth():Ie.getToolWidth(),c=a.fill;De(e,{lineWidth:l,fillStyle:c},function(e){var t=f.cornerstone.pixelToCanvas(o,s),n=s.radius||a.handleRadius||S.handleRadius;e.arc(t.x,t.y,n,0,2*Math.PI);});},l=0;l0?f.cornerstoneMath.point.findClosestPoint(e,t):t,s=[{x:n.left+n.width/2,y:n.top},{x:n.left,y:n.top+n.height/2},{x:n.left+n.width/2,y:n.top+n.height},{x:n.left+n.width,y:n.top+n.height/2}];Le(a,void 0,r,f.cornerstoneMath.point.findClosestPoint(s,r),{color:o,lineWidth:i,lineDash:[2,3]},"canvas");},Fe=15,Ve="".concat(Fe,"px Arial"),je="transparent";var ze={setFont:function(e){Ve=e;},getFont:function(){return Ve},setFontSize:function(e){Fe=e;},getFontSize:function(){return Fe},setBackgroundColor:function(e){je=e;},getBackgroundColor:function(){return je}},We=function(e,t,n,a,o){var i=ze.getFontSize();e.font=ze.getFont(),e.textBaseline="top",e.fillStyle=a,n.forEach(function(n,a){e.fillText(n,t.left+o,t.top+o+a*(i+o));});},Ge=function(e,t,n){e.fillStyle=n,e.fillRect(t.left,t.top,t.width,t.height);};function qe(e,t,n){var a=ze.getFont(),o=e.font;a&&a!==o&&(e.font=a);var i=e.measureText(t).width;return a&&a!==o&&(e.font=o),i+2*n}var Ye=function(e,t,n,a,o,i){"[object Array]"!==Object.prototype.toString.call(t)&&(t=[t]);var r=ze.getFontSize(),s=ze.getBackgroundColor(),l=0;t.forEach(function(t){var n=qe(e,t,5);l=Math.max(l,n);});var c={width:l,height:5+t.length*(r+5)};return Oe(e,function(e){e.strokeStyle=o,i&&i.centering&&!0===i.centering.x&&(n-=c.width/2),i&&i.centering&&!0===i.centering.y&&(a-=c.height/2),c.left=n,c.top=a;var r=i&&!0===i.debug?"#FF0000":s;Ge(e,c,r),We(e,c,t,o,5);}),c},Xe=function(e,t,n,a,o,i,r,s,l,c){var u=f.cornerstone,d=u.pixelToCanvas(t,n);l&&(d.x+=l);var h={centering:{x:!1,y:c}};if(n.boundingBox=Ye(e,a,d.x,d.y,r,h),n.hasMoved){var v=i(o).map(function(e){return u.pixelToCanvas(t,e)});Be(v,d,n.boundingBox,e,r,s);}},Ke=function(e,t,n,a,o){if("pixel"===(arguments.length>5&&void 0!==arguments[5]?arguments[5]:"pixel")){var i=f.cornerstone;n=i.pixelToCanvas(t,n),a=i.pixelToCanvas(t,a);}var r=Math.min(n.x,a.x),s=Math.min(n.y,a.y),l=Math.abs(n.x-a.x),c=Math.abs(n.y-a.y);De(e,o,function(e){e.rect(r,s,l,c);});},Ze=function(e){var t=e.getContext("2d");return t.setTransform(1,0,0,1,0,0),t},Je=function(e,t){return void 0===e?t:e},Qe=function(e){var t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{};t.shadow&&(e.shadowColor=Je(t.shadowColor,"#000000"),e.shadowBlur=Je(t.shadowBlur,0),e.shadowOffsetX=Je(t.shadowOffsetX,1),e.shadowOffsetY=Je(t.shadowOffsetY,1));},$e=function(e,t,n){if(n.vflip||n.vflip||n.rotation){var a={x:t.width/2+n.translation.x*n.scale,y:t.height/2+n.translation.y*n.scale};e.translate(a.x,a.y),n.rotation&&e.rotate(n.rotation*Math.PI/180),n.vflip&&e.scale(1,-1),n.hflip&&e.scale(-1,1),e.translate(-a.x,-a.y);}},et=function(e){e.setTransform(1,0,0,1,0,0);},tt=function(e,t,n,a){var o=f.cornerstone,i={start:o.pixelToCanvas(e,t),end:o.pixelToCanvas(e,n)};return f.cornerstoneMath.lineSegment.distanceToPoint(i,a)},nt=function(e,t){var n=Math.pow(10,t);return Math.round(e*n)/n};function at(e){return Math.sqrt(Math.pow(e.x,2)+Math.pow(e.y,2))}var ot=function(e){function t(){var e,n=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{};o()(this,t);var a=Object.assign({name:"Angle",supportedInteractionTypes:["Mouse","Touch"]},n);return (e=l()(this,u()(t).call(this,a))).initialConfiguration=a,e.preventNewMeasurement=!1,e}return h()(t,e),r()(t,[{key:"createNewMeasurement",value:function(e){return {visible:!0,active:!0,color:void 0,handles:{start:{x:e.currentPoints.image.x,y:e.currentPoints.image.y,highlight:!0,active:!1},middle:{x:e.currentPoints.image.x,y:e.currentPoints.image.y,highlight:!0,active:!0},end:{x:e.currentPoints.image.x,y:e.currentPoints.image.y,highlight:!0,active:!1},textBox:{active:!1,hasMoved:!1,movesIndependently:!1,drawnIndependently:!0,allowedOutsideImage:!0,hasBoundingBox:!0}}}}},{key:"pointNearTool",value:function(e,t,n){return !1!==t.visible&&(tt(e,t.handles.start,t.handles.middle,n)<25||tt(e,t.handles.middle,t.handles.end,n)<25)}},{key:"renderToolData",value:function(e){var t=this,n=e.detail,a=n.enabledElement,o=this.configuration,i=o.handleRadius,r=o.drawHandlesOnHover,s=Q(e.currentTarget,this.name);if(s)for(var l=Ze(n.canvasContext.canvas),c=Ie.getToolWidth(),u=function(e){var o=s.data[e];if(!1===o.visible)return "continue";Oe(l,function(e){Qe(e,t.configuration);var s=_e.getColorIfActive(o),l=f.cornerstone.pixelToCanvas(n.element,o.handles.start),u=f.cornerstone.pixelToCanvas(n.element,o.handles.middle);Ae(e,n.element,o.handles.start,[o.handles.middle,o.handles.end],{color:s});var d={color:s,handleRadius:i,drawHandlesIfActive:r};Ne(e,n,o.handles,d);var v=n.image.columnPixelSpacing||1,g=n.image.rowPixelSpacing||1,m={x:(o.handles.middle.x-o.handles.start.x)*v,y:(o.handles.middle.y-o.handles.start.y)*g},p={x:(o.handles.end.x-o.handles.middle.x)*v,y:(o.handles.end.y-o.handles.middle.y)*g},y={x:(o.handles.end.x-o.handles.start.x)*v,y:(o.handles.end.y-o.handles.start.y)*g},x=at(m),T=at(p),b=at(y),E=Math.acos((Math.pow(x,2)+Math.pow(T,2)-Math.pow(b,2))/(2*x*T));if(E*=180/Math.PI,o.rAngle=nt(E,2),o.rAngle){var M,C=function(e,t,n){var a=t&&n?"":" (isotropic)";return e.rAngle.toString()+String.fromCharCode(parseInt("00B0",16))+a}(o,n.image.rowPixelSpacing,n.image.columnPixelSpacing);if(!o.handles.textBox.hasMoved){M={x:u.x,y:u.y};var w=qe(e,C,5);u.x0&&void 0!==arguments[0]?arguments[0]:{};o()(this,t);var a={name:"ArrowAnnotate",supportedInteractionTypes:["Mouse","Touch"],configuration:{getTextCallback:rt,changeTextCallback:st,drawHandles:!1,drawHandlesOnHover:!0,arrowFirst:!0}},i=Object.assign(a,n);return (e=l()(this,u()(t).call(this,i))).initialConfiguration=i,e.preventNewMeasurement=!1,e}return h()(t,e),r()(t,[{key:"createNewMeasurement",value:function(e){return {visible:!0,active:!0,color:void 0,handles:{start:{x:e.detail.currentPoints.image.x,y:e.detail.currentPoints.image.y,highlight:!0,active:!1},end:{x:e.detail.currentPoints.image.x,y:e.detail.currentPoints.image.y,highlight:!0,active:!1},textBox:{active:!1,hasMoved:!1,movesIndependently:!1,drawnIndependently:!0,allowedOutsideImage:!0,hasBoundingBox:!0}}}}},{key:"pointNearTool",value:function(e,t,n){return !1!==t.visible&&tt(e,t.handles.start,t.handles.end,n)<25}},{key:"renderToolData",value:function(e){var t=this,n=e.detail,a=n.element,o=n.enabledElement,i=this.configuration,r=i.handleRadius,s=i.drawHandlesOnHover,l=Q(a,this.name);if(l)for(var c=e.detail.canvasContext.canvas,u=Ze(c),d=Ie.getToolWidth(),h=function(n){var i=l.data[n];if(!1===i.visible)return "continue";Oe(u,function(n){Qe(n,t.configuration);var l=_e.getColorIfActive(i),c=f.cornerstone.pixelToCanvas(a,i.handles.start),u=f.cornerstone.pixelToCanvas(a,i.handles.end);t.configuration.arrowFirst?He(n,u,c,l,d):He(n,c,u,l,d);var h={color:l,handleRadius:r,drawHandlesIfActive:s};t.configuration.drawHandles&&Ne(n,e.detail,i.handles,h);var v=function(e){return e.text}(i);if(v&&""!==v){var m=qe(n,v,5),p=ze.getFontSize()+10,y=Math.max(m,p)/2+5;if(u.x3&&void 0!==arguments[3]?arguments[3]:{};return Object.assign({x:e,y:t,index:n,drawnIndependently:!1,allowedOutsideImage:!1,highlight:!0,active:!1},a)},ht=function(e){var t=e.currentPoints.image,n=t.x,a=t.y;return {toolType:this.name,isCreating:!0,visible:!0,active:!0,handles:{start:dt(n,a,0),end:dt(n,a,1,{active:!0}),perpendicularStart:dt(n,a,2,{locked:!0}),perpendicularEnd:dt(n,a,3),textBox:dt(n-50,a-70,null,{highlight:!1,hasMoved:!0,active:!1,movesIndependently:!1,drawnIndependently:!0,allowedOutsideImage:!0,hasBoundingBox:!0})},longestDiameter:0,shortestDiameter:0}},vt=function(e,t,n){var a=arguments.length>3&&void 0!==arguments[3]?arguments[3]:"mouse",o=f.cornerstone,i=f.cornerstoneMath,r=t.handles,s={start:o.pixelToCanvas(e,r.start),end:o.pixelToCanvas(e,r.end)},l=i.lineSegment.distanceToPoint(s,n);if(ne(r.textBox,n))return !0;var c="mouse"===a?S.clickProximity:S.touchProximity;return !!function(e,t,n,a){var o=f.cornerstone,i=f.cornerstoneMath,r={start:o.pixelToCanvas(e,t.perpendicularStart),end:o.pixelToCanvas(e,t.perpendicularEnd)};return i.lineSegment.distanceToPoint(r,n)u){var g=u;u=v,v=g;}e.longestDiameter=u.toFixed(1),e.shortestDiameter=v.toFixed(1);},ft=function(e,t,n){var a=" mm";return t&&n||(a=" pixels"),[" L ".concat(e.longestDiameter).concat(a)," W ".concat(e.shortestDiameter).concat(a)]},pt=function(e,t){var n=this,a=e.detail,o=a.element,i=a.image,r=this.configuration;if(!yt(i)){var s=this.createNewMeasurement(a),l=function(){s.active=!1,f.cornerstone.updateImage(o);};J(o,this.name,s),f.cornerstone.updateImage(o);var c=(new Date).getTime(),u=s.handles,d=u.end,h=u.perpendicularStart;ye(a,this.name,s,d,{doneMovingCallback:function(){var e=s.handles,t=s.longestDiameter,i=s.shortestDiameter,u=re(a,e),d=parseFloat(t)||0,v=parseFloat(i)||0,g=d<1||v<1,m=(new Date).getTime()-c<150;u||g||m?(s.cancelled=!0,$(o,n.name,s)):r.getMeasurementLocationCallback(s,a,l),h.locked=!1,f.cornerstone.updateImage(o);}},t);}},yt=function(e){var t=f.cornerstone.metaData.get("imagePlaneModule",e.imageId),n=e.rowPixelSpacing,a=e.columnPixelSpacing;return t&&(n=t.rowPixelSpacing||t.rowImagePixelSpacing,a=t.columnPixelSpacing||t.colImagePixelSpacing),!n||!a};var xt={setCoords:function(e){lt=e.currentPoints.canvas;},getCoords:function(){return lt}},Tt=function(e){var t=this,n=e.detail,a=n.element;xt.setCoords(n);var o=Q(a,this.name);if(o){for(var i=!1,r=function(e){var r=n.currentPoints.canvas,s=o.data[e],l=function(e,t,n){var a=arguments.length>3&&void 0!==arguments[3]?arguments[3]:6,o=oe(e,t,n,a),i=!1;return Object.keys(t).forEach(function(e){if("textBox"!==e){var n=t[e],a=n===o;n.active!==a&&(i=!0),n.active=a;}}),i}(a,s.handles,r);Object.keys(s.handles).forEach(function(e){if("textBox"!==e){var t=s.handles[e];t.hover=t.active;}}),l&&(i=!0);var c=t.pointNearTool(a,s,r,"mouse"),u=c&&!s.active,d=!c&&s.active;(u||d)&&(s.active=!s.active,i=!0);},s=0;sn(e,i)?(r.x=y+u*g,r.y=x-u*v,s.x=r.x-d*g,s.y=r.y+d*v):(r.x=m+u*g,r.y=p-u*v,s.x=r.x-d*g,s.y=r.y+d*v)),!0}(u,n)||(t.currentPoints.image.x=n.handles.perpendicularStart.x,t.currentPoints.image.y=n.handles.perpendicularStart.y)):3===e.index&&(o=!1,l.start={x:n.handles.start.x,y:n.handles.start.y},l.end={x:n.handles.end.x,y:n.handles.end.y},c.start={x:n.handles.perpendicularStart.x,y:n.handles.perpendicularStart.y},c.end={x:u.x,y:u.y},(i=f.cornerstoneMath.lineSegment.intersectLine(l,c))||(c.end={x:n.handles.perpendicularEnd.x,y:n.handles.perpendicularEnd.y},i=f.cornerstoneMath.lineSegment.intersectLine(l,c),r=f.cornerstoneMath.point.distance(i,n.handles.start),s=f.cornerstoneMath.point.distance(i,n.handles.end),(!i||r<3||s<3)&&(o=!0)),o||function(e,t){var n=f.cornerstoneMath.point.distance,a=t.handles,o=a.start,i=a.end,r=a.perpendicularStart,s=a.perpendicularEnd,l=r,c=f.cornerstoneMath.lineSegment.distanceToPoint(t.handles,l),u=f.cornerstoneMath.lineSegment.distanceToPoint(t.handles,e),d=c+u;if(n(l,e)<=c)return !1;var h=n(o,i),v=(o.x-i.x)/h,g=(o.y-i.y)/h,m=o.x-1*v,p=o.y-1*g,y=i.x+1*v,x=i.y+1*g;r.x=e.x+d*g,r.y=e.y-d*v,s.x=e.x,s.y=e.y,s.locked=!1,r.locked=!1;var T={start:{x:o.x,y:o.y},end:{x:i.x,y:i.y}},b={start:{x:r.x,y:r.y},end:{x:s.x,y:s.y}};return f.cornerstoneMath.lineSegment.intersectLine(T,b)||(n(e,o)>n(e,i)?(s.x=y-u*g,s.y=x+u*v,r.x=s.x+d*g,r.y=s.y-d*v):(s.x=m-u*g,s.y=p+u*v,r.x=s.x+d*g,r.y=s.y-d*v)),!0}(u,n)||(t.currentPoints.image.x=n.handles.perpendicularEnd.x,t.currentPoints.image.y=n.handles.perpendicularEnd.y));},Et=function(e,t,n){var a=e[n],o=t[n];e[n]=o,t[n]=a;},Mt=function(e,t){Et(e,t,"x"),Et(e,t,"y"),Et(e,t,"moving"),Et(e,t,"hover"),Et(e,t,"active"),Et(e,t,"selected");};var Ct=function(e){var t,n=this,a=e.detail,o=a.element,i=S.clickProximity,r=function(e){t.invalidated=!0,re(a,t.handles)&&$(o,n.name,t),e&&(e.moving=!1,e.selected=!0),o.style.cursor="",f.cornerstone.updateImage(o),o.addEventListener(x.MOUSE_MOVE,n._moveCallback),o.addEventListener(x.TOUCH_START,n._moveCallback);},s=a.startPoints.canvas,l=Q(e.currentTarget,this.name);if(l){for(var c=function(c){t=l.data[c];var u=[o,t.handles,s,i],d=oe.apply(void 0,u);if(d)return o.removeEventListener(x.MOUSE_MOVE,n._moveCallback),o.removeEventListener(x.TOUCH_START,n._moveCallback),t.active=!0,wt(t.handles),d.moving=!0,d=function(e,t,n){var a=e.image,o=a.rowPixelSpacing,i=a.columnPixelSpacing,r=t.handles,s=r.start,l=r.end,c=r.perpendicularStart,u=r.perpendicularEnd,d=(s.x-l.x)*(i||1),h=(s.y-l.y)*(o||1),v=Math.sqrt(d*d+h*h),g=(c.x-u.x)*(i||1),m=(c.y-u.y)*(o||1);return (Math.sqrt(g*g+m*m)||0)>v?(Mt(s,l),Mt(s,c),Mt(l,u),Object.values(r).find(function(e){return !0===e.moving})):n}(a,t,d),o.style.cursor=d.hasBoundingBox?"move":"none",function(e,t,n,a,o,i){var r=e.element,s={x:a.x-e.currentPoints.image.x,y:a.y-e.currentPoints.image.y},l=function(e){var o=e.detail;a.active=!0,a.hasMoved=!0,void 0===a.index||null===a.index?(a.x=o.currentPoints.image.x+s.x,a.y=o.currentPoints.image.y+s.y):bt(a,o,n,s),i&&(a.x=Math.max(a.x,0),a.x=Math.min(a.x,o.image.width),a.y=Math.max(a.y,0),a.y=Math.min(a.y,o.image.height)),f.cornerstone.updateImage(r);var l={toolType:t,element:r,measurementData:n};f.cornerstone.triggerEvent(r,x.MEASUREMENT_MODIFIED,l);};r.addEventListener(x.MOUSE_DRAG,l),r.addEventListener(x.TOUCH_DRAG,l);var c=f.cornerstone.getImage(r),u=function(){f.cornerstone.getImage(r).imageId!==c.imageId&&d();};r.addEventListener(f.cornerstone.EVENTS.IMAGE_RENDERED,u);var d=function e(){r.removeEventListener(f.cornerstone.EVENTS.IMAGE_RENDERED,u),r.removeEventListener(x.MOUSE_DRAG,l),r.removeEventListener(x.MOUSE_UP,e),r.removeEventListener(x.MOUSE_CLICK,e),r.removeEventListener(x.TOUCH_DRAG,l),r.removeEventListener(x.TOUCH_DRAG_END,e),r.removeEventListener(x.TAP,e),f.cornerstone.updateImage(r),"function"==typeof o&&o();};r.addEventListener(x.MOUSE_UP,d),r.addEventListener(x.MOUSE_CLICK,d),r.addEventListener(x.TOUCH_DRAG_END,d),r.addEventListener(x.TAP,d);}(a,n.name,t,d,function(){return r(d)}),St(e),{v:!0}},u=0;u0&&void 0!==arguments[0]?arguments[0]:{};o()(this,t);var a={name:"Bidirectional",supportedInteractionTypes:["Mouse","Touch"],configuration:{changeMeasurementLocationCallback:Lt,getMeasurementLocationCallback:Lt,textBox:"",shadow:"",drawHandlesOnHover:!0,additionalData:[]}},i=Object.assign(a.configuration,n),r=Object.assign(a,{configuration:i});return (e=l()(this,u()(t).call(this,r))).createNewMeasurement=ht.bind(ut()(ut()(e))),e.pointNearTool=vt.bind(ut()(ut()(e))),e.renderToolData=gt.bind(ut()(ut()(e))),e.addNewMeasurement=pt.bind(ut()(ut()(e))),e._moveCallback=Tt.bind(ut()(ut()(e))),e.preMouseDownCallback=Ct.bind(ut()(ut()(e))),e.preTouchStartCallback=Pt.bind(ut()(ut()(e))),e}return h()(t,e),t}(Me),Ht=function(e){function t(){var e,n=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{};o()(this,t);var a=Object.assign({name:"CobbAngle",supportedInteractionTypes:["Mouse","Touch"]},n);return (e=l()(this,u()(t).call(this,a))).initialConfiguration=a,e.hasIncomplete=!1,e}return h()(t,e),r()(t,[{key:"createNewMeasurement",value:function(e){return this.hasIncomplete=!0,{visible:!0,active:!0,color:void 0,complete:!1,value:"",handles:{start:{x:e.currentPoints.image.x,y:e.currentPoints.image.y,highlight:!0,active:!1},end:{x:e.currentPoints.image.x,y:e.currentPoints.image.y,highlight:!0,active:!0},start2:{x:e.currentPoints.image.x,y:e.currentPoints.image.y,highlight:!0,active:!1,drawnIndependently:!0},end2:{x:e.currentPoints.image.x+1,y:e.currentPoints.image.y,highlight:!0,active:!1,drawnIndependently:!0},textBox:{active:!1,hasMoved:!1,movesIndependently:!1,drawnIndependently:!0,allowedOutsideImage:!0,hasBoundingBox:!0}}}}},{key:"pointNearTool",value:function(e,t,n){return !1!==t.visible&&(!this.hasIncomplete&&(tt(e,t.handles.start,t.handles.end,n)<25||tt(e,t.handles.start2,t.handles.end2,n)<25))}},{key:"renderToolData",value:function(e){var t=this,n=e.detail,a=this.configuration,o=a.handleRadius,i=a.drawHandlesOnHover,r=Q(e.currentTarget,this.name);if(r)for(var s=Ze(n.canvasContext.canvas),l=Ie.getToolWidth(),c=ze.getFont(),u=function(e){var a=r.data[e];if(!1===a.visible)return "continue";Oe(s,function(e){Qe(e,t.configuration);var r=_e.getColorIfActive(a);Le(e,n.element,a.handles.start,a.handles.end,{color:r}),a.complete&&Le(e,n.element,a.handles.start2,a.handles.end2,{color:r});var s={color:r,handleRadius:o,drawHandlesIfActive:i};Ne(e,n,a.handles,s),e.fillStyle=r;var u=a.value;if(!a.handles.textBox.hasMoved){var d={x:(a.handles.start.x+a.handles.end.x)/2,y:(a.handles.start.y+a.handles.end.y)/2-10};e.font=c,a.handles.textBox.x=d.x,a.handles.textBox.y=d.y;}Xe(e,n.element,a.handles.textBox,u,a.handles,h,r,l,0,!0);});},d=0;d0&&void 0!==arguments[0]?arguments[0]:{};o()(this,t);var a=Object.assign({name:"EllipticalRoi",supportedInteractionTypes:["Mouse","Touch"]},n);return (e=l()(this,u()(t).call(this,a))).initialConfiguration=a,e}return h()(t,e),r()(t,[{key:"createNewMeasurement",value:function(e){if(e&&e.currentPoints&&e.currentPoints.image)return {visible:!0,active:!0,color:void 0,invalidated:!0,handles:{start:{x:e.currentPoints.image.x,y:e.currentPoints.image.y,highlight:!0,active:!1},end:{x:e.currentPoints.image.x,y:e.currentPoints.image.y,highlight:!0,active:!0},textBox:{active:!1,hasMoved:!1,movesIndependently:!1,drawnIndependently:!0,allowedOutsideImage:!0,hasBoundingBox:!0}}};console.error("required eventData not supplied to tool ".concat(this.name,"'s createNewMeasurement"));}},{key:"pointNearTool",value:function(e,t,n){var a=t&&t.handles&&t.handles.start&&t.handles.end;if(a||console.warn("invalid parameters supplieed to tool ".concat(this.name,"'s pointNearTool")),!a||!1===t.visible)return !1;var o=f.cornerstone.pixelToCanvas(e,t.handles.start),i=f.cornerstone.pixelToCanvas(e,t.handles.end),r={left:Math.min(o.x,i.x)+7.5,top:Math.min(o.y,i.y)+7.5,width:Math.abs(o.x-i.x)-15,height:Math.abs(o.y-i.y)-15},s={left:Math.min(o.x,i.x)-7.5,top:Math.min(o.y,i.y)-7.5,width:Math.abs(o.x-i.x)+15,height:Math.abs(o.y-i.y)+15},l=Vt(r,n);return !(!Vt(s,n)||l)}},{key:"renderToolData",value:function(e){var t=this,n=e.detail,a=this.configuration,o=a.handleRadius,i=a.drawHandlesOnHover,r=Q(e.currentTarget,this.name);if(r){var s,l=Ze(n.canvasContext.canvas),c=n.image,u=n.element,d=Ie.getToolWidth(),h=f.cornerstone.metaData.get("generalSeriesModule",c.imageId),v=f.cornerstone.metaData.get("imagePlaneModule",c.imageId),g=c.rowPixelSpacing,m=c.columnPixelSpacing;v&&(g=v.rowPixelSpacing||v.rowImagePixelSpacing,m=v.columnPixelSpacing||v.colImagePixelSpacing),h&&(s=h.modality);for(var p=function(e){var a=r.data[e];if(!1===a.visible)return "continue";Oe(l,function(e){Qe(e,t.configuration);var r=_e.getColorIfActive(a);Ue(e,u,a.handles.start,a.handles.end,{color:r});var l,h,v,p={color:r,handleRadius:o,drawHandlesIfActive:i};if(Ne(e,n,a.handles,p),!1===a.invalidated)h=a.meanStdDev,v=a.meanStdDevSUV,l=a.area;else{var y={left:Math.round(Math.min(a.handles.start.x,a.handles.end.x)),top:Math.round(Math.min(a.handles.start.y,a.handles.end.y)),width:Math.round(Math.abs(a.handles.start.x-a.handles.end.x)),height:Math.round(Math.abs(a.handles.start.y-a.handles.end.y))};if(!c.color){var T=f.cornerstone.getPixels(u,y.left,y.top,y.width,y.height);h=jt(T,y),"PT"===s&&(v={mean:Rt(c,(h.mean-c.intercept)/c.slope),stdDev:Rt(c,(h.stdDev-c.intercept)/c.slope)}),h&&!isNaN(h.mean)&&(a.meanStdDev=h,a.meanStdDevSUV=v);}l=Math.PI*(y.width*(m||1)/2)*(y.height*(g||1)/2),isNaN(l)||(a.area=l),a.invalidated=!1;}a.handles.textBox.hasMoved||(a.handles.textBox.x=Math.max(a.handles.start.x,a.handles.end.x),a.handles.textBox.y=(a.handles.start.y+a.handles.end.y)/2);var b=function(e){var t=e.meanStdDev,n=e.meanStdDevSUV,a=e.area,o=[];if(t&&void 0!==t.mean){var i="";"CT"===s&&(i=" HU");var r="Mean: ".concat(Nt(t.mean.toFixed(2))).concat(i),l="StdDev: ".concat(Nt(t.stdDev.toFixed(2))).concat(i);if(n&&void 0!==n.mean){r+=" SUV: "+Nt(n.mean.toFixed(2)),l+=" SUV: "+Nt(n.stdDev.toFixed(2));}o.push(r),o.push(l);}if(a){var c=" mm".concat(String.fromCharCode(178));g&&m||(c=" pixels".concat(String.fromCharCode(178)));var u="Area: ".concat(Nt(a.toFixed(2))).concat(c);o.push(u);}return o}(a);Xe(e,u,a.handles.textBox,b,a.handles,x,r,d,0,!0);});},y=0;y