dicomweb-proxy
Version:
A proxy to translate between dicomweb and dimse
2 lines • 1.96 MB
JavaScript
/*! For license information please see 3396.bundle.262e766abc29886e362f.js.LICENSE.txt */
(self.webpackChunk=self.webpackChunk||[]).push([[3396],{46347:(e,t,n)=>{"use strict";n.d(t,{A:()=>N});var r=n(33739),i=n(660),o=n(99341),a=n(3823),s=n(49038),l=n(19325),c=n(71851),u=n(41864),d=n(10364),p=n(26896),f=n(69372),h=n(13859),m=n(50134),g=n(40256),v=n(38669),y=n(85745),b=n(61640),x=n(90740),A=n(10056),C=n(17232),T=n(61375),S=n(98039),w=n(80500),_=n(70210),I=n(74638),E=n(96833),D=n(39537),O=n(80221),P=n(74876);class R extends A.A{constructor(e){if(super(e),this.useCPURendering=!1,this.perVolumeIdDefaultProperties=new Map,this.viewportProperties={},this.volumeIds=new Set,this.setRotation=e=>{const t=this.getPan(this.fitToCanvasCamera),n=this.getPan(),r=this.getCamera(),i=a.Zc.sub([0,0],t,n);this.setPan(i,!1);const{flipVertical:o}=this.getCamera(),s=o?a.eR.negate([0,0,0],this.initialViewUp):this.initialViewUp;this.setCameraNoEvent({viewUp:s}),this.rotateCamera(e);const l=this.getPan(),u=this.getPan(this.fitToCanvasCamera),d=a.Zc.sub([0,0],l,u),p=a.Zc.add([0,0],t,d);if(this.setPan(p,!1),this._suppressCameraModifiedEvents)return;const h={previousCamera:r,camera:this.getCamera(),element:this.element,viewportId:this.id,renderingEngineId:this.renderingEngineId};(0,f.A)(this.element,c.Events.CAMERA_MODIFIED,h)},this.getDefaultProperties=e=>{let t;return void 0!==e&&(t=this.perVolumeIdDefaultProperties.get(e)),void 0!==t?t:{...this.globalDefaultProperties}},this.getProperties=e=>{if(!this._getApplicableVolumeActor(e))return;const{colormap:t,VOILUTFunction:n,interpolationType:r,invert:i,slabThickness:o,preset:a}=this.viewportProperties;e||=this.getVolumeId();if(!s.Ay.getVolume(e))return null;const l=this.getActors().find((t=>t.referencedId===e));if(!l)return;const c=l.actor.getProperty().getRGBTransferFunction(0),[u,d]="SIGMOID"===this.viewportProperties?.VOILUTFunction?(0,_.A)(c):c.getRange(),p={lower:u,upper:d},f=this.getColormap(e);return{colormap:e&&f?f:t,voiRange:p,VOILUTFunction:n,interpolationType:r,invert:i,slabThickness:o,preset:a}},this.getColormap=e=>{const t=this._getApplicableVolumeActor(e);if(!t)return;const{volumeActor:n}=t,r=this._getOrCreateColorTransferFunction(e),{nodes:i}=r.getState(),o=i.reduce(((e,t)=>(e.push(t.x,t.r,t.g,t.b),e)),[]);return(0,h.findMatchingColormap)(o,n)},this.getRotation=()=>{const{viewUp:e,viewPlaneNormal:t,flipVertical:n}=this.getCameraNoRotation(),r=n?a.eR.negate([0,0,0],this.initialViewUp):this.initialViewUp;if(!r)return 0;const i=180*a.eR.angle(r,e)/Math.PI,o=a.eR.cross([0,0,0],r,e);return a.eR.dot(o,t)>=0?i:(360-i)%360},this.getFrameOfReferenceUID=()=>this._FrameOfReferenceUID,this.canvasToWorld=e=>{const t=this.getVtkActiveCamera();t.setIsPerformingCoordinateTransformation?.(!0);const n=this.getRenderer(),r=this.getVtkDisplayCoords(e),i=this.getRenderingEngine().offscreenMultiRenderWindow.getOpenGLRenderWindow().displayToWorld(r[0],r[1],r[2],n);return t.setIsPerformingCoordinateTransformation?.(!1),[i[0],i[1],i[2]]},this.getVtkDisplayCoords=e=>{const t=window.devicePixelRatio||1,n=[e[0]*t,e[1]*t],r=this.getRenderingEngine().offscreenMultiRenderWindow.getOpenGLRenderWindow().getSize(),i=[n[0]+this.sx,n[1]+this.sy];return i[1]=r[1]-i[1],[i[0],i[1],0]},this.worldToCanvas=e=>{const t=this.getVtkActiveCamera();t.setIsPerformingCoordinateTransformation?.(!0);const n=this.getRenderer(),r=this.getRenderingEngine().offscreenMultiRenderWindow.getOpenGLRenderWindow(),i=r.getSize(),o=r.worldToDisplay(...e,n);o[1]=i[1]-o[1];const a=[o[0]-this.sx,o[1]-this.sy],s=window.devicePixelRatio||1,l=[a[0]/s,a[1]/s];return t.setIsPerformingCoordinateTransformation(!1),l},this.hasImageURI=e=>this.getActors().filter((e=>(0,S.N)(e,"vtkVolume"))).some((({uid:t,referencedId:n})=>{const r=s.Ay.getVolume(n||t);if(!r?.imageIds)return!1;return r.imageIds.map(D.A).includes(e)})),this.getImageIds=e=>{const t=this._getApplicableVolumeActor(e);if(!t)throw new Error(`No actor found for the given volumeId: ${e}`);const n=t.volumeId,r=s.Ay.getVolume(n);if(!r)throw new Error(`imageVolume with id: ${n} does not exist in cache`);return r.imageIds},this.useCPURendering=(0,p.LH)(),this.useCPURendering)throw new Error("VolumeViewports cannot be used whilst CPU Fallback Rendering is enabled.");const t=this.getRenderer(),n=C.Ay.newInstance();switch(t.setActiveCamera(n),this.type){case u.A.ORTHOGRAPHIC:case u.A.VOLUME_3D:n.setParallelProjection(!0);break;case u.A.PERSPECTIVE:n.setParallelProjection(!1);break;default:throw new Error(`Unrecognized viewport type: ${this.type}`)}this.initializeVolumeNewImageEventDispatcher()}static get useCustomRenderingPipeline(){return!1}getSliceViewInfo(){throw new Error("Method not implemented.")}applyViewOrientation(e,t=!0){const{viewPlaneNormal:n,viewUp:r}=this._getOrientationVectors(e),i=this.getVtkActiveCamera();if(i.setDirectionOfProjection(-n[0],-n[1],-n[2]),i.setViewUpFrom(r),this.initialViewUp=r,t){this.resetCamera({resetOrientation:!1,resetRotation:!1})}}initializeVolumeNewImageEventDispatcher(){const e=function(e){const{viewportId:t}=e.detail;if(t!==this.id||this.isDisabled)return;if(!this.getImageData())return;(0,x.A)(e)}.bind(this),t=function(n){const{viewportId:r}=n.detail;if(r!==this.id)return;this.element.removeEventListener(c.Events.CAMERA_MODIFIED,e),d.A.removeEventListener(c.Events.ELEMENT_DISABLED,t),(0,x.g)(r)}.bind(this);this.element.removeEventListener(c.Events.CAMERA_MODIFIED,e),this.element.addEventListener(c.Events.CAMERA_MODIFIED,e),d.A.addEventListener(c.Events.ELEMENT_DISABLED,t)}setVOILUTFunction(e,t,n){Object.values(c.VOILUTFunctionType).includes(e)||(e=c.VOILUTFunctionType.LINEAR);const{voiRange:r}=this.getProperties();this.setVOI(r,t,n),this.viewportProperties.VOILUTFunction=e}setColormap(e,t,n){const o=this._getApplicableVolumeActor(t);if(!o)return;const{volumeActor:a}=o,s=r.Ay.newInstance();let l=h.getColormap(e.name);const{name:u}=e;if(l||(l=i.A.getPresetByName(u)),!l)throw new Error(`Colormap ${e} not found`);const d=a.getProperty().getRGBTransferFunction(0).getRange();if(s.applyColorMap(l),s.setMappingRange(d[0],d[1]),a.getProperty().setRGBTransferFunction(0,s),this.viewportProperties.colormap=e,!n){const n={viewportId:this.id,colormap:e,volumeId:t};(0,f.A)(this.element,c.Events.VOI_MODIFIED,n),(0,f.A)(this.element,c.Events.COLORMAP_MODIFIED,n)}}setOpacity(e,t){const n=this._getApplicableVolumeActor(t);if(!n)return;const{volumeActor:r}=n,i=o.Ay.newInstance();if("number"==typeof e.opacity){const t=r.getProperty().getRGBTransferFunction(0).getRange();i.addPoint(t[0],e.opacity),i.addPoint(t[1],e.opacity)}else e.opacity.forEach((({opacity:e,value:t})=>{i.addPoint(t,e)}));r.getProperty().setScalarOpacity(0,i),this.viewportProperties.colormap||(this.viewportProperties.colormap={}),this.viewportProperties.colormap.opacity=e.opacity}setInvert(e,t,n){const r=this._getApplicableVolumeActor(t);if(!r)return;const i=r.volumeId,o=this._getOrCreateColorTransferFunction(i);if((0,m.A)(o),this.viewportProperties.invert=e,!n){const e={...this.getVOIModifiedEventDetail(i),invertStateChanged:!0};(0,f.A)(this.element,c.Events.VOI_MODIFIED,e)}}getVOIModifiedEventDetail(e){const t=this._getApplicableVolumeActor(e);if(!t)throw new Error(`No actor found for the given volumeId: ${e}`);const n=t.volumeActor.getProperty().getRGBTransferFunction(0).getMappingRange(),r=this.getColormap(e),{VOILUTFunction:i,invert:o}=this.getProperties(e);return{viewportId:this.id,range:{lower:n[0],upper:n[1]},volumeId:t.volumeId,VOILUTFunction:i,colormap:r,invert:o}}_getOrCreateColorTransferFunction(e){const t=this._getApplicableVolumeActor(e);if(!t)return null;const{volumeActor:n}=t,i=n.getProperty().getRGBTransferFunction(0);if(i)return i;const o=r.Ay.newInstance();return n.getProperty().setRGBTransferFunction(0,o),o}setInterpolationType(e,t){const n=this._getApplicableVolumeActor(t);if(!n)return;const{volumeActor:r}=n;r.getProperty().setInterpolationType(e),this.viewportProperties.interpolationType=e}setVOI(e,t,n=!1){const r=this._getApplicableVolumeActor(t);if(!r)return;const{volumeActor:i}=r,o=r.volumeId,a=e;if(void 0===a)throw new Error("voiRangeToUse is undefined, need to implement this in the new volume model");const{VOILUTFunction:s}=this.getProperties(o);if(s===c.VOILUTFunctionType.SAMPLED_SIGMOID){const e=(0,g.A)(a);i.getProperty().setRGBTransferFunction(0,e)}else{const{lower:e,upper:t}=a;i.getProperty().getRGBTransferFunction(0).setRange(e,t)}if(!n){const e={...this.getVOIModifiedEventDetail(o)};(0,f.A)(this.element,c.Events.VOI_MODIFIED,e)}this.viewportProperties.voiRange=a}rotateCamera(e){const t=e-this.getRotation();this.getVtkActiveCamera().roll(-t)}setDefaultProperties(e,t){null==t?this.globalDefaultProperties=e:this.perVolumeIdDefaultProperties.set(t,e)}clearDefaultProperties(e){null==e?(this.globalDefaultProperties={},this.resetProperties()):(this.perVolumeIdDefaultProperties.delete(e),this.resetToDefaultProperties(e))}getViewReference(e={}){const t=super.getViewReference(e),n=this.getVolumeId(e);if(!1!==e?.forFrameOfReference&&(t.volumeId=n),"number"!=typeof e?.sliceIndex)return t;const{viewPlaneNormal:r}=t,i=e?.sliceIndex-this.getSliceIndex(),{sliceRangeInfo:o}=(0,T.A)(this,n,!0),{sliceRange:a,spacingInNormalDirection:s,camera:l}=o,{focalPoint:c,position:u}=l,{newFocalPoint:d}=(0,w.A)(c,u,a,r,s,i);return t.cameraFocalPoint=d,t}isReferenceViewable(e,t){if(!e.FrameOfReferenceUID)return!1;if(!super.isReferenceViewable(e,t))return!1;if(t?.withNavigation)return!0;const n=this.getSliceIndex(),{sliceIndex:r}=e;return Array.isArray(r)?r[0]<=n&&n<=r[1]:void 0===r||r===n}scroll(e=1){const t=this.getVolumeId(),{sliceRangeInfo:n}=(0,T.A)(this,t,!0);if(!n)return;const{sliceRange:r,spacingInNormalDirection:i,camera:o}=n,{focalPoint:a,viewPlaneNormal:s,position:l}=o,{newFocalPoint:c,newPosition:u}=(0,w.A)(a,l,r,s,i,e);this.setCamera({focalPoint:c,position:u}),this.render()}setViewReference(e){if(!e)return;const t=this.getVolumeId(),{viewPlaneNormal:n,FrameOfReferenceUID:r,cameraFocalPoint:i,referencedImageId:o,viewUp:s}=e;let{sliceIndex:l}=e;const{focalPoint:u,viewPlaneNormal:d,position:p}=this.getCamera(),f=(0,I.WC)(d,n),h=(0,I.Ay)(d,n);if("number"==typeof l&&e.volumeId===t&&(f||h)){const{currentStepIndex:e,sliceRangeInfo:n,numScrollSteps:r}=(0,T.A)(this,t,!0),{sliceRange:i,spacingInNormalDirection:o}=n;f&&(l=r-l-1);const a=l-e,{newFocalPoint:s,newPosition:c}=(0,w.A)(u,p,i,d,o,a);this.setCamera({focalPoint:s,position:c})}else{if(r!==this.getFrameOfReferenceUID())throw new Error(`Incompatible view refs: ${r}!==${this.getFrameOfReferenceUID()}`);if(n&&!f&&!h)return this.setOrientation({viewPlaneNormal:n,viewUp:s}),void this.setViewReference(e);if(i){const e=a.eR.subtract([0,0,0],i,u),t=n??d,r=a.eR.dot(e,t);(0,I.Ay)(r,0)||a.eR.scale(e,t,r);const o=a.eR.add([0,0,0],u,e),s=a.eR.add([0,0,0],p,e);this.setCamera({focalPoint:o,position:s})}if(o&&this.isInAcquisitionPlane()){const e=P.get(c.MetadataModules.IMAGE_PLANE,o),{imagePositionPatient:t}=e,{focalPoint:n}=this.getCamera(),r=a.eR.subtract(a.eR.create(),n,t),i=a.eR.dot(r,d),s=a.eR.scaleAndAdd(a.eR.create(),n,[-d[0],-d[1],-d[2]],i);this.setCamera({focalPoint:s}),this.render()}}}setProperties({voiRange:e,VOILUTFunction:t,invert:n,colormap:r,preset:i,interpolationType:o,slabThickness:a}={},s,l=!1){null==this.globalDefaultProperties&&this.setDefaultProperties({voiRange:e,VOILUTFunction:t,invert:n,colormap:r,preset:i,slabThickness:a}),void 0!==n&&this.viewportProperties.invert!==n&&this.setInvert(n,s,l),r?.name&&this.setColormap(r,s,l),null!=r?.opacity&&this.setOpacity(r,s),void 0!==e&&this.setVOI(e,s,l),void 0!==o&&this.setInterpolationType(o),void 0!==t&&this.setVOILUTFunction(t,s,l),void 0!==i&&this.setPreset(i,s,l),void 0!==a&&this.setSlabThickness(a)}resetToDefaultProperties(e){const t=this.globalDefaultProperties;t.colormap?.name&&this.setColormap(t.colormap,e),null!=t.colormap?.opacity&&this.setOpacity(t.colormap,e),void 0!==t.voiRange&&this.setVOI(t.voiRange,e),void 0!==t.VOILUTFunction&&this.setVOILUTFunction(t.VOILUTFunction,e),void 0!==t.invert&&this.setInvert(t.invert,e),void 0!==t.slabThickness&&(this.setSlabThickness(t.slabThickness),this.viewportProperties.slabThickness=t.slabThickness),void 0!==t.preset&&this.setPreset(t.preset,e,!1),void 0!==t.preset&&this.setPreset(t.preset,e,!1),this.render()}setPreset(e,t,n){const r=this._getApplicableVolumeActor(t);if(!r)return;const{volumeActor:i}=r;let o=e;"string"==typeof o&&(o=l.VIEWPORT_PRESETS.find((t=>t.name===e))),o&&((0,E.A)(i,o),this.viewportProperties.preset=o,this.render(),n||(0,f.A)(this.element,c.Events.PRESET_MODIFIED,{viewportId:this.id,volumeId:r.volumeId,actor:i,presetName:o.name}))}async setVolumes(e,t=!1,n=!1){const r=s.Ay.getVolume(e[0].volumeId);if(!r)throw new Error(`imageVolume with id: ${r.volumeId} does not exist, you need to create/allocate the volume first`);const i=r.metadata.FrameOfReferenceUID;this._isValidVolumeInputArray(e,i),this._FrameOfReferenceUID=i,e.forEach((e=>{this._addVolumeId(e.volumeId)}));const o=[];for(let t=0;t<e.length;t++){const{volumeId:r,actorUID:i,slabThickness:a,...s}=e[t],l=await(0,b.A)(e[t],this.element,this.id,n),c=i||(0,O.A)();o.push({uid:c,actor:l,slabThickness:a,referencedId:r,...s})}this._setVolumeActors(o),this.viewportStatus=c.ViewportStatus.PRE_RENDER,this.initializeColorTransferFunction(e),(0,f.A)(this.element,c.Events.VOLUME_VIEWPORT_NEW_VOLUME,{viewportId:this.id,volumeActors:o}),t&&this.render()}async addVolumes(e,t=!1,n=!1){const r=s.Ay.getVolume(e[0].volumeId);if(!r)throw new Error(`imageVolume with id: ${r.volumeId} does not exist`);const i=[];this._isValidVolumeInputArray(e,this._FrameOfReferenceUID),e.forEach((e=>{this._addVolumeId(e.volumeId)}));for(let t=0;t<e.length;t++){const{volumeId:r,visibility:o,actorUID:a,slabThickness:s,...l}=e[t],c=await(0,b.A)(e[t],this.element,this.id,n);o||c.setVisibility(!1);const u=a||(0,O.A)();i.push({uid:u,actor:c,slabThickness:s,referencedId:r,...l})}this.addActors(i),this.initializeColorTransferFunction(e),t&&this.render()}removeVolumeActors(e,t=!1){this.removeActors(e),t&&this.render()}setOrientation(e,t=!0){console.warn('Method "setOrientation" needs implementation')}initializeColorTransferFunction(e){const t=e[0].volumeId,n=this._getOrCreateColorTransferFunction(t);!this.initialTransferFunctionNodes&&n&&(this.initialTransferFunctionNodes=(0,y.getTransferFunctionNodes)(n))}_getApplicableVolumeActor(e){const t=this.getActors();if(!t?.length)return;if(e){const n=t.find((t=>t.referencedId===e));if(!n)return;return{volumeActor:n.actor,volumeId:e,actorUID:n.uid}}const n=t[0];return{volumeActor:n.actor,volumeId:n.referencedId,actorUID:n.uid}}async _isValidVolumeInputArray(e,t){const n=e.length;for(let r=1;r<n;r++){if(t!==s.Ay.getVolume(e[r].volumeId).metadata.FrameOfReferenceUID)throw new Error(`Volumes being added to viewport ${this.id} do not share the same FrameOfReferenceUID. This is not yet supported`)}return!0}getBounds(){return this.getRenderer().computeVisiblePropBounds()}flip(e){super.flip(e)}hasVolumeId(e){return this.volumeIds.has(e)}hasVolumeURI(e){for(const t of this.volumeIds)if(t.includes(e))return!0;return!1}getImageData(e){if(!this.getDefaultActor())return;e||=this.getVolumeId();const t=this.getActors()?.find((t=>t.referencedId===e));if(!(0,S.N)(t,"vtkVolume"))return;const n=t.actor,r=s.Ay.getVolume(e),i=n.getMapper().getInputData();return{dimensions:i.getDimensions(),spacing:i.getSpacing(),origin:i.getOrigin(),direction:i.getDirection(),imageData:n.getMapper().getInputData(),metadata:{Modality:r?.metadata?.Modality,FrameOfReferenceUID:r?.metadata?.FrameOfReferenceUID},get scalarData(){return r?.voxelManager?.getScalarData()},scaling:r?.scaling,hasPixelSpacing:!0,voxelManager:r?.voxelManager}}setCameraClippingRange(){throw new Error("Method not implemented.")}getSliceIndex(){throw new Error("Method not implemented.")}setCamera(e,t){super.setCamera(e,t),this.setCameraClippingRange()}_setVolumeActors(e){for(let t=0;t<e.length;t++)this.viewportProperties.invert=!1;this.setActors(e)}_getOrientationVectors(e){if("object"==typeof e){if(e.viewPlaneNormal&&e.viewUp)return e;throw new Error("Invalid orientation object. It must contain viewPlaneNormal and viewUp")}if("string"==typeof e&&l.MPR_CAMERA_VALUES[e])return this.viewportProperties.orientation=e,l.MPR_CAMERA_VALUES[e];throw new Error(`Invalid orientation: ${e}. Valid orientations are: ${Object.keys(l.MPR_CAMERA_VALUES).join(", ")}`)}getSlabThickness(){const e=this.getActors();let t=l.RENDERING_DEFAULTS.MINIMUM_SLAB_THICKNESS;return e.forEach((e=>{e.slabThickness>t&&(t=e.slabThickness)})),t}getIntensityFromWorld(e){const t=this.getDefaultActor();if(!(0,S.N)(t,"vtkVolume"))return;const{actor:n}=t,r=n.getMapper().getInputData(),i=s.Ay.getVolume(this.getVolumeId()),o=(0,v.A)(r,e);return i.voxelManager.getAtIJKPoint(o)}getVolumeId(e){const t=this.getActors();if(!t)return;if(!e?.volumeId){const e=t.find((e=>"vtkVolume"===e.actor.getClassName()));return e?.referencedId||e?.uid}const n=t.find((t=>"vtkVolume"===t.actor.getClassName()&&t.referencedId===e?.volumeId));return n?.referencedId||n?.uid}getViewReferenceId(e={}){let{volumeId:t,sliceIndex:n}=e;if(!t){const e=this.getActors();if(!e)return;t=e.find((e=>"vtkVolume"===e.actor.getClassName()))?.referencedId}const r=this.getSliceIndex();n??=r;const{viewPlaneNormal:i,focalPoint:o}=this.getCamera(),a=t.includes("?")?"&":"?";return`volumeId:${t}${a}sliceIndex=${n}&viewPlaneNormal=${i.join(",")}`}_addVolumeId(e){this.volumeIds.add(e)}getAllVolumeIds(){return Array.from(this.volumeIds)}}const N=R},58165:(e,t,n)=>{"use strict";n.d(t,{A:()=>Te});var r=n(42008),i=n(58498),o=n(26719),a=n(33739),s=n(660),l=n(94520),c=n(28906),u=n(68076),d=n(16632);const p={slice:0,customDisplayExtent:[0,0,0,0,0,0],useCustomExtents:!1,backgroundColor:[0,0,0,1]};var f={extend:function(e,t){let n=arguments.length>2&&void 0!==arguments[2]?arguments[2]:{};Object.assign(t,p,n),u.A.extend(e,t,n),c.m.setGet(e,t,["slice","useCustomExtents"]),c.m.setGetArray(e,t,["customDisplayExtent"],6),c.m.setGetArray(e,t,["backgroundColor"],4),function(e,t){t.classHierarchy.push("vtkAbstractImageMapper"),e.getIsOpaque=()=>!0,e.getCurrentImage=()=>null,e.getBoundsForSlice=()=>(c.m.vtkErrorMacro("vtkAbstractImageMapper.getBoundsForSlice - NOT IMPLEMENTED"),(0,d.H)())}(e,t)}},h=n(3823),m=n(75127);function g(e,t,n){const r=n.getCurrentImage(),i=r.getExtent(),o=[i[0],i[2],i[4]],{ijkMode:a}=n.getClosestIJKAxis();let s=n.isA("vtkImageArrayMapper")?n.getSubSlice():n.getSlice();a!==n.getSlicingMode()&&(s=n.getSliceAtPosition(s)),o[a]+=s;const l=[0,0,0];r.indexToWorld(o,l),o[a]+=1;const c=[0,0,0];r.indexToWorld(o,c),c[0]-=l[0],c[1]-=l[1],c[2]-=l[2],h.eR.normalize(c,c);const u=m.Ay.intersectWithLine(e,t,l,c);if(u.intersection){const e=u.x,t=[0,0,0];return r.worldToIndex(e,t),{t:u.t,absoluteIJK:t}}return null}var v=n(57285);const{staticOffsetAPI:y,otherStaticMethods:b}=v.Ay,{SlicingMode:x}=l.A;function A(e,t){function n(){let n;switch(t.slicingMode){case x.X:n=0;break;case x.Y:n=1;break;case x.Z:n=2;break;default:return void(t.closestIJKAxis={ijkMode:t.slicingMode,flip:!1})}const r=e.getCurrentImage().getDirection(),i=(0,d.T)(r);let o=0;for(;o<3&&0===i[n+3*o];++o);const a=i[n+3*o]<0;t.closestIJKAxis={ijkMode:o,flip:a}}t.classHierarchy.push("vtkImageMapper"),e.getSliceAtPosition=n=>{const r=e.getCurrentImage();let i;if(3===n.length)i=n;else if(Number.isFinite(n)){const e=r.getBounds();switch(t.slicingMode){case x.X:i=[n,(e[3]+e[2])/2,(e[5]+e[4])/2];break;case x.Y:i=[(e[1]+e[0])/2,n,(e[5]+e[4])/2];break;case x.Z:i=[(e[1]+e[0])/2,(e[3]+e[2])/2,n]}}const o=[0,0,0];r.worldToIndex(i,o);const a=r.getExtent(),{ijkMode:s}=e.getClosestIJKAxis();let l=0;switch(s){case x.I:l=(0,d.E)(o[0],a[0],a[1]);break;case x.J:l=(0,d.E)(o[1],a[2],a[3]);break;case x.K:l=(0,d.E)(o[2],a[4],a[5]);break;default:return 0}return l},e.setSliceFromCamera=n=>{const r=n.getFocalPoint();switch(t.slicingMode){case x.I:case x.J:case x.K:{const t=e.getSliceAtPosition(r);e.setSlice(t)}break;case x.X:e.setSlice(r[0]);break;case x.Y:e.setSlice(r[1]);break;case x.Z:e.setSlice(r[2])}},e.setXSlice=t=>{e.setSlicingMode(x.X),e.setSlice(t)},e.setYSlice=t=>{e.setSlicingMode(x.Y),e.setSlice(t)},e.setZSlice=t=>{e.setSlicingMode(x.Z),e.setSlice(t)},e.setISlice=t=>{e.setSlicingMode(x.I),e.setSlice(t)},e.setJSlice=t=>{e.setSlicingMode(x.J),e.setSlice(t)},e.setKSlice=t=>{e.setSlicingMode(x.K),e.setSlice(t)},e.getSlicingModeNormal=()=>{const n=[0,0,0],r=e.getCurrentImage().getDirection();switch(t.slicingMode){case x.X:n[0]=1;break;case x.Y:n[1]=1;break;case x.Z:n[2]=1;break;case x.I:(0,d.S)(r,[1,0,0],n);break;case x.J:(0,d.S)(r,[0,1,0],n);break;case x.K:(0,d.S)(r,[0,0,1],n)}return n},e.setSlicingMode=r=>{t.slicingMode!==r&&(t.slicingMode=r,e.getCurrentImage()&&n(),e.modified())},e.getClosestIJKAxis=()=>(void 0!==t.closestIJKAxis&&t.closestIJKAxis.ijkMode!==x.NONE||!e.getCurrentImage()||n(),t.closestIJKAxis),e.getBounds=()=>{const n=e.getCurrentImage();if(!n)return(0,d.H)();if(!t.useCustomExtents)return n.getBounds();const r=t.customDisplayExtent.slice(),{ijkMode:i}=e.getClosestIJKAxis();let o=t.slice;switch(i!==t.slicingMode&&(o=e.getSliceAtPosition(t.slice)),i){case x.I:r[0]=o,r[1]=o;break;case x.J:r[2]=o,r[3]=o;break;case x.K:r[4]=o,r[5]=o}return n.extentToBounds(r)},e.getBoundsForSlice=function(){let n=arguments.length>0&&void 0!==arguments[0]?arguments[0]:t.slice,r=arguments.length>1&&void 0!==arguments[1]?arguments[1]:0;const i=e.getCurrentImage();if(!i)return(0,d.H)();const o=i.getSpatialExtent(),{ijkMode:a}=e.getClosestIJKAxis();let s=n;switch(a!==t.slicingMode&&(s=e.getSliceAtPosition(n)),a){case x.I:o[0]=s-r,o[1]=s+r;break;case x.J:o[2]=s-r,o[3]=s+r;break;case x.K:o[4]=s-r,o[5]=s+r}return i.extentToBounds(o)},e.intersectWithLineForPointPicking=(t,n)=>function(e,t,n){const r=g(e,t,n);if(r){const e=n.getCurrentImage().getExtent(),t=[Math.round(r.absoluteIJK[0]),Math.round(r.absoluteIJK[1]),Math.round(r.absoluteIJK[2])];return t[0]<e[0]||t[0]>e[1]||t[1]<e[2]||t[1]>e[3]||t[2]<e[4]||t[2]>e[5]?null:{t:r.t,ijk:t}}return null}(t,n,e),e.intersectWithLineForCellPicking=(t,n)=>function(e,t,n){const r=g(e,t,n);if(r){const e=n.getCurrentImage().getExtent(),t=r.absoluteIJK,i=[Math.floor(t[0]),Math.floor(t[1]),Math.floor(t[2])];if(i[0]<e[0]||i[0]>e[1]-1||i[1]<e[2]||i[1]>e[3]-1||i[2]<e[4]||i[2]>(e[5]?e[5]-1:e[5]))return null;const o=[t[0]-i[0],t[1]-i[1],t[2]-i[2]];return{t:r.t,ijk:i,pCoords:o}}return null}(t,n,e),e.getCurrentImage=()=>e.getInputData()}const C={slicingMode:x.NONE,closestIJKAxis:{ijkMode:x.NONE,flip:!1},renderToRectangle:!1,sliceAtFocalPoint:!1,preferSizeOverAccuracy:!1};function T(e,t){let n=arguments.length>2&&void 0!==arguments[2]?arguments[2]:{};Object.assign(t,C,n),f.extend(e,t,n),c.m.get(e,t,["slicingMode"]),c.m.setGet(e,t,["closestIJKAxis","renderToRectangle","sliceAtFocalPoint","preferSizeOverAccuracy"]),v.Ay.implementCoincidentTopologyMethods(e,t),A(e,t)}var S={newInstance:c.m.newInstance(T,"vtkImageMapper"),extend:T,...y,...b,...l.A},w=n(21734),_=n(62502),I=n(91732);const{InterpolationType:E}=I.A,{vtkErrorMacro:D}=c.m,O=4;const P={independentComponents:!1,interpolationType:E.LINEAR,colorWindow:255,colorLevel:127.5,ambient:1,diffuse:0,opacity:1,useLookupTableScalarRange:!1,useLabelOutline:!1,labelOutlineThickness:[1],labelOutlineOpacity:1};function R(e,t){let n=arguments.length>2&&void 0!==arguments[2]?arguments[2]:{};if(Object.assign(t,P,n),c.m.obj(e,t),!t.componentData){t.componentData=[];for(let e=0;e<O;e++)t.componentData.push({rGBTransferFunction:null,piecewiseFunction:null,componentWeight:1})}c.m.setGet(e,t,["independentComponents","interpolationType","colorWindow","colorLevel","ambient","diffuse","opacity","useLookupTableScalarRange","useLabelOutline","labelOutlineOpacity"]),c.m.setGetArray(e,t,["labelOutlineThickness"]),function(e,t){t.classHierarchy.push("vtkImageProperty"),e.getMTime=()=>{let e,n=t.mtime;for(let r=0;r<O;r++)t.componentData[r].rGBTransferFunction&&(e=t.componentData[r].rGBTransferFunction.getMTime(),n=n>e?n:e),t.componentData[r].piecewiseFunction&&(e=t.componentData[r].piecewiseFunction.getMTime(),n=n>e?n:e);return n},e.setRGBTransferFunction=function(){let n=arguments.length>0&&void 0!==arguments[0]?arguments[0]:0,r=n,i=arguments.length>1&&void 0!==arguments[1]?arguments[1]:null;return Number.isInteger(n)||(i=n,r=0),t.componentData[r].rGBTransferFunction!==i&&(t.componentData[r].rGBTransferFunction=i,e.modified(),!0)},e.getRGBTransferFunction=function(){let e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:0;return t.componentData[e].rGBTransferFunction},e.setPiecewiseFunction=function(){let n=arguments.length>0&&void 0!==arguments[0]?arguments[0]:0,r=n,i=arguments.length>1&&void 0!==arguments[1]?arguments[1]:null;return Number.isInteger(n)||(i=n,r=0),t.componentData[r].piecewiseFunction!==i&&(t.componentData[r].piecewiseFunction=i,e.modified(),!0)},e.getPiecewiseFunction=function(){let e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:0;return t.componentData[e].piecewiseFunction},e.setScalarOpacity=function(){let t=arguments.length>0&&void 0!==arguments[0]?arguments[0]:0,n=t,r=arguments.length>1&&void 0!==arguments[1]?arguments[1]:null;return Number.isInteger(t)||(r=t,n=0),e.setPiecewiseFunction(n,r)},e.getScalarOpacity=function(){let t=arguments.length>0&&void 0!==arguments[0]?arguments[0]:0;return e.getPiecewiseFunction(t)},e.setComponentWeight=function(){let n=arguments.length>0&&void 0!==arguments[0]?arguments[0]:0,r=arguments.length>1&&void 0!==arguments[1]?arguments[1]:1;if(n<0||n>=O)return D("Invalid index"),!1;const i=Math.min(1,Math.max(0,r));return t.componentData[n].componentWeight!==i&&(t.componentData[n].componentWeight=i,e.modified(),!0)},e.getComponentWeight=function(){let e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:0;return e<0||e>=O?(D("Invalid index"),0):t.componentData[e].componentWeight},e.setInterpolationTypeToNearest=()=>e.setInterpolationType(E.NEAREST),e.setInterpolationTypeToLinear=()=>e.setInterpolationType(E.LINEAR),e.getInterpolationTypeAsString=()=>c.m.enumToString(E,t.interpolationType)}(e,t)}var N={newInstance:c.m.newInstance(R,"vtkImageProperty"),extend:R};const{vtkDebugMacro:M}=c.m;const L={mapper:null,property:null,forceOpaque:!1,forceTranslucent:!1,bounds:[...w.Ay.INIT_BOUNDS]};function F(e,t){let n=arguments.length>2&&void 0!==arguments[2]?arguments[2]:{};Object.assign(t,L,n),_.Ay.extend(e,t,n),t.boundsMTime={},c.m.obj(t.boundsMTime),c.m.set(e,t,["property"]),c.m.setGet(e,t,["mapper","forceOpaque","forceTranslucent"]),c.m.getArray(e,t,["bounds"],6),function(e,t){t.classHierarchy.push("vtkImageSlice"),e.getActors=()=>e,e.getImages=()=>e,e.getIsOpaque=()=>{if(t.forceOpaque)return!0;if(t.forceTranslucent)return!1;t.property||e.getProperty();let n=t.property.getOpacity()>=1;return n=n&&(!t.mapper||t.mapper.getIsOpaque()),n},e.hasTranslucentPolygonalGeometry=()=>!1,e.makeProperty=N.newInstance,e.getProperty=()=>(null===t.property&&(t.property=e.makeProperty()),t.property),e.getBounds=()=>{if(null===t.mapper)return t.bounds;const n=t.mapper.getBounds();if(!n||6!==n.length)return n;if(n[0]>n[1])return t.mapperBounds=n.concat(),t.bounds=[1,-1,1,-1,1,-1],t.boundsMTime.modified(),n;if(!t.mapperBounds||!(r=[n,t.mapperBounds],r[0].map(((e,t)=>r.map((e=>e[t]))))).reduce(((e,t)=>e&&t[0]===t[1]),!0)||e.getMTime()>t.boundsMTime.getMTime()){M("Recomputing bounds..."),t.mapperBounds=n.map((e=>e)),e.computeMatrix();const r=new Float64Array(16);h.pB.transpose(r,t.matrix),w.Ay.transformBounds(n,r,t.bounds),t.boundsMTime.modified()}var r;return t.bounds},e.getBoundsForSlice=(n,r)=>{const i=t.mapper.getBoundsForSlice(n,r);if(!w.Ay.isValid(i))return i;e.computeMatrix();const o=new Float64Array(16);return h.pB.transpose(o,t.matrix),w.Ay.transformBounds(i,o)},e.getMinXBound=()=>e.getBounds()[0],e.getMaxXBound=()=>e.getBounds()[1],e.getMinYBound=()=>e.getBounds()[2],e.getMaxYBound=()=>e.getBounds()[3],e.getMinZBound=()=>e.getBounds()[4],e.getMaxZBound=()=>e.getBounds()[5],e.getMTime=()=>{let e=t.mtime;if(null!==t.property){const n=t.property.getMTime();e=n>e?n:e}return e},e.getRedrawMTime=()=>{let e=t.mtime;if(null!==t.mapper){let n=t.mapper.getMTime();e=n>e?n:e,null!==t.mapper.getInput()&&(t.mapper.getInputAlgorithm().update(),n=t.mapper.getInput().getMTime(),e=n>e?n:e)}if(null!==t.property){let n=t.property.getMTime();e=n>e?n:e,null!==t.property.getRGBTransferFunction()&&(n=t.property.getRGBTransferFunction().getMTime(),e=n>e?n:e)}return e},e.getSupportsSelection=()=>!!t.mapper&&t.mapper.getSupportsSelection()}(e,t)}var B={newInstance:c.m.newInstance(F,"vtkImageSlice"),extend:F},V=n(10364),k=n(74876),U=n(53932),G=n(7608),z=n(98039),W=n(13859),j=n(85745),H=n(68136),K=n(74657),q=n(40256),$=n(45278),X=n(69372),Y=n(74638),J=n(50134),Z=n(17791),Q=n(39537),ee=n(10056),te=n(5057),ne=n(89131),re=n(71851),ie=n(80068),oe=n(51159),ae=n(7808);function se(e){return(0,ae.A)(e)}function le(e,t){const n=se(e);return n.invert(),n.transformPoint(t)}var ce=n(36931);function ue(e,t){return se(e).transformPoint(t)}var de=n(57162);var pe=n(62596);function fe(e,t=!1){const n=e.canvas.width,r=e.canvas.height;!function(e){const{canvas:t}=e,{clientWidth:n,clientHeight:r}=t;t.width===n&&t.height===r||(t.width=n,t.height=r)}(e),void 0!==e.image&&(t||function(e,t,n){const r=e.viewport.scale,i=(0,pe.A)(e.image,e.viewport.rotation),o=Math.round(i.width*r),a=Math.round(i.height*r),s=e.viewport.translation.x,l=e.viewport.translation.y;return o===t&&a<=n||o<=t&&a===n&&0===s&&0===l}(e,n,r)?function(e){const{image:t}=e;e.viewport.scale=(0,de.A)(e.canvas,t,e.viewport.rotation).scaleFactor,e.viewport.translation.x=0,e.viewport.translation.y=0}(e):function(e,t,n){const r=e.viewport.scale,i=e.canvas.width/t,o=e.canvas.height/n,a=Math.sqrt(i*o);e.viewport.scale=a*r}(e,n,r))}var he=n(49038),me=n(26896),ge=n(36822);var ve=n(45354),ye=n(80221),be=n(85008),xe=n(88619);const Ae=G.coreLog.getLogger("RenderingEngine","StackViewport");class Ce extends ee.A{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.invert=!1,this.initialInvert=!1,this.initialTransferFunctionNodes=null,this.stackInvalidated=!1,this._publishCalibratedEvent=!1,this.updateRenderingPipeline=()=>{this._configureRenderingPipeline()},this.resize=()=>{this.useCPURendering&&this._resizeCPU()},this._resizeCPU=()=>{this._cpuFallbackEnabledElement.viewport&&fe(this._cpuFallbackEnabledElement)},this.getFrameOfReferenceUID=e=>this.getImagePlaneReferenceData(e)?.FrameOfReferenceUID,this.getCornerstoneImage=()=>this.csImage,this.createActorMapper=e=>{const t=S.newInstance();t.setInputData(e);const n=B.newInstance();n.setMapper(t);const{preferSizeOverAccuracy:r}=(0,me.D0)().rendering;return r&&t.setPreferSizeOverAccuracy(!0),e.getPointData().getScalars().getNumberOfComponents()>1&&n.getProperty().setIndependentComponents(!1),n},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=()=>{const{colormap:e,voiRange:t,VOILUTFunction:n,interpolationType:r,invert:i,voiUpdatedWithSetProperties:o}=this;return{colormap:e,voiRange:t,VOILUTFunction:n,interpolationType:r,invert:i,isComputedVOI:!o}},this.resetCameraForResize=()=>this.resetCamera({resetPan:!0,resetZoom:!0,resetToCenter:!0,suppressEvents:!0}),this.getRotationCPU=()=>{const{viewport:e}=this._cpuFallbackEnabledElement;return e.rotation},this.getRotationGPU=()=>{const{viewUp:e,viewPlaneNormal:t,flipVertical:n}=this.getCameraNoRotation(),r=n?h.eR.negate(h.eR.create(),this.initialViewUp):this.initialViewUp,i=180*h.eR.angle(r,e)/Math.PI,o=h.eR.cross(h.eR.create(),r,e);return h.eR.dot(o,t)>=0?i:(360-i)%360},this.setRotation=e=>{const t=this.getCamera();if(this.useCPURendering?this.setRotationCPU(e):this.setRotationGPU(e),this._suppressCameraModifiedEvents)return;const n={previousCamera:t,camera:this.getCamera(),element:this.element,viewportId:this.id,renderingEngineId:this.renderingEngineId};(0,X.A)(this.element,re.Events.CAMERA_MODIFIED,n)},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;const[n,r]=le(this._cpuFallbackEnabledElement,e),{origin:i,spacing:o,direction:a}=this.getImageData(),s=a.slice(0,3),l=a.slice(3,6);return h.eR.scaleAndAdd(t,i,s,n*o[0]),h.eR.scaleAndAdd(t,t,l,r*o[1]),t},this.worldToCanvasCPU=e=>{const{spacing:t,direction:n,origin:r}=this.getImageData(),i=n.slice(0,3),o=n.slice(3,6),a=h.eR.subtract(h.eR.create(),e,r),s=[h.eR.dot(a,i)/t[0],h.eR.dot(a,o)/t[1]];return ue(this._cpuFallbackEnabledElement,s)},this.canvasToWorldGPU=e=>{const t=this.getRenderer(),n=this.getVtkActiveCamera(),r=n.getClippingRange(),i=n.getDistance();n.setClippingRange(i,i+.1);const o=this.getRenderingEngine().offscreenMultiRenderWindow.getOpenGLRenderWindow(),a=o.getSize(),s=window.devicePixelRatio||1,l=[e[0]*s,e[1]*s],c=[l[0]+this.sx,l[1]+this.sy];c[1]=a[1]-c[1];const u=o.displayToWorld(c[0],c[1],0,t);return n.setClippingRange(r[0],r[1]),[u[0],u[1],u[2]]},this.worldToCanvasGPU=e=>{const t=this.getRenderer(),n=this.getVtkActiveCamera(),r=n.getClippingRange(),i=n.getDistance();n.setClippingRange(i,i+.1);const o=this.getRenderingEngine().offscreenMultiRenderWindow.getOpenGLRenderWindow(),a=o.getSize(),s=o.worldToDisplay(...e,t);s[1]=a[1]-s[1];const l=[s[0]-this.sx,s[1]-this.sy];n.setClippingRange(r[0],r[1]);const c=window.devicePixelRatio||1;return[l[0]/c,l[1]/c]},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 new Error("Custom cpu rendering pipeline should only be hit in CPU rendering mode");return this._cpuFallbackEnabledElement.image?((0,te.A)(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},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={})=>{const{resetPan:t=!0,resetZoom:n=!0}=e;return this.resetCameraCPU({resetPan:t,resetZoom:n}),!0},gpu:(e={})=>{const{resetPan:t=!0,resetZoom:n=!0}=e;return this.resetCameraGPU({resetPan:t,resetZoom:n}),!0}},canvasToWorld:{cpu:this.canvasToWorldCPU,gpu:this.canvasToWorldGPU},worldToCanvas:{cpu:this.worldToCanvasCPU,gpu:this.worldToCanvasGPU},getRenderer:{cpu:()=>this.getCPUFallbackError("getRenderer"),gpu:super.getRenderer},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=(0,me.LH)(),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(0,me.LH)()}_configureRenderingPipeline(e){this.useCPURendering=e??(0,me.LH)();for(const e in this.renderingPipelineFunctions)if(Object.prototype.hasOwnProperty.call(this.renderingPipelineFunctions,e)){const t=this.renderingPipelineFunctions[e];this[e]=this.useCPURendering?t.cpu:t.gpu}this.useCPURendering?this._resetCPUFallbackElement():this._resetGPUViewport()}_resetCPUFallbackElement(){this._cpuFallbackEnabledElement={canvas:this.canvas,renderingTools:{},transform:new ve.d,viewport:{rotation:0}}}_resetGPUViewport(){const e=this.getRenderer(),t=o.Ay.newInstance();e.setActiveCamera(t);const n=[0,0,-1];this.initialViewUp=[0,-1,0],t.setDirectionOfProjection(-n[0],-n[1],-n[2]),t.setViewUp(...this.initialViewUp),t.setParallelProjection(!0),t.setThicknessFromFocalPoint(.1),t.setFreezeFocalPoint(!0)}initializeElementDisabledHandler(){V.A.addEventListener(re.Events.ELEMENT_DISABLED,(function e(){clearTimeout(this.debouncedTimeout),V.A.removeEventListener(re.Events.ELEMENT_DISABLED,e)}))}getImageDataGPU(){const e=this.getDefaultActor();if(!e)return;if(!(0,z.e)(e))return;const{actor:t}=e,n=t.getMapper().getInputData(),r=this.csImage;return{dimensions:n.getDimensions(),spacing:n.getSpacing(),origin:n.getOrigin(),direction:n.getDirection(),get scalarData(){return r?.voxelManager.getScalarData()},imageData:t.getMapper().getInputData(),metadata:{Modality:this.modality,FrameOfReferenceUID:this.getFrameOfReferenceUID()},scaling:this.scaling,hasPixelSpacing:this.hasPixelSpacing,calibration:{...r?.calibration,...this.calibration},preScale:{...r?.preScale},voxelManager:r?.voxelManager}}getImageDataCPU(){const{metadata:e}=this._cpuFallbackEnabledElement;if(!e)return;const t=e.spacing,n=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=>{const t=this.worldToCanvasCPU(e),n=le(this._cpuFallbackEnabledElement,t);return[n[0],n[1],0]},indexToWorld:(e,t)=>{const n=ue(this._cpuFallbackEnabledElement,[e[0],e[1]]);return this.canvasToWorldCPU(n,t)}},scalarData:this.cpuImagePixelData,hasPixelSpacing:this.hasPixelSpacing,calibration:{...n?.calibration,...this.calibration},preScale:{...n?.preScale},voxelManager:n?.voxelManager}}calibrateIfNecessary(e,t){const n=k.get("calibratedPixelSpacing",e),r=this.calibration!==n,{scale:i}=n||{};return this.hasPixelSpacing=i>0||t.rowPixelSpacing>0,t.calibration=n,r?(this.calibration=n,this._publishCalibratedEvent=!0,this._calibrationEvent={scale:i,calibration:n},t):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:n,invert:r,interpolationType:i}={},o=!1){if(this.viewportStatus=this.csImage?re.ViewportStatus.PRE_RENDER:re.ViewportStatus.LOADING,this.globalDefaultProperties={colormap:this.globalDefaultProperties.colormap??e,voiRange:this.globalDefaultProperties.voiRange??t,VOILUTFunction:this.globalDefaultProperties.VOILUTFunction??n,invert:this.globalDefaultProperties.invert??r,interpolationType:this.globalDefaultProperties.interpolationType??i},void 0!==e&&this.setColormap(e),void 0!==t){const e=!0;this.setVOI(t,{suppressEvents:o,voiUpdatedWithSetProperties:e})}void 0!==n&&this.setVOILUTFunction(n,o),void 0!==r&&this.setInvertColor(r),void 0!==i&&this.setInterpolationType(i)}resetProperties(){this.cpuRenderingInvalidated=!0,this.voiUpdatedWithSetProperties=!1,this.viewportStatus=re.ViewportStatus.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(re.InterpolationType.LINEAR),!this.useCPURendering){const e=this.getTransferFunction();(0,j.setTransferFunctionNodes)(e,this.initialTransferFunctionNodes);const t=(0,j.getTransferFunctionNodes)(e).reduce(((e,t)=>(e.push(t[0],t[1],t[2],t[3]),e)),[]),n=this.getDefaultActor(),r=W.findMatchingColormap(t,n.actor);this.setColormap(r)}}resetToDefaultProperties(){this.cpuRenderingInvalidated=!0,this.viewportStatus=re.ViewportStatus.PRE_RENDER,this.fillWithBackgroundColor(),this.useCPURendering&&(this._cpuFallbackEnabledElement.renderingTools={});const e=this.getCurrentImageId(),t=this.perImageIdDefaultProperties.get(e)||this.globalDefaultProperties;let n;t.colormap?.name&&this.setColormap(t.colormap),n=null==t.voiRange?this._getVOIRangeForCurrentImage():t.voiRange,this.setVOI(n),this.setInterpolationType(re.InterpolationType.LINEAR),this.setInvertColor(!1),this.render()}_getVOIFromCache(){let e;return e=this.voiUpdatedWithSetProperties?this.voiRange:this._isCurrentImagePTPrescaled()?this._getDefaultPTPrescaledVOIRange():this._getVOIRangeForCurrentImage()??this.voiRange,e}_setPropertiesFromCache(){const e=this._getVOIFromCache(),{interpolationType:t,invert:n}=this;this.setVOI(e),this.setInterpolationType(t),this.setInvertColor(n)}getCameraCPU(){const{metadata:e,viewport:t}=this._cpuFallbackEnabledElement;if(!e)return{};const{direction:n}=e,r=n.slice(6,9).map((e=>-e));let i=n.slice(3,6).map((e=>-e));if(t.rotation){const e=h.pB.fromRotation(h.pB.create(),t.rotation*Math.PI/180,r);i=h.eR.transformMat4(h.eR.create(),i,e)}const o=[this.element.clientWidth/2,this.element.clientHeight/2],a=this.canvasToWorld(o),s=this.canvasToWorld([0,0]),l=this.canvasToWorld([0,this.element.clientHeight]);return{parallelProjection:!0,focalPoint:a,position:[0,0,0],parallelScale:h.eR.distance(s,l)/2,scale:t.scale,viewPlaneNormal:[r[0],r[1],r[2]],viewUp:[i[0],i[1],i[2]],flipHorizontal:this.flipHorizontal,flipVertical:this.flipVertical}}setCameraCPU(e){const{viewport:t,image:n}=this._cpuFallbackEnabledElement,r=this.getCameraCPU(),{focalPoint:i,parallelScale:o,scale:a,flipHorizontal:s,flipVertical:l}=e,{clientHeight:c}=this.element;if(i){const e=this.worldToCanvasCPU(i),n=le(this._cpuFallbackEnabledElement,e),o=this.worldToCanvasCPU(r.focalPoint),a=le(this._cpuFallbackEnabledElement,o),s=h.Zc.create();h.Zc.subtract(s,h.Zc.fromValues(n[0],n[1]),h.Zc.fromValues(a[0],a[1]));const l=function(e,t){const{hflip:n,vflip:r,rotation:i}=t;if(e.x*=n?-1:1,e.y*=r?-1:1,0!==i){const t=i*Math.PI/180,n=Math.cos(t),r=Math.sin(t),o=e.x*n-e.y*r,a=e.x*r+e.y*n;e.x=o,e.y=a}return e}({x:s[0],y:s[1]},t);t.translation.x-=l.x,t.translation.y-=l.y}if(o){const{rowPixelSpacing:e}=n,r=c*e*.5/o;t.scale=r,t.parallelScale=o}if(a){const{rowPixelSpacing:e}=n;t.scale=a,t.parallelScale=c*e*.5/a}void 0===s&&void 0===l||this.setFlipCPU({flipHorizontal:s,flipVertical:l}),this._cpuFallbackEnabledElement.transform=(0,ae.A)(this._cpuFallbackEnabledElement);const u={previousCamera:r,camera:this.getCamera(),element:this.element,viewportId:this.id,renderingEngineId:this.renderingEngineId};(0,X.A)(this.element,re.Events.CAMERA_MODIFIED,u)}getPanCPU(){const{viewport:e}=this._cpuFallbackEnabledElement;return[e.translation.x,e.translation.y]}setPanCPU(e){const t=this.getCameraCPU();this.setCameraCPU({...t,focalPoint:[...e.map((e=>-e)),0]})}getZoomCPU(){const{viewport:e}=this._cpuFallbackEnabledElement;return e.scale}setZoomCPU(e){const t=this.getCameraCPU();this.setCameraCPU({...t,scale:e})}setFlipCPU({flipHorizontal:e,flipVertical:t}){const{viewport:n}=this._cpuFallbackEnabledElement;void 0!==e&&(n.hflip=e,this.flipHorizontal=n.hflip),void 0!==t&&(n.vflip=t,this.flipVertical=n.vflip)}setVOILUTFunction(e,t){if(this.useCPURendering)throw new Error("VOI LUT function is not supported in CPU rendering");const n=this._getValidVOILUTFunction(e);let r=!1;this.VOILUTFunction!==n&&(r=!0),this.VOILUTFunction=n;const{voiRange:i}=this.getProperties();this.setVOI(i,{suppressEvents:t,forceRecreateLUTFunction:r})}setRotationCPU(e){const{viewport:t}=this._cpuFallbackEnabledElement;t.rotation=e}setRotationGPU(e){const t=this.getPan(this.fitToCanvasCamera),n=this.getPan(),r=h.Zc.sub([0,0],t,n);this.setPan(r,!1);const{flipVertical:i}=this.getCamera(),o=i?h.eR.negate(h.eR.create(),this.initialViewUp):this.initialViewUp;this.setCameraNoEvent({viewUp:o}),this.getVtkActiveCamera().roll(-e);const a=this.getPan(),s=this.getPan(this.fitToCanvasCamera),l=h.Zc.sub([0,0],a,s),c=h.Zc.add([0,0],t,l);this.setPan(c,!1)}setInterpolationTypeGPU(e){const t=this.getDefaultActor();if(!t)return;if(!(0,z.e)(t))return;const{actor:n}=t;n.getProperty().setInterpolationType(e),this.interpolationType=e}setInterpolationTypeCPU(e){const{viewport:t}=this._cpuFallbackEnabledElement;t.pixelReplication=e!==re.InterpolationType.LINEAR,this.interpolationType=e}setInvertColorCPU(e){const{viewport:t}=this._cpuFallbackEnabledElement;t&&(t.invert=e,this.invert=e)}setInvertColorGPU(e){const t=this.getDefaultActor();if(t&&(0,z.e)(t))if((0,z.N)(t,"vtkVolume")){const n=t.actor.getProperty().getRGBTransferFunction(0);(!this.invert&&e||this.invert&&!e)&&(0,J.A)(n),this.invert=e}else if((0,z.N)(t,"vtkImageSlice")){const n=t.actor.getProperty().getRGBTransferFunction(0);(!this.invert&&e||this.invert&&!e)&&(0,J.A)(n),this.invert=e}}setVOICPU(e,t={}){const{suppressEvents:n=!1}=t,{viewport:r,image:i}=this._cpuFallbackEnabledElement;if(!r||!i)return;if(void 0===e){const{windowWidth:t,windowCenter:n}=i,o=Array.isArray(t)?t[0]:t,a=Array.isArray(n)?n[0]:n;r.voi={windowWidth:o,windowCenter:a,voiLUTFunction:i.voiLUTFunction};const{lower:s,upper:l}=H.toLowHighRange(o,a,i.voiLUTFunction);e={lower:s,upper:l}}else{const{lower:t,upper:n}=e,{windowCenter:o,windowWidth:a}=H.toWindowLevel(t,n);r.voi||(r.voi={windowWidth:0,windowCenter:0,voiLUTFunction:i.voiLUTFunction}),r.voi.windowWidth=a,r.voi.windowCenter=o}this.voiRange=e;const o={viewportId:this.id,range:e};n||(0,X.A)(this.element,re.Events.VOI_MODIFIED,o)}getTransferFunction(){const e=this.getDefaultActor();if(!e)return;if(!(0,z.e)(e))return;return e.actor.getProperty().getRGBTransferFunction(0)}setVOIGPU(e,t={}){const{suppressEvents:n=!1,forceRecreateLUTFunction:r=!1,voiUpdatedWithSetProperties:i=!1}=t;if(e&&this.voiRange&&this.voiRange.lower===e.lower&&this.voiRange.upper===e.upper&&!r&&!this.stackInvalidated)return;const o=this.getDefaultActor();if(!o)return;if(!(0,z.e)(o))return;const a=o.actor;let s=e;if(void 0===s){const e=a.getMapper().getInputData().getPointData().getScalars().getRange();s={lower:e[0],upper:e[1]}}a.getProperty().setUseLookupTableScalarRange(!0);let l=a.getProperty().getRGBTransferFunction(0);const c=this.VOILUTFunction===re.VOILUTFunctionType.SAMPLED_SIGMOID;if(c||!l||r){l=(c?q.A:K.A)(s),this.invert&&(0,J.A)(l),a.getProperty().setRGBTransferFunction(0,l),this.initialTransferFunctionNodes=(0,j.getTransferFunctionNodes)(l)}if(c||l.setRange(s.lower,s.upper),this.voiRange=s,this.voiUpdatedWithSetProperties||(this.voiUpdatedWithSetProperties=i),n)return;const u={viewportId:this.id,range:s,VOILUTFunction:this.VOILUTFunction};(0,X.A)(this.element,re.Events.VOI_MODIFIED,u)}_addScalingToViewport(e){if(this.scaling.PT)return;const{suvbw:t,suvlbm:n,suvbsa:r}=e,i={};n&&(i.suvbwToSuvlbm=n/t),r&&(i.suvbwToSuvbsa=r/t),this.scaling.PT=i}getImageDataMetadata(e){const t=e.imageId,n=(0,U.T)(e),{numberOfComponents:r,origin:i,direction:o,dimensions:a,spacing:s,numVoxels:l,imagePixelModule:c,voiLUTFunction:u,modality:d,scalingFactor:p,calibration:f}=n;"PT"===d&&p&&this._addScalingToViewport(p),this.modality=d;const h=this._getValidVOILUTFunction(u);this.VOILUTFunction=h,this.calibration=f;let m=this._getImagePlaneModule(t);return this.useCPURendering||(m=this.calibrateIfNecessary(t,m)),{bitsAllocated:c.bitsAllocated,numberOfComponents:r,origin:i,direction:o,dimensions:a,spacing:s,numVoxels:l,imagePlaneModule:m,imagePixelModule:c}}matchImagesForOverlay(e,t){return(e=>{const n=k.get(re.MetadataModules.IMAGE_PLANE,t),r=k.get(re.MetadataModules.IMAGE_PLANE,e),i=n.imageOrientationPatient,o=r.imageOrientationPatient;if(i&&o){if((0,Y.n4)(n.imageOrientationPatient,r.imageOrientationPatient)){const t=n.imagePositionPatient,i=r.imagePositionPatient;if(t&&i){if((0,Y.n4)(t,i)){const t=n.rows,i=n.columns,o=r.rows,a=r.columns;if(t===o&&i===a)return e}}}}else{const t=n.rows,i=n.columns,o=r.rows,a=r.columns;if(t===o&&i===a)return e}})(e)}getImagePlaneReferenceData(e=this.getCurrentImageIdIndex()){const t=this.imageIds[e];if(!t)return;const n=k.get(re.MetadataModules.IMAGE_PLANE,t);if(!n)return;const{imagePositionPatient:r,frameOfReferenceUID:i}=n;let{rowCosines:o,columnCosines:a}=n;o||=[1,0,0],a||=[0,1,0];return{FrameOfReferenceUID:i,viewPlaneNormal:h.eR.cross([0,0,0],a,o),cameraFocalPoint:r,referencedImageId:t,sliceIndex:e}}_getCameraOrientation(e){c