From 404d52fe5c0442dd13e4d407bb0687d72fa5f32c Mon Sep 17 00:00:00 2001 From: Erik Ziegler Date: Tue, 24 Mar 2020 16:18:13 +0100 Subject: [PATCH] fix: OverlayPlane module usage for ArrayBuffer, BulkDataURI, and InlineBinary cases, as well as PaletteColor LUTs for ArrayBuffer (i.e. local drag/drop) case (#1546) --- platform/core/src/classes/MetadataProvider.js | 12 +++++---- .../metadataProvider/fetchOverlayData.js | 25 ++++++++---------- .../fetchPaletteColorLookupTableData.js | 26 +++---------------- .../utils/metadataProvider/unpackOverlay.js | 13 ++++++++++ platform/core/src/utils/str2ab.js | 16 ++++++++++++ 5 files changed, 51 insertions(+), 41 deletions(-) create mode 100644 platform/core/src/utils/metadataProvider/unpackOverlay.js create mode 100644 platform/core/src/utils/str2ab.js diff --git a/platform/core/src/classes/MetadataProvider.js b/platform/core/src/classes/MetadataProvider.js index 8178516e0..bd3b38870 100644 --- a/platform/core/src/classes/MetadataProvider.js +++ b/platform/core/src/classes/MetadataProvider.js @@ -58,9 +58,7 @@ class MetadataProvider { Object.assign(instance, naturalizedDataset); - if (options.server) { - await this._checkBulkDataAndInlineBinaries(instance, options.server); - } + await this._checkBulkDataAndInlineBinaries(instance, options.server); return instance; } @@ -344,7 +342,7 @@ class MetadataProvider { break; case WADO_IMAGE_LOADER_TAGS.OVERLAY_PLANE_MODULE: - metadata = []; + const overlays = []; for ( let overlayGroup = 0x00; @@ -389,9 +387,13 @@ class MetadataProvider { roiStandardDeviation: instance[ROIStandardDeviationTag], }; - metadata.push(overlay); + overlays.push(overlay); } + metadata = { + overlays + }; + break; case WADO_IMAGE_LOADER_TAGS.PATIENT_MODULE: diff --git a/platform/core/src/utils/metadataProvider/fetchOverlayData.js b/platform/core/src/utils/metadataProvider/fetchOverlayData.js index ba9cb9ccc..dc408bf10 100644 --- a/platform/core/src/utils/metadataProvider/fetchOverlayData.js +++ b/platform/core/src/utils/metadataProvider/fetchOverlayData.js @@ -1,5 +1,7 @@ import { api } from 'dicomweb-client'; import DICOMWeb from '../../DICOMWeb'; +import str2ab from '../str2ab'; +import unpackOverlay from './unpackOverlay'; export default async function fetchOverlayData(instance, server) { const OverlayDataPromises = []; @@ -15,11 +17,18 @@ export default async function fetchOverlayData(instance, server) { const OverlayDataTag = `${groupStr}3000`; - if (instance[OverlayDataTag] && instance[OverlayDataTag].BulkDataURI) { + if (instance[OverlayDataTag] && instance[OverlayDataTag].InlineBinary) { + const inlineBinaryData = atob(instance[OverlayDataTag].InlineBinary); + const arraybuffer = str2ab(inlineBinaryData); + + instance[OverlayDataTag] = unpackOverlay(arraybuffer) + } else if (instance[OverlayDataTag] && instance[OverlayDataTag].BulkDataURI) { OverlayDataPromises.push( _getOverlayData(instance[OverlayDataTag], server) ); OverlayDataTags.push(OverlayDataTag); + } else if (instance[OverlayDataTag] && instance[OverlayDataTag] instanceof ArrayBuffer) { + instance[OverlayDataTag] = unpackOverlay(instance[OverlayDataTag]) } } @@ -60,19 +69,7 @@ async function _getOverlayData(tag, server) { return dicomWeb .retrieveBulkData(options) .then(result => result[0]) - .then(_unpackOverlay); + .then(unpackOverlay); } -function _unpackOverlay(arrayBuffer) { - const bitArray = new Uint8Array(arrayBuffer); - const byteArray = new Uint8Array(8 * bitArray.length); - for (let byteIndex = 0; byteIndex < byteArray.length; byteIndex++) { - const bitIndex = byteIndex % 8; - const bitByteIndex = Math.floor(byteIndex / 8); - byteArray[byteIndex] = - 1 * ((bitArray[bitByteIndex] & (1 << bitIndex)) >> bitIndex); - } - - return byteArray; -} diff --git a/platform/core/src/utils/metadataProvider/fetchPaletteColorLookupTableData.js b/platform/core/src/utils/metadataProvider/fetchPaletteColorLookupTableData.js index 65ca00608..75e9e72c1 100644 --- a/platform/core/src/utils/metadataProvider/fetchPaletteColorLookupTableData.js +++ b/platform/core/src/utils/metadataProvider/fetchPaletteColorLookupTableData.js @@ -1,5 +1,6 @@ import { api } from 'dicomweb-client'; import DICOMWeb from '../../DICOMWeb'; +import str2ab from '../str2ab'; export default async function fetchPaletteColorLookupTableData( instance, @@ -157,31 +158,12 @@ function _getPaletteColor(server, paletteColorLookupTableData, lutDescriptor) { .then(arrayBufferToPaletteColorLUT); } else if (paletteColorLookupTableData.InlineBinary) { const inlineBinaryData = atob(paletteColorLookupTableData.InlineBinary); - const arraybuffer = _str2ab(inlineBinaryData); + const arraybuffer = str2ab(inlineBinaryData); return new Promise(resolve => { resolve(arrayBufferToPaletteColorLUT(arraybuffer)); }); + } else { + return Promise.resolve(arrayBufferToPaletteColorLUT(paletteColorLookupTableData)); } - - throw new Error( - 'Palette Color LUT was not provided as InlineBinary or BulkDataURI' - ); -} - -/** - * Convert String to ArrayBuffer - * - * @param {String} str Input String - * @return {ArrayBuffer} Output converted ArrayBuffer - */ -function _str2ab(str) { - const strLen = str.length; - const bytes = new Uint8Array(strLen); - - for (let i = 0; i < strLen; i++) { - bytes[i] = str.charCodeAt(i); - } - - return bytes.buffer; } diff --git a/platform/core/src/utils/metadataProvider/unpackOverlay.js b/platform/core/src/utils/metadataProvider/unpackOverlay.js new file mode 100644 index 000000000..78e39b2c2 --- /dev/null +++ b/platform/core/src/utils/metadataProvider/unpackOverlay.js @@ -0,0 +1,13 @@ +export default function unpackOverlay(arrayBuffer) { + const bitArray = new Uint8Array(arrayBuffer); + const byteArray = new Uint8Array(8 * bitArray.length); + + for (let byteIndex = 0; byteIndex < byteArray.length; byteIndex++) { + const bitIndex = byteIndex % 8; + const bitByteIndex = Math.floor(byteIndex / 8); + byteArray[byteIndex] = + 1 * ((bitArray[bitByteIndex] & (1 << bitIndex)) >> bitIndex); + } + + return byteArray; +} diff --git a/platform/core/src/utils/str2ab.js b/platform/core/src/utils/str2ab.js new file mode 100644 index 000000000..3125e0bd8 --- /dev/null +++ b/platform/core/src/utils/str2ab.js @@ -0,0 +1,16 @@ +/** + * Convert String to ArrayBuffer + * + * @param {String} str Input String + * @return {ArrayBuffer} Output converted ArrayBuffer + */ +export default function str2ab(str) { + const strLen = str.length; + const bytes = new Uint8Array(strLen); + + for (let i = 0; i < strLen; i++) { + bytes[i] = str.charCodeAt(i); + } + + return bytes.buffer; +}