@cleerlycode/cornerstone-wado-image-loader
Version:
Cornerstone ImageLoader for DICOM WADO-URI
1,165 lines (911 loc) • 33.6 kB
JavaScript
/*! cornerstone-wado-image-loader - 2.0.0 - 2018-04-01 | (c) 2016 Chris Hafey | https://github.com/cornerstonejs/cornerstoneWADOImageLoader */
(function webpackUniversalModuleDefinition(root, factory) {
if(typeof exports === 'object' && typeof module === 'object')
module.exports = factory();
else if(typeof define === 'function' && define.amd)
define("cornerstoneWADOImageLoaderWebWorker", [], factory);
else if(typeof exports === 'object')
exports["cornerstoneWADOImageLoaderWebWorker"] = factory();
else
root["cornerstoneWADOImageLoaderWebWorker"] = factory();
})(typeof self !== 'undefined' ? self : this, function() {
return /******/ (function(modules) { // webpackBootstrap
/******/ // The module cache
/******/ var installedModules = {};
/******/
/******/ // The require function
/******/ function __webpack_require__(moduleId) {
/******/
/******/ // Check if module is in cache
/******/ if(installedModules[moduleId]) {
/******/ return installedModules[moduleId].exports;
/******/ }
/******/ // Create a new module (and put it into the cache)
/******/ var module = installedModules[moduleId] = {
/******/ i: moduleId,
/******/ l: false,
/******/ exports: {}
/******/ };
/******/
/******/ // Execute the module function
/******/ modules[moduleId].call(module.exports, module, module.exports, __webpack_require__);
/******/
/******/ // Flag the module as loaded
/******/ module.l = true;
/******/
/******/ // Return the exports of the module
/******/ return module.exports;
/******/ }
/******/
/******/
/******/ // expose the modules object (__webpack_modules__)
/******/ __webpack_require__.m = modules;
/******/
/******/ // expose the module cache
/******/ __webpack_require__.c = installedModules;
/******/
/******/ // define getter function for harmony exports
/******/ __webpack_require__.d = function(exports, name, getter) {
/******/ if(!__webpack_require__.o(exports, name)) {
/******/ Object.defineProperty(exports, name, {
/******/ configurable: false,
/******/ enumerable: true,
/******/ get: getter
/******/ });
/******/ }
/******/ };
/******/
/******/ // getDefaultExport function for compatibility with non-harmony modules
/******/ __webpack_require__.n = function(module) {
/******/ var getter = module && module.__esModule ?
/******/ function getDefault() { return module['default']; } :
/******/ function getModuleExports() { return module; };
/******/ __webpack_require__.d(getter, 'a', getter);
/******/ return getter;
/******/ };
/******/
/******/ // Object.prototype.hasOwnProperty.call
/******/ __webpack_require__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); };
/******/
/******/ // __webpack_public_path__
/******/ __webpack_require__.p = "";
/******/
/******/ // Load entry module and return exports
/******/ return __webpack_require__(__webpack_require__.s = 55);
/******/ })
/************************************************************************/
/******/ ({
/***/ 2:
/***/ (function(module, exports, __webpack_require__) {
;
Object.defineProperty(exports, "__esModule", {
value: true
});
function getMinMax(storedPixelData) {
// we always calculate the min max values since they are not always
// present in DICOM and we don't want to trust them anyway as cornerstone
// depends on us providing reliable values for these
var min = storedPixelData[0];
var max = storedPixelData[0];
var storedPixel = void 0;
var numPixels = storedPixelData.length;
for (var index = 1; index < numPixels; index++) {
storedPixel = storedPixelData[index];
min = Math.min(min, storedPixel);
max = Math.max(max, storedPixel);
}
return {
min: min,
max: max
};
}
exports.default = getMinMax;
/***/ }),
/***/ 37:
/***/ (function(module, exports, __webpack_require__) {
;
Object.defineProperty(exports, "__esModule", {
value: true
});
function decodeJpx(imageFrame, pixelData) {
var jpxImage = new JpxImage();
jpxImage.parse(pixelData);
var tileCount = jpxImage.tiles.length;
if (tileCount !== 1) {
throw new Error('JPEG2000 decoder returned a tileCount of ' + tileCount + ', when 1 is expected');
}
imageFrame.columns = jpxImage.width;
imageFrame.rows = jpxImage.height;
imageFrame.pixelData = jpxImage.tiles[0].items;
return imageFrame;
}
var openJPEG = void 0;
function decodeOpenJPEG(data, bytesPerPixel, signed) {
var dataPtr = openJPEG._malloc(data.length);
openJPEG.writeArrayToMemory(data, dataPtr);
// create param outpout
var imagePtrPtr = openJPEG._malloc(4);
var imageSizePtr = openJPEG._malloc(4);
var imageSizeXPtr = openJPEG._malloc(4);
var imageSizeYPtr = openJPEG._malloc(4);
var imageSizeCompPtr = openJPEG._malloc(4);
var t0 = new Date().getTime();
var ret = openJPEG.ccall('jp2_decode', 'number', ['number', 'number', 'number', 'number', 'number', 'number', 'number'], [dataPtr, data.length, imagePtrPtr, imageSizePtr, imageSizeXPtr, imageSizeYPtr, imageSizeCompPtr]);
// add num vomp..etc
if (ret !== 0) {
console.log('[opj_decode] decoding failed!');
openJPEG._free(dataPtr);
openJPEG._free(openJPEG.getValue(imagePtrPtr, '*'));
openJPEG._free(imageSizeXPtr);
openJPEG._free(imageSizeYPtr);
openJPEG._free(imageSizePtr);
openJPEG._free(imageSizeCompPtr);
return;
}
var imagePtr = openJPEG.getValue(imagePtrPtr, '*');
var image = {
length: openJPEG.getValue(imageSizePtr, 'i32'),
sx: openJPEG.getValue(imageSizeXPtr, 'i32'),
sy: openJPEG.getValue(imageSizeYPtr, 'i32'),
nbChannels: openJPEG.getValue(imageSizeCompPtr, 'i32'), // hard coded for now
perf_timetodecode: undefined,
pixelData: undefined
};
// Copy the data from the EMSCRIPTEN heap into the correct type array
var length = image.sx * image.sy * image.nbChannels;
var src32 = new Int32Array(openJPEG.HEAP32.buffer, imagePtr, length);
if (bytesPerPixel === 1) {
if (Uint8Array.from) {
image.pixelData = Uint8Array.from(src32);
} else {
image.pixelData = new Uint8Array(length);
for (var i = 0; i < length; i++) {
image.pixelData[i] = src32[i];
}
}
} else if (signed) {
if (Int16Array.from) {
image.pixelData = Int16Array.from(src32);
} else {
image.pixelData = new Int16Array(length);
for (var _i = 0; _i < length; _i++) {
image.pixelData[_i] = src32[_i];
}
}
} else if (Uint16Array.from) {
image.pixelData = Uint16Array.from(src32);
} else {
image.pixelData = new Uint16Array(length);
for (var _i2 = 0; _i2 < length; _i2++) {
image.pixelData[_i2] = src32[_i2];
}
}
var t1 = new Date().getTime();
image.perf_timetodecode = t1 - t0;
// free
openJPEG._free(dataPtr);
openJPEG._free(imagePtrPtr);
openJPEG._free(imagePtr);
openJPEG._free(imageSizePtr);
openJPEG._free(imageSizeXPtr);
openJPEG._free(imageSizeYPtr);
openJPEG._free(imageSizeCompPtr);
return image;
}
function decodeOpenJpeg2000(imageFrame, pixelData) {
var bytesPerPixel = imageFrame.bitsAllocated <= 8 ? 1 : 2;
var signed = imageFrame.pixelRepresentation === 1;
var image = decodeOpenJPEG(pixelData, bytesPerPixel, signed);
imageFrame.columns = image.sx;
imageFrame.rows = image.sy;
imageFrame.pixelData = image.pixelData;
if (image.nbChannels > 1) {
imageFrame.photometricInterpretation = 'RGB';
}
return imageFrame;
}
function initializeJPEG2000(decodeConfig) {
// check to make sure codec is loaded
if (!decodeConfig.usePDFJS) {
if (typeof OpenJPEG === 'undefined') {
throw new Error('OpenJPEG decoder not loaded');
}
}
if (!openJPEG) {
openJPEG = OpenJPEG();
if (!openJPEG || !openJPEG._jp2_decode) {
throw new Error('OpenJPEG failed to initialize');
}
}
}
function decodeJPEG2000(imageFrame, pixelData, decodeConfig) {
var options = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : {};
initializeJPEG2000(decodeConfig);
if (options.usePDFJS || decodeConfig.usePDFJS) {
// OHIF image-JPEG2000 https://github.com/OHIF/image-JPEG2000
// console.log('PDFJS')
return decodeJpx(imageFrame, pixelData);
}
// OpenJPEG2000 https://github.com/jpambrun/openjpeg
// console.log('OpenJPEG')
return decodeOpenJpeg2000(imageFrame, pixelData);
}
exports.default = decodeJPEG2000;
exports.initializeJPEG2000 = initializeJPEG2000;
/***/ }),
/***/ 38:
/***/ (function(module, exports, __webpack_require__) {
;
Object.defineProperty(exports, "__esModule", {
value: true
});
var charLS = void 0;
function jpegLSDecode(data, isSigned) {
// prepare input parameters
var dataPtr = charLS._malloc(data.length);
charLS.writeArrayToMemory(data, dataPtr);
// prepare output parameters
var imagePtrPtr = charLS._malloc(4);
var imageSizePtr = charLS._malloc(4);
var widthPtr = charLS._malloc(4);
var heightPtr = charLS._malloc(4);
var bitsPerSamplePtr = charLS._malloc(4);
var stridePtr = charLS._malloc(4);
var allowedLossyErrorPtr = charLS._malloc(4);
var componentsPtr = charLS._malloc(4);
var interleaveModePtr = charLS._malloc(4);
// Decode the image
var result = charLS.ccall('jpegls_decode', 'number', ['number', 'number', 'number', 'number', 'number', 'number', 'number', 'number', 'number', 'number', 'number'], [dataPtr, data.length, imagePtrPtr, imageSizePtr, widthPtr, heightPtr, bitsPerSamplePtr, stridePtr, componentsPtr, allowedLossyErrorPtr, interleaveModePtr]);
// Extract result values into object
var image = {
result: result,
width: charLS.getValue(widthPtr, 'i32'),
height: charLS.getValue(heightPtr, 'i32'),
bitsPerSample: charLS.getValue(bitsPerSamplePtr, 'i32'),
stride: charLS.getValue(stridePtr, 'i32'),
components: charLS.getValue(componentsPtr, 'i32'),
allowedLossyError: charLS.getValue(allowedLossyErrorPtr, 'i32'),
interleaveMode: charLS.getValue(interleaveModePtr, 'i32'),
pixelData: undefined
};
// Copy image from emscripten heap into appropriate array buffer type
var imagePtr = charLS.getValue(imagePtrPtr, '*');
if (image.bitsPerSample <= 8) {
image.pixelData = new Uint8Array(image.width * image.height * image.components);
image.pixelData.set(new Uint8Array(charLS.HEAP8.buffer, imagePtr, image.pixelData.length));
} else if (isSigned) {
image.pixelData = new Int16Array(image.width * image.height * image.components);
image.pixelData.set(new Int16Array(charLS.HEAP16.buffer, imagePtr, image.pixelData.length));
} else {
image.pixelData = new Uint16Array(image.width * image.height * image.components);
image.pixelData.set(new Uint16Array(charLS.HEAP16.buffer, imagePtr, image.pixelData.length));
}
// free memory and return image object
charLS._free(dataPtr);
charLS._free(imagePtr);
charLS._free(imagePtrPtr);
charLS._free(imageSizePtr);
charLS._free(widthPtr);
charLS._free(heightPtr);
charLS._free(bitsPerSamplePtr);
charLS._free(stridePtr);
charLS._free(componentsPtr);
charLS._free(interleaveModePtr);
return image;
}
function initializeJPEGLS() {
// check to make sure codec is loaded
if (typeof CharLS === 'undefined') {
throw new Error('No JPEG-LS decoder loaded');
}
// Try to initialize CharLS
// CharLS https://github.com/cornerstonejs/charls
if (!charLS) {
charLS = CharLS();
if (!charLS || !charLS._jpegls_decode) {
throw new Error('JPEG-LS failed to initialize');
}
}
}
function decodeJPEGLS(imageFrame, pixelData) {
initializeJPEGLS();
var image = jpegLSDecode(pixelData, imageFrame.pixelRepresentation === 1);
// throw error if not success or too much data
if (image.result !== 0 && image.result !== 6) {
throw new Error('JPEG-LS decoder failed to decode frame (error code ' + image.result + ')');
}
imageFrame.columns = image.width;
imageFrame.rows = image.height;
imageFrame.pixelData = image.pixelData;
return imageFrame;
}
exports.default = decodeJPEGLS;
exports.initializeJPEGLS = initializeJPEGLS;
/***/ }),
/***/ 55:
/***/ (function(module, exports, __webpack_require__) {
;
Object.defineProperty(exports, "__esModule", {
value: true
});
exports.version = exports.registerTaskHandler = undefined;
var _version = __webpack_require__(9);
Object.defineProperty(exports, 'version', {
enumerable: true,
get: function get() {
return _interopRequireDefault(_version).default;
}
});
var _webWorker = __webpack_require__(56);
var _decodeTask = __webpack_require__(57);
var _decodeTask2 = _interopRequireDefault(_decodeTask);
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
// register our task
(0, _webWorker.registerTaskHandler)(_decodeTask2.default);
exports.registerTaskHandler = _webWorker.registerTaskHandler;
/***/ }),
/***/ 56:
/***/ (function(module, exports, __webpack_require__) {
;
Object.defineProperty(exports, "__esModule", {
value: true
});
exports.registerTaskHandler = registerTaskHandler;
// an object of task handlers
var taskHandlers = {};
// Flag to ensure web worker is only initialized once
var initialized = false;
// the configuration object passed in when the web worker manager is initialized
var config = void 0;
/**
* Initialization function that loads additional web workers and initializes them
* @param data
*/
function initialize(data) {
// console.log('web worker initialize ', data.workerIndex);
// prevent initialization from happening more than once
if (initialized) {
return;
}
// save the config data
config = data.config;
// load any additional web worker tasks
if (data.config.webWorkerTaskPaths) {
for (var i = 0; i < data.config.webWorkerTaskPaths.length; i++) {
self.importScripts(data.config.webWorkerTaskPaths[i]);
}
}
// initialize each task handler
Object.keys(taskHandlers).forEach(function (key) {
taskHandlers[key].initialize(config.taskConfiguration);
});
// tell main ui thread that we have completed initialization
self.postMessage({
taskType: 'initialize',
status: 'success',
result: {},
workerIndex: data.workerIndex
});
initialized = true;
}
/**
* Function exposed to web worker tasks to register themselves
* @param taskHandler
*/
function registerTaskHandler(taskHandler) {
if (taskHandlers[taskHandler.taskType]) {
console.log('attempt to register duplicate task handler "', taskHandler.taskType, '"');
return false;
}
taskHandlers[taskHandler.taskType] = taskHandler;
if (initialized) {
taskHandler.initialize(config.taskConfiguration);
}
}
/**
* Function to load a new web worker task with updated configuration
* @param data
*/
function loadWebWorkerTask(data) {
config = data.config;
self.importScripts(data.sourcePath);
}
/**
* Web worker message handler - dispatches messages to the registered task handlers
* @param msg
*/
self.onmessage = function (msg) {
// console.log('web worker onmessage', msg.data);
// handle initialize message
if (msg.data.taskType === 'initialize') {
initialize(msg.data);
return;
}
// handle loadWebWorkerTask message
if (msg.data.taskType === 'loadWebWorkerTask') {
loadWebWorkerTask(msg.data);
return;
}
// dispatch the message if there is a handler registered for it
if (taskHandlers[msg.data.taskType]) {
taskHandlers[msg.data.taskType].handler(msg.data, function (result, transferList) {
self.postMessage({
taskType: msg.data.taskType,
status: 'success',
result: result,
workerIndex: msg.data.workerIndex
}, transferList);
});
return;
}
// not task handler registered - send a failure message back to ui thread
console.log('no task handler for ', msg.data.taskType);
console.log(taskHandlers);
self.postMessage({
taskType: msg.data.taskType,
status: 'failed - no task handler registered',
workerIndex: msg.data.workerIndex
});
};
/***/ }),
/***/ 57:
/***/ (function(module, exports, __webpack_require__) {
;
Object.defineProperty(exports, "__esModule", {
value: true
});
var _decodeJPEG = __webpack_require__(37);
var _decodeJPEGLS = __webpack_require__(38);
var _getMinMax = __webpack_require__(2);
var _getMinMax2 = _interopRequireDefault(_getMinMax);
var _decodeImageFrame = __webpack_require__(58);
var _decodeImageFrame2 = _interopRequireDefault(_decodeImageFrame);
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
var kTaskType = 'decodeTask';
// flag to ensure codecs are loaded only once
var codecsLoaded = false;
// the configuration object for the decodeTask
var decodeConfig = void 0;
/**
* Function to control loading and initializing the codecs
*/
function loadCodecs() {
// prevent loading codecs more than once
if (codecsLoaded) {
return;
}
// Load the codecs
// console.time('loadCodecs');
self.importScripts(decodeConfig.codecsPath);
codecsLoaded = true;
// console.timeEnd('loadCodecs');
// Initialize the codecs
if (decodeConfig.initializeCodecsOnStartup) {
// console.time('initializeCodecs');
(0, _decodeJPEG.initializeJPEG2000)(decodeConfig);
(0, _decodeJPEGLS.initializeJPEGLS)(decodeConfig);
// console.timeEnd('initializeCodecs');
}
}
/**
* Task initialization function
* @param {Object} config The web worker manager `taskConfiguration` field.
*/
function initialize(config) {
decodeConfig = config[kTaskType] || {};
if (decodeConfig.loadCodecsOnStartup) {
loadCodecs();
}
}
function calculateMinMax(imageFrame) {
var minMax = (0, _getMinMax2.default)(imageFrame.pixelData);
if (decodeConfig.strict === true) {
if (imageFrame.smallestPixelValue !== minMax.min) {
console.warn('Image smallestPixelValue tag is incorrect. Rendering performance will suffer considerably.');
}
if (imageFrame.largestPixelValue !== minMax.max) {
console.warn('Image largestPixelValue tag is incorrect. Rendering performance will suffer considerably.');
}
} else {
imageFrame.smallestPixelValue = minMax.min;
imageFrame.largestPixelValue = minMax.max;
}
}
/**
* Task handler function
*/
function handler(_ref, doneCallback) {
var data = _ref.data;
// Load the codecs if they aren't already loaded
loadCodecs();
var imageFrame = data.imageFrame;
// convert pixel data from ArrayBuffer to Uint8Array since web workers support passing ArrayBuffers but
// not typed arrays
var pixelData = new Uint8Array(data.pixelData);
(0, _decodeImageFrame2.default)(imageFrame, data.transferSyntax, pixelData, decodeConfig, data.options);
if (!imageFrame.pixelData) {
throw new Error('decodeTask: imageFrame.pixelData is undefined after decoding');
}
calculateMinMax(imageFrame);
// convert from TypedArray to ArrayBuffer since web workers support passing ArrayBuffers but not
// typed arrays
imageFrame.pixelData = imageFrame.pixelData.buffer;
// invoke the callback with our result and pass the pixelData in the transferList to move it to
// UI thread without making a copy
doneCallback(imageFrame, [imageFrame.pixelData]);
}
exports.default = {
taskType: kTaskType,
handler: handler,
initialize: initialize
};
/***/ }),
/***/ 58:
/***/ (function(module, exports, __webpack_require__) {
;
Object.defineProperty(exports, "__esModule", {
value: true
});
var _decodeLittleEndian = __webpack_require__(59);
var _decodeLittleEndian2 = _interopRequireDefault(_decodeLittleEndian);
var _decodeBigEndian = __webpack_require__(60);
var _decodeBigEndian2 = _interopRequireDefault(_decodeBigEndian);
var _decodeRLE = __webpack_require__(61);
var _decodeRLE2 = _interopRequireDefault(_decodeRLE);
var _decodeJPEGBaseline = __webpack_require__(62);
var _decodeJPEGBaseline2 = _interopRequireDefault(_decodeJPEGBaseline);
var _decodeJPEGLossless = __webpack_require__(63);
var _decodeJPEGLossless2 = _interopRequireDefault(_decodeJPEGLossless);
var _decodeJPEGLS = __webpack_require__(38);
var _decodeJPEGLS2 = _interopRequireDefault(_decodeJPEGLS);
var _decodeJPEG = __webpack_require__(37);
var _decodeJPEG2 = _interopRequireDefault(_decodeJPEG);
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
function decodeImageFrame(imageFrame, transferSyntax, pixelData, decodeConfig, options) {
var start = new Date().getTime();
if (transferSyntax === '1.2.840.10008.1.2') {
// Implicit VR Little Endian
imageFrame = (0, _decodeLittleEndian2.default)(imageFrame, pixelData);
} else if (transferSyntax === '1.2.840.10008.1.2.1') {
// Explicit VR Little Endian
imageFrame = (0, _decodeLittleEndian2.default)(imageFrame, pixelData);
} else if (transferSyntax === '1.2.840.10008.1.2.2') {
// Explicit VR Big Endian (retired)
imageFrame = (0, _decodeBigEndian2.default)(imageFrame, pixelData);
} else if (transferSyntax === '1.2.840.10008.1.2.1.99') {
// Deflate transfer syntax (deflated by dicomParser)
imageFrame = (0, _decodeLittleEndian2.default)(imageFrame, pixelData);
} else if (transferSyntax === '1.2.840.10008.1.2.5') {
// RLE Lossless
imageFrame = (0, _decodeRLE2.default)(imageFrame, pixelData);
} else if (transferSyntax === '1.2.840.10008.1.2.4.50') {
// JPEG Baseline lossy process 1 (8 bit)
imageFrame = (0, _decodeJPEGBaseline2.default)(imageFrame, pixelData);
} else if (transferSyntax === '1.2.840.10008.1.2.4.51') {
// JPEG Baseline lossy process 2 & 4 (12 bit)
imageFrame = (0, _decodeJPEGBaseline2.default)(imageFrame, pixelData);
} else if (transferSyntax === '1.2.840.10008.1.2.4.57') {
// JPEG Lossless, Nonhierarchical (Processes 14)
imageFrame = (0, _decodeJPEGLossless2.default)(imageFrame, pixelData);
} else if (transferSyntax === '1.2.840.10008.1.2.4.70') {
// JPEG Lossless, Nonhierarchical (Processes 14 [Selection 1])
imageFrame = (0, _decodeJPEGLossless2.default)(imageFrame, pixelData);
} else if (transferSyntax === '1.2.840.10008.1.2.4.80') {
// JPEG-LS Lossless Image Compression
imageFrame = (0, _decodeJPEGLS2.default)(imageFrame, pixelData);
} else if (transferSyntax === '1.2.840.10008.1.2.4.81') {
// JPEG-LS Lossy (Near-Lossless) Image Compression
imageFrame = (0, _decodeJPEGLS2.default)(imageFrame, pixelData);
} else if (transferSyntax === '1.2.840.10008.1.2.4.90') {
// JPEG 2000 Lossless
imageFrame = (0, _decodeJPEG2.default)(imageFrame, pixelData, decodeConfig, options);
} else if (transferSyntax === '1.2.840.10008.1.2.4.91') {
// JPEG 2000 Lossy
imageFrame = (0, _decodeJPEG2.default)(imageFrame, pixelData, decodeConfig, options);
} else {
throw new Error('no decoder for transfer syntax ' + transferSyntax);
}
/* Don't know if these work...
// JPEG 2000 Part 2 Multicomponent Image Compression (Lossless Only)
else if(transferSyntax === "1.2.840.10008.1.2.4.92")
{
return decodeJPEG2000(dataSet, frame);
}
// JPEG 2000 Part 2 Multicomponent Image Compression
else if(transferSyntax === "1.2.840.10008.1.2.4.93")
{
return decodeJPEG2000(dataSet, frame);
}
*/
var shouldShift = imageFrame.pixelRepresentation !== undefined && imageFrame.pixelRepresentation === 1;
var shift = shouldShift && imageFrame.bitsStored !== undefined ? 32 - imageFrame.bitsStored : undefined;
if (shouldShift && shift !== undefined) {
for (var i = 0; i < imageFrame.pixelData.length; i++) {
// eslint-disable-next-line no-bitwise
imageFrame.pixelData[i] = imageFrame.pixelData[i] << shift >> shift;
}
}
var end = new Date().getTime();
imageFrame.decodeTimeInMS = end - start;
return imageFrame;
}
exports.default = decodeImageFrame;
/***/ }),
/***/ 59:
/***/ (function(module, exports, __webpack_require__) {
;
Object.defineProperty(exports, "__esModule", {
value: true
});
function decodeLittleEndian(imageFrame, pixelData) {
var arrayBuffer = pixelData.buffer;
var offset = pixelData.byteOffset;
var length = pixelData.length;
if (imageFrame.bitsAllocated === 16) {
// if pixel data is not aligned on even boundary, shift it so we can create the 16 bit array
// buffers on it
if (offset % 2) {
arrayBuffer = arrayBuffer.slice(offset);
offset = 0;
}
if (imageFrame.pixelRepresentation === 0) {
imageFrame.pixelData = new Uint16Array(arrayBuffer, offset, length / 2);
} else {
imageFrame.pixelData = new Int16Array(arrayBuffer, offset, length / 2);
}
} else if (imageFrame.bitsAllocated === 8 || imageFrame.bitsAllocated === 1) {
imageFrame.pixelData = pixelData;
} else if (imageFrame.bitsAllocated === 32) {
// if pixel data is not aligned on even boundary, shift it
if (offset % 2) {
arrayBuffer = arrayBuffer.slice(offset);
offset = 0;
}
imageFrame.pixelData = new Float32Array(arrayBuffer, offset, length / 4);
}
return imageFrame;
}
exports.default = decodeLittleEndian;
/***/ }),
/***/ 60:
/***/ (function(module, exports, __webpack_require__) {
;
Object.defineProperty(exports, "__esModule", {
value: true
});
/* eslint no-bitwise: 0 */
function swap16(val) {
return (val & 0xFF) << 8 | val >> 8 & 0xFF;
}
function decodeBigEndian(imageFrame, pixelData) {
if (imageFrame.bitsAllocated === 16) {
var arrayBuffer = pixelData.buffer;
var offset = pixelData.byteOffset;
var length = pixelData.length;
// if pixel data is not aligned on even boundary, shift it so we can create the 16 bit array
// buffers on it
if (offset % 2) {
arrayBuffer = arrayBuffer.slice(offset);
offset = 0;
}
if (imageFrame.pixelRepresentation === 0) {
imageFrame.pixelData = new Uint16Array(arrayBuffer, offset, length / 2);
} else {
imageFrame.pixelData = new Int16Array(arrayBuffer, offset, length / 2);
}
// Do the byte swap
for (var i = 0; i < imageFrame.pixelData.length; i++) {
imageFrame.pixelData[i] = swap16(imageFrame.pixelData[i]);
}
} else if (imageFrame.bitsAllocated === 8) {
imageFrame.pixelData = pixelData;
}
return imageFrame;
}
exports.default = decodeBigEndian;
/***/ }),
/***/ 61:
/***/ (function(module, exports, __webpack_require__) {
;
Object.defineProperty(exports, "__esModule", {
value: true
});
function decodeRLE(imageFrame, pixelData) {
if (imageFrame.bitsAllocated === 8) {
if (imageFrame.planarConfiguration) {
return decode8Planar(imageFrame, pixelData);
}
return decode8(imageFrame, pixelData);
} else if (imageFrame.bitsAllocated === 16) {
return decode16(imageFrame, pixelData);
}
throw new Error('unsupported pixel format for RLE');
}
function decode8(imageFrame, pixelData) {
var frameData = pixelData;
var frameSize = imageFrame.rows * imageFrame.columns;
var outFrame = new ArrayBuffer(frameSize * imageFrame.samplesPerPixel);
var header = new DataView(frameData.buffer, frameData.byteOffset);
var data = new Int8Array(frameData.buffer, frameData.byteOffset);
var out = new Int8Array(outFrame);
var outIndex = 0;
var numSegments = header.getInt32(0, true);
for (var s = 0; s < numSegments; ++s) {
outIndex = s;
var inIndex = header.getInt32((s + 1) * 4, true);
var maxIndex = header.getInt32((s + 2) * 4, true);
if (maxIndex === 0) {
maxIndex = frameData.length;
}
var endOfSegment = frameSize * numSegments;
while (inIndex < maxIndex) {
var n = data[inIndex++];
if (n >= 0 && n <= 127) {
// copy n bytes
for (var i = 0; i < n + 1 && outIndex < endOfSegment; ++i) {
out[outIndex] = data[inIndex++];
outIndex += imageFrame.samplesPerPixel;
}
} else if (n <= -1 && n >= -127) {
var value = data[inIndex++];
// run of n bytes
for (var j = 0; j < -n + 1 && outIndex < endOfSegment; ++j) {
out[outIndex] = value;
outIndex += imageFrame.samplesPerPixel;
}
} /* else if (n === -128) {
} // do nothing */
}
}
imageFrame.pixelData = new Uint8Array(outFrame);
return imageFrame;
}
function decode8Planar(imageFrame, pixelData) {
var frameData = pixelData;
var frameSize = imageFrame.rows * imageFrame.columns;
var outFrame = new ArrayBuffer(frameSize * imageFrame.samplesPerPixel);
var header = new DataView(frameData.buffer, frameData.byteOffset);
var data = new Int8Array(frameData.buffer, frameData.byteOffset);
var out = new Int8Array(outFrame);
var outIndex = 0;
var numSegments = header.getInt32(0, true);
for (var s = 0; s < numSegments; ++s) {
outIndex = s * frameSize;
var inIndex = header.getInt32((s + 1) * 4, true);
var maxIndex = header.getInt32((s + 2) * 4, true);
if (maxIndex === 0) {
maxIndex = frameData.length;
}
var endOfSegment = frameSize * numSegments;
while (inIndex < maxIndex) {
var n = data[inIndex++];
if (n >= 0 && n <= 127) {
// copy n bytes
for (var i = 0; i < n + 1 && outIndex < endOfSegment; ++i) {
out[outIndex] = data[inIndex++];
outIndex++;
}
} else if (n <= -1 && n >= -127) {
var value = data[inIndex++];
// run of n bytes
for (var j = 0; j < -n + 1 && outIndex < endOfSegment; ++j) {
out[outIndex] = value;
outIndex++;
}
} /* else if (n === -128) {
} // do nothing */
}
}
imageFrame.pixelData = new Uint8Array(outFrame);
return imageFrame;
}
function decode16(imageFrame, pixelData) {
var frameData = pixelData;
var frameSize = imageFrame.rows * imageFrame.columns;
var outFrame = new ArrayBuffer(frameSize * imageFrame.samplesPerPixel * 2);
var header = new DataView(frameData.buffer, frameData.byteOffset);
var data = new Int8Array(frameData.buffer, frameData.byteOffset);
var out = new Int8Array(outFrame);
var numSegments = header.getInt32(0, true);
for (var s = 0; s < numSegments; ++s) {
var outIndex = 0;
var highByte = s === 0 ? 1 : 0;
var inIndex = header.getInt32((s + 1) * 4, true);
var maxIndex = header.getInt32((s + 2) * 4, true);
if (maxIndex === 0) {
maxIndex = frameData.length;
}
while (inIndex < maxIndex) {
var n = data[inIndex++];
if (n >= 0 && n <= 127) {
for (var i = 0; i < n + 1 && outIndex < frameSize; ++i) {
out[outIndex * 2 + highByte] = data[inIndex++];
outIndex++;
}
} else if (n <= -1 && n >= -127) {
var value = data[inIndex++];
for (var j = 0; j < -n + 1 && outIndex < frameSize; ++j) {
out[outIndex * 2 + highByte] = value;
outIndex++;
}
} /* else if (n === -128) {
} // do nothing */
}
}
if (imageFrame.pixelRepresentation === 0) {
imageFrame.pixelData = new Uint16Array(outFrame);
} else {
imageFrame.pixelData = new Int16Array(outFrame);
}
return imageFrame;
}
exports.default = decodeRLE;
/***/ }),
/***/ 62:
/***/ (function(module, exports, __webpack_require__) {
;
Object.defineProperty(exports, "__esModule", {
value: true
});
function decodeJPEGBaseline(imageFrame, pixelData) {
// check to make sure codec is loaded
if (typeof JpegImage === 'undefined') {
throw new Error('No JPEG Baseline decoder loaded');
}
var jpeg = new JpegImage();
jpeg.parse(pixelData);
// Do not use the internal jpeg.js color transformation,
// since we will handle this afterwards
jpeg.colorTransform = false;
if (imageFrame.bitsAllocated === 8) {
imageFrame.pixelData = jpeg.getData(imageFrame.columns, imageFrame.rows);
return imageFrame;
} else if (imageFrame.bitsAllocated === 16) {
imageFrame.pixelData = jpeg.getData16(imageFrame.columns, imageFrame.rows);
return imageFrame;
}
}
exports.default = decodeJPEGBaseline;
/***/ }),
/***/ 63:
/***/ (function(module, exports, __webpack_require__) {
;
Object.defineProperty(exports, "__esModule", {
value: true
});
function decodeJPEGLossless(imageFrame, pixelData) {
// check to make sure codec is loaded
if (typeof jpeg === 'undefined' || typeof jpeg.lossless === 'undefined' || typeof jpeg.lossless.Decoder === 'undefined') {
throw new Error('No JPEG Lossless decoder loaded');
}
var byteOutput = imageFrame.bitsAllocated <= 8 ? 1 : 2;
// console.time('jpeglossless');
var buffer = pixelData.buffer;
var decoder = new jpeg.lossless.Decoder();
var decompressedData = decoder.decode(buffer, pixelData.byteOffset, pixelData.length, byteOutput);
// console.timeEnd('jpeglossless');
if (imageFrame.pixelRepresentation === 0) {
if (imageFrame.bitsAllocated === 16) {
imageFrame.pixelData = new Uint16Array(decompressedData.buffer);
return imageFrame;
}
// untested!
imageFrame.pixelData = new Uint8Array(decompressedData.buffer);
return imageFrame;
}
imageFrame.pixelData = new Int16Array(decompressedData.buffer);
return imageFrame;
}
exports.default = decodeJPEGLossless;
/***/ }),
/***/ 9:
/***/ (function(module, exports, __webpack_require__) {
;
Object.defineProperty(exports, "__esModule", {
value: true
});
exports.default = '2.0.0';
/***/ })
/******/ });
});
//# sourceMappingURL=cornerstoneWADOImageLoaderWebWorker.js.map