diff --git a/extensions/cornerstone-dicom-sr/package.json b/extensions/cornerstone-dicom-sr/package.json index 35230bd1c..6e3676364 100644 --- a/extensions/cornerstone-dicom-sr/package.json +++ b/extensions/cornerstone-dicom-sr/package.json @@ -44,9 +44,9 @@ }, "dependencies": { "@babel/runtime": "^7.20.13", - "@cornerstonejs/adapters": "^1.11.4", - "@cornerstonejs/core": "^1.11.4", - "@cornerstonejs/tools": "^1.11.4", + "@cornerstonejs/adapters": "^1.13.2", + "@cornerstonejs/core": "^1.13.2", + "@cornerstonejs/tools": "^1.13.2", "classnames": "^2.3.2" } } diff --git a/extensions/cornerstone/package.json b/extensions/cornerstone/package.json index 2231ddbd1..d98ab0be2 100644 --- a/extensions/cornerstone/package.json +++ b/extensions/cornerstone/package.json @@ -36,7 +36,7 @@ "@cornerstonejs/codec-libjpeg-turbo-8bit": "^1.2.2", "@cornerstonejs/codec-openjpeg": "^1.2.2", "@cornerstonejs/codec-openjph": "^2.4.2", - "@cornerstonejs/dicom-image-loader": "^1.11.4", + "@cornerstonejs/dicom-image-loader": "^1.13.2", "@ohif/core": "3.7.0-beta.64", "@ohif/ui": "3.7.0-beta.64", "dcmjs": "^0.29.6", @@ -52,10 +52,10 @@ }, "dependencies": { "@babel/runtime": "^7.20.13", - "@cornerstonejs/adapters": "^1.11.4", - "@cornerstonejs/core": "^1.11.4", - "@cornerstonejs/streaming-image-volume-loader": "^1.11.4", - "@cornerstonejs/tools": "^1.11.4", + "@cornerstonejs/adapters": "^1.13.2", + "@cornerstonejs/core": "^1.13.2", + "@cornerstonejs/streaming-image-volume-loader": "^1.13.2", + "@cornerstonejs/tools": "^1.13.2", "@kitware/vtk.js": "27.3.1", "html2canvas": "^1.4.1", "lodash.debounce": "4.0.8", diff --git a/extensions/cornerstone/src/commandsModule.ts b/extensions/cornerstone/src/commandsModule.ts index 6c6b52284..8f9e928e6 100644 --- a/extensions/cornerstone/src/commandsModule.ts +++ b/extensions/cornerstone/src/commandsModule.ts @@ -18,6 +18,7 @@ import toggleStackImageSync from './utils/stackSync/toggleStackImageSync'; import { getFirstAnnotationSelected } from './utils/measurementServiceMappings/utils/selection'; import getActiveViewportEnabledElement from './utils/getActiveViewportEnabledElement'; import { CornerstoneServices } from './types'; +import ImageOverlayViewerTool from './tools/ImageOverlayViewerTool'; function commandsModule({ servicesManager, @@ -266,7 +267,7 @@ function commandsModule({ toolbarService.recordInteraction(props); }, - setToolActive: ({ toolName, toolGroupId = null }) => { + setToolActive: ({ toolName, toolGroupId = null, toggledState }) => { if (toolName === 'Crosshairs') { const activeViewportToolGroup = toolGroupService.getToolGroup(null); @@ -327,6 +328,14 @@ function commandsModule({ toolGroup.setToolPassive(activeToolName); } } + + // If there is a toggle state, then simply set the enabled/disabled state without + // setting the tool active. + if (toggledState != null) { + toggledState ? toolGroup.setToolEnabled(toolName) : toolGroup.setToolDisabled(toolName); + return; + } + // Set the new toolName to be active toolGroup.setToolActive(toolName, { bindings: [ @@ -547,17 +556,13 @@ function commandsModule({ toggledState, }); }, - toggleReferenceLines: ({ toggledState }) => { + setSourceViewportForReferenceLinesTool: ({ toggledState }) => { const { activeViewportId } = viewportGridService.getState(); const viewportInfo = cornerstoneViewportService.getViewportInfo(activeViewportId); const viewportId = viewportInfo.getViewportId(); const toolGroup = toolGroupService.getToolGroupForViewport(viewportId); - if (!toggledState) { - toolGroup.setToolDisabled(ReferenceLinesTool.toolName); - } - toolGroup.setToolConfiguration( ReferenceLinesTool.toolName, { @@ -565,7 +570,6 @@ function commandsModule({ }, true // overwrite ); - toolGroup.setToolEnabled(ReferenceLinesTool.toolName); }, storePresentation: ({ viewportId }) => { cornerstoneViewportService.storePresentation({ viewportId }); @@ -692,8 +696,8 @@ function commandsModule({ toggleStackImageSync: { commandFn: actions.toggleStackImageSync, }, - toggleReferenceLines: { - commandFn: actions.toggleReferenceLines, + setSourceViewportForReferenceLinesTool: { + commandFn: actions.setSourceViewportForReferenceLinesTool, }, storePresentation: { commandFn: actions.storePresentation, diff --git a/extensions/cornerstone/src/initCornerstoneTools.js b/extensions/cornerstone/src/initCornerstoneTools.js index 9549b17f9..d6515a508 100644 --- a/extensions/cornerstone/src/initCornerstoneTools.js +++ b/extensions/cornerstone/src/initCornerstoneTools.js @@ -28,6 +28,7 @@ import { } from '@cornerstonejs/tools'; import CalibrationLineTool from './tools/CalibrationLineTool'; +import ImageOverlayViewerTool from './tools/ImageOverlayViewerTool'; export default function initCornerstoneTools(configuration = {}) { CrosshairsTool.isAnnotation = false; @@ -58,6 +59,7 @@ export default function initCornerstoneTools(configuration = {}) { addTool(ReferenceLinesTool); addTool(CalibrationLineTool); addTool(TrackballRotateTool); + addTool(ImageOverlayViewerTool); // Modify annotation tools to use dashed lines on SR const annotationStyle = { @@ -99,6 +101,7 @@ const toolNames = { ReferenceLines: ReferenceLinesTool.toolName, CalibrationLine: CalibrationLineTool.toolName, TrackballRotateTool: TrackballRotateTool.toolName, + ImageOverlayViewer: ImageOverlayViewerTool.toolName, }; export { toolNames }; diff --git a/extensions/cornerstone/src/tools/ImageOverlayViewerTool.tsx b/extensions/cornerstone/src/tools/ImageOverlayViewerTool.tsx new file mode 100644 index 000000000..2d402df5f --- /dev/null +++ b/extensions/cornerstone/src/tools/ImageOverlayViewerTool.tsx @@ -0,0 +1,247 @@ +import { metaData } from '@cornerstonejs/core'; +import { utilities } from '@cornerstonejs/core'; +import { AnnotationDisplayTool, drawing } from '@cornerstonejs/tools'; +import { guid } from '@ohif/core/src/utils'; + +interface CachedStat { + color: number[]; // [r, g, b, a] + overlays: { + // ...overlayPlaneModule + _id: string; + type: 'G' | 'R'; // G for Graphics, R for ROI + color?: number[]; // Rendered color [r, g, b, a] + dataUrl?: string; // Rendered image in Data URL expression + }[]; +} + +/** + * Image Overlay Viewer tool is not a traditional tool that requires user interactin. + * But it is used to display Pixel Overlays. And it will provide toggling capability. + * + * The documentation for Overlay Plane Module of DICOM can be found in [C.9.2 of + * Part-3 of DICOM standard](https://dicom.nema.org/medical/dicom/2018b/output/chtml/part03/sect_C.9.2.html) + * + * Image Overlay rendered by this tool can be toggled on and off using + * toolGroup.setToolEnabled() and toolGroup.setToolDisabled() + */ +class ImageOverlayViewerTool extends AnnotationDisplayTool { + static toolName = 'ImageOverlayViewer'; + private _cachedOverlayMetadata: Map = new Map(); + private _cachedStats: { [key: string]: CachedStat } = {}; + + constructor( + toolProps = {}, + defaultToolProps = { + supportedInteractionTypes: [], + configuration: { + fillColor: [255, 127, 127, 255], + }, + } + ) { + super(toolProps, defaultToolProps); + } + + onSetToolDisabled = (): void => { + this._cachedStats = {}; + this._cachedOverlayMetadata = new Map(); + }; + + renderAnnotation = (enabledElement, svgDrawingHelper) => { + const { viewport } = enabledElement; + + const imageId = this.getReferencedImageId(viewport); + if (!imageId) { + return; + } + + const overlays = + this._cachedOverlayMetadata.get(imageId) ?? + metaData.get('overlayPlaneModule', imageId)?.overlays; + + // no overlays + if (!overlays?.length) { + return; + } + + this._cachedOverlayMetadata.set(imageId, overlays); + + this._getCachedStat(imageId, overlays, this.configuration.fillColor).then(cachedStat => { + cachedStat.overlays.forEach(overlay => { + this._renderOverlay(enabledElement, svgDrawingHelper, overlay); + }); + }); + + return true; + }; + + /** + * Render to DOM + * + * @param enabledElement + * @param svgDrawingHelper + * @param overlayData + * @returns + */ + private _renderOverlay(enabledElement, svgDrawingHelper, overlayData) { + const { viewport } = enabledElement; + const imageId = this.getReferencedImageId(viewport); + if (!imageId) { + return; + } + + // Decide the rendering position of the overlay image on the current canvas + const { _id, columns: width, rows: height, x, y } = overlayData; + const overlayTopLeftWorldPos = utilities.imageToWorldCoords(imageId, [ + x - 1, // Remind that top-left corner's (x, y) is be (1, 1) + y - 1, + ]); + const overlayTopLeftOnCanvas = viewport.worldToCanvas(overlayTopLeftWorldPos); + const overlayBottomRightWorldPos = utilities.imageToWorldCoords(imageId, [width, height]); + const overlayBottomRightOnCanvas = viewport.worldToCanvas(overlayBottomRightWorldPos); + + // add image to the annotations svg layer + const svgns = 'http://www.w3.org/2000/svg'; + const svgNodeHash = `image-overlay-${_id}`; + const existingImageElement = svgDrawingHelper.getSvgNode(svgNodeHash); + + const attributes = { + 'data-id': svgNodeHash, + width: overlayBottomRightOnCanvas[0] - overlayTopLeftOnCanvas[0], + height: overlayBottomRightOnCanvas[1] - overlayTopLeftOnCanvas[1], + x: overlayTopLeftOnCanvas[0], + y: overlayTopLeftOnCanvas[1], + href: overlayData.dataUrl, + }; + + if ( + isNaN(attributes.x) || + isNaN(attributes.y) || + isNaN(attributes.width) || + isNaN(attributes.height) + ) { + console.warn('Invalid rendering attribute for image overlay', attributes['data-id']); + return false; + } + + if (existingImageElement) { + drawing.setAttributesIfNecessary(attributes, existingImageElement); + svgDrawingHelper.setNodeTouched(svgNodeHash); + } else { + const newImageElement = document.createElementNS(svgns, 'image'); + drawing.setNewAttributesIfValid(attributes, newImageElement); + svgDrawingHelper.appendNode(newImageElement, svgNodeHash); + } + return true; + } + + private async _getCachedStat( + imageId: string, + overlayMetadata: any[], + color: number[] + ): Promise { + if (this._cachedStats[imageId] && this._isSameColor(this._cachedStats[imageId].color, color)) { + return this._cachedStats[imageId]; + } + + const overlays = await Promise.all( + overlayMetadata + .filter(overlay => overlay.pixelData) + .map(async (overlay, idx) => { + let pixelData = null; + if (overlay.pixelData.Value) { + pixelData = overlay.pixelData.Value; + } else if (overlay.pixelData.retrieveBulkData) { + pixelData = await overlay.pixelData.retrieveBulkData(); + } + + if (!pixelData) { + return; + } + + const dataUrl = this._renderOverlayToDataUrl( + { width: overlay.columns, height: overlay.rows }, + color, + pixelData + ); + + return { + ...overlay, + _id: guid(), + dataUrl, // this will be a data url expression of the rendered image + color, + }; + }) + ); + + this._cachedStats[imageId] = { + color: color, + overlays: overlays.filter(overlay => overlay), + }; + + return this._cachedStats[imageId]; + } + + /** + * compare two RGBA expression of colors. + * + * @param color1 + * @param color2 + * @returns + */ + private _isSameColor(color1: number[], color2: number[]) { + return ( + color1 && + color2 && + color1[0] === color2[0] && + color1[1] === color2[1] && + color1[2] === color2[2] && + color1[3] === color2[3] + ); + } + + /** + * pixelData of overlayPlane module is an array of bits corresponding + * to each of the underlying pixels of the image. + * Let's create pixel data from bit array of overlay data + * + * @param pixelDataRaw + * @param color + * @returns + */ + private _renderOverlayToDataUrl({ width, height }, color, pixelDataRaw) { + const pixelDataView = new DataView(pixelDataRaw); + const totalBits = width * height; + + const canvas = document.createElement('canvas'); + canvas.width = width; + canvas.height = height; + + const ctx = canvas.getContext('2d'); + ctx.clearRect(0, 0, width, height); // make it transparent + ctx.globalCompositeOperation = 'copy'; + + const imageData = ctx.getImageData(0, 0, width, height); + const data = imageData.data; + for (let i = 0, bitIdx = 0, byteIdx = 0; i < totalBits; i++) { + if (pixelDataView.getUint8(byteIdx) & (1 << bitIdx)) { + data[i * 4] = color[0]; + data[i * 4 + 1] = color[1]; + data[i * 4 + 2] = color[2]; + data[i * 4 + 3] = color[3]; + } + + // next bit, byte + if (bitIdx >= 7) { + bitIdx = 0; + byteIdx++; + } else { + bitIdx++; + } + } + ctx.putImageData(imageData, 0, 0); + + return canvas.toDataURL(); + } +} + +export default ImageOverlayViewerTool; diff --git a/extensions/measurement-tracking/package.json b/extensions/measurement-tracking/package.json index 69beb1d99..4d55f5651 100644 --- a/extensions/measurement-tracking/package.json +++ b/extensions/measurement-tracking/package.json @@ -30,8 +30,8 @@ "start": "yarn run dev" }, "peerDependencies": { - "@cornerstonejs/core": "^1.11.4", - "@cornerstonejs/tools": "^1.11.4", + "@cornerstonejs/core": "^1.13.2", + "@cornerstonejs/tools": "^1.13.2", "@ohif/core": "3.7.0-beta.64", "@ohif/extension-cornerstone-dicom-sr": "3.7.0-beta.64", "@ohif/ui": "3.7.0-beta.64", diff --git a/modes/basic-dev-mode/src/index.js b/modes/basic-dev-mode/src/index.js index 62fb879b4..f1e250ea0 100644 --- a/modes/basic-dev-mode/src/index.js +++ b/modes/basic-dev-mode/src/index.js @@ -84,6 +84,7 @@ function modeFactory({ modeConfiguration }) { { toolName: toolNames.CalibrationLine }, ], // enabled + enabled: [{ toolName: toolNames.ImageOverlayViewer }], // disabled }; diff --git a/modes/longitudinal/src/initToolGroups.js b/modes/longitudinal/src/initToolGroups.js index 6d9a9ead5..cdc17c024 100644 --- a/modes/longitudinal/src/initToolGroups.js +++ b/modes/longitudinal/src/initToolGroups.js @@ -38,6 +38,7 @@ function initDefaultToolGroup(extensionManager, toolGroupService, commandsManage { toolName: toolNames.CalibrationLine }, ], // enabled + enabled: [{ toolName: toolNames.ImageOverlayViewer }], // disabled disabled: [{ toolName: toolNames.ReferenceLines }], }; diff --git a/modes/longitudinal/src/toolbarButtons.js b/modes/longitudinal/src/toolbarButtons.js index 92de37e89..821d59c6b 100644 --- a/modes/longitudinal/src/toolbarButtons.js +++ b/modes/longitudinal/src/toolbarButtons.js @@ -15,7 +15,7 @@ const { windowLevelPresets } = defaults; * @param {*} icon * @param {*} label */ -function _createButton(type, id, icon, label, commands, tooltip, uiType) { +function _createButton(type, id, icon, label, commands, tooltip, uiType, isActive) { return { id, icon, @@ -24,6 +24,7 @@ function _createButton(type, id, icon, label, commands, tooltip, uiType) { commands, tooltip, uiType, + isActive, }; } @@ -432,14 +433,41 @@ const toolbarButtons = [ 'ReferenceLines', 'tool-referenceLines', // change this with the new icon 'Reference Lines', + // two commands for the reference lines tool: + // - the first to set the source viewport for the tool when it is enabled + // - the second to toggle the tool [ { - commandName: 'toggleReferenceLines', + commandName: 'setSourceViewportForReferenceLinesTool', commandOptions: {}, context: 'CORNERSTONE', }, + { + commandName: 'setToolActive', + commandOptions: { + toolName: 'ReferenceLines', + }, + context: 'CORNERSTONE', + }, ] ), + _createToggleButton( + 'ImageOverlayViewer', + 'toggle-dicom-overlay', + 'Image Overlay', + [ + { + commandName: 'setToolActive', + commandOptions: { + toolName: 'ImageOverlayViewer', + }, + context: 'CORNERSTONE', + }, + ], + 'Image Overlay', + null, + true + ), _createToolButton( 'StackScroll', 'tool-stack-scroll', diff --git a/platform/app/package.json b/platform/app/package.json index 2826f93ba..49cfa5862 100644 --- a/platform/app/package.json +++ b/platform/app/package.json @@ -50,7 +50,7 @@ "@cornerstonejs/codec-libjpeg-turbo-8bit": "^1.2.2", "@cornerstonejs/codec-openjpeg": "^1.2.2", "@cornerstonejs/codec-openjph": "^2.4.2", - "@cornerstonejs/dicom-image-loader": "^1.11.4", + "@cornerstonejs/dicom-image-loader": "^1.13.2", "@ohif/core": "3.7.0-beta.64", "@ohif/extension-cornerstone": "3.7.0-beta.64", "@ohif/extension-cornerstone-dicom-rt": "3.7.0-beta.64", diff --git a/platform/core/package.json b/platform/core/package.json index 5e3d96a61..4e3283f73 100644 --- a/platform/core/package.json +++ b/platform/core/package.json @@ -35,7 +35,7 @@ "@cornerstonejs/codec-libjpeg-turbo-8bit": "^1.2.2", "@cornerstonejs/codec-openjpeg": "^1.2.2", "@cornerstonejs/codec-openjph": "^2.4.2", - "@cornerstonejs/dicom-image-loader": "^1.11.4", + "@cornerstonejs/dicom-image-loader": "^1.13.2", "@ohif/ui": "3.7.0-beta.64", "cornerstone-math": "0.1.9", "dicom-parser": "^1.8.21" diff --git a/platform/core/src/services/ToolBarService/ToolbarService.ts b/platform/core/src/services/ToolBarService/ToolbarService.ts index 7f25801e6..9684c2a00 100644 --- a/platform/core/src/services/ToolBarService/ToolbarService.ts +++ b/platform/core/src/services/ToolBarService/ToolbarService.ts @@ -265,11 +265,26 @@ export default class ToolbarService extends PubSubService { if (!this.buttons[button.id]) { this.buttons[button.id] = button; } + this._setTogglesForButtonItems(button.props?.items); }); this._broadcastEvent(this.EVENTS.TOOL_BAR_MODIFIED, {}); } + _setTogglesForButtonItems(buttonItems) { + if (!buttonItems) { + return; + } + + buttonItems.forEach(buttonItem => { + if (buttonItem.type === 'toggle') { + this.state.toggles[buttonItem.id] = buttonItem.isActive; + } else { + this._setTogglesForButtonItems(buttonItem.props?.items); + } + }); + } + /** * * @param {*} btn diff --git a/platform/ui/src/assets/icons/toggle-dicom-overlay.svg b/platform/ui/src/assets/icons/toggle-dicom-overlay.svg new file mode 100644 index 000000000..7b016d95e --- /dev/null +++ b/platform/ui/src/assets/icons/toggle-dicom-overlay.svg @@ -0,0 +1,8 @@ + + + toggle-dicom-overlay + + + + + diff --git a/platform/ui/src/components/Icon/getIcon.js b/platform/ui/src/components/Icon/getIcon.js index 0c973f051..58f4dee08 100644 --- a/platform/ui/src/components/Icon/getIcon.js +++ b/platform/ui/src/components/Icon/getIcon.js @@ -80,6 +80,7 @@ import notificationsError from './../../assets/icons/notifications-error.svg'; import notificationsSuccess from './../../assets/icons/notifications-success.svg'; /** Tools */ +import toggleDicomOverlay from './../../assets/icons/toggle-dicom-overlay.svg'; import toolZoom from './../../assets/icons/tool-zoom.svg'; import toolCapture from './../../assets/icons/tool-capture.svg'; import toolLayout from './../../assets/icons/tool-layout.svg'; @@ -209,6 +210,7 @@ const ICONS = { 'notifications-warning': notificationsWarning, /** Tools */ + 'toggle-dicom-overlay': toggleDicomOverlay, 'tool-zoom': toolZoom, 'tool-capture': toolCapture, 'tool-layout': toolLayout, diff --git a/yarn.lock b/yarn.lock index 17c1a1aad..c166b8a67 100644 --- a/yarn.lock +++ b/yarn.lock @@ -1376,10 +1376,10 @@ resolved "https://registry.yarnpkg.com/@colors/colors/-/colors-1.5.0.tgz#bb504579c1cae923e6576a4f5da43d25f97bdbd9" integrity sha512-ooWCrlZP11i8GImSjTHYHLkvFDP48nS4+204nGb1RiX/WXYHmJA2III9/e2DWVabCESdW7hBAEzHRqUn9OUVvQ== -"@cornerstonejs/adapters@^1.11.4": - version "1.11.4" - resolved "https://registry.yarnpkg.com/@cornerstonejs/adapters/-/adapters-1.11.4.tgz#b318fe3180b7ceda5537420e8cd4e8d2ddac68f3" - integrity sha512-Qb7qfg0HD06yvpu8KgXkstvmrTUIbFft2HWblUbLe0gxO3ze+1LE2ZAT2qXyvC+nfchPTH2Ybo1D3yBxO7CPdQ== +"@cornerstonejs/adapters@^1.13.2": + version "1.13.2" + resolved "https://registry.yarnpkg.com/@cornerstonejs/adapters/-/adapters-1.13.2.tgz#4c7a40b652a6c6c9572186852f0c87a8121479bf" + integrity sha512-YpMBWLIGbLIVwzQ8gtOE0fE0KW5gH8DGEdXUV0gvKGjsygsKFIdTw3xDC6RJr5n/cpVT0pJHXNhk2bbpiZmfkQ== dependencies: "@babel/runtime-corejs2" "^7.17.8" buffer "^6.0.3" @@ -1428,43 +1428,43 @@ resolved "https://registry.yarnpkg.com/@cornerstonejs/codec-openjph/-/codec-openjph-2.4.2.tgz#e96721d56f6ec96f7f95c16321d88cc8467d8d81" integrity sha512-lgdvBvvNezleY+4pIe2ceUsJzlZe/0PipdeubQ3vZZOz3xxtHHMR1XFCl4fgd8gosR8COHuD7h6q+MwgrwBsng== -"@cornerstonejs/core@^1.11.4": - version "1.11.4" - resolved "https://registry.yarnpkg.com/@cornerstonejs/core/-/core-1.11.4.tgz#035a950a04641a103924ab93b30f257fd884fc8c" - integrity sha512-5kS6xgBimkfjjvd/o+6o4c0NvYVw2lCGDvow3hC5V7aCd6Pn8eo2BaU45QJ8y0A0NJ9xmtr37yb3v8+7lfkGSw== +"@cornerstonejs/core@^1.13.2": + version "1.13.2" + resolved "https://registry.yarnpkg.com/@cornerstonejs/core/-/core-1.13.2.tgz#15c144ca4da9db257e96fe9f95643b4eb8f707d1" + integrity sha512-w2ZonXmOoE8GcDQ0/mY1m/P9CYORH51kh9e26sTQ3CmrvHmAtHI7se4oqcDcUKvSdsA0luw1XKR+TqBR0VcAqQ== dependencies: "@kitware/vtk.js" "27.3.1" detect-gpu "^5.0.22" gl-matrix "^3.4.3" lodash.clonedeep "4.5.0" -"@cornerstonejs/dicom-image-loader@^1.11.4": - version "1.11.4" - resolved "https://registry.yarnpkg.com/@cornerstonejs/dicom-image-loader/-/dicom-image-loader-1.11.4.tgz#4daa4f91e9a5f23fa8f39ebb3c73dcc148184b68" - integrity sha512-Hw5XS+SN7VF/C70CzYd8alK/91SccSbNArVc9erwrBP4EmLWOj9XmKMNiV7KXS7d60G0nEAzCKo+e0wQWOvxWA== +"@cornerstonejs/dicom-image-loader@^1.13.2": + version "1.13.2" + resolved "https://registry.yarnpkg.com/@cornerstonejs/dicom-image-loader/-/dicom-image-loader-1.13.2.tgz#8f525d246efc1188c15eb1630969524e2002deac" + integrity sha512-FyAY7AGU7iQocmmRGYZdoyhSGyNlonpM1qMwhUjA5OoA6hJcWilVW05R0SFrHAbV9DulASaXWsf1Ue0giS0xog== dependencies: "@cornerstonejs/codec-charls" "^1.2.3" "@cornerstonejs/codec-libjpeg-turbo-8bit" "^1.2.2" "@cornerstonejs/codec-openjpeg" "^1.2.2" "@cornerstonejs/codec-openjph" "^2.4.2" - "@cornerstonejs/core" "^1.11.4" + "@cornerstonejs/core" "^1.13.2" dicom-parser "^1.8.9" pako "^2.0.4" uuid "^9.0.0" -"@cornerstonejs/streaming-image-volume-loader@^1.11.4": - version "1.11.4" - resolved "https://registry.yarnpkg.com/@cornerstonejs/streaming-image-volume-loader/-/streaming-image-volume-loader-1.11.4.tgz#ca166f7488e8bba78e8e2216b5fc00e36ed2000b" - integrity sha512-gucQKRjU+UET1BGho4gOi0iy9iT0WoUnuXqb3zS9y7FrBr10VW6F51kbm+BaS0H0PTHqlC5nwHNrsxWavOqleg== +"@cornerstonejs/streaming-image-volume-loader@^1.13.2": + version "1.13.2" + resolved "https://registry.yarnpkg.com/@cornerstonejs/streaming-image-volume-loader/-/streaming-image-volume-loader-1.13.2.tgz#4b4ba637d79bfd194367a88697e6d3dc2440505d" + integrity sha512-V+2nQmIXQZQvHL6wYMHuW6NsIWi/sDmsJRyXvWKUSJvrCmj7JIxfeECr1+Mn11yizy3bYeA6eDWWGyapFh/2iw== dependencies: - "@cornerstonejs/core" "^1.11.4" + "@cornerstonejs/core" "^1.13.2" -"@cornerstonejs/tools@^1.11.4": - version "1.11.4" - resolved "https://registry.yarnpkg.com/@cornerstonejs/tools/-/tools-1.11.4.tgz#20ae1501d6f18346230f4b9bf62e23e30343407a" - integrity sha512-OLo69mbL2mgAUKuXSFLif+aJtbqT6hlWI5F6MsqgVun0BP1qLn2FgCfNwSphco4ejjiJG9CSnPBhfdcCxveaoA== +"@cornerstonejs/tools@^1.13.2": + version "1.13.2" + resolved "https://registry.yarnpkg.com/@cornerstonejs/tools/-/tools-1.13.2.tgz#2074d0d7f1dba61295fcb81616bf48ea530d747f" + integrity sha512-DI8GpbygBWG5ha9mawk0gSUfT+xBn/NE6gwo9jjjN2MTpiI1N8AcsNktLG2mlmq89wRMZhu4xvmo9QQDlf2dPQ== dependencies: - "@cornerstonejs/core" "^1.11.4" + "@cornerstonejs/core" "^1.13.2" lodash.clonedeep "4.5.0" lodash.get "^4.4.2"