UNPKG

modified-dicom-pacs

Version:

A modified version of DICOM PACS implementation

1 lines 1.54 MB
(globalThis.webpackChunk=globalThis.webpackChunk||[]).push([[416],{6203:(e,t,n)=>{"use strict";n.d(t,{A:()=>I});var r=n(37452),o=n(12882),i=n(29853),a=n(44753),s=n(13320),l=n(88903),c=n(50002),d=n(21432),u=n(51884),g=n(71702),p=n(82041),m=n(35678),h=n(90601),f=n(46820),v=n(11512),y=n(65280),T=n(58237),C=n(51539),b=n(22350);class w extends v.A{constructor(e){if(super(e),this.useCPURendering=!1,this.useNativeDataType=!1,this.perVolumeIdDefaultProperties=new Map,this.viewportProperties={},this.setRotation=e=>{const t=this.getPan(this.fitToCanvasCamera),n=this.getPan(),r=this.getCamera(),o=a.Zc.sub([0,0],t,n);this.setPan(o,!1);const{flipVertical:i}=this.getCamera(),s=i?a.eR.negate([0,0,0],this.initialViewUp):this.initialViewUp;this.setCameraNoEvent({viewUp:s}),this.rotateCamera(e);const l=this.getPan(),d=this.getPan(this.fitToCanvasCamera),u=a.Zc.sub([0,0],l,d),g=a.Zc.add([0,0],t,u);if(this.setPan(g,!1),this._suppressCameraModifiedEvents)return;const p={previousCamera:r,camera:this.getCamera(),element:this.element,viewportId:this.id,renderingEngineId:this.renderingEngineId,rotation:e};(0,m.triggerEvent)(this.element,c.Events.CAMERA_MODIFIED,p),this.viewportProperties.rotation=e},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:o,slabThickness:i,rotation:a,preset:l}=this.viewportProperties,c=this.getActors().map((e=>{const t=e.actor,n=e.uid;if(!s.Ay.getVolume(n))return null;const r=t.getProperty().getRGBTransferFunction(0),[o,i]="SIGMOID"===this.viewportProperties?.VOILUTFunction?(0,m.getVoiFromSigmoidRGBTransferFunction)(r):r.getRange();return{volumeId:n,voiRange:{lower:o,upper:i}}})).filter(Boolean),d=e?c.find((t=>t.volumeId===e))?.voiRange:c[0]?.voiRange,u=this.getColormap(e);return{colormap:e&&u?u:t,voiRange:d,VOILUTFunction:n,interpolationType:r,invert:o,slabThickness:i,rotation:a,preset:l}},this.getColormap=e=>{const t=this._getApplicableVolumeActor(e);if(!t)return;const{volumeActor:n}=t,r=n.getProperty().getRGBTransferFunction(0),{nodes:o}=r.getState(),i=o.reduce(((e,t)=>(e.push(t.x,t.r,t.g,t.b),e)),[]);return(0,C.findMatchingColormap)(i,n)},this.getRotation=()=>{const{viewUp:e,viewPlaneNormal:t,flipVertical:n}=this.getCamera(),r=n?a.eR.negate([0,0,0],this.initialViewUp):this.initialViewUp;if(!r)return 0;const o=180*a.eR.angle(r,e)/Math.PI,i=a.eR.cross([0,0,0],r,e);return a.eR.dot(i,t)>=0?o:(360-o)%360},this.getFrameOfReferenceUID=()=>this._FrameOfReferenceUID,this.canvasToWorld=e=>{const t=this.getVtkActiveCamera();t.setIsPerformingCoordinateTransformation?.(!0);const n=this.getRenderer(),r=this.getRenderingEngine().offscreenMultiRenderWindow.getOpenGLRenderWindow(),o=r.getSize(),i=window.devicePixelRatio||1,a=[e[0]*i,e[1]*i],s=[a[0]+this.sx,a[1]+this.sy];s[1]=o[1]-s[1];const l=r.displayToWorld(s[0],s[1],0,n);return t.setIsPerformingCoordinateTransformation?.(!1),[l[0],l[1],l[2]]},this.worldToCanvas=e=>{const t=this.getVtkActiveCamera();t.setIsPerformingCoordinateTransformation?.(!0);const n=this.getRenderer(),r=this.getRenderingEngine().offscreenMultiRenderWindow.getOpenGLRenderWindow(),o=r.getSize(),i=r.worldToDisplay(...e,n);i[1]=o[1]-i[1];const a=[i[0]-this.sx,i[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,m.actorIsA)(e,"vtkVolume"))).some((({uid:t})=>{const n=s.Ay.getVolume(t);if(!n||!n.imageIds)return!1;return n.imageIds.map(m.imageIdToURI).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,g.LH)(),this.useNativeDataType=this._shouldUseNativeDataType(),this.useCPURendering)throw new Error("VolumeViewports cannot be used whilst CPU Fallback Rendering is enabled.");const t=this.getRenderer(),n=y.Ay.newInstance();switch(t.setActiveCamera(n),this.type){case d.A.ORTHOGRAPHIC:case d.A.VOLUME_3D:n.setParallelProjection(!0);break;case d.A.PERSPECTIVE:n.setParallelProjection(!1);break;default:throw new Error(`Unrecognized viewport type: ${this.type}`)}this.initializeVolumeNewImageEventDispatcher()}static get useCustomRenderingPipeline(){return!1}applyViewOrientation(e){const{viewPlaneNormal:t,viewUp:n}=this._getOrientationVectors(e),r=this.getVtkActiveCamera();r.setDirectionOfProjection(-t[0],-t[1],-t[2]),r.setViewUpFrom(n),this.initialViewUp=n,this.resetCamera()}initializeVolumeNewImageEventDispatcher(){const e=function(e){const{viewportId:t}=e.detail;if(t!==this.id||this.isDisabled)return;if(!this.getImageData())return;(0,f.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),u.A.removeEventListener(c.Events.ELEMENT_DISABLED,t),(0,f.g)(r)}.bind(this);this.element.removeEventListener(c.Events.CAMERA_MODIFIED,e),this.element.addEventListener(c.Events.CAMERA_MODIFIED,e),u.A.addEventListener(c.Events.ELEMENT_DISABLED,t)}resetVolumeViewportClippingRange(){const e=this.getVtkActiveCamera();e.getParallelProjection()?e.setClippingRange(-l.RENDERING_DEFAULTS.MAXIMUM_RAY_DISTANCE,l.RENDERING_DEFAULTS.MAXIMUM_RAY_DISTANCE):e.setClippingRange(l.RENDERING_DEFAULTS.MINIMUM_SLAB_THICKNESS,l.RENDERING_DEFAULTS.MAXIMUM_RAY_DISTANCE)}setVOILUTFunction(e,t,n){-1===Object.values(c.VOILUTFunctionType).indexOf(e)&&(e=c.VOILUTFunctionType.LINEAR);const{voiRange:r}=this.getProperties();this.setVOI(r,t,n),this.viewportProperties.VOILUTFunction=e}setColormap(e,t,n){const i=this._getApplicableVolumeActor(t);if(!i)return;const{volumeActor:a}=i,s=r.Ay.newInstance();let l=m.colormap.getColormap(e.name);const{name:d}=e;if(l||(l=o.A.getPresetByName(d)),!l)throw new Error(`Colormap ${e} not found`);const u=a.getProperty().getRGBTransferFunction(0).getRange();if(s.applyColorMap(l),s.setMappingRange(u[0],u[1]),a.getProperty().setRGBTransferFunction(0,s),this.viewportProperties.colormap=e,!n){const n={viewportId:this.id,colormap:e,volumeId:t};(0,m.triggerEvent)(this.element,c.Events.COLORMAP_MODIFIED,n)}}setOpacity(e,t){const n=this._getApplicableVolumeActor(t);if(!n)return;const{volumeActor:r}=n,o=i.Ay.newInstance();if("number"==typeof e.opacity){const t=r.getProperty().getRGBTransferFunction(0).getRange();o.addPoint(t[0],e.opacity),o.addPoint(t[1],e.opacity)}else e.opacity.forEach((({opacity:e,value:t})=>{o.addPoint(t,e)}));r.getProperty().setScalarOpacity(0,o),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 o=r.volumeId,i=this._getOrCreateColorTransferFunction(o);if((0,m.invertRgbTransferFunction)(i),this.viewportProperties.invert=e,!n){const e={...this.getVOIModifiedEventDetail(o),invertStateChanged:!0};(0,m.triggerEvent)(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:o,invert:i}=this.getProperties(e);return{viewportId:this.id,range:{lower:n[0],upper:n[1]},volumeId:t.volumeId,VOILUTFunction:o,colormap:r,invert:i}}_getOrCreateColorTransferFunction(e){const t=this._getApplicableVolumeActor(e);if(!t)return null;const{volumeActor:n}=t,o=n.getProperty().getRGBTransferFunction(0);if(o)return o;const i=r.Ay.newInstance();return n.getProperty().setRGBTransferFunction(0,i),i}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:o}=r,i=r.volumeId;let a=e;if(void 0===a){const e=o.getMapper().getInputData().getPointData().getScalars().getRange();a={lower:e[0],upper:e[1]}}const{VOILUTFunction:s}=this.getProperties(i);if(s===c.VOILUTFunctionType.SAMPLED_SIGMOID){const e=(0,m.createSigmoidRGBTransferFunction)(a);o.getProperty().setRGBTransferFunction(0,e)}else{const{lower:e,upper:t}=a;o.getProperty().getRGBTransferFunction(0).setRange(e,t)}if(!n){const e={...this.getVOIModifiedEventDetail(i)};(0,m.triggerEvent)(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);return!1!==e?.forFrameOfReference&&(t.volumeId=this.getVolumeId(e)),{...t,sliceIndex:this.getCurrentImageIdIndex()}}isReferenceViewable(e,t){if(!super.isReferenceViewable(e,t))return!1;if(t?.withNavigation)return!0;const n=this.getCurrentImageIdIndex(),{sliceIndex:r}=e;return Array.isArray(r)?r[0]<=n&&n<=r[1]:void 0===r||r===n}setProperties({voiRange:e,VOILUTFunction:t,invert:n,colormap:r,preset:o,interpolationType:i,slabThickness:a,rotation:s}={},l,c=!1){null==this.globalDefaultProperties&&this.setDefaultProperties({voiRange:e,VOILUTFunction:t,invert:n,colormap:r,preset:o,slabThickness:a,rotation:s}),r?.name&&this.setColormap(r,l,c),null!=r?.opacity&&this.setOpacity(r,l),void 0!==e&&this.setVOI(e,l,c),void 0!==i&&this.setInterpolationType(i),void 0!==t&&this.setVOILUTFunction(t,l,c),void 0!==n&&this.viewportProperties.invert!==n&&this.setInvert(n,l,c),void 0!==o&&this.setPreset(o,l,c),void 0!==a&&(this.setSlabThickness(a),this.viewportProperties.slabThickness=a),void 0!==s&&this.setRotation(s)}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.rotation&&this.setRotation(t.rotation),this.render()}setPreset(e,t,n){const r=this._getApplicableVolumeActor(t);if(!r)return;const{volumeActor:o}=r;let i=e;"string"==typeof i&&(i=l.VIEWPORT_PRESETS.find((t=>t.name===e))),i&&((0,m.applyPreset)(o,i),this.viewportProperties.preset=i,this.render(),n||(0,m.triggerEvent)(this.element,c.Events.PRESET_MODIFIED,{viewportId:this.id,volumeId:r.volumeId,actor:o,presetName:i.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`);const o=r.metadata.FrameOfReferenceUID;await this._isValidVolumeInputArray(e,o),this._FrameOfReferenceUID=o;const i=[];for(let t=0;t<e.length;t++){const{volumeId:r,actorUID:o,slabThickness:a}=e[t],s=await(0,h.Ku)(e[t],this.element,this.id,n,this.useNativeDataType),l=o||r;i.push({uid:l,actor:s,slabThickness:a,referenceId:r})}this._setVolumeActors(i),this.viewportStatus=c.ViewportStatus.PRE_RENDER,this.initializeColorTransferFunction(e),(0,m.triggerEvent)(this.element,c.Events.VOLUME_VIEWPORT_NEW_VOLUME,{viewportId:this.id,volumeActors:i}),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 o=[];await this._isValidVolumeInputArray(e,this._FrameOfReferenceUID);for(let t=0;t<e.length;t++){const{volumeId:r,visibility:i,actorUID:a,slabThickness:s}=e[t],l=await(0,h.Ku)(e[t],this.element,this.id,n,this.useNativeDataType);!1===i&&l.setVisibility(!1);const c=a||r;o.push({uid:c,actor:l,slabThickness:s,referenceId:r})}this.addActors(o),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||(this.initialTransferFunctionNodes=(0,b.getTransferFunctionNodes)(n))}_getApplicableVolumeActor(e){if(void 0!==e&&!this.getActor(e))return;const t=this.getActors();if(!t.length)return;let n;return e&&(n=this.getActor(e)?.actor),n||(n=t[0].actor,e=t[0].uid),{volumeActor:n,volumeId:e}}async _isValidVolumeInputArray(e,t){const n=e.length;for(let r=1;r<n;r++){const n=e[r],o=await(0,p.loadVolume)(n.volumeId);if(!o)throw new Error(`imageVolume with id: ${o.volumeId} does not exist`);if(t!==o.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.getActors().some((t=>t.uid===e))}getImageData(e){const t=this.getDefaultActor();if(!t)return;const{uid:n}=t;e=e??n;const r=this.getActor(e);if(!(0,m.actorIsA)(r,"vtkVolume"))return;const o=r.actor,i=s.Ay.getVolume(e),a=o.getMapper().getInputData();return{dimensions:a.getDimensions(),spacing:a.getSpacing(),origin:a.getOrigin(),direction:a.getDirection(),scalarData:a.getPointData().getScalars().isDeleted()?null:a.getPointData().getScalars().getData(),imageData:o.getMapper().getInputData(),metadata:{Modality:i?.metadata?.Modality},scaling:i?.scaling,hasPixelSpacing:!0}}_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,m.actorIsA)(t,"vtkVolume"))return;const{actor:n,uid:r}=t,o=n.getMapper().getInputData(),i=s.Ay.getVolume(r),{dimensions:a}=i,l=(0,T.A)(o,e),c=l[2]*a[0]*a[1]+l[1]*a[0]+l[0];return i.getScalarData()[c]}getVolumeId(e){if(!e?.volumeId){const e=this.getActors();if(!e)return;return e.find((e=>"vtkVolume"===e.actor.getClassName()))?.uid}return e.volumeId}getReferenceId(e={}){let{volumeId:t,sliceIndex:n}=e;if(!t){const e=this.getActors();if(!e)return;t=e.find((e=>"vtkVolume"===e.actor.getClassName()))?.uid}n??=this.getCurrentImageIdIndex();const{viewPlaneNormal:r,focalPoint:o}=this.getCamera(),i=t.indexOf("?")>-1?"&":"?";return`volumeId:${t}${i}sliceIndex=${n}&viewPlaneNormal=${r.join(",")}&focalPoint=${o.join(",")}`}}const I=w},4584:(e,t,n)=>{"use strict";n.d(t,{A:()=>ue});var r=n(45128),o=n(51250),i=n(7119),a=n(37452),s=n(12882),l=n(94664),c=n(50906),d=n(42204),u=n(68680);const g={slice:0,customDisplayExtent:[0,0,0,0,0,0],useCustomExtents:!1,backgroundColor:[0,0,0,1]};var p={extend:function(e,t){let n=arguments.length>2&&void 0!==arguments[2]?arguments[2]:{};Object.assign(t,g,n),d.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,u.F)())}(e,t)}},m=n(44753),h=n(84441);function f(e,t,n){const r=n.getCurrentImage(),o=r.getExtent(),i=[o[0],o[2],o[4]],{ijkMode:a}=n.getClosestIJKAxis();let s=n.isA("vtkImageArrayMapper")?n.getSubSlice():n.getSlice();a!==n.getSlicingMode()&&(s=n.getSliceAtPosition(s)),i[a]+=s;const l=[0,0,0];r.indexToWorld(i,l),i[a]+=1;const c=[0,0,0];r.indexToWorld(i,c),c[0]-=l[0],c[1]-=l[1],c[2]-=l[2],m.eR.normalize(c,c);const d=h.Ay.intersectWithLine(e,t,l,c);if(d.intersection){const e=d.x,t=[0,0,0];return r.worldToIndex(e,t),{t:d.t,absoluteIJK:t}}return null}var v=n(11762);const{staticOffsetAPI:y,otherStaticMethods:T}=v.A,{SlicingMode:C}=l.A;function b(e,t){function n(){let n;switch(t.slicingMode){case C.X:n=0;break;case C.Y:n=1;break;case C.Z:n=2;break;default:return void(t.closestIJKAxis={ijkMode:t.slicingMode,flip:!1})}const r=e.getCurrentImage().getDirection(),o=(0,u.S)(r);let i=0;for(;i<3&&0===o[n+3*i];++i);const a=o[n+3*i]<0;t.closestIJKAxis={ijkMode:i,flip:a}}t.classHierarchy.push("vtkImageMapper"),e.getSliceAtPosition=n=>{const r=e.getCurrentImage();let o;if(3===n.length)o=n;else if(Number.isFinite(n)){const e=r.getBounds();switch(t.slicingMode){case C.X:o=[n,(e[3]+e[2])/2,(e[5]+e[4])/2];break;case C.Y:o=[(e[1]+e[0])/2,n,(e[5]+e[4])/2];break;case C.Z:o=[(e[1]+e[0])/2,(e[3]+e[2])/2,n]}}const i=[0,0,0];r.worldToIndex(o,i);const a=r.getExtent(),{ijkMode:s}=e.getClosestIJKAxis();let l=0;switch(s){case C.I:l=(0,u.C)(i[0],a[0],a[1]);break;case C.J:l=(0,u.C)(i[1],a[2],a[3]);break;case C.K:l=(0,u.C)(i[2],a[4],a[5]);break;default:return 0}return l},e.setSliceFromCamera=n=>{const r=n.getFocalPoint();switch(t.slicingMode){case C.I:case C.J:case C.K:{const t=e.getSliceAtPosition(r);e.setSlice(t)}break;case C.X:e.setSlice(r[0]);break;case C.Y:e.setSlice(r[1]);break;case C.Z:e.setSlice(r[2])}},e.setXSlice=t=>{e.setSlicingMode(C.X),e.setSlice(t)},e.setYSlice=t=>{e.setSlicingMode(C.Y),e.setSlice(t)},e.setZSlice=t=>{e.setSlicingMode(C.Z),e.setSlice(t)},e.setISlice=t=>{e.setSlicingMode(C.I),e.setSlice(t)},e.setJSlice=t=>{e.setSlicingMode(C.J),e.setSlice(t)},e.setKSlice=t=>{e.setSlicingMode(C.K),e.setSlice(t)},e.getSlicingModeNormal=()=>{const n=[0,0,0],r=e.getCurrentImage().getDirection();switch(t.slicingMode){case C.X:n[0]=1;break;case C.Y:n[1]=1;break;case C.Z:n[2]=1;break;case C.I:(0,u.R)(r,[1,0,0],n);break;case C.J:(0,u.R)(r,[0,1,0],n);break;case C.K:(0,u.R)(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!==C.NONE||!e.getCurrentImage()||n(),t.closestIJKAxis),e.getBounds=()=>{const n=e.getCurrentImage();if(!n)return(0,u.F)();if(!t.useCustomExtents)return n.getBounds();const r=t.customDisplayExtent.slice(),{ijkMode:o}=e.getClosestIJKAxis();let i=t.slice;switch(o!==t.slicingMode&&(i=e.getSliceAtPosition(t.slice)),o){case C.I:r[0]=i,r[1]=i;break;case C.J:r[2]=i,r[3]=i;break;case C.K:r[4]=i,r[5]=i}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 o=e.getCurrentImage();if(!o)return(0,u.F)();const i=o.getSpatialExtent(),{ijkMode:a}=e.getClosestIJKAxis();let s=n;switch(a!==t.slicingMode&&(s=e.getSliceAtPosition(n)),a){case C.I:i[0]=s-r,i[1]=s+r;break;case C.J:i[2]=s-r,i[3]=s+r;break;case C.K:i[4]=s-r,i[5]=s+r}return o.extentToBounds(i)},e.intersectWithLineForPointPicking=(t,n)=>function(e,t,n){const r=f(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=f(e,t,n);if(r){const e=n.getCurrentImage().getExtent(),t=r.absoluteIJK,o=[Math.floor(t[0]),Math.floor(t[1]),Math.floor(t[2])];if(o[0]<e[0]||o[0]>e[1]-1||o[1]<e[2]||o[1]>e[3]-1||o[2]<e[4]||o[2]>(e[5]?e[5]-1:e[5]))return null;const i=[t[0]-o[0],t[1]-o[1],t[2]-o[2]];return{t:r.t,ijk:o,pCoords:i}}return null}(t,n,e),e.getCurrentImage=()=>e.getInputData()}const w={slicingMode:C.NONE,closestIJKAxis:{ijkMode:C.NONE,flip:!1},renderToRectangle:!1,sliceAtFocalPoint:!1,preferSizeOverAccuracy:!1};function I(e,t){let n=arguments.length>2&&void 0!==arguments[2]?arguments[2]:{};Object.assign(t,w,n),p.extend(e,t,n),c.m.get(e,t,["slicingMode"]),c.m.setGet(e,t,["closestIJKAxis","renderToRectangle","sliceAtFocalPoint","preferSizeOverAccuracy"]),v.A.implementCoincidentTopologyMethods(e,t),b(e,t)}var A={newInstance:c.m.newInstance(I,"vtkImageMapper"),extend:I,...y,...T,...l.A},S=n(52662),E=n(85942),x=n(93828);const{InterpolationType:R}=x.A,{vtkErrorMacro:P}=c.m,O=4;const M={independentComponents:!1,interpolationType:R.LINEAR,colorWindow:255,colorLevel:127.5,ambient:1,diffuse:0,opacity:1,useLookupTableScalarRange:!1,useLabelOutline:!1,labelOutlineThickness:[1],labelOutlineOpacity:1};function D(e,t){let n=arguments.length>2&&void 0!==arguments[2]?arguments[2]:{};if(Object.assign(t,M,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,o=arguments.length>1&&void 0!==arguments[1]?arguments[1]:null;return Number.isInteger(n)||(o=n,r=0),t.componentData[r].rGBTransferFunction!==o&&(t.componentData[r].rGBTransferFunction=o,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,o=arguments.length>1&&void 0!==arguments[1]?arguments[1]:null;return Number.isInteger(n)||(o=n,r=0),t.componentData[r].piecewiseFunction!==o&&(t.componentData[r].piecewiseFunction=o,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 P("Invalid index"),!1;const o=Math.min(1,Math.max(0,r));return t.componentData[n].componentWeight!==o&&(t.componentData[n].componentWeight=o,e.modified(),!0)},e.getComponentWeight=function(){let e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:0;return e<0||e>=O?(P("Invalid index"),0):t.componentData[e].componentWeight},e.setInterpolationTypeToNearest=()=>e.setInterpolationType(R.NEAREST),e.setInterpolationTypeToLinear=()=>e.setInterpolationType(R.LINEAR),e.getInterpolationTypeAsString=()=>c.m.enumToString(R,t.interpolationType)}(e,t)}var _={newInstance:c.m.newInstance(D,"vtkImageProperty"),extend:D};const{vtkDebugMacro:L}=c.m;const V={mapper:null,property:null,bounds:[...S.Ay.INIT_BOUNDS]};function N(e,t){let n=arguments.length>2&&void 0!==arguments[2]?arguments[2]:{};Object.assign(t,V,n),E.Ay.extend(e,t,n),t.boundsMTime={},c.m.obj(t.boundsMTime),c.m.set(e,t,["property"]),c.m.setGet(e,t,["mapper"]),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=_.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()){L("Recomputing bounds..."),t.mapperBounds=n.map((e=>e)),e.computeMatrix();const r=new Float64Array(16);m.pB.transpose(r,t.matrix),S.Ay.transformBounds(n,r,t.bounds),t.boundsMTime.modified()}var r;return t.bounds},e.getBoundsForSlice=(n,r)=>{const o=t.mapper.getBoundsForSlice(n,r);if(!S.Ay.isValid(o))return o;e.computeMatrix();const i=new Float64Array(16);return m.pB.transpose(i,t.matrix),S.Ay.transformBounds(o,i)},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(N,"vtkImageSlice"),extend:N},U=n(51884),k=n(55692),F=n(48463),G=n.n(F),W=n(35678),z=n(11512),H=n(59693),j=n(49892),K=n(50002),$=n(79220),q=n(775),Y=n(3248);function X(e){return(0,Y.A)(e)}function Z(e,t){const n=X(e);return n.invert(),n.transformPoint(t)}var J=n(14873);function Q(e,t){return X(e).transformPoint(t)}var ee=n(7834);var te=n(11284);function ne(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,o=(0,te.A)(e.image,e.viewport.rotation),i=Math.round(o.width*r),a=Math.round(o.height*r),s=e.viewport.translation.x,l=e.viewport.translation.y;return i===t&&a<=n||i<=t&&a===n&&0===s&&0===l}(e,n,r)?function(e){const{image:t}=e;e.viewport.scale=(0,ee.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,o=e.canvas.width/t,i=e.canvas.height/n,a=Math.sqrt(o*i);e.viewport.scale=a*r}(e,n,r))}var re=n(13320),oe=n(71702),ie=n(71090),ae=n(34801),se=n(22350);var le=n(18714),ce=n(51539);class de extends z.A{constructor(e){super(e),this.imagesLoader=this,this.perImageIdDefaultProperties=new Map,this.voiUpdatedWithSetProperties=!1,this.invert=!1,this.initialInvert=!1,this.initialTransferFunctionNodes=null,this.stackInvalidated=!1,this._publishCalibratedEvent=!1,this.useNativeDataType=!1,this.updateRenderingPipeline=()=>{this._configureRenderingPipeline()},this.resize=()=>{this.useCPURendering&&this._resizeCPU()},this._resizeCPU=()=>{this._cpuFallbackEnabledElement.viewport&&ne(this._cpuFallbackEnabledElement)},this.getFrameOfReferenceUID=()=>{const e=this.getCurrentImageId();if(!e)return;const t=k.get("imagePlaneModule",e);return t?t.frameOfReferenceUID:void 0},this.getCornerstoneImage=()=>this.csImage,this.createActorMapper=e=>{const t=A.newInstance();t.setInputData(e);const n=B.newInstance();n.setMapper(t);const{preferSizeOverAccuracy:r}=(0,oe.D0)().rendering;return r&&t.setPreferSizeOverAccuracy(!0),e.getPointData().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,rotation:this.getRotation()}},this.getProperties=()=>{const{colormap:e,voiRange:t,VOILUTFunction:n,interpolationType:r,invert:o,voiUpdatedWithSetProperties:i}=this;return{colormap:e,voiRange:t,VOILUTFunction:n,interpolationType:r,invert:o,rotation:this.getRotation(),isComputedVOI:!i}},this.getRotationCPU=()=>{const{viewport:e}=this._cpuFallbackEnabledElement;return e.rotation},this.getRotationGPU=()=>{const{viewUp:e,viewPlaneNormal:t,flipVertical:n}=this.getCamera(),r=n?m.eR.negate(m.eR.create(),this.initialViewUp):this.initialViewUp,o=180*m.eR.angle(r,e)/Math.PI,i=m.eR.cross(m.eR.create(),r,e);return m.eR.dot(i,t)>=0?o:(360-o)%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,rotation:e};(0,W.triggerEvent)(this.element,K.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]=Z(this._cpuFallbackEnabledElement,e),{origin:o,spacing:i,direction:a}=this.getImageData(),s=a.slice(0,3),l=a.slice(3,6);return m.eR.scaleAndAdd(t,o,s,n*i[0]),m.eR.scaleAndAdd(t,t,l,r*i[1]),t},this.worldToCanvasCPU=e=>{const{spacing:t,direction:n,origin:r}=this.getImageData(),o=n.slice(0,3),i=n.slice(3,6),a=m.eR.subtract(m.eR.create(),e,r),s=[m.eR.dot(a,o)/t[0],m.eR.dot(a,i)/t[1]];return Q(this._cpuFallbackEnabledElement,s)},this.canvasToWorldGPU=e=>{const t=this.getRenderer(),n=this.getVtkActiveCamera(),r=n.getClippingRange(),o=n.getDistance();n.setClippingRange(o,o+.1);const i=this.getRenderingEngine().offscreenMultiRenderWindow.getOpenGLRenderWindow(),a=i.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 d=i.displayToWorld(c[0],c[1],0,t);return n.setClippingRange(r[0],r[1]),[d[0],d[1],d[2]]},this.worldToCanvasGPU=e=>{const t=this.getRenderer(),n=this.getVtkActiveCamera(),r=n.getClippingRange(),o=n.getDistance();n.setClippingRange(o,o+.1);const i=this.getRenderingEngine().offscreenMultiRenderWindow.getOpenGLRenderWindow(),a=i.getSize(),s=i.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=()=>this.imageIds[this.currentImageIdIndex],this.hasImageId=e=>this.imageIds.includes(e),this.hasImageURI=e=>{const t=this.imageIds;for(let n=0;n<t.length;n++)if((0,W.imageIdToURI)(t[n])===e)return!0;return!1},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,j.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=!0,t=!0)=>(this.resetCameraCPU(e,t),!0),gpu:(e=!0,t=!0)=>(this.resetCameraGPU(e,t),!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,oe.LH)(),this.useNativeDataType=this._shouldUseNativeDataType(),this._configureRenderingPipeline(),this.useCPURendering?this._resetCPUFallbackElement():this._resetGPUViewport(),this.imageIds=[],this.currentImageIdIndex=0,this.targetImageIdIndex=0,this.cameraFocalPointOnRender=[0,0,0],this.resetCamera(),this.initializeElementDisabledHandler()}setUseCPURendering(e){this.useCPURendering=e,this._configureRenderingPipeline(e)}static get useCustomRenderingPipeline(){return(0,oe.LH)()}_configureRenderingPipeline(e){this.useNativeDataType=this._shouldUseNativeDataType(),this.useCPURendering=e??(0,oe.LH)();for(const[e,t]of Object.entries(this.renderingPipelineFunctions))this[e]=this.useCPURendering?t.cpu:t.gpu;this.useCPURendering?this._resetCPUFallbackElement():this._resetGPUViewport()}_resetCPUFallbackElement(){this._cpuFallbackEnabledElement={canvas:this.canvas,renderingTools:{},transform:new le.d,viewport:{rotation:0}}}_resetGPUViewport(){const e=this.getRenderer(),t=i.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(){U.A.addEventListener(K.Events.ELEMENT_DISABLED,(function e(){clearTimeout(this.debouncedTimeout),U.A.removeEventListener(K.Events.ELEMENT_DISABLED,e)}))}getImageDataGPU(){const e=this.getDefaultActor();if(!e)return;if(!(0,W.isImageActor)(e))return;const{actor:t}=e,n=t.getMapper().getInputData();return{dimensions:n.getDimensions(),spacing:n.getSpacing(),origin:n.getOrigin(),direction:n.getDirection(),scalarData:n.getPointData().getScalars().getData(),imageData:t.getMapper().getInputData(),metadata:{Modality:this.modality},scaling:this.scaling,hasPixelSpacing:this.hasPixelSpacing,calibration:{...this.csImage.calibration,...this.calibration},preScale:{...this.csImage.preScale}}}getImageDataCPU(){const{metadata:e}=this._cpuFallbackEnabledElement,t=e.spacing;return{dimensions:e.dimensions,spacing:t,origin:e.origin,direction:e.direction,metadata:{Modality:this.modality},scaling:this.scaling,imageData:{getDirection:()=>e.direction,getDimensions:()=>e.dimensions,getScalarData:()=>this.cpuImagePixelData,getSpacing:()=>t,worldToIndex:e=>{const t=this.worldToCanvasCPU(e),n=Z(this._cpuFallbackEnabledElement,t);return[n[0],n[1],0]},indexToWorld:(e,t)=>{const n=Q(this._cpuFallbackEnabledElement,[e[0],e[1]]);return this.canvasToWorldCPU(n,t)}},scalarData:this.cpuImagePixelData,hasPixelSpacing:this.hasPixelSpacing,calibration:{...this.csImage.calibration,...this.calibration},preScale:{...this.csImage.preScale}}}buildMetadata(e){const t=e.imageId,{pixelRepresentation:n,bitsAllocated:r,bitsStored:o,highBit:i,photometricInterpretation:a,samplesPerPixel:s}=k.get("imagePixelModule",t),{windowWidth:l,windowCenter:c,voiLUTFunction:d}=e,{modality:u}=k.get("generalSeriesModule",t),g=k.get("scalingModule",t),p=k.get(K.MetadataModules.CALIBRATION,t);"PT"===u&&g&&this._addScalingToViewport(g),this.modality=u;const m=this._getValidVOILUTFunction(d);this.VOILUTFunction=m,this.calibration=p;let h=this._getImagePlaneModule(t);return this.useCPURendering||(h=this.calibrateIfNecessary(t,h)),{imagePlaneModule:h,imagePixelModule:{bitsAllocated:r,bitsStored:o,samplesPerPixel:s,highBit:i,photometricInterpretation:a,pixelRepresentation:n,windowWidth:l,windowCenter:c,modality:u,voiLUTFunction:m}}}calibrateIfNecessary(e,t){const n=k.get("calibratedPixelSpacing",e),r=this.calibration!==n,{scale:o}=n||{};return this.hasPixelSpacing=o>0||t.rowPixelSpacing>0,t.calibration=n,r?(this.calibration=n,this._publishCalibratedEvent=!0,this._calibrationEvent={scale:o,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:o,rotation:i}={},a=!1){if(this.viewportStatus=this.csImage?K.ViewportStatus.PRE_RENDER:K.ViewportStatus.LOADING,null==this.globalDefaultProperties&&this.setDefaultProperties({colormap:e,voiRange:t,VOILUTFunction:n,invert:r,interpolationType:o,rotation:i}),void 0!==e&&this.setColormap(e),void 0!==t){const e=!0;this.setVOI(t,{suppressEvents:a,voiUpdatedWithSetProperties:e})}void 0!==n&&this.setVOILUTFunction(n,a),void 0!==r&&this.setInvertColor(r),void 0!==o&&this.setInterpolationType(o),void 0!==i&&this.getRotation()!==i&&this.setRotation(i)}resetProperties(){this.cpuRenderingInvalidated=!0,this.voiUpdatedWithSetProperties=!1,this.viewportStatus=K.ViewportStatus.PRE_RENDER,this.fillWithBackgroundColor(),this.useCPURendering&&(this._cpuFallbackEnabledElement.renderingTools={}),this._resetProperties(),this.render()}_resetProperties(){let e;e=this._isCurrentImagePTPrescaled()?this._getDefaultPTPrescaledVOIRange():this._getVOIRangeForCurrentImage(),this.setVOI(e),this.setInvertColor(this.initialInvert),this.setInterpolationType(K.InterpolationType.LINEAR),0!==this.getRotation()&&this.setRotation(0);const t=this.getTransferFunction();(0,se.setTransferFunctionNodes)(t,this.initialTransferFunctionNodes);const n=(0,se.getTransferFunctionNodes)(t).reduce(((e,t)=>(e.push(t[0],t[1],t[2],t[3]),e)),[]),r=this.getDefaultActor(),o=(0,ce.findMatchingColormap)(n,r.actor);this.setColormap(o)}resetToDefaultProperties(){this.cpuRenderingInvalidated=!0,this.viewportStatus=K.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),0!==this.getRotation()&&this.setRotation(0),this.setInterpolationType(K.InterpolationType.LINEAR),this.setInvertColor(!1),this.render()}_setPropertiesFromCache(){const{interpolationType:e,invert:t}=this;let n;n=this.voiUpdatedWithSetProperties?this.voiRange:this._isCurrentImagePTPrescaled()?this._getDefaultPTPrescaledVOIRange():this._getVOIRangeForCurrentImage()??this.voiRange,this.setVOI(n),this.setInterpolationType(e),this.setInvertColor(t)}getCameraCPU(){const{metadata:e,viewport:t}=this._cpuFallbackEnabledElement,{direction:n}=e,r=n.slice(6,9).map((e=>-e));let o=n.slice(3,6).map((e=>-e));if(t.rotation){const e=m.pB.fromRotation(m.pB.create(),t.rotation*Math.PI/180,r);o=m.eR.transformMat4(m.eR.create(),o,e)}const i=[this.element.clientWidth/2,this.element.clientHeight/2],a=this.canvasToWorld(i),s=this.canvasToWorld([0,0]),l=this.canvasToWorld([0,this.element.clientHeight]);return{parallelProjection:!0,focalPoint:a,position:[0,0,0],parallelScale:m.eR.distance(s,l)/2,scale:t.scale,viewPlaneNormal:[r[0],r[1],r[2]],viewUp:[o[0],o[1],o[2]],flipHorizontal:this.flipHorizontal,flipVertical:this.flipVertical}}setCameraCPU(e){const{viewport:t,image:n}=this._cpuFallbackEnabledElement,r=this.getCameraCPU(),{focalPoint:o,parallelScale:i,scale:a,flipHorizontal:s,flipVertical:l}=e,{clientHeight:c}=this.element;if(o){const e=this.worldToCanvasCPU(o),n=Z(this._cpuFallbackEnabledElement,e),i=this.worldToCanvasCPU(r.focalPoint),a=Z(this._cpuFallbackEnabledElement,i),s=m.Zc.create();m.Zc.subtract(s,m.Zc.fromValues(n[0],n[1]),m.Zc.fromValues(a[0],a[1]));const l=function(e,t){const{hflip:n,vflip:r,rotation:o}=t;if(e.x*=n?-1:1,e.y*=r?-1:1,0!==o){const t=o*Math.PI/180,n=Math.cos(t),r=Math.sin(t),i=e.x*n-e.y*r,a=e.x*r+e.y*n;e.x=i,e.y=a}return e}({x:s[0],y:s[1]},t);t.translation.x-=l.x,t.translation.y-=l.y}if(i){const{rowPixelSpacing:e}=n,r=c*e*.5/i;t.scale=r,t.parallelScale=i}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,Y.A)(this._cpuFallbackEnabledElement);const d={previousCamera:r,camera:this.getCamera(),element:this.element,viewportId:this.id,renderingEngineId:this.renderingEngineId,rotation:this.getRotation()};(0,W.triggerEvent)(this.element,K.Events.CAMERA_MODIFIED,d)}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:o}=this.getProperties();this.setVOI(o,{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=m.Zc.sub([0,0],t,n);this.setPan(r,!1);const{flipVertical:o}=this.getCamera(),i=o?m.eR.negate(m.eR.create(),this.initialViewUp):this.initialViewUp;this.setCameraNoEvent({viewUp:i}),this.getVtkActiveCamera().roll(-e);const a=this.getPan(),s=this.getPan(this.fitToCanvasCamera),l=m.Zc.sub([0,0],a,s),c=m.Zc.add([0,0],t,l);this.setPan(c,!1)}setInterpolationTypeGPU(e){const t=this.getDefaultActor();if(!t)return;if(!(0,W.isImageActor)(t))return;const{actor:n}=t;n.getProperty().setInterpolationType(e),this.interpolationType=e}setInterpolationTypeCPU(e){const{viewport:t}=this._cpuFallbackEnabledElement;t.pixelReplication=e!==K.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,W.isImageActor)(t))if((0,W.actorIsA)(t,"vtkVolume")){const n=t.actor.getProperty().getRGBTransferFunction(0);(!this.invert&&e||this.invert&&!e)&&(0,W.invertRgbTransferFunction)(n),this.invert=e}else if((0,W.actorIsA)(t,"vtkImageSlice")){const n=t.actor.getProperty().getRGBTransferFunction(0);(!this.invert&&e||this.invert&&!e)&&(0,W.invertRgbTransferFunction)(n),this.invert=e}}setVOICPU(e,t={}){const{suppressEvents:n=!1}=t,{viewport:r,image:o}=this._cpuFallbackEnabledElement;if(!r||!o)return;if(void 0===e){const{windowWidth:t,windowCenter:n}=o,i=Array.isArray(t)?t[0]:t,a=Array.isArray(n)?n[0]:n;r.voi={windowWidth:i,windowCenter:a};const{lower:s,upper:l}=W.windowLevel.toLowHighRange(i,a);e={lower:s,upper:l}}else{const{lower:t,upper:n}=e,{windowCenter:o,windowWidth:i}=W.windowLevel.toWindowLevel(t,n);r.voi||(r.voi={windowWidth:0,windowCenter:0}),r.voi.windowWidth=i,r.voi.windowCenter=o}this.voiRange=e;const i={viewportId:this.id,range:e};n||(0,W.triggerEvent)(this.element,K.Events.VOI_MODIFIED,i)}getTransferFunction(){const e=this.getDefaultActor();if(!e)return;if(!(0,W.isImageActor)(e))return;return e.actor.getProperty().getRGBTransferFunction(0)}setVOIGPU(e,t={}){const{suppressEvents:n=!1,forceRecreateLUTFunction:r=!1,voiUpdatedWithSetProperties:o=!1}=t;if(e&&this.voiRange&&this.voiRange.lower===e.lower&&this.voiRange.upper===e.upper&&!r&&!this.stackInvalidated)return;const i=this.getDefaultActor();if(!i)return;if(!(0,W.isImageActor)(i))return;const a=i.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===K.VOILUTFunctionType.SAMPLED_SIGMOID;if(c||!l||r){l=(c?W.createSigmoidRGBTransferFunction:ae.A)(s),this.invert&&(0,W.invertRgbTransferFunction)(l),a.getProperty().setRGBTransferFunction(0,l),this.initialTransferFunctionNodes=(0,se.getTransferFunctionNodes)(l)}if(c||l.setRange(s.lower,s.upper),this.voiRange=s,this.voiUpdatedWithSetProperties||(this.voiUpdatedWithSetProperties=o),n)return;const d={viewportId:this.id,range:s,VOILUTFunction:this.VOILUTFunction};(0,W.triggerEvent)(this.element,K.Events.VOI_MODIFIED,d)}_addScalingToViewport(e){if(this.scaling.PT)return;const{suvbw:t,suvlbm:n,suvbsa:r}=e,o={};n&&(o.suvbwToSuvlbm=n/t),r&&(o.suvbwToSuvbsa=r/t),this.scaling.PT=o}_getNumCompsFromPhotometricInterpretation(e){let t=1;return"RGB"!==e&&-1===e.indexOf("YBR")&&"PALETTE COLOR"!==e||(t=3),t}getImageDataMetadata(e){const{imagePlaneModule:t,imagePixelModule:n}=this.buildMetadata(e);let r,o;r=t.rowCosines,o=t.columnCosines,null!=r&&null!=o||(r=[1,0,0],o=[0,1,0]);const i=m.eR.fromValues(r[0],r[1],r[2]),a=m.eR.fromValues(o[0],o[1],o[2]),s=m.eR.create();m.eR.cross(s,i,a);let l=t.imagePositionPatient;null==l&&(l=[0,0,0]);const c=t.columnPixelSpacing||e.columnPixelSpacing,d=t.rowPixelSpacing||e.rowPixelSpacing,u=e.columns,g=e.rows,p=e.numComps||this._getNumCompsFromPhotometricInterpretation(n.photometricInterpretation);return{bitsAllocated:n.bitsAllocated,numComps:p,origin:l,direction:[...i,...a,...s],dimensions:[u,g,1],spacing:[c,d,1],numVoxels:u*g*1,imagePlaneModule:t,imagePixelModule:n}}_getCameraOrientation(e){const t=e.slice(6,9).map((e=>-e)),n=e.slice(3,6).map((e=>-e));return{viewPlaneNormal:[t[0],t[1],t[2]],viewUp:[n[0],n[1],n[2]]}}createVTKImageData({origin:e,direction:t,dimensions:n,spacing:i,numComps:a,pixelArray:s}){const l=new s.constructor(s.length),c=r.Ay.newInstance({name:"Pixels",numberOfComponents:a,values:l}),d=o.Ay.newInstance();return d.setDimensions(n),d.setSpacing(i),d.setDirection(t),d.setOrigin(e),d.getPointData().setScalars(c),d}_createVTKImageData({origin:e,direction:t,dimensions:n,spacing:r,numComps:o,pixelArray:i}){this._imageData=this.createVTKImageData({origin:e,direction:t,dimensions:n,spacing:r,numComps:o,pixelArray:i})}async setStack(e,t=0){this._throwIfDestroyed(),this.imageIds=e,this.currentImageIdIndex=t,this.targetImageIdIndex=t;const n=k.get(W.imageRetrieveMetadataProvider.IMAGE_RETRIEVE_CONFIGURATION,e[t],"stack");this.imagesLoader=n?(n.create||ie.Ke)(n):this,this.stackInvalidated=!0,this.flipVertical=!1,this.flipHorizontal=!1,this.voiRange=null,this.interpolationType=K.InterpolationType.LINEAR,this.invert=!1,this.viewportStatus=K.ViewportStatus.LOADING,this.fillWithBackgroundColor(),this.useCPURendering&&(this._cpuFallbackEnabledElement.renderingTools={},delete this._cpuFallbackEnabledElement.viewport.colormap);const r=await this._setImageIdIndex(t),o={imageIds:e,viewportId:this.id,element:this.element,currentImageIdIndex:t};return(0,W.triggerEvent)(U.A,K.Events.STACK_VIEWPORT_NEW_STACK,o),r}_throwIfDestroyed(){if(this.isDisabled)throw new 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;const[n,r]=t.getSpacing(),[o,i]=t.getDimensions(),a=this._getImagePlaneModule(e.imageId),s=t.getDirection(),l=s.slice(0,3),c=s.slice(3,6),d=t.getPointData().getScalars().getDataType(),u=(0,W.isEqual)(n,e.columnPixelSpacing),g=(0,W.isEqual)(r,e.rowPixelSpacing);return(u||null===e.columnPixelSpacing&&1===n)&&(g||null===e.rowPixelSpacing&&1===r)&&o===e.columns&&i===e.rows&&(0,W.isEqual)(a.rowCosines,l)&&(0,W.isEqual)(a.columnCosines,c)&&(!this.useNativeDataType||d===e.getPixelData().constructor.name)}_updateVTKImageDataFromCornerstoneImage(e){let t=this._getImagePlaneModule(e.imageId).imagePositionPatient;null==t&&(t=[0,0,0]),this._imageData.setOrigin(t),(0,W.updateVT