From 0f9c513781dbf976552ac027a83dec2dc2482490 Mon Sep 17 00:00:00 2001 From: Igor Octaviano Date: Tue, 6 Oct 2026 07:14:21 -0300 Subject: [PATCH 1/2] fix: convert segment index error to warning with graceful skip When a SEG frame is missing SegmentIdentificationSequence in both per-frame and shared functional groups, the code now logs a warning and skips that frame instead of throwing an error that aborts the entire segmentation loading. This follows the same pattern already used for missing imageIds (lines 587-589) and makes SEG loading more resilient to non-standard or incomplete DICOM SEG files. Per DICOM PS3.3 C.8.20.3.1, SegmentIdentificationSequence is required for LABELMAP segmentations, but graceful degradation is preferred over hard failure when encountering non-compliant files. --- patches/@cornerstonejs__adapters.patch | 16 +++++++++++++--- pnpm-lock.yaml | 12 ++++++------ 2 files changed, 19 insertions(+), 9 deletions(-) diff --git a/patches/@cornerstonejs__adapters.patch b/patches/@cornerstonejs__adapters.patch index d950ae88ff4..6bf219b8684 100644 --- a/patches/@cornerstonejs__adapters.patch +++ b/patches/@cornerstonejs__adapters.patch @@ -26,7 +26,17 @@ index db4972221ea40cd1eaad450e9a6334c8eef4ef72..120316e2ac6929810b1da4b5cc4cfb08 const ImageOrientationPatientI = sharedImageOrientationPatient || (PerFrameFunctionalGroups === null || PerFrameFunctionalGroups === void 0 || (_PerFrameFunctionalGr = PerFrameFunctionalGroups.PlaneOrientationSequence) === null || _PerFrameFunctionalGr === void 0 ? void 0 : _PerFrameFunctionalGr.ImageOrientationPatient); if (!ImageOrientationPatientI) { throw new Error("SEG frame ".concat(i + 1, " is missing ImageOrientationPatient in per-frame and shared functional groups.")); -@@ -817,7 +818,7 @@ function insertOverlappingPixelDataPlanar(_ref12) { +@@ -576,7 +577,8 @@ function insertPixelDataPlanar(_ref0) { + } + const segmentIndex = getSegmentIndex(multiframe, i); + if (segmentIndex === undefined) { +- throw new Error('Could not retrieve the segment index. Aborting segmentation loading.'); ++ console.warn('Could not retrieve the segment index for frame ' + i + ', skipping this frame.'); ++ continue; + } + if (!segmentsPixelIndices.has(segmentIndex)) { + segmentsPixelIndices.set(segmentIndex, {}); +@@ -817,7 +819,7 @@ function insertOverlappingPixelDataPlanar(_ref12) { PerFrameFunctionalGroupsSequence = multiframe.PerFrameFunctionalGroupsSequence, Rows = multiframe.Rows, Columns = multiframe.Columns; @@ -35,7 +45,7 @@ index db4972221ea40cd1eaad450e9a6334c8eef4ef72..120316e2ac6929810b1da4b5cc4cfb08 const sliceLength = Columns * Rows; const arrayOfSegmentData = getArrayOfSegmentData({ sliceLength, -@@ -910,7 +911,7 @@ const getSegmentData = _ref14 => { +@@ -910,7 +912,7 @@ const getSegmentData = _ref14 => { for (let currentLabelMapImageIndex = 0; currentLabelMapImageIndex < labelMapImages.length; currentLabelMapImageIndex++) { const currentLabelMapImage = labelMapImages[currentLabelMapImageIndex]; const referencedImageId = currentLabelMapImage.referencedImageId; @@ -44,7 +54,7 @@ index db4972221ea40cd1eaad450e9a6334c8eef4ef72..120316e2ac6929810b1da4b5cc4cfb08 const _extractInfoFromPerFr = extractInfoFromPerFrameFunctionalGroups({ PerFrameFunctionalGroups, sequenceIndex: currentSequenceIndex, -@@ -922,10 +923,10 @@ const getSegmentData = _ref14 => { +@@ -922,10 +924,10 @@ const getSegmentData = _ref14 => { const isCorrectPerFrameFunctionalGroup = groupsSegmentIndex === segmentIndex && groupsReferenceImageId === currentLabelMapImage.referencedImageId; return isCorrectPerFrameFunctionalGroup; }); diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 1e24bf79f7f..8022817ecd7 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -246,7 +246,7 @@ overrides: image-size@>=0.6.3 <2.0.4: 2.0.4 patchedDependencies: - '@cornerstonejs/adapters': 9ec6f243febe5c8358a1aaae2127e0e59d71548573a110eb33be51cf7dbc9a9c + '@cornerstonejs/adapters': 697e788e6de7173a43a904908dc4c7153fe70a9db6718bbe6e163c17295d90b0 '@cornerstonejs/core': a80dc1a8df5e9e7fbfe0ad7ab6eff21acfca717ebb4cbb8a751cd61d51ab4da5 importers: @@ -407,7 +407,7 @@ importers: version: 7.29.7 '@cornerstonejs/adapters': specifier: 5.6.8 - version: 5.6.8(patch_hash=9ec6f243febe5c8358a1aaae2127e0e59d71548573a110eb33be51cf7dbc9a9c)(@cornerstonejs/core@5.6.8(patch_hash=a80dc1a8df5e9e7fbfe0ad7ab6eff21acfca717ebb4cbb8a751cd61d51ab4da5)(@cornerstonejs/metadata@5.6.8)(@cornerstonejs/utils@5.6.8)(autoprefixer@10.6.1(postcss@8.5.26))(wslink@2.5.0))(@cornerstonejs/tools@5.6.8(@cornerstonejs/core@5.6.8(patch_hash=a80dc1a8df5e9e7fbfe0ad7ab6eff21acfca717ebb4cbb8a751cd61d51ab4da5)(@cornerstonejs/metadata@5.6.8)(@cornerstonejs/utils@5.6.8)(autoprefixer@10.6.1(postcss@8.5.26))(wslink@2.5.0))(@kitware/vtk.js@36.4.1(autoprefixer@10.6.1(postcss@8.5.26))(wslink@2.5.0))(@types/d3-array@3.2.1)(@types/d3-interpolate@3.0.4)(d3-array@3.2.4)(d3-interpolate@3.0.1)(gl-matrix@3.4.3)) + version: 5.6.8(patch_hash=697e788e6de7173a43a904908dc4c7153fe70a9db6718bbe6e163c17295d90b0)(@cornerstonejs/core@5.6.8(patch_hash=a80dc1a8df5e9e7fbfe0ad7ab6eff21acfca717ebb4cbb8a751cd61d51ab4da5)(@cornerstonejs/metadata@5.6.8)(@cornerstonejs/utils@5.6.8)(autoprefixer@10.6.1(postcss@8.5.26))(wslink@2.5.0))(@cornerstonejs/tools@5.6.8(@cornerstonejs/core@5.6.8(patch_hash=a80dc1a8df5e9e7fbfe0ad7ab6eff21acfca717ebb4cbb8a751cd61d51ab4da5)(@cornerstonejs/metadata@5.6.8)(@cornerstonejs/utils@5.6.8)(autoprefixer@10.6.1(postcss@8.5.26))(wslink@2.5.0))(@kitware/vtk.js@36.4.1(autoprefixer@10.6.1(postcss@8.5.26))(wslink@2.5.0))(@types/d3-array@3.2.1)(@types/d3-interpolate@3.0.4)(d3-array@3.2.4)(d3-interpolate@3.0.1)(gl-matrix@3.4.3)) '@cornerstonejs/ai': specifier: 5.6.8 version: 5.6.8(@cornerstonejs/core@5.6.8(patch_hash=a80dc1a8df5e9e7fbfe0ad7ab6eff21acfca717ebb4cbb8a751cd61d51ab4da5)(@cornerstonejs/metadata@5.6.8)(@cornerstonejs/utils@5.6.8)(autoprefixer@10.6.1(postcss@8.5.26))(wslink@2.5.0))(@cornerstonejs/tools@5.6.8(@cornerstonejs/core@5.6.8(patch_hash=a80dc1a8df5e9e7fbfe0ad7ab6eff21acfca717ebb4cbb8a751cd61d51ab4da5)(@cornerstonejs/metadata@5.6.8)(@cornerstonejs/utils@5.6.8)(autoprefixer@10.6.1(postcss@8.5.26))(wslink@2.5.0))(@kitware/vtk.js@36.4.1(autoprefixer@10.6.1(postcss@8.5.26))(wslink@2.5.0))(@types/d3-array@3.2.1)(@types/d3-interpolate@3.0.4)(d3-array@3.2.4)(d3-interpolate@3.0.1)(gl-matrix@3.4.3)) @@ -516,7 +516,7 @@ importers: version: 7.29.7 '@cornerstonejs/adapters': specifier: 5.6.8 - version: 5.6.8(patch_hash=9ec6f243febe5c8358a1aaae2127e0e59d71548573a110eb33be51cf7dbc9a9c)(@cornerstonejs/core@5.6.8(patch_hash=a80dc1a8df5e9e7fbfe0ad7ab6eff21acfca717ebb4cbb8a751cd61d51ab4da5)(@cornerstonejs/metadata@5.6.8)(@cornerstonejs/utils@5.6.8)(autoprefixer@10.6.1(postcss@8.5.26))(wslink@2.5.0))(@cornerstonejs/tools@5.6.8(@cornerstonejs/core@5.6.8(patch_hash=a80dc1a8df5e9e7fbfe0ad7ab6eff21acfca717ebb4cbb8a751cd61d51ab4da5)(@cornerstonejs/metadata@5.6.8)(@cornerstonejs/utils@5.6.8)(autoprefixer@10.6.1(postcss@8.5.26))(wslink@2.5.0))(@kitware/vtk.js@36.4.1(autoprefixer@10.6.1(postcss@8.5.26))(wslink@2.5.0))(@types/d3-array@3.2.1)(@types/d3-interpolate@3.0.4)(d3-array@3.2.4)(d3-interpolate@3.0.1)(gl-matrix@3.4.3)) + version: 5.6.8(patch_hash=697e788e6de7173a43a904908dc4c7153fe70a9db6718bbe6e163c17295d90b0)(@cornerstonejs/core@5.6.8(patch_hash=a80dc1a8df5e9e7fbfe0ad7ab6eff21acfca717ebb4cbb8a751cd61d51ab4da5)(@cornerstonejs/metadata@5.6.8)(@cornerstonejs/utils@5.6.8)(autoprefixer@10.6.1(postcss@8.5.26))(wslink@2.5.0))(@cornerstonejs/tools@5.6.8(@cornerstonejs/core@5.6.8(patch_hash=a80dc1a8df5e9e7fbfe0ad7ab6eff21acfca717ebb4cbb8a751cd61d51ab4da5)(@cornerstonejs/metadata@5.6.8)(@cornerstonejs/utils@5.6.8)(autoprefixer@10.6.1(postcss@8.5.26))(wslink@2.5.0))(@kitware/vtk.js@36.4.1(autoprefixer@10.6.1(postcss@8.5.26))(wslink@2.5.0))(@types/d3-array@3.2.1)(@types/d3-interpolate@3.0.4)(d3-array@3.2.4)(d3-interpolate@3.0.1)(gl-matrix@3.4.3)) '@cornerstonejs/core': specifier: 5.6.8 version: 5.6.8(patch_hash=a80dc1a8df5e9e7fbfe0ad7ab6eff21acfca717ebb4cbb8a751cd61d51ab4da5)(@cornerstonejs/metadata@5.6.8)(@cornerstonejs/utils@5.6.8)(autoprefixer@10.6.1(postcss@8.5.26))(wslink@2.5.0) @@ -605,7 +605,7 @@ importers: version: 7.29.7 '@cornerstonejs/adapters': specifier: 5.6.8 - version: 5.6.8(patch_hash=9ec6f243febe5c8358a1aaae2127e0e59d71548573a110eb33be51cf7dbc9a9c)(@cornerstonejs/core@5.6.8(patch_hash=a80dc1a8df5e9e7fbfe0ad7ab6eff21acfca717ebb4cbb8a751cd61d51ab4da5)(@cornerstonejs/metadata@5.6.8)(@cornerstonejs/utils@5.6.8)(autoprefixer@10.6.1(postcss@8.5.26))(wslink@2.5.0))(@cornerstonejs/tools@5.6.8(@cornerstonejs/core@5.6.8(patch_hash=a80dc1a8df5e9e7fbfe0ad7ab6eff21acfca717ebb4cbb8a751cd61d51ab4da5)(@cornerstonejs/metadata@5.6.8)(@cornerstonejs/utils@5.6.8)(autoprefixer@10.6.1(postcss@8.5.26))(wslink@2.5.0))(@kitware/vtk.js@36.4.1(autoprefixer@10.6.1(postcss@8.5.26))(wslink@2.5.0))(@types/d3-array@3.2.1)(@types/d3-interpolate@3.0.4)(d3-array@3.2.4)(d3-interpolate@3.0.1)(gl-matrix@3.4.3)) + version: 5.6.8(patch_hash=697e788e6de7173a43a904908dc4c7153fe70a9db6718bbe6e163c17295d90b0)(@cornerstonejs/core@5.6.8(patch_hash=a80dc1a8df5e9e7fbfe0ad7ab6eff21acfca717ebb4cbb8a751cd61d51ab4da5)(@cornerstonejs/metadata@5.6.8)(@cornerstonejs/utils@5.6.8)(autoprefixer@10.6.1(postcss@8.5.26))(wslink@2.5.0))(@cornerstonejs/tools@5.6.8(@cornerstonejs/core@5.6.8(patch_hash=a80dc1a8df5e9e7fbfe0ad7ab6eff21acfca717ebb4cbb8a751cd61d51ab4da5)(@cornerstonejs/metadata@5.6.8)(@cornerstonejs/utils@5.6.8)(autoprefixer@10.6.1(postcss@8.5.26))(wslink@2.5.0))(@kitware/vtk.js@36.4.1(autoprefixer@10.6.1(postcss@8.5.26))(wslink@2.5.0))(@types/d3-array@3.2.1)(@types/d3-interpolate@3.0.4)(d3-array@3.2.4)(d3-interpolate@3.0.1)(gl-matrix@3.4.3)) '@cornerstonejs/core': specifier: 5.6.8 version: 5.6.8(patch_hash=a80dc1a8df5e9e7fbfe0ad7ab6eff21acfca717ebb4cbb8a751cd61d51ab4da5)(@cornerstonejs/metadata@5.6.8)(@cornerstonejs/utils@5.6.8)(autoprefixer@10.6.1(postcss@8.5.26))(wslink@2.5.0) @@ -654,7 +654,7 @@ importers: version: 7.29.7 '@cornerstonejs/adapters': specifier: 5.6.8 - version: 5.6.8(patch_hash=9ec6f243febe5c8358a1aaae2127e0e59d71548573a110eb33be51cf7dbc9a9c)(@cornerstonejs/core@5.6.8(patch_hash=a80dc1a8df5e9e7fbfe0ad7ab6eff21acfca717ebb4cbb8a751cd61d51ab4da5)(@cornerstonejs/metadata@5.6.8)(@cornerstonejs/utils@5.6.8)(autoprefixer@10.6.1(postcss@8.5.26))(wslink@2.5.0))(@cornerstonejs/tools@5.6.8(@cornerstonejs/core@5.6.8(patch_hash=a80dc1a8df5e9e7fbfe0ad7ab6eff21acfca717ebb4cbb8a751cd61d51ab4da5)(@cornerstonejs/metadata@5.6.8)(@cornerstonejs/utils@5.6.8)(autoprefixer@10.6.1(postcss@8.5.26))(wslink@2.5.0))(@kitware/vtk.js@36.4.1(autoprefixer@10.6.1(postcss@8.5.26))(wslink@2.5.0))(@types/d3-array@3.2.1)(@types/d3-interpolate@3.0.4)(d3-array@3.2.4)(d3-interpolate@3.0.1)(gl-matrix@3.4.3)) + version: 5.6.8(patch_hash=697e788e6de7173a43a904908dc4c7153fe70a9db6718bbe6e163c17295d90b0)(@cornerstonejs/core@5.6.8(patch_hash=a80dc1a8df5e9e7fbfe0ad7ab6eff21acfca717ebb4cbb8a751cd61d51ab4da5)(@cornerstonejs/metadata@5.6.8)(@cornerstonejs/utils@5.6.8)(autoprefixer@10.6.1(postcss@8.5.26))(wslink@2.5.0))(@cornerstonejs/tools@5.6.8(@cornerstonejs/core@5.6.8(patch_hash=a80dc1a8df5e9e7fbfe0ad7ab6eff21acfca717ebb4cbb8a751cd61d51ab4da5)(@cornerstonejs/metadata@5.6.8)(@cornerstonejs/utils@5.6.8)(autoprefixer@10.6.1(postcss@8.5.26))(wslink@2.5.0))(@kitware/vtk.js@36.4.1(autoprefixer@10.6.1(postcss@8.5.26))(wslink@2.5.0))(@types/d3-array@3.2.1)(@types/d3-interpolate@3.0.4)(d3-array@3.2.4)(d3-interpolate@3.0.1)(gl-matrix@3.4.3)) '@cornerstonejs/core': specifier: 5.6.8 version: 5.6.8(patch_hash=a80dc1a8df5e9e7fbfe0ad7ab6eff21acfca717ebb4cbb8a751cd61d51ab4da5)(@cornerstonejs/metadata@5.6.8)(@cornerstonejs/utils@5.6.8)(autoprefixer@10.6.1(postcss@8.5.26))(wslink@2.5.0) @@ -14739,7 +14739,7 @@ snapshots: '@colors/colors@1.5.0': optional: true - '@cornerstonejs/adapters@5.6.8(patch_hash=9ec6f243febe5c8358a1aaae2127e0e59d71548573a110eb33be51cf7dbc9a9c)(@cornerstonejs/core@5.6.8(patch_hash=a80dc1a8df5e9e7fbfe0ad7ab6eff21acfca717ebb4cbb8a751cd61d51ab4da5)(@cornerstonejs/metadata@5.6.8)(@cornerstonejs/utils@5.6.8)(autoprefixer@10.6.1(postcss@8.5.26))(wslink@2.5.0))(@cornerstonejs/tools@5.6.8(@cornerstonejs/core@5.6.8(patch_hash=a80dc1a8df5e9e7fbfe0ad7ab6eff21acfca717ebb4cbb8a751cd61d51ab4da5)(@cornerstonejs/metadata@5.6.8)(@cornerstonejs/utils@5.6.8)(autoprefixer@10.6.1(postcss@8.5.26))(wslink@2.5.0))(@kitware/vtk.js@36.4.1(autoprefixer@10.6.1(postcss@8.5.26))(wslink@2.5.0))(@types/d3-array@3.2.1)(@types/d3-interpolate@3.0.4)(d3-array@3.2.4)(d3-interpolate@3.0.1)(gl-matrix@3.4.3))': + '@cornerstonejs/adapters@5.6.8(patch_hash=697e788e6de7173a43a904908dc4c7153fe70a9db6718bbe6e163c17295d90b0)(@cornerstonejs/core@5.6.8(patch_hash=a80dc1a8df5e9e7fbfe0ad7ab6eff21acfca717ebb4cbb8a751cd61d51ab4da5)(@cornerstonejs/metadata@5.6.8)(@cornerstonejs/utils@5.6.8)(autoprefixer@10.6.1(postcss@8.5.26))(wslink@2.5.0))(@cornerstonejs/tools@5.6.8(@cornerstonejs/core@5.6.8(patch_hash=a80dc1a8df5e9e7fbfe0ad7ab6eff21acfca717ebb4cbb8a751cd61d51ab4da5)(@cornerstonejs/metadata@5.6.8)(@cornerstonejs/utils@5.6.8)(autoprefixer@10.6.1(postcss@8.5.26))(wslink@2.5.0))(@kitware/vtk.js@36.4.1(autoprefixer@10.6.1(postcss@8.5.26))(wslink@2.5.0))(@types/d3-array@3.2.1)(@types/d3-interpolate@3.0.4)(d3-array@3.2.4)(d3-interpolate@3.0.1)(gl-matrix@3.4.3))': dependencies: '@babel/runtime-corejs2': 7.26.10 '@cornerstonejs/core': 5.6.8(patch_hash=a80dc1a8df5e9e7fbfe0ad7ab6eff21acfca717ebb4cbb8a751cd61d51ab4da5)(@cornerstonejs/metadata@5.6.8)(@cornerstonejs/utils@5.6.8)(autoprefixer@10.6.1(postcss@8.5.26))(wslink@2.5.0) From 72918277307f6a8ec220bee7df60eb924ed86d63 Mon Sep 17 00:00:00 2001 From: Igor Octaviano Date: Tue, 6 Oct 2026 07:52:51 -0300 Subject: [PATCH 2/2] fix(seg): use buffer-based loader when PerFrameFunctionalGroupsSequence missing OHIF 3.13 changed SEG loading from createFromDICOMSegBuffer (fetches full DICOM file) to createFromDicomSegImageId (relies on metadata provider). This broke SEG loading for DICOMweb servers like IDC's static WADO that omit PerFrameFunctionalGroupsSequence from JSON metadata to save space (this sequence can be huge for SEGs with thousands of frames). The fix detects when PerFrameFunctionalGroupsSequence is missing and falls back to the buffer-based loader which parses complete metadata directly from the DICOM binary - restoring the behavior from OHIF 3.12. Also includes two backported patches from cornerstone3D: - VOI LUT function validation (PR #2856) - Segment index by SegmentNumber for LABELMAP support (PR #2882) --- .../src/getSopClassHandlerModule.ts | 100 ++++++++++---- patches/@cornerstonejs__adapters.patch | 128 +++++------------- pnpm-lock.yaml | 12 +- pnpm-workspace.yaml | 6 +- 4 files changed, 114 insertions(+), 132 deletions(-) diff --git a/extensions/cornerstone-dicom-seg/src/getSopClassHandlerModule.ts b/extensions/cornerstone-dicom-seg/src/getSopClassHandlerModule.ts index 88cd7a166b6..9be25cece96 100644 --- a/extensions/cornerstone-dicom-seg/src/getSopClassHandlerModule.ts +++ b/extensions/cornerstone-dicom-seg/src/getSopClassHandlerModule.ts @@ -3,6 +3,7 @@ import i18n from '@ohif/i18n'; import { metaData, eventTarget, utilities as csUtils } from '@cornerstonejs/core'; import { CONSTANTS, segmentation as cstSegmentation } from '@cornerstonejs/tools'; import { adaptersSEG, Enums } from '@cornerstonejs/adapters'; +import { dicomLoaderService } from '@ohif/extension-cornerstone'; import { SOPClassHandlerId } from './id'; import { dicomlabToRGB } from './utils/dicomlabToRGB'; @@ -404,7 +405,8 @@ async function _loadSegments({ extensionManager, servicesManager, segDisplaySet, -}: withAppTypes<{ segDisplaySet: AppTypes.DisplaySet }>) { + headers, +}: withAppTypes<{ segDisplaySet: AppTypes.DisplaySet; headers?: Record }>) { const { segmentationService, uiNotificationService, customizationService } = servicesManager.services; const instance = segDisplaySet.instance as Record; @@ -495,37 +497,81 @@ async function _loadSegments({ ) as boolean | undefined) ?? true; + /** + * Check if the metadata has PerFrameFunctionalGroupsSequence. + * Some DICOMweb servers (like IDC's static WADO) omit this sequence from JSON metadata + * for large SEGs to save space. When missing, we need to fetch the full DICOM file + * and use the buffer-based loader which parses the complete metadata from the file. + */ + const hasPerFrameFunctionalGroups = + Array.isArray(instance.PerFrameFunctionalGroupsSequence) && + instance.PerFrameFunctionalGroupsSequence.length > 0; + + let results; let prefetch; - if (loadMultiframeAsPart10) { - prefetch = dataSource.retrieve?.prefetchInstanceFrames?.({ - instance, - imageId: segImageIdForMetadata, - }); - if (prefetch?.done) { - await prefetch.done; + if (!hasPerFrameFunctionalGroups) { + /** + * Fallback: PerFrameFunctionalGroupsSequence is missing from metadata. + * Fetch the full DICOM file and use createFromDICOMSegBuffer which parses + * the complete metadata directly from the DICOM binary. + * This was the loading method used in OHIF 3.12 and earlier. + */ + log.info( + SEG_LOAD_LOG_PREFIX, + 'PerFrameFunctionalGroupsSequence missing from metadata, using buffer-based loader' + ); + + try { + const arrayBuffer = await dicomLoaderService.findDicomDataPromise( + segDisplaySet, + null, + headers + ); + + results = await adaptersSEG.Cornerstone3D.Segmentation.createFromDICOMSegBuffer( + imageIds, + arrayBuffer, + { metadataProvider: metaData, tolerance } + ); + } finally { + eventTarget.removeEventListener(Enums.Events.SEGMENTATION_LOAD_PROGRESS, onProgress); } - } + } else { + /** + * Normal path: PerFrameFunctionalGroupsSequence is present in metadata. + * Use the imageId-based loader which is more efficient for large SEGs. + */ + if (loadMultiframeAsPart10) { + prefetch = dataSource.retrieve?.prefetchInstanceFrames?.({ + instance, + imageId: segImageIdForMetadata, + }); - let results; - try { - results = await adaptersSEG.Cornerstone3D.Segmentation.createFromDicomSegImageId( - imageIds, - segImageIdForMetadata, - { - metadataProvider: metaData, - tolerance, - parserType: getSegmentationParserType( - segDisplaySet.SOPClassUID, - customizationService - ), - frameImageIds, - concurrency: SEG_FRAME_DECODE_CONCURRENCY, + if (prefetch?.done) { + await prefetch.done; } - ); - } finally { - eventTarget.removeEventListener(Enums.Events.SEGMENTATION_LOAD_PROGRESS, onProgress); - prefetch?.cancel?.(); + } + + try { + results = await adaptersSEG.Cornerstone3D.Segmentation.createFromDicomSegImageId( + imageIds, + segImageIdForMetadata, + { + metadataProvider: metaData, + tolerance, + parserType: getSegmentationParserType( + segDisplaySet.SOPClassUID, + customizationService + ), + frameImageIds, + concurrency: SEG_FRAME_DECODE_CONCURRENCY, + } + ); + } finally { + eventTarget.removeEventListener(Enums.Events.SEGMENTATION_LOAD_PROGRESS, onProgress); + prefetch?.cancel?.(); + } } let usedRecommendedDisplayCIELabValue = true; diff --git a/patches/@cornerstonejs__adapters.patch b/patches/@cornerstonejs__adapters.patch index 6bf219b8684..412dbd36218 100644 --- a/patches/@cornerstonejs__adapters.patch +++ b/patches/@cornerstonejs__adapters.patch @@ -1,97 +1,31 @@ -diff --git a/dist/esm/adapters/Cornerstone3D/Segmentation/labelmapImagesFromBuffer.js b/dist/esm/adapters/Cornerstone3D/Segmentation/labelmapImagesFromBuffer.js -index db4972221ea40cd1eaad450e9a6334c8eef4ef72..120316e2ac6929810b1da4b5cc4cfb083f0f8ce0 100644 ---- a/dist/esm/adapters/Cornerstone3D/Segmentation/labelmapImagesFromBuffer.js -+++ b/dist/esm/adapters/Cornerstone3D/Segmentation/labelmapImagesFromBuffer.js -@@ -552,10 +552,11 @@ function insertPixelDataPlanar(_ref0) { - PerFrameFunctionalGroupsSequence = multiframe.PerFrameFunctionalGroupsSequence, - Rows = multiframe.Rows, - Columns = multiframe.Columns; -- const sharedImageOrientationPatient = SharedFunctionalGroupsSequence.PlaneOrientationSequence ? SharedFunctionalGroupsSequence.PlaneOrientationSequence.ImageOrientationPatient : undefined; -+ const sharedImageOrientationPatient = SharedFunctionalGroupsSequence?.PlaneOrientationSequence ? SharedFunctionalGroupsSequence.PlaneOrientationSequence.ImageOrientationPatient : undefined; - const sliceLength = Columns * Rows; -- const metadataFrameCount = Number(multiframe.NumberOfFrames) || PerFrameFunctionalGroupsSequence.length; -- const groupsLenFromMetadata = PerFrameFunctionalGroupsSequence.length || metadataFrameCount; -+ const perFrameLength = PerFrameFunctionalGroupsSequence?.length || 0; -+ const metadataFrameCount = Number(multiframe.NumberOfFrames) || perFrameLength; -+ const groupsLenFromMetadata = perFrameLength || metadataFrameCount; - const groupsLen = typeof decodedFrameCount === 'number' ? Math.min(groupsLenFromMetadata, decodedFrameCount) : groupsLenFromMetadata; - let overlapping = false; - return new Promise(resolve => { -@@ -564,7 +565,7 @@ function insertPixelDataPlanar(_ref0) { - const processChunk = firstIndex => { - for (let i = firstIndex; i < firstIndex + imagesPerChunk && i < groupsLen; i++) { - var _PerFrameFunctionalGr; -- const PerFrameFunctionalGroups = PerFrameFunctionalGroupsSequence[i]; -+ const PerFrameFunctionalGroups = PerFrameFunctionalGroupsSequence?.[i]; - const ImageOrientationPatientI = sharedImageOrientationPatient || (PerFrameFunctionalGroups === null || PerFrameFunctionalGroups === void 0 || (_PerFrameFunctionalGr = PerFrameFunctionalGroups.PlaneOrientationSequence) === null || _PerFrameFunctionalGr === void 0 ? void 0 : _PerFrameFunctionalGr.ImageOrientationPatient); - if (!ImageOrientationPatientI) { - throw new Error("SEG frame ".concat(i + 1, " is missing ImageOrientationPatient in per-frame and shared functional groups.")); -@@ -576,7 +577,8 @@ function insertPixelDataPlanar(_ref0) { - } - const segmentIndex = getSegmentIndex(multiframe, i); - if (segmentIndex === undefined) { -- throw new Error('Could not retrieve the segment index. Aborting segmentation loading.'); -+ console.warn('Could not retrieve the segment index for frame ' + i + ', skipping this frame.'); -+ continue; - } - if (!segmentsPixelIndices.has(segmentIndex)) { - segmentsPixelIndices.set(segmentIndex, {}); -@@ -817,7 +819,7 @@ function insertOverlappingPixelDataPlanar(_ref12) { - PerFrameFunctionalGroupsSequence = multiframe.PerFrameFunctionalGroupsSequence, - Rows = multiframe.Rows, - Columns = multiframe.Columns; -- const sharedImageOrientationPatient = SharedFunctionalGroupsSequence.PlaneOrientationSequence ? SharedFunctionalGroupsSequence.PlaneOrientationSequence.ImageOrientationPatient : undefined; -+ const sharedImageOrientationPatient = SharedFunctionalGroupsSequence?.PlaneOrientationSequence ? SharedFunctionalGroupsSequence.PlaneOrientationSequence.ImageOrientationPatient : undefined; - const sliceLength = Columns * Rows; - const arrayOfSegmentData = getArrayOfSegmentData({ - sliceLength, -@@ -910,7 +912,7 @@ const getSegmentData = _ref14 => { - for (let currentLabelMapImageIndex = 0; currentLabelMapImageIndex < labelMapImages.length; currentLabelMapImageIndex++) { - const currentLabelMapImage = labelMapImages[currentLabelMapImageIndex]; - const referencedImageId = currentLabelMapImage.referencedImageId; -- const PerFrameFunctionalGroupsIndex = PerFrameFunctionalGroupsSequence.findIndex((PerFrameFunctionalGroups, currentSequenceIndex) => { -+ const PerFrameFunctionalGroupsIndex = PerFrameFunctionalGroupsSequence?.findIndex((PerFrameFunctionalGroups, currentSequenceIndex) => { - const _extractInfoFromPerFr = extractInfoFromPerFrameFunctionalGroups({ - PerFrameFunctionalGroups, - sequenceIndex: currentSequenceIndex, -@@ -922,10 +924,10 @@ const getSegmentData = _ref14 => { - const isCorrectPerFrameFunctionalGroup = groupsSegmentIndex === segmentIndex && groupsReferenceImageId === currentLabelMapImage.referencedImageId; - return isCorrectPerFrameFunctionalGroup; - }); -- if (PerFrameFunctionalGroupsIndex === -1) { -+ if (PerFrameFunctionalGroupsIndex === -1 || PerFrameFunctionalGroupsIndex === undefined) { - continue; - } -- const PerFrameFunctionalGroups = PerFrameFunctionalGroupsSequence[PerFrameFunctionalGroupsIndex]; -+ const PerFrameFunctionalGroups = PerFrameFunctionalGroupsSequence?.[PerFrameFunctionalGroupsIndex]; - const alignedPixelDataI = getAlignedPixelData({ - sharedImageOrientationPatient, - PerFrameFunctionalGroups, -diff --git a/dist/esm/adapters/helpers/checkOrientation.js b/dist/esm/adapters/helpers/checkOrientation.js -index f147ce19972dfe2f30ed820509943bb2ab2f34d0..47868b5ae063ee61e4061aa46ef5ccf49692fb34 100644 ---- a/dist/esm/adapters/helpers/checkOrientation.js -+++ b/dist/esm/adapters/helpers/checkOrientation.js -@@ -4,9 +4,20 @@ import { utilities } from '@cornerstonejs/core'; - function checkOrientation(multiframe, validOrientations, sourceDataDimensions, tolerance) { - const SharedFunctionalGroupsSequence = multiframe.SharedFunctionalGroupsSequence, - PerFrameFunctionalGroupsSequence = multiframe.PerFrameFunctionalGroupsSequence; -- const sharedImageOrientationPatient = SharedFunctionalGroupsSequence.PlaneOrientationSequence ? SharedFunctionalGroupsSequence.PlaneOrientationSequence.ImageOrientationPatient : undefined; -- const PerFrameFunctionalGroups = PerFrameFunctionalGroupsSequence[0]; -- const iopRaw = sharedImageOrientationPatient || PerFrameFunctionalGroups.PlaneOrientationSequence.ImageOrientationPatient; -+ const sharedImageOrientationPatient = SharedFunctionalGroupsSequence?.PlaneOrientationSequence ? SharedFunctionalGroupsSequence.PlaneOrientationSequence.ImageOrientationPatient : undefined; -+ -+ /** Get orientation from per-frame if shared doesn't have it and per-frame exists */ -+ let iopRaw = sharedImageOrientationPatient; -+ if (!iopRaw && PerFrameFunctionalGroupsSequence && PerFrameFunctionalGroupsSequence.length > 0) { -+ const PerFrameFunctionalGroups = PerFrameFunctionalGroupsSequence[0]; -+ iopRaw = PerFrameFunctionalGroups?.PlaneOrientationSequence?.ImageOrientationPatient; -+ } -+ -+ if (!iopRaw) { -+ /** No orientation found, default to Planar to avoid throwing */ -+ return 'Planar'; -+ } -+ - const iop = Array.isArray(iopRaw) ? iopRaw.map(Number) : iopRaw; - const inPlane = validOrientations.some(operation => utilities.isEqual(iop, operation, tolerance)); - if (inPlane) { +diff --git a/dist/esm/adapters/Cornerstone/Segmentation_4X.js b/dist/esm/adapters/Cornerstone/Segmentation_4X.js +index f40a914216e4d403fb6f49a880a1329482b5219f..62bec9ef69359bab5f9bf8a18f9ff6803efb7553 100644 +--- a/dist/esm/adapters/Cornerstone/Segmentation_4X.js ++++ b/dist/esm/adapters/Cornerstone/Segmentation_4X.js +@@ -1169,12 +1169,20 @@ function alignPixelDataWithSourceData(pixelData2D, iop, orientations, tolerance) + } + function getSegmentMetadata(multiframe, seriesInstanceUid) { + const segmentSequence = multiframe.SegmentSequence; +- let data = []; +- if (Array.isArray(segmentSequence)) { +- data = [undefined, ...segmentSequence]; +- } else { +- // Only one segment, will be stored as an object. +- data = [undefined, segmentSequence]; ++ const data = []; ++ /** ++ * Index segments by their SegmentNumber rather than array position. ++ * This is required for LABELMAP segmentations where SegmentNumber may ++ * start at 0 (for background) or have gaps. The DICOM standard only ++ * requires SegmentNumber >= 1 for BINARY/FRACTIONAL types, but LABELMAP ++ * allows more flexibility (see DICOM Part 3, Section C.8.20.2.4). ++ * Backported from: https://github.com/cornerstonejs/cornerstone3D/pull/2882 ++ */ ++ const segments = Array.isArray(segmentSequence) ? segmentSequence : [segmentSequence]; ++ for (const segment of segments) { ++ if (segment?.SegmentNumber >= 0) { ++ data[segment.SegmentNumber] = segment; ++ } + } + return { + seriesInstanceUid, diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 8022817ecd7..e49517a1382 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -246,7 +246,7 @@ overrides: image-size@>=0.6.3 <2.0.4: 2.0.4 patchedDependencies: - '@cornerstonejs/adapters': 697e788e6de7173a43a904908dc4c7153fe70a9db6718bbe6e163c17295d90b0 + '@cornerstonejs/adapters': 9e687c8dbaf5e5785cca8152b3fb78916d9a93efdc686876ab60e230df56c348 '@cornerstonejs/core': a80dc1a8df5e9e7fbfe0ad7ab6eff21acfca717ebb4cbb8a751cd61d51ab4da5 importers: @@ -407,7 +407,7 @@ importers: version: 7.29.7 '@cornerstonejs/adapters': specifier: 5.6.8 - version: 5.6.8(patch_hash=697e788e6de7173a43a904908dc4c7153fe70a9db6718bbe6e163c17295d90b0)(@cornerstonejs/core@5.6.8(patch_hash=a80dc1a8df5e9e7fbfe0ad7ab6eff21acfca717ebb4cbb8a751cd61d51ab4da5)(@cornerstonejs/metadata@5.6.8)(@cornerstonejs/utils@5.6.8)(autoprefixer@10.6.1(postcss@8.5.26))(wslink@2.5.0))(@cornerstonejs/tools@5.6.8(@cornerstonejs/core@5.6.8(patch_hash=a80dc1a8df5e9e7fbfe0ad7ab6eff21acfca717ebb4cbb8a751cd61d51ab4da5)(@cornerstonejs/metadata@5.6.8)(@cornerstonejs/utils@5.6.8)(autoprefixer@10.6.1(postcss@8.5.26))(wslink@2.5.0))(@kitware/vtk.js@36.4.1(autoprefixer@10.6.1(postcss@8.5.26))(wslink@2.5.0))(@types/d3-array@3.2.1)(@types/d3-interpolate@3.0.4)(d3-array@3.2.4)(d3-interpolate@3.0.1)(gl-matrix@3.4.3)) + version: 5.6.8(patch_hash=9e687c8dbaf5e5785cca8152b3fb78916d9a93efdc686876ab60e230df56c348)(@cornerstonejs/core@5.6.8(patch_hash=a80dc1a8df5e9e7fbfe0ad7ab6eff21acfca717ebb4cbb8a751cd61d51ab4da5)(@cornerstonejs/metadata@5.6.8)(@cornerstonejs/utils@5.6.8)(autoprefixer@10.6.1(postcss@8.5.26))(wslink@2.5.0))(@cornerstonejs/tools@5.6.8(@cornerstonejs/core@5.6.8(patch_hash=a80dc1a8df5e9e7fbfe0ad7ab6eff21acfca717ebb4cbb8a751cd61d51ab4da5)(@cornerstonejs/metadata@5.6.8)(@cornerstonejs/utils@5.6.8)(autoprefixer@10.6.1(postcss@8.5.26))(wslink@2.5.0))(@kitware/vtk.js@36.4.1(autoprefixer@10.6.1(postcss@8.5.26))(wslink@2.5.0))(@types/d3-array@3.2.1)(@types/d3-interpolate@3.0.4)(d3-array@3.2.4)(d3-interpolate@3.0.1)(gl-matrix@3.4.3)) '@cornerstonejs/ai': specifier: 5.6.8 version: 5.6.8(@cornerstonejs/core@5.6.8(patch_hash=a80dc1a8df5e9e7fbfe0ad7ab6eff21acfca717ebb4cbb8a751cd61d51ab4da5)(@cornerstonejs/metadata@5.6.8)(@cornerstonejs/utils@5.6.8)(autoprefixer@10.6.1(postcss@8.5.26))(wslink@2.5.0))(@cornerstonejs/tools@5.6.8(@cornerstonejs/core@5.6.8(patch_hash=a80dc1a8df5e9e7fbfe0ad7ab6eff21acfca717ebb4cbb8a751cd61d51ab4da5)(@cornerstonejs/metadata@5.6.8)(@cornerstonejs/utils@5.6.8)(autoprefixer@10.6.1(postcss@8.5.26))(wslink@2.5.0))(@kitware/vtk.js@36.4.1(autoprefixer@10.6.1(postcss@8.5.26))(wslink@2.5.0))(@types/d3-array@3.2.1)(@types/d3-interpolate@3.0.4)(d3-array@3.2.4)(d3-interpolate@3.0.1)(gl-matrix@3.4.3)) @@ -516,7 +516,7 @@ importers: version: 7.29.7 '@cornerstonejs/adapters': specifier: 5.6.8 - version: 5.6.8(patch_hash=697e788e6de7173a43a904908dc4c7153fe70a9db6718bbe6e163c17295d90b0)(@cornerstonejs/core@5.6.8(patch_hash=a80dc1a8df5e9e7fbfe0ad7ab6eff21acfca717ebb4cbb8a751cd61d51ab4da5)(@cornerstonejs/metadata@5.6.8)(@cornerstonejs/utils@5.6.8)(autoprefixer@10.6.1(postcss@8.5.26))(wslink@2.5.0))(@cornerstonejs/tools@5.6.8(@cornerstonejs/core@5.6.8(patch_hash=a80dc1a8df5e9e7fbfe0ad7ab6eff21acfca717ebb4cbb8a751cd61d51ab4da5)(@cornerstonejs/metadata@5.6.8)(@cornerstonejs/utils@5.6.8)(autoprefixer@10.6.1(postcss@8.5.26))(wslink@2.5.0))(@kitware/vtk.js@36.4.1(autoprefixer@10.6.1(postcss@8.5.26))(wslink@2.5.0))(@types/d3-array@3.2.1)(@types/d3-interpolate@3.0.4)(d3-array@3.2.4)(d3-interpolate@3.0.1)(gl-matrix@3.4.3)) + version: 5.6.8(patch_hash=9e687c8dbaf5e5785cca8152b3fb78916d9a93efdc686876ab60e230df56c348)(@cornerstonejs/core@5.6.8(patch_hash=a80dc1a8df5e9e7fbfe0ad7ab6eff21acfca717ebb4cbb8a751cd61d51ab4da5)(@cornerstonejs/metadata@5.6.8)(@cornerstonejs/utils@5.6.8)(autoprefixer@10.6.1(postcss@8.5.26))(wslink@2.5.0))(@cornerstonejs/tools@5.6.8(@cornerstonejs/core@5.6.8(patch_hash=a80dc1a8df5e9e7fbfe0ad7ab6eff21acfca717ebb4cbb8a751cd61d51ab4da5)(@cornerstonejs/metadata@5.6.8)(@cornerstonejs/utils@5.6.8)(autoprefixer@10.6.1(postcss@8.5.26))(wslink@2.5.0))(@kitware/vtk.js@36.4.1(autoprefixer@10.6.1(postcss@8.5.26))(wslink@2.5.0))(@types/d3-array@3.2.1)(@types/d3-interpolate@3.0.4)(d3-array@3.2.4)(d3-interpolate@3.0.1)(gl-matrix@3.4.3)) '@cornerstonejs/core': specifier: 5.6.8 version: 5.6.8(patch_hash=a80dc1a8df5e9e7fbfe0ad7ab6eff21acfca717ebb4cbb8a751cd61d51ab4da5)(@cornerstonejs/metadata@5.6.8)(@cornerstonejs/utils@5.6.8)(autoprefixer@10.6.1(postcss@8.5.26))(wslink@2.5.0) @@ -605,7 +605,7 @@ importers: version: 7.29.7 '@cornerstonejs/adapters': specifier: 5.6.8 - version: 5.6.8(patch_hash=697e788e6de7173a43a904908dc4c7153fe70a9db6718bbe6e163c17295d90b0)(@cornerstonejs/core@5.6.8(patch_hash=a80dc1a8df5e9e7fbfe0ad7ab6eff21acfca717ebb4cbb8a751cd61d51ab4da5)(@cornerstonejs/metadata@5.6.8)(@cornerstonejs/utils@5.6.8)(autoprefixer@10.6.1(postcss@8.5.26))(wslink@2.5.0))(@cornerstonejs/tools@5.6.8(@cornerstonejs/core@5.6.8(patch_hash=a80dc1a8df5e9e7fbfe0ad7ab6eff21acfca717ebb4cbb8a751cd61d51ab4da5)(@cornerstonejs/metadata@5.6.8)(@cornerstonejs/utils@5.6.8)(autoprefixer@10.6.1(postcss@8.5.26))(wslink@2.5.0))(@kitware/vtk.js@36.4.1(autoprefixer@10.6.1(postcss@8.5.26))(wslink@2.5.0))(@types/d3-array@3.2.1)(@types/d3-interpolate@3.0.4)(d3-array@3.2.4)(d3-interpolate@3.0.1)(gl-matrix@3.4.3)) + version: 5.6.8(patch_hash=9e687c8dbaf5e5785cca8152b3fb78916d9a93efdc686876ab60e230df56c348)(@cornerstonejs/core@5.6.8(patch_hash=a80dc1a8df5e9e7fbfe0ad7ab6eff21acfca717ebb4cbb8a751cd61d51ab4da5)(@cornerstonejs/metadata@5.6.8)(@cornerstonejs/utils@5.6.8)(autoprefixer@10.6.1(postcss@8.5.26))(wslink@2.5.0))(@cornerstonejs/tools@5.6.8(@cornerstonejs/core@5.6.8(patch_hash=a80dc1a8df5e9e7fbfe0ad7ab6eff21acfca717ebb4cbb8a751cd61d51ab4da5)(@cornerstonejs/metadata@5.6.8)(@cornerstonejs/utils@5.6.8)(autoprefixer@10.6.1(postcss@8.5.26))(wslink@2.5.0))(@kitware/vtk.js@36.4.1(autoprefixer@10.6.1(postcss@8.5.26))(wslink@2.5.0))(@types/d3-array@3.2.1)(@types/d3-interpolate@3.0.4)(d3-array@3.2.4)(d3-interpolate@3.0.1)(gl-matrix@3.4.3)) '@cornerstonejs/core': specifier: 5.6.8 version: 5.6.8(patch_hash=a80dc1a8df5e9e7fbfe0ad7ab6eff21acfca717ebb4cbb8a751cd61d51ab4da5)(@cornerstonejs/metadata@5.6.8)(@cornerstonejs/utils@5.6.8)(autoprefixer@10.6.1(postcss@8.5.26))(wslink@2.5.0) @@ -654,7 +654,7 @@ importers: version: 7.29.7 '@cornerstonejs/adapters': specifier: 5.6.8 - version: 5.6.8(patch_hash=697e788e6de7173a43a904908dc4c7153fe70a9db6718bbe6e163c17295d90b0)(@cornerstonejs/core@5.6.8(patch_hash=a80dc1a8df5e9e7fbfe0ad7ab6eff21acfca717ebb4cbb8a751cd61d51ab4da5)(@cornerstonejs/metadata@5.6.8)(@cornerstonejs/utils@5.6.8)(autoprefixer@10.6.1(postcss@8.5.26))(wslink@2.5.0))(@cornerstonejs/tools@5.6.8(@cornerstonejs/core@5.6.8(patch_hash=a80dc1a8df5e9e7fbfe0ad7ab6eff21acfca717ebb4cbb8a751cd61d51ab4da5)(@cornerstonejs/metadata@5.6.8)(@cornerstonejs/utils@5.6.8)(autoprefixer@10.6.1(postcss@8.5.26))(wslink@2.5.0))(@kitware/vtk.js@36.4.1(autoprefixer@10.6.1(postcss@8.5.26))(wslink@2.5.0))(@types/d3-array@3.2.1)(@types/d3-interpolate@3.0.4)(d3-array@3.2.4)(d3-interpolate@3.0.1)(gl-matrix@3.4.3)) + version: 5.6.8(patch_hash=9e687c8dbaf5e5785cca8152b3fb78916d9a93efdc686876ab60e230df56c348)(@cornerstonejs/core@5.6.8(patch_hash=a80dc1a8df5e9e7fbfe0ad7ab6eff21acfca717ebb4cbb8a751cd61d51ab4da5)(@cornerstonejs/metadata@5.6.8)(@cornerstonejs/utils@5.6.8)(autoprefixer@10.6.1(postcss@8.5.26))(wslink@2.5.0))(@cornerstonejs/tools@5.6.8(@cornerstonejs/core@5.6.8(patch_hash=a80dc1a8df5e9e7fbfe0ad7ab6eff21acfca717ebb4cbb8a751cd61d51ab4da5)(@cornerstonejs/metadata@5.6.8)(@cornerstonejs/utils@5.6.8)(autoprefixer@10.6.1(postcss@8.5.26))(wslink@2.5.0))(@kitware/vtk.js@36.4.1(autoprefixer@10.6.1(postcss@8.5.26))(wslink@2.5.0))(@types/d3-array@3.2.1)(@types/d3-interpolate@3.0.4)(d3-array@3.2.4)(d3-interpolate@3.0.1)(gl-matrix@3.4.3)) '@cornerstonejs/core': specifier: 5.6.8 version: 5.6.8(patch_hash=a80dc1a8df5e9e7fbfe0ad7ab6eff21acfca717ebb4cbb8a751cd61d51ab4da5)(@cornerstonejs/metadata@5.6.8)(@cornerstonejs/utils@5.6.8)(autoprefixer@10.6.1(postcss@8.5.26))(wslink@2.5.0) @@ -14739,7 +14739,7 @@ snapshots: '@colors/colors@1.5.0': optional: true - '@cornerstonejs/adapters@5.6.8(patch_hash=697e788e6de7173a43a904908dc4c7153fe70a9db6718bbe6e163c17295d90b0)(@cornerstonejs/core@5.6.8(patch_hash=a80dc1a8df5e9e7fbfe0ad7ab6eff21acfca717ebb4cbb8a751cd61d51ab4da5)(@cornerstonejs/metadata@5.6.8)(@cornerstonejs/utils@5.6.8)(autoprefixer@10.6.1(postcss@8.5.26))(wslink@2.5.0))(@cornerstonejs/tools@5.6.8(@cornerstonejs/core@5.6.8(patch_hash=a80dc1a8df5e9e7fbfe0ad7ab6eff21acfca717ebb4cbb8a751cd61d51ab4da5)(@cornerstonejs/metadata@5.6.8)(@cornerstonejs/utils@5.6.8)(autoprefixer@10.6.1(postcss@8.5.26))(wslink@2.5.0))(@kitware/vtk.js@36.4.1(autoprefixer@10.6.1(postcss@8.5.26))(wslink@2.5.0))(@types/d3-array@3.2.1)(@types/d3-interpolate@3.0.4)(d3-array@3.2.4)(d3-interpolate@3.0.1)(gl-matrix@3.4.3))': + '@cornerstonejs/adapters@5.6.8(patch_hash=9e687c8dbaf5e5785cca8152b3fb78916d9a93efdc686876ab60e230df56c348)(@cornerstonejs/core@5.6.8(patch_hash=a80dc1a8df5e9e7fbfe0ad7ab6eff21acfca717ebb4cbb8a751cd61d51ab4da5)(@cornerstonejs/metadata@5.6.8)(@cornerstonejs/utils@5.6.8)(autoprefixer@10.6.1(postcss@8.5.26))(wslink@2.5.0))(@cornerstonejs/tools@5.6.8(@cornerstonejs/core@5.6.8(patch_hash=a80dc1a8df5e9e7fbfe0ad7ab6eff21acfca717ebb4cbb8a751cd61d51ab4da5)(@cornerstonejs/metadata@5.6.8)(@cornerstonejs/utils@5.6.8)(autoprefixer@10.6.1(postcss@8.5.26))(wslink@2.5.0))(@kitware/vtk.js@36.4.1(autoprefixer@10.6.1(postcss@8.5.26))(wslink@2.5.0))(@types/d3-array@3.2.1)(@types/d3-interpolate@3.0.4)(d3-array@3.2.4)(d3-interpolate@3.0.1)(gl-matrix@3.4.3))': dependencies: '@babel/runtime-corejs2': 7.26.10 '@cornerstonejs/core': 5.6.8(patch_hash=a80dc1a8df5e9e7fbfe0ad7ab6eff21acfca717ebb4cbb8a751cd61d51ab4da5)(@cornerstonejs/metadata@5.6.8)(@cornerstonejs/utils@5.6.8)(autoprefixer@10.6.1(postcss@8.5.26))(wslink@2.5.0) diff --git a/pnpm-workspace.yaml b/pnpm-workspace.yaml index 3ed3e143501..8409168c3ac 100644 --- a/pnpm-workspace.yaml +++ b/pnpm-workspace.yaml @@ -3,8 +3,6 @@ packages: - extensions/* - modes/* -# IDC patches for Cornerstone3D packages are configured at end of file (patchedDependencies) -# - @cornerstonejs/core: Fix VOI LUT function validation (toLowHighRange throws for unknown values) # Mirror the cornerstone3D pnpm setup (libs/@cornerstonejs) which is known-good. nodeLinker: hoisted @@ -116,6 +114,10 @@ overrides: # browserslist-stats.json). 'browserslist@<4.28.7': 4.28.8 'image-size@>=0.6.3 <2.0.4': 2.0.4 + +# IDC patches for Cornerstone3D packages +# - @cornerstonejs/core: Fix VOI LUT function validation (PR #2856) +# - @cornerstonejs/adapters: Index segments by SegmentNumber for LABELMAP support (PR #2882) patchedDependencies: '@cornerstonejs/adapters': patches/@cornerstonejs__adapters.patch '@cornerstonejs/core': patches/@cornerstonejs__core.patch