feat(thumbnails): Enhance DICOM Thumbnail Rendering with different strategies (#5004)

Co-authored-by: Martin Bellehumeur, M. Eng. <23396581+mbellehumeur@users.noreply.github.com>
This commit is contained in:
Bill Wallace 2025-05-08 12:44:56 -04:00 committed by GitHub
parent dee6909a99
commit 578c3939f0
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
80 changed files with 371 additions and 284 deletions

278
bun.lock
View File

@ -40,7 +40,7 @@
},
"addOns/externals/devDependencies": {
"name": "@externals/devDependencies",
"version": "3.11.0-beta.24",
"version": "3.11.0-beta.27",
"dependencies": {
"@babel/runtime": "^7.20.13",
"@kitware/vtk.js": "32.12.0",
@ -127,22 +127,22 @@
},
"addOns/externals/dicom-microscopy-viewer": {
"name": "@externals/dicom-microscopy-viewer",
"version": "3.11.0-beta.24",
"version": "3.11.0-beta.27",
"dependencies": {
"dicom-microscopy-viewer": "^0.46.1",
},
},
"extensions/cornerstone": {
"name": "@ohif/extension-cornerstone",
"version": "3.11.0-beta.24",
"version": "3.11.0-beta.27",
"dependencies": {
"@babel/runtime": "^7.20.13",
"@cornerstonejs/adapters": "^3.12.1",
"@cornerstonejs/ai": "^3.12.1",
"@cornerstonejs/core": "^3.12.1",
"@cornerstonejs/labelmap-interpolation": "^3.12.1",
"@cornerstonejs/polymorphic-segmentation": "^3.12.1",
"@cornerstonejs/tools": "^3.12.1",
"@cornerstonejs/adapters": "^3.12.2",
"@cornerstonejs/ai": "^3.12.2",
"@cornerstonejs/core": "^3.12.2",
"@cornerstonejs/labelmap-interpolation": "^3.12.2",
"@cornerstonejs/polymorphic-segmentation": "^3.12.2",
"@cornerstonejs/tools": "^3.12.2",
"@itk-wasm/morphological-contour-interpolation": "1.1.0",
"@kitware/vtk.js": "32.12.0",
"html2canvas": "^1.4.1",
@ -159,9 +159,9 @@
"@cornerstonejs/codec-libjpeg-turbo-8bit": "^1.2.2",
"@cornerstonejs/codec-openjpeg": "^1.2.4",
"@cornerstonejs/codec-openjph": "^2.4.5",
"@cornerstonejs/dicom-image-loader": "^3.12.1",
"@ohif/core": "3.11.0-beta.24",
"@ohif/ui": "3.11.0-beta.24",
"@cornerstonejs/dicom-image-loader": "^3.12.2",
"@ohif/core": "3.11.0-beta.27",
"@ohif/ui": "3.11.0-beta.27",
"dcmjs": "*",
"dicom-parser": "^1.8.21",
"hammerjs": "^2.0.8",
@ -173,19 +173,19 @@
},
"extensions/cornerstone-dicom-pmap": {
"name": "@ohif/extension-cornerstone-dicom-pmap",
"version": "3.11.0-beta.24",
"version": "3.11.0-beta.27",
"dependencies": {
"@babel/runtime": "^7.20.13",
"@cornerstonejs/adapters": "^3.12.1",
"@cornerstonejs/core": "^3.12.1",
"@cornerstonejs/adapters": "^3.12.2",
"@cornerstonejs/core": "^3.12.2",
"@kitware/vtk.js": "32.12.0",
"react-color": "^2.19.3",
},
"peerDependencies": {
"@ohif/core": "3.11.0-beta.24",
"@ohif/extension-cornerstone": "3.11.0-beta.24",
"@ohif/extension-default": "3.11.0-beta.24",
"@ohif/i18n": "3.11.0-beta.24",
"@ohif/core": "3.11.0-beta.27",
"@ohif/extension-cornerstone": "3.11.0-beta.27",
"@ohif/extension-default": "3.11.0-beta.27",
"@ohif/i18n": "3.11.0-beta.27",
"prop-types": "^15.6.2",
"react": "^18.3.1",
"react-dom": "^18.3.1",
@ -196,16 +196,16 @@
},
"extensions/cornerstone-dicom-rt": {
"name": "@ohif/extension-cornerstone-dicom-rt",
"version": "3.11.0-beta.24",
"version": "3.11.0-beta.27",
"dependencies": {
"@babel/runtime": "^7.20.13",
"react-color": "^2.19.3",
},
"peerDependencies": {
"@ohif/core": "3.11.0-beta.24",
"@ohif/extension-cornerstone": "3.11.0-beta.24",
"@ohif/extension-default": "3.11.0-beta.24",
"@ohif/i18n": "3.11.0-beta.24",
"@ohif/core": "3.11.0-beta.27",
"@ohif/extension-cornerstone": "3.11.0-beta.27",
"@ohif/extension-default": "3.11.0-beta.27",
"@ohif/i18n": "3.11.0-beta.27",
"prop-types": "^15.6.2",
"react": "^18.3.1",
"react-dom": "^18.3.1",
@ -216,19 +216,19 @@
},
"extensions/cornerstone-dicom-seg": {
"name": "@ohif/extension-cornerstone-dicom-seg",
"version": "3.11.0-beta.24",
"version": "3.11.0-beta.27",
"dependencies": {
"@babel/runtime": "^7.20.13",
"@cornerstonejs/adapters": "^3.12.1",
"@cornerstonejs/core": "^3.12.1",
"@cornerstonejs/adapters": "^3.12.2",
"@cornerstonejs/core": "^3.12.2",
"@kitware/vtk.js": "32.12.0",
"react-color": "^2.19.3",
},
"peerDependencies": {
"@ohif/core": "3.11.0-beta.24",
"@ohif/extension-cornerstone": "3.11.0-beta.24",
"@ohif/extension-default": "3.11.0-beta.24",
"@ohif/i18n": "3.11.0-beta.24",
"@ohif/core": "3.11.0-beta.27",
"@ohif/extension-cornerstone": "3.11.0-beta.27",
"@ohif/extension-default": "3.11.0-beta.27",
"@ohif/i18n": "3.11.0-beta.27",
"prop-types": "^15.6.2",
"react": "^18.3.1",
"react-dom": "^18.3.1",
@ -239,19 +239,19 @@
},
"extensions/cornerstone-dicom-sr": {
"name": "@ohif/extension-cornerstone-dicom-sr",
"version": "3.11.0-beta.24",
"version": "3.11.0-beta.27",
"dependencies": {
"@babel/runtime": "^7.20.13",
"@cornerstonejs/adapters": "^3.12.1",
"@cornerstonejs/core": "^3.12.1",
"@cornerstonejs/tools": "^3.12.1",
"@cornerstonejs/adapters": "^3.12.2",
"@cornerstonejs/core": "^3.12.2",
"@cornerstonejs/tools": "^3.12.2",
"classnames": "^2.3.2",
},
"peerDependencies": {
"@ohif/core": "3.11.0-beta.24",
"@ohif/extension-cornerstone": "3.11.0-beta.24",
"@ohif/extension-measurement-tracking": "3.11.0-beta.24",
"@ohif/ui": "3.11.0-beta.24",
"@ohif/core": "3.11.0-beta.27",
"@ohif/extension-cornerstone": "3.11.0-beta.27",
"@ohif/extension-measurement-tracking": "3.11.0-beta.27",
"@ohif/ui": "3.11.0-beta.27",
"dcmjs": "*",
"dicom-parser": "^1.8.9",
"hammerjs": "^2.0.8",
@ -261,19 +261,19 @@
},
"extensions/cornerstone-dynamic-volume": {
"name": "@ohif/extension-cornerstone-dynamic-volume",
"version": "3.11.0-beta.24",
"version": "3.11.0-beta.27",
"dependencies": {
"@babel/runtime": "^7.20.13",
"@cornerstonejs/core": "^3.12.1",
"@cornerstonejs/tools": "^3.12.1",
"@cornerstonejs/core": "^3.12.2",
"@cornerstonejs/tools": "^3.12.2",
"classnames": "^2.3.2",
},
"peerDependencies": {
"@ohif/core": "3.11.0-beta.24",
"@ohif/extension-cornerstone": "3.11.0-beta.24",
"@ohif/extension-default": "3.11.0-beta.24",
"@ohif/i18n": "3.11.0-beta.24",
"@ohif/ui": "3.11.0-beta.24",
"@ohif/core": "3.11.0-beta.27",
"@ohif/extension-cornerstone": "3.11.0-beta.27",
"@ohif/extension-default": "3.11.0-beta.27",
"@ohif/i18n": "3.11.0-beta.27",
"@ohif/ui": "3.11.0-beta.27",
"dcmjs": "*",
"dicom-parser": "^1.8.21",
"hammerjs": "^2.0.8",
@ -283,7 +283,7 @@
},
"extensions/default": {
"name": "@ohif/extension-default",
"version": "3.11.0-beta.24",
"version": "3.11.0-beta.27",
"dependencies": {
"@babel/runtime": "^7.20.13",
"@cornerstonejs/calculate-suv": "^1.1.0",
@ -291,8 +291,8 @@
"lodash.uniqby": "^4.7.0",
},
"peerDependencies": {
"@ohif/core": "3.11.0-beta.24",
"@ohif/i18n": "3.11.0-beta.24",
"@ohif/core": "3.11.0-beta.27",
"@ohif/i18n": "3.11.0-beta.27",
"dcmjs": "*",
"dicomweb-client": "^0.10.4",
"prop-types": "^15.6.2",
@ -306,7 +306,7 @@
},
"extensions/dicom-microscopy": {
"name": "@ohif/extension-dicom-microscopy",
"version": "3.11.0-beta.24",
"version": "3.11.0-beta.27",
"dependencies": {
"@babel/runtime": "^7.20.13",
"@cornerstonejs/codec-charls": "^1.2.3",
@ -317,10 +317,10 @@
"mathjs": "^12.4.2",
},
"peerDependencies": {
"@ohif/core": "3.11.0-beta.24",
"@ohif/extension-default": "3.11.0-beta.24",
"@ohif/i18n": "3.11.0-beta.24",
"@ohif/ui": "3.11.0-beta.24",
"@ohif/core": "3.11.0-beta.27",
"@ohif/extension-default": "3.11.0-beta.27",
"@ohif/i18n": "3.11.0-beta.27",
"@ohif/ui": "3.11.0-beta.27",
"prop-types": "^15.6.2",
"react": "^18.3.1",
"react-dom": "^18.3.1",
@ -331,14 +331,14 @@
},
"extensions/dicom-pdf": {
"name": "@ohif/extension-dicom-pdf",
"version": "3.11.0-beta.24",
"version": "3.11.0-beta.27",
"dependencies": {
"@babel/runtime": "^7.20.13",
"classnames": "^2.3.2",
},
"peerDependencies": {
"@ohif/core": "3.11.0-beta.24",
"@ohif/ui": "3.11.0-beta.24",
"@ohif/core": "3.11.0-beta.27",
"@ohif/ui": "3.11.0-beta.27",
"dcmjs": "*",
"dicom-parser": "^1.8.9",
"hammerjs": "^2.0.8",
@ -348,14 +348,14 @@
},
"extensions/dicom-video": {
"name": "@ohif/extension-dicom-video",
"version": "3.11.0-beta.24",
"version": "3.11.0-beta.27",
"dependencies": {
"@babel/runtime": "^7.20.13",
"classnames": "^2.3.2",
},
"peerDependencies": {
"@ohif/core": "3.11.0-beta.24",
"@ohif/ui": "3.11.0-beta.24",
"@ohif/core": "3.11.0-beta.27",
"@ohif/ui": "3.11.0-beta.27",
"dcmjs": "*",
"dicom-parser": "^1.8.9",
"hammerjs": "^2.0.8",
@ -365,20 +365,20 @@
},
"extensions/measurement-tracking": {
"name": "@ohif/extension-measurement-tracking",
"version": "3.11.0-beta.24",
"version": "3.11.0-beta.27",
"dependencies": {
"@babel/runtime": "^7.20.13",
"@ohif/ui": "3.11.0-beta.24",
"@ohif/ui": "3.11.0-beta.27",
"@xstate/react": "^3.2.2",
"xstate": "^4.10.0",
},
"peerDependencies": {
"@cornerstonejs/core": "^3.12.1",
"@cornerstonejs/tools": "^3.12.1",
"@ohif/core": "3.11.0-beta.24",
"@ohif/extension-cornerstone-dicom-sr": "3.11.0-beta.24",
"@ohif/extension-default": "3.11.0-beta.24",
"@ohif/ui": "3.11.0-beta.24",
"@cornerstonejs/core": "^3.12.2",
"@cornerstonejs/tools": "^3.12.2",
"@ohif/core": "3.11.0-beta.27",
"@ohif/extension-cornerstone-dicom-sr": "3.11.0-beta.27",
"@ohif/extension-default": "3.11.0-beta.27",
"@ohif/ui": "3.11.0-beta.27",
"classnames": "^2.3.2",
"dcmjs": "*",
"lodash.debounce": "^4.0.8",
@ -391,14 +391,14 @@
},
"extensions/test-extension": {
"name": "@ohif/extension-test",
"version": "3.11.0-beta.24",
"version": "3.11.0-beta.27",
"dependencies": {
"@babel/runtime": "^7.20.13",
"classnames": "^2.3.2",
},
"peerDependencies": {
"@ohif/core": "3.11.0-beta.24",
"@ohif/ui": "3.11.0-beta.24",
"@ohif/core": "3.11.0-beta.27",
"@ohif/ui": "3.11.0-beta.27",
"dcmjs": "0.38.0",
"dicom-parser": "^1.8.9",
"hammerjs": "^2.0.8",
@ -408,7 +408,7 @@
},
"extensions/tmtv": {
"name": "@ohif/extension-tmtv",
"version": "3.11.0-beta.24",
"version": "3.11.0-beta.27",
"dependencies": {
"@babel/runtime": "^7.20.13",
"classnames": "^2.3.2",
@ -425,7 +425,7 @@
},
"modes/basic-dev-mode": {
"name": "@ohif/mode-basic-dev-mode",
"version": "3.11.0-beta.24",
"version": "3.11.0-beta.27",
"dependencies": {
"@babel/runtime": "^7.20.13",
"i18next": "^17.0.3",
@ -435,17 +435,17 @@
"webpack-merge": "^5.7.3",
},
"peerDependencies": {
"@ohif/core": "3.11.0-beta.24",
"@ohif/extension-cornerstone": "3.11.0-beta.24",
"@ohif/extension-cornerstone-dicom-sr": "3.11.0-beta.24",
"@ohif/extension-default": "3.11.0-beta.24",
"@ohif/extension-dicom-pdf": "3.11.0-beta.24",
"@ohif/extension-dicom-video": "3.11.0-beta.24",
"@ohif/core": "3.11.0-beta.27",
"@ohif/extension-cornerstone": "3.11.0-beta.27",
"@ohif/extension-cornerstone-dicom-sr": "3.11.0-beta.27",
"@ohif/extension-default": "3.11.0-beta.27",
"@ohif/extension-dicom-pdf": "3.11.0-beta.27",
"@ohif/extension-dicom-video": "3.11.0-beta.27",
},
},
"modes/basic-test-mode": {
"name": "@ohif/mode-test",
"version": "3.11.0-beta.24",
"version": "3.11.0-beta.27",
"dependencies": {
"@babel/runtime": "^7.20.13",
"i18next": "^17.0.3",
@ -455,19 +455,19 @@
"webpack-merge": "^5.7.3",
},
"peerDependencies": {
"@ohif/core": "3.11.0-beta.24",
"@ohif/extension-cornerstone": "3.11.0-beta.24",
"@ohif/extension-cornerstone-dicom-sr": "3.11.0-beta.24",
"@ohif/extension-default": "3.11.0-beta.24",
"@ohif/extension-dicom-pdf": "3.11.0-beta.24",
"@ohif/extension-dicom-video": "3.11.0-beta.24",
"@ohif/extension-measurement-tracking": "3.11.0-beta.24",
"@ohif/extension-test": "3.11.0-beta.24",
"@ohif/core": "3.11.0-beta.27",
"@ohif/extension-cornerstone": "3.11.0-beta.27",
"@ohif/extension-cornerstone-dicom-sr": "3.11.0-beta.27",
"@ohif/extension-default": "3.11.0-beta.27",
"@ohif/extension-dicom-pdf": "3.11.0-beta.27",
"@ohif/extension-dicom-video": "3.11.0-beta.27",
"@ohif/extension-measurement-tracking": "3.11.0-beta.27",
"@ohif/extension-test": "3.11.0-beta.27",
},
},
"modes/longitudinal": {
"name": "@ohif/mode-longitudinal",
"version": "3.11.0-beta.24",
"version": "3.11.0-beta.27",
"dependencies": {
"@babel/runtime": "^7.20.13",
"i18next": "^17.0.3",
@ -477,32 +477,32 @@
"webpack-merge": "^5.7.3",
},
"peerDependencies": {
"@ohif/core": "3.11.0-beta.24",
"@ohif/extension-cornerstone": "3.11.0-beta.24",
"@ohif/extension-cornerstone-dicom-rt": "3.11.0-beta.24",
"@ohif/extension-cornerstone-dicom-seg": "3.11.0-beta.24",
"@ohif/extension-cornerstone-dicom-sr": "3.11.0-beta.24",
"@ohif/extension-default": "3.11.0-beta.24",
"@ohif/extension-dicom-pdf": "3.11.0-beta.24",
"@ohif/extension-dicom-video": "3.11.0-beta.24",
"@ohif/extension-measurement-tracking": "3.11.0-beta.24",
"@ohif/core": "3.11.0-beta.27",
"@ohif/extension-cornerstone": "3.11.0-beta.27",
"@ohif/extension-cornerstone-dicom-rt": "3.11.0-beta.27",
"@ohif/extension-cornerstone-dicom-seg": "3.11.0-beta.27",
"@ohif/extension-cornerstone-dicom-sr": "3.11.0-beta.27",
"@ohif/extension-default": "3.11.0-beta.27",
"@ohif/extension-dicom-pdf": "3.11.0-beta.27",
"@ohif/extension-dicom-video": "3.11.0-beta.27",
"@ohif/extension-measurement-tracking": "3.11.0-beta.27",
},
},
"modes/microscopy": {
"name": "@ohif/mode-microscopy",
"version": "3.11.0-beta.24",
"version": "3.11.0-beta.27",
"dependencies": {
"@babel/runtime": "^7.20.13",
"i18next": "^17.0.3",
},
"peerDependencies": {
"@ohif/core": "3.11.0-beta.24",
"@ohif/extension-dicom-microscopy": "3.11.0-beta.24",
"@ohif/core": "3.11.0-beta.27",
"@ohif/extension-dicom-microscopy": "3.11.0-beta.27",
},
},
"modes/preclinical-4d": {
"name": "@ohif/mode-preclinical-4d",
"version": "3.11.0-beta.24",
"version": "3.11.0-beta.27",
"dependencies": {
"@babel/runtime": "^7.20.13",
},
@ -521,7 +521,7 @@
},
"modes/segmentation": {
"name": "@ohif/mode-segmentation",
"version": "3.11.0-beta.24",
"version": "3.11.0-beta.27",
"dependencies": {
"@babel/runtime": "^7.20.13",
"i18next": "^17.0.3",
@ -565,7 +565,7 @@
},
"modes/tmtv": {
"name": "@ohif/mode-tmtv",
"version": "3.11.0-beta.24",
"version": "3.11.0-beta.27",
"dependencies": {
"@babel/runtime": "^7.20.13",
"i18next": "^17.0.3",
@ -586,32 +586,32 @@
},
"platform/app": {
"name": "@ohif/app",
"version": "3.11.0-beta.24",
"version": "3.11.0-beta.27",
"dependencies": {
"@babel/runtime": "^7.20.13",
"@cornerstonejs/codec-charls": "^1.2.3",
"@cornerstonejs/codec-libjpeg-turbo-8bit": "^1.2.2",
"@cornerstonejs/codec-openjpeg": "^1.2.4",
"@cornerstonejs/codec-openjph": "^2.4.5",
"@cornerstonejs/dicom-image-loader": "^3.12.1",
"@cornerstonejs/dicom-image-loader": "^3.12.2",
"@emotion/serialize": "^1.1.3",
"@ohif/core": "3.11.0-beta.24",
"@ohif/extension-cornerstone": "3.11.0-beta.24",
"@ohif/extension-cornerstone-dicom-rt": "3.11.0-beta.24",
"@ohif/extension-cornerstone-dicom-seg": "3.11.0-beta.24",
"@ohif/extension-cornerstone-dicom-sr": "3.11.0-beta.24",
"@ohif/extension-default": "3.11.0-beta.24",
"@ohif/extension-dicom-microscopy": "3.11.0-beta.24",
"@ohif/extension-dicom-pdf": "3.11.0-beta.24",
"@ohif/extension-dicom-video": "3.11.0-beta.24",
"@ohif/extension-test": "3.11.0-beta.24",
"@ohif/i18n": "3.11.0-beta.24",
"@ohif/mode-basic-dev-mode": "3.11.0-beta.24",
"@ohif/mode-longitudinal": "3.11.0-beta.24",
"@ohif/mode-microscopy": "3.11.0-beta.24",
"@ohif/mode-test": "3.11.0-beta.24",
"@ohif/ui": "3.11.0-beta.24",
"@ohif/ui-next": "3.11.0-beta.24",
"@ohif/core": "3.11.0-beta.27",
"@ohif/extension-cornerstone": "3.11.0-beta.27",
"@ohif/extension-cornerstone-dicom-rt": "3.11.0-beta.27",
"@ohif/extension-cornerstone-dicom-seg": "3.11.0-beta.27",
"@ohif/extension-cornerstone-dicom-sr": "3.11.0-beta.27",
"@ohif/extension-default": "3.11.0-beta.27",
"@ohif/extension-dicom-microscopy": "3.11.0-beta.27",
"@ohif/extension-dicom-pdf": "3.11.0-beta.27",
"@ohif/extension-dicom-video": "3.11.0-beta.27",
"@ohif/extension-test": "3.11.0-beta.27",
"@ohif/i18n": "3.11.0-beta.27",
"@ohif/mode-basic-dev-mode": "3.11.0-beta.27",
"@ohif/mode-longitudinal": "3.11.0-beta.27",
"@ohif/mode-microscopy": "3.11.0-beta.27",
"@ohif/mode-test": "3.11.0-beta.27",
"@ohif/ui": "3.11.0-beta.27",
"@ohif/ui-next": "3.11.0-beta.27",
"@svgr/webpack": "^8.1.0",
"@types/react": "^18.3.3",
"classnames": "^2.3.2",
@ -652,7 +652,7 @@
},
"platform/cli": {
"name": "@ohif/cli",
"version": "3.11.0-beta.24",
"version": "3.11.0-beta.27",
"bin": {
"ohif-cli": "src/index.js",
},
@ -676,7 +676,7 @@
},
"platform/core": {
"name": "@ohif/core",
"version": "3.11.0-beta.24",
"version": "3.11.0-beta.27",
"dependencies": {
"@babel/runtime": "^7.20.13",
"dcmjs": "*",
@ -701,16 +701,16 @@
"@cornerstonejs/codec-libjpeg-turbo-8bit": "^1.2.2",
"@cornerstonejs/codec-openjpeg": "^1.2.4",
"@cornerstonejs/codec-openjph": "^2.4.5",
"@cornerstonejs/core": "^3.12.1",
"@cornerstonejs/dicom-image-loader": "^3.12.1",
"@ohif/ui": "3.11.0-beta.24",
"@cornerstonejs/core": "^3.12.2",
"@cornerstonejs/dicom-image-loader": "^3.12.2",
"@ohif/ui": "3.11.0-beta.27",
"cornerstone-math": "0.1.9",
"dicom-parser": "^1.8.21",
},
},
"platform/i18n": {
"name": "@ohif/i18n",
"version": "3.11.0-beta.24",
"version": "3.11.0-beta.27",
"dependencies": {
"@babel/runtime": "^7.20.13",
"i18next-locize-backend": "^2.0.0",
@ -735,7 +735,7 @@
},
"platform/ui": {
"name": "@ohif/ui",
"version": "3.11.0-beta.24",
"version": "3.11.0-beta.27",
"dependencies": {
"@testing-library/react": "^13.1.0",
"browser-detect": "^0.2.28",
@ -795,7 +795,7 @@
},
"platform/ui-next": {
"name": "@ohif/ui-next",
"version": "3.11.0-beta.24",
"version": "3.11.0-beta.27",
"dependencies": {
"@radix-ui/react-accordion": "^1.2.0",
"@radix-ui/react-checkbox": "^1.1.1",
@ -1106,9 +1106,9 @@
"@colors/colors": ["@colors/colors@1.5.0", "", {}, "sha512-ooWCrlZP11i8GImSjTHYHLkvFDP48nS4+204nGb1RiX/WXYHmJA2III9/e2DWVabCESdW7hBAEzHRqUn9OUVvQ=="],
"@cornerstonejs/adapters": ["@cornerstonejs/adapters@3.12.1", "", { "dependencies": { "@babel/runtime-corejs2": "^7.17.8", "buffer": "^6.0.3", "dcmjs": "^0.29.8", "gl-matrix": "^3.4.3", "ndarray": "^1.0.19" }, "peerDependencies": { "@cornerstonejs/core": "^3.12.1", "@cornerstonejs/tools": "^3.12.1" } }, "sha512-2HrqwpTTE5d7UNzjbp8TDYucf2j36sENfd3gK1k0Ui6na4yfEiHecNZgy6x6y5M5DcKzXofl2a64XvXXYYotzQ=="],
"@cornerstonejs/adapters": ["@cornerstonejs/adapters@3.12.2", "", { "dependencies": { "@babel/runtime-corejs2": "^7.17.8", "buffer": "^6.0.3", "dcmjs": "^0.29.8", "gl-matrix": "^3.4.3", "ndarray": "^1.0.19" }, "peerDependencies": { "@cornerstonejs/core": "^3.12.2", "@cornerstonejs/tools": "^3.12.2" } }, "sha512-yKPT9U1/CUtXu/h3xXB8KYX3x3bHgedw3nPX6eOn8oDhynfjuvA+i+4xJxKtO182mi2WnAQwFPnzkgmEVyrSqA=="],
"@cornerstonejs/ai": ["@cornerstonejs/ai@3.12.1", "", { "dependencies": { "@babel/runtime-corejs2": "^7.17.8", "buffer": "^6.0.3", "dcmjs": "^0.29.8", "gl-matrix": "^3.4.3", "lodash.clonedeep": "^4.5.0", "ndarray": "^1.0.19", "onnxruntime-common": "1.17.1", "onnxruntime-web": "1.17.1" }, "peerDependencies": { "@cornerstonejs/core": "^3.12.1", "@cornerstonejs/tools": "^3.12.1" } }, "sha512-tey1CUoufVX+SogsyR9Yaljxhs6mKk0MBX0rAThgbphb74PFlDC3Kl9AcYBFJNjRcIy6K0cIR4e1/RtKFGsPeQ=="],
"@cornerstonejs/ai": ["@cornerstonejs/ai@3.12.2", "", { "dependencies": { "@babel/runtime-corejs2": "^7.17.8", "buffer": "^6.0.3", "dcmjs": "^0.29.8", "gl-matrix": "^3.4.3", "lodash.clonedeep": "^4.5.0", "ndarray": "^1.0.19", "onnxruntime-common": "1.17.1", "onnxruntime-web": "1.17.1" }, "peerDependencies": { "@cornerstonejs/core": "^3.12.2", "@cornerstonejs/tools": "^3.12.2" } }, "sha512-Btyey9KNcJqzIG7trFqDHo08zJVO3XtVEbfbJiUfRoztwQTKrtxOJ40dsz3pU3+PNQgG0bmTPhe9yRSpcVdwRA=="],
"@cornerstonejs/calculate-suv": ["@cornerstonejs/calculate-suv@1.1.0", "", {}, "sha512-Q9XraiDJif9aMFArD2iEuDO/HXbcRVCqB7KfaHgDrdTTjgDFovS91Psbdim7crypRSvE6dh/+HKeFNHdvNkA6w=="],
@ -1120,15 +1120,15 @@
"@cornerstonejs/codec-openjph": ["@cornerstonejs/codec-openjph@2.4.7", "", {}, "sha512-qvP4q4JDib7mi9r7LqKOwqz7YZ8gjtDX4ZCezeYf8+eb7MBXCz5uXAMeVF3yz9Axw4XiIMdB/pqXkm8tqCl13w=="],
"@cornerstonejs/core": ["@cornerstonejs/core@3.12.1", "", { "dependencies": { "@kitware/vtk.js": "32.12.1", "comlink": "^4.4.1", "gl-matrix": "^3.4.3", "loglevel": "^1.9.2" } }, "sha512-pWFbobllPu0mjnAbV6/4U+YaRKoY661yNCdw1BUvm0Vs/FVNGz0E61/VVtZfS2L/gatj3SBpYPTw6k6G9wk1AA=="],
"@cornerstonejs/core": ["@cornerstonejs/core@3.12.2", "", { "dependencies": { "@kitware/vtk.js": "32.12.1", "comlink": "^4.4.1", "gl-matrix": "^3.4.3", "loglevel": "^1.9.2" } }, "sha512-AKFHr7XF5zKUo1BiclJmUz913yD9NiQgLl3krTmvtlWPuOUhpxoCfipW0De5dMeVuQ86iQDV1F+p7HuWOWfdwg=="],
"@cornerstonejs/dicom-image-loader": ["@cornerstonejs/dicom-image-loader@3.12.1", "", { "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.5", "comlink": "^4.4.1", "dicom-parser": "^1.8.9", "jpeg-lossless-decoder-js": "^2.1.0", "pako": "^2.0.4", "uuid": "^9.0.0" }, "peerDependencies": { "@cornerstonejs/core": "^3.12.1" } }, "sha512-HX4++HYN0Lx8g8fTTVbp7DPsEWJHXRDqO9nuiJzgr9b79nMp1rrybTcP07RIXY38iCsSBr17WIkPWMxdby4nPw=="],
"@cornerstonejs/dicom-image-loader": ["@cornerstonejs/dicom-image-loader@3.12.2", "", { "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.5", "comlink": "^4.4.1", "dicom-parser": "^1.8.9", "jpeg-lossless-decoder-js": "^2.1.0", "pako": "^2.0.4", "uuid": "^9.0.0" }, "peerDependencies": { "@cornerstonejs/core": "^3.12.2" } }, "sha512-LaKnv5OPMlRPzkuqReVl1Gpa9ERTQJXl/1/Iku9wbWjnGrkzdF4Ef8bG0DseLx57qMOJPJP++PsxeXCaOgXvyw=="],
"@cornerstonejs/labelmap-interpolation": ["@cornerstonejs/labelmap-interpolation@3.12.1", "", { "dependencies": { "@itk-wasm/morphological-contour-interpolation": "1.1.0", "itk-wasm": "1.0.0-b.165" }, "peerDependencies": { "@cornerstonejs/core": "^3.12.1", "@cornerstonejs/tools": "^3.12.1", "@kitware/vtk.js": "32.12.1" } }, "sha512-ikTaajRrtNgjPrtcwqaac59uRX3JMIttOLLQgHR9qt7UNNs91BrbkoKGZkVER5YL3R+9o7olKUgdgprxVKE/Cw=="],
"@cornerstonejs/labelmap-interpolation": ["@cornerstonejs/labelmap-interpolation@3.12.2", "", { "dependencies": { "@itk-wasm/morphological-contour-interpolation": "1.1.0", "itk-wasm": "1.0.0-b.165" }, "peerDependencies": { "@cornerstonejs/core": "^3.12.2", "@cornerstonejs/tools": "^3.12.2", "@kitware/vtk.js": "32.12.1" } }, "sha512-5T2OtNyV2jMy66k2clG/Krk1x4xFOxlS9sGxT1eMOrELClzpY+cL+IuA6f0aD6vTwkp1fFojEIa0IFbwuCK8HQ=="],
"@cornerstonejs/polymorphic-segmentation": ["@cornerstonejs/polymorphic-segmentation@3.12.1", "", { "dependencies": { "@icr/polyseg-wasm": "0.4.0" }, "peerDependencies": { "@cornerstonejs/core": "^3.12.1", "@cornerstonejs/tools": "^3.12.1", "@kitware/vtk.js": "32.12.1" } }, "sha512-gdDq1Qh3c37IZxaTwE4k9dEQE7CzQ1anfDg9foiJnJkBHVwgWpMiC/ztSa+c22LgN6ksQnWDz5TGIHqJ+ozscQ=="],
"@cornerstonejs/polymorphic-segmentation": ["@cornerstonejs/polymorphic-segmentation@3.12.2", "", { "dependencies": { "@icr/polyseg-wasm": "0.4.0" }, "peerDependencies": { "@cornerstonejs/core": "^3.12.2", "@cornerstonejs/tools": "^3.12.2", "@kitware/vtk.js": "32.12.1" } }, "sha512-pmOpmOKUaAM3EIklZLufWJ9IVTRpp54MF+B6cnirGEYYobjFT+uTrLwrExwVC1kEVHi8o4n5X8SJnawtIu/ugA=="],
"@cornerstonejs/tools": ["@cornerstonejs/tools@3.12.1", "", { "dependencies": { "@types/offscreencanvas": "2019.7.3", "comlink": "^4.4.1", "lodash.get": "^4.4.2" }, "peerDependencies": { "@cornerstonejs/core": "^3.12.1", "@kitware/vtk.js": "32.12.1", "@types/d3-array": "^3.0.4", "@types/d3-interpolate": "^3.0.1", "d3-array": "^3.2.3", "d3-interpolate": "^3.0.1", "gl-matrix": "^3.4.3" } }, "sha512-0Yax5NIdX1X6ELMf32rticoTehPFh2k0OTx/znAf3IgMUYdsox4peMe8Lf72MrFvmLeDvtyB45iT0Xk6bjeAvw=="],
"@cornerstonejs/tools": ["@cornerstonejs/tools@3.12.2", "", { "dependencies": { "@types/offscreencanvas": "2019.7.3", "comlink": "^4.4.1", "lodash.get": "^4.4.2" }, "peerDependencies": { "@cornerstonejs/core": "^3.12.2", "@kitware/vtk.js": "32.12.1", "@types/d3-array": "^3.0.4", "@types/d3-interpolate": "^3.0.1", "d3-array": "^3.2.3", "d3-interpolate": "^3.0.1", "gl-matrix": "^3.4.3" } }, "sha512-Zx9BFl2OAuCQGrr6o+e1tV3fMSoAARC7HlVWprUrGWwDA29LVRxQT+cc+Wo76GjxcKSMo5RuLt1+sgRj0+CsAA=="],
"@cspotcode/source-map-support": ["@cspotcode/source-map-support@0.8.1", "", { "dependencies": { "@jridgewell/trace-mapping": "0.3.9" } }, "sha512-IchNf6dN4tHoMFIn/7OE8LWZ19Y6q/67Bmf6vnGREv8RSbBVb9LPJxEcnwrcwX6ixSvaiGoomAUvu4YSxXrVgw=="],

View File

@ -46,8 +46,8 @@
},
"dependencies": {
"@babel/runtime": "^7.20.13",
"@cornerstonejs/adapters": "^3.12.1",
"@cornerstonejs/core": "^3.12.1",
"@cornerstonejs/adapters": "^3.12.2",
"@cornerstonejs/core": "^3.12.2",
"@kitware/vtk.js": "32.12.0",
"react-color": "^2.19.3"
}

View File

@ -46,8 +46,8 @@
},
"dependencies": {
"@babel/runtime": "^7.20.13",
"@cornerstonejs/adapters": "^3.12.1",
"@cornerstonejs/core": "^3.12.1",
"@cornerstonejs/adapters": "^3.12.2",
"@cornerstonejs/core": "^3.12.2",
"@kitware/vtk.js": "32.12.0",
"react-color": "^2.19.3"
}

View File

@ -46,9 +46,9 @@
},
"dependencies": {
"@babel/runtime": "^7.20.13",
"@cornerstonejs/adapters": "^3.12.1",
"@cornerstonejs/core": "^3.12.1",
"@cornerstonejs/tools": "^3.12.1",
"@cornerstonejs/adapters": "^3.12.2",
"@cornerstonejs/core": "^3.12.2",
"@cornerstonejs/tools": "^3.12.2",
"classnames": "^2.3.2"
}
}

View File

@ -42,8 +42,8 @@
},
"dependencies": {
"@babel/runtime": "^7.20.13",
"@cornerstonejs/core": "^3.12.1",
"@cornerstonejs/tools": "^3.12.1",
"@cornerstonejs/core": "^3.12.2",
"@cornerstonejs/tools": "^3.12.2",
"classnames": "^2.3.2"
}
}

View File

@ -38,7 +38,7 @@
"@cornerstonejs/codec-libjpeg-turbo-8bit": "^1.2.2",
"@cornerstonejs/codec-openjpeg": "^1.2.4",
"@cornerstonejs/codec-openjph": "^2.4.5",
"@cornerstonejs/dicom-image-loader": "^3.12.1",
"@cornerstonejs/dicom-image-loader": "^3.12.2",
"@ohif/core": "3.11.0-beta.27",
"@ohif/ui": "3.11.0-beta.27",
"dcmjs": "*",
@ -51,12 +51,12 @@
},
"dependencies": {
"@babel/runtime": "^7.20.13",
"@cornerstonejs/adapters": "^3.12.1",
"@cornerstonejs/ai": "^3.12.1",
"@cornerstonejs/core": "^3.12.1",
"@cornerstonejs/labelmap-interpolation": "^3.12.1",
"@cornerstonejs/polymorphic-segmentation": "^3.12.1",
"@cornerstonejs/tools": "^3.12.1",
"@cornerstonejs/adapters": "^3.12.2",
"@cornerstonejs/ai": "^3.12.2",
"@cornerstonejs/core": "^3.12.2",
"@cornerstonejs/labelmap-interpolation": "^3.12.2",
"@cornerstonejs/polymorphic-segmentation": "^3.12.2",
"@cornerstonejs/tools": "^3.12.2",
"@itk-wasm/morphological-contour-interpolation": "1.1.0",
"@kitware/vtk.js": "32.12.0",
"html2canvas": "^1.4.1",

View File

@ -17,6 +17,7 @@ const SOPClassHandlerId =
'@ohif/extension-cornerstone.sopClassHandlerModule.DicomMicroscopySopClassHandler';
function _getDisplaySetsFromSeries(instances, servicesManager, extensionManager) {
const dataSource = extensionManager.getActiveDataSource()[0];
// If the series has no instances, stop here
if (!instances || !instances.length) {
throw new Error('No instances were provided');
@ -33,22 +34,6 @@ function _getDisplaySetsFromSeries(instances, servicesManager, extensionManager)
currentFrames = framesI;
}
}
let imageIdForThumbnail = null;
const dataSource = extensionManager.getActiveDataSource()[0];
if (singleFrameInstance) {
if (currentFrames == 1) {
// Not all DICOM server implementations support thumbnail service,
// So if we have a single-frame image, we will prefer it.
imageIdForThumbnail = singleFrameInstance.imageId;
}
if (!imageIdForThumbnail) {
// use the thumbnail service provided by DICOM server
imageIdForThumbnail = dataSource.getImageIdsForInstance({
instance: singleFrameInstance,
thumbnail: true,
});
}
}
const {
FrameOfReferenceUID,
@ -108,11 +93,14 @@ function _getDisplaySetsFromSeries(instances, servicesManager, extensionManager)
instance,
numImageFrames: 0,
numInstances: 1,
imageIdForThumbnail, // thumbnail image
others: instances, // all other level instances in the image Pyramid
instances,
othersFrameOfReferenceUID,
imageIds: instances.map(instance => instance.imageId),
getThumbnailSrc: dataSource.retrieve.getGetThumbnailSrc?.(
singleFrameInstance,
singleFrameInstance.imageId
),
label: SeriesDescription || `${i18n.t('Series')} ${SeriesNumber} - ${i18n.t('SM')}`,
};
// The microscopy viewer directly accesses the metadata already loaded, and

View File

@ -37,7 +37,15 @@ export type DicomWebConfig = {
wadoUri?: string; // - Base URL to use for WADO URI requests
qidoSupportsIncludeField?: boolean; // - Whether QIDO supports the "Include" option to request additional fields in response
imageRendering?: string; // - wadors | ? (unsure of where/how this is used)
thumbnailRendering?: string; // - wadors | ? (unsure of where/how this is used)
thumbnailRendering?: string;
/**
wadors - render using the wadors fetch. The full image is retrieved and rendered in cornerstone to thumbnail size png and returned as binary data to the src attribute of the image tag.
for example, <img src=data:image/png;base64,sdlfk;adkfadfk....asldfjkl;asdkf>
thumbnailDirect - get the direct url endpoint for the thumbnail as the image src (eg not authentication required).
for example, <img src=http://server:port/wadors/studies/1.2.3/thumbnail?accept=image/jpeg>
thumbnail - render using the thumbnail endpoint on wadors using bulkDataURI, passing authentication params to the url.
rendered - should use the rendered endpoint instead of the thumbnail endpoint
*/
/** Whether the server supports reject calls (i.e. DCM4CHEE) */
supportsReject?: boolean;
/** Request series meta async instead of blocking */
@ -225,6 +233,71 @@ function createDicomWebApi(dicomWebConfig: DicomWebConfig, servicesManager) {
* @returns an absolute URL to the resource, if the absolute URL can be retrieved as singlepart,
* or is already retrieved, or a promise to a URL for such use if a BulkDataURI
*/
getGetThumbnailSrc: function (instance, imageId) {
if (dicomWebConfig.thumbnailRendering === 'wadors') {
return function getThumbnailSrc(options) {
if (!imageId) {
return null;
}
if (!options?.getImageSrc) {
return null;
}
return options.getImageSrc(imageId);
};
}
if (dicomWebConfig.thumbnailRendering === 'thumbnailDirect') {
return function getThumbnailSrc() {
return this.directURL({
instance: instance,
defaultPath: '/thumbnail',
defaultType: 'image/jpeg',
singlepart: true,
tag: 'Absent',
});
}.bind(this);
}
if (dicomWebConfig.thumbnailRendering === 'thumbnail') {
return async function getThumbnailSrc() {
const { StudyInstanceUID, SeriesInstanceUID, SOPInstanceUID } = instance;
const bulkDataURI = `${dicomWebConfig.wadoRoot}/studies/${StudyInstanceUID}/series/${SeriesInstanceUID}/instances/${SOPInstanceUID}/thumbnail?accept=image/jpeg`;
return URL.createObjectURL(
new Blob(
[
await this.bulkDataURI({
BulkDataURI: bulkDataURI.replace('wadors:', ''),
defaultType: 'image/jpeg',
mediaTypes: ['image/jpeg'],
thumbnail: true,
}),
],
{ type: 'image/jpeg' }
)
);
}.bind(this);
}
if (dicomWebConfig.thumbnailRendering === 'rendered') {
return async function getThumbnailSrc() {
const { StudyInstanceUID, SeriesInstanceUID, SOPInstanceUID } = instance;
const bulkDataURI = `${dicomWebConfig.wadoRoot}/studies/${StudyInstanceUID}/series/${SeriesInstanceUID}/instances/${SOPInstanceUID}/rendered?accept=image/jpeg`;
return URL.createObjectURL(
new Blob(
[
await this.bulkDataURI({
BulkDataURI: bulkDataURI.replace('wadors:', ''),
defaultType: 'image/jpeg',
mediaTypes: ['image/jpeg'],
thumbnail: true,
}),
],
{ type: 'image/jpeg' }
)
);
}.bind(this);
}
},
directURL: params => {
return getDirectURL(
{

View File

@ -10,17 +10,7 @@ import { CallbackCustomization } from 'platform/core/src/types';
const { sortStudyInstances, formatDate, createStudyBrowserTabs } = utils;
const thumbnailNoImageModalities = [
'SR',
'SEG',
'SM',
'RTSTRUCT',
'RTPLAN',
'RTDOSE',
'DOC',
'OT',
'PMAP',
];
const thumbnailNoImageModalities = ['SR', 'SEG', 'RTSTRUCT', 'RTPLAN', 'RTDOSE', 'DOC', 'PMAP'];
/**
* Study Browser component that displays and manages studies and their display sets
@ -178,7 +168,7 @@ function PanelStudyBrowser({
let currentDisplaySets = displaySetService.activeDisplaySets;
// filter non based on the list of modalities that are supported by cornerstone
currentDisplaySets = currentDisplaySets.filter(
ds => !thumbnailNoImageModalities.includes(ds.Modality)
ds => !thumbnailNoImageModalities.includes(ds.Modality) || ds.thumbnailSrc === null
);
if (!currentDisplaySets.length) {
@ -188,20 +178,20 @@ function PanelStudyBrowser({
currentDisplaySets.forEach(async dSet => {
const newImageSrcEntry = {};
const displaySet = displaySetService.getDisplaySetByUID(dSet.displaySetInstanceUID);
const imageIds = dataSource.getImageIdsForDisplaySet(displaySet);
const imageIds = dataSource.getImageIdsForDisplaySet(dSet);
const imageId = getImageIdForThumbnail(displaySet, imageIds);
// TODO: Is it okay that imageIds are not returned here for SR displaySets?
if (!imageId || displaySet?.unsupported) {
if (displaySet?.unsupported) {
return;
}
// When the image arrives, render it and store the result in the thumbnailImgSrcMap
let { thumbnailSrc } = displaySet;
if (!thumbnailSrc && displaySet.getThumbnailSrc) {
thumbnailSrc = await displaySet.getThumbnailSrc();
thumbnailSrc = await displaySet.getThumbnailSrc({ getImageSrc });
}
if (!thumbnailSrc) {
if (!thumbnailSrc && imageId) {
const thumbnailSrc = await getImageSrc(imageId);
displaySet.thumbnailSrc = thumbnailSrc;
}
@ -253,13 +243,11 @@ function PanelStudyBrowser({
const { displaySetsAdded, options } = data;
displaySetsAdded.forEach(async dSet => {
const displaySetInstanceUID = dSet.displaySetInstanceUID;
const newImageSrcEntry = {};
const displaySet = displaySetService.getDisplaySetByUID(displaySetInstanceUID);
if (displaySet?.unsupported) {
return;
}
if (options?.madeInClient) {
setJumpToDisplaySet(displaySetInstanceUID);
}
@ -275,7 +263,7 @@ function PanelStudyBrowser({
// When the image arrives, render it and store the result in the thumbnailImgSrcMap
let { thumbnailSrc } = displaySet;
if (!thumbnailSrc && displaySet.getThumbnailSrc) {
thumbnailSrc = await displaySet.getThumbnailSrc();
thumbnailSrc = await displaySet.getThumbnailSrc({ getImageSrc });
}
if (!thumbnailSrc) {
thumbnailSrc = await getImageSrc(imageId);
@ -512,7 +500,11 @@ function _mapDisplaySets(displaySets, displaySetLoadingState, thumbnailImageSrcM
}
function _getComponentType(ds) {
if (thumbnailNoImageModalities.includes(ds.Modality) || ds?.unsupported) {
if (
thumbnailNoImageModalities.includes(ds.Modality) ||
ds?.unsupported ||
ds.thumbnailSrc === null
) {
return 'thumbnailNoImage';
}

View File

@ -5,7 +5,13 @@ import getDisplaySetMessages from './getDisplaySetMessages';
import getDisplaySetsFromUnsupportedSeries from './getDisplaySetsFromUnsupportedSeries';
import { chartHandler } from './SOPClassHandlers/chartSOPClassHandler';
const { isImage, sopClassDictionary, isDisplaySetReconstructable } = utils;
const {
isImage,
sortStudyInstances,
instancesSortCriteria,
sopClassDictionary,
isDisplaySetReconstructable,
} = utils;
const { ImageSet } = classes;
const DEFAULT_VOLUME_LOADER_SCHEME = 'cornerstoneStreamingImageVolume';
@ -62,9 +68,12 @@ function getDisplaySetInfo(instances) {
}
const makeDisplaySet = instances => {
// Need to sort the instances in order to get a consistent instance/thumbnail
sortStudyInstances(instances);
const instance = instances[0];
const imageSet = new ImageSet(instances);
const { extensionManager } = appContext;
const dataSource = extensionManager.getActiveDataSource()[0];
const {
isDynamicVolume,
value: isReconstructable,
@ -79,6 +88,16 @@ const makeDisplaySet = instances => {
// set appropriate attributes to image set...
const messages = getDisplaySetMessages(instances, isReconstructable, isDynamicVolume);
const imageIds = dataSource.getImageIdsForDisplaySet(imageSet);
let imageId = imageIds[Math.floor(imageIds.length / 2)];
let thumbnailInstance = instances[Math.floor(instances.length / 2)];
if (isDynamicVolume) {
const timePoints = dynamicVolumeInfo.timePoints;
const middleIndex = Math.floor(timePoints.length / 2);
const middleTimePointImageIds = timePoints[middleIndex];
imageId = middleTimePointImageIds[Math.floor(middleTimePointImageIds.length / 2)];
}
imageSet.setAttributes({
volumeLoaderSchema,
displaySetInstanceUID: imageSet.uid, // create a local alias for the imageSet UID
@ -100,6 +119,7 @@ const makeDisplaySet = instances => {
averageSpacingBetweenFrames: averageSpacingBetweenFrames || null,
isDynamicVolume,
dynamicVolumeInfo,
getThumbnailSrc: dataSource.retrieve.getGetThumbnailSrc?.(thumbnailInstance, imageId),
supportsWindowLevel: true,
label:
instance.SeriesDescription ||
@ -107,14 +127,7 @@ const makeDisplaySet = instances => {
FrameOfReferenceUID: instance.FrameOfReferenceUID,
});
// Sort the images in this series if needed
const shallSort = true; //!OHIF.utils.ObjectPath.get(Meteor, 'settings.public.ui.sortSeriesByIncomingOrder');
if (shallSort) {
imageSet.sortBy((a, b) => {
// Sort by InstanceNumber (0020,0013)
return (parseInt(a.InstanceNumber) || 0) - (parseInt(b.InstanceNumber) || 0);
});
}
imageSet.sortBy(instancesSortCriteria.default);
// Include the first image instance number (after sorted)
/*imageSet.setAttribute(
@ -178,10 +191,8 @@ function getDisplaySetsFromSeries(instances) {
}
let displaySet;
if (isMultiFrame(instance)) {
displaySet = makeDisplaySet([instance]);
displaySet.setAttributes({
sopClassUids,
numImageFrames: instance.NumberOfFrames,

View File

@ -14,7 +14,7 @@ const _getDisplaySetsFromSeries = (instances, servicesManager, extensionManager)
const { Modality, SOPInstanceUID } = instance;
const { SeriesDescription = 'PDF', MIMETypeOfEncapsulatedDocument } = instance;
const { SeriesNumber, SeriesDate, SeriesInstanceUID, StudyInstanceUID, SOPClassUID } = instance;
const pdfUrl = dataSource.retrieve.directURL({
const renderedUrl = dataSource.retrieve.directURL({
instance,
tag: 'EncapsulatedDocument',
defaultType: MIMETypeOfEncapsulatedDocument || 'application/pdf',
@ -35,14 +35,9 @@ const _getDisplaySetsFromSeries = (instances, servicesManager, extensionManager)
SOPClassUID,
referencedImages: null,
measurements: null,
pdfUrl,
renderedUrl: renderedUrl,
instances: [instance],
thumbnailSrc: dataSource.retrieve.directURL({
instance,
defaultPath: '/thumbnail',
defaultType: 'image/jpeg',
tag: 'Absent',
}),
thumbnailSrc: null,
isDerivedDisplaySet: true,
isLoaded: false,
sopClassUids,

View File

@ -28,15 +28,15 @@ function OHIFCornerstonePdfViewport({ displaySets }) {
);
}
const { pdfUrl } = displaySets[0];
const { renderedUrl } = displaySets[0];
useEffect(() => {
const load = async () => {
setUrl(await pdfUrl);
setUrl(await renderedUrl);
};
load();
}, [pdfUrl]);
}, [renderedUrl]);
return (
<div

View File

@ -32,6 +32,8 @@ const supportedTransferSyntaxUIDs = Object.values(SupportedTransferSyntaxes);
const _getDisplaySetsFromSeries = (instances, servicesManager, extensionManager) => {
const dataSource = extensionManager.getActiveDataSource()[0];
const thumbnailSrc = null;
console.warn('dataSource=', dataSource);
return instances
.filter(metadata => {
const tsuid =
@ -75,16 +77,9 @@ const _getDisplaySetsFromSeries = (instances, servicesManager, extensionManager)
referencedImages: null,
measurements: null,
viewportType: csEnums.ViewportType.VIDEO,
// The videoUrl is deprecated, the preferred URL is renderedUrl
videoUrl,
renderedUrl: videoUrl,
instances: [instance],
thumbnailSrc: dataSource.retrieve.directURL({
instance,
defaultPath: '/thumbnail',
defaultType: 'image/jpeg',
tag: 'Absent',
}),
getThumbnailSrc: dataSource.retrieve.getGetThumbnailSrc?.(instance),
thumbnailSrc,
imageIds: [imageId],
isDerivedDisplaySet: true,
isLoaded: false,

View File

@ -32,8 +32,8 @@
"start": "yarn run dev"
},
"peerDependencies": {
"@cornerstonejs/core": "^3.12.1",
"@cornerstonejs/tools": "^3.12.1",
"@cornerstonejs/core": "^3.12.2",
"@cornerstonejs/tools": "^3.12.2",
"@ohif/core": "3.11.0-beta.27",
"@ohif/extension-cornerstone-dicom-sr": "3.11.0-beta.27",
"@ohif/extension-default": "3.11.0-beta.27",

View File

@ -5,17 +5,7 @@ import PanelStudyBrowser from '@ohif/extension-default/src/Panels/StudyBrowser/P
import { UntrackSeriesModal } from './untrackSeriesModal';
import { useTrackedMeasurements } from '../../getContextModule';
const thumbnailNoImageModalities = [
'SR',
'SEG',
'SM',
'RTSTRUCT',
'RTPLAN',
'RTDOSE',
'DOC',
'OT',
'PMAP',
];
const thumbnailNoImageModalities = ['SR', 'SEG', 'RTSTRUCT', 'RTPLAN', 'RTDOSE', 'PMAP'];
/**
* Panel component for the Study Browser with tracking capabilities
@ -126,7 +116,11 @@ export default function PanelStudyBrowserTracking({
// Override component type to use tracking specific components
const getComponentType = ds => {
if (thumbnailNoImageModalities.includes(ds.Modality) || ds?.unsupported) {
if (
thumbnailNoImageModalities.includes(ds.Modality) ||
ds.unsupported ||
ds.thumbnailSrc === null
) {
return 'thumbnailNoImage';
}
return 'thumbnailTracked';

View File

@ -57,8 +57,9 @@
"test:e2e:coverage": "nyc --reporter=html yarn run test:e2e:ci",
"test:e2e:ci": "TEST_ENV=true npx playwright test",
"test:e2e:ui": "TEST_ENV=true npx playwright test --ui",
"test:e2e:reporter": "TEST_ENV=true npx playwright test --reporter=html -g @debug",
"test:e2e:update": "TEST_ENV=true npx playwright test --reporter=html -g @debug --update-snapshots",
"test:e2e:reporter": "TEST_ENV=true npx playwright test --reporter=html",
"test:e2e:update": "TEST_ENV=true npx playwright test --reporter=html --update-snapshots",
"test:e2e:update:debug": "TEST_ENV=true npx playwright test -g @debug --reporter=html --update-snapshots ",
"test:e2e:headed": "TEST_ENV=true npx playwright test --headed",
"test:e2e:debug": "TEST_ENV=true npx playwright test --debug",
"test:e2e:dist": "lerna run test:e2e:dist --stream",

View File

@ -5,11 +5,11 @@ describe('OHIF Video Display', function () {
});
it('checks if series thumbnails are being displayed', function () {
cy.get('[data-cy="study-browser-thumbnail-no-image"]').its('length').should('be.gt', 1);
cy.get('[data-cy="study-browser-thumbnail-no-image"]').its('length').should('be.eq', 1);
});
it('performs double-click to load thumbnail in active viewport', () => {
cy.get('[data-cy="study-browser-thumbnail-no-image"]:nth-child(2)').dblclick();
cy.get('[data-cy="study-browser-thumbnail-no-image"]:nth-child(1)').dblclick();
//const expectedText = 'Ser: 3';
//cy.get('@viewportInfoBottomLeft').should('contains.text', expectedText);

View File

@ -53,7 +53,7 @@
"@cornerstonejs/codec-libjpeg-turbo-8bit": "^1.2.2",
"@cornerstonejs/codec-openjpeg": "^1.2.4",
"@cornerstonejs/codec-openjph": "^2.4.5",
"@cornerstonejs/dicom-image-loader": "^3.12.1",
"@cornerstonejs/dicom-image-loader": "^3.12.2",
"@emotion/serialize": "^1.1.3",
"@ohif/core": "3.11.0-beta.27",
"@ohif/extension-cornerstone": "3.11.0-beta.27",

View File

@ -138,7 +138,7 @@ window.config = {
supportsReject: true,
supportsStow: true,
imageRendering: 'wadors',
thumbnailRendering: 'wadors',
thumbnailRendering: 'thumbnail',
enableStudyLazyLoad: true,
supportsFuzzyMatching: false,
supportsWildcard: true,

View File

@ -136,7 +136,7 @@ window.config = {
supportsReject: true,
supportsStow: true,
imageRendering: 'wadors',
thumbnailRendering: 'wadors',
thumbnailRendering: 'thumbnail',
enableStudyLazyLoad: true,
supportsFuzzyMatching: false,
supportsWildcard: true,

View File

@ -37,8 +37,8 @@
"@cornerstonejs/codec-libjpeg-turbo-8bit": "^1.2.2",
"@cornerstonejs/codec-openjpeg": "^1.2.4",
"@cornerstonejs/codec-openjph": "^2.4.5",
"@cornerstonejs/core": "^3.12.1",
"@cornerstonejs/dicom-image-loader": "^3.12.1",
"@cornerstonejs/core": "^3.12.2",
"@cornerstonejs/dicom-image-loader": "^3.12.2",
"@ohif/ui": "3.11.0-beta.27",
"cornerstone-math": "0.1.9",
"dicom-parser": "^1.8.21"

View File

@ -18,10 +18,21 @@ export type DisplaySet = {
isOverlayDisplaySet?: boolean;
// Details about how to display:
/** A URL that can be used to display the thumbnail. Typically a data url */
/**
* A URL that can be used to display the thumbnail. Typically a data url
* This can be set to null to avoid trying to display a thumbnail, eg for
* display sets without a thumbnail.
*/
thumbnailSrc?: string;
/** A fetch method to get the thumbnail */
getThumbnailSrc?(imageId?: string): Promise<string>;
/**
* A fetch URL to display the content. This is used for content such as
* pdf display.
*/
renderedUrl?: string;
SeriesDate?: string;
SeriesTime?: string;
instance?: InstanceMetadata;

View File

@ -35,6 +35,7 @@ import {
sortStudyInstances,
sortingCriteria,
seriesSortCriteria,
instancesSortCriteria,
} from './sortStudy';
import { splitComma, getSplitParam } from './splitComma';
import { createStudyBrowserTabs } from './createStudyBrowserTabs';
@ -56,6 +57,7 @@ const utils = {
sortStudyInstances,
sortingCriteria,
seriesSortCriteria,
instancesSortCriteria,
writeScript,
formatDate,
formatTime,

View File

@ -42,7 +42,19 @@ const seriesSortCriteria = {
};
const instancesSortCriteria = {
default: (a, b) => parseInt(a.InstanceNumber) - parseInt(b.InstanceNumber),
default: (a, b) => {
// Sort by InstanceNumber (0020,0013)
const aInstance = parseInt(a.InstanceNumber) || 0;
const bInstance = parseInt(b.InstanceNumber) || 0;
if (aInstance !== bInstance) {
return (parseInt(a.InstanceNumber) || 0) - (parseInt(b.InstanceNumber) || 0);
}
// Fallback rule to enable consistent sorting
if (a.SOPInstanceUID === b.SOPInstanceUID) {
return 0;
}
return a.SOPInstanceUID < b.SOPInstanceUID ? -1 : 1;
},
};
const sortingCriteria = {
@ -116,4 +128,11 @@ export default function sortStudy(
return study;
}
export { sortStudy, sortStudySeries, sortStudyInstances, sortingCriteria, seriesSortCriteria };
export {
sortStudy,
sortStudySeries,
sortStudyInstances,
sortingCriteria,
seriesSortCriteria,
instancesSortCriteria,
};

View File

@ -8,14 +8,15 @@ summary: Guide to writing and running end-to-end tests for OHIF Viewer using Pla
:::note
You might need to run the `yarn playwright install ` for the first time if you have not
You might need to run the `bun playwright install ` for the first time if you have not
:::
# Running the tests
```bash
#
# run the tests
yarn test:e2e:ui
bun test:e2e:ui
```

View File

@ -67,12 +67,12 @@ const Thumbnail = ({
)}
>
<div className="h-[114px] w-[128px]">
<div className="relative">
<div className="relative bg-black">
{imageSrc ? (
<img
src={imageSrc}
alt={imageAltText}
className="h-[114px] w-[128px] rounded"
className="h-[114px] w-[128px] rounded object-contain"
crossOrigin="anonymous"
/>
) : (

View File

@ -105,6 +105,8 @@ test.describe('Crosshairs Test', async () => {
await page.getByTestId('study-browser-thumbnail').nth(1).dblclick();
await page.waitForTimeout(5000);
await checkForScreenshot(page, page, screenShotPaths.crosshairs.crosshairsNewDisplayset);
});
});

View File

@ -12,11 +12,14 @@ test('should properly display MPR for MR', async ({ page }) => {
await page.getByTestId('study-browser-thumbnail-no-image').dblclick();
await page.getByTestId('yes-hydrate-btn').click();
await page.waitForTimeout(5000);
await checkForScreenshot(page, page, screenShotPaths.segHydrationThenMPR.segPostHydration);
await page.getByTestId('Layout').click();
await page.getByTestId('Axial Primary').click();
await page.waitForTimeout(5000);
await checkForScreenshot(
page,
page,

View File

@ -5,7 +5,7 @@ test.beforeEach(async ({ page }) => {
const studyInstanceUID =
'1.3.12.2.1107.5.2.32.35162.30000015050317233592200000046&hangingprotocolid=mpr';
const mode = 'viewer';
await visitStudy(page, studyInstanceUID, mode, 2000);
await visitStudy(page, studyInstanceUID, mode, 10000);
});
test('should properly display MPR for MR', async ({ page }) => {

Binary file not shown.

Before

Width:  |  Height:  |  Size: 327 KiB

After

Width:  |  Height:  |  Size: 323 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 294 KiB

After

Width:  |  Height:  |  Size: 289 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 306 KiB

After

Width:  |  Height:  |  Size: 304 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 302 KiB

After

Width:  |  Height:  |  Size: 298 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 255 KiB

After

Width:  |  Height:  |  Size: 250 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 320 KiB

After

Width:  |  Height:  |  Size: 316 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 257 KiB

After

Width:  |  Height:  |  Size: 252 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 262 KiB

After

Width:  |  Height:  |  Size: 256 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 255 KiB

After

Width:  |  Height:  |  Size: 250 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 230 KiB

After

Width:  |  Height:  |  Size: 250 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 215 KiB

After

Width:  |  Height:  |  Size: 210 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 212 KiB

After

Width:  |  Height:  |  Size: 207 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 215 KiB

After

Width:  |  Height:  |  Size: 209 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 189 KiB

After

Width:  |  Height:  |  Size: 184 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 147 KiB

After

Width:  |  Height:  |  Size: 145 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 261 KiB

After

Width:  |  Height:  |  Size: 256 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 132 KiB

After

Width:  |  Height:  |  Size: 132 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 252 KiB

After

Width:  |  Height:  |  Size: 247 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 277 KiB

After

Width:  |  Height:  |  Size: 268 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 224 KiB

After

Width:  |  Height:  |  Size: 218 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 210 KiB

After

Width:  |  Height:  |  Size: 198 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 210 KiB

After

Width:  |  Height:  |  Size: 198 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 224 KiB

After

Width:  |  Height:  |  Size: 218 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 146 KiB

After

Width:  |  Height:  |  Size: 136 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 254 KiB

After

Width:  |  Height:  |  Size: 249 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 259 KiB

After

Width:  |  Height:  |  Size: 254 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 212 KiB

After

Width:  |  Height:  |  Size: 207 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 256 KiB

After

Width:  |  Height:  |  Size: 250 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 86 KiB

After

Width:  |  Height:  |  Size: 86 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 86 KiB

After

Width:  |  Height:  |  Size: 85 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 90 KiB

After

Width:  |  Height:  |  Size: 90 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 96 KiB

After

Width:  |  Height:  |  Size: 94 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 259 KiB

After

Width:  |  Height:  |  Size: 254 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 133 KiB

After

Width:  |  Height:  |  Size: 132 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 241 KiB

After

Width:  |  Height:  |  Size: 235 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 221 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 250 KiB

After

Width:  |  Height:  |  Size: 250 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 223 KiB

After

Width:  |  Height:  |  Size: 222 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 262 KiB

After

Width:  |  Height:  |  Size: 261 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 254 KiB

After

Width:  |  Height:  |  Size: 252 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 298 KiB

After

Width:  |  Height:  |  Size: 297 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 218 KiB

After

Width:  |  Height:  |  Size: 213 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 220 KiB

After

Width:  |  Height:  |  Size: 217 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 297 KiB

After

Width:  |  Height:  |  Size: 296 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 279 KiB

After

Width:  |  Height:  |  Size: 282 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 293 KiB

After

Width:  |  Height:  |  Size: 296 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 217 KiB

After

Width:  |  Height:  |  Size: 217 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 258 KiB

After

Width:  |  Height:  |  Size: 252 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 218 KiB

After

Width:  |  Height:  |  Size: 212 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 306 KiB

After

Width:  |  Height:  |  Size: 302 KiB

View File

@ -1393,10 +1393,10 @@
resolved "https://registry.yarnpkg.com/@colors/colors/-/colors-1.5.0.tgz#bb504579c1cae923e6576a4f5da43d25f97bdbd9"
integrity sha512-ooWCrlZP11i8GImSjTHYHLkvFDP48nS4+204nGb1RiX/WXYHmJA2III9/e2DWVabCESdW7hBAEzHRqUn9OUVvQ==
"@cornerstonejs/adapters@^3.12.1":
version "3.12.1"
resolved "https://registry.yarnpkg.com/@cornerstonejs/adapters/-/adapters-3.12.1.tgz#e5d546802c78981f9de6fbf2702517d9fcafb592"
integrity sha512-2HrqwpTTE5d7UNzjbp8TDYucf2j36sENfd3gK1k0Ui6na4yfEiHecNZgy6x6y5M5DcKzXofl2a64XvXXYYotzQ==
"@cornerstonejs/adapters@^3.12.2":
version "3.12.2"
resolved "https://registry.yarnpkg.com/@cornerstonejs/adapters/-/adapters-3.12.2.tgz#835ed61cfc26257af4a37f03023f539eaeca59d1"
integrity sha512-yKPT9U1/CUtXu/h3xXB8KYX3x3bHgedw3nPX6eOn8oDhynfjuvA+i+4xJxKtO182mi2WnAQwFPnzkgmEVyrSqA==
dependencies:
"@babel/runtime-corejs2" "^7.17.8"
buffer "^6.0.3"
@ -1404,10 +1404,10 @@
gl-matrix "^3.4.3"
ndarray "^1.0.19"
"@cornerstonejs/ai@^3.12.1":
version "3.12.1"
resolved "https://registry.yarnpkg.com/@cornerstonejs/ai/-/ai-3.12.1.tgz#b8b351a9da574dccd54acc9805ed40455733926e"
integrity sha512-tey1CUoufVX+SogsyR9Yaljxhs6mKk0MBX0rAThgbphb74PFlDC3Kl9AcYBFJNjRcIy6K0cIR4e1/RtKFGsPeQ==
"@cornerstonejs/ai@^3.12.2":
version "3.12.2"
resolved "https://registry.yarnpkg.com/@cornerstonejs/ai/-/ai-3.12.2.tgz#8e55d96f15941218f0c3b5af0c992806b9a2f2d7"
integrity sha512-Btyey9KNcJqzIG7trFqDHo08zJVO3XtVEbfbJiUfRoztwQTKrtxOJ40dsz3pU3+PNQgG0bmTPhe9yRSpcVdwRA==
dependencies:
"@babel/runtime-corejs2" "^7.17.8"
buffer "^6.0.3"
@ -1443,20 +1443,20 @@
resolved "https://registry.yarnpkg.com/@cornerstonejs/codec-openjph/-/codec-openjph-2.4.5.tgz#8690b61a86fa53ef38a70eee9d665a79229517c0"
integrity sha512-MZCUy8VG0VG5Nl1l58+g+kH3LujAzLYTfJqkwpWI2gjSrGXnP6lgwyy4GmPRZWVoS40/B1LDNALK905cNWm+sg==
"@cornerstonejs/core@^3.12.1":
version "3.12.1"
resolved "https://registry.yarnpkg.com/@cornerstonejs/core/-/core-3.12.1.tgz#3b165d0fa2e12bc6a60f5b2e306b8d53f6c9cad8"
integrity sha512-pWFbobllPu0mjnAbV6/4U+YaRKoY661yNCdw1BUvm0Vs/FVNGz0E61/VVtZfS2L/gatj3SBpYPTw6k6G9wk1AA==
"@cornerstonejs/core@^3.12.2":
version "3.12.2"
resolved "https://registry.yarnpkg.com/@cornerstonejs/core/-/core-3.12.2.tgz#eeba299b27cca3664e760a9a83aa58dd0d6dc305"
integrity sha512-AKFHr7XF5zKUo1BiclJmUz913yD9NiQgLl3krTmvtlWPuOUhpxoCfipW0De5dMeVuQ86iQDV1F+p7HuWOWfdwg==
dependencies:
"@kitware/vtk.js" "32.12.1"
comlink "^4.4.1"
gl-matrix "^3.4.3"
loglevel "^1.9.2"
"@cornerstonejs/dicom-image-loader@^3.12.1":
version "3.12.1"
resolved "https://registry.yarnpkg.com/@cornerstonejs/dicom-image-loader/-/dicom-image-loader-3.12.1.tgz#8d650c1574dea90420dfe49d5aa0a305b0dd6aa7"
integrity sha512-HX4++HYN0Lx8g8fTTVbp7DPsEWJHXRDqO9nuiJzgr9b79nMp1rrybTcP07RIXY38iCsSBr17WIkPWMxdby4nPw==
"@cornerstonejs/dicom-image-loader@^3.12.2":
version "3.12.2"
resolved "https://registry.yarnpkg.com/@cornerstonejs/dicom-image-loader/-/dicom-image-loader-3.12.2.tgz#ebf0915baed75ed37d38285f06c1a8e3cba7372d"
integrity sha512-LaKnv5OPMlRPzkuqReVl1Gpa9ERTQJXl/1/Iku9wbWjnGrkzdF4Ef8bG0DseLx57qMOJPJP++PsxeXCaOgXvyw==
dependencies:
"@cornerstonejs/codec-charls" "^1.2.3"
"@cornerstonejs/codec-libjpeg-turbo-8bit" "^1.2.2"
@ -1468,25 +1468,25 @@
pako "^2.0.4"
uuid "^9.0.0"
"@cornerstonejs/labelmap-interpolation@^3.12.1":
version "3.12.1"
resolved "https://registry.yarnpkg.com/@cornerstonejs/labelmap-interpolation/-/labelmap-interpolation-3.12.1.tgz#74f3583634c3150cb38dd81d9be1a4668bf1e64f"
integrity sha512-ikTaajRrtNgjPrtcwqaac59uRX3JMIttOLLQgHR9qt7UNNs91BrbkoKGZkVER5YL3R+9o7olKUgdgprxVKE/Cw==
"@cornerstonejs/labelmap-interpolation@^3.12.2":
version "3.12.2"
resolved "https://registry.yarnpkg.com/@cornerstonejs/labelmap-interpolation/-/labelmap-interpolation-3.12.2.tgz#e1682f97592b09a5246e33b4ab110a694b2f281b"
integrity sha512-5T2OtNyV2jMy66k2clG/Krk1x4xFOxlS9sGxT1eMOrELClzpY+cL+IuA6f0aD6vTwkp1fFojEIa0IFbwuCK8HQ==
dependencies:
"@itk-wasm/morphological-contour-interpolation" "1.1.0"
itk-wasm "1.0.0-b.165"
"@cornerstonejs/polymorphic-segmentation@^3.12.1":
version "3.12.1"
resolved "https://registry.yarnpkg.com/@cornerstonejs/polymorphic-segmentation/-/polymorphic-segmentation-3.12.1.tgz#b80d133c533c5e93a680521c618d5521efb37645"
integrity sha512-gdDq1Qh3c37IZxaTwE4k9dEQE7CzQ1anfDg9foiJnJkBHVwgWpMiC/ztSa+c22LgN6ksQnWDz5TGIHqJ+ozscQ==
"@cornerstonejs/polymorphic-segmentation@^3.12.2":
version "3.12.2"
resolved "https://registry.yarnpkg.com/@cornerstonejs/polymorphic-segmentation/-/polymorphic-segmentation-3.12.2.tgz#80be77b1d46ff5c6edd8346099d239cf6504298a"
integrity sha512-pmOpmOKUaAM3EIklZLufWJ9IVTRpp54MF+B6cnirGEYYobjFT+uTrLwrExwVC1kEVHi8o4n5X8SJnawtIu/ugA==
dependencies:
"@icr/polyseg-wasm" "0.4.0"
"@cornerstonejs/tools@^3.12.1":
version "3.12.1"
resolved "https://registry.yarnpkg.com/@cornerstonejs/tools/-/tools-3.12.1.tgz#476b457c303d2e37a064acf0a09d1d203bfec5b0"
integrity sha512-0Yax5NIdX1X6ELMf32rticoTehPFh2k0OTx/znAf3IgMUYdsox4peMe8Lf72MrFvmLeDvtyB45iT0Xk6bjeAvw==
"@cornerstonejs/tools@^3.12.2":
version "3.12.2"
resolved "https://registry.yarnpkg.com/@cornerstonejs/tools/-/tools-3.12.2.tgz#6db5e1ea6cc986a8a647fd64bea05e3dcb15fb46"
integrity sha512-Zx9BFl2OAuCQGrr6o+e1tV3fMSoAARC7HlVWprUrGWwDA29LVRxQT+cc+Wo76GjxcKSMo5RuLt1+sgRj0+CsAA==
dependencies:
"@types/offscreencanvas" "2019.7.3"
comlink "^4.4.1"