var $jscomp=$jscomp||{};$jscomp.scope={};$jscomp.arrayIteratorImpl=function(c){var a=0;return function(){return ac&&(c=Math.max(0,d+c));if(null==f||f>d)f=d;f=Number(f);0>f&&(f=Math.max(0,d+f));for(c=Number(c||0);ca?Math.PI:Math.acos(a)};a.str=function(b){return"vec3("+b[0]+", "+b[1]+", "+b[2]+")"};a.exactEquals=function(b,a){return b[0]===a[0]&&b[1]===a[1]&&b[2]===a[2]};a.equals=function(b,a){var e=b[0],c=b[1];b=b[2];var d=a[0],g=a[1];a=a[2];return Math.abs(e-d)<=p.EPSILON*Math.max(1,Math.abs(e),Math.abs(d))&&Math.abs(c-g)<=p.EPSILON*Math.max(1,Math.abs(c),Math.abs(g))&&Math.abs(b-a)<=p.EPSILON*Math.max(1,Math.abs(b),Math.abs(a))};var p=function(b){if(b&&b.__esModule)return b;var a={};if(null!= b)for(var e in b)Object.prototype.hasOwnProperty.call(b,e)&&(a[e]=b[e]);a.default=b;return a}(d(0));a.sub=b;a.mul=e;a.div=k;a.dist=n;a.sqrDist=z;a.len=h;a.sqrLen=w;a.forEach=function(){var b=f();return function(a,e,c,d,g,f){e||(e=3);c||(c=0);for(d=d?Math.min(d*e+c,a.length):a.length;cc[5]&c[0]>c[10]?(b=2*Math.sqrt(1+c[0]-c[5]-c[10]),a[3]=(c[6]-c[9])/b,a[0]=.25*b,a[1]=(c[1]+c[4])/b,a[2]=(c[8]+c[2])/b):c[5]>c[10]?(b=2*Math.sqrt(1+c[5]-c[0]-c[10]),a[3]=(c[8]-c[2])/b,a[0]=(c[1]+c[4])/b,a[1]=.25*b,a[2]=(c[6]+c[9])/b):(b=2*Math.sqrt(1+c[10]-c[0]-c[5]),a[3]=(c[1]-c[4])/b,a[0]=(c[8]+c[2])/b,a[1]=(c[6]+c[9])/b,a[2]=.25*b);return a};a.fromRotationTranslationScale=function(a,c,d,g){var b=c[0],e=c[1],f=c[2],h=c[3],k=b+b,n=e+e,v=f+f;c=b*k;var u=b*n;b*=v;var r=e* n;e*=v;f*=v;k*=h;n*=h;h*=v;v=g[0];var t=g[1];g=g[2];a[0]=(1-(r+f))*v;a[1]=(u+h)*v;a[2]=(b-n)*v;a[3]=0;a[4]=(u-h)*t;a[5]=(1-(c+f))*t;a[6]=(e+k)*t;a[7]=0;a[8]=(b+n)*g;a[9]=(e-k)*g;a[10]=(1-(c+r))*g;a[11]=0;a[12]=d[0];a[13]=d[1];a[14]=d[2];a[15]=1;return a};a.fromRotationTranslationScaleOrigin=function(a,c,d,g,f){var b=c[0],e=c[1],h=c[2],k=c[3],n=b+b,v=e+e,z=h+h;c=b*n;var r=b*v;b*=z;var t=e*v;e*=z;h*=z;n*=k;v*=k;k*=z;z=g[0];var x=g[1];g=g[2];var C=f[0],D=f[1];f=f[2];a[0]=(1-(t+h))*z;a[1]=(r+k)*z;a[2]= (b-v)*z;a[3]=0;a[4]=(r-k)*x;a[5]=(1-(c+h))*x;a[6]=(e+n)*x;a[7]=0;a[8]=(b+v)*g;a[9]=(e-n)*g;a[10]=(1-(c+t))*g;a[11]=0;a[12]=d[0]+C-(a[0]*C+a[4]*D+a[8]*f);a[13]=d[1]+D-(a[1]*C+a[5]*D+a[9]*f);a[14]=d[2]+f-(a[2]*C+a[6]*D+a[10]*f);a[15]=1;return a};a.fromQuat=function(a,c){var b=c[0],e=c[1],d=c[2];c=c[3];var g=b+b,f=e+e,h=d+d;b*=g;var p=e*g;e*=f;var m=d*g,v=d*f;d*=h;g*=c;f*=c;c*=h;a[0]=1-e-d;a[1]=p+c;a[2]=m-f;a[3]=0;a[4]=p-c;a[5]=1-b-d;a[6]=v+g;a[7]=0;a[8]=m+f;a[9]=v-g;a[10]=1-b-e;a[11]=0;a[12]=0;a[13]= 0;a[14]=0;a[15]=1;return a};a.frustum=function(a,c,d,g,f,h,A){var b=1/(d-c),e=1/(f-g),k=1/(h-A);a[0]=2*h*b;a[1]=0;a[2]=0;a[3]=0;a[4]=0;a[5]=2*h*e;a[6]=0;a[7]=0;a[8]=(d+c)*b;a[9]=(f+g)*e;a[10]=(A+h)*k;a[11]=-1;a[12]=0;a[13]=0;a[14]=A*h*2*k;a[15]=0;return a};a.perspective=function(a,c,d,g,f){c=1/Math.tan(c/2);var b=1/(g-f);a[0]=c/d;a[1]=0;a[2]=0;a[3]=0;a[4]=0;a[5]=c;a[6]=0;a[7]=0;a[8]=0;a[9]=0;a[10]=(f+g)*b;a[11]=-1;a[12]=0;a[13]=0;a[14]=2*f*g*b;a[15]=0;return a};a.perspectiveFromFieldOfView=function(a, c,d,g){var b=Math.tan(c.upDegrees*Math.PI/180),e=Math.tan(c.downDegrees*Math.PI/180),f=Math.tan(c.leftDegrees*Math.PI/180);c=Math.tan(c.rightDegrees*Math.PI/180);var h=2/(f+c),k=2/(b+e);a[0]=h;a[1]=0;a[2]=0;a[3]=0;a[4]=0;a[5]=k;a[6]=0;a[7]=0;a[8]=-((f-c)*h*.5);a[9]=(b-e)*k*.5;a[10]=g/(d-g);a[11]=-1;a[12]=0;a[13]=0;a[14]=g*d/(d-g);a[15]=0;return a};a.ortho=function(a,c,d,g,f,h,A){var b=1/(c-d),e=1/(g-f),k=1/(h-A);a[0]=-2*b;a[1]=0;a[2]=0;a[3]=0;a[4]=0;a[5]=-2*e;a[6]=0;a[7]=0;a[8]=0;a[9]=0;a[10]=2*k; a[11]=0;a[12]=(c+d)*b;a[13]=(f+g)*e;a[14]=(A+h)*k;a[15]=1;return a};a.lookAt=function(a,c,d,f){var b=c[0],e=c[1];c=c[2];var h=f[0];var k=f[1];var p=f[2];var m=d[0];f=d[1];var n=d[2];if(Math.abs(b-m)p&&(p=-p,h=-h,q=-q,k=-k,c=-c);if(1E-6<1-p){var n=Math.acos(p);var m=Math.sin(n);p=Math.sin((1-d)*n)/m;d=Math.sin(d*n)/m}else p=1-d;a[0]=p*e+d*h;a[1]=p*g+d*q;a[2]=p*f+d*k;a[3]=p*b+d*c;return a}function k(a,b){var c=b[0]+b[4]+b[8];if(0b[0]&&(d=1);b[8]>b[3*d+d]&&(d=2);var e=(d+1)%3,g=(d+2)%3;c=Math.sqrt(b[3*d+d]-b[3*e+e]-b[3*g+g]+1);a[d]=.5*c;c=.5/c;a[3]=(b[3*e+g]-b[3*g+e])*c;a[e]=(b[3*e+d]+b[3*d+e])*c;a[g]=(b[3*g+d]+b[3*d+g])*c}return a}Object.defineProperty(a,"__esModule",{value:!0});a.setAxes=a.sqlerp=a.rotationTo=a.equals=a.exactEquals=a.normalize=a.sqrLen=a.squaredLength=a.len=a.length=a.lerp=a.dot=a.scale=a.mul=a.add=a.set=a.copy=a.fromValues=a.clone=void 0;a.create=h;a.identity=function(a){a[0]= 0;a[1]=0;a[2]=0;a[3]=1;return a};a.setAxisAngle=g;a.getAxisAngle=function(a,b){var c=2*Math.acos(b[3]),d=Math.sin(c/2);0!=d?(a[0]=b[0]/d,a[1]=b[1]/d,a[2]=b[2]/d):(a[0]=1,a[1]=0,a[2]=0);return c};a.multiply=b;a.rotateX=function(a,b,c){c*=.5;var d=b[0],e=b[1],g=b[2];b=b[3];var f=Math.sin(c);c=Math.cos(c);a[0]=d*c+b*f;a[1]=e*c+g*f;a[2]=g*c-e*f;a[3]=b*c-d*f;return a};a.rotateY=function(a,b,c){c*=.5;var d=b[0],e=b[1],g=b[2];b=b[3];var f=Math.sin(c);c=Math.cos(c);a[0]=d*c-g*f;a[1]=e*c+b*f;a[2]=g*c+d*f; a[3]=b*c-e*f;return a};a.rotateZ=function(a,b,c){c*=.5;var d=b[0],e=b[1],g=b[2];b=b[3];var f=Math.sin(c);c=Math.cos(c);a[0]=d*c+e*f;a[1]=e*c-d*f;a[2]=g*c+b*f;a[3]=b*c-g*f;return a};a.calculateW=function(a,b){var c=b[0],d=b[1];b=b[2];a[0]=c;a[1]=d;a[2]=b;a[3]=Math.sqrt(Math.abs(1-c*c-d*d-b*b));return a};a.slerp=e;a.invert=function(a,b){var c=b[0],d=b[1],e=b[2];b=b[3];var g=c*c+d*d+e*e+b*b;g=g?1/g:0;a[0]=-c*g;a[1]=-d*g;a[2]=-e*g;a[3]=b*g;return a};a.conjugate=function(a,b){a[0]=-b[0];a[1]=-b[1];a[2]= -b[2];a[3]=b[3];return a};a.fromMat3=k;a.fromEuler=function(a,b,c,d){var e=.5*Math.PI/180;b*=e;c*=e;d*=e;e=Math.sin(b);b=Math.cos(b);var g=Math.sin(c);c=Math.cos(c);var f=Math.sin(d);d=Math.cos(d);a[0]=e*c*d-b*g*f;a[1]=b*g*d+e*c*f;a[2]=b*c*f-e*g*d;a[3]=b*c*d+e*g*f;return a};a.str=function(a){return"quat("+a[0]+", "+a[1]+", "+a[2]+", "+a[3]+")"};c=d(0);var n=f(c);c=d(1);var z=f(c);c=d(2);var w=f(c);d=d(3);d=f(d);a.clone=d.clone;a.fromValues=d.fromValues;a.copy=d.copy;a.set=d.set;a.add=d.add;a.mul= b;a.scale=d.scale;a.dot=d.dot;a.lerp=d.lerp;c=a.length=d.length;a.len=c;c=a.squaredLength=d.squaredLength;a.sqrLen=c;var A=a.normalize=d.normalize;a.exactEquals=d.exactEquals;a.equals=d.equals;a.rotationTo=function(){var a=w.create(),b=w.fromValues(1,0,0),c=w.fromValues(0,1,0);return function(d,e,f){var h=w.dot(e,f);if(-.999999>h)return w.cross(a,b,e),1E-6>w.len(a)&&w.cross(a,c,e),w.normalize(a,a),g(d,a,Math.PI),d;if(.999999>4||65476===a;){switch(a){case 65476:this.huffTable.read(this.stream,this.HuffTab);break;case 65484:throw Error("Program doesn't support arithmetic coding. (format throw new IOException)"); case 65499:this.quantTable.read(this.stream,f.lossless.Decoder.TABLE);break;case 65501:this.restartInterval=this.readNumber();break;case 65504:case 65505:case 65506:case 65507:case 65508:case 65509:case 65510:case 65511:case 65512:case 65513:case 65514:case 65515:case 65516:case 65517:case 65518:case 65519:this.readApp();break;case 65534:this.readComment();break;default:if(255!==a>>8)throw Error("ERROR: format throw new IOException! (decode)");}a=this.stream.get16()}if(65472>a||65479>8)throw Error("ERROR: format throw new IOException! (Parser.decode)");}a=this.stream.get16()}this.precision=this.frame.precision;this.components=this.frame.components;this.numBytes||(this.numBytes=parseInt(Math.ceil(this.precision/8)));this.mask=1==this.numBytes?255:65535;this.scan.read(this.stream);this.numComp=this.scan.numComp;this.selection=this.scan.selection;1===this.numBytes?3===this.numComp?(this.getter=this.getValueRGB,this.setter= this.setValueRGB,this.output=this.outputRGB):(this.getter=this.getValue8,this.setter=this.setValue8,this.output=this.outputSingle):(this.getter=this.getValue16,this.setter=this.setValue16,this.output=this.outputSingle);switch(this.selection){case 2:this.selector=this.select2;break;case 3:this.selector=this.select3;break;case 4:this.selector=this.select4;break;case 5:this.selector=this.select5;break;case 6:this.selector=this.select6;break;case 7:this.selector=this.select7;break;default:this.selector= this.select1}this.scanComps=this.scan.components;this.quantTables=this.quantTable.quantTables;for(c=0;cc;c+=1)g[c]=1<=f.lossless.Decoder.RESTART_MARKER_BEGIN&&a<=f.lossless.Decoder.RESTART_MARKER_END))break}65500===a&&1===e&&(this.readNumber(),a=this.stream.get16())}while(65497!==a&&this.xLoc>1)};f.lossless.Decoder.prototype.select6=function(a){return this.getPreviousY(a)+(this.getPreviousX(a)-this.getPreviousXY(a)>>1)};f.lossless.Decoder.prototype.select7= function(a){return(this.getPreviousX(a)+this.getPreviousY(a))/2};f.lossless.Decoder.prototype.decodeRGB=function(a,c,b){var d,g,h,z;a[0]=this.selector(0);a[1]=this.selector(1);a[2]=this.selector(2);for(g=0;gz;z+=1){d=this.getHuffmanValue(A,c,b);if(65280<=d)return d;z+=d>>4;if(0===(d&15)){if(0===d>>4)break}else this.IDCT_Source[f.lossless.Decoder.IDCT_P[z]]=this.getn(b,d&15,c,b)*w[z]}}}return 0};f.lossless.Decoder.prototype.decodeSingle=function(a,c,b){var d;this.restarting?(this.restarting=!1,a[0]=1<>8;if(h>=f.lossless.Decoder.RESTART_MARKER_BEGIN&& h<=f.lossless.Decoder.RESTART_MARKER_END)return h;a[0]+=g}return 0};f.lossless.Decoder.prototype.getHuffmanValue=function(a,c,b){if(8>b[0]){c[0]<<=8;var d=this.stream.get8();255===d&&(this.marker=this.stream.get8(),0!==this.marker&&(this.markerIndex=9));c[0]|=d}else b[0]-=8;var g=a[c[0]>>b[0]];if(0!==(g&f.lossless.Decoder.MSB)){if(0!==this.markerIndex)return this.markerIndex=0,65280|this.marker;c[0]&=65535>>16-b[0];c[0]<<=8;d=this.stream.get8();255===d&&(this.marker=this.stream.get8(),0!==this.marker&& (this.markerIndex=9));c[0]|=d;g=a[256*(g&255)+(c[0]>>b[0])];b[0]+=8}b[0]+=8-(g>>8);if(0>b[0])throw Error("index="+b[0]+" temp="+c[0]+" code="+g+" in HuffmanValue()");if(b[0]>16-b[0];return g&255};f.lossless.Decoder.prototype.getn=function(a,c,b,d){if(0===c)return 0;if(16===c)return 0<=a[0]?-32768:32768;d[0]-=c;if(0<=d[0]){if(d[0]d[0]){if(0!==this.markerIndex)return this.markerIndex=0,(65280|this.marker)<<8;b[0]<<=8;a=this.stream.get8();255===a&&(this.marker=this.stream.get8(),0!==this.marker&&(this.markerIndex=9));b[0]|=a;d[0]+=8}if(0>d[0])throw Error("index="+d[0]+" in getn()");if(d[0]>d[0];b[0]&=65535>>16-d[0];a<1<=this.xDim&&(this.yLoc+=1,this.xLoc=0))};f.lossless.Decoder.prototype.outputRGB=function(a){var c=this.yLoc*this.xDim+this.xLoc;this.xLoc=this.xDim&&(this.yLoc+=1,this.xLoc=0))};f.lossless.Decoder.prototype.setValue8=function(a,c){this.outputData[a]=c};f.lossless.Decoder.prototype.getValue8=function(a){return this.outputData[a]};(function(){var a=new ArrayBuffer(2);(new DataView(a)).setInt16(0,256,!0);return 256===(new Int16Array(a))[0]})()?(f.lossless.Decoder.prototype.setValue16=f.lossless.Decoder.prototype.setValue8,f.lossless.Decoder.prototype.getValue16=f.lossless.Decoder.prototype.getValue8): (f.lossless.Decoder.prototype.setValue16=function(a,c){this.outputData[a]=(c&255)<<8|c>>8&255},f.lossless.Decoder.prototype.getValue16=function(a){a=this.outputData[a];return(a&255)<<8|a>>8&255});f.lossless.Decoder.prototype.setValueRGB=function(a,c,b){this.outputData[3*a+b]=c};f.lossless.Decoder.prototype.getValueRGB=function(a,c){return this.outputData[3*a+c]};f.lossless.Decoder.prototype.readApp=function(){var a=0,c=this.stream.get16();for(a+=2;ad)throw Error("ERROR: frame format error");var h=a.get8();c+=1;if(c>=d)throw Error("ERROR: frame format error [c>=Lf]");var n=a.get8();c+=1;this.components[h]||(this.components[h]=new f.lossless.ComponentSpec);this.components[h].hSamp=n>>4;this.components[h].vSamp=n&15;this.components[h].quantTableSel=a.get8();c+=1}if(c!==d)throw Error("ERROR: frame format error [Lf!=count]");return 1};"undefined"!==typeof a&&a.exports&& (a.exports=f.lossless.FrameHeader)},{"./component-spec.js":1,"./data-stream.js":2}],5:[function(c,a,d){var f=f||{};f.lossless=f.lossless||{};f.lossless.DataStream=f.lossless.DataStream||("undefined"!==typeof c?c("./data-stream.js"):null);f.lossless.Utils=f.lossless.Utils||("undefined"!==typeof c?c("./utils.js"):null);f.lossless.HuffmanTable=f.lossless.HuffmanTable||function(){this.l=f.lossless.Utils.createArray(4,2,16);this.th=[];this.v=f.lossless.Utils.createArray(4,2,16,200);this.tc=f.lossless.Utils.createArray(4, 2);this.tc[0][0]=0;this.tc[1][0]=0;this.tc[2][0]=0;this.tc[3][0]=0;this.tc[0][1]=0;this.tc[1][1]=0;this.tc[2][1]=0;this.tc[3][1]=0;this.th[0]=0;this.th[1]=0;this.th[2]=0;this.th[3]=0};f.lossless.HuffmanTable.MSB=2147483648;f.lossless.HuffmanTable.prototype.read=function(a,c){var b=0,d,f;var g=a.get16();for(b+=2;b 3");h>>=4;if(2 2 ]");this.th[w]=1;this.tc[w][h]=1;for(d= 0;16>d;d+=1)this.l[w][h][d]=a.get8(),b+=1;for(d=0;16>d;d+=1)for(f=0;fg)throw Error("ERROR: Huffman table format error [count>Lh]");this.v[w][h][d][f]=a.get8();b+=1}}if(b!==g)throw Error("ERROR: Huffman table format error [count!=Lf]");for(d=0;4>d;d+=1)for(f=0;2>f;f+=1)0!==this.tc[d][f]&&this.buildHuffTable(c[d][f],this.l[d][f],this.v[d][f]);return 1};f.lossless.HuffmanTable.prototype.buildHuffTable=function(a,c,b){var d,g,h,z;for(g=d=0;8>g;g+=1)for(h=0;h>g+1;z+=1)a[d]=b[g][h]|g+1<<8,d+=1;for(g=1;256>d;g+=1,d+=1)a[d]=g|f.lossless.HuffmanTable.MSB;var w=1;d=0;for(g=8;16>g;g+=1)for(h=0;h>g-7;z+=1)a[256*w+d]=b[g][h]|g+1<<8,d+=1;if(256<=d){if(256b;b+=1)a[c[0+b]]*=90,a[c[32+b]]*=90,a[c[16+b]]*=118,a[c[48+b]]*=49,a[c[40+b]]*=71,a[c[8+b]]*=126,a[c[56+b]]*=25,a[c[24+b]]*=106;for(b=0;8>b;b+=1)a[c[8*b]]*=90,a[c[4+8*b]]*=90,a[c[2+8*b]]*=118,a[c[6+8*b]]*=49,a[c[5+8*b]]*=71,a[c[1+8*b]]*=126,a[c[7+8*b]]*=25,a[c[3+8*b]]*=106;for(b=0;64>b;b+=1)a[b]>>=6};f.lossless.QuantizationTable.prototype.read=function(a,c){var b=0;var d=a.get16();for(b+= 2;b 3");this.precision[h]=g>>4;if(0===this.precision[h])this.precision[h]=8;else if(1===this.precision[h])this.precision[h]=16;else throw Error("ERROR: Quantization table precision error");this.tq[h]=1;if(8===this.precision[h])for(g=0;64>g;g+=1){if(b>d)throw Error("ERROR: Quantization table format error");this.quantTables[h][g]=a.get8();b+=1}else for(g=0;64>g;g+=1){if(b>d)throw Error("ERROR: Quantization table format error"); this.quantTables[h][g]=a.get16();b+=2}f.lossless.QuantizationTable.enhanceQuantizationTable(this.quantTables[h],c)}if(b!==d)throw Error("ERROR: Quantization table error [count!=Lq]");return 1};"undefined"!==typeof a&&a.exports&&(a.exports=f.lossless.QuantizationTable)},{"./data-stream.js":2,"./utils.js":10}],8:[function(c,a,d){var f=f||{};f.lossless=f.lossless||{};f.lossless.ScanComponent=f.lossless.ScanComponent||function(){this.scanCompSel=this.dcTabSel=this.acTabSel=0};"undefined"!==typeof a&& a.exports&&(a.exports=f.lossless.ScanComponent)},{}],9:[function(c,a,d){var f=f||{};f.lossless=f.lossless||{};f.lossless.DataStream=f.lossless.DataStream||("undefined"!==typeof c?c("./data-stream.js"):null);f.lossless.ScanComponent=f.lossless.ScanComponent||("undefined"!==typeof c?c("./scan-component.js"):null);f.lossless.ScanHeader=f.lossless.ScanHeader||function(){this.spectralEnd=this.selection=this.numComp=this.al=this.ah=0;this.components=[]};f.lossless.ScanHeader.prototype.read=function(a){var c= 0,b;var d=a.get16();c+=2;this.numComp=a.get8();c+=1;for(b=0;bd)throw Error("ERROR: scan header format error");this.components[b].scanCompSel=a.get8();c+=1;var h=a.get8();c+=1;this.components[b].dcTabSel=h>>4;this.components[b].acTabSel=h&15}this.selection=a.get8();c+=1;this.spectralEnd=a.get8();c+=1;h=a.get8();this.ah=h>>4;this.al=h&15;if(c+1!==d)throw Error("ERROR: scan header format error [count!=Ns]");return 1};"undefined"!== typeof a&&a.exports&&(a.exports=f.lossless.ScanHeader)},{"./data-stream.js":2,"./scan-component.js":8}],10:[function(c,a,d){var f=f||{};f.lossless=f.lossless||{};f.lossless.Utils=f.lossless.Utils||{};f.lossless.Utils.createArray=function(a){var c=Array(a||0),b=a;if(1b;b++){a=b;for(var d=0;8>d;d++)a=a& 1?3988292384^a>>>1:a>>>1;c[b]=a}return c};f.lossless.Utils.crc32=function(a){a=new Uint8Array(a.buffer);for(var c=f.lossless.Utils.crcTable||(f.lossless.Utils.crcTable=f.lossless.Utils.makeCRCTable()),b=-1,d=0;d>>8^c[(b^a[d])&255];return(b^-1)>>>0};"undefined"!==typeof a&&a.exports&&(a.exports=f.lossless.Utils)},{}]},{},[6])(6)});var MaxHuValue=1E5,MinHuValue=-1E5,SmallFloat=1E-5;function isOpera(){return navigator.userAgent.match(/Opera|OPR\//)?!0:!1} function errorMessage(c){console.log(c)}function getRandomInt(){return Math.floor(1E6*Math.random())}function getExtension(c){return c.split(".").pop()} function Utf8ArrayToStr(c){var a;var d="";var f=c.length;for(a=0;a>4){case 0:case 1:case 2:case 3:case 4:case 5:case 6:case 7:d+=String.fromCharCode(h);break;case 12:case 13:var g=c[a++];d+=String.fromCharCode((h&31)<<6|g&63);break;case 14:g=c[a++];var b=c[a++];d+=String.fromCharCode((h&15)<<12|(g&63)<<6|(b&63)<<0)}}return d}function _Uint8ArrayToBase64(c){for(var a="",d=c.byteLength,f=0;fa[0]&&(a[0]=c[d][0]),c[d][1]>a[1]&&(a[1]=c[d][1]);return a}; this.calcContourSquare=function(c){for(var a=0,d=0;d=a||h[1]>=a&&g[1]c[0]&&(c[0]=0);0>c[1]&&(c[1]=0);return c};this.boxMaxI=function(c,a){c=this.getMaxCoords(c);c[0]=Math.round(c[0]/a.pixelSpacing[0]);c[1]=Math.round(c[1]/a.pixelSpacing[1]);c[0]>=a.width&&(c[0]=a.width-1);c[1]>=a.height&&(c[1]=a.height-1);return c};this.distanceToLineSQR=function(c,a,d){var f=c[0]-a[0],h=d[0]-a[0];c=c[1]-a[1];a=d[1]-a[1];d=h*h+a*a;if(0==d)return(f-h)*(f-h)+(c-a)*(c-a);d=(f*h+c*a)/d;0>d&&(d=0);1q&&(h=q,e=c[A]);gq&&(q=-1E3);3999=m){b=(A+-1E3)*a+d;break}f.Min=h;f.Max=g;f.Sum=n;f.Average=q;f.PixelsCount=c.length;f.StandardDeviation=z;f.Median=b;return f}} function CS3(){this.x=[1,0,0];this.y=[0,1,0];this.z=[0,0,1];this.center=[0,0,0];this.clone=function(){var c=new CS3;c.x=vec3.clone(this.x);c.y=vec3.clone(this.y);c.z=vec3.clone(this.z);c.center=vec3.clone(this.center);return c};this.fromRawImage=function(c){vec3.copy(this.center,c.imagePosition);vec3.copy(this.x,c.imageOrientationX);vec3.copy(this.y,c.imageOrientationY);vec3.cross(this.z,this.x,this.y)};this.GetCoords=function(c){c=vec3.subtract([],c,this.center);return[vec3.dot(c,this.x),vec3.dot(c, this.y),vec3.dot(c,this.z)]};this.GetCoordsRot=function(c){return[vec3.dot(c,this.x),vec3.dot(c,this.y),vec3.dot(c,this.z)]};this.GetCoords_CS3=function(c){var a=new CS3;a.center=this.GetCoords(c.center);a.x=this.GetCoordsRot(c.x);a.y=this.GetCoordsRot(c.y);a.z=this.GetCoordsRot(c.z);return a};this.GetCoordsW=function(c){return[this.center[0]+this.x[0]*c[0]+this.y[0]*c[1]+this.z[0]*c[2],this.center[1]+this.x[1]*c[0]+this.y[1]*c[1]+this.z[1]*c[2],this.center[2]+this.x[2]*c[0]+this.y[2]*c[1]+this.z[2]* c[2]]};this.GetCoordsWRot=function(c){return[this.x[0]*c[0]+this.y[0]*c[1]+this.z[0]*c[2],this.x[1]*c[0]+this.y[1]*c[1]+this.z[1]*c[2],this.x[2]*c[0]+this.y[2]*c[1]+this.z[2]*c[2]]};this.GetCoordsW_CS3=function(c){var a=new CS3;a.center=this.GetCoordsW(c.center);a.x=this.GetCoordsWRot(c.x);a.y=this.GetCoordsWRot(c.y);a.z=this.GetCoordsWRot(c.z);return a};this.Correct=function(){vec3.normalize(this.z,this.z);this.x=math3d.getProjectionOn(this.x,this.z);vec3.normalize(this.x,this.x);var c=vec3.clone(this.y); vec3.cross(this.y,this.x,this.z);0>vec3.dot(c,this.y)&&(this.y[0]=-this.y[0],this.y[1]=-this.y[1],this.y[2]=-this.y[2])}}var math3d=new namespaceMath3d; function namespaceMath3d(){var c=[0,0,0];this.getProjectionOn=function(a,c){var d=vec3.dot(a,c);return[a[0]-c[0]*d,a[1]-c[1]*d,a[2]-c[2]*d]};this.lineCrossPlane=function(a,d,f,h){f=vec3.subtract(c,a,f);h=-vec3.dot(f,h)/vec3.dot(d,h);return[a[0]+h*d[0],a[1]+h*d[1],a[2]+h*d[2]]};this.planePointDist=function(a,d,f){return Math.abs(vec3.dot(vec3.subtract(c,d,f),a))}} function VolumeStructure(){this.size=[0,0,0];this.spacing=[1,1,1];this.position=new CS3;this.images=[];this.getValue1=function(c){return this.images[c[2]].pixels[c[0]+c[1]*this.size[0]]};this.getValue=function(c,a,d){return this.images[d].pixels[c+a*this.size[0]]};this.isValid=function(c,a,d){return 0<=c&&0<=a&&0<=d&&cb;b++)for(var e=0;2>e;e++)for(var k=0;2>k;k++){var n=[b?c[0]:0,e?c[1]:0,k?c[2]:0];n=[vec3.dot(a.x,n),vec3.dot(a.y,n),vec3.dot(a.z,n)];vec3.min(h,h,n);vec3.max(g,g,n)}c=[.5*(h[0]+g[0]),.5*(h[1]+g[1])];d[0]=.5*(g[0]-h[0]);d[1]=.5*(g[1]-h[1]);d=vec3.dot(a.center,a.z);for(b=0;3>b;b++)f[b]=a.x[b]*c[0]+a.y[b]*c[1]+a.z[b]*d};this.getObliqueGeometry=function(c,a){var d=new MprImageGeometry; c=a.position.GetCoords_CS3(c);d.pixelSpacing[0]=vec3.length(vec3.multiply([],a.spacing,c.x));d.pixelSpacing[1]=vec3.length(vec3.multiply([],a.spacing,c.y));var f=vec3.multiply([],a.size,a.spacing),h=[0,0,0],g=[0,0];this.getFittedProjectionOblique(f,c,g,h);d.width=Math.round(2*g[0]/d.pixelSpacing[0]);d.height=Math.round(2*g[1]/d.pixelSpacing[1]);d.pixelSpacing[0]=2*g[0]/d.width;d.pixelSpacing[1]=2*g[1]/d.height;for(f=0;3>f;f++)c.center[f]=h[f]-c.x[f]*g[0]-c.y[f]*g[1];d.position=a.position.GetCoordsW_CS3(c); return d};this.getMprImage=function(c,a,d,f){if(f<=c.spacing[2])return this.getMprImageThin(c,a);var h=c.images[0].derive(a),g=c.position.GetCoords_CS3(a.position),b=vec3.length(vec3.multiply([],c.spacing,g.z));21p&&(p=v)}h.pixels[e]=p}else if("MinIP"==d){p=999999;for(m=-f;m<= f;m++)n[0]+=b[0],n[1]+=b[1],n[2]+=b[2],vec3.floor(k,n),v=c.isValid1(k)?c.getValue1(k):0,vf.x[0]||.99999f.x[1]||.99999f.x[2]||.99999f.y[0]||.99999f.y[1]||.99999f.y[2]||.99999f[0]?g[0]:h[0],0>f[1]?g[1]:h[1],0>f[2]?g[2]:h[2]],f)/d;return[Math.floor(vec3.dot(c.center,f)/d-h+.5),Math.floor(vec3.dot(a,f)/d-h)]};this.getCurAndMaxScanPos=function(c,a){c=this.getObliqueLocal(c,a);var d= c.z,f=vec3.scale([],a.spacing,.5),h=vec3.multiply([],a.spacing,a.size);vec3.subtract(h,h,f);a=[0d[0]?h[0]:f[0],0>d[1]?h[1]:f[1],0>d[2]?h[2]:f[2]],d);return[vec3.dot(c.center,d)-f,vec3.dot(a,d)-f]};this.getObliqueSliceThickness_mm=function(c,a){c=this.getObliqueLocal(c,a).z;return res=Math.sqrt(c[0]*a.spacing[0]*c[0]*a.spacing[0]+c[1]*a.spacing[1]*c[1]*a.spacing[1]+c[2]*a.spacing[2]*c[2]*a.spacing[2])};this.getObliqueLocal=function(c, a){return a.position.GetCoords_CS3(c)};this.getObliqueSequence=function(c,a){var d=new MprImageSequence,f=this.scrollObliqueToPosition(0,c,a);d.firstImage=this.getObliqueGeometry(f,a);d.imagesCount=this.getCurAndMaxScanNum(c,a)[1]+1;d.step=this.getObliqueSliceThickness_mm(c,a);return d}} function MarchingCubesFunctions(){function c(a,b,c,d,f,h){a=(a-d)/(f-d);h[0]=b[0]+a*(c[0]-b[0]);h[1]=b[1]+a*(c[1]-b[1]);h[2]=b[2]+a*(c[2]-b[2])}function a(a){var b=new DataView(a,0),c=0;this.writeUint16=function(a){b.setUint16(c,a,!0);c+=2};this.writeUint32=function(a){b.setUint32(c,a,!0);c+=4};this.writeFloat32=function(a){b.setFloat32(c,a,!0);c+=4};this.writeArrayFloat32=function(a){for(var b=0;bm;m++)0>k[m]&&(k[m]=0),n[m]>=w[m]&&(n[m]=w[m]-1);e=[];for(var v={p:[[],[],[],[],[],[],[],[]],val:[[],[],[],[],[],[],[],[]]},u=[[],[],[],[],[],[],[],[],[],[]],r=[],t=w[0]*w[1],x=k[2];xa/f?f/a:d/c;this.userScale=Math.sqrt(Math.abs(b));this.pixelsPerMm=this.userScale/e;var k=this.ctxMatrix;e*=0a.pixels[f]&& (c=a.pixels[f]),d0.0 && val<1.0)\n\t\t\tgl_FragColor = vec4(col,col,col,1.0);\n//\t\telse\n//\t\t\tgl_FragColor = vec4(1.0,0.0,0.0,1.0);\n\t\t}\n\n }\n "), d={program:a,attribLocations:{vertexPosition:c.getAttribLocation(a,"aVertexPosition"),textureCoord:c.getAttribLocation(a,"aTextureCoord")},uniformLocations:{projectionMatrix:c.getUniformLocation(a,"uProjectionMatrix"),modelViewMatrix:c.getUniformLocation(a,"uModelViewMatrix"),uSampler:c.getUniformLocation(a,"image"),minMaxLevels:c.getUniformLocation(a,"minMaxLevels"),imageSize:c.getUniformLocation(a,"imageSize"),imageFormat:c.getUniformLocation(a,"imageFormat")}};this.getProgramInfo=function(){return d}} function loadShader(c,a,d){a=c.createShader(a);c.shaderSource(a,d);c.compileShader(a);return c.getShaderParameter(a,c.COMPILE_STATUS)?a:(console.log("An error occurred compiling the shaders: "+c.getShaderInfoLog(a)),c.deleteShader(a),null)} function ShadersDvr(c,a){a=function(a,c,d){c=loadShader(a,a.VERTEX_SHADER,c);d=loadShader(a,a.FRAGMENT_SHADER,d);var b=a.createProgram();a.attachShader(b,c);a.attachShader(b,d);a.linkProgram(b);return a.getProgramParameter(b,a.LINK_STATUS)?b:(console.log("Unable to initialize the shader program: "+a.getProgramInfoLog(b)),null)}(c,"#version 300 es\n #line 4\n layout(location=0) in vec3 pos;\n\n uniform mat4 uModelViewMatrix;\n uniform mat4 uProjectionMatrix;\n \n\n void main(void) {\n gl_Position = vec4(pos, 1);\n }\n ", a);var d={program:a,attribLocations:{vertexPosition:c.getAttribLocation(a,"aVertexPosition"),textureCoord:c.getAttribLocation(a,"aTextureCoord")},uniformLocations:{projectionMatrix:c.getUniformLocation(a,"uProjectionMatrix"),modelViewMatrix:c.getUniformLocation(a,"uModelViewMatrix"),uSampler:c.getUniformLocation(a,"volume"),uSamplerMask:c.getUniformLocation(a,"mask"),colormap:c.getUniformLocation(a,"colormap"),minMaxLevels:c.getUniformLocation(a,"minMaxLevels"),imageSize:c.getUniformLocation(a,"imageSize"), imageFormat:c.getUniformLocation(a,"imageFormat"),volumeScale:c.getUniformLocation(a,"volumeScale"),cellSize:c.getUniformLocation(a,"cellSize"),cameraScale:c.getUniformLocation(a,"cameraScale"),eyeLeft:c.getUniformLocation(a,"eyeLeft"),eyeTop:c.getUniformLocation(a,"eyeTop"),eyeFront:c.getUniformLocation(a,"eyeFront"),eyePosition:c.getUniformLocation(a,"eyePosition"),stepLength:c.getUniformLocation(a,"stepLength"),box_min:c.getUniformLocation(a,"box_min"),box_max:c.getUniformLocation(a,"box_max")}}; this.getProgramInfo=function(){return d}}var gpuValuesShift=3072,glcanvas=document.getElementById("glcanvas"),gl=glcanvas.getContext("webgl2");gl||alert("Unable to initialize WebGL2. Your browser or machine may not support it.");var shaders2d=new Shaders2d(gl),shaderMIP=new ShadersDvr(gl,shaderSrcMIP),shaderWL=new ShadersDvr(gl,shaderSrcWL),shaderSSD=new ShadersDvr(gl,shaderSrcSSD),shaderPrint3d=new ShadersDvr(gl,shaderSrcPrint3d),shaderDVR=new ShadersDvr(gl,shaderSrcDVR),m_quadBuffers=initQuadBuffers(); function initQuadBuffers(){var c=gl.createBuffer();gl.bindBuffer(gl.ARRAY_BUFFER,c);gl.bufferData(gl.ARRAY_BUFFER,new Float32Array([-1,1,1,1,1,-1,-1,-1]),gl.STATIC_DRAW);var a=gl.createBuffer();gl.bindBuffer(gl.ARRAY_BUFFER,a);gl.bufferData(gl.ARRAY_BUFFER,new Float32Array([0,0,1,0,1,1,0,1]),gl.STATIC_DRAW);var d=gl.createBuffer();gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER,d);gl.bufferData(gl.ELEMENT_ARRAY_BUFFER,new Uint16Array([0,1,2,3,0]),gl.STATIC_DRAW);return{position:c,textureCoord:a,indices:d}} function convertHUtoFloat(c,a){return a==ImageFormat_uint16||a==ImageFormat_int16?(c+gpuValuesShift)/65536:c/256}function calcTotalTransform(c,a,d,f,h,g,b){var e=mat4.create();d*=h[0];f*=h[1];h=a/f;c/d this.images.length)return[];var c=this.getModality();if("CT"!=c&&"MR"!=c&&"OPT"!=c&&"NM"!=c&&"PT"!=c)return[];var a=this.images[0].rawImage;c=vec3.subtract([],this.images[1].rawImage.imagePosition,a.imagePosition);a=vec3.cross([],a.imageOrientationX,a.imageOrientationY);if(vec3.squaredLength(vec3.cross([],a,c))>SmallFloat)return[];a=[];for(var d=[0,1],f=2;fSmallFloat&&(5<=d.length&&a.push(d),d=[]);d.push(f)}5<=d.length&&a.push(d);return a}}function StudyController(){this.series=[];this.uid=""} function StudiesController(){this.studies=[];this.startNewStudy=function(){0c.series[d].seriesNumber){var f=c.series[a];c.series[a]=c.series[d];c.series[d]=f}for(a=0;ac.images[d].rawImage.getMeta("InstanceNumber")){var f=c.images[a];c.images[a]=c.images[d];c.images[d]=f}}} function DataReceiver(c){var a=new DataView(c,0),d=0;this.getUint8=function(){var c=a.getUint8(d);d+=1;return c};this.getUint16=function(){var c=a.getUint16(d);d+=2;return c};this.getUint32=function(){var c=a.getUint32(d,!0);d+=4;return c};this.getFloat32=function(){var c=a.getFloat32(d,!0);d+=4;return c};this.getFloat64=function(){var c=a.getFloat64(d,!0);d+=8;return c};this.skip=function(a){d+=a};this.getUint8Array=function(a){var f=new Uint8Array(c,d,a);d+=a;return f};this.getInt16Array=function(a){var f= new Int16Array(c.slice(d),0,a);d+=2*a;return f};this.getString=function(){var a=this.getUint32();a=this.getUint8Array(a);return Utf8ArrayToStr(a)}}function downloadImage(c){downloadImage1(c)} function downloadImage1(c){if(c.downloadStatus==StatusNotDownloaded){var a=createRequest();c.downloadStatus=StatusDownloading;a.open("GET",c.url,!0);a.responseType="arraybuffer";a.onprogress=function(a){c.downloadProgressText="loading..."+Math.round(a.loaded/a.total*100)+"%"};a.onload=function(d){if(d=a.response)"zip"==getExtension(c.url)?(c.downloadProgressText="extracting...",zip.workerScriptsPath="gildas-lormeau-zip.js-3e79208/WebContent/",zip.createReader(new zip.ArrayBufferReader(d),function(a){a.getEntries(function(d){d[0].getData(new zip.ArrayBufferWriter, function(d){a.close();importRawImage(d,c)})})},function(){errorMessage("unzip error!!!")})):importRawImage(d,c)};a.onerror=function(a){errorMessage("Unknown Error Occured. Server response not received.")};a.send(null)}} function DownloadManager(){var c=!1;this.doRoutine=function(){if(!c){for(var a=0,d=0,f=0,h=0;h(?)";if(!(4<=a)){h=mainLayout.getLayoutItems(); for(d=0;d
": document.getElementById("downloadProgress").innerHTML="Data loaded (?)"}}}}function downloadUrlList(c){var a=createRequest();a.open("GET",c+(void 0==$_GET.dirUrl?"urls.txt":"urlsZip.txt"),!0);a.responseType="arraybuffer";a.onload=function(d){if(d=a.response)d=new Uint8Array(d,0,d.length),d=Utf8ArrayToStr(d),addImagesUrls(d,c),onUrlsLoaded()};a.onerror=function(a){errorMessage("Unknown Error Occured. Server response not received.")};a.send(null)} function addImagesUrls(c,a){c=c.split("\r\n");for(var d=0;dh;h++){d.beginPath();d.strokeStyle=0==h?"#000000":"#ffffff";d.lineWidth=0==h?3:1;drawLineAligned(d,f/2-5*a,c-5,f/2+5*a,c-5);for(var g=-5;5>=g;g++)drawLineAligned(d,f/2+a*g,c-5-(-5==g||0==g||5==g?10:5),f/2+a*g,c-5);drawLineAligned(d,f-5,c/2-5*a,f-5,c/2+5*a);for(g=-5;5>=g;g++)drawLineAligned(d,f-5-(-5==g||0==g||5==g?10:5),c/2+a*g,f-5,c/2+a*g);d.stroke()}} function drawLoupeFrame(c,a,d,f,h,g){var b="0cm",e=1;g>f/10?(g/=10,b="0mm"):gk;k++){c.beginPath();c.strokeStyle=0==k?"#000000":"#ffffff";c.lineWidth=0==k?3:1;c.beginPath();c.rect(aligned(a),aligned(d),Math.round(f),Math.round(h));c.stroke();for(var n=1;1E3>=n&&!(g*n>f);n++)drawLineAligned(c,a+g*n,d,a+g*n,d+(0==n%10?12:4)),drawLineAligned(c,a+g*n,d+h,a+g*n,d+h-(0==n%10?12:4));for(n=1;1E3>=n&&!(g*n>h);n++)drawLineAligned(c,a,d+g*n,a+(0==n%10?12: 4),d+g*n),drawLineAligned(c,a+f,d+g*n,a+f-(0==n%10?12:4),d+g*n);c.stroke()}drawText(c,b,a-20,d+-5,"#ffffff");for(n=1;100>=n&&!(g*n*10>f);n++)drawText(c,n*e,a+g*n*10+-5,d+-5,"#ffffff");for(n=1;100>=n&&!(g*n*10>h);n++)drawText(c,n*e,a+-20,d+g*n*10+4,"#ffffff")}function drawText(c,a,d,f,h){c.strokeStyle="#000000";c.fillStyle=h;c.lineWidth=2;c.strokeText(a,aligned(d),aligned(f));c.fillText(a,aligned(d),aligned(f))} function wrapText(c,a,d,f,h,g,b,e){if(void 0!=a&&""!=a){a=a.split("\n");for(var k=0;kh?(drawText(c,n,d+(e?h-q:0),f,b),n=z[w]+" ",f+=g):n=A}drawText(c,n,d+(e?h-q:0),f,b);f+=g}}}function calcAxisLetter(c){var a="";.3c[0]&&(a+="L");.3c[1]&&(a+="P");.3c[2]&&(a+="S");return a} function drawOrientationLetters(c,a,d){var f={R:"L",L:"R",A:"P",P:"A",I:"S",S:"I"},h=c.getContext("2d");h.font="18px Arial";var g=Math.sqrt(Math.abs(d[0]*d[5]-d[1]*d[4])),b=[d[0]/g,d[1]/g],e=[d[4]/g,d[5]/g],k=[];g=[];for(d=0;3>d;d++)k[d]=a.imageOrientationX[d]*b[0]+a.imageOrientationY[d]*b[1],g[d]=a.imageOrientationX[d]*e[0]+a.imageOrientationY[d]*e[1];a=calcAxisLetter(k);b=calcAxisLetter(g);e=g="";for(d=0;dc.width&&(f=18,d.font="16px Arial");for(var h=0;hf;f++){c.strokeStyle=0==f?"#000000":"#ffffff";c.lineWidth=0==f?3:1;for(var h=0;3>h;h++){c.beginPath();c.moveTo(aligned(a[bbFaces[h][3]].x),aligned(a[bbFaces[h][3]].y));for(var g=0;4>g;g++)c.lineTo(aligned(a[bbFaces[h][g]].x),aligned(a[bbFaces[h][g]].y));c.stroke()}}for(g=0;7>g;g++)d==g&&drawCircleVertex(c,a[g],g_boundingBoxVertexSize_px+3,"#ffffff"),drawCircleVertex(c,a[g],g_boundingBoxVertexSize_px,"#ffffff")}} function drawOrientationCube(c,a,d,f){if(14==a.length){for(var h=c.getContext("2d"),g=0;2>g;g++){h.fillStyle="#777777";h.strokeStyle=0==g?"#000000":"#ffffff";h.lineWidth=0==g?3:1;for(var b=0;3>b;b++){h.beginPath();h.moveTo(aligned(a[bbFaces[b][3]].x),aligned(a[bbFaces[b][3]].y));for(var e=0;4>e;e++)h.lineTo(aligned(a[bbFaces[b][e]].x),aligned(a[bbFaces[b][e]].y));h.stroke();b==f&&(h.closePath(),h.fill())}}h.font="16px Arial";for(e=8;14>e;e++)0minUserScale&&bmaxUserScale||(b(-(c[0]-p.width/ 2-(c[0]-p.width/2)/a),-(c[1]-p.height/2-(c[1]-p.height/2)/a)),e(a,a),g())}function z(a){mat4.fromZRotation(F,a);mat4.multiply(y.userTransform,F,y.userTransform);x=!0}function w(){p.ondblclick=function(){if(!E)mainLayout.onDoubleclick(q)};p.addEventListener("wheel",function(a){if(!E)if(1==a.ctrlKey||2==(t&2))n(0>a.deltaY?1.2:1/1.2,D);else{var b=a.shiftKey?10:1;mainLayout.scrollControl(q,0c?1.03:1/1.03):A(a,c);else if(1==(t&1)){var d=toolbarLayout.getLeftMouseMode(); d==LeftMouseMode_loupe&&(B=x=!0);d==LeftMouseMode_pan&&b(a,c);d==LeftMouseMode_rotate&&z(.01*(c+a));d==LeftMouseMode_zoom&&k(0>c?1.03:1/1.03);d==LeftMouseMode_wl&&A(a,c);d==LeftMouseMode_slice&&(0>K*c&&(K=0),K+=c,K>=mouseScrollStep&&(K-=mouseScrollStep,mainLayout.scrollControl(q,1)),K<=-mouseScrollStep&&(K+=mouseScrollStep,mainLayout.scrollControl(q,-1)))}else 2==(t&2)&&b(a,c),this.updateCursor()}};p.onmouseleave=function(a){p.onmouseup(a);t=0;this.style.cursor="default"};p.updateCursor=function(){E|| (this.style.cursor=getCurrentMouseCursor(this,r,1==(t&1)))}}function A(a,b){var c=u.getMeta("Modality");c="MG"==c||"CR"==c?10:1;y.windowLevel+=b*c;y.windowWidth+=a*c;1>y.windowWidth&&(y.windowWidth=1);x=!0;y.usingDefaultWL=!1;chooseWlWidget.updateInputValues()}var q=a,p=null,m=null,v=null,u=null,r=null,t=0,x=!1,C=!1,D=[0,0],y=new SeriesPresentationState,B=!1,E=!1,F=mat4.create(),G=!0,K=0;this.showOverlay=function(a){G=a;x=!0};this.setAsPreview=function(){E=!0};var J=new Overlay,I=new TransformData; this.getRawImage=function(){return u};this.updateCursor2d=function(a){null!=r&&r.updateCursor2dCenter(a)};this.updateRefLine=function(a){null!=r&&r.updateRefLine(a)};this.cancelMeasCreation=function(){null!=r&&r.cancelMeasCreation()};this.setSelection=function(a){x=!0};this.needRerender=function(){x=!0};this.setCanvas=function(a){p!=a&&(p=a,m=p.getContext("2d"),w())};this.setCanvas(c);this.resize=function(a,b){p.width=a;p.height=b;x=!0};this.overlay=function(){return J};this.doRoutine=function(){null!= u&&r.isNeedRerender()&&(x=!0);if(x){m.setTransform(1,0,0,1,0,0);m.clearRect(0,0,p.width,p.height);C&&(J.leftBottom[0]=u.downloadProgressText,drawOverlay(p,J));if(null!=u&&!C){h();m.drawImage(glcanvas,0,0);E||(g(),r.draw(m),u.isMetricsDefined&&drawScale(p,I.pixelsPerMm),u.isGeometryDefined&&drawOrientationLetters(p,u,y.userTransform),J.leftBottom[0]="W/L "+Math.round(y.windowWidth)+"/"+Math.round(y.windowLevel));if(B){n(loupeScaleFactor,D);h();var a=D[0]-loupeWidthPx/2,b=D[1]-loupeHeightPx/2;m.drawImage(glcanvas, a,b,loupeWidthPx,loupeHeightPx,a,b,loupeWidthPx,loupeHeightPx);drawLoupeFrame(m,a,b,loupeWidthPx,loupeHeightPx,I.pixelsPerMm);n(1/loupeScaleFactor,D)}G&&drawOverlay(p,J)}x=!1}C&&f(u);null!=r&&r.getCursor2d().wasChanged&&!E&&(d.onCursor2dChanged(r.getCursor2d().getPosition3d()),r.getCursor2d().wasChanged=!1)};this.updateSize=function(){this.resize(p.parentElement.clientWidth,p.parentElement.clientHeight)};this.setSeriesPs=function(a){y=a};this.setImageController=function(a){r=a.meas;f(a.rawImage)}; this.rotate=function(a){z(a*Math.PI/180)};this.flipH=function(){e(-1,1)};this.flipV=function(){e(1,-1)};this.deleteAllMeas=function(){null!=r&&r.clear()};this.reset=function(){mat4.identity(y.userTransform);y.userTranslate[0]=y.userTranslate[1]=0;x=!0;this.resetWL()};this.setRealSize=function(){var a=document.getElementById("dpiMeasure").offsetWidth;k(a/25.4/I.pixelsPerMm)};this.resetWL=function(){null!=y&&null!=u&&(y.usingDefaultWL=!0,y.windowLevel=u.windowLevel,y.windowWidth=u.windowWidth,y.inversePN= !1,x=!0,chooseWlWidget.updateInputValues())};this.setWL=function(a,b){null!=y&&null!=u&&(y.usingDefaultWL=!1,y.windowLevel=b,y.windowWidth=a,x=!0)};this.onPN=function(){y.inversePN=!y.inversePN;x=!0}} function ImageControlMpr(c,a,d){function f(a){null!=t&&t.cancelMeasCreation();D=C=!0;r=a;r.downloadStatus==StatusDownloaded&&(D=!1,u=createTexture(r))}function h(){drawImageGL(u,m.width,m.height,r.width,r.height,r.pixelSpacing,B.windowWidth,B.windowLevel,B.inversePN^r.isInversedPN(),B.userTransformMpr[q],B.userTranslateMpr[q],r.imageFormat)}function g(){H.setupTransformData(m.width,m.height,r.width*r.pixelSpacing[0],r.height*r.pixelSpacing[1],B.userTransformMpr[q],B.userTranslateMpr[q]);t.setTransform(H)} function b(a,b){var c=1/H.pixelsPerMm/H.userScale;a*=c;b*=c;c=B.userTransformMpr[q];B.userTranslateMpr[q][0]+=c[0]*a-c[1]*b;B.userTranslateMpr[q][1]+=c[5]*b-c[4]*a;C=!0}function e(a,b){mat4.fromScaling(G,[a,b,1]);a=B.userTransformMpr[q];mat4.multiply(a,G,a);C=!0}function k(a){var b=a*H.userScale;b>minUserScale&&bmaxUserScale||(b(-(c[0]-m.width/2-(c[0]-m.width/2)/a),-(c[1]-m.height/2-(c[1]-m.height/2)/a)),e(a,a),g())} function z(a){mat4.fromZRotation(G,a);a=B.userTransformMpr[q];mat4.multiply(a,G,a);C=!0}function w(){m.ondblclick=function(){p.onDoubleclick(q)};m.addEventListener("wheel",function(a){if(!F)if(1==a.ctrlKey||2==(x&2))n(0>a.deltaY?1.2:1/1.2,y);else{var b=a.shiftKey?10:1;p.scrollControl(q,0c?1.03:1/1.03):A(a,c);else if(1==(x&1)){var d=toolbarLayout.getLeftMouseMode();d==LeftMouseMode_loupe&&(E=C=!0);d==LeftMouseMode_pan&&b(a,c);d==LeftMouseMode_rotate&&z(.01*(c+a));d==LeftMouseMode_zoom&&k(0>c?1.03:1/1.03); d==LeftMouseMode_wl&&A(a,c);d==LeftMouseMode_slice&&(0>J*c&&(J=0),J+=c,J>=mouseScrollStep&&(J-=mouseScrollStep,p.scrollControl(q,1)),J<=-mouseScrollStep&&(J+=mouseScrollStep,p.scrollControl(q,-1)))}else 2==(x&2)&&b(a,c),this.updateCursor()}};m.onmouseleave=function(a){m.onmouseup(a);x=0;m.style.cursor="default"};m.updateCursor=function(){this.style.cursor=getCurrentMouseCursor(this,t,1==(x&1))}}function A(a,b){var c=r.getMeta("Modality");c="MG"==c||"CR"==c?10:1;B.windowLevel+=b*c;B.windowWidth+=a* c;1>B.windowWidth&&(B.windowWidth=1);p.needRerender();chooseWlWidget.updateInputValues()}var q=a,p=d,m=null,v=null,u=null,r=null,t=null,x=0,C=!1,D=!1,y=[0,0],B=new SeriesPresentationState,E=!1,F=!1,G=mat4.create(),K=!0,J=0;this.showOverlay=function(a){K=a;C=!0};this.setAsPreview=function(){F=!0};var I=new Overlay,H=new TransformData;this.getRawImage=function(){return r};this.updateRefLine=function(a){null!=t&&t.updateRefLine(a)};this.updateCursor2d=function(a,b){null!=t&&t.updateCursor2d(a,b,q)}; this.cancelMeasCreation=function(){null!=t&&t.cancelMeasCreation()};this.setSelection=function(a){C=!0};this.needRerender=function(){C=!0};this.setCanvas=function(a){m!=a&&(m=a,v=m.getContext("2d"),w())};this.setCanvas(c);this.resize=function(a,b){m.width=a;m.height=b;C=!0};this.overlay=function(){return I};this.doRoutine=function(){null!=r&&t.isNeedRerender()&&(C=!0);if(C){v.setTransform(1,0,0,1,0,0);v.clearRect(0,0,m.width,m.height);h();v.drawImage(glcanvas,0,0);g();t.draw(v);r.isMetricsDefined&& drawScale(m,H.pixelsPerMm);r.isGeometryDefined&&drawOrientationLetters(m,r,B.userTransformMpr[q]);I.leftBottom[0]="W/L "+Math.round(B.windowWidth)+"/"+Math.round(B.windowLevel);if(E){n(loupeScaleFactor,y);h();var a=y[0]-loupeWidthPx/2,b=y[1]-loupeHeightPx/2;v.drawImage(glcanvas,a,b,loupeWidthPx,loupeHeightPx,a,b,loupeWidthPx,loupeHeightPx);drawLoupeFrame(v,a,b,loupeWidthPx,loupeHeightPx,H.pixelsPerMm);n(1/loupeScaleFactor,y)}K&&drawOverlay(m,I);C=!1}D&&f(r);null!=t&&t.getCursor2d().wasChanged&&(p.setCursor3d(t.getCursor2d().getPosition3d(), t.getCursor2d().getNavX(),t.getCursor2d().getNavY(),q),t.getCursor2d().wasChanged=!1)};this.updateSize=function(){this.resize(m.parentElement.clientWidth,m.parentElement.clientHeight)};this.setSeriesPs=function(a){B=a};this.setImageController=function(a){t=a.meas;f(a.rawImage)};this.rotate=function(a){z(a*Math.PI/180)};this.flipH=function(){e(-1,1)};this.flipV=function(){e(1,-1)};this.deleteAllMeas=function(){null!=t&&t.clear()};this.reset=function(){mat4.identity(B.userTransformMpr[q]);B.userTranslateMpr[q][0]= B.userTranslateMpr[q][1]=0;C=!0;this.resetWL()};this.setRealSize=function(){var a=document.getElementById("dpiMeasure").offsetWidth;k(a/25.4/H.pixelsPerMm)};this.resetWL=function(){null!=B&&null!=r&&(B.windowLevel=r.windowLevel,B.windowWidth=r.windowWidth,B.inversePN=!1,p.needRerender(),chooseWlWidget.updateInputValues())};this.setWL=function(a,b){null!=B&&null!=r&&(B.windowLevel=b,B.windowWidth=a,p.needRerender())};this.onPN=function(){B.inversePN=!B.inversePN;p.needRerender()}} var colormapsUrl="http://ngavrilov.ru/invols/jsMedViewer/gl/colormaps/",colormaps={Bones:"CT Bones_289_299.png","Bones + Skin":"CT Bones + Skin_844_-160.png","Fat tissue":"CT Fat tissue_136_-139.png",Lungs:"CT Lungs_364_-400.png",Muscles:"CT Muscles_437_147.png",Skin:"CT Skin_272_-446.png",Vessels:"CT Vessels_195_164.png",Vessels2:"CT vessels2_178_160.png"}; function ImageControlDvr(c,a){function d(a){r.scale*=a;m=!0;E.clear()}function f(){n.ondblclick=function(){k.onDoubleclick(3)};n.addEventListener("wheel",function(a){d(0c?1.03:1/1.03):b(a,c);else if(1==(q&1)){H=!0;var e=toolbarLayout.getLeftMouseMode();2==(q&2)?g(a,c):(e==LeftMouseMode_pan&&h(a,c),e==LeftMouseMode_rotate&&g(a,c),e!=LeftMouseMode_zoom&&e!=LeftMouseMode_slice||d(0>c?1.03:1/1.03),e==LeftMouseMode_wl&&b(a,c))}else 2==(q&2)&&(H=!0,h(a,c)),this.updateCursor()};n.onmouseleave=function(a){n.onmouseup(a);q=0; H=!1;m=!0;n.style.cursor="default"};n.updateCursor=function(){toolbarLayout.getLeftMouseMode()==LeftMouseMode_loupe?this.style.cursor="not-allowed":L.isHoverSomething()?this.style.cursor="move":this.style.cursor=getCurrentMouseCursor(this,E,1==(q&1))}}function h(a,b){var c=F.pixelsPerMm;a=vec3.scale([],r.position.x,-a/c);b=vec3.scale([],r.position.y,b/c);vec3.add(r.position.center,r.position.center,a);vec3.add(r.position.center,r.position.center,b);vec3.add(r.offset,r.offset,a);vec3.add(r.offset, r.offset,b);m=!0;E.clear()}function g(a,b){r.rotate2(a,b,v,n.width,n.height);m=!0;E.clear()}function b(a,b){D+=b;C+=a;1>C&&(C=1);m=!0;exportMeshWidget.updateText()}function e(a){var b=new Image;b.onload=function(){gl.activeTexture(gl.TEXTURE1);gl.texSubImage2D(gl.TEXTURE_2D,0,0,0,512,1,gl.RGBA,gl.UNSIGNED_BYTE,b);m=!0};b.crossOrigin="anonymous";b.src=colormapsUrl+colormaps[a];a=b.src.split("_");C=parseInt(a[1]);D=parseInt(a[2])}var k=a,n=null,z=null,w=null,A=null,q=0,p=!1,m=!1,v=[0,0],u=!0,r=new Camera, t=0,x="MIP",C,D,y=createPresetTexture(),B=new RawImage,E=new MeasManager(B,k),F=new TransformData,G=[0,0,0],K=mat4.create(),J=[0,0],I=null,H=!1,L=new BoundingBox;this.setTexture3D=function(a){w=a;m=!0};this.setMaskTexture3D=function(a){A=a;m=!0};this.showOverlay=function(a){u=a;p=!0};this.setAsPreview=function(){m_isPreview=!0};var N=new Overlay;this.getBoundingBoxVx=function(){var a=k.getVolumeStructure(),b=L.getBox();return[[Math.round(b[0][0]/a.spacing[0]),Math.round(b[0][1]/a.spacing[1]),Math.round(b[0][2]/ a.spacing[2])],[Math.round(b[1][0]/a.spacing[0]),Math.round(b[1][1]/a.spacing[1]),Math.round(b[1][2]/a.spacing[2])]]};this.getWindowWidth=function(){return C};this.getWindowLevel=function(){return D};this.setWindowLevel=function(a){D=a;m=!0};this.setWindowWidth=function(a){C=a;m=!0};this.updateCursor2d=function(a){G=a[0].center;E.updateCursor2dCenter(G);p=!0};this.cancelMeasCreation=function(){E.cancelMeasCreation()};this.setSelection=function(a){p=!0};this.needRerender=function(){p=!0};this.setCanvas= function(a){n!=a&&(n=a,z=n.getContext("2d"),f())};this.setCanvas(c);this.resize=function(a,b){n.width=a;n.height=b;m=!0};this.overlay=function(){return N};this.doRoutine=function(){if(E.isNeedRerender()||L.needRerender||m)p=!0;if(p&&(0==t||!m)){p=!1;B.width=n.width;B.height=n.height;var a=B.pixelSpacing,b=B.pixelSpacing,c=k.getVolumeStructure();a[0]=b[1]=1/(n.height/(c.size[2]*c.spacing[2]*r.scale));B.isDensityDefined=!1;a=k.getVolumeStructure();b=vec3.scale([],r.position.x,-B.width*B.pixelSpacing[0]* .5);c=vec3.scale([],r.position.y,B.height*B.pixelSpacing[1]*.5);var d=[r.offset[0]+a.size[0]*a.spacing[0]*.5,r.offset[1]+a.size[1]*a.spacing[1]*.5,r.offset[2]+a.size[2]*a.spacing[2]*.5];vec3.add(d,d,b);vec3.add(d,d,c);B.imagePosition=a.position.GetCoordsW(d);B.imageOrientationX=a.position.GetCoordsWRot(r.position.x);B.imageOrientationY=a.position.GetCoordsWRot(r.position.y);vec3.scale(B.imageOrientationY,B.imageOrientationY,-1);F.setupTransformData(n.width,n.height,B.width*B.pixelSpacing[0],B.height* B.pixelSpacing[1],K,J);E.setTransform(F);z.setTransform(1,0,0,1,0,0);z.clearRect(0,0,n.width,n.height);a=k.getVolumeStructure();b=H?n.width/2:n.width;c=H?n.height/2:n.height;m?(m=!1,renderVolumeGL(w,A,b,c,C,D,a,r,x,y,L.getBox()),z.drawImage(glcanvas,0,0,b,c,0,0,n.width,n.height),I=new Image,I.src=glcanvas.toDataURL(),E.updateCursor2dCenter(G)):z.drawImage(I,0,0,b,c,0,0,n.width,n.height);L.draw(z,B);E.draw(z);drawScale(n,F.pixelsPerMm);drawOrientationLetters(n,B,K);N.leftBottom[0]="W/L "+Math.round(m_seriesPs.windowWidth)+ "/"+Math.round(m_seriesPs.windowLevel);u&&drawOverlay(n,N);t=5}0!=t&&t--;E.getCursor2d().wasChanged&&(k.setCursor3d(E.getCursor2d().getPosition3d(),E.getCursor2d().getNavX(),E.getCursor2d().getNavY(),3),E.getCursor2d().wasChanged=!1)};this.updateSize=function(){this.resize(n.parentElement.clientWidth,n.parentElement.clientHeight)};this.setSeriesPs=function(a){m_seriesPs=a};this.rotate=function(a){};this.flipH=function(){};this.flipV=function(){};this.deleteAllMeas=function(){E.clear()};this.reset= function(){r.reset(k.getVolumeStructure());m=!0;L.setVolume(k.getVolumeStructure())};this.setRealSize=function(){document.getElementById("dpiMeasure")};this.getPreset=function(){return x};this.setPreset=function(a){x=a;"MIP"!=a&&"SSD"!=a&&"WL"!=a&&"Print3d"!=a?e(a):(C=m_seriesPs.windowWidth,D=m_seriesPs.windowLevel,m=!0);"Print3d"==a?exportMeshWidget.show():exportMeshWidget.hide()};this.getRawImage=function(){return null};this.resetWL=function(){};this.setWL=function(a,b){null!=m_seriesPs&&null!= B&&(m_seriesPs.windowLevel=b,m_seriesPs.windowWidth=a,k.needRerender())};this.onPN=function(){m_seriesPs.inversePN=!m_seriesPs.inversePN;k.needRerender()}}var gpuDvrValuesShift=1E3;function ImageGeometry(){new CS3}var g_volumeTextures=[];function getVolumeTexture(c,a){void 0==g_volumeTextures[a]&&(g_volumeTextures[a]=loadVolumeGPU(c));return g_volumeTextures[a]} function loadVolumeGPU(c){var a=gl.createTexture();gl.activeTexture(gl.TEXTURE0);gl.bindTexture(gl.TEXTURE_3D,a);gl.texStorage3D(gl.TEXTURE_3D,1,gl.R16F,c.size[0],c.size[1],c.size[2]);gl.texParameteri(gl.TEXTURE_3D,gl.TEXTURE_MIN_FILTER,gl.LINEAR);gl.texParameteri(gl.TEXTURE_3D,gl.TEXTURE_BASE_LEVEL,0);gl.texParameteri(gl.TEXTURE_3D,gl.TEXTURE_MAX_LEVEL,1);gl.texParameteri(gl.TEXTURE_3D,gl.TEXTURE_MAG_FILTER,gl.LINEAR);gl.texParameteri(gl.TEXTURE_3D,gl.TEXTURE_MIN_FILTER,gl.LINEAR);gl.texParameteri(gl.TEXTURE_3D, gl.TEXTURE_WRAP_R,gl.CLAMP_TO_EDGE);gl.texParameteri(gl.TEXTURE_3D,gl.TEXTURE_WRAP_S,gl.CLAMP_TO_EDGE);gl.texParameteri(gl.TEXTURE_3D,gl.TEXTURE_WRAP_T,gl.CLAMP_TO_EDGE);gl.pixelStorei(gl.UNPACK_ALIGNMENT,1);gl.pixelStorei(gl.PACK_ALIGNMENT,1);for(var d=c.images[0].rescaleIntercept,f=c.size[0]*c.size[1],h=new Uint16Array(f),g=0;gMath.abs(vec3.dot(d,g.z))){d=vec3.mult1([],c.imageOrientationX,c.pixelSpacing[0]*c.width);var b=vec3.mult1([],c.imageOrientationY,c.pixelSpacing[1]*c.height);a=[];a[0]=g.GetCoords(c.imagePosition);a[1]=g.GetCoords(vec3.add([],c.imagePosition,d));a[2]=g.GetCoords(vec3.add([],c.imagePosition,vec3.add([],b,d)));a[3]=g.GetCoords(vec3.add([],c.imagePosition, b));c=[];for(d=g=0;4>d;d++){b=g;var e=a[d];var f=a[(d+1)%4];if(f[2]==e[2])e=null;else{var n=-(e[2]/(f[2]-e[2]));e=0>n||1n?"yellow":"grey";drawCross(a,f,B);a.stroke();h=g;this.needRerender=!1}};this.updateCrossPosition=function(a,b){this.isVisible=!0;this.center[0]=(a[0]-b.imagePosition[0])* b.imageOrientationX[0]+(a[1]-b.imagePosition[1])*b.imageOrientationX[1]+(a[2]-b.imagePosition[2])*b.imageOrientationX[2];this.center[1]=(a[0]-b.imagePosition[0])*b.imageOrientationY[0]+(a[1]-b.imagePosition[1])*b.imageOrientationY[1]+(a[2]-b.imagePosition[2])*b.imageOrientationY[2];g=b;null!=g.pixels&&(n=math3d.planePointDist(vec3.cross([],g.imageOrientationX,g.imageOrientationY),g.imagePosition,a))};this.updatePosition=function(a,b){this.updateCrossPosition(a[0].center,b);0==this.projectionId?(e[0]= vec3.dot(b.imageOrientationX,a[1].x),e[1]=vec3.dot(b.imageOrientationY,a[1].x),vec2.normalize(e,e)):1==this.projectionId?(e[0]=vec3.dot(b.imageOrientationX,a[0].x),e[1]=vec3.dot(b.imageOrientationY,a[0].x),vec2.normalize(e,e)):2==this.projectionId&&(e[0]=vec3.dot(b.imageOrientationX,a[0].y),e[1]=vec3.dot(b.imageOrientationY,a[0].y),vec2.normalize(e,e));this.needRerender=!0};this.isSelectedSomething=function(){return a};this.isHoverSomething=function(){return c};this.getPosition3d=function(){return[g.imagePosition[0]+ g.imageOrientationX[0]*this.center[0]+g.imageOrientationY[0]*this.center[1],g.imagePosition[1]+g.imageOrientationX[1]*this.center[0]+g.imageOrientationY[1]*this.center[1],g.imagePosition[2]+g.imageOrientationX[2]*this.center[0]+g.imageOrientationY[2]*this.center[1]]};this.getNavX=function(){return[g.imageOrientationX[0]*e[0]+g.imageOrientationY[0]*e[1],g.imageOrientationX[1]*e[0]+g.imageOrientationY[1]*e[1],g.imageOrientationX[2]*e[0]+g.imageOrientationY[2]*e[1]]};this.getNavY=function(){return[g.imageOrientationX[0]* e[1]-g.imageOrientationY[0]*e[0],g.imageOrientationX[1]*e[1]-g.imageOrientationY[1]*e[0],g.imageOrientationX[2]*e[1]-g.imageOrientationY[2]*e[0]]};this.onmousemove=function(g,k){if(this.isVisible)if(a)if(f==CSP_CROSS)this.center[0]=g[0],this.center[1]=g[1],this.needRerender=this.wasChanged=!0;else if(f==CSP_HLINE)g=vec2.dot(k,[e[1],-e[0]]),this.center[0]+=e[1]*g,this.center[1]-=e[0]*g,this.needRerender=this.wasChanged=!0;else if(f==CSP_VLINE)g=vec2.dot(k,e),this.center[0]+=e[0]*g,this.center[1]+= e[1]*g,this.needRerender=this.wasChanged=!0;else if(f==CSP_HROT){g=[g[0]-this.center[0],g[1]-this.center[1]];k=vec2.length(g);var n=vec2.dot(g,e);e[0]=g[0]/k;e[1]=g[1]/k;0>n&&(e[0]=-e[0],e[1]=-e[1]);this.needRerender=this.wasChanged=!0}else f==CSP_VROT&&(g=[g[1]-this.center[1],-g[0]+this.center[0]],k=vec2.length(g),n=vec2.dot(g,e),e[0]=g[0]/k,e[1]=g[1]/k,0>n&&(e[0]=-e[0],e[1]=-e[1]),this.needRerender=this.wasChanged=!0);else{k=Cursor3dSizePx/h;n=c;var r=d;c=!1;g[0]>this.center[0]-k&&g[1]>this.center[1]- k&&g[0]a[0]&&(a=[-a[0],-a[1]]),.95a[1]?"n-resize":0>a[1]?"sw-resize":"se-resize"}return"default"}} function BoundingBox(){function c(a,b){drawVertex(a,b,7,"white",1)}function a(a){return[((a[0]-g.imagePosition[0])*g.imageOrientationX[0]+(a[1]-g.imagePosition[1])*g.imageOrientationX[1]+(a[2]-g.imagePosition[2])*g.imageOrientationX[2])/g.pixelSpacing[0],((a[0]-g.imagePosition[0])*g.imageOrientationY[0]+(a[1]-g.imagePosition[1])*g.imageOrientationY[1]+(a[2]-g.imagePosition[2])*g.imageOrientationY[2])/g.pixelSpacing[1]]}var d=[[0,0,0],[0,0,0]],f=null,h;this.isVisible=!0;this.needRerender=this.wasChanged= !1;var g=null,b,e,k,n,z,w,A,q,p=-1,m=-1;this.getBox=function(){return d};this.setVolume=function(a){f=a;this.reset()};this.reset=function(){d[0][0]=d[0][1]=d[0][2]=0;d[1]=vec3.multiply([],f.size,f.spacing);h=vec3.multiply([],f.size,f.spacing);this.needRerender=!0};this.draw=function(h,m){g=m;this.isVisible&&(b=a(f.position.GetCoordsW(d[0])),e=a(f.position.GetCoordsW([d[1][0],d[0][1],d[0][2]])),k=a(f.position.GetCoordsW([d[0][0],d[1][1],d[0][2]])),n=a(f.position.GetCoordsW([d[1][0],d[1][1],d[0][2]])), z=a(f.position.GetCoordsW([d[0][0],d[0][1],d[1][2]])),w=a(f.position.GetCoordsW([d[1][0],d[0][1],d[1][2]])),A=a(f.position.GetCoordsW([d[0][0],d[1][1],d[1][2]])),q=a(f.position.GetCoordsW(d[1])),m=vec3.cross([],m.imageOrientationX,m.imageOrientationY),m=f.position.GetCoordsRot(m),(0m[0]||0m[1]||0m[2])&&drawLineS(h,z[0],z[1],w[0],w[1],.5,"white"),(0>m[0]||0>m[2])&&drawLineS(h,w[0],w[1],q[0],q[1],.5,"white"),(0>m[1]||0>m[2])&&drawLineS(h,q[0],q[1],A[0],A[1],.5,"white"),(0m[2])&&drawLineS(h,z[0],z[1],A[0],A[1],.5,"white"),(0m[0]||0m[0]||0>m[1])&&drawLineS(h,n[0],n[1],q[0],q[1],.5,"white"),(0m[1])&&drawLineS(h,k[0],k[1], A[0],A[1],.5,"white"),1==p&&c(h,b),2==p&&c(h,e),3==p&&c(h,k),4==p&&c(h,n),5==p&&c(h,z),6==p&&c(h,w),7==p&&c(h,A),8==p&&c(h,q),this.needRerender=!1)};this.isSelectedSomething=function(){return-1!=m};this.isHoverSomething=function(){return-1!=p};this.onmousemove=function(a){if(this.isVisible)if(-1!=m){var c=vec3.cross([],g.imageOrientationX,g.imageOrientationY);c=f.position.GetCoordsRot(c);a=[g.imagePosition[0]+g.imageOrientationX[0]*a[0]*g.pixelSpacing[0]+g.imageOrientationY[0]*a[1]*g.pixelSpacing[1], g.imagePosition[1]+g.imageOrientationX[1]*a[0]*g.pixelSpacing[0]+g.imageOrientationY[1]*a[1]*g.pixelSpacing[1],g.imagePosition[2]+g.imageOrientationX[2]*a[0]*g.pixelSpacing[0]+g.imageOrientationY[2]*a[1]*g.pixelSpacing[1]];a=f.position.GetCoords(a);var r=[1,0,0];Math.abs(c[1])>Math.abs(c[0])&&Math.abs(c[1])>Math.abs(c[2])&&(r[0]=0,r[1]=1);Math.abs(c[2])>Math.abs(c[0])&&Math.abs(c[2])>Math.abs(c[1])&&(r[0]=0,r[2]=1);1==m&&(d[0]=math3d.lineCrossPlane(a,c,d[0],r));if(2==m){var t=math3d.lineCrossPlane(a, c,[d[1][0],d[0][1],d[0][2]],r);d[1][0]=t[0];d[0][1]=t[1];d[0][2]=t[2]}3==m&&(t=math3d.lineCrossPlane(a,c,[d[0][0],d[1][1],d[0][2]],r),d[0][0]=t[0],d[1][1]=t[1],d[0][2]=t[2]);4==m&&(t=math3d.lineCrossPlane(a,c,[d[1][0],d[1][1],d[0][2]],r),d[1][0]=t[0],d[1][1]=t[1],d[0][2]=t[2]);5==m&&(t=math3d.lineCrossPlane(a,c,[d[0][0],d[0][1],d[1][2]],r),d[0][0]=t[0],d[0][1]=t[1],d[1][2]=t[2]);6==m&&(t=math3d.lineCrossPlane(a,c,[d[1][0],d[0][1],d[1][2]],r),d[1][0]=t[0],d[0][1]=t[1],d[1][2]=t[2]);7==m&&(t=math3d.lineCrossPlane(a, c,[d[0][0],d[1][1],d[1][2]],r),d[0][0]=t[0],d[1][1]=t[1],d[1][2]=t[2]);8==m&&(d[1]=math3d.lineCrossPlane(a,c,d[1],r));for(c=0;3>c;c++)d[1][c]d[0][c]&&(d[0][c]=0),d[1][c]>h[c]&&(d[1][c]=h[c]);this.needRerender=!0}else c=p,p=-1,100>vec2.squaredDistance(a,b)&&(p=1),100>vec2.squaredDistance(a,e)&&(p=2),100>vec2.squaredDistance(a,k)&&(p=3),100>vec2.squaredDistance(a,n)&&(p=4),100>vec2.squaredDistance(a,z)&&(p=5),100>vec2.squaredDistance(a,w)&&(p=6),100>vec2.squaredDistance(a, A)&&(p=7),100>vec2.squaredDistance(a,q)&&(p=8),c!=p&&(this.needRerender=!0)};this.onmouseup=function(a){m=p=-1};this.onmousedown=function(a){m=p}} function Camera(){this.position=new CS3;this.offset=[0,0,0];this.scale=1;var c=0;this.reset=function(a){this.position.x=[1,0,0];this.position.y=[0,0,1];this.position.z=[0,1,0];this.position.center=[0,-3*a.size[1]*a.spacing[1],0];this.offset=[0,0,0];this.scale=1;c=vec3.distance(this.offset,this.position.center)};this.rotate=function(a,d){a=mat4.fromRotation([],a,d);vec3.transformMat4(this.position.x,this.position.x,a);vec3.transformMat4(this.position.y,this.position.y,a);vec3.transformMat4(this.position.z, this.position.z,a);this.position.Correct();vec3.add(this.position.center,this.offset,vec3.scale([],this.position.z,-c))};this.rotate2=function(a,c,f,h,g){var b=this.position.y;g=mat4.fromRotation([],Math.PI*f[1]/g-Math.PI/2,this.position.x);vec3.transformMat4(b,b,g);this.rotate(-.01*a,b);a=this.position.x;mat4.fromRotation(g,Math.PI*f[0]/h-Math.PI/2,this.position.y);vec3.transformMat4(a,a,g);this.rotate(-.01*c,a)}} function PreviewItem(c,a,d){this.canvasId=c;this.imageControl=null;this.studyId=a;this.seriesId=d;var f=!1;this.getSeries=function(){return studiesController.studies[this.studyId].series[this.seriesId]};this.updateOverlay=function(){var a=this.getSeries(),c=a.images[0].rawImage,b=a.imagesOfStatusCount(StatusDownloaded),d=this.imageControl.overlay();d.leftTop[0]=c.getMeta("Modality");d.leftTop[1]=c.getMeta("SeriesDescription");d.rightTop[0]="#"+c.getMeta("SeriesNumber");d.leftBottom[0]=b==a.images.length? b+"":"loading..."+(b+"/"+a.images.length);this.imageControl.needRerender();f||c.downloadStatus!=StatusDownloaded||(this.imageControl.updateSize(),f=!0)}} function PreviewLayout(){function c(){for(var c=[],d="",b=0;b";a[b]="";for(var f=0;f"}}d+="
";document.getElementById("previewLayout").innerHTML=d; for(d=0;d"+b.getMeta("AcquisitionDate"),a[g]="
"+a[g]+"
",document.getElementById("studyHeader"+g).innerHTML=a[g])}}}} var LeftMouseMode_pan=1,LeftMouseMode_rotate=2,LeftMouseMode_zoom=3,LeftMouseMode_wl=4,LeftMouseMode_slice=5,LeftMouseMode_loupe=6,LeftMouseMode_measLine=100,LeftMouseMode_measAngle=101,LeftMouseMode_measEllipse=102,LeftMouseMode_measContour=103,LeftMouseMode_measCutContour=104,LeftMouseMode_measLast=200; function ToolbarLayout(){function c(){for(var a=[["wl",LeftMouseMode_wl],["pan",LeftMouseMode_pan],["rotate",LeftMouseMode_rotate],["zoom",LeftMouseMode_zoom],["slice",LeftMouseMode_slice],["loupe",LeftMouseMode_loupe],["distance",LeftMouseMode_measLine],["angle",LeftMouseMode_measAngle],["ellipse",LeftMouseMode_measEllipse],["contour",LeftMouseMode_measContour],["cutContour",LeftMouseMode_measCutContour]],b=0;b");var f=a[d];c+=""+("
");0==(d+1)%2&&(c+="")}0!=a.length%2&&(c+="");return c+"
"}var d=LeftMouseMode_pan,f=[];this.getLeftMouseMode=function(){return d};this.isMeasMode= function(){return d>=LeftMouseMode_measLine&&d<=LeftMouseMode_measLast};this.onLeftMouseMode=function(a){mainLayout.cancelMeasCreation();d=a;c();null!=cutWidget&&(a==LeftMouseMode_measCutContour?cutWidget.show():cutWidget.hide())};this.isToolEnabled=function(a){return f[a]};f.sync=!0;var h=""+a("layout1x1 layout2x1 layout1x2 layout2x2 layout3x1 layout3x2".split(" "),"layout 1x1;layout 2x1;layout 1x2;layout 2x2;layout 3x1;layout 3x2".split(";"));h+=a("reset pn flipH flipV rotate90 rotateMinus90 realScale overlay play chooseWL 3d sync".split(" "), "Reset;Positive/Negative;Flip horizontally;Flip vertically;Rotate 90\u00b0 CCW;Rotate 90\u00b0 CW;Set real scale;Show/Hide overlay;Scroll by timer;Choose WL;Switch 2d/3d modes;Enable/Disable synchronization".split(";"));h+=a("wl loupe pan rotate zoom slice".split(" "),"Adjust WL;Use loupe;Translate image;Rotate image;Zoom in/out;Scroll images".split(";"));h+=a("distance angle ellipse contour cutContour deleteMeas".split(" "),"Distance;Angle;Ellipse;Contour;Cut contour for 3D;Delete all measurements".split(";")); document.getElementById("toolbar").innerHTML=h;this.onClick=function(a){"layout1x1"==a&&mainLayout.setup(1,1);"layout2x1"==a&&mainLayout.setup(2,1);"layout1x2"==a&&mainLayout.setup(1,2);"layout2x2"==a&&mainLayout.setup(2,2);"layout3x1"==a&&mainLayout.setup(3,1);"layout3x2"==a&&mainLayout.setup(3,2);"reset"==a&&mainLayout.reset();if("pn"==a)mainLayout.onPN();"rotate90"==a&&mainLayout.rotate(90);"rotateMinus90"==a&&mainLayout.rotate(-90);"flipH"==a&&mainLayout.flipH();"flipV"==a&&mainLayout.flipV(); "realScale"==a&&mainLayout.setRealSize();if("overlay"==a)mainLayout.onOverlay();if("play"==a)mainLayout.onPlay();if("3d"==a)mainLayout.on3d();"sync"==a&&(f.sync=!f.sync,c(),mainLayout.onSync());if("pan"==a)this.onLeftMouseMode(LeftMouseMode_pan);if("rotate"==a)this.onLeftMouseMode(LeftMouseMode_rotate);if("zoom"==a)this.onLeftMouseMode(LeftMouseMode_zoom);if("chooseWL"==a)mainLayout.onWL();if("wl"==a)this.onLeftMouseMode(LeftMouseMode_wl);if("slice"==a)this.onLeftMouseMode(LeftMouseMode_slice);if("loupe"== a)this.onLeftMouseMode(LeftMouseMode_loupe);if("distance"==a)this.onLeftMouseMode(LeftMouseMode_measLine);if("angle"==a)this.onLeftMouseMode(LeftMouseMode_measAngle);if("ellipse"==a)this.onLeftMouseMode(LeftMouseMode_measEllipse);if("contour"==a)this.onLeftMouseMode(LeftMouseMode_measContour);if("cutContour"==a)this.onLeftMouseMode(LeftMouseMode_measCutContour);"deleteMeas"==a&&mainLayout.deleteAllMeas()}} function LayoutItem(c){var a=new ImageControl(document.getElementById("canvas"+c),c,this),d=-1,f=-1,h=null,g=null,b=!1,e=null,k=!1;this.isEnabled=!0;this.isMpr=!1;this.getStudyId=function(){return d};this.getSeriesId=function(){return f};this.getImageId=function(){return m_imageId};this.initHeaderEvents=function(){document.getElementById("layoutHeader"+c).ondblclick=function(){mainLayout.onDoubleclick(c)}};this.getStudy=function(){return-1==d?null:studiesController.studies[d]};this.getSeries=function(){return g}; this.getImage=function(){return-1==d?null:g.images[h.imageId].rawImage};this.updateAll=function(){this.updateOverlay();this.updateTitle();this.updateScroll()};this.updateOverlay=function(){if(-1!=d){var b=a.overlay(),c=this.getImage();b.setupOverlay(c);var e=c.getMeta("SeriesNumber");""==e&&(e=g.seriesNumber);b.addLT("Se: "+e+"/"+this.getStudy().series.length);b.addLT("Im: "+c.getMeta("InstanceNumber")+"/"+g.images.length);a.needRerender()}};this.updateTitle=function(){var e=document.getElementById("layoutHeader"+ c);if(-1==d)e.innerHTML="";else{var f=this.getImage();f=f.getMeta("PatientName")+" "+f.getMeta("AcquisitionDate")+" "+f.getMeta("AcquisitionTime");b&&(f+=" (copy)");e.innerHTML=f;a.updateSize()}};this.updateScroll=function(){var a=document.getElementById("range"+c);-1!=d?(a.min=0,a.max=g.images.length-1,a.value=h.imageId,a.step=1,a.hidden=0==a.max):a.hidden=!0};this.setCurrentImage=function(b,c){-1!=d&&(b=parseInt(b),0>b&&(b=0),b>=g.images.length&&(b=g.images.length-1),h.imageId!=b&&(h.imageId=b, a.setImageController(g.images[h.imageId]),c&&this.projectCursor3d(),this.updateOverlay()))};this.scrollControl=function(a){-1!=d&&(this.setCurrentImage(h.imageId+a,!0),this.updateScroll())};this.scrollControlLoop=function(a){-1!=d&&(a=h.imageId+a,0>a&&(a+=g.images.length),a>=g.images.length&&(a-=g.images.length),this.setCurrentImage(a,!0),this.updateScroll())};this.loadSeries=function(c,e){if(d!=c||f!=e){b=mainLayout.seriesExists(c,e);d=c;f=e;c=studiesController.studies[d].series[f];if(b){e=new SeriesController; for(var n=0;na;a++)t[a]=!0}function h(){v=getMaskTexture(m,q.size,u,!0);e[3].setMaskTexture3D(v)}function g(a){e[a].updateCursor2d(r,y<=q.spacing[2]?0:.5*y)}var b=c,e=[new ImageControlMpr(document.getElementById("canvas"+c+"_0"),0,this),new ImageControlMpr(document.getElementById("canvas"+c+"_1"),1,this),new ImageControlMpr(document.getElementById("canvas"+c+"_2"),2, this),new ImageControlDvr(document.getElementById("canvas"+c+"_3"),this)],k=-1,n=-1,z=null,w=null,A=!1,q=null,p=null,m=[],v=null,u="",r=[new CS3,new CS3,new CS3],t=[!1,!1,!1],x=0,C=!1,D="MIP",y=.1,B=0;this.isMpr=this.isEnabled=!0;this.setFullScreen=function(a){C=a};this.getSelectedProjectionId=function(){return x};this.getStudyId=function(){return k};this.getSeriesId=function(){return n};this.getImageId=function(){return m_imageId};this.getVolumeStructure=function(){return q};this.getVolumeTexture= function(){return p};this.getMaskVoxels=function(){return m};this.onDoubleclick=function(a){this.getMprLayoutElement().innerHTML=C?generateLayoutMprHtml4(b):generateLayoutMprHtml1(b,a);C=!C;this.updateCanvas();this.updateSize();this.updateScroll();this.selectControl(x)};this.scrollControl=function(a,b){};this.selectControl=function(c){x=c;mainLayout.selectControl(b);mainLayout.updateRefLines();for(c=0;4>c;c++)if(a(c)){var d=this.getProjectionElement(c);null!=d&&(d.style.border=c==x?"1px solid #aaa": "1px solid #000")}};this.resetPlanes=function(){for(var a=0;3>a;a++)for(var c=0;3>c;c++)r[a].center[c]=q.position.center[c]+q.position.x[c]*q.size[0]*q.spacing[0]*.5+q.position.y[c]*q.size[1]*q.spacing[1]*.5+q.position.z[c]*q.size[2]*q.spacing[2]*.5;a=q.position.x;c=q.position.y;var d=q.position.z;d=vec3.scale([],d,-1);r[0].x=vec3.clone(a);r[0].y=vec3.clone(c);r[0].z=vec3.clone(d);r[1].x=vec3.clone(a);r[1].y=vec3.clone(d);r[1].z=vec3.clone(c);r[2].x=vec3.clone(c);r[2].y=vec3.clone(d);r[2].z=vec3.clone(a); f();g(3);mainLayout.onCursor3dChanged(b)};this.initHeaderEvents=function(){document.getElementById("layoutHeader"+b).ondblclick=function(){mainLayout.onDoubleclick(b)}};this.getStudy=function(){return-1==k?null:studiesController.studies[k]};this.getSeries=function(){return w};this.getImage=function(){return-1==k?null:e[x].getRawImage()};this.updateAll=function(){this.updateOverlay();this.updateTitle();this.updateScroll()};this.updateOverlay=function(){if(-1!=k)for(var b=0;4>b;b++)if(a(b)){var c=e[b], d=c.overlay(),f=q.images[0];d.setupOverlayMpr(f);f=f.getMeta("SeriesNumber");""==f&&(f=w.seriesNumber);d.addLT("Se: "+f+"/"+this.getStudy().series.length);c.needRerender()}};this.updateTitle=function(){var a=document.getElementById("layoutHeader"+b);if(-1==k)a.innerHTML="";else{var c=w.images[0].rawImage;c=c.getMeta("PatientName")+" "+c.getMeta("AcquisitionDate");A&&(c+=" (copy)");a.innerHTML=c;mainLayout.updateHeaderElements(b)}};this.updateScroll=function(){if(null!=q)for(var b=0;3>b;b++)if(a(b)){var c= MprFunctions.getCurAndMaxScanNum(r[b],q),e=d(b);null!=e&&(e.min=0,e.max=c[1],e.value=c[0],e.step=1,e.hidden=!1)}};this.setCursor3dPos=function(a,b){b=void 0===b?-1:b;for(var c=0;3>c;c++)vec3.copy(r[c].center,a),c!=b&&(t[c]=!0,g(c));g(3)};this.setScrollPos=function(a,c){c=MprFunctions.scrollObliqueToPosition(c,r[a],q);this.setCursor3dPos(c.center,a);mainLayout.onCursor3dChanged(b)};this.setCurrentImageMpr=function(a,b){b=parseInt(b);0>b||b>d(a).max||(this.setScrollPos(a,b),t[a]=!0,mainLayout.updateRefLines())}; this.scrollControl=function(a,b){if(-1!=k){var c=d(a);this.setCurrentImageMpr(a,parseInt(c.value)+b);this.updateScroll()}};this.scrollControlLoop=function(a){if(-1!=k){var b=d(x);a=parseInt(b.value)+a;b=parseInt(b.max)+1;0>a&&(a+=b);a>=b&&(a-=b);this.setCurrentImageMpr(x,a);this.updateScroll()}};this.needRerender=function(){for(var a=0;4>a;a++)e[a].needRerender()};this.loadSeries=function(b,c,d){if(k!=b||n!=c){A=mainLayout.seriesExists(b,c);k=b;n=c;var f=studiesController.studies[k].series[n];if(A){for(var g= new SeriesController,h=0;hf;f++)e[f].setSeriesPs(z);q=createVolumeStructure(b,c,d);this.resetPlanes();for(f=0;4>f;f++)a(f)&&(t[f]=!0,e[f].updateSize());u=k+"_"+n+"_"+d[0];p=getVolumeTexture(q,u);e[3].setTexture3D(p);e[3].reset();e[3].setPreset("CT"==this.getModality()?"Bones":"MIP");y=q.spacing[2];this.selectControl(0);this.updateAll()}};this.clearMask=function(){m=[];h()};this.getModality=function(){return q.images[0].getMeta("Modality")}; this.updateRawImage=function(a){if(t[a]){var b=MprFunctions.getObliqueGeometry(r[a],q);b=MprFunctions.getMprImage(q,b,D,y);e[a].setImageController(new ImageController(b));t[a]=!1;g(a)}};this.getCursor3dPos=function(){return r[0].center};this.getMprPlanes=function(){return r};this.setMprPlanes=function(a){for(var b=0;3>b;b++)vec3.copy(r[b].center,a[b].center),vec3.copy(r[b].x,a[b].x),vec3.copy(r[b].y,a[b].y),vec3.copy(r[b].z,a[b].z),g(b),t[b]=!0;g(3);this.updateScroll()};this.setCursor3d=function(a, c,d,e){0==e&&(r[1].z=d,r[2].z=c);1==e?(r[0].z=d,r[2].z=c):2==e&&(r[0].z=d,r[1].z=c);for(c=0;3>c;c++)c!=e&&r[c].Correct(),vec3.copy(r[c].center,a);t[(e+1)%3]=!0;t[(e+2)%3]=!0;3==e&&(t[0]=!0);this.updateScroll();g(3);mainLayout.onCursor3dChanged(b)};this.getElement=function(){return document.getElementById("mainLayoutItem"+b)};this.getMprLayoutElement=function(){return document.getElementById("mprLayout"+b)};this.getProjectionElement=function(a){return document.getElementById("mprLayoutItem"+b+"_"+ a)};this.setSelection=function(a){var c=document.getElementById("layoutHeader"+b);void 0!=c&&(c.style.background=a?"#555":"#222",this.getElement().style.border=a?"1px solid #aaa":"1px solid #333")};this.updateCanvas=function(){for(var c=0;4>c;c++)if(a(c)){var d=document.getElementById("canvas"+b+"_"+c);void 0!=d&&(e[c].setCanvas(d),e[c].updateSize())}};this.getSlabType=function(){return D};this.getSlabThickness=function(){return y};this.setSlabType=function(a){D=a;f()};this.setSlabThickness=function(a){y= a;f()};this.setPreset=function(a){e[3].setPreset(a)};this.getPreset=function(){return e[3].getPreset()};this.updateRangeStyle=function(){for(var c=0;3>c;c++)if(a(c)){var d=b+"_"+c,e=document.getElementById("range"+d);d=document.getElementById("rangeContainer"+d);if(null==e||null==d)break;d=d.getBoundingClientRect();e.style.width=d.height+"px";e.style.left=d.left-d.height/2+d.width/2+"px";e.style.top=d.top+d.height/2-d.width/2+"px"}};this.showOverlay=function(b){for(var c=0;4>c;c++)a(c)&&e[c].showOverlay(b)}; this.updateRefLine=function(a){};this.resize=function(b,c){b=Math.max(3,b/2);c=Math.max(3,c/2);for(var d=0;4>d;d++)a(d)&&e[d].resize(b,c)};this.updateSize=function(){for(var b=0;4>b;b++)a(b)&&e[b].updateSize()};this.doRoutine=function(){for(var b=0;4>b;b++)a(b)&&(3>b&&this.updateRawImage(b),e[b].doRoutine())};this.cancelMeasCreation=function(){for(var b=0;4>b;b++)a(b)&&e[b].cancelMeasCreation()};this.rotate=function(a){e[x].rotate(a)};this.flipV=function(){e[x].flipV()};this.flipH=function(){e[x].flipH()}; this.onPN=function(){e[x].onPN()};this.setRealSize=function(){e[x].setRealSize()};this.deleteAllMeas=function(){e[x].deleteAllMeas()};this.reset=function(){for(var b=0;4>b;b++)a(b)&&e[b].reset();this.resetPlanes()};this.setWL=function(a,b){e[x].setWL(a,b)};this.getImageControl=function(a){return e[a]};this.currentCutIteration=function(){return B};this.undoCutVolume=function(){if(0!=B){for(var a=q.size[0]*q.size[1],b=0;b("+b+") "+c.name+" "+c.windowWidth+"/"+c.windowLevel+""}document.getElementById("wlPresetsList").innerHTML=a};this.setPresetWl=function(a){this.updateDefaultPreset();mainLayout.setWL(h[a].windowWidth, h[a].windowLevel);this.updateInputValues()};this.updateInputValues=function(){if(c){var f=mainLayout.getSelectedSeries();null!=f&&(a.value=f.ps.windowWidth,d.value=f.ps.windowLevel)}};this.onTextChanged=function(){if(c){var f=parseInt(a.value),b=parseInt(d.value);isNaN(f)||isNaN(b)||mainLayout.setWL(f,b)}};this.isTypingSomething=function(){return document.activeElement==a||document.activeElement==d};this.show=function(){c=!0;this.updateWlPresetsHtml();this.updateInputValues();var a=window.event.clientY, b=window.innerHeight-400;a>b&&(a=b);f.style.right="100px";f.style.top=a+"px";f.style.visibility="visible"};this.hide=function(){f.style.visibility="hidden";c=!1}} function PlayWidget(){function c(){setTimeout(function(){d&&c()},Math.round(1E3/f));mainLayout.onNextImage()}function a(){e.innerHTML="FPS "+f;g.src=d?"images/toolbar/pause.png":"images/toolbar/play.png"}var d=!1,f=15,h=document.getElementById("playFpsRange"),g=document.getElementById("playBtn"),b=document.getElementById("playWidget"),e=document.getElementById("playFpsLabel");this.show=function(){var a=mainLayout.getSelectedLayoutItem();if(null!=a){var c=a.getImage();if(null!=c){var d=b.getBoundingClientRect(); a=a.getElement().getBoundingClientRect();b.style.left=Math.round((a.left+a.right-d.width)/2)+"px";b.style.top=a.bottom-70+"px";b.style.width="300px";c=c.metadata.RecommendedDisplayFrameRate;this.setFps(void 0==c?10:c);this.onPlayBtn();b.style.visibility="visible"}}};this.hide=function(){b.style.visibility="hidden";d=!1};this.onPlayBtn=function(){d=!d;a();d&&c()};this.onSlider=function(b){f=b.value;a()};this.setFps=function(a){f=a;h.value=a}} function CutWidget(){var c=document.getElementById("cutWidget");document.getElementById("undoCutVolumeBtn");document.getElementById("resetMaskBtn");this.show=function(){var a=mainLayout.getSelectedLayoutItem();if(null!=a&&a.isMpr){c.style.width="140px";var d=c.getBoundingClientRect();a=a.getElement().getBoundingClientRect();c.style.left=Math.round((a.left+a.right-d.width)/2)+"px";c.style.top=a.bottom-70+"px";c.style.visibility="visible"}};this.hide=function(){c.style.visibility="hidden"};this.onUndoCutVolumeBtn= function(){mainLayout.onUndoCutVolume()};this.onResetMask=function(){mainLayout.onResetMask()}} function ExportMeshWidget(){var c=!1,a=document.getElementById("isoValueInput"),d=document.getElementById("exportMeshWidget");this.show=function(){var a=mainLayout.getSelectedLayoutItem();if(null!=a&&a.isMpr){c=!0;var h=d.getBoundingClientRect();a=a.getElement().getBoundingClientRect();d.style.left=Math.round((a.left+a.right-h.width)/2)+"px";d.style.top=a.top+30+"px";d.style.width="300px";d.style.visibility="visible";this.updateText()}};this.isTypingSomething=function(){return document.activeElement== a};this.hide=function(){d.style.visibility="hidden";c=!1};this.updateText=function(){if(c){var d=mainLayout.getSelectedLayoutItem();null!=d&&d.isMpr&&(d=Math.round(d.getImageControl(3).getWindowLevel()),a.value=d)}};this.exportToMesh=function(){if(c){this.hide();var a=mainLayout.getSelectedLayoutItem();null!=a&&a.isMpr&&(mainLayout.showWaitMessage(),setTimeout(function(){var c=a.getImageControl(3).getWindowLevel(),d=a.getVolumeStructure(),b=a.getMaskVoxels(),e=a.getImageControl(3).getBoundingBoxVx(); (new MarchingCubesFunctions).convertToMesh(d,b,c,e[0],e[1]);mainLayout.hideWaitMessage()},100))}};this.onTextChanged=function(){if(c){var d=parseInt(a.value);if(!isNaN(d)){var h=mainLayout.getSelectedLayoutItem();null!=h&&h.isMpr&&h.getImageControl(3).setWindowLevel(d)}}}}var MeasTypeNone=0,MeasTypeLine=1,MeasTypeAngle=2,MeasTypeEllipse=3,MeasTypeContour=4,MeasTypeCutContour=5,g_pointHoverSizePx=5,g_lineHoverSizePx=5,g_MeasTextFontSize=18,g_MeasTextLineHeight=1.3,g_MeasTextMargin=8; function getPointHoverId(c,a,d){d=g_pointHoverSizePx/d;for(var f=0;fa[f][0]-d&&c[0]a[f][1]-d&&c[1]k||0==e)b=k,g=e}drawLineDashedS(a,c[0],c[1],f[g][0],f[g][1],.5/this.transformData.pixelsPerMm, "#ffffff")}};this.getPointId=function(a){return getPointHoverId(a,this.points,this.transformData.pixelsPerMm)};this.setPoint=function(a,c){this.points[a]=c;this.needUpdateText=!0};this.move=function(a,c){for(var d=0;df[0]&&d>f[1]&&ca.x&&d>a.y&&c=this.createClicksCount&&(this.points[this.createClicksCount]=a,this.needUpdateText=!0)};this.isFinished=function(){return 3<=this.createClicksCount}; this.isLineHovered=function(a){return isLineHovered(a,this.points,this.transformData.pixelsPerMm)};this.updateText=function(){if(!(3>this.points.length)){var a=math2d.getAngle(this.points[1],this.points[0],this.points[1],this.points[2]);this.measText.setText(Math.round(180*a/Math.PI)+"\u00b0",0);this.needUpdateText=!1}};this.updateTextPos=function(a){a=this.transformData.mmToScreen(this.points[1]);this.userTextPos||(this.textPosMm=this.transformData.screenToMm([a[0]+20,a[1]+20]));this.measText.setPos(this.transformData.mmToScreen(this.textPosMm))}; this.getAnchorPos=function(){return this.points[1]}} function MeasEllipse(c){MeasBase.call(this,MeasTypeEllipse);this.points=math2d.createV2Vec(4,c);this.draw=function(a,c,f){var d=1/this.transformData.pixelsPerMm,g=c?"white":"yellow";drawEllipseS(a,this.points[0][0],this.points[0][1],this.points[2][0],this.points[2][1],d,g);if(c)for(c=0;cf[0]&&a[1]>f[1]&&a[0]=k*k+n*n&&(a[a.length]=this.rawImage.pixels[e+b*this.rawImage.width])}return a}} function MeasContour(c){MeasBase.call(this,MeasTypeContour);this.points=math2d.createV2Vec(2,c);this.boxMin=[0,0];this.boxMax=[0,0];this.getPointId=function(){return-1};this.draw=function(a,c,f){drawLineStripS(a,this.points,!0,1/this.transformData.pixelsPerMm,c?"white":"yellow")};this.isEqualToLastPoint=function(a){return 2>this.points.length?!1:-1!=getPointHoverId(a,[this.points[this.points.length-1]],this.transformData.pixelsPerMm)};this.createProcess=function(a){1!=this.createClicksCount||this.isEqualToLastPoint(a)|| (this.points[this.points.length]=[a[0],a[1]],this.needUpdateText=!0)};this.isFinished=function(){return 2<=this.createClicksCount};this.isLineHovered=function(a){return isLineHovered(a,this.points,this.transformData.pixelsPerMm,!0)};this.updateBoundingBox=function(){this.boxMin=math2d.getMinCoords(this.points);this.boxMax=math2d.getMaxCoords(this.points)};this.updateText=function(){var a=[];this.rawImage.isDensityDefined&&(a=math2d.calculateStatistics(this.getDensities(),this.rawImage.rescaleSlope, this.rawImage.rescaleIntercept));a.Area=math2d.calcContourSquare(this.points);this.measText.setTextLines(a);this.needUpdateText=!1};this.updateTextPos=function(a){a=this.transformData.mmToScreen(this.points[1]);this.userTextPos||(this.textPosMm=this.transformData.screenToMm([a[0]+20,a[1]+20]));this.measText.setPos(this.transformData.mmToScreen(this.textPosMm))};this.getAnchorPos=function(){if(this.userTextPos)return this.points[0]};this.getDensities=function(){for(var a=[],c=math2d.boxMinI(this.points, this.rawImage),f=math2d.boxMaxI(this.points,this.rawImage),h=c[1];h<=f[1];h++)for(var g=math2d.getContourCrossPoints(this.points,h*this.rawImage.pixelSpacing[1]),b=0;bf[0]&&(k=f[0]);e<=k;e++)a[a.length]=this.rawImage.pixels[e+h*this.rawImage.width]}return a}} function MeasCutContour(c){MeasBase.call(this,MeasTypeCutContour);this.points=math2d.createV2Vec(2,c);this.boxMin=[0,0];this.boxMax=[0,0];this.getPointId=function(){return-1};this.draw=function(a,c,f){drawLineStripDashedS(a,this.points,!0,1/this.transformData.pixelsPerMm,c?"white":"yellow")};this.isEqualToLastPoint=function(a){return 2>this.points.length?!1:-1!=getPointHoverId(a,[this.points[this.points.length-1]],this.transformData.pixelsPerMm)};this.createProcess=function(a){1!=this.createClicksCount|| this.isEqualToLastPoint(a)||(this.points[this.points.length]=[a[0],a[1]])};this.isFinished=function(){return 2<=this.createClicksCount};this.isLineHovered=function(a){return isLineHovered(a,this.points,this.transformData.pixelsPerMm,!0)};this.updateText=function(){this.needUpdateText=!1};this.updateTextPos=function(a){};this.getAnchorPos=function(){if(this.userTextPos)return this.points[0]};this.getDensities=function(){return[]};this.cutVolume=function(a,c,f){for(var d=performance.now(),g=new Uint8Array(this.rawImage.width* this.rawImage.height),b=0;bk[0]&&(A=k[0]);b<=A;b++)g[b+n*this.rawImage.width]=1}z=new CS3;z.fromRawImage(this.rawImage);z=a.position.GetCoords_CS3(z); w=a.spacing[0]*z.x[0]/this.rawImage.pixelSpacing[0];A=a.spacing[0]*z.y[0]/this.rawImage.pixelSpacing[1];console.log("t1: "+(performance.now()-d)/1E3);d=performance.now();var q=[];q[2]=.5*a.spacing[2]-z.center[2];for(var p=0;pe[0]&&v[1]>e[1]&&v[0]"+("")+("")} function genMprProjHtml(c,a){var d=c+"_"+a;c=c+","+a;return""+(3==a?"":"")+"
"} function generateLayoutMprHtml1(c,a){return"
"+genMprProjHtml(c,a)+"
"}function generateLayoutMprHtml3(c){c=[genMprProjHtml(c,0),genMprProjHtml(c,1),genMprProjHtml(c,2)];var a=""+("");a+="";return a+="
"+c[0]+""+c[1]+""+c[2]+"
"} function generateLayoutMprHtml1_2(c){c=[genMprProjHtml(c,0),genMprProjHtml(c,1),genMprProjHtml(c,2)];var a="";a+="";return a+="
"+c[0]+""+c[1]+"
"+c[2]+"
"} function generateLayoutMprHtml4(c){c=[genMprProjHtml(c,0),genMprProjHtml(c,1),genMprProjHtml(c,2),genMprProjHtml(c,3)];var a="";return a+="
"+c[0]+""+c[1]+"
"+c[2]+""+c[3]+"
"} function generateLayoutMprHtml(c){var a=""+("")+("")+("")+(""; a=a+("
")+generateLayoutMprHtml4(c);return a+="
"} function MainLayout(){function c(){for(var a=0;ab||b>=g.length)&& this.selectControl(0);var e=g[b];if(e.getStudyId()!=a||e.getSeriesId()!=c){if(e.isMpr)this.on3d();e=g[b];e.loadSeries(a,c);d()}};this.scrollControl=function(a,b){g[a].scrollControl(b);d()};this.onDoubleclick=function(a){(e=!e)?this.setupSingleLayout(a):this.setup(f,h)};this.setupSingleLayout=function(b){a();g[b].isEnabled=!0;var d="
"+(g.length>b&&g[b].isMpr?generateLayoutMprHtml(b):generateLayoutHtml(b));d+="
";document.getElementById("mainLayout").innerHTML= d;d=g[b];d.isMpr&&d.setFullScreen(!1);d.updateCanvas();this.selectControl(b);d.updateAll();g[b].initHeaderEvents();c()};this.setup=function(d,n){a();e=!1;f=d;h=n;d=100/f;n=100/h;for(var z="",q=0,p=0;p";for(var m=0;m"+(g.length>q&&g[q].isMpr?generateLayoutMprHtml(q):generateLayoutHtml(q))+"";z+=""}z+="
";document.getElementById("mainLayout").innerHTML=z;for(p=0;p=g.length&&(g[p]=new LayoutItem(p)), g[p].isMpr&&g[p].setFullScreen(!1),g[p].isEnabled=!0,g[p].updateCanvas(),g[p].updateAll(),g[p].showOverlay(k),g[p].initHeaderEvents(),c();(0>b||b>=f*h)&&this.selectControl(0);resizeCanvas()};this.seriesExists=function(a,b){for(var c=0;c(?)";var d=!0,e=0;b={};for(var f=$jscomp.makeIterator(c),g=f.next();!g.done;b={$jscomp$loop$prop$file$46:b.$jscomp$loop$prop$file$46},g=f.next())b.$jscomp$loop$prop$file$46=g.value,g=new FileReader,g.readAsArrayBuffer(b.$jscomp$loop$prop$file$46),g.onload=function(a){return function(b){b=new Uint8Array(b.target.result);var f=void 0;try{f=dicomParser.parseDicom(b)}catch(x){console.log("Skipped file: '"+a.$jscomp$loop$prop$file$46.webkitRelativePath+ "'")}void 0!=f&&void 0!=f.elements.x7fe00010&&(studiesController.addDicomImage(f)||(d=!1));e++;e"+e+"/"+c.length+" ("+Math.round(100*e/c.length)+"%) (?)":(document.getElementById("downloadProgress").innerHTML="Data loaded (?)",studiesController.sortStudies(),previewLayout.updateOverlays(!0),d||window.alert("Failed to parse some DICOM files!"))}}(b)}; a.click()};this.setRealSize=function(){-1!=b&&g[b].setRealSize()};this.onWL=function(){chooseWlWidget.show()};this.deleteAllMeas=function(){-1!=b&&g[b].deleteAllMeas();this.onUndoCutVolume()};this.reset=function(){-1!=b&&g[b].reset();this.onResetMask()};this.setWL=function(a,c){-1!=b&&g[b].setWL(a,c)};this.onClick=function(){chooseWlWidget.hide()};this.onPlay=function(){playWidget.show()};this.onResetMask=function(){-1!=b&&g[b].isMpr&&g[b].clearMask()};this.onUndoCutVolume=function(){-1!=b&&g[b].isMpr&& g[b].undoCutVolume()};this.on3d=function(){var a=this.getSelectedSeries();if(null!=a)if(a.allImagesDownloaded()){var c=g[b].isMpr,d=g[b].getStudyId(),e=g[b].getSeriesId();if(c)g[b]=new LayoutItem(b),this.setup(f,h),g[b].loadSeries(d,e);else{a=a.getVolumeScanIds();if(0==a.length){alert("Failed to enter 3D mode: the series is not a volume!");return}c=0;if(1c||c>=a.length)return}g[b]=new LayoutItemMpr(b);this.setup(f,h);g[b].loadSeries(d,e,a[c])}this.onResize();this.setup(f,h)}else alert("Failed to enter 3D mode: still downloading images!")};this.onNextImage=function(){-1!=b&&g[b].scrollControlLoop(1);d()};this.onPresetSelect=function(a){var b=document.getElementById("presetSelect"+a);g[a].setPreset(b.value)};this.onThicknessSelect=function(a){var b=document.getElementById("thicknessSelect"+a);g[a].setSlabType(b.value)}; this.onThicknessSlider=function(a){var b=document.getElementById("thicknessRange"+a),c=document.getElementById("thicknessLabel"+a);b=g[a].getVolumeStructure().spacing[2]+.4*b.value;c.innerHTML=b.toFixed(1)+"mm";g[a].setSlabThickness(b)};this.updateHeaderElements=function(a){if(g[a].isMpr){var b=document.getElementById("presetSelect"+a),c=document.getElementById("thicknessSelect"+a),d=document.getElementById("thicknessRange"+a),e=document.getElementById("thicknessLabel"+a),f=g[a].getVolumeStructure().spacing[2]; c.value=g[a].getSlabType();d.value=Math.floor((g[a].getSlabThickness()-f)/.4);e.innerHTML=g[a].getSlabThickness().toFixed(1)+"mm";b.value=g[a].getPreset()}};this.onSync=function(){n=toolbarLayout.isToolEnabled("sync")};this.onCursor3dChanged=function(a){if(n){for(var b=g[a].getStudyId(),c=g[a].getCursor3dPos(),e=g[a].isMpr?g[a].getMprPlanes():null,f=0;f=c.keyCode&&chooseWlWidget.setPresetWl(c.keyCode-48)}};document.getElementById("layoutTable").addEventListener("wheel",function(c){1==c.ctrlKey&&c.preventDefault()});