diff --git a/src/imageLoader/createImage.js b/src/imageLoader/createImage.js index 1d77d705..0770be15 100644 --- a/src/imageLoader/createImage.js +++ b/src/imageLoader/createImage.js @@ -55,18 +55,7 @@ function convertToIntPixelData(floatPixelData) { * @param imageFrame */ function setPixelDataType(imageFrame, preScale) { - const isScaled = preScale?.scaled; - const scalingParmeters = preScale?.scalingParameters; - let isNegative = false; - if (isScaled && scalingParmeters) { - const rescaleSlope = scalingParmeters?.rescaleSlope || 1; - const rescaleIntercept = scalingParmeters?.rescaleIntercep || 0; - const suvbw = scalingParmeters?.suvbw || 1; - isNegative = - suvbw * - (imageFrame.smallestPixelValue * rescaleSlope + rescaleIntercept) < - 0; - } + const isNegative = preScale?.isNegative; if (imageFrame.bitsAllocated === 32) { imageFrame.pixelData = new Float32Array(imageFrame.pixelData); @@ -174,7 +163,7 @@ function createImage(imageId, pixelData, transferSyntax, options = {}) { // We can't have done it within the thread incase it was a SharedArrayBuffer. let alreadyTyped = false; - if (options.targetBuffer) { + if (options.targetBuffer && options.targetBuffer.type) { let offset, length; // If we have a target buffer, write to that instead. This helps reduce memory duplication. diff --git a/src/shared/decodeImageFrame.js b/src/shared/decodeImageFrame.js index 919ec509..c4cec9c2 100644 --- a/src/shared/decodeImageFrame.js +++ b/src/shared/decodeImageFrame.js @@ -181,7 +181,7 @@ function postProcessDecodedPixels(imageFrame, options, start, decodeConfig) { imageFrame.pixelDataLength = imageFrame.pixelData.length; - if (options.targetBuffer) { + if (options.targetBuffer && options.targetBuffer.type) { let offset, length; // If we have a target buffer, write to that instead. This helps reduce memory duplication. @@ -256,18 +256,19 @@ function postProcessDecodedPixels(imageFrame, options, start, decodeConfig) { typeof rescaleSlope === 'number' && typeof rescaleIntercept === 'number' ) { - if (scaleArray(pixelDataArray, scalingParameters)) { - imageFrame.preScale = { - ...options.preScale, - scaled: true, - }; - } + scaleArray( + imageFrame, + options.preScale, + pixelDataArray, + scalingParameters + ); } } // Handle cases where the targetBuffer is not backed by a SharedArrayBuffer if ( options.targetBuffer && + options.targetBuffer.type && (!options.targetBuffer.arrayBuffer || options.targetBuffer.arrayBuffer instanceof ArrayBuffer) ) { diff --git a/src/shared/scaling/scaleArray.js b/src/shared/scaling/scaleArray.js index 545ef787..3d39f657 100644 --- a/src/shared/scaling/scaleArray.js +++ b/src/shared/scaling/scaleArray.js @@ -1,6 +1,15 @@ -export default function scaleArray(array, scalingParameters) { +export default function scaleArray( + imageFrame, + preScaleOptions, + array, + scalingParameters +) { const arrayLength = array.length; - const { rescaleSlope, rescaleIntercept, suvbw } = scalingParameters; + const rescaleSlope = scalingParameters?.rescaleSlope || 1; + const rescaleIntercept = scalingParameters?.rescaleIntercept || 0; + const suvbw = scalingParameters?.suvbw || 1; + + let isNegative = false; if (scalingParameters.modality === 'PT') { if (typeof suvbw !== 'number') { @@ -8,13 +17,29 @@ export default function scaleArray(array, scalingParameters) { } for (let i = 0; i < arrayLength; i++) { - array[i] = suvbw * (array[i] * rescaleSlope + rescaleIntercept); + const value = suvbw * (array[i] * rescaleSlope + rescaleIntercept); + + array[i] = value; + if (value < 0 && !isNegative) { + isNegative = true; + } } } else { for (let i = 0; i < arrayLength; i++) { - array[i] = array[i] * rescaleSlope + rescaleIntercept; + const value = array[i] * rescaleSlope + rescaleIntercept; + + array[i] = value; + if (value < 0 && !isNegative) { + isNegative = true; + } } } + imageFrame.preScale = { + ...preScaleOptions, + scaled: true, + isNegative, + }; + return true; }