@ohif/ui 3.13.0-beta.131 → 3.13.0-beta.133

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -87,7 +87,7 @@ void main()
87
87
  float t2Color = texture(translucentRTexture, tcoord).r;
88
88
  gl_FragData[0] = vec4(t1Color.rgb/max(t2Color,0.01), 1.0 - t1Color.a);
89
89
  }
90
- `,$4={framebuffer:null,copyShader:null,tris:null},$8=jS.newInstance(function(e,t,r={}){Object.assign(t,$4,r),$w(e,t,r),t.VBOBuildTime={},jS.obj(t.VBOBuildTime,{mtime:0}),t.tris=$G.newInstance(),jS.get(e,t,["framebuffer"]),t.classHierarchy.push("vtkOpenGLOrderIndependentTranslucentPass"),e.createVertexBuffer=()=>{let e=new Float32Array([-1,-1,-1,1,-1,-1,-1,1,-1,1,1,-1]),r=new Float32Array([0,0,1,0,0,1,1,1]),n=new Uint16Array([4,0,1,3,2]),a=U9.newInstance({numberOfComponents:3,values:e});a.setName("points");let i=U9.newInstance({numberOfComponents:2,values:r});i.setName("tcoords");let o=U9.newInstance({numberOfComponents:1,values:n});t.tris.getCABO().createVBO(o,"polys",$1.SURFACE,{points:a,tcoords:i,cellOffset:0}),t.VBOBuildTime.modified()},e.createFramebuffer=e=>{let r=e.getSize(),n=e.getContext();t.framebuffer=$v(),t.framebuffer.setOpenGLRenderWindow(e),t.framebuffer.create(...r),t.framebuffer.saveCurrentBindingsAndBuffers(),t.framebuffer.bind(),t.translucentRGBATexture=$g.newInstance(),t.translucentRGBATexture.setInternalFormat(n.RGBA16F),t.translucentRGBATexture.setFormat(n.RGBA),t.translucentRGBATexture.setOpenGLDataType(n.HALF_FLOAT),t.translucentRGBATexture.setOpenGLRenderWindow(e),t.translucentRGBATexture.create2DFromRaw({width:r[0],height:r[1],numComps:4,dataType:"Float32Array",data:null}),t.translucentRTexture=$g.newInstance(),t.translucentRTexture.setInternalFormat(n.R16F),t.translucentRTexture.setFormat(n.RED),t.translucentRTexture.setOpenGLDataType(n.HALF_FLOAT),t.translucentRTexture.setOpenGLRenderWindow(e),t.translucentRTexture.create2DFromRaw({width:r[0],height:r[1],numComps:1,dataType:"Float32Array",data:null}),t.translucentZTexture=$g.newInstance(),t.translucentZTexture.setOpenGLRenderWindow(e),t.translucentZTexture.createDepthFromRaw({width:r[0],height:r[1],dataType:"Float32Array",data:null}),t.framebuffer.setColorBuffer(t.translucentRGBATexture,0),t.framebuffer.setColorBuffer(t.translucentRTexture,1),t.framebuffer.setDepthBuffer(t.translucentZTexture)},e.createCopyShader=e=>{t.copyShader=e.getShaderCache().readyShaderProgramArray("//VTK::System::Dec\nattribute vec4 vertexDC;\nattribute vec2 tcoordTC;\nvarying vec2 tcoord;\nvoid main() { tcoord = tcoordTC; gl_Position = vertexDC; }",$3,"")},e.createVBO=r=>{let n=r.getContext();t.tris.setOpenGLRenderWindow(r),e.createVertexBuffer();let a=t.copyShader;t.tris.getCABO().bind(),t.copyVAO.addAttributeArray(a,t.tris.getCABO(),"vertexDC",t.tris.getCABO().getVertexOffset(),t.tris.getCABO().getStride(),n.FLOAT,3,n.FALSE)||$2("Error setting vertexDC in copy shader VAO."),t.copyVAO.addAttributeArray(a,t.tris.getCABO(),"tcoordTC",t.tris.getCABO().getTCoordOffset(),t.tris.getCABO().getStride(),n.FLOAT,2,n.FALSE)||$2("Error setting vertexDC in copy shader VAO.")},e.traverse=(r,n,a)=>{if(t.deleted)return;let i=r.getSize(),o=r.getContext();if(t._supported=!1,n.getSelector()||!o||!r.getWebgl2()||!o.getExtension("EXT_color_buffer_half_float")&&!o.getExtension("EXT_color_buffer_float")){e.setCurrentOperation("translucentPass"),n.traverse(e);return}if(t._supported=!0,null===t.framebuffer)e.createFramebuffer(r);else{let n=t.framebuffer.getSize();null===n||n[0]!==i[0]||n[1]!==i[1]?(t.framebuffer.releaseGraphicsResources(),t.translucentRGBATexture.releaseGraphicsResources(r),t.translucentRTexture.releaseGraphicsResources(r),t.translucentZTexture.releaseGraphicsResources(r),e.createFramebuffer(r)):(t.framebuffer.saveCurrentBindingsAndBuffers(),t.framebuffer.bind())}o.drawBuffers([o.COLOR_ATTACHMENT0]),o.clearBufferfv(o.COLOR,0,[0,0,0,0]),o.clearBufferfv(o.DEPTH,0,[1]),o.colorMask(!1,!1,!1,!1),a.getOpaqueActorCount()>0&&(a.setCurrentOperation("opaqueZBufferPass"),n.traverse(a)),o.colorMask(!0,!0,!0,!0),o.drawBuffers([o.COLOR_ATTACHMENT0,o.COLOR_ATTACHMENT1]),o.viewport(0,0,i[0],i[1]),o.scissor(0,0,i[0],i[1]),o.clearBufferfv(o.COLOR,0,[0,0,0,1]),o.clearBufferfv(o.COLOR,1,[0,0,0,0]),o.enable(o.DEPTH_TEST),o.enable(o.BLEND),o.blendFuncSeparate(o.ONE,o.ONE,o.ZERO,o.ONE_MINUS_SRC_ALPHA),e.setCurrentOperation("translucentPass"),n.traverse(e),o.drawBuffers([o.NONE]),t.framebuffer.restorePreviousBindingsAndBuffers(),null===t.copyShader?e.createCopyShader(r):r.getShaderCache().readyShaderProgram(t.copyShader),t.copyVAO||(t.copyVAO=$S(),t.copyVAO.setOpenGLRenderWindow(r)),t.copyVAO.bind(),t.VBOBuildTime.getMTime()<e.getMTime()&&e.createVBO(r);let s=o.isEnabled(o.CULL_FACE),l=s?o.getParameter(o.CULL_FACE_MODE):null;r.disableCullFace(),o.blendFuncSeparate(o.SRC_ALPHA,o.ONE_MINUS_SRC_ALPHA,o.ONE,o.ONE_MINUS_SRC_ALPHA),o.depthMask(!1),o.depthFunc(o.ALWAYS),o.viewport(0,0,i[0],i[1]),o.scissor(0,0,i[0],i[1]),t.translucentRGBATexture.activate(),t.copyShader.setUniformi("translucentRGBATexture",t.translucentRGBATexture.getTextureUnit()),t.translucentRTexture.activate(),t.copyShader.setUniformi("translucentRTexture",t.translucentRTexture.getTextureUnit()),o.drawArrays(o.TRIANGLES,0,t.tris.getCABO().getElementCount()),o.depthMask(!0),o.depthFunc(o.LEQUAL),s&&(r.enableCullFace(),r.setCullFaceMode(l)),t.translucentRGBATexture.deactivate(),t.translucentRTexture.deactivate();let u=n.getTiledSizeAndOrigin();o.scissor(u.lowerLeftU,u.lowerLeftV,u.usize,u.vsize),o.viewport(u.lowerLeftU,u.lowerLeftV,u.usize,u.vsize)},e.getShaderReplacement=()=>t._supported?$5:null,e.releaseGraphicsResources=r=>{t.framebuffer&&(t.framebuffer.releaseGraphicsResources(r),t.framebuffer=null),t.translucentRGBATexture&&(t.translucentRGBATexture.releaseGraphicsResources(r),t.translucentRGBATexture=null),t.translucentRTexture&&(t.translucentRTexture.releaseGraphicsResources(r),t.translucentRTexture=null),t.translucentZTexture&&(t.translucentZTexture.releaseGraphicsResources(r),t.translucentZTexture=null),t.copyVAO&&(t.copyVAO.releaseGraphicsResources(r),t.copyVAO=null),t.copyShader&&(t.copyShader.releaseGraphicsResources(r),t.copyShader=null),t.tris&&(t.tris.releaseGraphicsResources(r),t.tris=null),e.modified()}},"vtkOpenGLOrderIndependentTranslucentPass"),$6={opaqueActorCount:0,translucentActorCount:0,volumeCount:0,overlayActorCount:0,framebuffer:null,depthRequested:!1},$9=jS.newInstance(function(e,t,r={}){Object.assign(t,$6,r),$w(e,t,r),jS.get(e,t,["framebuffer","opaqueActorCount","translucentActorCount","volumeCount"]),t.classHierarchy.push("vtkForwardPass"),e.traverse=(r,n=null)=>{if(t.deleted)return;t._currentParent=n,e.setCurrentOperation("buildPass"),r.traverse(e);let a=r.getRenderable().getNumberOfLayers(),i=r.getRenderable().getRenderersByReference();for(let n=0;n<a;n++)for(let a=0;a<i.length;a++){let o=i[a],s=r.getViewNodeFor(o);if(o.getDraw()&&o.getLayer()===n){if(t.opaqueActorCount=0,t.translucentActorCount=0,t.volumeCount=0,t.overlayActorCount=0,e.setCurrentOperation("queryPass"),s.traverse(e),(t.opaqueActorCount>0||t.translucentActorCount>0)&&t.volumeCount>0||t.depthRequested){let n=r.getFramebufferSize();null===t.framebuffer&&(t.framebuffer=$v()),t.framebuffer.setOpenGLRenderWindow(r),t.framebuffer.saveCurrentBindingsAndBuffers();let a=t.framebuffer.getSize();(null===a||a[0]!==n[0]||a[1]!==n[1])&&(t.framebuffer.create(n[0],n[1]),t.framebuffer.populateFramebuffer()),t.framebuffer.bind(),e.setCurrentOperation("zBufferPass"),s.traverse(e),t.framebuffer.restorePreviousBindingsAndBuffers(),t.depthRequested=!1}e.setCurrentOperation("cameraPass"),s.traverse(e),t.opaqueActorCount>0&&(e.setCurrentOperation("opaquePass"),s.traverse(e)),t.translucentActorCount>0&&(t.translucentPass||(t.translucentPass=$8()),t.translucentPass.traverse(r,s,e)),t.volumeCount>0&&(e.setCurrentOperation("volumePass"),s.traverse(e)),t.overlayActorCount>0&&(e.setCurrentOperation("overlayPass"),s.traverse(e))}}},e.getZBufferTexture=()=>t.framebuffer?t.framebuffer.getColorTexture():null,e.requestDepth=()=>{t.depthRequested=!0},e.incrementOpaqueActorCount=()=>t.opaqueActorCount++,e.incrementTranslucentActorCount=()=>t.translucentActorCount++,e.incrementVolumeCount=()=>t.volumeCount++,e.incrementOverlayActorCount=()=>t.overlayActorCount++},"vtkForwardPass");function $7(e){let t=$9();if(e>0){let r=$K();r.setDelegates([t]);let n=Math.max(0,e);r.setKernelDimension(3),r.setKernel([-n,-n,-n,-n,1+8*n,-n,-n,-n,-n]),t=r}return t}function Ke(e){let t=$9();if(e>0){let r=$K();r.setDelegates([t]);let n=Math.min(e,1e3),a=function(){let e=[],t=7,r=0;for(let n=0;n<15;n++)for(let a=0;a<15;a++){let i=a-t,o=n-t,s=Math.exp(-(i*i+o*o)/(2*Math.pow(5,2)));e.push(s),r+=s}return e.map(e=>e/r)}(),i=Math.floor(112.5),o=Array(225).fill(0);o[i]=1;let s=Math.min(n/10,1),l=a.map((e,t)=>(1-s)*o[t]+s*e);r.setKernelDimension(15),r.setKernel(l),t=r}return t}let Kt=F9.getLogger("RenderingEngine","StackViewport"),Kr=class extends GN{constructor(e){super(e),this.imageIds=[],this.imageKeyToIndexMap=new Map,this.currentImageIdIndex=0,this.targetImageIdIndex=0,this.imagesLoader=this,this.globalDefaultProperties={},this.perImageIdDefaultProperties=new Map,this.voiUpdatedWithSetProperties=!1,this.sharpening=0,this.smoothing=0,this.invert=!1,this.initialInvert=!1,this.initialTransferFunctionNodes=null,this.stackInvalidated=!1,this._publishCalibratedEvent=!1,this.updateRenderingPipeline=()=>{this._configureRenderingPipeline()},this.setSharpening=e=>{this.sharpening=e,this.render()},this.setSmoothing=e=>{this.smoothing=e,this.render()},this.getRenderPasses=()=>{if(!this.shouldUseCustomRenderPass())return null;let e=[];try{return this.smoothing>0&&e.push(Ke(this.smoothing)),this.sharpening>0&&e.push($7(this.sharpening)),e.length?e:null}catch(e){return console.warn("Failed to create custom render passes:",e),null}},this.resize=()=>{this.useCPURendering&&this._resizeCPU()},this._resizeCPU=()=>{this._cpuFallbackEnabledElement.viewport&&qN(this._cpuFallbackEnabledElement)},this.getFrameOfReferenceUID=e=>this.getImagePlaneReferenceData(e)?.FrameOfReferenceUID,this.getCornerstoneImage=()=>this.csImage,this.createActorMapper=e=>{let t=Hb.newInstance();t.setInputData(e);let r=HA();return r.setMapper(t),e.getPointData().getScalars().getNumberOfComponents()>1&&r.getProperty().setIndependentComponents(!1),r},this.getNumberOfSlices=()=>this.imageIds.length,this.getDefaultProperties=e=>{let t;return(void 0!==e&&(t=this.perImageIdDefaultProperties.get(e)),void 0!==t)?t:{...this.globalDefaultProperties}},this.getProperties=()=>{let{colormap:e,voiRange:t,VOILUTFunction:r,interpolationType:n,invert:a,voiUpdatedWithSetProperties:i}=this;return{colormap:e,voiRange:t,VOILUTFunction:r,interpolationType:n,invert:a,isComputedVOI:!i,sharpening:this.sharpening,smoothing:this.smoothing}},this.resetCameraForResize=()=>this.resetCamera({resetPan:!0,resetZoom:!0,resetToCenter:!0,resetAspectRatio:!0,suppressEvents:!0}),this.getRotationCPU=()=>{let{viewport:e}=this._cpuFallbackEnabledElement;return e.rotation},this.getRotationGPU=()=>{let{viewUp:e,viewPlaneNormal:t,flipVertical:r,flipHorizontal:n}=this.getCameraNoRotation(),a=qK(this.initialViewUp,n,r,t),i=180*Lv.vec3.angle(a,e)/Math.PI,o=Lv.vec3.cross(Lv.vec3.create(),a,e);return Lv.vec3.dot(o,t)>=0?i:(360-i)%360},this.setRotation=e=>{let t=this.getCamera();if(this.useCPURendering?this.setRotationCPU(e):this.setRotationGPU(e),this._suppressCameraModifiedEvents)return;let r={previousCamera:t,camera:this.getCamera(),element:this.element,viewportId:this.id,renderingEngineId:this.renderingEngineId};Bh(this.element,NH.CAMERA_MODIFIED,r)},this.renderImageObject=e=>{this._setCSImage(e),(this.useCPURendering?this._updateToDisplayImageCPU:this._updateActorToDisplayImageId).call(this,e)},this._setCSImage=e=>{e.isPreScaled=e.preScale?.scaled,this.csImage=e},this.canvasToWorldCPU=(e,t=[0,0,0])=>{if(!this._cpuFallbackEnabledElement.image)return;let[r,n]=qP(this._cpuFallbackEnabledElement,e),{origin:a,spacing:i,direction:o}=this.getImageData(),s=o.slice(0,3),l=o.slice(3,6);return Lv.vec3.scaleAndAdd(t,a,s,r*i[0]),Lv.vec3.scaleAndAdd(t,t,l,n*i[1]),t},this.worldToCanvasCPU=e=>{let{spacing:t,direction:r,origin:n}=this.getImageData(),a=r.slice(0,3),i=r.slice(3,6),o=Lv.vec3.subtract(Lv.vec3.create(),e,n),s=[Lv.vec3.dot(o,a)/t[0],Lv.vec3.dot(o,i)/t[1]];return qL(this._cpuFallbackEnabledElement,s)},this.canvasToWorldGPUContextPool=e=>{let t=this.getRenderer(),r=this.getVtkActiveCamera(),n=r.getClippingRange(),a=r.getDistance();r.setClippingRange(a,a+.1);let i=window.devicePixelRatio||1,{width:o,height:s}=this.canvas,l=[e[0]*i,e[1]*i],[u,d,c,h]=t.getViewport(),p=[u+l[0]/o*(c-u),d+(1-l[1]/s)*(h-d),0],m=t.normalizedDisplayToProjection(p[0],p[1],p[2]),f=t.projectionToView(m[0],m[1],m[2],o/s),g=t.viewToWorld(f[0],f[1],f[2]);return r.setClippingRange(n[0],n[1]),[g[0],g[1],g[2]]},this.canvasToWorldGPUTiled=e=>{let t=this.getRenderer(),r=this.getVtkActiveCamera(),n=r.getClippingRange(),a=r.getDistance();r.setClippingRange(a,a+.1);let i=this.getRenderingEngine().offscreenMultiRenderWindow.getOpenGLRenderWindow(),o=i.getSize(),s=window.devicePixelRatio||1,l=[e[0]*s,e[1]*s],u=[l[0]+this.sx,l[1]+this.sy];u[1]=o[1]-u[1];let d=i.displayToWorld(u[0],u[1],0,t);return r.setClippingRange(n[0],n[1]),[d[0],d[1],d[2]]},this.worldToCanvasGPUContextPool=e=>{let t=this.getRenderer(),r=this.getVtkActiveCamera(),n=r.getClippingRange(),a=r.getDistance();r.setClippingRange(a,a+.1);let i=window.devicePixelRatio||1,{width:o,height:s}=this.canvas,l=t.worldToView(e[0],e[1],e[2]),u=t.viewToProjection(l[0],l[1],l[2],o/s),d=t.projectionToNormalizedDisplay(u[0],u[1],u[2]),[c,h,p,m]=t.getViewport(),f=(d[0]-c)/(p-c)*o,g=(1-(d[1]-h)/(m-h))*s;return r.setClippingRange(n[0],n[1]),[f/i,g/i]},this.worldToCanvasGPUTiled=e=>{let t=this.getRenderer(),r=this.getVtkActiveCamera(),n=r.getClippingRange(),a=r.getDistance();r.setClippingRange(a,a+.1);let i=this.getRenderingEngine().offscreenMultiRenderWindow.getOpenGLRenderWindow(),o=i.getSize(),s=i.worldToDisplay(...e,t);s[1]=o[1]-s[1];let l=[s[0]-this.sx,s[1]-this.sy];r.setClippingRange(n[0],n[1]);let u=window.devicePixelRatio||1;return[l[0]/u,l[1]/u]},this.getCurrentImageIdIndex=()=>this.currentImageIdIndex,this.getSliceIndex=()=>this.currentImageIdIndex,this.getTargetImageIdIndex=()=>this.targetImageIdIndex,this.getImageIds=()=>this.imageIds,this.getCurrentImageId=(e=this.getCurrentImageIdIndex())=>this.imageIds[e],this.hasImageId=e=>this.imageKeyToIndexMap.has(e),this.hasImageURI=e=>this.imageKeyToIndexMap.has(e),this.customRenderViewportToCanvas=()=>{if(!this.useCPURendering)throw Error("Custom cpu rendering pipeline should only be hit in CPU rendering mode");return this._cpuFallbackEnabledElement.image?(qr(this._cpuFallbackEnabledElement,this.cpuRenderingInvalidated),this.cpuRenderingInvalidated=!1):this.fillWithBackgroundColor(),{canvas:this.canvas,element:this.element,viewportId:this.id,renderingEngineId:this.renderingEngineId,viewportStatus:this.viewportStatus}},this.renderingPipelineFunctions={getImageData:{cpu:this.getImageDataCPU,gpu:this.getImageDataGPU},setColormap:{cpu:this.setColormapCPU,gpu:this.setColormapGPU},getCamera:{cpu:this.getCameraCPU,gpu:super.getCamera},setCamera:{cpu:this.setCameraCPU,gpu:super.setCamera},getPan:{cpu:this.getPanCPU,gpu:super.getPan},setPan:{cpu:this.setPanCPU,gpu:super.setPan},getZoom:{cpu:this.getZoomCPU,gpu:super.getZoom},setZoom:{cpu:this.setZoomCPU,gpu:super.setZoom},getAspectRatio:{cpu:this.getAspectRatioCPU,gpu:super.getAspectRatio},setAspectRatio:{cpu:this.setAspectRatioCPU,gpu:super.setAspectRatio},setVOI:{cpu:this.setVOICPU,gpu:this.setVOIGPU},getRotation:{cpu:this.getRotationCPU,gpu:this.getRotationGPU},setInterpolationType:{cpu:this.setInterpolationTypeCPU,gpu:this.setInterpolationTypeGPU},setInvertColor:{cpu:this.setInvertColorCPU,gpu:this.setInvertColorGPU},resetCamera:{cpu:(e={})=>{let{resetPan:t=!0,resetZoom:r=!0}=e;return this.resetCameraCPU({resetPan:t,resetZoom:r}),!0},gpu:(e={})=>{let{resetPan:t=!0,resetZoom:r=!0,resetAspectRatio:n=!0}=e;return this.resetCameraGPU({resetPan:t,resetZoom:r,resetAspectRatio:n}),!0}},canvasToWorld:{cpu:this.canvasToWorldCPU,gpu:{tiled:this.canvasToWorldGPUTiled,contextPool:this.canvasToWorldGPUContextPool}},worldToCanvas:{cpu:this.worldToCanvasCPU,gpu:{tiled:this.worldToCanvasGPUTiled,contextPool:this.worldToCanvasGPUContextPool}},getRenderer:{cpu:()=>this.getCPUFallbackError("getRenderer"),gpu:{tiled:this.getRendererTiled,contextPool:this.getRendererContextPool}},getDefaultActor:{cpu:()=>this.getCPUFallbackError("getDefaultActor"),gpu:super.getDefaultActor},getActors:{cpu:()=>this.getCPUFallbackError("getActors"),gpu:super.getActors},getActor:{cpu:()=>this.getCPUFallbackError("getActor"),gpu:super.getActor},setActors:{cpu:()=>this.getCPUFallbackError("setActors"),gpu:super.setActors},addActors:{cpu:()=>this.getCPUFallbackError("addActors"),gpu:super.addActors},addActor:{cpu:()=>this.getCPUFallbackError("addActor"),gpu:super.addActor},removeAllActors:{cpu:()=>this.getCPUFallbackError("removeAllActors"),gpu:super.removeAllActors},unsetColormap:{cpu:this.unsetColormapCPU,gpu:this.unsetColormapGPU}},this.scaling={},this.modality=null,this.useCPURendering=BI(),this._configureRenderingPipeline(),this.useCPURendering?this._resetCPUFallbackElement():this._resetGPUViewport(),this.currentImageIdIndex=0,this.targetImageIdIndex=0,this.resetCamera(),this.initializeElementDisabledHandler()}setUseCPURendering(e){this.useCPURendering=e,this._configureRenderingPipeline(e)}static get useCustomRenderingPipeline(){return BI()}_configureRenderingPipeline(e){let t=qY();for(let r in this.useCPURendering=e??BI(),this.renderingPipelineFunctions)if(Object.prototype.hasOwnProperty.call(this.renderingPipelineFunctions,r)){let e=this.renderingPipelineFunctions[r];this.useCPURendering?this[r]=e.cpu:"object"==typeof e.gpu&&e.gpu.tiled&&e.gpu.contextPool?this[r]=t?e.gpu.contextPool:e.gpu.tiled:this[r]=e.gpu}this.useCPURendering?this._resetCPUFallbackElement():this._resetGPUViewport()}_resetCPUFallbackElement(){this._cpuFallbackEnabledElement={canvas:this.canvas,renderingTools:{},transform:new GB,viewport:{rotation:0,aspectRatio:[1,1]}}}_resetGPUViewport(){let e=this.getRenderer(),t=zP();e.setActiveCamera(t);this.initialViewUp=[0,-1,0],t.setDirectionOfProjection(-0,-0,1),t.setViewUp(...this.initialViewUp),t.setParallelProjection(!0),t.setThicknessFromFocalPoint(.1),t.setFreezeFocalPoint(!0)}shouldUseCustomRenderPass(){return!this.useCPURendering}initializeElementDisabledHandler(){Bc.addEventListener(NH.ELEMENT_DISABLED,function e(){clearTimeout(this.debouncedTimeout),Bc.removeEventListener(NH.ELEMENT_DISABLED,e)})}getImageDataGPU(){let e=this.getDefaultActor();if(!e||!H2(e))return;let{actor:t}=e,r=t.getMapper().getInputData(),n=this.csImage;return{dimensions:r.getDimensions(),spacing:r.getSpacing(),origin:r.getOrigin(),direction:r.getDirection(),get scalarData(){return n?.voxelManager.getScalarData()},imageData:t.getMapper().getInputData(),metadata:{Modality:this.modality,FrameOfReferenceUID:this.getFrameOfReferenceUID()},scaling:this.scaling,hasPixelSpacing:this.hasPixelSpacing,calibration:{...n?.calibration,...this.calibration},preScale:{...n?.preScale},voxelManager:n?.voxelManager}}getImageDataCPU(){let{metadata:e}=this._cpuFallbackEnabledElement;if(!e)return;let t=e.spacing,r=this.csImage;return{dimensions:e.dimensions,spacing:t,origin:e.origin,direction:e.direction,metadata:{Modality:this.modality,FrameOfReferenceUID:this.getFrameOfReferenceUID()},scaling:this.scaling,imageData:{getDirection:()=>e.direction,getDimensions:()=>e.dimensions,getScalarData:()=>this.cpuImagePixelData,getSpacing:()=>t,worldToIndex:e=>{let t=this.worldToCanvasCPU(e),r=qP(this._cpuFallbackEnabledElement,t);return[r[0],r[1],0]},indexToWorld:(e,t)=>{let r=qL(this._cpuFallbackEnabledElement,[e[0],e[1]]);return this.canvasToWorldCPU(r,t)}},scalarData:this.cpuImagePixelData,hasPixelSpacing:this.hasPixelSpacing,calibration:{...r?.calibration,...this.calibration},preScale:{...r?.preScale},voxelManager:r?.voxelManager}}calibrateIfNecessary(e,t){let r=HB("calibratedPixelSpacing",e),n=this.calibration!==r,a=r?.scale;return this.hasPixelSpacing=a>0||!t.usingDefaultValues&&t.rowPixelSpacing>0,t.calibration=r,n&&(this.calibration=r,this._publishCalibratedEvent=!0,this._calibrationEvent={scale:a,calibration:r}),t}setDefaultProperties(e,t){null==t?this.globalDefaultProperties=e:(this.perImageIdDefaultProperties.set(t,e),this.getCurrentImageId()===t&&this.setProperties(e))}clearDefaultProperties(e){null==e?(this.globalDefaultProperties={},this.resetProperties()):(this.perImageIdDefaultProperties.delete(e),this.resetToDefaultProperties())}setProperties({colormap:e,voiRange:t,VOILUTFunction:r,invert:n,interpolationType:a,sharpening:i,smoothing:o}={},s=!1){this.viewportStatus=this.csImage?Fw.PRE_RENDER:Fw.LOADING,this.globalDefaultProperties={colormap:this.globalDefaultProperties.colormap??e,voiRange:this.globalDefaultProperties.voiRange??t,VOILUTFunction:this.globalDefaultProperties.VOILUTFunction??r,invert:this.globalDefaultProperties.invert??n,interpolationType:this.globalDefaultProperties.interpolationType??a,sharpening:this.globalDefaultProperties.sharpening??i,smoothing:this.globalDefaultProperties.smoothing??o},void 0!==e&&this.setColormap(e),void 0!==t&&this.setVOI(t,{suppressEvents:s,voiUpdatedWithSetProperties:!0}),void 0!==r&&this.setVOILUTFunction(r,s),void 0!==n&&this.setInvertColor(n),void 0!==a&&this.setInterpolationType(a),void 0!==i&&this.setSharpening(i),void 0!==o&&this.setSmoothing(o)}resetProperties(){this.cpuRenderingInvalidated=!0,this.voiUpdatedWithSetProperties=!1,this.viewportStatus=Fw.PRE_RENDER,this.fillWithBackgroundColor(),this.useCPURendering&&(this._cpuFallbackEnabledElement.renderingTools={}),this._resetProperties(),this.render()}_resetProperties(){let e;if(e=this._isCurrentImagePTPrescaled()?this._getDefaultPTPrescaledVOIRange():this._getVOIRangeForCurrentImage(),this.setVOI(e),this.setInvertColor(this.initialInvert),this.setInterpolationType(NK.LINEAR),!this.useCPURendering){let e=this.getTransferFunction();Gp(e,this.initialTransferFunctionNodes);let t=Go(Gh(e).reduce((e,t)=>(e.push(t[0],t[1],t[2],t[3]),e),[]),this.getDefaultActor().actor);this.setColormap(t)}}resetToDefaultProperties(){let e;this.cpuRenderingInvalidated=!0,this.viewportStatus=Fw.PRE_RENDER,this.fillWithBackgroundColor(),this.useCPURendering&&(this._cpuFallbackEnabledElement.renderingTools={});let t=this.getCurrentImageId(),r=this.perImageIdDefaultProperties.get(t)||this.globalDefaultProperties;r.colormap?.name&&this.setColormap(r.colormap),e=void 0==r.voiRange?this._getVOIRangeForCurrentImage():r.voiRange,this.setVOI(e),this.setInterpolationType(NK.LINEAR),this.setInvertColor(!1),this.render()}_getVOIFromCache(){return this.voiUpdatedWithSetProperties?this.voiRange:this._isCurrentImagePTPrescaled()?this._getDefaultPTPrescaledVOIRange():this._getVOIRangeForCurrentImage()??this.voiRange}_setPropertiesFromCache(){let e=this._getVOIFromCache(),{colormap:t,VOILUTFunction:r,interpolationType:n,invert:a,sharpening:i,smoothing:o}=this.getProperties();void 0!==r&&this.setVOILUTFunction(r,!0),this.setVOI(e),void 0!==t&&this.setColormap(t),this.setInterpolationType(n),this.setInvertColor(a),void 0!==i&&this.setSharpening(i),void 0!==o&&this.setSmoothing(o)}getCameraCPU(){let{metadata:e,viewport:t}=this._cpuFallbackEnabledElement;if(!e)return{};let{direction:r}=e,n=r.slice(6,9).map(e=>-e),a=r.slice(3,6).map(e=>-e);if(t.rotation){let e=Lv.mat4.fromRotation(Lv.mat4.create(),t.rotation*Math.PI/180,n);a=Lv.vec3.transformMat4(Lv.vec3.create(),a,e)}let i=[this.element.clientWidth/2,this.element.clientHeight/2],o=this.canvasToWorld(i),s=this.canvasToWorld([0,0]),l=this.canvasToWorld([0,this.element.clientHeight]);return{parallelProjection:!0,focalPoint:o,position:[0,0,0],parallelScale:Lv.vec3.distance(s,l)/2,scale:t.scale,viewPlaneNormal:[n[0],n[1],n[2]],aspectRatio:t.aspectRatio??[1,1],viewUp:[a[0],a[1],a[2]],flipHorizontal:this.flipHorizontal,flipVertical:this.flipVertical}}setAspectRatioForViewport(e,t=!0){let{viewport:r,image:n}=this._cpuFallbackEnabledElement;if(!t){r.aspectRatio=e;return}let{clientWidth:a,clientHeight:i}=this.element,{rowPixelSpacing:o,columnPixelSpacing:s,width:l,height:u}=n,d=(([e,t])=>e/t)(r.aspectRatio||[1,1]),c=(([e,t])=>e/t)(e),h=a/i,p=i*o*.5,m=e=>{let t=l*s*e,r=u*o;if(t/r>h)return p/(a/t);let n=.5*r;return e<1?n/e:n},f=m(c)/m(d);r.aspectRatio=e,r.parallelScale&&(r.parallelScale*=f,r.scale=p/r.parallelScale)}setCameraCPU(e){let{viewport:t,image:r}=this._cpuFallbackEnabledElement,n=this.getCameraCPU(),{focalPoint:a,parallelScale:i,scale:o,flipHorizontal:s,flipVertical:l,aspectRatio:u,isFitViewportAfterStretch:d}=e,{clientHeight:c}=this.element;if(a){let e=this.worldToCanvasCPU(a),r=qP(this._cpuFallbackEnabledElement,e),i=this.worldToCanvasCPU(n.focalPoint),o=qP(this._cpuFallbackEnabledElement,i),s=Lv.vec2.create();Lv.vec2.subtract(s,Lv.vec2.fromValues(r[0],r[1]),Lv.vec2.fromValues(o[0],o[1]));let l=qH({x:s[0],y:s[1]},t);t.translation.x-=l.x,t.translation.y-=l.y}if(i){let{rowPixelSpacing:e}=r;t.scale=c*e*.5/i,t.parallelScale=i}if(o){let{rowPixelSpacing:e}=r;t.scale=o,t.parallelScale=c*e*.5/o}u&&this.setAspectRatioForViewport(u,d),(void 0!==s||void 0!==l)&&this.setFlipCPU({flipHorizontal:s,flipVertical:l}),this._cpuFallbackEnabledElement.transform=Gj(this._cpuFallbackEnabledElement);let h={previousCamera:n,camera:this.getCamera(),element:this.element,viewportId:this.id,renderingEngineId:this.renderingEngineId};Bh(this.element,NH.CAMERA_MODIFIED,h)}getPanCPU(){let{viewport:e}=this._cpuFallbackEnabledElement;return[e.translation?.x??0,e.translation?.y??0]}setPanCPU(e){let t=this.getCameraCPU();this.setCameraCPU({...t,focalPoint:[...e.map(e=>-e),0]})}getZoomCPU(){let{viewport:e}=this._cpuFallbackEnabledElement;return e.scale}setZoomCPU(e){let t=this.getCameraCPU();this.setCameraCPU({...t,scale:e})}getAspectRatioCPU(){let{aspectRatio:e}=this.getCameraCPU();return e??this.options?.aspectRatio??[1,1]}setAspectRatioCPU(e,t=!0,r=!1){let n=this.getCameraCPU();r&&(this.options.aspectRatio=e),this.setCameraCPU({...n,aspectRatio:e,isFitViewportAfterStretch:t})}setFlipCPU({flipHorizontal:e,flipVertical:t}){let{viewport:r}=this._cpuFallbackEnabledElement;void 0!==e&&(r.hflip=e,this.flipHorizontal=r.hflip),void 0!==t&&(r.vflip=t,this.flipVertical=r.vflip)}setVOILUTFunction(e,t){if(this.useCPURendering)throw Error("VOI LUT function is not supported in CPU rendering");let r=this._getValidVOILUTFunction(e),n=!1;this.VOILUTFunction!==r&&(n=!0),this.VOILUTFunction=r;let{voiRange:a}=this.getProperties();this.setVOI(a,{suppressEvents:t,forceRecreateLUTFunction:n})}setRotationCPU(e){let{viewport:t}=this._cpuFallbackEnabledElement;t.rotation=e}setRotationGPU(e){let t=this.getPan(this.fitToCanvasCamera),r=this.getPan(),n=Lv.vec2.sub([0,0],t,r);this.setPan(n,!1);let{flipVertical:a,flipHorizontal:i,viewPlaneNormal:o}=this.getCamera(),s=qK(this.initialViewUp,i,a,o);this.setCameraNoEvent({viewUp:s}),this.getVtkActiveCamera().roll(-e);let l=this.getPan(),u=this.getPan(this.fitToCanvasCamera),d=Lv.vec2.sub([0,0],l,u),c=Lv.vec2.add([0,0],t,d);this.setPan(c,!1)}setInterpolationTypeGPU(e){let t=this.getDefaultActor();if(!t||!H2(t))return;let{actor:r}=t;r.getProperty().setInterpolationType(e),this.interpolationType=e}setInterpolationTypeCPU(e){let{viewport:t}=this._cpuFallbackEnabledElement;t.pixelReplication=e!==NK.LINEAR,this.interpolationType=e}setInvertColorCPU(e){let{viewport:t}=this._cpuFallbackEnabledElement;t&&(t.invert=e,this.invert=e)}setInvertColorGPU(e){let t=this.getDefaultActor();if(t&&H2(t)){if(H5(t,"vtkVolume")){let r=t.actor.getProperty().getRGBTransferFunction(0);(!this.invert&&e||this.invert&&!e)&&Gb(r),this.invert=e}else if(H5(t,"vtkImageSlice")){let r=t.actor.getProperty().getRGBTransferFunction(0);(!this.invert&&e||this.invert&&!e)&&Gb(r),this.invert=e}}}setVOICPU(e,t={}){let{suppressEvents:r=!1}=t,{viewport:n,image:a}=this._cpuFallbackEnabledElement;if(!n||!a)return;if(void 0===e){let{windowWidth:t,windowCenter:r}=a,i=Array.isArray(t)?t[0]:t,o=Array.isArray(r)?r[0]:r;n.voi={windowWidth:i,windowCenter:o,voiLUTFunction:a.voiLUTFunction};let{lower:s,upper:l}=GM(i,o,a.voiLUTFunction);e={lower:s,upper:l}}else{let{lower:t,upper:r}=e,{windowCenter:i,windowWidth:o}=Gm(t,r);n.voi||(n.voi={windowWidth:0,windowCenter:0,voiLUTFunction:a.voiLUTFunction}),n.voi.windowWidth=o,n.voi.windowCenter=i}this.voiRange=e;let i={viewportId:this.id,range:e};r||Bh(this.element,NH.VOI_MODIFIED,i)}getTransferFunction(){let e=this.getDefaultActor();if(e&&H2(e))return e.actor.getProperty().getRGBTransferFunction(0)}setVOIGPU(e,t={}){let{suppressEvents:r=!1,forceRecreateLUTFunction:n=!1,voiUpdatedWithSetProperties:a=!1}=t;if(e&&this.voiRange&&this.voiRange.lower===e.lower&&this.voiRange.upper===e.upper&&!n&&!this.stackInvalidated)return;let i=this.getDefaultActor();if(!i||!H2(i))return;let o=i.actor,s=e;if(void 0===s){let e=o.getMapper().getInputData().getPointData().getScalars().getRange();s={lower:e[0],upper:e[1]}}o.getProperty().setUseLookupTableScalarRange(!0);let l=o.getProperty().getRGBTransferFunction(0),u=this.VOILUTFunction===N2.SAMPLED_SIGMOID;if((u||!l||n)&&(l=(u?Gy:Gg)(s),this.invert&&Gb(l),o.getProperty().setRGBTransferFunction(0,l),this.initialTransferFunctionNodes=Gh(l)),u||l.setRange(s.lower,s.upper),this.voiRange=s,this.voiUpdatedWithSetProperties||(this.voiUpdatedWithSetProperties=a),r)return;let d={viewportId:this.id,range:s,VOILUTFunction:this.VOILUTFunction};Bh(this.element,NH.VOI_MODIFIED,d)}_addScalingToViewport(e){if(this.scaling.PT)return;let{suvbw:t,suvlbm:r,suvbsa:n}=e,a={};r&&(a.suvbwToSuvlbm=r/t),n&&(a.suvbwToSuvbsa=n/t),this.scaling.PT=a}getImageDataMetadata(e){let t=e.imageId,{numberOfComponents:r,origin:n,direction:a,dimensions:i,spacing:o,numVoxels:s,imagePixelModule:l,voiLUTFunction:u,modality:d,scalingFactor:c,calibration:h}=HH(e);"PT"===d&&c&&this._addScalingToViewport(c),this.modality=d;let p=this._getValidVOILUTFunction(u);this.VOILUTFunction=p,this.calibration=h;let m=this._getImagePlaneModule(t);return this.useCPURendering||(m=this.calibrateIfNecessary(t,m)),{bitsAllocated:l.bitsAllocated,numberOfComponents:r,origin:n,direction:a,dimensions:i,spacing:o,numVoxels:s,imagePlaneModule:m,imagePixelModule:l}}matchImagesForOverlay(e,t){return(e=>{let r=HB(FC.IMAGE_PLANE,t),n=HB(FC.IMAGE_PLANE,e),a=r.imageOrientationPatient,i=n.imageOrientationPatient;if(a&&i){if(Vw(r.imageOrientationPatient,n.imageOrientationPatient)){let t=r.imagePositionPatient,a=n.imagePositionPatient;if(t&&a&&Vw(t,a)){let t=r.rows,a=r.columns,i=n.rows,o=n.columns;if(t===i&&a===o)return e}}}else{let t=r.rows,a=r.columns,i=n.rows,o=n.columns;if(t===i&&a===o)return e}})(e)}getImagePlaneReferenceData(e=this.getCurrentImageIdIndex()){let t=this.imageIds[e];if(!t)return;let r=HB(FC.IMAGE_PLANE,t);if(!r)return;let{imagePositionPatient:n,frameOfReferenceUID:a}=r,{rowCosines:i,columnCosines:o}=r;return i||=[1,0,0],o||=[0,1,0],{FrameOfReferenceUID:a,viewPlaneNormal:Lv.vec3.cross([0,0,0],o,i),cameraFocalPoint:n,referencedImageId:t,sliceIndex:e}}_getCameraOrientation(e){let t=e.slice(6,9).map(e=>-e),r=e.slice(3,6).map(e=>-e);return{viewPlaneNormal:[t[0],t[1],t[2]],viewUp:[r[0],r[1],r[2]]}}createVTKImageData({origin:e,direction:t,dimensions:r,spacing:n,numberOfComponents:a,pixelArray:i}){return qn({origin:e,direction:t,dimensions:r,spacing:n,numberOfComponents:a,pixelArray:new i.constructor(i.length)})}_createVTKImageData({origin:e,direction:t,dimensions:r,spacing:n,numberOfComponents:a,pixelArray:i}){try{this._imageData=this.createVTKImageData({origin:e,direction:t,dimensions:r,spacing:n,numberOfComponents:a,pixelArray:i})}catch(e){Kt.error(e)}}async setStack(e,t=0){if(this._throwIfDestroyed(),this.clearDisplaySets(),this.imageIds=e,t>e.length)throw Error("Current image index is greater than the number of images in the stack");this.imageKeyToIndexMap.clear(),e.forEach((e,t)=>{this.imageKeyToIndexMap.set(e,t),this.imageKeyToIndexMap.set(Gk(e),t)}),this.currentImageIdIndex=t,this.targetImageIdIndex=t;let r=HB(GC.IMAGE_RETRIEVE_CONFIGURATION,e[t],"stack");this.imagesLoader=r?(r.create||qz)(r):this,this.stackInvalidated=!0,this.flipVertical=!1,this.flipHorizontal=!1,this.voiRange=null,this.interpolationType=NK.LINEAR,this.invert=!1,this.viewportStatus=Fw.LOADING,this.fillWithBackgroundColor(),this.useCPURendering&&(this._cpuFallbackEnabledElement.renderingTools={},delete this._cpuFallbackEnabledElement.viewport.colormap);let n=await this._setImageIdIndex(t),a={imageIds:e,viewportId:this.id,element:this.element,currentImageIdIndex:t};return Bh(this.element,NH.VIEWPORT_NEW_IMAGE_SET,a),n}async setDisplaySets(...e){await this.mountDisplaySets(e,async e=>{let t=HY(e.displaySetId);if(!t?.imageIds?.length)throw Error(`[StackViewport] No registered imageIds for display set ${e.displaySetId}`);let r="number"==typeof t.initialImageIdIndex?t.initialImageIdIndex:0;await this.setStack(t.imageIds,r)})}_throwIfDestroyed(){if(this.isDisabled)throw Error("The stack viewport has been destroyed and is no longer usable. Renderings will not be performed. If you are using the same viewportId and have re-enabled the viewport, you need to grab the new viewport instance using renderingEngine.getViewport(viewportId), instead of using your lexical scoped reference to the viewport instance.")}_checkVTKImageDataMatchesCornerstoneImage(e,t){if(!t)return!1;let[r,n]=t.getSpacing(),[a,i]=t.getDimensions(),o=this._getImagePlaneModule(e.imageId),s=t.getDirection(),l=s.slice(0,3),u=s.slice(3,6),d=t.getPointData().getScalars().getDataType(),c=Vw(r,e.columnPixelSpacing),h=Vw(n,e.rowPixelSpacing),p=c||null===e.columnPixelSpacing&&1===r,m=h||null===e.rowPixelSpacing&&1===n,f=a===e.columns,g=i===e.rows,y=Vw(o.rowCosines,l),v=Vw(o.columnCosines,u),b=d===e.voxelManager.getScalarData().constructor.name;return p&&m&&f&&g&&y&&v&&b}_updateVTKImageDataFromCornerstoneImage(e){let t=this._getImagePlaneModule(e.imageId).imagePositionPatient;null==t&&(t=[0,0,0]),this._imageData.setOrigin(t);let r=this.getActor(this.id);r&&(r.referencedId=e.imageId),Gv(this._imageData,e)}_loadAndDisplayImage(e,t){return this.useCPURendering?this._loadAndDisplayImageCPU(e,t):this._loadAndDisplayImageGPU(e,t)}_loadAndDisplayImageCPU(e,t){return new Promise((r,n)=>{function a(e,t,n){if(this.currentImageIdIndex!==t)return;let a=e.voxelManager.getScalarData(),i=e.preScale,o=i?.scalingParameters,s=i?.scaled&&o?.rescaleIntercept%1!=0||o?.rescaleSlope%1!=0;if(a instanceof Float32Array&&s){let t={min:e.minPixelValue,max:e.maxPixelValue},r=Math.abs(t.max-t.min)/65535,n=t.min,i=a.length,o=new Uint16Array(i),s=65535,l=0;for(let e=0;e<i;e++){let t=Math.max(0,Math.min(65535,Math.floor((a[e]-n)/r)));o[e]=t,s=Math.min(s,t),l=Math.max(l,t)}e.minPixelValue=s,e.maxPixelValue=l,e.slope=r,e.intercept=n,e.voxelManager?e.voxelManager.getScalarData=()=>o:e.getPixelData=()=>o,e.preScale={...e.preScale,scaled:!1}}this._setCSImage(e),this.viewportStatus=Fw.PRE_RENDER;let l={image:e,imageId:n,imageIdIndex:t,viewportId:this.id,renderingEngineId:this.renderingEngineId};Bh(this.element,NH.STACK_NEW_IMAGE,l),this._updateToDisplayImageCPU(e),this.render(),this.currentImageIdIndex=t,r(n)}function i(e,t,r){this.suppressEvents||Bh(Bc,NH.IMAGE_LOAD_ERROR,{error:e,imageIdIndex:t,imageId:r}),n(e)}let o=NG.Interaction,s={imageId:e,imageIdIndex:t,viewportId:this.id,renderingEngineId:this.renderingEngineId};Bh(this.element,NH.PRE_STACK_NEW_IMAGE,s),qM.addRequest((function(e,t,r){return qI(e,r).then(r=>{a.call(this,r,t,e)},r=>{i.call(this,r,t,e)})}).bind(this,e,t,{useRGBA:!0,requestType:o}),o,{imageId:e,imageIdIndex:t},-5)})}successCallback(e,t){let r=this.imageIds.indexOf(e);if(this.currentImageIdIndex!==r)return;let n=this.csImage?.imageFrame,a=t?.imageFrame;(n?.photometricInterpretation||this.csImage?.photometricInterpretation)!==(a?.photometricInterpretation||t?.photometricInterpretation)&&(this.stackInvalidated=!0),this._setCSImage(t);let i={image:t,imageId:e,imageIdIndex:r,viewportId:this.id,renderingEngineId:this.renderingEngineId};this._updateActorToDisplayImageId(t),Bh(this.element,NH.STACK_NEW_IMAGE,i),this.render(),this.currentImageIdIndex=r}errorCallback(e,t,r){if(!t)return;let n=this.imageIds.indexOf(e);Bh(Bc,NH.IMAGE_LOAD_ERROR,{error:r,imageIdIndex:n,imageId:e})}getLoaderImageOptions(e){let t=this.imageIds.indexOf(e),{transferSyntaxUID:r}=HB(FC.TRANSFER_SYNTAX,e)||{};return{useRGBA:!1,transferSyntaxUID:r,priority:5,requestType:NG.Interaction,additionalDetails:{imageId:e,imageIdIndex:t}}}async loadImages(e,t){let r=await Promise.allSettled(e.map(e=>{let r=this.getLoaderImageOptions(e);return qI(e,r).then(r=>(t.successCallback(e,r),e),r=>(t.errorCallback(e,!0,r),e))})),n=r.filter(e=>"rejected"===e.status);if(n&&n.length){let e=new CustomEvent(NH.IMAGE_LOAD_ERROR,{detail:n,cancelable:!0});Bc.dispatchEvent(e)}return r}_loadAndDisplayImageGPU(e,t){if(!e)return void console.warn("No image id set yet to load");let r={imageId:e,imageIdIndex:t,viewportId:this.id,renderingEngineId:this.renderingEngineId};return Bh(this.element,NH.PRE_STACK_NEW_IMAGE,r),this.imagesLoader.loadImages([e],this).then(()=>e)}_updateToDisplayImageCPU(e){let t=this.getImageDataMetadata(e),r=qR(this.canvas,e,this.modality,this._cpuFallbackEnabledElement.viewport.colormap),{windowCenter:n,windowWidth:a,voiLUTFunction:i}=r.voi;this.voiRange=GM(a,n,i),this._cpuFallbackEnabledElement.image=e,this._cpuFallbackEnabledElement.metadata={...t},this.cpuImagePixelData=e.voxelManager.getScalarData();let o=Object.assign({},r,this._cpuFallbackEnabledElement.viewport);this._cpuFallbackEnabledElement.viewport=this.stackInvalidated?r:o,this.stackInvalidated=!1,this.cpuRenderingInvalidated=!0,this._cpuFallbackEnabledElement.transform=Gj(this._cpuFallbackEnabledElement)}getSliceViewInfo(){throw Error("Method not implemented.")}addImages(e){let t=[];e.forEach(e=>{let{imageId:r,...n}=e,a=ql.getImage(r),{origin:i,dimensions:o,direction:s,spacing:l,numberOfComponents:u}=this.getImageDataMetadata(a),d=this.createVTKImageData({origin:i,dimensions:o,direction:s,spacing:l,numberOfComponents:u,pixelArray:a.voxelManager.getScalarData()}),c=this.createActorMapper(d);c&&(t.push({uid:e.actorUID??F2(),actor:c,referencedId:r,...n}),e.callback&&e.callback({imageActor:c,imageId:e.imageId}))}),this.addActors(t)}_updateActorToDisplayImageId(e){let t=this._checkVTKImageDataMatchesCornerstoneImage(e,this._imageData),r=this.stackInvalidated,n=this.getViewPresentation();if(t&&!r){this._updateVTKImageDataFromCornerstoneImage(e),this.resetCameraNoEvent(),this.setViewPresentation(n),this._setPropertiesFromCache(),this.stackActorReInitialized=!1;return}let{origin:a,direction:i,dimensions:o,spacing:s,numberOfComponents:l,imagePixelModule:u}=this.getImageDataMetadata(e),d=e.voxelManager.getScalarData();this._createVTKImageData({origin:a,direction:i,dimensions:o,spacing:s,numberOfComponents:l,pixelArray:d}),this._updateVTKImageDataFromCornerstoneImage(e);let c=this.createActorMapper(this._imageData),h=this.getActors();h.length&&h[0].uid===this.id?h[0].actor=c:h.unshift({uid:this.id,actor:c,referencedId:e.imageId}),this.setActors(h);let{viewPlaneNormal:p,viewUp:m}=this._getCameraOrientation(i),f=this.getCamera();if(this.setCameraNoEvent({viewUp:m,viewPlaneNormal:p}),this.initialViewUp=m,this.resetCameraNoEvent(),this.setViewPresentation(n),this.triggerCameraEvent(this.getCamera(),f),r){let t="MONOCHROME1"===u.photometricInterpretation;this.stackInvalidated=!0;let r=this._getInitialVOIRange(e);this.setVOI(r,{forceRecreateLUTFunction:!!t}),this.initialInvert=!!t,this.setInvertColor(this.invert||this.initialInvert)}else this.stackInvalidated=!0,this._setPropertiesFromCache();this.stackInvalidated=!1,this.stackActorReInitialized=!0,this._publishCalibratedEvent&&this.triggerCalibrationEvent()}_getInitialVOIRange(e){if(this.voiRange&&this.voiUpdatedWithSetProperties)return this.voiRange;let{windowCenter:t,windowWidth:r,voiLUTFunction:n}=e,a=GM(r,t,n);return this._getPTPreScaledRange()||a}_getPTPreScaledRange(){if(this._isCurrentImagePTPrescaled())return this._getDefaultPTPrescaledVOIRange()}_isCurrentImagePTPrescaled(){return"PT"===this.modality&&!!this.csImage.isPreScaled&&!!this.csImage.preScale?.scalingParameters.suvbw}_getDefaultPTPrescaledVOIRange(){return{lower:0,upper:5}}async _setImageIdIndex(e){if(e>=this.imageIds.length)throw Error(`ImageIdIndex provided ${e} is invalid, the stack only has ${this.imageIds.length} elements`);this.currentImageIdIndex=e,this.hasPixelSpacing=!0,this.viewportStatus=Fw.PRE_RENDER;let t=await this._loadAndDisplayImage(this.imageIds[e],e);if(this.perImageIdDefaultProperties.size>=1){let e=this.perImageIdDefaultProperties.get(t);void 0!==e?this.setProperties(e):void 0!==this.globalDefaultProperties&&this.setProperties(this.globalDefaultProperties)}return t}resetCameraCPU({resetPan:e=!0,resetZoom:t=!0}){let{image:r}=this._cpuFallbackEnabledElement;if(!r)return;!function(e,t=!0,r=!0){let{canvas:n,image:a,viewport:i}=e,o=qA(n,a,0).scaleFactor;i.vflip=!1,i.hflip=!1,t&&(i.translation.x=0,i.translation.y=0),r&&(i.displayedArea.tlhc.x=1,i.displayedArea.tlhc.y=1,i.displayedArea.brhc.x=a.columns,i.displayedArea.brhc.y=a.rows,i.scale=o)}(this._cpuFallbackEnabledElement,e,t);let{scale:n}=this._cpuFallbackEnabledElement.viewport,{clientWidth:a,clientHeight:i}=this.element,o=this.canvasToWorldCPU([a/2,i/2]);this.setCameraCPU({focalPoint:o,scale:n})}resetCameraGPU(e){return this.setCamera({flipHorizontal:!1,flipVertical:!1,viewUp:this.initialViewUp}),super.resetCamera({resetToCenter:!0,...e})}scroll(e,t=!0,r=!1){let n=this.imageIds;if(isNaN(this.targetImageIdIndex))return;let a=this.targetImageIdIndex,i=n.length,o=a+e;o=r?(o+i)%i:Math.max(0,Math.min(i-1,o)),this.targetImageIdIndex=o;let s=n[o];ql.isLoaded(s)||!t?this.setImageIdIndex(o):(clearTimeout(this.debouncedTimeout),this.debouncedTimeout=window.setTimeout(()=>{this.setImageIdIndex(o)},40));let l={newImageIdIndex:o,imageId:s,direction:e};o!==a&&Bh(this.element,NH.STACK_VIEWPORT_SCROLL,l)}setImageIdIndex(e){if(this._throwIfDestroyed(),this.currentImageIdIndex===e)return Promise.resolve(this.getCurrentImageId());let t=this._setImageIdIndex(e);return this.targetImageIdIndex=e,t}calibrateSpacing(e){let t=this.getImageIds().indexOf(e);this.stackInvalidated=!0,this._loadAndDisplayImage(e,t)}triggerCameraEvent(e,t){let r={previousCamera:t,camera:e,element:this.element,viewportId:this.id,renderingEngineId:this.renderingEngineId};this.suppressEvents||Bh(this.element,NH.CAMERA_MODIFIED,r)}triggerCalibrationEvent(){let{imageData:e}=this.getImageData(),t={element:this.element,viewportId:this.id,renderingEngineId:this.renderingEngineId,imageId:this.getCurrentImageId(),imageData:e,worldToIndex:e.getWorldToIndex(),...this._calibrationEvent};this.suppressEvents||Bh(this.element,NH.IMAGE_SPACING_CALIBRATED,t),this._publishCalibratedEvent=!1}jumpToWorld(e){let t=this.getImageIds(),{direction:r,spacing:n}=this.getImageData(),a=q$({direction:r,spacing:n,imageIds:t},e,this.getCamera().viewPlaneNormal,{ignoreSpacing:!0}),i=t.indexOf(a);return -1!==i&&(this.setImageIdIndex(i),this.render(),!0)}getRendererContextPool(){return this.getRenderingEngine().getRenderer(this.id)}getRendererTiled(){let e=this.getRenderingEngine();if(!e||e.hasBeenDestroyed)throw Error("Rendering engine has been destroyed");return e.offscreenMultiRenderWindow?.getRenderer(this.id)}_getVOIRangeForCurrentImage(){let{windowCenter:e,windowWidth:t,voiLUTFunction:r}=this.csImage;return GM(t,e,r)}_getValidVOILUTFunction(e){return Object.values(N2).includes(e)?e:N2.LINEAR}getSliceInfo(){let e=this.getSliceIndex(),{dimensions:t}=this.getImageData();return{width:t[0],height:t[1],sliceIndex:e,slicePlane:2}}isReferenceViewable(e,t={}){let r=this.getCurrentImageIdIndex(),n=this.imageIds[r];if(!n||!e)return!1;let{referencedImageId:a,multiSliceReference:i}=e;if(a){if(a===n)return!0;e.referencedImageURI||=Gk(a);let{referencedImageURI:o}=e,s=this.imageKeyToIndexMap.get(o);return!!(t.asOverlay&&this.matchImagesForOverlay(n,a))||void 0!==s&&(!!t.withNavigation||r<=(i&&this.imageKeyToIndexMap.get(i.referencedImageId))&&r>=s)}if(!super.isReferenceViewable(e,{...t,withOrientation:t?.asVolume}))return!1;if(e.volumeId||e.FrameOfReferenceUID)return t.asVolume;let{cameraFocalPoint:o}=e;if(t.asNearbyProjection&&o){let{spacing:e,direction:t,origin:r}=this.getImageData(),n=t.slice(6,9),a=qG({direction:t,spacing:e},n),i=Lv.vec3.subtract(Lv.vec3.create(),o,r);if(Math.abs(Lv.vec3.dot(i,n))<=a/2)return!0}return!1}getViewReference(e={}){let{sliceIndex:t=this.getCurrentImageIdIndex()}=e,r=super.getViewReference(e),n=this.getCurrentImageId(t);if(n){if(r.referencedImageId=n,this.getCurrentImageIdIndex()!==t){let e=this.getImagePlaneReferenceData(t);if(!e)return;Object.assign(r,e)}return r}}setViewReference(e){if(!e?.referencedImageId){e?.sliceIndex!==void 0&&this.scroll(e.sliceIndex-this.targetImageIdIndex);return}let{referencedImageId:t}=e;e.referencedImageURI||=Gk(t);let{referencedImageURI:r}=e,n=this.imageKeyToIndexMap.get(r);void 0===n?Kt.error(`No image URI found for ${r}`):this.scroll(n-this.targetImageIdIndex)}getViewReferenceId(e={}){let{sliceIndex:t=this.currentImageIdIndex}=e;return`imageId:${this.imageIds[t]}`}getSliceIndexForImage(e){if(e){if("string"==typeof e)return this.imageKeyToIndexMap.get(e);if(e.referencedImageId)return this.imageKeyToIndexMap.get(e.referencedImageId)}}getCPUFallbackError(e){return Error(`method ${e} cannot be used during CPU Fallback mode`)}fillWithBackgroundColor(){let e=this.getRenderingEngine();e&&e.fillCanvasWithBackgroundColor(this.canvas,this.options.background)}unsetColormapCPU(){delete this._cpuFallbackEnabledElement.viewport.colormap,this._cpuFallbackEnabledElement.renderingTools={},this.cpuRenderingInvalidated=!0,this.fillWithBackgroundColor(),this.render()}setColormapCPU(e){this.colormap=e;let t=G5(e);t?this._cpuFallbackEnabledElement.viewport.colormap=t:delete this._cpuFallbackEnabledElement.viewport.colormap,this._cpuFallbackEnabledElement.renderingTools={},this.fillWithBackgroundColor(),this.cpuRenderingInvalidated=!0,this.render();let r={viewportId:this.id,colormap:e};Bh(this.element,NH.COLORMAP_MODIFIED,r)}setColormapGPU(e){let t=this.getDefaultActor().actor.getProperty(),r=t.getRGBTransferFunction(),n=Gi(e.name);if(r)r.applyColorMap(n),r.setMappingRange(this.voiRange.lower,this.voiRange.upper),t.setRGBTransferFunction(0,r);else{let e=z2.newInstance();e.applyColorMap(n),e.setMappingRange(this.voiRange.lower,this.voiRange.upper),t.setRGBTransferFunction(0,e)}this.colormap=e,this.render();let a={viewportId:this.id,colormap:e};Bh(this.element,NH.COLORMAP_MODIFIED,a)}unsetColormapGPU(){throw Error("unsetColormapGPU not implemented.")}_getImagePlaneModule(e){let t=Hz(e);return this.hasPixelSpacing=!t.usingDefaultValues||this.calibration?.scale>0||this.calibration?.rowPixelSpacing>0,this.calibration||=t.calibration,t}isInAcquisitionPlane(){return!0}};function Kn(e,t){return e.worldToIndex(t).map(Math.round)}function Ka(e){let{direction:t}=e;return{viewPlaneNormal:t.slice(6,9).map(e=>-e),viewUp:t.slice(3,6).map(e=>-e)}}var Ki={context:null,lastRenderer:null,keyMatrixTime:null,keyMatrices:null},Ko=jh(function(e,t,r={}){Object.assign(t,Ki,r),q9.extend(e,t,r),t.keyMatrixTime={},B9(t.keyMatrixTime),t.keyMatrices={normalMatrix:new Float64Array(9),vcpc:new Float64Array(16),wcvc:new Float64Array(16),wcpc:new Float64Array(16)},ja(e,t,["context","keyMatrixTime"]),t.classHierarchy.push("vtkOpenGLCamera"),e.buildPass=r=>{r&&(t._openGLRenderer=e.getFirstAncestorOfType("vtkOpenGLRenderer"),t._openGLRenderWindow=t._openGLRenderer.getParent(),t.context=t._openGLRenderWindow.getContext())},e.opaquePass=e=>{if(e){let e=t._openGLRenderer.getTiledSizeAndOrigin();t.context.viewport(e.lowerLeftU,e.lowerLeftV,e.usize,e.vsize),t.context.scissor(e.lowerLeftU,e.lowerLeftV,e.usize,e.vsize)}},e.translucentPass=e.opaquePass,e.zBufferPass=e.opaquePass,e.opaqueZBufferPass=e.opaquePass,e.volumePass=e.opaquePass,e.getKeyMatrices=r=>{if(r!==t.lastRenderer||t._openGLRenderWindow.getMTime()>t.keyMatrixTime.getMTime()||e.getMTime()>t.keyMatrixTime.getMTime()||r.getMTime()>t.keyMatrixTime.getMTime()||t.renderable.getMTime()>t.keyMatrixTime.getMTime()){t.renderable.getViewMatrix(t.keyMatrices.wcvc),Lv.mat3.fromMat4(t.keyMatrices.normalMatrix,t.keyMatrices.wcvc),Lv.mat3.invert(t.keyMatrices.normalMatrix,t.keyMatrices.normalMatrix),Lv.mat4.transpose(t.keyMatrices.wcvc,t.keyMatrices.wcvc);let e=t._openGLRenderer.getAspectRatio();Lv.mat4.copy(t.keyMatrices.vcpc,t.renderable.getProjectionMatrix(e,-1,1)),Lv.mat4.transpose(t.keyMatrices.vcpc,t.keyMatrices.vcpc),Lv.mat4.multiply(t.keyMatrices.wcpc,t.keyMatrices.vcpc,t.keyMatrices.wcvc),t.keyMatrixTime.modified(),t.lastRenderer=r}return t.keyMatrices}});$r.vtkCamera=Ko;var Ks="//VTK::System::Dec\n\n/*=========================================================================\n\n Program: Visualization Toolkit\n Module: vtkPolyDataVS.glsl\n\n Copyright (c) Ken Martin, Will Schroeder, Bill Lorensen\n All rights reserved.\n See Copyright.txt or http://www.kitware.com/Copyright.htm for details.\n\n This software is distributed WITHOUT ANY WARRANTY; without even\n the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR\n PURPOSE. See the above copyright notice for more information.\n\n=========================================================================*/\n\nattribute vec4 vertexMC;\n\n// frag position in VC\n//VTK::PositionVC::Dec\n\n// optional normal declaration\n//VTK::Normal::Dec\n\n// extra lighting parameters\n//VTK::Light::Dec\n\n// Texture coordinates\n//VTK::TCoord::Dec\n\n// material property values\n//VTK::Color::Dec\n\n// clipping plane vars\n//VTK::Clip::Dec\n\n// camera and actor matrix values\n//VTK::Camera::Dec\n\n// Apple Bug\n//VTK::PrimID::Dec\n\n// picking support\n//VTK::Picking::Dec\n\nvoid main()\n{\n //VTK::Color::Impl\n\n //VTK::Normal::Impl\n\n //VTK::TCoord::Impl\n\n //VTK::Clip::Impl\n\n //VTK::PrimID::Impl\n\n //VTK::PositionVC::Impl\n\n //VTK::Light::Impl\n\n //VTK::Picking::Impl\n}\n",Kl="//VTK::System::Dec\n\n/*=========================================================================\n\n Program: Visualization Toolkit\n Module: vtkPolyDataFS.glsl\n\n Copyright (c) Ken Martin, Will Schroeder, Bill Lorensen\n All rights reserved.\n See Copyright.txt or http://www.kitware.com/Copyright.htm for details.\n\n This software is distributed WITHOUT ANY WARRANTY; without even\n the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR\n PURPOSE. See the above copyright notice for more information.\n\n=========================================================================*/\n// Template for the polydata mappers fragment shader\n\nuniform int PrimitiveIDOffset;\n\n// VC position of this fragment\n//VTK::PositionVC::Dec\n\n// optional color passed in from the vertex shader, vertexColor\n//VTK::Color::Dec\n\n// optional surface normal declaration\n//VTK::Normal::Dec\n\n// extra lighting parameters\n//VTK::Light::Dec\n\n// define vtkImageLabelOutlineOn\n//VTK::ImageLabelOutlineOn\n\n// Texture coordinates\n//VTK::TCoord::Dec\n\n// picking support\n//VTK::Picking::Dec\n\n// Depth Peeling Support\n//VTK::DepthPeeling::Dec\n\n// clipping plane vars\n//VTK::Clip::Dec\n\n// label outline \n//VTK::LabelOutline::Dec\n\n// the output of this shader\n//VTK::Output::Dec\n\n// Apple Bug\n//VTK::PrimID::Dec\n\n// handle coincident offsets\n//VTK::Coincident::Dec\n\n//VTK::ZBuffer::Dec\n\n//VTK::LabelOutlineHelperFunction\n\nvoid main()\n{\n // VC position of this fragment. This should not branch/return/discard.\n //VTK::PositionVC::Impl\n\n // Place any calls that require uniform flow (e.g. dFdx) here.\n //VTK::UniformFlow::Impl\n\n // Set gl_FragDepth here (gl_FragCoord.z by default)\n //VTK::Depth::Impl\n\n // Early depth peeling abort:\n //VTK::DepthPeeling::PreColor\n\n // Apple Bug\n //VTK::PrimID::Impl\n\n //VTK::Clip::Impl\n\n //VTK::Color::Impl\n\n // Generate the normal if we are not passed in one\n //VTK::Normal::Impl\n\n //VTK::TCoord::Impl\n\n //VTK::Light::Impl\n\n if (gl_FragData[0].a <= 0.0)\n {\n discard;\n }\n\n //VTK::DepthPeeling::Impl\n\n //VTK::Picking::Impl\n\n // handle coincident offsets\n //VTK::Coincident::Impl\n\n //VTK::ZBuffer::Impl\n\n //VTK::RenderPassFragmentShader::Impl\n}\n",Ku=function(e,t,r={}){e.replaceShaderCoincidentOffset=(r,n,a)=>{let i=e.getCoincidentParameters(n,a);if(i&&(0!==i.factor||0!==i.offset)){let e=r.Fragment;e=$W.substitute(e,"//VTK::Coincident::Dec",["uniform float cfactor;","uniform float coffset;"]).result,t.context.getExtension("EXT_frag_depth")&&(0!==i.factor?(e=$W.substitute(e,"//VTK::UniformFlow::Impl",["float cscale = length(vec2(dFdx(gl_FragCoord.z),dFdy(gl_FragCoord.z)));","//VTK::UniformFlow::Impl"],!1).result,e=$W.substitute(e,"//VTK::Depth::Impl","gl_FragDepthEXT = gl_FragCoord.z + cfactor*cscale + 0.000016*coffset;").result):e=$W.substitute(e,"//VTK::Depth::Impl","gl_FragDepthEXT = gl_FragCoord.z + 0.000016*coffset;").result),t._openGLRenderWindow.getWebgl2()&&(0!==i.factor?(e=$W.substitute(e,"//VTK::UniformFlow::Impl",["float cscale = length(vec2(dFdx(gl_FragCoord.z),dFdy(gl_FragCoord.z)));","//VTK::UniformFlow::Impl"],!1).result,e=$W.substitute(e,"//VTK::Depth::Impl","gl_FragDepth = gl_FragCoord.z + cfactor*cscale + 0.000016*coffset;").result):e=$W.substitute(e,"//VTK::Depth::Impl","gl_FragDepth = gl_FragCoord.z + 0.000016*coffset;").result),r.Fragment=e}}},Kd=function(e,t,r={}){e.applyShaderReplacements=(e,t,r)=>{let n=null;if(t&&(n=t.ShaderReplacements),n)for(let t=0;t<n.length;t++){let a=n[t];if(r&&a.replaceFirst||!r&&!a.replaceFirst){let t=a.shaderType,r=e[t];e[t]=$W.substitute(r,a.originalValue,a.replacementValue,a.replaceAll).result}}},e.buildShaders=(r,n,a)=>{e.getReplacedShaderTemplate(r,n,a),t.lastRenderPassShaderReplacement=t.currentRenderPass?t.currentRenderPass.getShaderReplacement():null,t.lastRenderPassShaderReplacement&&t.lastRenderPassShaderReplacement(r);let i=t.renderable.getViewSpecificProperties().OpenGL;e.applyShaderReplacements(r,i,!0),e.replaceShaderValues(r,n,a),e.applyShaderReplacements(r,i)},e.getReplacedShaderTemplate=(r,n,a)=>{let i=t.renderable.getViewSpecificProperties().OpenGL;e.getShaderTemplate(r,n,a);let o=r.Vertex;if(i){let e=i.VertexShaderCode;void 0!==e&&""!==e&&(o=e)}r.Vertex=o;let s=r.Fragment;if(i){let e=i.FragmentShaderCode;void 0!==e&&""!==e&&(s=e)}r.Fragment=s;let l=r.Geometry;if(i){let e=i.GeometryShaderCode;void 0!==e&&(l=e)}r.Geometry=l}};function Kc(e,t,r){return e.length>0?`${e.map(e=>e?.getMTime()??"x").join("/")}-${t}-${r}`:"0"}function Kh(e,t){return`${t.getMTime()}`}var{vtkErrorMacro:Kp}=BL,{SlicingMode:Km}=Hn,Kf={VBOBuildTime:0,VBOBuildString:null,openGLTexture:null,tris:null,imagemat:null,imagematinv:null,colorTexture:null,pwfTexture:null,labelOutlineThicknessTexture:null,labelOutlineOpacityTexture:null,lastHaveSeenDepthRequest:!1,haveSeenDepthRequest:!1,lastTextureComponents:0},Kg=jh(function(e,t,r={}){Object.assign(t,Kf,r),q9.extend(e,t,r),Ku(e,t,r),Kd(e,t,r),t.tris=$G.newInstance(),t.imagemat=Lv.mat4.identity(new Float64Array(16)),t.imagematinv=Lv.mat4.identity(new Float64Array(16)),t.projectionToWorld=Lv.mat4.identity(new Float64Array(16)),t.idxToView=Lv.mat4.identity(new Float64Array(16)),t.idxNormalMatrix=Lv.mat3.identity(new Float64Array(9)),t.modelToView=Lv.mat4.identity(new Float64Array(16)),t.projectionToView=Lv.mat4.identity(new Float64Array(16)),ja(e,t,[]),t.VBOBuildTime={},B9(t.VBOBuildTime);function n(r){t.openGLTexture.releaseGraphicsResources(r),[t._colorTransferFunc,t._pwFunc,t._labelOutlineThicknessArray,t._labelOutlineOpacity].forEach(t=>r.unregisterGraphicsResourceUser(t,e))}t.classHierarchy.push("vtkOpenGLImageMapper"),e.buildPass=r=>{if(r){t.currentRenderPass=null,t.openGLImageSlice=e.getFirstAncestorOfType("vtkOpenGLImageSlice"),t._openGLRenderer=e.getFirstAncestorOfType("vtkOpenGLRenderer");let r=t._openGLRenderWindow;t._openGLRenderWindow=t._openGLRenderer.getLastAncestorOfType("vtkOpenGLRenderWindow"),r&&!r.isDeleted()&&r!==t._openGLRenderWindow&&n(r),t.context=t._openGLRenderWindow.getContext(),t.tris.setOpenGLRenderWindow(t._openGLRenderWindow);let a=t._openGLRenderer.getRenderable();t.openGLCamera=t._openGLRenderer.getViewNodeFor(a.getActiveCamera(),t.openGLCamera),t.renderable.isA("vtkImageMapper")&&t.renderable.getSliceAtFocalPoint()&&t.renderable.setSliceFromCamera(a.getActiveCamera())}},e.translucentPass=(r,n)=>{r&&(t.currentRenderPass=n,e.render())},e.zBufferPass=r=>{r&&(t.haveSeenDepthRequest=!0,t.renderDepth=!0,e.render(),t.renderDepth=!1)},e.opaqueZBufferPass=t=>e.zBufferPass(t),e.opaquePass=t=>{t&&e.render()},e.getCoincidentParameters=(e,r)=>t.renderable.getResolveCoincidentTopology()==z5.PolygonOffset?t.renderable.getCoincidentTopologyPolygonOffsetParameters():null,e.render=()=>{let r=t.openGLImageSlice.getRenderable(),n=t._openGLRenderer.getRenderable();e.renderPiece(n,r)},e.getShaderTemplate=(e,t,r)=>{e.Vertex=Ks,e.Fragment=Kl,e.Geometry=""},e.replaceShaderValues=(r,n,a)=>{let i=r.Vertex,o=r.Fragment;i=$W.substitute(i,"//VTK::Camera::Dec",["uniform mat4 MCPCMatrix;"]).result,i=$W.substitute(i,"//VTK::PositionVC::Impl",[" gl_Position = MCPCMatrix * vertexMC;"]).result,i=$W.substitute(i,"//VTK::TCoord::Impl","tcoordVCVSOutput = tcoordMC;").result,i=$W.substitute(i,"//VTK::TCoord::Dec","attribute vec2 tcoordMC; varying vec2 tcoordVCVSOutput;").result;let s=t.openGLTexture.getComponents(),l=a.getProperty().getIndependentComponents(),u=["varying vec2 tcoordVCVSOutput;","uniform float cshift0;","uniform float cscale0;","uniform float pwfshift0;","uniform float pwfscale0;","uniform sampler2D texture1;","uniform sampler2D colorTexture1;","uniform sampler2D pwfTexture1;","uniform float opacity;"];if(a.getProperty().getUseLabelOutline()&&(u=u.concat(["uniform sampler2D labelOutlineTexture1;","uniform sampler2D labelOutlineOpacityTexture1;"])),l){for(let e=1;e<s;e++)u=u.concat([`uniform float cshift${e};`,`uniform float cscale${e};`,`uniform float pwfshift${e};`,`uniform float pwfscale${e};`]);switch(s){case 1:u=u.concat(["uniform float mix0;","#define height0 0.5"]);break;case 2:u=u.concat(["uniform float mix0;","uniform float mix1;","#define height0 0.25","#define height1 0.75"]);break;case 3:u=u.concat(["uniform float mix0;","uniform float mix1;","uniform float mix2;","#define height0 0.17","#define height1 0.5","#define height2 0.83"]);break;case 4:u=u.concat(["uniform float mix0;","uniform float mix1;","uniform float mix2;","uniform float mix3;","#define height0 0.125","#define height1 0.375","#define height2 0.625","#define height3 0.875"]);break;default:Kp("Unsupported number of independent coordinates.")}}if(o=$W.substitute(o,"//VTK::TCoord::Dec",u).result,!0===a.getProperty().getUseLabelOutline()&&(o=$W.substitute(o,"//VTK::LabelOutline::Dec",["uniform float vpWidth;","uniform float vpHeight;","uniform float vpOffsetX;","uniform float vpOffsetY;","uniform mat4 PCWCMatrix;","uniform mat4 vWCtoIDX;","uniform ivec3 imageDimensions;","uniform int sliceAxis;"]).result,o=$W.substitute(o,"//VTK::ImageLabelOutlineOn","#define vtkImageLabelOutlineOn").result,o=$W.substitute(o,"//VTK::LabelOutlineHelperFunction",["#ifdef vtkImageLabelOutlineOn","vec3 fragCoordToIndexSpace(vec4 fragCoord) {"," vec4 pcPos = vec4("," (fragCoord.x / vpWidth - vpOffsetX - 0.5) * 2.0,"," (fragCoord.y / vpHeight - vpOffsetY - 0.5) * 2.0,"," (fragCoord.z - 0.5) * 2.0,"," 1.0);",""," vec4 worldCoord = PCWCMatrix * pcPos;"," vec4 vertex = (worldCoord/worldCoord.w);",""," vec3 index = (vWCtoIDX * vertex).xyz;",""," // half voxel fix for labelmapOutline"," return (index + vec3(0.5)) / vec3(imageDimensions);","}","vec2 getSliceCoords(vec3 coord, int axis) {"," if (axis == 0) return coord.yz;"," if (axis == 1) return coord.xz;"," if (axis == 2) return coord.xy;","}","#endif"]).result),l){let e=["r","g","b","a"],t=["vec4 tvalue = texture2D(texture1, tcoordVCVSOutput);"];for(let r=0;r<s;r++)t=t.concat([`vec3 tcolor${r} = mix${r} * texture2D(colorTexture1, vec2(tvalue.${e[r]} * cscale${r} + cshift${r}, height${r})).rgb;`,`float compWeight${r} = mix${r} * texture2D(pwfTexture1, vec2(tvalue.${e[r]} * pwfscale${r} + pwfshift${r}, height${r})).r;`]);switch(s){case 1:t=t.concat(["gl_FragData[0] = vec4(tcolor0.rgb, opacity);"]);break;case 2:t=t.concat(["float weightSum = compWeight0 + compWeight1;","gl_FragData[0] = vec4(vec3((tcolor0.rgb * (compWeight0 / weightSum)) + (tcolor1.rgb * (compWeight1 / weightSum))), opacity);"]);break;case 3:t=t.concat(["float weightSum = compWeight0 + compWeight1 + compWeight2;","gl_FragData[0] = vec4(vec3((tcolor0.rgb * (compWeight0 / weightSum)) + (tcolor1.rgb * (compWeight1 / weightSum)) + (tcolor2.rgb * (compWeight2 / weightSum))), opacity);"]);break;case 4:t=t.concat(["float weightSum = compWeight0 + compWeight1 + compWeight2 + compWeight3;","gl_FragData[0] = vec4(vec3((tcolor0.rgb * (compWeight0 / weightSum)) + (tcolor1.rgb * (compWeight1 / weightSum)) + (tcolor2.rgb * (compWeight2 / weightSum)) + (tcolor3.rgb * (compWeight3 / weightSum))), opacity);"]);break;default:Kp("Unsupported number of independent coordinates.")}o=$W.substitute(o,"//VTK::TCoord::Impl",t).result}else switch(s){case 1:o=$W.substitute(o,"//VTK::TCoord::Impl",[...function(e){let t=e.split("\n"),r=[];for(let e=0;e<t.length;++e){let n=t[e].trim();n.length>0&&r.push(n)}return r}(`
90
+ `,$4={framebuffer:null,copyShader:null,tris:null},$8=jS.newInstance(function(e,t,r={}){Object.assign(t,$4,r),$w(e,t,r),t.VBOBuildTime={},jS.obj(t.VBOBuildTime,{mtime:0}),t.tris=$G.newInstance(),jS.get(e,t,["framebuffer"]),t.classHierarchy.push("vtkOpenGLOrderIndependentTranslucentPass"),e.createVertexBuffer=()=>{let e=new Float32Array([-1,-1,-1,1,-1,-1,-1,1,-1,1,1,-1]),r=new Float32Array([0,0,1,0,0,1,1,1]),n=new Uint16Array([4,0,1,3,2]),a=U9.newInstance({numberOfComponents:3,values:e});a.setName("points");let i=U9.newInstance({numberOfComponents:2,values:r});i.setName("tcoords");let o=U9.newInstance({numberOfComponents:1,values:n});t.tris.getCABO().createVBO(o,"polys",$1.SURFACE,{points:a,tcoords:i,cellOffset:0}),t.VBOBuildTime.modified()},e.createFramebuffer=e=>{let r=e.getSize(),n=e.getContext();t.framebuffer=$v(),t.framebuffer.setOpenGLRenderWindow(e),t.framebuffer.create(...r),t.framebuffer.saveCurrentBindingsAndBuffers(),t.framebuffer.bind(),t.translucentRGBATexture=$g.newInstance(),t.translucentRGBATexture.setInternalFormat(n.RGBA16F),t.translucentRGBATexture.setFormat(n.RGBA),t.translucentRGBATexture.setOpenGLDataType(n.HALF_FLOAT),t.translucentRGBATexture.setOpenGLRenderWindow(e),t.translucentRGBATexture.create2DFromRaw({width:r[0],height:r[1],numComps:4,dataType:"Float32Array",data:null}),t.translucentRTexture=$g.newInstance(),t.translucentRTexture.setInternalFormat(n.R16F),t.translucentRTexture.setFormat(n.RED),t.translucentRTexture.setOpenGLDataType(n.HALF_FLOAT),t.translucentRTexture.setOpenGLRenderWindow(e),t.translucentRTexture.create2DFromRaw({width:r[0],height:r[1],numComps:1,dataType:"Float32Array",data:null}),t.translucentZTexture=$g.newInstance(),t.translucentZTexture.setOpenGLRenderWindow(e),t.translucentZTexture.createDepthFromRaw({width:r[0],height:r[1],dataType:"Float32Array",data:null}),t.framebuffer.setColorBuffer(t.translucentRGBATexture,0),t.framebuffer.setColorBuffer(t.translucentRTexture,1),t.framebuffer.setDepthBuffer(t.translucentZTexture)},e.createCopyShader=e=>{t.copyShader=e.getShaderCache().readyShaderProgramArray("//VTK::System::Dec\nattribute vec4 vertexDC;\nattribute vec2 tcoordTC;\nvarying vec2 tcoord;\nvoid main() { tcoord = tcoordTC; gl_Position = vertexDC; }",$3,"")},e.createVBO=r=>{let n=r.getContext();t.tris.setOpenGLRenderWindow(r),e.createVertexBuffer();let a=t.copyShader;t.tris.getCABO().bind(),t.copyVAO.addAttributeArray(a,t.tris.getCABO(),"vertexDC",t.tris.getCABO().getVertexOffset(),t.tris.getCABO().getStride(),n.FLOAT,3,n.FALSE)||$2("Error setting vertexDC in copy shader VAO."),t.copyVAO.addAttributeArray(a,t.tris.getCABO(),"tcoordTC",t.tris.getCABO().getTCoordOffset(),t.tris.getCABO().getStride(),n.FLOAT,2,n.FALSE)||$2("Error setting vertexDC in copy shader VAO.")},e.traverse=(r,n,a)=>{if(t.deleted)return;let i=r.getSize(),o=r.getContext();if(t._supported=!1,n.getSelector()||!o||!r.getWebgl2()||!o.getExtension("EXT_color_buffer_half_float")&&!o.getExtension("EXT_color_buffer_float")){e.setCurrentOperation("translucentPass"),n.traverse(e);return}if(t._supported=!0,null===t.framebuffer)e.createFramebuffer(r);else{let n=t.framebuffer.getSize();null===n||n[0]!==i[0]||n[1]!==i[1]?(t.framebuffer.releaseGraphicsResources(),t.translucentRGBATexture.releaseGraphicsResources(r),t.translucentRTexture.releaseGraphicsResources(r),t.translucentZTexture.releaseGraphicsResources(r),e.createFramebuffer(r)):(t.framebuffer.saveCurrentBindingsAndBuffers(),t.framebuffer.bind())}o.drawBuffers([o.COLOR_ATTACHMENT0]),o.clearBufferfv(o.COLOR,0,[0,0,0,0]),o.clearBufferfv(o.DEPTH,0,[1]),o.colorMask(!1,!1,!1,!1),a.getOpaqueActorCount()>0&&(a.setCurrentOperation("opaqueZBufferPass"),n.traverse(a)),o.colorMask(!0,!0,!0,!0),o.drawBuffers([o.COLOR_ATTACHMENT0,o.COLOR_ATTACHMENT1]),o.viewport(0,0,i[0],i[1]),o.scissor(0,0,i[0],i[1]),o.clearBufferfv(o.COLOR,0,[0,0,0,1]),o.clearBufferfv(o.COLOR,1,[0,0,0,0]),o.enable(o.DEPTH_TEST),o.enable(o.BLEND),o.blendFuncSeparate(o.ONE,o.ONE,o.ZERO,o.ONE_MINUS_SRC_ALPHA),e.setCurrentOperation("translucentPass"),n.traverse(e),o.drawBuffers([o.NONE]),t.framebuffer.restorePreviousBindingsAndBuffers(),null===t.copyShader?e.createCopyShader(r):r.getShaderCache().readyShaderProgram(t.copyShader),t.copyVAO||(t.copyVAO=$S(),t.copyVAO.setOpenGLRenderWindow(r)),t.copyVAO.bind(),t.VBOBuildTime.getMTime()<e.getMTime()&&e.createVBO(r);let s=o.isEnabled(o.CULL_FACE),l=s?o.getParameter(o.CULL_FACE_MODE):null;r.disableCullFace(),o.blendFuncSeparate(o.SRC_ALPHA,o.ONE_MINUS_SRC_ALPHA,o.ONE,o.ONE_MINUS_SRC_ALPHA),o.depthMask(!1),o.depthFunc(o.ALWAYS),o.viewport(0,0,i[0],i[1]),o.scissor(0,0,i[0],i[1]),t.translucentRGBATexture.activate(),t.copyShader.setUniformi("translucentRGBATexture",t.translucentRGBATexture.getTextureUnit()),t.translucentRTexture.activate(),t.copyShader.setUniformi("translucentRTexture",t.translucentRTexture.getTextureUnit()),o.drawArrays(o.TRIANGLES,0,t.tris.getCABO().getElementCount()),o.depthMask(!0),o.depthFunc(o.LEQUAL),s&&(r.enableCullFace(),r.setCullFaceMode(l)),t.translucentRGBATexture.deactivate(),t.translucentRTexture.deactivate();let u=n.getTiledSizeAndOrigin();o.scissor(u.lowerLeftU,u.lowerLeftV,u.usize,u.vsize),o.viewport(u.lowerLeftU,u.lowerLeftV,u.usize,u.vsize)},e.getShaderReplacement=()=>t._supported?$5:null,e.releaseGraphicsResources=r=>{t.framebuffer&&(t.framebuffer.releaseGraphicsResources(r),t.framebuffer=null),t.translucentRGBATexture&&(t.translucentRGBATexture.releaseGraphicsResources(r),t.translucentRGBATexture=null),t.translucentRTexture&&(t.translucentRTexture.releaseGraphicsResources(r),t.translucentRTexture=null),t.translucentZTexture&&(t.translucentZTexture.releaseGraphicsResources(r),t.translucentZTexture=null),t.copyVAO&&(t.copyVAO.releaseGraphicsResources(r),t.copyVAO=null),t.copyShader&&(t.copyShader.releaseGraphicsResources(r),t.copyShader=null),t.tris&&(t.tris.releaseGraphicsResources(r),t.tris=null),e.modified()}},"vtkOpenGLOrderIndependentTranslucentPass"),$6={opaqueActorCount:0,translucentActorCount:0,volumeCount:0,overlayActorCount:0,framebuffer:null,depthRequested:!1},$9=jS.newInstance(function(e,t,r={}){Object.assign(t,$6,r),$w(e,t,r),jS.get(e,t,["framebuffer","opaqueActorCount","translucentActorCount","volumeCount"]),t.classHierarchy.push("vtkForwardPass"),e.traverse=(r,n=null)=>{if(t.deleted)return;t._currentParent=n,e.setCurrentOperation("buildPass"),r.traverse(e);let a=r.getRenderable().getNumberOfLayers(),i=r.getRenderable().getRenderersByReference();for(let n=0;n<a;n++)for(let a=0;a<i.length;a++){let o=i[a],s=r.getViewNodeFor(o);if(o.getDraw()&&o.getLayer()===n){if(t.opaqueActorCount=0,t.translucentActorCount=0,t.volumeCount=0,t.overlayActorCount=0,e.setCurrentOperation("queryPass"),s.traverse(e),(t.opaqueActorCount>0||t.translucentActorCount>0)&&t.volumeCount>0||t.depthRequested){let n=r.getFramebufferSize();null===t.framebuffer&&(t.framebuffer=$v()),t.framebuffer.setOpenGLRenderWindow(r),t.framebuffer.saveCurrentBindingsAndBuffers();let a=t.framebuffer.getSize();(null===a||a[0]!==n[0]||a[1]!==n[1])&&(t.framebuffer.create(n[0],n[1]),t.framebuffer.populateFramebuffer()),t.framebuffer.bind(),e.setCurrentOperation("zBufferPass"),s.traverse(e),t.framebuffer.restorePreviousBindingsAndBuffers(),t.depthRequested=!1}e.setCurrentOperation("cameraPass"),s.traverse(e),t.opaqueActorCount>0&&(e.setCurrentOperation("opaquePass"),s.traverse(e)),t.translucentActorCount>0&&(t.translucentPass||(t.translucentPass=$8()),t.translucentPass.traverse(r,s,e)),t.volumeCount>0&&(e.setCurrentOperation("volumePass"),s.traverse(e)),t.overlayActorCount>0&&(e.setCurrentOperation("overlayPass"),s.traverse(e))}}},e.getZBufferTexture=()=>t.framebuffer?t.framebuffer.getColorTexture():null,e.requestDepth=()=>{t.depthRequested=!0},e.incrementOpaqueActorCount=()=>t.opaqueActorCount++,e.incrementTranslucentActorCount=()=>t.translucentActorCount++,e.incrementVolumeCount=()=>t.volumeCount++,e.incrementOverlayActorCount=()=>t.overlayActorCount++},"vtkForwardPass");function $7(e){let t=$9();if(e>0){let r=$K();r.setDelegates([t]);let n=Math.max(0,e);r.setKernelDimension(3),r.setKernel([-n,-n,-n,-n,1+8*n,-n,-n,-n,-n]),t=r}return t}function Ke(e){let t=$9();if(e>0){let r=$K();r.setDelegates([t]);let n=Math.min(e,1e3),a=function(){let e=[],t=7,r=0;for(let n=0;n<15;n++)for(let a=0;a<15;a++){let i=a-t,o=n-t,s=Math.exp(-(i*i+o*o)/(2*Math.pow(5,2)));e.push(s),r+=s}return e.map(e=>e/r)}(),i=Math.floor(112.5),o=Array(225).fill(0);o[i]=1;let s=Math.min(n/10,1),l=a.map((e,t)=>(1-s)*o[t]+s*e);r.setKernelDimension(15),r.setKernel(l),t=r}return t}let Kt=F9.getLogger("RenderingEngine","StackViewport"),Kr=class extends GN{constructor(e){super(e),this.imageIds=[],this.imageKeyToIndexMap=new Map,this.currentImageIdIndex=0,this.targetImageIdIndex=0,this.imagesLoader=this,this.globalDefaultProperties={},this.perImageIdDefaultProperties=new Map,this.voiUpdatedWithSetProperties=!1,this.sharpening=0,this.smoothing=0,this.invert=!1,this.initialInvert=!1,this.initialTransferFunctionNodes=null,this.stackInvalidated=!1,this._publishCalibratedEvent=!1,this.updateRenderingPipeline=()=>{this._configureRenderingPipeline()},this.setSharpening=e=>{this.sharpening=e,this.render()},this.setSmoothing=e=>{this.smoothing=e,this.render()},this.getRenderPasses=()=>{if(!this.shouldUseCustomRenderPass())return null;let e=[];try{return this.smoothing>0&&e.push(Ke(this.smoothing)),this.sharpening>0&&e.push($7(this.sharpening)),e.length?e:null}catch(e){return console.warn("Failed to create custom render passes:",e),null}},this.resize=()=>{this.useCPURendering&&this._resizeCPU()},this._resizeCPU=()=>{this._cpuFallbackEnabledElement.viewport&&qN(this._cpuFallbackEnabledElement)},this.getFrameOfReferenceUID=e=>this.getImagePlaneReferenceData(e)?.FrameOfReferenceUID,this.getCornerstoneImage=()=>this.csImage,this.createActorMapper=e=>{let t=Hb.newInstance();t.setInputData(e);let r=HA();return r.setMapper(t),e.getPointData().getScalars().getNumberOfComponents()>1&&r.getProperty().setIndependentComponents(!1),r},this.getNumberOfSlices=()=>this.imageIds.length,this.getDefaultProperties=e=>{let t;return(void 0!==e&&(t=this.perImageIdDefaultProperties.get(e)),void 0!==t)?t:{...this.globalDefaultProperties}},this.getProperties=()=>{let{colormap:e,voiRange:t,VOILUTFunction:r,interpolationType:n,invert:a,voiUpdatedWithSetProperties:i}=this;return{colormap:e,voiRange:t,VOILUTFunction:r,interpolationType:n,invert:a,isComputedVOI:!i,sharpening:this.sharpening,smoothing:this.smoothing}},this.resetCameraForResize=()=>this.resetCamera({resetPan:!0,resetZoom:!0,resetToCenter:!0,resetAspectRatio:!0,suppressEvents:!0}),this.getRotationCPU=()=>{let{viewport:e}=this._cpuFallbackEnabledElement;return e.rotation},this.getRotationGPU=()=>{let{viewUp:e,viewPlaneNormal:t,flipVertical:r,flipHorizontal:n}=this.getCameraNoRotation(),a=qK(this.initialViewUp,n,r,t),i=180*Lv.vec3.angle(a,e)/Math.PI,o=Lv.vec3.cross(Lv.vec3.create(),a,e);return Lv.vec3.dot(o,t)>=0?i:(360-i)%360},this.setRotation=e=>{let t=this.getCamera();if(this.useCPURendering?this.setRotationCPU(e):this.setRotationGPU(e),this._suppressCameraModifiedEvents)return;let r={previousCamera:t,camera:this.getCamera(),element:this.element,viewportId:this.id,renderingEngineId:this.renderingEngineId};Bh(this.element,NH.CAMERA_MODIFIED,r)},this.renderImageObject=e=>{this._setCSImage(e),(this.useCPURendering?this._updateToDisplayImageCPU:this._updateActorToDisplayImageId).call(this,e)},this._setCSImage=e=>{e.isPreScaled=e.preScale?.scaled,this.csImage=e},this.canvasToWorldCPU=(e,t=[0,0,0])=>{if(!this._cpuFallbackEnabledElement.image)return;let[r,n]=qP(this._cpuFallbackEnabledElement,e),{origin:a,spacing:i,direction:o}=this.getImageData(),s=o.slice(0,3),l=o.slice(3,6);return Lv.vec3.scaleAndAdd(t,a,s,r*i[0]),Lv.vec3.scaleAndAdd(t,t,l,n*i[1]),t},this.worldToCanvasCPU=e=>{let{spacing:t,direction:r,origin:n}=this.getImageData(),a=r.slice(0,3),i=r.slice(3,6),o=Lv.vec3.subtract(Lv.vec3.create(),e,n),s=[Lv.vec3.dot(o,a)/t[0],Lv.vec3.dot(o,i)/t[1]];return qL(this._cpuFallbackEnabledElement,s)},this.canvasToWorldGPUContextPool=e=>{let t=this.getRenderer(),r=this.getVtkActiveCamera(),n=r.getClippingRange(),a=r.getDistance();r.setClippingRange(a,a+.1);let i=window.devicePixelRatio||1,{width:o,height:s}=this.canvas,l=[e[0]*i,e[1]*i],[u,d,c,h]=t.getViewport(),p=[u+l[0]/o*(c-u),d+(1-l[1]/s)*(h-d),0],m=t.normalizedDisplayToProjection(p[0],p[1],p[2]),f=t.projectionToView(m[0],m[1],m[2],o/s),g=t.viewToWorld(f[0],f[1],f[2]);return r.setClippingRange(n[0],n[1]),[g[0],g[1],g[2]]},this.canvasToWorldGPUTiled=e=>{let t=this.getRenderer(),r=this.getVtkActiveCamera(),n=r.getClippingRange(),a=r.getDistance();r.setClippingRange(a,a+.1);let i=this.getRenderingEngine().offscreenMultiRenderWindow.getOpenGLRenderWindow(),o=i.getSize(),s=window.devicePixelRatio||1,l=[e[0]*s,e[1]*s],u=[l[0]+this.sx,l[1]+this.sy];u[1]=o[1]-u[1];let d=i.displayToWorld(u[0],u[1],0,t);return r.setClippingRange(n[0],n[1]),[d[0],d[1],d[2]]},this.worldToCanvasGPUContextPool=e=>{let t=this.getRenderer(),r=this.getVtkActiveCamera(),n=r.getClippingRange(),a=r.getDistance();r.setClippingRange(a,a+.1);let i=window.devicePixelRatio||1,{width:o,height:s}=this.canvas,l=t.worldToView(e[0],e[1],e[2]),u=t.viewToProjection(l[0],l[1],l[2],o/s),d=t.projectionToNormalizedDisplay(u[0],u[1],u[2]),[c,h,p,m]=t.getViewport(),f=(d[0]-c)/(p-c)*o,g=(1-(d[1]-h)/(m-h))*s;return r.setClippingRange(n[0],n[1]),[f/i,g/i]},this.worldToCanvasGPUTiled=e=>{let t=this.getRenderer(),r=this.getVtkActiveCamera(),n=r.getClippingRange(),a=r.getDistance();r.setClippingRange(a,a+.1);let i=this.getRenderingEngine().offscreenMultiRenderWindow.getOpenGLRenderWindow(),o=i.getSize(),s=i.worldToDisplay(...e,t);s[1]=o[1]-s[1];let l=[s[0]-this.sx,s[1]-this.sy];r.setClippingRange(n[0],n[1]);let u=window.devicePixelRatio||1;return[l[0]/u,l[1]/u]},this.getCurrentImageIdIndex=()=>this.currentImageIdIndex,this.getSliceIndex=()=>this.currentImageIdIndex,this.getTargetImageIdIndex=()=>this.targetImageIdIndex,this.getImageIds=()=>this.imageIds,this.getCurrentImageId=(e=this.getCurrentImageIdIndex())=>this.imageIds[e],this.hasImageId=e=>this.imageKeyToIndexMap.has(e),this.hasImageURI=e=>this.imageKeyToIndexMap.has(e),this.customRenderViewportToCanvas=()=>{if(!this.useCPURendering)throw Error("Custom cpu rendering pipeline should only be hit in CPU rendering mode");return this._cpuFallbackEnabledElement.image?(qr(this._cpuFallbackEnabledElement,this.cpuRenderingInvalidated),this.cpuRenderingInvalidated=!1):this.fillWithBackgroundColor(),{canvas:this.canvas,element:this.element,viewportId:this.id,renderingEngineId:this.renderingEngineId,viewportStatus:this.viewportStatus}},this.renderingPipelineFunctions={getImageData:{cpu:this.getImageDataCPU,gpu:this.getImageDataGPU},setColormap:{cpu:this.setColormapCPU,gpu:this.setColormapGPU},getCamera:{cpu:this.getCameraCPU,gpu:super.getCamera},setCamera:{cpu:this.setCameraCPU,gpu:super.setCamera},getPan:{cpu:this.getPanCPU,gpu:super.getPan},setPan:{cpu:this.setPanCPU,gpu:super.setPan},getZoom:{cpu:this.getZoomCPU,gpu:super.getZoom},setZoom:{cpu:this.setZoomCPU,gpu:super.setZoom},getAspectRatio:{cpu:this.getAspectRatioCPU,gpu:super.getAspectRatio},setAspectRatio:{cpu:this.setAspectRatioCPU,gpu:super.setAspectRatio},setVOI:{cpu:this.setVOICPU,gpu:this.setVOIGPU},getRotation:{cpu:this.getRotationCPU,gpu:this.getRotationGPU},setInterpolationType:{cpu:this.setInterpolationTypeCPU,gpu:this.setInterpolationTypeGPU},setInvertColor:{cpu:this.setInvertColorCPU,gpu:this.setInvertColorGPU},resetCamera:{cpu:(e={})=>{let{resetPan:t=!0,resetZoom:r=!0}=e;return this.resetCameraCPU({resetPan:t,resetZoom:r}),!0},gpu:(e={})=>{let{resetPan:t=!0,resetZoom:r=!0,resetAspectRatio:n=!0}=e;return this.resetCameraGPU({resetPan:t,resetZoom:r,resetAspectRatio:n}),!0}},canvasToWorld:{cpu:this.canvasToWorldCPU,gpu:{tiled:this.canvasToWorldGPUTiled,contextPool:this.canvasToWorldGPUContextPool}},worldToCanvas:{cpu:this.worldToCanvasCPU,gpu:{tiled:this.worldToCanvasGPUTiled,contextPool:this.worldToCanvasGPUContextPool}},getRenderer:{cpu:()=>this.getCPUFallbackError("getRenderer"),gpu:{tiled:this.getRendererTiled,contextPool:this.getRendererContextPool}},getDefaultActor:{cpu:()=>this.getCPUFallbackError("getDefaultActor"),gpu:super.getDefaultActor},getActors:{cpu:()=>this.getCPUFallbackError("getActors"),gpu:super.getActors},getActor:{cpu:()=>this.getCPUFallbackError("getActor"),gpu:super.getActor},setActors:{cpu:()=>this.getCPUFallbackError("setActors"),gpu:super.setActors},addActors:{cpu:()=>this.getCPUFallbackError("addActors"),gpu:super.addActors},addActor:{cpu:()=>this.getCPUFallbackError("addActor"),gpu:super.addActor},removeAllActors:{cpu:()=>this.getCPUFallbackError("removeAllActors"),gpu:super.removeAllActors},unsetColormap:{cpu:this.unsetColormapCPU,gpu:this.unsetColormapGPU}},this.scaling={},this.modality=null,this.useCPURendering=BI(),this._configureRenderingPipeline(),this.useCPURendering?this._resetCPUFallbackElement():this._resetGPUViewport(),this.currentImageIdIndex=0,this.targetImageIdIndex=0,this.resetCamera(),this.initializeElementDisabledHandler()}setUseCPURendering(e){this.useCPURendering=e,this._configureRenderingPipeline(e)}static get useCustomRenderingPipeline(){return BI()}_configureRenderingPipeline(e){let t=qY();for(let r in this.useCPURendering=e??BI(),this.renderingPipelineFunctions)if(Object.prototype.hasOwnProperty.call(this.renderingPipelineFunctions,r)){let e=this.renderingPipelineFunctions[r];this.useCPURendering?this[r]=e.cpu:"object"==typeof e.gpu&&e.gpu.tiled&&e.gpu.contextPool?this[r]=t?e.gpu.contextPool:e.gpu.tiled:this[r]=e.gpu}this.useCPURendering?this._resetCPUFallbackElement():this._resetGPUViewport()}_resetCPUFallbackElement(){this._cpuFallbackEnabledElement={canvas:this.canvas,renderingTools:{},transform:new GB,viewport:{rotation:0,aspectRatio:[1,1]}}}_resetGPUViewport(){let e=this.getRenderer(),t=zP();e.setActiveCamera(t);this.initialViewUp=[0,-1,0],t.setDirectionOfProjection(-0,-0,1),t.setViewUp(...this.initialViewUp),t.setParallelProjection(!0),t.setThicknessFromFocalPoint(.1),t.setFreezeFocalPoint(!0)}shouldUseCustomRenderPass(){return!this.useCPURendering}initializeElementDisabledHandler(){Bc.addEventListener(NH.ELEMENT_DISABLED,function e(){clearTimeout(this.debouncedTimeout),Bc.removeEventListener(NH.ELEMENT_DISABLED,e)})}getImageDataGPU(){let e=this.getDefaultActor();if(!e||!H2(e))return;let{actor:t}=e,r=t.getMapper().getInputData(),n=this.csImage;return{dimensions:r.getDimensions(),spacing:r.getSpacing(),origin:r.getOrigin(),direction:r.getDirection(),get scalarData(){return n?.voxelManager.getScalarData()},imageData:t.getMapper().getInputData(),metadata:{Modality:this.modality,FrameOfReferenceUID:this.getFrameOfReferenceUID()},scaling:this.scaling,hasPixelSpacing:this.hasPixelSpacing,calibration:{...n?.calibration,...this.calibration},preScale:{...n?.preScale},voxelManager:n?.voxelManager}}getImageDataCPU(){let{metadata:e}=this._cpuFallbackEnabledElement;if(!e)return;let t=e.spacing,r=this.csImage;return{dimensions:e.dimensions,spacing:t,origin:e.origin,direction:e.direction,metadata:{Modality:this.modality,FrameOfReferenceUID:this.getFrameOfReferenceUID()},scaling:this.scaling,imageData:{getDirection:()=>e.direction,getDimensions:()=>e.dimensions,getScalarData:()=>this.cpuImagePixelData,getSpacing:()=>t,worldToIndex:e=>{let t=this.worldToCanvasCPU(e),r=qP(this._cpuFallbackEnabledElement,t);return[r[0],r[1],0]},indexToWorld:(e,t)=>{let r=qL(this._cpuFallbackEnabledElement,[e[0],e[1]]);return this.canvasToWorldCPU(r,t)}},scalarData:this.cpuImagePixelData,hasPixelSpacing:this.hasPixelSpacing,calibration:{...r?.calibration,...this.calibration},preScale:{...r?.preScale},voxelManager:r?.voxelManager}}calibrateIfNecessary(e,t){let r=HB("calibratedPixelSpacing",e),n=this.calibration!==r,a=r?.scale;return this.hasPixelSpacing=a>0||!t.usingDefaultValues&&t.rowPixelSpacing>0,t.calibration=r,n&&(this.calibration=r,this._publishCalibratedEvent=!0,this._calibrationEvent={scale:a,calibration:r}),t}setDefaultProperties(e,t){null==t?this.globalDefaultProperties=e:(this.perImageIdDefaultProperties.set(t,e),this.getCurrentImageId()===t&&this.setProperties(e))}clearDefaultProperties(e){null==e?(this.globalDefaultProperties={},this.resetProperties()):(this.perImageIdDefaultProperties.delete(e),this.resetToDefaultProperties())}setProperties({colormap:e,voiRange:t,VOILUTFunction:r,invert:n,interpolationType:a,sharpening:i,smoothing:o}={},s=!1){this.viewportStatus=this.csImage?Fw.PRE_RENDER:Fw.LOADING,this.globalDefaultProperties={colormap:this.globalDefaultProperties.colormap??e,voiRange:this.globalDefaultProperties.voiRange??t,VOILUTFunction:this.globalDefaultProperties.VOILUTFunction??r,invert:this.globalDefaultProperties.invert??n,interpolationType:this.globalDefaultProperties.interpolationType??a,sharpening:this.globalDefaultProperties.sharpening??i,smoothing:this.globalDefaultProperties.smoothing??o},void 0!==e&&this.setColormap(e),void 0!==t&&this.setVOI(t,{suppressEvents:s,voiUpdatedWithSetProperties:!0}),void 0!==r&&this.setVOILUTFunction(r,s),void 0!==n&&this.setInvertColor(n),void 0!==a&&this.setInterpolationType(a),void 0!==i&&this.setSharpening(i),void 0!==o&&this.setSmoothing(o)}resetProperties(){this.cpuRenderingInvalidated=!0,this.voiUpdatedWithSetProperties=!1,this.viewportStatus=Fw.PRE_RENDER,this.fillWithBackgroundColor(),this.useCPURendering&&(this._cpuFallbackEnabledElement.renderingTools={}),this._resetProperties(),this.render()}_resetProperties(){let e;if(e=this._isCurrentImagePTPrescaled()?this._getDefaultPTPrescaledVOIRange():this._getVOIRangeForCurrentImage(),this.setVOI(e),this.setInvertColor(this.initialInvert),this.setInterpolationType(NK.LINEAR),!this.useCPURendering){let e=this.getTransferFunction();Gp(e,this.initialTransferFunctionNodes);let t=Go(Gh(e).reduce((e,t)=>(e.push(t[0],t[1],t[2],t[3]),e),[]),this.getDefaultActor().actor);this.setColormap(t)}}resetToDefaultProperties(){let e;this.cpuRenderingInvalidated=!0,this.viewportStatus=Fw.PRE_RENDER,this.fillWithBackgroundColor(),this.useCPURendering&&(this._cpuFallbackEnabledElement.renderingTools={});let t=this.getCurrentImageId(),r=this.perImageIdDefaultProperties.get(t)||this.globalDefaultProperties;r.colormap?.name&&this.setColormap(r.colormap),e=void 0==r.voiRange?this._getVOIRangeForCurrentImage():r.voiRange,this.setVOI(e),this.setInterpolationType(NK.LINEAR),this.setInvertColor(!1),this.render()}_getVOIFromCache(){return this.voiUpdatedWithSetProperties?this.voiRange:this._isCurrentImagePTPrescaled()?this._getDefaultPTPrescaledVOIRange():this._getVOIRangeForCurrentImage()??this.voiRange}_setPropertiesFromCache(){let e=this._getVOIFromCache(),{colormap:t,VOILUTFunction:r,interpolationType:n,invert:a,sharpening:i,smoothing:o}=this.getProperties();void 0!==r&&this.setVOILUTFunction(r,!0),this.setVOI(e),void 0!==t&&(this.setColormap(t),this.invert=!1),this.setInterpolationType(n),this.setInvertColor(a),void 0!==i&&this.setSharpening(i),void 0!==o&&this.setSmoothing(o)}getCameraCPU(){let{metadata:e,viewport:t}=this._cpuFallbackEnabledElement;if(!e)return{};let{direction:r}=e,n=r.slice(6,9).map(e=>-e),a=r.slice(3,6).map(e=>-e);if(t.rotation){let e=Lv.mat4.fromRotation(Lv.mat4.create(),t.rotation*Math.PI/180,n);a=Lv.vec3.transformMat4(Lv.vec3.create(),a,e)}let i=[this.element.clientWidth/2,this.element.clientHeight/2],o=this.canvasToWorld(i),s=this.canvasToWorld([0,0]),l=this.canvasToWorld([0,this.element.clientHeight]);return{parallelProjection:!0,focalPoint:o,position:[0,0,0],parallelScale:Lv.vec3.distance(s,l)/2,scale:t.scale,viewPlaneNormal:[n[0],n[1],n[2]],aspectRatio:t.aspectRatio??[1,1],viewUp:[a[0],a[1],a[2]],flipHorizontal:this.flipHorizontal,flipVertical:this.flipVertical}}setAspectRatioForViewport(e,t=!0){let{viewport:r,image:n}=this._cpuFallbackEnabledElement;if(!t){r.aspectRatio=e;return}let{clientWidth:a,clientHeight:i}=this.element,{rowPixelSpacing:o,columnPixelSpacing:s,width:l,height:u}=n,d=(([e,t])=>e/t)(r.aspectRatio||[1,1]),c=(([e,t])=>e/t)(e),h=a/i,p=i*o*.5,m=e=>{let t=l*s*e,r=u*o;if(t/r>h)return p/(a/t);let n=.5*r;return e<1?n/e:n},f=m(c)/m(d);r.aspectRatio=e,r.parallelScale&&(r.parallelScale*=f,r.scale=p/r.parallelScale)}setCameraCPU(e){let{viewport:t,image:r}=this._cpuFallbackEnabledElement,n=this.getCameraCPU(),{focalPoint:a,parallelScale:i,scale:o,flipHorizontal:s,flipVertical:l,aspectRatio:u,isFitViewportAfterStretch:d}=e,{clientHeight:c}=this.element;if(a){let e=this.worldToCanvasCPU(a),r=qP(this._cpuFallbackEnabledElement,e),i=this.worldToCanvasCPU(n.focalPoint),o=qP(this._cpuFallbackEnabledElement,i),s=Lv.vec2.create();Lv.vec2.subtract(s,Lv.vec2.fromValues(r[0],r[1]),Lv.vec2.fromValues(o[0],o[1]));let l=qH({x:s[0],y:s[1]},t);t.translation.x-=l.x,t.translation.y-=l.y}if(i){let{rowPixelSpacing:e}=r;t.scale=c*e*.5/i,t.parallelScale=i}if(o){let{rowPixelSpacing:e}=r;t.scale=o,t.parallelScale=c*e*.5/o}u&&this.setAspectRatioForViewport(u,d),(void 0!==s||void 0!==l)&&this.setFlipCPU({flipHorizontal:s,flipVertical:l}),this._cpuFallbackEnabledElement.transform=Gj(this._cpuFallbackEnabledElement);let h={previousCamera:n,camera:this.getCamera(),element:this.element,viewportId:this.id,renderingEngineId:this.renderingEngineId};Bh(this.element,NH.CAMERA_MODIFIED,h)}getPanCPU(){let{viewport:e}=this._cpuFallbackEnabledElement;return[e.translation?.x??0,e.translation?.y??0]}setPanCPU(e){let t=this.getCameraCPU();this.setCameraCPU({...t,focalPoint:[...e.map(e=>-e),0]})}getZoomCPU(){let{viewport:e}=this._cpuFallbackEnabledElement;return e.scale}setZoomCPU(e){let t=this.getCameraCPU();this.setCameraCPU({...t,scale:e})}getAspectRatioCPU(){let{aspectRatio:e}=this.getCameraCPU();return e??this.options?.aspectRatio??[1,1]}setAspectRatioCPU(e,t=!0,r=!1){let n=this.getCameraCPU();r&&(this.options.aspectRatio=e),this.setCameraCPU({...n,aspectRatio:e,isFitViewportAfterStretch:t})}setFlipCPU({flipHorizontal:e,flipVertical:t}){let{viewport:r}=this._cpuFallbackEnabledElement;void 0!==e&&(r.hflip=e,this.flipHorizontal=r.hflip),void 0!==t&&(r.vflip=t,this.flipVertical=r.vflip)}setVOILUTFunction(e,t){if(this.useCPURendering)throw Error("VOI LUT function is not supported in CPU rendering");let r=this._getValidVOILUTFunction(e),n=!1;this.VOILUTFunction!==r&&(n=!0),this.VOILUTFunction=r;let{voiRange:a}=this.getProperties();this.setVOI(a,{suppressEvents:t,forceRecreateLUTFunction:n})}setRotationCPU(e){let{viewport:t}=this._cpuFallbackEnabledElement;t.rotation=e}setRotationGPU(e){let t=this.getPan(this.fitToCanvasCamera),r=this.getPan(),n=Lv.vec2.sub([0,0],t,r);this.setPan(n,!1);let{flipVertical:a,flipHorizontal:i,viewPlaneNormal:o}=this.getCamera(),s=qK(this.initialViewUp,i,a,o);this.setCameraNoEvent({viewUp:s}),this.getVtkActiveCamera().roll(-e);let l=this.getPan(),u=this.getPan(this.fitToCanvasCamera),d=Lv.vec2.sub([0,0],l,u),c=Lv.vec2.add([0,0],t,d);this.setPan(c,!1)}setInterpolationTypeGPU(e){let t=this.getDefaultActor();if(!t||!H2(t))return;let{actor:r}=t;r.getProperty().setInterpolationType(e),this.interpolationType=e}setInterpolationTypeCPU(e){let{viewport:t}=this._cpuFallbackEnabledElement;t.pixelReplication=e!==NK.LINEAR,this.interpolationType=e}setInvertColorCPU(e){let{viewport:t}=this._cpuFallbackEnabledElement;t&&(t.invert=e,this.invert=e)}setInvertColorGPU(e){let t=this.getDefaultActor();if(t&&H2(t)){if(H5(t,"vtkVolume")){let r=t.actor.getProperty().getRGBTransferFunction(0);(!this.invert&&e||this.invert&&!e)&&Gb(r),this.invert=e}else if(H5(t,"vtkImageSlice")){let r=t.actor.getProperty().getRGBTransferFunction(0);(!this.invert&&e||this.invert&&!e)&&Gb(r),this.invert=e}}}setVOICPU(e,t={}){let{suppressEvents:r=!1}=t,{viewport:n,image:a}=this._cpuFallbackEnabledElement;if(!n||!a)return;if(void 0===e){let{windowWidth:t,windowCenter:r}=a,i=Array.isArray(t)?t[0]:t,o=Array.isArray(r)?r[0]:r;n.voi={windowWidth:i,windowCenter:o,voiLUTFunction:a.voiLUTFunction};let{lower:s,upper:l}=GM(i,o,a.voiLUTFunction);e={lower:s,upper:l}}else{let{lower:t,upper:r}=e,{windowCenter:i,windowWidth:o}=Gm(t,r);n.voi||(n.voi={windowWidth:0,windowCenter:0,voiLUTFunction:a.voiLUTFunction}),n.voi.windowWidth=o,n.voi.windowCenter=i}this.voiRange=e;let i={viewportId:this.id,range:e};r||Bh(this.element,NH.VOI_MODIFIED,i)}getTransferFunction(){let e=this.getDefaultActor();if(e&&H2(e))return e.actor.getProperty().getRGBTransferFunction(0)}setVOIGPU(e,t={}){let{suppressEvents:r=!1,forceRecreateLUTFunction:n=!1,voiUpdatedWithSetProperties:a=!1}=t;if(e&&this.voiRange&&this.voiRange.lower===e.lower&&this.voiRange.upper===e.upper&&!n&&!this.stackInvalidated)return;let i=this.getDefaultActor();if(!i||!H2(i))return;let o=i.actor,s=e;if(void 0===s){let e=o.getMapper().getInputData().getPointData().getScalars().getRange();s={lower:e[0],upper:e[1]}}o.getProperty().setUseLookupTableScalarRange(!0);let l=o.getProperty().getRGBTransferFunction(0),u=this.VOILUTFunction===N2.SAMPLED_SIGMOID;if((u||!l||n)&&(l=(u?Gy:Gg)(s),this.invert&&Gb(l),o.getProperty().setRGBTransferFunction(0,l),this.initialTransferFunctionNodes=Gh(l)),u||l.setRange(s.lower,s.upper),this.voiRange=s,this.voiUpdatedWithSetProperties||(this.voiUpdatedWithSetProperties=a),r)return;let d={viewportId:this.id,range:s,VOILUTFunction:this.VOILUTFunction};Bh(this.element,NH.VOI_MODIFIED,d)}_addScalingToViewport(e){if(this.scaling.PT)return;let{suvbw:t,suvlbm:r,suvbsa:n}=e,a={};r&&(a.suvbwToSuvlbm=r/t),n&&(a.suvbwToSuvbsa=n/t),this.scaling.PT=a}getImageDataMetadata(e){let t=e.imageId,{numberOfComponents:r,origin:n,direction:a,dimensions:i,spacing:o,numVoxels:s,imagePixelModule:l,voiLUTFunction:u,modality:d,scalingFactor:c,calibration:h}=HH(e);"PT"===d&&c&&this._addScalingToViewport(c),this.modality=d;let p=this._getValidVOILUTFunction(u);this.VOILUTFunction=p,this.calibration=h;let m=this._getImagePlaneModule(t);return this.useCPURendering||(m=this.calibrateIfNecessary(t,m)),{bitsAllocated:l.bitsAllocated,numberOfComponents:r,origin:n,direction:a,dimensions:i,spacing:o,numVoxels:s,imagePlaneModule:m,imagePixelModule:l}}matchImagesForOverlay(e,t){return(e=>{let r=HB(FC.IMAGE_PLANE,t),n=HB(FC.IMAGE_PLANE,e),a=r.imageOrientationPatient,i=n.imageOrientationPatient;if(a&&i){if(Vw(r.imageOrientationPatient,n.imageOrientationPatient)){let t=r.imagePositionPatient,a=n.imagePositionPatient;if(t&&a&&Vw(t,a)){let t=r.rows,a=r.columns,i=n.rows,o=n.columns;if(t===i&&a===o)return e}}}else{let t=r.rows,a=r.columns,i=n.rows,o=n.columns;if(t===i&&a===o)return e}})(e)}getImagePlaneReferenceData(e=this.getCurrentImageIdIndex()){let t=this.imageIds[e];if(!t)return;let r=HB(FC.IMAGE_PLANE,t);if(!r)return;let{imagePositionPatient:n,frameOfReferenceUID:a}=r,{rowCosines:i,columnCosines:o}=r;return i||=[1,0,0],o||=[0,1,0],{FrameOfReferenceUID:a,viewPlaneNormal:Lv.vec3.cross([0,0,0],o,i),cameraFocalPoint:n,referencedImageId:t,sliceIndex:e}}_getCameraOrientation(e){let t=e.slice(6,9).map(e=>-e),r=e.slice(3,6).map(e=>-e);return{viewPlaneNormal:[t[0],t[1],t[2]],viewUp:[r[0],r[1],r[2]]}}createVTKImageData({origin:e,direction:t,dimensions:r,spacing:n,numberOfComponents:a,pixelArray:i}){return qn({origin:e,direction:t,dimensions:r,spacing:n,numberOfComponents:a,pixelArray:new i.constructor(i.length)})}_createVTKImageData({origin:e,direction:t,dimensions:r,spacing:n,numberOfComponents:a,pixelArray:i}){try{this._imageData=this.createVTKImageData({origin:e,direction:t,dimensions:r,spacing:n,numberOfComponents:a,pixelArray:i})}catch(e){Kt.error(e)}}async setStack(e,t=0){if(this._throwIfDestroyed(),this.clearDisplaySets(),this.imageIds=e,t>e.length)throw Error("Current image index is greater than the number of images in the stack");this.imageKeyToIndexMap.clear(),e.forEach((e,t)=>{this.imageKeyToIndexMap.set(e,t),this.imageKeyToIndexMap.set(Gk(e),t)}),this.currentImageIdIndex=t,this.targetImageIdIndex=t;let r=HB(GC.IMAGE_RETRIEVE_CONFIGURATION,e[t],"stack");this.imagesLoader=r?(r.create||qz)(r):this,this.stackInvalidated=!0,this.flipVertical=!1,this.flipHorizontal=!1,this.voiRange=null,this.interpolationType=NK.LINEAR,this.invert=!1,this.viewportStatus=Fw.LOADING,this.fillWithBackgroundColor(),this.useCPURendering&&(this._cpuFallbackEnabledElement.renderingTools={},delete this._cpuFallbackEnabledElement.viewport.colormap);let n=await this._setImageIdIndex(t),a={imageIds:e,viewportId:this.id,element:this.element,currentImageIdIndex:t};return Bh(this.element,NH.VIEWPORT_NEW_IMAGE_SET,a),n}async setDisplaySets(...e){await this.mountDisplaySets(e,async e=>{let t=HY(e.displaySetId);if(!t?.imageIds?.length)throw Error(`[StackViewport] No registered imageIds for display set ${e.displaySetId}`);let r="number"==typeof t.initialImageIdIndex?t.initialImageIdIndex:0;await this.setStack(t.imageIds,r)})}_throwIfDestroyed(){if(this.isDisabled)throw Error("The stack viewport has been destroyed and is no longer usable. Renderings will not be performed. If you are using the same viewportId and have re-enabled the viewport, you need to grab the new viewport instance using renderingEngine.getViewport(viewportId), instead of using your lexical scoped reference to the viewport instance.")}_checkVTKImageDataMatchesCornerstoneImage(e,t){if(!t)return!1;let[r,n]=t.getSpacing(),[a,i]=t.getDimensions(),o=this._getImagePlaneModule(e.imageId),s=t.getDirection(),l=s.slice(0,3),u=s.slice(3,6),d=t.getPointData().getScalars().getDataType(),c=Vw(r,e.columnPixelSpacing),h=Vw(n,e.rowPixelSpacing),p=c||null===e.columnPixelSpacing&&1===r,m=h||null===e.rowPixelSpacing&&1===n,f=a===e.columns,g=i===e.rows,y=Vw(o.rowCosines,l),v=Vw(o.columnCosines,u),b=d===e.voxelManager.getScalarData().constructor.name;return p&&m&&f&&g&&y&&v&&b}_updateVTKImageDataFromCornerstoneImage(e){let t=this._getImagePlaneModule(e.imageId).imagePositionPatient;null==t&&(t=[0,0,0]),this._imageData.setOrigin(t);let r=this.getActor(this.id);r&&(r.referencedId=e.imageId),Gv(this._imageData,e)}_loadAndDisplayImage(e,t){return this.useCPURendering?this._loadAndDisplayImageCPU(e,t):this._loadAndDisplayImageGPU(e,t)}_loadAndDisplayImageCPU(e,t){return new Promise((r,n)=>{function a(e,t,n){if(this.currentImageIdIndex!==t)return;let a=e.voxelManager.getScalarData(),i=e.preScale,o=i?.scalingParameters,s=i?.scaled&&o?.rescaleIntercept%1!=0||o?.rescaleSlope%1!=0;if(a instanceof Float32Array&&s){let t={min:e.minPixelValue,max:e.maxPixelValue},r=Math.abs(t.max-t.min)/65535,n=t.min,i=a.length,o=new Uint16Array(i),s=65535,l=0;for(let e=0;e<i;e++){let t=Math.max(0,Math.min(65535,Math.floor((a[e]-n)/r)));o[e]=t,s=Math.min(s,t),l=Math.max(l,t)}e.minPixelValue=s,e.maxPixelValue=l,e.slope=r,e.intercept=n,e.voxelManager?e.voxelManager.getScalarData=()=>o:e.getPixelData=()=>o,e.preScale={...e.preScale,scaled:!1}}this._setCSImage(e),this.viewportStatus=Fw.PRE_RENDER;let l={image:e,imageId:n,imageIdIndex:t,viewportId:this.id,renderingEngineId:this.renderingEngineId};Bh(this.element,NH.STACK_NEW_IMAGE,l),this._updateToDisplayImageCPU(e),this.render(),this.currentImageIdIndex=t,r(n)}function i(e,t,r){this.suppressEvents||Bh(Bc,NH.IMAGE_LOAD_ERROR,{error:e,imageIdIndex:t,imageId:r}),n(e)}let o=NG.Interaction,s={imageId:e,imageIdIndex:t,viewportId:this.id,renderingEngineId:this.renderingEngineId};Bh(this.element,NH.PRE_STACK_NEW_IMAGE,s),qM.addRequest((function(e,t,r){return qI(e,r).then(r=>{a.call(this,r,t,e)},r=>{i.call(this,r,t,e)})}).bind(this,e,t,{useRGBA:!0,requestType:o}),o,{imageId:e,imageIdIndex:t},-5)})}successCallback(e,t){let r=this.imageIds.indexOf(e);if(this.currentImageIdIndex!==r)return;let n=this.csImage?.imageFrame,a=t?.imageFrame;(n?.photometricInterpretation||this.csImage?.photometricInterpretation)!==(a?.photometricInterpretation||t?.photometricInterpretation)&&(this.stackInvalidated=!0),this._setCSImage(t);let i={image:t,imageId:e,imageIdIndex:r,viewportId:this.id,renderingEngineId:this.renderingEngineId};this._updateActorToDisplayImageId(t),Bh(this.element,NH.STACK_NEW_IMAGE,i),this.render(),this.currentImageIdIndex=r}errorCallback(e,t,r){if(!t)return;let n=this.imageIds.indexOf(e);Bh(Bc,NH.IMAGE_LOAD_ERROR,{error:r,imageIdIndex:n,imageId:e})}getLoaderImageOptions(e){let t=this.imageIds.indexOf(e),{transferSyntaxUID:r}=HB(FC.TRANSFER_SYNTAX,e)||{};return{useRGBA:!1,transferSyntaxUID:r,priority:5,requestType:NG.Interaction,additionalDetails:{imageId:e,imageIdIndex:t}}}async loadImages(e,t){let r=await Promise.allSettled(e.map(e=>{let r=this.getLoaderImageOptions(e);return qI(e,r).then(r=>(t.successCallback(e,r),e),r=>(t.errorCallback(e,!0,r),e))})),n=r.filter(e=>"rejected"===e.status);if(n&&n.length){let e=new CustomEvent(NH.IMAGE_LOAD_ERROR,{detail:n,cancelable:!0});Bc.dispatchEvent(e)}return r}_loadAndDisplayImageGPU(e,t){if(!e)return void console.warn("No image id set yet to load");let r={imageId:e,imageIdIndex:t,viewportId:this.id,renderingEngineId:this.renderingEngineId};return Bh(this.element,NH.PRE_STACK_NEW_IMAGE,r),this.imagesLoader.loadImages([e],this).then(()=>e)}_updateToDisplayImageCPU(e){let t=this.getImageDataMetadata(e),r=qR(this.canvas,e,this.modality,this._cpuFallbackEnabledElement.viewport.colormap),{windowCenter:n,windowWidth:a,voiLUTFunction:i}=r.voi;this.voiRange=GM(a,n,i),this._cpuFallbackEnabledElement.image=e,this._cpuFallbackEnabledElement.metadata={...t},this.cpuImagePixelData=e.voxelManager.getScalarData();let o=Object.assign({},r,this._cpuFallbackEnabledElement.viewport);this._cpuFallbackEnabledElement.viewport=this.stackInvalidated?r:o,this.stackInvalidated=!1,this.cpuRenderingInvalidated=!0,this._cpuFallbackEnabledElement.transform=Gj(this._cpuFallbackEnabledElement)}getSliceViewInfo(){throw Error("Method not implemented.")}addImages(e){let t=[];e.forEach(e=>{let{imageId:r,...n}=e,a=ql.getImage(r),{origin:i,dimensions:o,direction:s,spacing:l,numberOfComponents:u}=this.getImageDataMetadata(a),d=this.createVTKImageData({origin:i,dimensions:o,direction:s,spacing:l,numberOfComponents:u,pixelArray:a.voxelManager.getScalarData()}),c=this.createActorMapper(d);c&&(t.push({uid:e.actorUID??F2(),actor:c,referencedId:r,...n}),e.callback&&e.callback({imageActor:c,imageId:e.imageId}))}),this.addActors(t)}_updateActorToDisplayImageId(e){let t=this._checkVTKImageDataMatchesCornerstoneImage(e,this._imageData),r=this.stackInvalidated,n=this.getViewPresentation();if(t&&!r){this._updateVTKImageDataFromCornerstoneImage(e),this.resetCameraNoEvent(),this.setViewPresentation(n),this._setPropertiesFromCache(),this.stackActorReInitialized=!1;return}let{origin:a,direction:i,dimensions:o,spacing:s,numberOfComponents:l,imagePixelModule:u}=this.getImageDataMetadata(e),d=e.voxelManager.getScalarData();this._createVTKImageData({origin:a,direction:i,dimensions:o,spacing:s,numberOfComponents:l,pixelArray:d}),this._updateVTKImageDataFromCornerstoneImage(e);let c=this.createActorMapper(this._imageData),h=this.getActors();h.length&&h[0].uid===this.id?h[0].actor=c:h.unshift({uid:this.id,actor:c,referencedId:e.imageId}),this.setActors(h);let{viewPlaneNormal:p,viewUp:m}=this._getCameraOrientation(i),f=this.getCamera();if(this.setCameraNoEvent({viewUp:m,viewPlaneNormal:p}),this.initialViewUp=m,this.resetCameraNoEvent(),this.setViewPresentation(n),this.triggerCameraEvent(this.getCamera(),f),r){let t="MONOCHROME1"===u.photometricInterpretation;this.stackInvalidated=!0;let r=this._getInitialVOIRange(e);this.setVOI(r,{forceRecreateLUTFunction:!!t}),this.initialInvert=!!t,this.setInvertColor(this.invert||this.initialInvert)}else this.stackInvalidated=!0,this._setPropertiesFromCache();this.stackInvalidated=!1,this.stackActorReInitialized=!0,this._publishCalibratedEvent&&this.triggerCalibrationEvent()}_getInitialVOIRange(e){if(this.voiRange&&this.voiUpdatedWithSetProperties)return this.voiRange;let{windowCenter:t,windowWidth:r,voiLUTFunction:n}=e,a=GM(r,t,n);return this._getPTPreScaledRange()||a}_getPTPreScaledRange(){if(this._isCurrentImagePTPrescaled())return this._getDefaultPTPrescaledVOIRange()}_isCurrentImagePTPrescaled(){return"PT"===this.modality&&!!this.csImage.isPreScaled&&!!this.csImage.preScale?.scalingParameters.suvbw}_getDefaultPTPrescaledVOIRange(){return{lower:0,upper:5}}async _setImageIdIndex(e){if(e>=this.imageIds.length)throw Error(`ImageIdIndex provided ${e} is invalid, the stack only has ${this.imageIds.length} elements`);this.currentImageIdIndex=e,this.hasPixelSpacing=!0,this.viewportStatus=Fw.PRE_RENDER;let t=await this._loadAndDisplayImage(this.imageIds[e],e);if(this.perImageIdDefaultProperties.size>=1){let e=this.perImageIdDefaultProperties.get(t);void 0!==e?this.setProperties(e):void 0!==this.globalDefaultProperties&&this.setProperties(this.globalDefaultProperties)}return t}resetCameraCPU({resetPan:e=!0,resetZoom:t=!0}){let{image:r}=this._cpuFallbackEnabledElement;if(!r)return;!function(e,t=!0,r=!0){let{canvas:n,image:a,viewport:i}=e,o=qA(n,a,0).scaleFactor;i.vflip=!1,i.hflip=!1,t&&(i.translation.x=0,i.translation.y=0),r&&(i.displayedArea.tlhc.x=1,i.displayedArea.tlhc.y=1,i.displayedArea.brhc.x=a.columns,i.displayedArea.brhc.y=a.rows,i.scale=o)}(this._cpuFallbackEnabledElement,e,t);let{scale:n}=this._cpuFallbackEnabledElement.viewport,{clientWidth:a,clientHeight:i}=this.element,o=this.canvasToWorldCPU([a/2,i/2]);this.setCameraCPU({focalPoint:o,scale:n})}resetCameraGPU(e){return this.setCamera({flipHorizontal:!1,flipVertical:!1,viewUp:this.initialViewUp}),super.resetCamera({resetToCenter:!0,...e})}scroll(e,t=!0,r=!1){let n=this.imageIds;if(isNaN(this.targetImageIdIndex))return;let a=this.targetImageIdIndex,i=n.length,o=a+e;o=r?(o+i)%i:Math.max(0,Math.min(i-1,o)),this.targetImageIdIndex=o;let s=n[o];ql.isLoaded(s)||!t?this.setImageIdIndex(o):(clearTimeout(this.debouncedTimeout),this.debouncedTimeout=window.setTimeout(()=>{this.setImageIdIndex(o)},40));let l={newImageIdIndex:o,imageId:s,direction:e};o!==a&&Bh(this.element,NH.STACK_VIEWPORT_SCROLL,l)}setImageIdIndex(e){if(this._throwIfDestroyed(),this.currentImageIdIndex===e)return Promise.resolve(this.getCurrentImageId());let t=this._setImageIdIndex(e);return this.targetImageIdIndex=e,t}calibrateSpacing(e){let t=this.getImageIds().indexOf(e);this.stackInvalidated=!0,this._loadAndDisplayImage(e,t)}triggerCameraEvent(e,t){let r={previousCamera:t,camera:e,element:this.element,viewportId:this.id,renderingEngineId:this.renderingEngineId};this.suppressEvents||Bh(this.element,NH.CAMERA_MODIFIED,r)}triggerCalibrationEvent(){let{imageData:e}=this.getImageData(),t={element:this.element,viewportId:this.id,renderingEngineId:this.renderingEngineId,imageId:this.getCurrentImageId(),imageData:e,worldToIndex:e.getWorldToIndex(),...this._calibrationEvent};this.suppressEvents||Bh(this.element,NH.IMAGE_SPACING_CALIBRATED,t),this._publishCalibratedEvent=!1}jumpToWorld(e){let t=this.getImageIds(),{direction:r,spacing:n}=this.getImageData(),a=q$({direction:r,spacing:n,imageIds:t},e,this.getCamera().viewPlaneNormal,{ignoreSpacing:!0}),i=t.indexOf(a);return -1!==i&&(this.setImageIdIndex(i),this.render(),!0)}getRendererContextPool(){return this.getRenderingEngine().getRenderer(this.id)}getRendererTiled(){let e=this.getRenderingEngine();if(!e||e.hasBeenDestroyed)throw Error("Rendering engine has been destroyed");return e.offscreenMultiRenderWindow?.getRenderer(this.id)}_getVOIRangeForCurrentImage(){let{windowCenter:e,windowWidth:t,voiLUTFunction:r}=this.csImage;return GM(t,e,r)}_getValidVOILUTFunction(e){return Object.values(N2).includes(e)?e:N2.LINEAR}getSliceInfo(){let e=this.getSliceIndex(),{dimensions:t}=this.getImageData();return{width:t[0],height:t[1],sliceIndex:e,slicePlane:2}}isReferenceViewable(e,t={}){let r=this.getCurrentImageIdIndex(),n=this.imageIds[r];if(!n||!e)return!1;let{referencedImageId:a,multiSliceReference:i}=e;if(a){if(a===n)return!0;e.referencedImageURI||=Gk(a);let{referencedImageURI:o}=e,s=this.imageKeyToIndexMap.get(o);return!!(t.asOverlay&&this.matchImagesForOverlay(n,a))||void 0!==s&&(!!t.withNavigation||r<=(i&&this.imageKeyToIndexMap.get(i.referencedImageId))&&r>=s)}if(!super.isReferenceViewable(e,{...t,withOrientation:t?.asVolume}))return!1;if(e.volumeId||e.FrameOfReferenceUID)return t.asVolume;let{cameraFocalPoint:o}=e;if(t.asNearbyProjection&&o){let{spacing:e,direction:t,origin:r}=this.getImageData(),n=t.slice(6,9),a=qG({direction:t,spacing:e},n),i=Lv.vec3.subtract(Lv.vec3.create(),o,r);if(Math.abs(Lv.vec3.dot(i,n))<=a/2)return!0}return!1}getViewReference(e={}){let{sliceIndex:t=this.getCurrentImageIdIndex()}=e,r=super.getViewReference(e),n=this.getCurrentImageId(t);if(n){if(r.referencedImageId=n,this.getCurrentImageIdIndex()!==t){let e=this.getImagePlaneReferenceData(t);if(!e)return;Object.assign(r,e)}return r}}setViewReference(e){if(!e?.referencedImageId){e?.sliceIndex!==void 0&&this.scroll(e.sliceIndex-this.targetImageIdIndex);return}let{referencedImageId:t}=e;e.referencedImageURI||=Gk(t);let{referencedImageURI:r}=e,n=this.imageKeyToIndexMap.get(r);void 0===n?Kt.error(`No image URI found for ${r}`):this.scroll(n-this.targetImageIdIndex)}getViewReferenceId(e={}){let{sliceIndex:t=this.currentImageIdIndex}=e;return`imageId:${this.imageIds[t]}`}getSliceIndexForImage(e){if(e){if("string"==typeof e)return this.imageKeyToIndexMap.get(e);if(e.referencedImageId)return this.imageKeyToIndexMap.get(e.referencedImageId)}}getCPUFallbackError(e){return Error(`method ${e} cannot be used during CPU Fallback mode`)}fillWithBackgroundColor(){let e=this.getRenderingEngine();e&&e.fillCanvasWithBackgroundColor(this.canvas,this.options.background)}unsetColormapCPU(){delete this._cpuFallbackEnabledElement.viewport.colormap,this._cpuFallbackEnabledElement.renderingTools={},this.cpuRenderingInvalidated=!0,this.fillWithBackgroundColor(),this.render()}setColormapCPU(e){this.colormap=e;let t=G5(e);t?this._cpuFallbackEnabledElement.viewport.colormap=t:delete this._cpuFallbackEnabledElement.viewport.colormap,this._cpuFallbackEnabledElement.renderingTools={},this.fillWithBackgroundColor(),this.cpuRenderingInvalidated=!0,this.render();let r={viewportId:this.id,colormap:e};Bh(this.element,NH.COLORMAP_MODIFIED,r)}setColormapGPU(e){let t=this.getDefaultActor().actor.getProperty(),r=t.getRGBTransferFunction(),n=Gi(e.name);if(r)r.applyColorMap(n),r.setMappingRange(this.voiRange.lower,this.voiRange.upper),t.setRGBTransferFunction(0,r);else{let e=z2.newInstance();e.applyColorMap(n),e.setMappingRange(this.voiRange.lower,this.voiRange.upper),t.setRGBTransferFunction(0,e)}this.colormap=e,this.render();let a={viewportId:this.id,colormap:e};Bh(this.element,NH.COLORMAP_MODIFIED,a)}unsetColormapGPU(){throw Error("unsetColormapGPU not implemented.")}_getImagePlaneModule(e){let t=Hz(e);return this.hasPixelSpacing=!t.usingDefaultValues||this.calibration?.scale>0||this.calibration?.rowPixelSpacing>0,this.calibration||=t.calibration,t}isInAcquisitionPlane(){return!0}};function Kn(e,t){return e.worldToIndex(t).map(Math.round)}function Ka(e){let{direction:t}=e;return{viewPlaneNormal:t.slice(6,9).map(e=>-e),viewUp:t.slice(3,6).map(e=>-e)}}var Ki={context:null,lastRenderer:null,keyMatrixTime:null,keyMatrices:null},Ko=jh(function(e,t,r={}){Object.assign(t,Ki,r),q9.extend(e,t,r),t.keyMatrixTime={},B9(t.keyMatrixTime),t.keyMatrices={normalMatrix:new Float64Array(9),vcpc:new Float64Array(16),wcvc:new Float64Array(16),wcpc:new Float64Array(16)},ja(e,t,["context","keyMatrixTime"]),t.classHierarchy.push("vtkOpenGLCamera"),e.buildPass=r=>{r&&(t._openGLRenderer=e.getFirstAncestorOfType("vtkOpenGLRenderer"),t._openGLRenderWindow=t._openGLRenderer.getParent(),t.context=t._openGLRenderWindow.getContext())},e.opaquePass=e=>{if(e){let e=t._openGLRenderer.getTiledSizeAndOrigin();t.context.viewport(e.lowerLeftU,e.lowerLeftV,e.usize,e.vsize),t.context.scissor(e.lowerLeftU,e.lowerLeftV,e.usize,e.vsize)}},e.translucentPass=e.opaquePass,e.zBufferPass=e.opaquePass,e.opaqueZBufferPass=e.opaquePass,e.volumePass=e.opaquePass,e.getKeyMatrices=r=>{if(r!==t.lastRenderer||t._openGLRenderWindow.getMTime()>t.keyMatrixTime.getMTime()||e.getMTime()>t.keyMatrixTime.getMTime()||r.getMTime()>t.keyMatrixTime.getMTime()||t.renderable.getMTime()>t.keyMatrixTime.getMTime()){t.renderable.getViewMatrix(t.keyMatrices.wcvc),Lv.mat3.fromMat4(t.keyMatrices.normalMatrix,t.keyMatrices.wcvc),Lv.mat3.invert(t.keyMatrices.normalMatrix,t.keyMatrices.normalMatrix),Lv.mat4.transpose(t.keyMatrices.wcvc,t.keyMatrices.wcvc);let e=t._openGLRenderer.getAspectRatio();Lv.mat4.copy(t.keyMatrices.vcpc,t.renderable.getProjectionMatrix(e,-1,1)),Lv.mat4.transpose(t.keyMatrices.vcpc,t.keyMatrices.vcpc),Lv.mat4.multiply(t.keyMatrices.wcpc,t.keyMatrices.vcpc,t.keyMatrices.wcvc),t.keyMatrixTime.modified(),t.lastRenderer=r}return t.keyMatrices}});$r.vtkCamera=Ko;var Ks="//VTK::System::Dec\n\n/*=========================================================================\n\n Program: Visualization Toolkit\n Module: vtkPolyDataVS.glsl\n\n Copyright (c) Ken Martin, Will Schroeder, Bill Lorensen\n All rights reserved.\n See Copyright.txt or http://www.kitware.com/Copyright.htm for details.\n\n This software is distributed WITHOUT ANY WARRANTY; without even\n the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR\n PURPOSE. See the above copyright notice for more information.\n\n=========================================================================*/\n\nattribute vec4 vertexMC;\n\n// frag position in VC\n//VTK::PositionVC::Dec\n\n// optional normal declaration\n//VTK::Normal::Dec\n\n// extra lighting parameters\n//VTK::Light::Dec\n\n// Texture coordinates\n//VTK::TCoord::Dec\n\n// material property values\n//VTK::Color::Dec\n\n// clipping plane vars\n//VTK::Clip::Dec\n\n// camera and actor matrix values\n//VTK::Camera::Dec\n\n// Apple Bug\n//VTK::PrimID::Dec\n\n// picking support\n//VTK::Picking::Dec\n\nvoid main()\n{\n //VTK::Color::Impl\n\n //VTK::Normal::Impl\n\n //VTK::TCoord::Impl\n\n //VTK::Clip::Impl\n\n //VTK::PrimID::Impl\n\n //VTK::PositionVC::Impl\n\n //VTK::Light::Impl\n\n //VTK::Picking::Impl\n}\n",Kl="//VTK::System::Dec\n\n/*=========================================================================\n\n Program: Visualization Toolkit\n Module: vtkPolyDataFS.glsl\n\n Copyright (c) Ken Martin, Will Schroeder, Bill Lorensen\n All rights reserved.\n See Copyright.txt or http://www.kitware.com/Copyright.htm for details.\n\n This software is distributed WITHOUT ANY WARRANTY; without even\n the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR\n PURPOSE. See the above copyright notice for more information.\n\n=========================================================================*/\n// Template for the polydata mappers fragment shader\n\nuniform int PrimitiveIDOffset;\n\n// VC position of this fragment\n//VTK::PositionVC::Dec\n\n// optional color passed in from the vertex shader, vertexColor\n//VTK::Color::Dec\n\n// optional surface normal declaration\n//VTK::Normal::Dec\n\n// extra lighting parameters\n//VTK::Light::Dec\n\n// define vtkImageLabelOutlineOn\n//VTK::ImageLabelOutlineOn\n\n// Texture coordinates\n//VTK::TCoord::Dec\n\n// picking support\n//VTK::Picking::Dec\n\n// Depth Peeling Support\n//VTK::DepthPeeling::Dec\n\n// clipping plane vars\n//VTK::Clip::Dec\n\n// label outline \n//VTK::LabelOutline::Dec\n\n// the output of this shader\n//VTK::Output::Dec\n\n// Apple Bug\n//VTK::PrimID::Dec\n\n// handle coincident offsets\n//VTK::Coincident::Dec\n\n//VTK::ZBuffer::Dec\n\n//VTK::LabelOutlineHelperFunction\n\nvoid main()\n{\n // VC position of this fragment. This should not branch/return/discard.\n //VTK::PositionVC::Impl\n\n // Place any calls that require uniform flow (e.g. dFdx) here.\n //VTK::UniformFlow::Impl\n\n // Set gl_FragDepth here (gl_FragCoord.z by default)\n //VTK::Depth::Impl\n\n // Early depth peeling abort:\n //VTK::DepthPeeling::PreColor\n\n // Apple Bug\n //VTK::PrimID::Impl\n\n //VTK::Clip::Impl\n\n //VTK::Color::Impl\n\n // Generate the normal if we are not passed in one\n //VTK::Normal::Impl\n\n //VTK::TCoord::Impl\n\n //VTK::Light::Impl\n\n if (gl_FragData[0].a <= 0.0)\n {\n discard;\n }\n\n //VTK::DepthPeeling::Impl\n\n //VTK::Picking::Impl\n\n // handle coincident offsets\n //VTK::Coincident::Impl\n\n //VTK::ZBuffer::Impl\n\n //VTK::RenderPassFragmentShader::Impl\n}\n",Ku=function(e,t,r={}){e.replaceShaderCoincidentOffset=(r,n,a)=>{let i=e.getCoincidentParameters(n,a);if(i&&(0!==i.factor||0!==i.offset)){let e=r.Fragment;e=$W.substitute(e,"//VTK::Coincident::Dec",["uniform float cfactor;","uniform float coffset;"]).result,t.context.getExtension("EXT_frag_depth")&&(0!==i.factor?(e=$W.substitute(e,"//VTK::UniformFlow::Impl",["float cscale = length(vec2(dFdx(gl_FragCoord.z),dFdy(gl_FragCoord.z)));","//VTK::UniformFlow::Impl"],!1).result,e=$W.substitute(e,"//VTK::Depth::Impl","gl_FragDepthEXT = gl_FragCoord.z + cfactor*cscale + 0.000016*coffset;").result):e=$W.substitute(e,"//VTK::Depth::Impl","gl_FragDepthEXT = gl_FragCoord.z + 0.000016*coffset;").result),t._openGLRenderWindow.getWebgl2()&&(0!==i.factor?(e=$W.substitute(e,"//VTK::UniformFlow::Impl",["float cscale = length(vec2(dFdx(gl_FragCoord.z),dFdy(gl_FragCoord.z)));","//VTK::UniformFlow::Impl"],!1).result,e=$W.substitute(e,"//VTK::Depth::Impl","gl_FragDepth = gl_FragCoord.z + cfactor*cscale + 0.000016*coffset;").result):e=$W.substitute(e,"//VTK::Depth::Impl","gl_FragDepth = gl_FragCoord.z + 0.000016*coffset;").result),r.Fragment=e}}},Kd=function(e,t,r={}){e.applyShaderReplacements=(e,t,r)=>{let n=null;if(t&&(n=t.ShaderReplacements),n)for(let t=0;t<n.length;t++){let a=n[t];if(r&&a.replaceFirst||!r&&!a.replaceFirst){let t=a.shaderType,r=e[t];e[t]=$W.substitute(r,a.originalValue,a.replacementValue,a.replaceAll).result}}},e.buildShaders=(r,n,a)=>{e.getReplacedShaderTemplate(r,n,a),t.lastRenderPassShaderReplacement=t.currentRenderPass?t.currentRenderPass.getShaderReplacement():null,t.lastRenderPassShaderReplacement&&t.lastRenderPassShaderReplacement(r);let i=t.renderable.getViewSpecificProperties().OpenGL;e.applyShaderReplacements(r,i,!0),e.replaceShaderValues(r,n,a),e.applyShaderReplacements(r,i)},e.getReplacedShaderTemplate=(r,n,a)=>{let i=t.renderable.getViewSpecificProperties().OpenGL;e.getShaderTemplate(r,n,a);let o=r.Vertex;if(i){let e=i.VertexShaderCode;void 0!==e&&""!==e&&(o=e)}r.Vertex=o;let s=r.Fragment;if(i){let e=i.FragmentShaderCode;void 0!==e&&""!==e&&(s=e)}r.Fragment=s;let l=r.Geometry;if(i){let e=i.GeometryShaderCode;void 0!==e&&(l=e)}r.Geometry=l}};function Kc(e,t,r){return e.length>0?`${e.map(e=>e?.getMTime()??"x").join("/")}-${t}-${r}`:"0"}function Kh(e,t){return`${t.getMTime()}`}var{vtkErrorMacro:Kp}=BL,{SlicingMode:Km}=Hn,Kf={VBOBuildTime:0,VBOBuildString:null,openGLTexture:null,tris:null,imagemat:null,imagematinv:null,colorTexture:null,pwfTexture:null,labelOutlineThicknessTexture:null,labelOutlineOpacityTexture:null,lastHaveSeenDepthRequest:!1,haveSeenDepthRequest:!1,lastTextureComponents:0},Kg=jh(function(e,t,r={}){Object.assign(t,Kf,r),q9.extend(e,t,r),Ku(e,t,r),Kd(e,t,r),t.tris=$G.newInstance(),t.imagemat=Lv.mat4.identity(new Float64Array(16)),t.imagematinv=Lv.mat4.identity(new Float64Array(16)),t.projectionToWorld=Lv.mat4.identity(new Float64Array(16)),t.idxToView=Lv.mat4.identity(new Float64Array(16)),t.idxNormalMatrix=Lv.mat3.identity(new Float64Array(9)),t.modelToView=Lv.mat4.identity(new Float64Array(16)),t.projectionToView=Lv.mat4.identity(new Float64Array(16)),ja(e,t,[]),t.VBOBuildTime={},B9(t.VBOBuildTime);function n(r){t.openGLTexture.releaseGraphicsResources(r),[t._colorTransferFunc,t._pwFunc,t._labelOutlineThicknessArray,t._labelOutlineOpacity].forEach(t=>r.unregisterGraphicsResourceUser(t,e))}t.classHierarchy.push("vtkOpenGLImageMapper"),e.buildPass=r=>{if(r){t.currentRenderPass=null,t.openGLImageSlice=e.getFirstAncestorOfType("vtkOpenGLImageSlice"),t._openGLRenderer=e.getFirstAncestorOfType("vtkOpenGLRenderer");let r=t._openGLRenderWindow;t._openGLRenderWindow=t._openGLRenderer.getLastAncestorOfType("vtkOpenGLRenderWindow"),r&&!r.isDeleted()&&r!==t._openGLRenderWindow&&n(r),t.context=t._openGLRenderWindow.getContext(),t.tris.setOpenGLRenderWindow(t._openGLRenderWindow);let a=t._openGLRenderer.getRenderable();t.openGLCamera=t._openGLRenderer.getViewNodeFor(a.getActiveCamera(),t.openGLCamera),t.renderable.isA("vtkImageMapper")&&t.renderable.getSliceAtFocalPoint()&&t.renderable.setSliceFromCamera(a.getActiveCamera())}},e.translucentPass=(r,n)=>{r&&(t.currentRenderPass=n,e.render())},e.zBufferPass=r=>{r&&(t.haveSeenDepthRequest=!0,t.renderDepth=!0,e.render(),t.renderDepth=!1)},e.opaqueZBufferPass=t=>e.zBufferPass(t),e.opaquePass=t=>{t&&e.render()},e.getCoincidentParameters=(e,r)=>t.renderable.getResolveCoincidentTopology()==z5.PolygonOffset?t.renderable.getCoincidentTopologyPolygonOffsetParameters():null,e.render=()=>{let r=t.openGLImageSlice.getRenderable(),n=t._openGLRenderer.getRenderable();e.renderPiece(n,r)},e.getShaderTemplate=(e,t,r)=>{e.Vertex=Ks,e.Fragment=Kl,e.Geometry=""},e.replaceShaderValues=(r,n,a)=>{let i=r.Vertex,o=r.Fragment;i=$W.substitute(i,"//VTK::Camera::Dec",["uniform mat4 MCPCMatrix;"]).result,i=$W.substitute(i,"//VTK::PositionVC::Impl",[" gl_Position = MCPCMatrix * vertexMC;"]).result,i=$W.substitute(i,"//VTK::TCoord::Impl","tcoordVCVSOutput = tcoordMC;").result,i=$W.substitute(i,"//VTK::TCoord::Dec","attribute vec2 tcoordMC; varying vec2 tcoordVCVSOutput;").result;let s=t.openGLTexture.getComponents(),l=a.getProperty().getIndependentComponents(),u=["varying vec2 tcoordVCVSOutput;","uniform float cshift0;","uniform float cscale0;","uniform float pwfshift0;","uniform float pwfscale0;","uniform sampler2D texture1;","uniform sampler2D colorTexture1;","uniform sampler2D pwfTexture1;","uniform float opacity;"];if(a.getProperty().getUseLabelOutline()&&(u=u.concat(["uniform sampler2D labelOutlineTexture1;","uniform sampler2D labelOutlineOpacityTexture1;"])),l){for(let e=1;e<s;e++)u=u.concat([`uniform float cshift${e};`,`uniform float cscale${e};`,`uniform float pwfshift${e};`,`uniform float pwfscale${e};`]);switch(s){case 1:u=u.concat(["uniform float mix0;","#define height0 0.5"]);break;case 2:u=u.concat(["uniform float mix0;","uniform float mix1;","#define height0 0.25","#define height1 0.75"]);break;case 3:u=u.concat(["uniform float mix0;","uniform float mix1;","uniform float mix2;","#define height0 0.17","#define height1 0.5","#define height2 0.83"]);break;case 4:u=u.concat(["uniform float mix0;","uniform float mix1;","uniform float mix2;","uniform float mix3;","#define height0 0.125","#define height1 0.375","#define height2 0.625","#define height3 0.875"]);break;default:Kp("Unsupported number of independent coordinates.")}}if(o=$W.substitute(o,"//VTK::TCoord::Dec",u).result,!0===a.getProperty().getUseLabelOutline()&&(o=$W.substitute(o,"//VTK::LabelOutline::Dec",["uniform float vpWidth;","uniform float vpHeight;","uniform float vpOffsetX;","uniform float vpOffsetY;","uniform mat4 PCWCMatrix;","uniform mat4 vWCtoIDX;","uniform ivec3 imageDimensions;","uniform int sliceAxis;"]).result,o=$W.substitute(o,"//VTK::ImageLabelOutlineOn","#define vtkImageLabelOutlineOn").result,o=$W.substitute(o,"//VTK::LabelOutlineHelperFunction",["#ifdef vtkImageLabelOutlineOn","vec3 fragCoordToIndexSpace(vec4 fragCoord) {"," vec4 pcPos = vec4("," (fragCoord.x / vpWidth - vpOffsetX - 0.5) * 2.0,"," (fragCoord.y / vpHeight - vpOffsetY - 0.5) * 2.0,"," (fragCoord.z - 0.5) * 2.0,"," 1.0);",""," vec4 worldCoord = PCWCMatrix * pcPos;"," vec4 vertex = (worldCoord/worldCoord.w);",""," vec3 index = (vWCtoIDX * vertex).xyz;",""," // half voxel fix for labelmapOutline"," return (index + vec3(0.5)) / vec3(imageDimensions);","}","vec2 getSliceCoords(vec3 coord, int axis) {"," if (axis == 0) return coord.yz;"," if (axis == 1) return coord.xz;"," if (axis == 2) return coord.xy;","}","#endif"]).result),l){let e=["r","g","b","a"],t=["vec4 tvalue = texture2D(texture1, tcoordVCVSOutput);"];for(let r=0;r<s;r++)t=t.concat([`vec3 tcolor${r} = mix${r} * texture2D(colorTexture1, vec2(tvalue.${e[r]} * cscale${r} + cshift${r}, height${r})).rgb;`,`float compWeight${r} = mix${r} * texture2D(pwfTexture1, vec2(tvalue.${e[r]} * pwfscale${r} + pwfshift${r}, height${r})).r;`]);switch(s){case 1:t=t.concat(["gl_FragData[0] = vec4(tcolor0.rgb, opacity);"]);break;case 2:t=t.concat(["float weightSum = compWeight0 + compWeight1;","gl_FragData[0] = vec4(vec3((tcolor0.rgb * (compWeight0 / weightSum)) + (tcolor1.rgb * (compWeight1 / weightSum))), opacity);"]);break;case 3:t=t.concat(["float weightSum = compWeight0 + compWeight1 + compWeight2;","gl_FragData[0] = vec4(vec3((tcolor0.rgb * (compWeight0 / weightSum)) + (tcolor1.rgb * (compWeight1 / weightSum)) + (tcolor2.rgb * (compWeight2 / weightSum))), opacity);"]);break;case 4:t=t.concat(["float weightSum = compWeight0 + compWeight1 + compWeight2 + compWeight3;","gl_FragData[0] = vec4(vec3((tcolor0.rgb * (compWeight0 / weightSum)) + (tcolor1.rgb * (compWeight1 / weightSum)) + (tcolor2.rgb * (compWeight2 / weightSum)) + (tcolor3.rgb * (compWeight3 / weightSum))), opacity);"]);break;default:Kp("Unsupported number of independent coordinates.")}o=$W.substitute(o,"//VTK::TCoord::Impl",t).result}else switch(s){case 1:o=$W.substitute(o,"//VTK::TCoord::Impl",[...function(e){let t=e.split("\n"),r=[];for(let e=0;e<t.length;++e){let n=t[e].trim();n.length>0&&r.push(n)}return r}(`
91
91
  #ifdef vtkImageLabelOutlineOn
92
92
  vec3 centerPosIS = fragCoordToIndexSpace(gl_FragCoord);
93
93
  float centerValue = texture2D(texture1, getSliceCoords(centerPosIS, sliceAxis)).r;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@ohif/ui",
3
- "version": "3.13.0-beta.131",
3
+ "version": "3.13.0-beta.133",
4
4
  "description": "A set of React components for Medical Imaging Viewers",
5
5
  "author": "OHIF Contributors",
6
6
  "license": "MIT",