larvitar 2.1.4 → 2.1.6

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/larvitar.js CHANGED
@@ -4462,6 +4462,87 @@ function getCircleWithThreshold(image, radius, thresholds, xCoord = 0, yCoord =
4462
4462
 
4463
4463
  /***/ }),
4464
4464
 
4465
+ /***/ 9003:
4466
+ /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {
4467
+
4468
+ "use strict";
4469
+ __webpack_require__.r(__webpack_exports__);
4470
+ /* harmony export */ __webpack_require__.d(__webpack_exports__, {
4471
+ /* harmony export */ "default": () => (__WEBPACK_DEFAULT_EXPORT__)
4472
+ /* harmony export */ });
4473
+ /* harmony import */ var cornerstone_tools__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(4030);
4474
+ /* harmony import */ var cornerstone_tools__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(cornerstone_tools__WEBPACK_IMPORTED_MODULE_0__);
4475
+ // external libraries
4476
+
4477
+
4478
+ // global variables
4479
+ const external = (cornerstone_tools__WEBPACK_IMPORTED_MODULE_0___default().external);
4480
+ const _DEFAULT_LOAD_HANDLER = "DEFAULT";
4481
+ const defaultStartLoadHandler = {};
4482
+ const defaultEndLoadHandler = {};
4483
+ const defaultErrorLoadingHandler = {};
4484
+ function _getUUIDFromElement(element) {
4485
+ if (!element) {
4486
+ return _DEFAULT_LOAD_HANDLER;
4487
+ }
4488
+ const uuid = external.cornerstone.getEnabledElement(element).uuid;
4489
+ if (!uuid) {
4490
+ throw new Error("Something went wrong when getting uuid from element");
4491
+ }
4492
+ return uuid;
4493
+ }
4494
+ function setStartLoadHandler(handler, element = undefined) {
4495
+ if (!handler) {
4496
+ throw new Error("The Handler function must be defined");
4497
+ }
4498
+ const uuid = _getUUIDFromElement(element);
4499
+ defaultStartLoadHandler[uuid] = handler;
4500
+ }
4501
+ function getStartLoadHandler(element) {
4502
+ const uuid = _getUUIDFromElement(element);
4503
+ return defaultStartLoadHandler[uuid] || defaultStartLoadHandler[_DEFAULT_LOAD_HANDLER];
4504
+ }
4505
+ function setEndLoadHandler(handler, element = undefined) {
4506
+ if (!handler) {
4507
+ throw new Error("The Handler function must be defined");
4508
+ }
4509
+ const uuid = _getUUIDFromElement(element);
4510
+ defaultEndLoadHandler[uuid] = handler;
4511
+ }
4512
+ function getEndLoadHandler(element) {
4513
+ const uuid = _getUUIDFromElement(element);
4514
+ return defaultEndLoadHandler[uuid] || defaultEndLoadHandler[_DEFAULT_LOAD_HANDLER];
4515
+ }
4516
+ function setErrorLoadingHandler(handler, element = undefined) {
4517
+ if (!handler) {
4518
+ throw new Error("The Handler function must be defined");
4519
+ }
4520
+ const uuid = _getUUIDFromElement(element);
4521
+ defaultErrorLoadingHandler[uuid] = handler;
4522
+ }
4523
+ function getErrorLoadingHandler(element) {
4524
+ const uuid = _getUUIDFromElement(element);
4525
+ return defaultErrorLoadingHandler[uuid] || defaultErrorLoadingHandler[_DEFAULT_LOAD_HANDLER];
4526
+ }
4527
+ function removeHandlers(element) {
4528
+ const uuid = _getUUIDFromElement(element);
4529
+ delete defaultStartLoadHandler[uuid];
4530
+ delete defaultEndLoadHandler[uuid];
4531
+ delete defaultErrorLoadingHandler[uuid];
4532
+ }
4533
+ const loadHandlerManager = {
4534
+ setStartLoadHandler,
4535
+ getStartLoadHandler,
4536
+ setEndLoadHandler,
4537
+ getEndLoadHandler,
4538
+ setErrorLoadingHandler,
4539
+ getErrorLoadingHandler,
4540
+ removeHandlers
4541
+ };
4542
+ /* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (loadHandlerManager);
4543
+
4544
+ /***/ }),
4545
+
4465
4546
  /***/ 7371:
4466
4547
  /***/ ((module) => {
4467
4548
 
@@ -156941,7 +157022,7 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
156941
157022
  return (mod && mod.__esModule) ? mod : { "default": mod };
156942
157023
  };
156943
157024
  Object.defineProperty(exports, "__esModule", ({ value: true }));
156944
- exports.updateLoadedStack = exports.registerMultiFrameImageLoader = exports.registerResliceLoader = exports.registerNRRDImageLoader = exports.initializeFileImageLoader = exports.initializeWebImageLoader = exports.initializeImageLoader = void 0;
157025
+ exports.updateLoadedStack = exports.registerDsaImageLoader = exports.registerMultiFrameImageLoader = exports.registerResliceLoader = exports.registerNRRDImageLoader = exports.initializeFileImageLoader = exports.initializeWebImageLoader = exports.initializeImageLoader = void 0;
156945
157026
  // external libraries
156946
157027
  const cornerstone_core_1 = __importDefault(__webpack_require__(7371));
156947
157028
  const dicom_parser_1 = __importDefault(__webpack_require__(4705));
@@ -156956,6 +157037,7 @@ const imageUtils_1 = __webpack_require__(8345);
156956
157037
  const nrrdLoader_1 = __webpack_require__(6934);
156957
157038
  const resliceLoader_1 = __webpack_require__(5779);
156958
157039
  const multiframeLoader_1 = __webpack_require__(934);
157040
+ const dsaImageLoader_1 = __webpack_require__(6475);
156959
157041
  /**
156960
157042
  * Global standard configuration
156961
157043
  * @inner
@@ -157050,6 +157132,15 @@ const registerMultiFrameImageLoader = function () {
157050
157132
  cornerstone_core_1.default.registerImageLoader("multiFrameLoader", multiframeLoader_1.loadMultiFrameImage);
157051
157133
  };
157052
157134
  exports.registerMultiFrameImageLoader = registerMultiFrameImageLoader;
157135
+ /**
157136
+ * Register custom DSA ImageLoader
157137
+ * @instance
157138
+ * @function registerDsaImageLoader
157139
+ */
157140
+ const registerDsaImageLoader = function () {
157141
+ cornerstone_core_1.default.registerImageLoader("dsaImageLoader", dsaImageLoader_1.loadDsaImage);
157142
+ };
157143
+ exports.registerDsaImageLoader = registerDsaImageLoader;
157053
157144
  /**
157054
157145
  * Update the allSeriesStack object using DICOMImageLoader fileManager
157055
157146
  * @instance
@@ -157789,7 +157880,7 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
157789
157880
  return (mod && mod.__esModule) ? mod : { "default": mod };
157790
157881
  };
157791
157882
  Object.defineProperty(exports, "__esModule", ({ value: true }));
157792
- exports.rotateImageRight = exports.rotateImageLeft = exports.flipImageVertical = exports.flipImageHorizontal = exports.invertImage = exports.storeViewportData = exports.updateViewportData = exports.resetViewports = exports.updateImage = exports.renderImage = exports.resizeViewport = exports.unloadViewport = exports.disableViewport = exports.renderWebImage = exports.renderFileImage = exports.renderDICOMPDF = exports.loadAndCacheImages = exports.loadAndCacheImage = exports.clearImageCache = void 0;
157883
+ exports.rotateImageRight = exports.rotateImageLeft = exports.flipImageVertical = exports.flipImageHorizontal = exports.invertImage = exports.storeViewportData = exports.updateViewportData = exports.resetViewports = exports.updateImage = exports.redrawImage = exports.renderImage = exports.resizeViewport = exports.unloadViewport = exports.disableViewport = exports.renderWebImage = exports.renderFileImage = exports.renderDICOMPDF = exports.loadAndCacheImages = exports.loadAndCacheImage = exports.clearImageCache = void 0;
157793
157884
  // external libraries
157794
157885
  const cornerstone_core_1 = __importDefault(__webpack_require__(7371));
157795
157886
  const cornerstone_wado_image_loader_1 = __importDefault(__webpack_require__(2424));
@@ -157805,6 +157896,7 @@ const imageUtils_1 = __webpack_require__(8345);
157805
157896
  const default_1 = __webpack_require__(6694);
157806
157897
  const imageLoading_1 = __webpack_require__(5848);
157807
157898
  const pdf_1 = __webpack_require__(9425);
157899
+ const dsaImageLoader_1 = __webpack_require__(6475);
157808
157900
  /*
157809
157901
  * This module provides the following functions to be exported:
157810
157902
  * clearImageCache(seriesId)
@@ -158271,12 +158363,30 @@ const renderImage = function (seriesStack, elementId, defaultProps) {
158271
158363
  data = null;
158272
158364
  resolve(true);
158273
158365
  });
158366
+ // }
158274
158367
  });
158275
158368
  (0, main_1.csToolsCreateStack)(element, series.imageIds, data.imageIndex - 1);
158276
158369
  (0, interaction_1.toggleMouseToolsListeners)(id, false);
158277
158370
  return renderPromise;
158278
158371
  };
158279
158372
  exports.renderImage = renderImage;
158373
+ /**
158374
+ * Redraw the cornerstone image
158375
+ * @instance
158376
+ * @function redrawImage
158377
+ * @param {String} elementId - The html div id used for rendering or its DOM HTMLElement
158378
+ */
158379
+ const redrawImage = function (elementId) {
158380
+ const element = document.getElementById(elementId);
158381
+ if (element) {
158382
+ const cornestoneElement = cornerstone_core_1.default.getEnabledElement(element);
158383
+ cornerstone_core_1.default.drawImage(cornestoneElement, true);
158384
+ }
158385
+ else {
158386
+ console.error("invalid html element: " + elementId);
158387
+ }
158388
+ };
158389
+ exports.redrawImage = redrawImage;
158280
158390
  /**
158281
158391
  * Update the cornerstone image with new imageIndex
158282
158392
  * @instance
@@ -158295,7 +158405,15 @@ const updateImage = function (series, elementId, imageIndex, cacheImage) {
158295
158405
  throw "not element";
158296
158406
  }
158297
158407
  const id = (0, imageUtils_1.isElement)(elementId) ? element.id : elementId;
158298
- const imageId = series.imageIds[imageIndex];
158408
+ const isDSAEnabled = imageStore_1.default.get(["viewports", id, "isDSAEnabled"]);
158409
+ const imageId = isDSAEnabled === true
158410
+ ? series.dsa.imageIds[imageIndex]
158411
+ : series.imageIds[imageIndex];
158412
+ if (isDSAEnabled === true) {
158413
+ // get the optional custom pixel shift
158414
+ const pixelShift = imageStore_1.default.get(["viewports", id, "pixelShift"]);
158415
+ (0, dsaImageLoader_1.setPixelShift)(pixelShift);
158416
+ }
158299
158417
  if (!imageId) {
158300
158418
  (0, imageStore_1.set)(["pendingSliceId", id, imageIndex]);
158301
158419
  throw `Error: wrong image index ${imageIndex}, no imageId available`;
@@ -158317,7 +158435,7 @@ const updateImage = function (series, elementId, imageIndex, cacheImage) {
158317
158435
  const t1 = performance.now();
158318
158436
  if (t0 !== undefined) {
158319
158437
  // check if t0 is defined before using it
158320
- console.log(`Call to updateImage took ${t1 - t0} milliseconds.`);
158438
+ console.log(`Call to updateImage for viewport ${id} took ${t1 - t0} milliseconds.`);
158321
158439
  }
158322
158440
  }
158323
158441
  (0, imageStore_1.set)(["sliceId", id, imageIndex]);
@@ -158339,7 +158457,7 @@ const updateImage = function (series, elementId, imageIndex, cacheImage) {
158339
158457
  const t1 = performance.now();
158340
158458
  if (t0 !== undefined) {
158341
158459
  // check if t0 is defined before using it
158342
- console.log(`Call to updateImage took ${t1 - t0} milliseconds.`);
158460
+ console.log(`Call to updateImage for viewport ${id} took ${t1 - t0} milliseconds.`);
158343
158461
  }
158344
158462
  }
158345
158463
  (0, imageStore_1.set)(["sliceId", id, imageIndex]);
@@ -158906,6 +159024,7 @@ const DEFAULT_VIEWPORT = {
158906
159024
  isColor: false,
158907
159025
  isMultiframe: false,
158908
159026
  isTimeserie: false,
159027
+ isDSAEnabled: false,
158909
159028
  isPDF: false,
158910
159029
  waveform: false,
158911
159030
  viewport: {
@@ -158983,6 +159102,7 @@ const setValue = (store, data) => {
158983
159102
  case "isPDF":
158984
159103
  case "waveform":
158985
159104
  case "isTimeserie":
159105
+ case "isDSAEnabled":
158986
159106
  case "ready":
158987
159107
  if (!viewport) {
158988
159108
  return;
@@ -159011,6 +159131,7 @@ const setValue = (store, data) => {
159011
159131
  break;
159012
159132
  case "timestamps":
159013
159133
  case "timeIds":
159134
+ case "pixelShift":
159014
159135
  if (!viewport) {
159015
159136
  return;
159016
159137
  }
@@ -159181,10 +159302,16 @@ exports["default"] = {
159181
159302
  setTimeId: (elementId, timeIndex) => {
159182
159303
  (0, exports.set)(["timeId", elementId, timeIndex]);
159183
159304
  },
159305
+ setDSAEnabled: (elementId, enabled) => {
159306
+ (0, exports.set)(["isDSAEnabled", elementId, enabled]);
159307
+ },
159308
+ setDSAPixelShift: (elementId, pixelShift) => {
159309
+ (0, exports.set)(["pixelShift", elementId, pixelShift]);
159310
+ },
159184
159311
  // get
159185
159312
  get: (props) => {
159186
159313
  validateStore();
159187
- return (0, lodash_1.get)(STORE, props);
159314
+ return props ? (0, lodash_1.get)(STORE, props) : STORE;
159188
159315
  },
159189
159316
  // watch store
159190
159317
  addStoreListener: (listener) => (storeListener = listener),
@@ -159880,17 +160007,13 @@ const getNormalOrientation = function (el) {
159880
160007
  };
159881
160008
  exports.getNormalOrientation = getNormalOrientation;
159882
160009
  /**
159883
- * If a value is provided, returns it, otherwise get the min pixel value from pixelData
160010
+ * Get the min pixel value from pixelData
159884
160011
  * @instance
159885
160012
  * @function getMinPixelValue
159886
- * @param {Number} value - The min value
159887
160013
  * @param {Array} pixelData - Pixel data array
159888
160014
  */
159889
- const getMinPixelValue = function (value, pixelData) {
159890
- if (value !== undefined) {
159891
- return value;
159892
- }
159893
- let min;
160015
+ const getMinPixelValue = function (pixelData) {
160016
+ let min = 0;
159894
160017
  for (let i = 0; i < pixelData.length; i++) {
159895
160018
  if (!min || min > pixelData[i]) {
159896
160019
  min = pixelData[i];
@@ -159900,17 +160023,13 @@ const getMinPixelValue = function (value, pixelData) {
159900
160023
  };
159901
160024
  exports.getMinPixelValue = getMinPixelValue;
159902
160025
  /**
159903
- * If a value is provided, returns it, otherwise get the max pixel value from pixelData
160026
+ * Get the max pixel value from pixelData
159904
160027
  * @instance
159905
160028
  * @function getMaxPixelValue
159906
- * @param {Number} value - The max value
159907
160029
  * @param {Array} pixelData - Pixel data array
159908
160030
  */
159909
- const getMaxPixelValue = function (value, pixelData) {
159910
- if (value !== undefined) {
159911
- return value;
159912
- }
159913
- let max;
160031
+ const getMaxPixelValue = function (pixelData) {
160032
+ let max = 0;
159914
160033
  for (let i = 0; i < pixelData.length; i++) {
159915
160034
  if (!max || max < pixelData[i]) {
159916
160035
  max = pixelData[i];
@@ -161000,13 +161119,21 @@ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, ge
161000
161119
  step((generator = generator.apply(thisArg, _arguments || [])).next());
161001
161120
  });
161002
161121
  };
161122
+ var __importDefault = (this && this.__importDefault) || function (mod) {
161123
+ return (mod && mod.__esModule) ? mod : { "default": mod };
161124
+ };
161003
161125
  Object.defineProperty(exports, "__esModule", ({ value: true }));
161004
- exports.getDicomImageId = exports.cacheImages = exports.cacheImage = void 0;
161126
+ exports.getDicomImageId = exports.loadAndCacheImageStack = exports.unloadAndRecacheImageStackDSA = exports.cacheImages = exports.cacheImage = void 0;
161127
+ // external libraries
161128
+ const cornerstone_core_1 = __importDefault(__webpack_require__(7371));
161005
161129
  // internal libraries
161006
161130
  const imageRendering_1 = __webpack_require__(4767);
161131
+ const imageStore_1 = __importDefault(__webpack_require__(5278));
161007
161132
  /*
161008
161133
  * This module provides the following functions to be exported:
161009
161134
  * cacheImage(seriesData, imageIndex)
161135
+ * loadAndCacheImageStack(seriesData)
161136
+ * unloadAndRecacheImageStackDSA(seriesData)
161010
161137
  * cacheImages(seriesData, callback)
161011
161138
  * getDicomImageId(dicomLoaderName)
161012
161139
  */
@@ -161044,6 +161171,95 @@ const cacheImages = function (seriesData, callback) {
161044
161171
  });
161045
161172
  };
161046
161173
  exports.cacheImages = cacheImages;
161174
+ /**
161175
+ * Unload DSA Image Stack and Recache Image Stack for DSA
161176
+ * @instance
161177
+ * @function unloadAndRecacheImageStackDSA
161178
+ * @param {Object} seriesData The series data
161179
+ * @return {Promise} Promise object represents the loading and caching of the image stack
161180
+ */
161181
+ const unloadAndRecacheImageStackDSA = function (seriesData) {
161182
+ return __awaiter(this, void 0, void 0, function* () {
161183
+ return new Promise((resolve, reject) => __awaiter(this, void 0, void 0, function* () {
161184
+ const t0 = performance.now();
161185
+ // add DSA imageIds to store
161186
+ if (seriesData.dsa === undefined) {
161187
+ console.warn("DSA image stack is not available");
161188
+ reject();
161189
+ return;
161190
+ }
161191
+ let promises = new Array(seriesData.dsa.imageIds.length);
161192
+ function cacheImageStack(imageIds, index) {
161193
+ return __awaiter(this, void 0, void 0, function* () {
161194
+ if (index < imageIds.length) {
161195
+ const imageId = imageIds[index];
161196
+ if (imageId) {
161197
+ yield cornerstone_core_1.default.imageCache.removeImageLoadObject(imageId);
161198
+ yield cornerstone_core_1.default.loadAndCacheImage(imageId).then(promise => {
161199
+ promises[index] = Promise.resolve(promise);
161200
+ });
161201
+ }
161202
+ else {
161203
+ console.warn(`Stack is not fully loaded, skipping cache for index ${index}`);
161204
+ }
161205
+ yield cacheImageStack(imageIds, index + 1);
161206
+ }
161207
+ });
161208
+ }
161209
+ yield cacheImageStack(seriesData.dsa.imageIds, 0);
161210
+ yield Promise.all(promises);
161211
+ const t1 = performance.now();
161212
+ console.log(`Call to unloadAndRecacheImageStackDSA took ${t1 - t0} milliseconds.`);
161213
+ resolve();
161214
+ }));
161215
+ });
161216
+ };
161217
+ exports.unloadAndRecacheImageStackDSA = unloadAndRecacheImageStackDSA;
161218
+ /**
161219
+ * Load and cache image stack
161220
+ * @instance
161221
+ * @function loadAndCacheImageStack
161222
+ * @param {Object} seriesData The series data
161223
+ * @return {Promise} Promise object represents the loading and caching of the image stack
161224
+ */
161225
+ const loadAndCacheImageStack = function (seriesData) {
161226
+ return __awaiter(this, void 0, void 0, function* () {
161227
+ return new Promise((resolve, _) => __awaiter(this, void 0, void 0, function* () {
161228
+ const t0 = performance.now();
161229
+ imageStore_1.default.addSeriesId(seriesData.seriesUID, seriesData.imageIds);
161230
+ let imageIds = seriesData.imageIds;
161231
+ // add DSA imageIds to store
161232
+ if (seriesData.dsa !== undefined) {
161233
+ const dsaSeriesUID = seriesData.seriesUID + "-DSA";
161234
+ imageStore_1.default.addSeriesId(dsaSeriesUID, seriesData.dsa.imageIds);
161235
+ imageIds = imageIds.concat(seriesData.dsa.imageIds);
161236
+ }
161237
+ let promises = new Array(imageIds.length);
161238
+ function cacheImageStack(imageIds, index) {
161239
+ return __awaiter(this, void 0, void 0, function* () {
161240
+ if (index < imageIds.length) {
161241
+ const imageId = imageIds[index];
161242
+ if (imageId) {
161243
+ yield cornerstone_core_1.default.loadAndCacheImage(imageId).then(promise => {
161244
+ promises[index] = Promise.resolve(promise);
161245
+ });
161246
+ }
161247
+ else {
161248
+ console.warn(`Stack is not fully loaded, skipping cache for index ${index}`);
161249
+ }
161250
+ yield cacheImageStack(imageIds, index + 1);
161251
+ }
161252
+ });
161253
+ }
161254
+ yield cacheImageStack(imageIds, 0);
161255
+ yield Promise.all(promises);
161256
+ const t1 = performance.now();
161257
+ console.log(`Call to loadAndCacheImageStack took ${t1 - t0} milliseconds.`);
161258
+ resolve();
161259
+ }));
161260
+ });
161261
+ };
161262
+ exports.loadAndCacheImageStack = loadAndCacheImageStack;
161047
161263
  /**
161048
161264
  * Get the dicom imageId from dicom loader
161049
161265
  * @instance
@@ -161059,6 +161275,171 @@ const getDicomImageId = function (dicomLoaderName) {
161059
161275
  exports.getDicomImageId = getDicomImageId;
161060
161276
 
161061
161277
 
161278
+ /***/ }),
161279
+
161280
+ /***/ 6475:
161281
+ /***/ (function(__unused_webpack_module, exports, __webpack_require__) {
161282
+
161283
+ "use strict";
161284
+
161285
+ /** @module loaders/multiframeLoader
161286
+ * @desc This file is a custom DICOM loader for multiframe images
161287
+ */
161288
+ var __importDefault = (this && this.__importDefault) || function (mod) {
161289
+ return (mod && mod.__esModule) ? mod : { "default": mod };
161290
+ };
161291
+ Object.defineProperty(exports, "__esModule", ({ value: true }));
161292
+ exports.setPixelShift = exports.populateDsaImageIds = exports.loadDsaImage = void 0;
161293
+ // external libraries
161294
+ const cornerstone_wado_image_loader_1 = __importDefault(__webpack_require__(2424));
161295
+ const cornerstone_core_1 = __importDefault(__webpack_require__(7371));
161296
+ const lodash_1 = __webpack_require__(6486);
161297
+ // internal libraries
161298
+ const commonLoader_1 = __webpack_require__(326);
161299
+ const imageUtils_1 = __webpack_require__(8345);
161300
+ const applyDSA_1 = __webpack_require__(1446);
161301
+ // global module variables
161302
+ let customImageLoaderCounter = 0;
161303
+ let PIXEL_SHIFT = undefined;
161304
+ /*
161305
+ * This module provides the following functions to be exported:
161306
+ * loadDsaImage(imageId)
161307
+ * setPixelShift(pixelShift)
161308
+ * populateDsaImageIds(seriesId)
161309
+ */
161310
+ /**
161311
+ * Custom DSA Image Loader Function
161312
+ * @export
161313
+ * @function loadDsaImage
161314
+ * @param {String} imageId - ImageId tag
161315
+ * @returns {Function} Custom Image Creation Function
161316
+ */
161317
+ const loadDsaImage = function (imageId) {
161318
+ let parsedImageId = cornerstone_wado_image_loader_1.default.wadouri.parseImageId(imageId);
161319
+ let rootImageId = parsedImageId.scheme + ":" + parsedImageId.url;
161320
+ let imageTracker = (0, commonLoader_1.getLarvitarImageTracker)();
161321
+ let seriesId = imageTracker[rootImageId];
161322
+ let manager = (0, commonLoader_1.getLarvitarManager)();
161323
+ if (manager) {
161324
+ let multiFrameSerie = manager[seriesId];
161325
+ const imageIds = multiFrameSerie.dsa.imageIds;
161326
+ const index = imageIds.indexOf(imageId);
161327
+ const pixelData = (0, applyDSA_1.applyDSA)(multiFrameSerie, index, PIXEL_SHIFT);
161328
+ const srcImage = (0, lodash_1.find)(cornerstone_core_1.default.imageCache.cachedImages, {
161329
+ imageId: multiFrameSerie.imageIds[index]
161330
+ }).image;
161331
+ console.debug(`Load DSA Image with custom loader for imageId: ${imageId}`);
161332
+ return createCustomImage(imageId, srcImage, pixelData);
161333
+ }
161334
+ else {
161335
+ throw new Error("No multiframe dataset found for seriesId: " + seriesId);
161336
+ }
161337
+ };
161338
+ exports.loadDsaImage = loadDsaImage;
161339
+ /**
161340
+ * Populate the DSA imageIds for a given seriesId
161341
+ * @export
161342
+ * @function populateDsaImageIds
161343
+ * @param {String} seriesId - SeriesId tag
161344
+ * @param {Object} serie - parsed serie object
161345
+ */
161346
+ const populateDsaImageIds = function (larvitarSeriesInstanceUID) {
161347
+ let t0 = performance.now();
161348
+ const serie = (0, commonLoader_1.getSeriesDataFromLarvitarManager)(larvitarSeriesInstanceUID);
161349
+ if (serie) {
161350
+ const numberOfFrames = serie.metadata.numberOfFrames;
161351
+ const imageId = getDsaImageId("dsaImageLoader");
161352
+ let imageTracker = (0, commonLoader_1.getLarvitarImageTracker)();
161353
+ imageTracker[imageId] = larvitarSeriesInstanceUID;
161354
+ let imageIds = [];
161355
+ (0, lodash_1.each)((0, lodash_1.range)(numberOfFrames), function (frameNumber) {
161356
+ const frameImageId = imageId + "?frame=" + frameNumber;
161357
+ imageIds.push(frameImageId);
161358
+ });
161359
+ const dsa = {
161360
+ imageIds: imageIds,
161361
+ x00286101: serie.metadata.x00286100[0].x00286101,
161362
+ x00286102: serie.metadata.x00286100[0].x00286102,
161363
+ x00286110: serie.metadata.x00286100[0].x00286110,
161364
+ x00286112: serie.metadata.x00286100[0].x00286112,
161365
+ x00286114: serie.metadata.x00286100[0].x00286114,
161366
+ x00286120: serie.metadata.x00286100[0].x00286120,
161367
+ x00286190: serie.metadata.x00286100[0].x00286190,
161368
+ x00289416: serie.metadata.x00286100[0].x00289416,
161369
+ x00289454: serie.metadata.x00286100[0].x00289454
161370
+ };
161371
+ serie.dsa = dsa;
161372
+ }
161373
+ else {
161374
+ throw new Error("No serie found for seriesId: " + larvitarSeriesInstanceUID);
161375
+ }
161376
+ let t1 = performance.now();
161377
+ console.log(`Call to populateDsaImageIds took ${t1 - t0} milliseconds.`);
161378
+ };
161379
+ exports.populateDsaImageIds = populateDsaImageIds;
161380
+ /**
161381
+ * Set the pixel shift for DSA
161382
+ * @instance
161383
+ * @function setPixelShift
161384
+ * @param {Array} pixelShift The pixel shift array
161385
+ */
161386
+ const setPixelShift = function (pixelShift) {
161387
+ PIXEL_SHIFT = pixelShift;
161388
+ };
161389
+ exports.setPixelShift = setPixelShift;
161390
+ /**
161391
+ * Get the custom imageId from custom loader
161392
+ * @instance
161393
+ * @function getDsaImageId
161394
+ * @param {String} customLoaderName The custom loader name
161395
+ * @return {String} the custom image id
161396
+ */
161397
+ const getDsaImageId = function (customLoaderName) {
161398
+ let imageId = customLoaderName + "://" + customImageLoaderCounter;
161399
+ customImageLoaderCounter++;
161400
+ return imageId;
161401
+ };
161402
+ /**
161403
+ * Create the custom image object for cornerstone from custom image
161404
+ * @instance
161405
+ * @function createCustomImage
161406
+ * @param {String} imageId The custom image id
161407
+ * @param {Object} srcImage The source image object
161408
+ * @param {Array} pixelData The pixel data array
161409
+ * @return {Object} the custom image object
161410
+ */
161411
+ let createCustomImage = function (imageId, srcImage, pixelData) {
161412
+ let promise = new Promise((resolve, _) => {
161413
+ const minPixelValue = (0, imageUtils_1.getMinPixelValue)(pixelData);
161414
+ const maxPixelValue = (0, imageUtils_1.getMaxPixelValue)(pixelData);
161415
+ const windowWidth = (maxPixelValue - minPixelValue) / 2;
161416
+ const windowCenter = windowWidth / 2;
161417
+ const image = {
161418
+ imageId: imageId,
161419
+ minPixelValue: minPixelValue,
161420
+ maxPixelValue: maxPixelValue,
161421
+ slope: srcImage.slope,
161422
+ intercept: srcImage.intercept,
161423
+ windowCenter: windowCenter,
161424
+ windowWidth: windowWidth,
161425
+ getPixelData: () => pixelData,
161426
+ rows: srcImage.rows,
161427
+ columns: srcImage.columns,
161428
+ height: srcImage.height,
161429
+ width: srcImage.width,
161430
+ color: srcImage.color,
161431
+ columnPixelSpacing: srcImage.columnPixelSpacing,
161432
+ rowPixelSpacing: srcImage.rowPixelSpacing,
161433
+ sizeInBytes: srcImage.sizeInBytes
161434
+ };
161435
+ resolve(image);
161436
+ });
161437
+ return {
161438
+ promise
161439
+ };
161440
+ };
161441
+
161442
+
161062
161443
  /***/ }),
161063
161444
 
161064
161445
  /***/ 9995:
@@ -161172,6 +161553,7 @@ const lodash_1 = __webpack_require__(6486);
161172
161553
  // internal libraries
161173
161554
  const commonLoader_1 = __webpack_require__(326);
161174
161555
  const imageParsing_1 = __webpack_require__(1539);
161556
+ const dsaImageLoader_1 = __webpack_require__(6475);
161175
161557
  // global module variables
161176
161558
  let customImageLoaderCounter = 0;
161177
161559
  // Local cache used to store multiframe datasets to avoid reading and parsing
@@ -161272,6 +161654,10 @@ const buildMultiFrameImage = function (larvitarSeriesInstanceUID, serie) {
161272
161654
  managerSeriesId.seriesDescription = serie.metadata
161273
161655
  .seriesDescription;
161274
161656
  });
161657
+ // check for DSA
161658
+ if (serie.metadata["x00282110"] !== undefined) {
161659
+ (0, dsaImageLoader_1.populateDsaImageIds)(larvitarSeriesInstanceUID);
161660
+ }
161275
161661
  let t1 = performance.now();
161276
161662
  console.log(`Call to buildMultiFrameImage took ${t1 - t0} milliseconds.`);
161277
161663
  };
@@ -161322,7 +161708,6 @@ const clearMultiFrameCache = function (seriesId) {
161322
161708
  }
161323
161709
  };
161324
161710
  exports.clearMultiFrameCache = clearMultiFrameCache;
161325
- /* Internal module functions */
161326
161711
  /**
161327
161712
  * Create the custom image object for cornerstone from custom image
161328
161713
  * @instance
@@ -162505,6 +162890,341 @@ function generateFile(pdf, pageNumber) {
162505
162890
  }
162506
162891
 
162507
162892
 
162893
+ /***/ }),
162894
+
162895
+ /***/ 1446:
162896
+ /***/ (function(__unused_webpack_module, exports, __webpack_require__) {
162897
+
162898
+ "use strict";
162899
+
162900
+ /** @module imaging/postProcessing/applyDSA
162901
+ * @desc This file provides digital subtraction algorithm for XA images
162902
+ */
162903
+ var __importDefault = (this && this.__importDefault) || function (mod) {
162904
+ return (mod && mod.__esModule) ? mod : { "default": mod };
162905
+ };
162906
+ Object.defineProperty(exports, "__esModule", ({ value: true }));
162907
+ exports.applyDSAShift = exports.applyDSA = void 0;
162908
+ // external libraries
162909
+ const lodash_1 = __webpack_require__(6486);
162910
+ const cornerstone_core_1 = __importDefault(__webpack_require__(7371));
162911
+ const imageRendering_1 = __webpack_require__(4767);
162912
+ const imageStore_1 = __importDefault(__webpack_require__(5278));
162913
+ /*
162914
+ * This module provides the following functions to be exported:
162915
+ * applyDSA(multiframeSerie: Series, index: number): number[]
162916
+ * applyDSAShift(elementId: string, multiFrameSerie: Series, frameId: number, inputMaskSubPixelShift: number[]): void
162917
+ */
162918
+ /**
162919
+ * Apply DSA to a multiframe serie
162920
+ * @function applyDSA
162921
+ * @param {Series} multiframeSerie - multiframe serie to apply DSA
162922
+ * @param {number} index - index of the frame to apply DSA
162923
+ * @param {number[]} inputMaskSubPixelShift - pixel shift applied to the mask
162924
+ * @returns {number[]} - pixel data of the frame after DSA
162925
+ */
162926
+ function applyDSA(multiframeSerie, index, inputMaskSubPixelShift) {
162927
+ const dsaMetadata = multiframeSerie.dsa;
162928
+ const imageIds = multiframeSerie.imageIds;
162929
+ // switch on DSA MaskOperation
162930
+ switch (dsaMetadata.x00286101 // DSA MaskOperation
162931
+ ) {
162932
+ case "AVG_SUB":
162933
+ return avgSubMask(dsaMetadata, imageIds, index, inputMaskSubPixelShift);
162934
+ case "TID":
162935
+ return tidMask(dsaMetadata, imageIds, index);
162936
+ case "REV_TID":
162937
+ return revTidMask(dsaMetadata, imageIds, index);
162938
+ default:
162939
+ return [];
162940
+ }
162941
+ }
162942
+ exports.applyDSA = applyDSA;
162943
+ /**
162944
+ * Apply DSA with Pixel Shift and update the image
162945
+ * @function applyDSAShift
162946
+ * @param {string} elementId - elementId of the viewer
162947
+ * @param {Series} multiFrameSerie - multiframe serie to apply DSA
162948
+ * @param {number} frameId - index of the frame to apply DSA
162949
+ * @param {number[]} inputMaskSubPixelShift - pixel shift applied to the mask
162950
+ * @returns {void}
162951
+ */
162952
+ const applyDSAShift = function (elementId, multiFrameSerie, frameId, inputMaskSubPixelShift) {
162953
+ const t0 = performance.now();
162954
+ // set in store the mask subpixel shift
162955
+ imageStore_1.default.setDSAPixelShift(elementId, inputMaskSubPixelShift);
162956
+ // uncache image from cornestone cache
162957
+ const imageId = multiFrameSerie.dsa.imageIds[frameId];
162958
+ cornerstone_core_1.default.imageCache.removeImageLoadObject(imageId);
162959
+ // update image
162960
+ (0, imageRendering_1.updateImage)(multiFrameSerie, elementId, frameId, true);
162961
+ (0, imageRendering_1.redrawImage)(elementId);
162962
+ const t1 = performance.now();
162963
+ console.debug(`Call to DSA applyDSAShift took ${t1 - t0} milliseconds.`);
162964
+ };
162965
+ exports.applyDSAShift = applyDSAShift;
162966
+ /**
162967
+ * Compute the digital subtraction with avgSub mask
162968
+ * @function avgSubMask
162969
+ * @param {DSA} metadataInfo - DSA metadata
162970
+ * @param {string[]} imageIds - imageIds of the serie
162971
+ * @param {number} index - index of the frame to apply DSA
162972
+ * @returns {number[]} - pixel data of the frame after DSA
162973
+ */
162974
+ function avgSubMask(metadataInfo, imageIds, index, inputMaskSubPixelShift) {
162975
+ const t0 = performance.now();
162976
+ // Mask Frame Numbers Attribute (might be an array) Required if AVGSUB
162977
+ const frameIndexNumber = typeof metadataInfo.x00286110 === "number"
162978
+ ? [metadataInfo.x00286110]
162979
+ : metadataInfo.x00286110;
162980
+ // get cached images from cornerstone cache
162981
+ const cachedImages = cornerstone_core_1.default.imageCache.cachedImages;
162982
+ // A pair of floating point numbers specifying the fractional vertical
162983
+ // [adjacent row spacing] and horizontal [adjacent column spacing] pixel
162984
+ // shift applied to the mask before subtracting it from the contrast frame.
162985
+ // The row offset results in a shift of the pixels along the column axis.
162986
+ // The column offset results in a shift of the pixels along the row axis.
162987
+ // A positive row offset is a shift toward the pixels of the lower row of the pixel plane.
162988
+ // A positive column offset is a shift toward the pixels of the left hand side column of the pixel plane.
162989
+ const maskSubPixelShift = inputMaskSubPixelShift
162990
+ ? inputMaskSubPixelShift
162991
+ : metadataInfo.x00286114 || [0.0, 0.0];
162992
+ // Specifies the number of contrast frames to average together
162993
+ // before performing the mask operation.
162994
+ // If the Attribute is missing, no averaging is performed.
162995
+ const contrastFrameAveragingAvg = metadataInfo.x00286112 || 1;
162996
+ // Each pair of numbers in this multi-valued Attribute specify a
162997
+ // beginning and ending frame number inclusive of a range where
162998
+ // this particular mask operation is valid.
162999
+ const frameRangeAvg = metadataInfo.x00286102 || [
163000
+ 0,
163001
+ imageIds.length - 1 - contrastFrameAveragingAvg + 1
163002
+ ];
163003
+ let isFrameIncluded = false;
163004
+ for (let i = 0; i < frameRangeAvg.length; i += 2) {
163005
+ isFrameIncluded =
163006
+ index >= frameRangeAvg[i] && index <= frameRangeAvg[i + 1];
163007
+ }
163008
+ // source image where mask will be applied
163009
+ let srcImage = (0, lodash_1.find)(cachedImages, {
163010
+ imageId: imageIds[index]
163011
+ }).image;
163012
+ // get pixel data from source image
163013
+ let contrastFrame = srcImage.getPixelData();
163014
+ if (isFrameIncluded) {
163015
+ let maskFramesAvg = frameIndexNumber.map((i) => {
163016
+ const imageId = imageIds[i];
163017
+ const image = (0, lodash_1.find)(cachedImages, { imageId: imageId }).image;
163018
+ return image.getPixelData();
163019
+ });
163020
+ const resultFramesAvg = new Array(contrastFrame.length);
163021
+ const applyAverage = Array.isArray(maskFramesAvg) && maskFramesAvg.length > 1 ? true : false;
163022
+ if (applyAverage) {
163023
+ const valueAveraged = new Array(contrastFrame.length);
163024
+ for (let j = 0; j < contrastFrame.length; j++) {
163025
+ let valueAverage = 0;
163026
+ for (let i = 0; i < maskFramesAvg.length; i++) {
163027
+ valueAverage = valueAverage + maskFramesAvg[i][j];
163028
+ }
163029
+ valueAveraged[j] = valueAverage / maskFramesAvg.length;
163030
+ }
163031
+ // Extract fractional vertical and horizontal pixel shifts from maskSubPixelShift
163032
+ const rowOffset = -1.0 * maskSubPixelShift[0];
163033
+ const colOffset = maskSubPixelShift[1];
163034
+ for (let j = 0; j < contrastFrame.length; j++) {
163035
+ // Apply sub-pixel shift to the averaged frame
163036
+ if (colOffset !== 0 || rowOffset !== 0) {
163037
+ let rowNumber = Math.floor(j / srcImage.columns) + 1;
163038
+ if (colOffset + j >= rowNumber * srcImage.columns ||
163039
+ colOffset + j < 0 ||
163040
+ rowOffset * srcImage.columns + j >= contrastFrame.length ||
163041
+ rowOffset * srcImage.columns + j < 0 ||
163042
+ rowOffset * srcImage.columns + colOffset + j >=
163043
+ contrastFrame.length ||
163044
+ rowOffset * srcImage.columns + colOffset + j < 0) {
163045
+ resultFramesAvg[j] = contrastFrame[j];
163046
+ }
163047
+ else {
163048
+ const shiftedj = j + colOffset + rowOffset * srcImage.columns;
163049
+ resultFramesAvg[j] = contrastFrame[j] - valueAveraged[shiftedj];
163050
+ }
163051
+ }
163052
+ else {
163053
+ resultFramesAvg[j] = contrastFrame[j] - valueAveraged[j];
163054
+ }
163055
+ }
163056
+ }
163057
+ else {
163058
+ const rowOffset = -1.0 * maskSubPixelShift[0];
163059
+ const colOffset = maskSubPixelShift[1];
163060
+ for (let j = 0; j < contrastFrame.length; j++) {
163061
+ // Apply sub-pixel shift to the averaged frame
163062
+ if (colOffset !== 0 || rowOffset !== 0) {
163063
+ let rowNumber = Math.floor(j / srcImage.columns) + 1;
163064
+ if (colOffset + j >= rowNumber * srcImage.columns ||
163065
+ colOffset + j < 0 ||
163066
+ rowOffset * srcImage.columns + j >= contrastFrame.length ||
163067
+ rowOffset * srcImage.columns + j < 0 ||
163068
+ rowOffset * srcImage.columns + colOffset + j >=
163069
+ contrastFrame.length ||
163070
+ rowOffset * srcImage.columns + colOffset + j < 0) {
163071
+ resultFramesAvg[j] = contrastFrame[j];
163072
+ }
163073
+ else {
163074
+ const shiftedj = j + colOffset + rowOffset * srcImage.columns;
163075
+ resultFramesAvg[j] = contrastFrame[j] - maskFramesAvg[0][shiftedj];
163076
+ }
163077
+ }
163078
+ else {
163079
+ resultFramesAvg[j] = contrastFrame[j] - maskFramesAvg[0][j];
163080
+ }
163081
+ }
163082
+ let t1 = performance.now();
163083
+ console.debug(`Call to DSA avgSubMask took ${t1 - t0} milliseconds.`);
163084
+ }
163085
+ // @ts-ignore
163086
+ srcImage = null;
163087
+ // @ts-ignore
163088
+ contrastFrame = null;
163089
+ // @ts-ignore
163090
+ maskFramesAvg = null;
163091
+ return resultFramesAvg;
163092
+ }
163093
+ else {
163094
+ // @ts-ignore
163095
+ srcImage = null;
163096
+ let t1 = performance.now();
163097
+ console.debug(`Call to DSA avgSubMask took ${t1 - t0} milliseconds.`);
163098
+ console.warn("Frame not included in the Applicable Frame Range");
163099
+ return contrastFrame;
163100
+ }
163101
+ }
163102
+ /**
163103
+ * Compute the digital subtraction with tid mask
163104
+ * @function tidMask
163105
+ * @param {DSA} metadataInfo - DSA metadata
163106
+ * @param {string[]} imageIds - imageIds of the serie
163107
+ * @param {number} index - index of the frame to apply DSA
163108
+ * @returns {number[]} - pixel data of the frame after DSA
163109
+ */
163110
+ function tidMask(metadataInfo, imageIds, index) {
163111
+ const t0 = performance.now();
163112
+ // get cached images from cornerstone cache
163113
+ const cachedImages = cornerstone_core_1.default.imageCache.cachedImages;
163114
+ // TID Offset to be subtracted from the respective frame number.
163115
+ const TidOffset = metadataInfo.x00286120 || 1;
163116
+ // Applicable Frame Range
163117
+ const frameRangeTid = metadataInfo.x00286102 || [
163118
+ Math.abs(TidOffset) - 1,
163119
+ imageIds.length - Math.abs(TidOffset) - 1
163120
+ ];
163121
+ // Filter frames within the Applicable Frame Range
163122
+ let isFrameIncluded = false;
163123
+ for (let i = 0; i < frameRangeTid.length; i += 2) {
163124
+ isFrameIncluded =
163125
+ index >= frameRangeTid[i] && index <= frameRangeTid[i + 1];
163126
+ }
163127
+ // source image where mask will be applied
163128
+ let srcImage = (0, lodash_1.find)(cachedImages, {
163129
+ imageId: imageIds[index]
163130
+ }).image;
163131
+ // get pixel data from source image
163132
+ let contrastFrame = srcImage.getPixelData();
163133
+ if (isFrameIncluded) {
163134
+ let maskImage = (0, lodash_1.find)(cachedImages, {
163135
+ imageId: imageIds[index - TidOffset]
163136
+ }).image;
163137
+ let contrastMaskFrame = maskImage.getPixelData();
163138
+ // Apply Time Interval Differencing
163139
+ const resultFramesTid = new Array(contrastFrame.length);
163140
+ for (let i = 0; i < contrastFrame.length; i++) {
163141
+ resultFramesTid[i] = contrastFrame[i] - contrastMaskFrame[i];
163142
+ }
163143
+ // @ts-ignore
163144
+ srcImage = null;
163145
+ // @ts-ignore
163146
+ contrastFrame = null;
163147
+ // @ts-ignore
163148
+ maskImage = null;
163149
+ // @ts-ignore
163150
+ contrastMaskFrame = null;
163151
+ let t1 = performance.now();
163152
+ console.debug(`Call to DSA tidMask took ${t1 - t0} milliseconds.`);
163153
+ return resultFramesTid;
163154
+ }
163155
+ else {
163156
+ // @ts-ignore
163157
+ srcImage = null;
163158
+ let t1 = performance.now();
163159
+ console.debug(`Call to DSA tidMask took ${t1 - t0} milliseconds.`);
163160
+ return contrastFrame;
163161
+ }
163162
+ }
163163
+ /**
163164
+ * Compute the digital subtraction with revTid mask
163165
+ * @function revTidMask
163166
+ * @param {DSA} metadataInfo - DSA metadata
163167
+ * @param {string[]} imageIds - imageIds of the serie
163168
+ * @param {number} index - index of the frame to apply DSA
163169
+ * @returns {number[]} - pixel data of the frame after DSA
163170
+ */
163171
+ function revTidMask(metadataInfo, imageIds, index) {
163172
+ const t0 = performance.now();
163173
+ // get cached images from cornerstone cache
163174
+ const cachedImages = cornerstone_core_1.default.imageCache.cachedImages;
163175
+ // TID Offset to be subtracted from the first frame within the Applicable Frame Range,
163176
+ // TID Offset +2 from the second frame within the Applicable Frame Range,
163177
+ // TID Offset (0028,6120)+4 from the third frame and so on.
163178
+ const RevTidOffset = metadataInfo.x00286120 || 1;
163179
+ //Applicable Frame Range, shall be present in this case
163180
+ const frameRangeRevTid = metadataInfo.x00286102 || [
163181
+ Math.abs(RevTidOffset) - 1,
163182
+ imageIds.length - Math.abs(RevTidOffset) - 1
163183
+ ];
163184
+ // Filter frames within the Applicable Frame Range
163185
+ let isFrameIncluded = false;
163186
+ for (let i = 0; i < frameRangeRevTid.length; i += 2) {
163187
+ isFrameIncluded =
163188
+ index >= frameRangeRevTid[i] && index <= frameRangeRevTid[i + 1];
163189
+ }
163190
+ // source image where mask will be applied
163191
+ let srcImage = (0, lodash_1.find)(cachedImages, {
163192
+ imageId: imageIds[index]
163193
+ }).image;
163194
+ // get pixel data from source image
163195
+ let contrastFrame = srcImage.getPixelData();
163196
+ if (isFrameIncluded) {
163197
+ let maskimage = (0, lodash_1.find)(cachedImages, {
163198
+ imageId: imageIds[frameRangeRevTid[0] - RevTidOffset - index - frameRangeRevTid[0]]
163199
+ }).image;
163200
+ let contrastMaskFrame = maskimage.getPixelData();
163201
+ // Apply Time Interval Differencing
163202
+ const resultFramesRevTid = new Array(contrastFrame.length);
163203
+ for (let i = 0; i < contrastFrame.length; i++) {
163204
+ resultFramesRevTid[i] = contrastFrame[i] - contrastMaskFrame[i];
163205
+ }
163206
+ // @ts-ignore
163207
+ srcImage = null;
163208
+ // @ts-ignore
163209
+ contrastFrame = null;
163210
+ // @ts-ignore
163211
+ maskImage = null;
163212
+ // @ts-ignore
163213
+ contrastMaskFrame = null;
163214
+ let t1 = performance.now();
163215
+ console.debug(`Call to DSA revTidMask took ${t1 - t0} milliseconds.`);
163216
+ return resultFramesRevTid;
163217
+ }
163218
+ else {
163219
+ // @ts-ignore
163220
+ srcImage = null;
163221
+ let t1 = performance.now();
163222
+ console.debug(`Call to DSA revTidMask took ${t1 - t0} milliseconds.`);
163223
+ return contrastFrame;
163224
+ }
163225
+ }
163226
+
163227
+
162508
163228
  /***/ }),
162509
163229
 
162510
163230
  /***/ 4585:
@@ -162544,12 +163264,15 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
162544
163264
  };
162545
163265
  Object.defineProperty(exports, "__esModule", ({ value: true }));
162546
163266
  const cornerstone_tools_1 = __importDefault(__webpack_require__(4030));
163267
+ const cornerstone_wado_image_loader_1 = __importDefault(__webpack_require__(2424));
162547
163268
  const BaseTool = cornerstone_tools_1.default.importInternal("base/BaseTool");
162548
- const scrollToIndex = cornerstone_tools_1.default.importInternal("util/scrollToIndex");
162549
163269
  const getToolState = cornerstone_tools_1.default.getToolState;
162550
163270
  // internal libraries
162551
163271
  const imageStore_1 = __importStar(__webpack_require__(5278));
162552
163272
  const default_1 = __webpack_require__(6694);
163273
+ const customMouseWheelUtils_1 = __importDefault(__webpack_require__(7683));
163274
+ const commonLoader_1 = __webpack_require__(326);
163275
+ const commonLoader_2 = __webpack_require__(326);
162553
163276
  /*
162554
163277
  * @class CustomMouseWheelScrollTool
162555
163278
  * @extends BaseTool
@@ -162578,6 +163301,7 @@ class CustomMouseWheelScrollTool extends BaseTool {
162578
163301
  }
162579
163302
  };
162580
163303
  super(props, defaultProps);
163304
+ this.nextIndex = null;
162581
163305
  this.currentMode = "stack";
162582
163306
  this.framesNumber = this.configuration.framesNumber;
162583
163307
  this.slicesnumber = 0;
@@ -162640,6 +163364,7 @@ class CustomMouseWheelScrollTool extends BaseTool {
162640
163364
  }
162641
163365
  const stackData = toolData.data[0];
162642
163366
  const currentIndex = stackData.currentImageIdIndex;
163367
+ this.currentIndex = currentIndex;
162643
163368
  switch (this.currentMode) {
162644
163369
  case "stack":
162645
163370
  // Switching from 'stack' to 'slice'
@@ -162671,33 +163396,53 @@ class CustomMouseWheelScrollTool extends BaseTool {
162671
163396
  return;
162672
163397
  }
162673
163398
  const stackData = toolData.data[0];
163399
+ const isDSAEnabled = imageStore_1.default.get([
163400
+ "viewports",
163401
+ element.id,
163402
+ "isDSAEnabled"
163403
+ ]);
163404
+ let imageIds;
163405
+ if (isDSAEnabled) {
163406
+ const originalImageIdSample = toolData.data[0].imageIds[0];
163407
+ const parsedImageId = cornerstone_wado_image_loader_1.default.wadouri.parseImageId(originalImageIdSample);
163408
+ const rootImageId = parsedImageId.scheme + ":" + parsedImageId.url;
163409
+ const imageTracker = (0, commonLoader_1.getLarvitarImageTracker)();
163410
+ const seriesId = imageTracker[rootImageId];
163411
+ const manager = (0, commonLoader_2.getLarvitarManager)();
163412
+ const multiFrameSerie = manager[seriesId];
163413
+ imageIds = multiFrameSerie.dsa.imageIds;
163414
+ }
163415
+ else {
163416
+ imageIds = stackData.imageIds;
163417
+ }
162674
163418
  if (this.configuration.currentMode === "stack") {
162675
163419
  // Handle 'stack' mode
162676
163420
  // Calculate validIndex for 'stack' mode (no looping) between 0 and (N-1)*framesnumber where N=numberofslices=numberofimageids/numberofframes
162677
- let lastIndex = imageStore_1.default.get(["viewports", element.id, "sliceId"]);
163421
+ let lastIndex = this.nextIndex != null
163422
+ ? this.nextIndex
163423
+ : imageStore_1.default.get(["viewports", element.id, "sliceId"]);
162678
163424
  let nextIndex = lastIndex + direction;
162679
163425
  if (lastIndex === -1) {
162680
163426
  nextIndex = 0 + direction;
162681
163427
  lastIndex = 0;
162682
163428
  }
162683
- this.slicesnumber =
162684
- Math.ceil(stackData.imageIds.length / this.framesNumber) - 1;
163429
+ this.slicesnumber = Math.ceil(imageIds.length / this.framesNumber) - 1;
162685
163430
  // Ensure nextIndex is between 0 and upperBound
162686
- const validIndex = nextIndex >= 0 &&
162687
- nextIndex < stackData.imageIds.length &&
162688
- this.slicesnumber > 0
163431
+ const validIndex = nextIndex >= 0 && nextIndex < imageIds.length && this.slicesnumber > 0
162689
163432
  ? nextIndex
162690
163433
  : lastIndex;
163434
+ this.nextIndex = validIndex;
162691
163435
  // Scroll to the calculated index
162692
- scrollToIndex(element, validIndex);
163436
+ (0, customMouseWheelUtils_1.default)(element, validIndex);
162693
163437
  }
162694
163438
  else {
162695
163439
  // Handle 'slice' mode
162696
163440
  let lastIndex = this.isMultiframe === true || this.is4D === true
162697
- ? imageStore_1.default.get(["viewports", element.id, "sliceId"])
163441
+ ? this.nextIndex != null
163442
+ ? this.nextIndex
163443
+ : imageStore_1.default.get(["viewports", element.id, "sliceId"])
162698
163444
  : stackData.currentImageIdIndex;
162699
- this.slicesnumber =
162700
- Math.ceil(stackData.imageIds.length / this.framesNumber) - 1;
163445
+ this.slicesnumber = Math.ceil(imageIds.length / this.framesNumber) - 1;
162701
163446
  const startFrame = this.configuration.fixedSlice * this.configuration.framesNumber;
162702
163447
  const endFrame = (this.configuration.fixedSlice + 1) * this.configuration.framesNumber -
162703
163448
  1;
@@ -162706,11 +163451,12 @@ class CustomMouseWheelScrollTool extends BaseTool {
162706
163451
  // Check if the new index is within the valid range for the current slice
162707
163452
  if (nextIndex < startFrame ||
162708
163453
  nextIndex > endFrame ||
162709
- nextIndex >= stackData.imageIds.length) {
163454
+ nextIndex >= imageIds.length) {
162710
163455
  nextIndex = startFrame;
162711
163456
  }
163457
+ this.nextIndex = nextIndex;
162712
163458
  // Scroll to the calculated index
162713
- scrollToIndex(element, nextIndex);
163459
+ (0, customMouseWheelUtils_1.default)(element, nextIndex);
162714
163460
  if (this.is4D) {
162715
163461
  const viewport = imageStore_1.default.get(["viewports", element.id]);
162716
163462
  const timeId = viewport.timeIds[nextIndex];
@@ -162736,7 +163482,7 @@ class CustomMouseWheelScrollTool extends BaseTool {
162736
163482
  }
162737
163483
  };
162738
163484
  element.addEventListener("cornerstoneimagerendered", newImageHandler);
162739
- scrollToIndex(element, pendingEvent.index);
163485
+ (0, customMouseWheelUtils_1.default)(element, pendingEvent.index);
162740
163486
  }
162741
163487
  }
162742
163488
  exports["default"] = CustomMouseWheelScrollTool;
@@ -162943,6 +163689,139 @@ function setLabelmap3DByFirstImageId(firstImageId, buffer, labelmapIndex, metada
162943
163689
  exports.setLabelmap3DByFirstImageId = setLabelmap3DByFirstImageId;
162944
163690
 
162945
163691
 
163692
+ /***/ }),
163693
+
163694
+ /***/ 7683:
163695
+ /***/ (function(__unused_webpack_module, exports, __webpack_require__) {
163696
+
163697
+ "use strict";
163698
+
163699
+ var __importDefault = (this && this.__importDefault) || function (mod) {
163700
+ return (mod && mod.__esModule) ? mod : { "default": mod };
163701
+ };
163702
+ Object.defineProperty(exports, "__esModule", ({ value: true }));
163703
+ // external libraries
163704
+ const cornerstone_tools_1 = __importDefault(__webpack_require__(4030));
163705
+ const cornerstone_wado_image_loader_1 = __importDefault(__webpack_require__(2424));
163706
+ // internal libraries
163707
+ const commonLoader_1 = __webpack_require__(326);
163708
+ const imageStore_1 = __importDefault(__webpack_require__(5278));
163709
+ const commonLoader_2 = __webpack_require__(326);
163710
+ const loadHandlerManager_1 = __importDefault(__webpack_require__(9003));
163711
+ //const loadHandlerManager = cornerstoneTools.importInternal(
163712
+ // "stateManagement/loadHandlerManager"
163713
+ //);// TODO LAURA CHECK HOW TO IMPORT IT
163714
+ // global variables
163715
+ const EVENTS = cornerstone_tools_1.default.EVENTS;
163716
+ const external = cornerstone_tools_1.default.external;
163717
+ const getToolState = cornerstone_tools_1.default.getToolState;
163718
+ const triggerEvent = cornerstone_tools_1.default.importInternal("util/triggerEvent");
163719
+ function scrollToIndex(element, newImageIdIndex) {
163720
+ const toolData = getToolState(element, "stack");
163721
+ if (!toolData || !toolData.data || !toolData.data.length) {
163722
+ return;
163723
+ }
163724
+ const cornerstone = external.cornerstone;
163725
+ // If we have more than one stack, check if we have a stack renderer defined
163726
+ let stackRenderer;
163727
+ if (toolData.data.length > 1) {
163728
+ const stackRendererData = getToolState(element, "stackRenderer");
163729
+ if (stackRendererData &&
163730
+ stackRendererData.data &&
163731
+ stackRendererData.data.length) {
163732
+ stackRenderer = stackRendererData.data[0];
163733
+ }
163734
+ }
163735
+ const stackData = toolData.data[0];
163736
+ const originalImageIdSample = toolData.data[0].imageIds[0];
163737
+ const parsedImageId = cornerstone_wado_image_loader_1.default.wadouri.parseImageId(originalImageIdSample);
163738
+ const rootImageId = parsedImageId.scheme + ":" + parsedImageId.url;
163739
+ const imageTracker = (0, commonLoader_2.getLarvitarImageTracker)();
163740
+ const seriesId = imageTracker[rootImageId];
163741
+ const manager = (0, commonLoader_1.getLarvitarManager)();
163742
+ const multiFrameSerie = manager[seriesId];
163743
+ const id = element.id;
163744
+ const isDSAEnabled = imageStore_1.default.get(["viewports", id, "isDSAEnabled"]);
163745
+ const imageIds = isDSAEnabled === true
163746
+ ? multiFrameSerie.dsa.imageIds
163747
+ : multiFrameSerie.imageIds;
163748
+ // Allow for negative indexing
163749
+ if (newImageIdIndex < 0) {
163750
+ newImageIdIndex += imageIds.length;
163751
+ }
163752
+ const startLoadingHandler = loadHandlerManager_1.default.getStartLoadHandler(element);
163753
+ const endLoadingHandler = loadHandlerManager_1.default.getEndLoadHandler(element);
163754
+ const errorLoadingHandler = loadHandlerManager_1.default.getErrorLoadingHandler(element);
163755
+ function doneCallback(image) {
163756
+ if (stackData.currentImageIdIndex !== newImageIdIndex) {
163757
+ return;
163758
+ }
163759
+ // Check if the element is still enabled in Cornerstone,
163760
+ // If an error is thrown, stop here.
163761
+ try {
163762
+ // TODO: Add 'isElementEnabled' to Cornerstone?
163763
+ cornerstone.getEnabledElement(element);
163764
+ }
163765
+ catch (error) {
163766
+ return;
163767
+ }
163768
+ if (stackRenderer) {
163769
+ stackRenderer.currentImageIdIndex = newImageIdIndex;
163770
+ stackRenderer.render(element, toolData.data);
163771
+ }
163772
+ else {
163773
+ cornerstone.displayImage(element, image);
163774
+ }
163775
+ if (endLoadingHandler) {
163776
+ endLoadingHandler(element, image);
163777
+ }
163778
+ }
163779
+ function failCallback(error) {
163780
+ const imageId = imageIds[newImageIdIndex];
163781
+ if (errorLoadingHandler) {
163782
+ errorLoadingHandler(element, imageId, error);
163783
+ }
163784
+ }
163785
+ if (newImageIdIndex === stackData.currentImageIdIndex) {
163786
+ return;
163787
+ }
163788
+ if (startLoadingHandler) {
163789
+ startLoadingHandler(element);
163790
+ }
163791
+ const eventData = {
163792
+ newImageIdIndex,
163793
+ direction: newImageIdIndex - stackData.currentImageIdIndex
163794
+ };
163795
+ stackData.currentImageIdIndex = newImageIdIndex;
163796
+ const newImageId = imageIds[newImageIdIndex];
163797
+ // Retry image loading in cases where previous image promise
163798
+ // Was rejected, if the option is set
163799
+ /*
163800
+
163801
+ Const config = stackScroll.getConfiguration();
163802
+
163803
+ TODO: Revisit this. It appears that Core's imageCache is not
163804
+ keeping rejected promises anywhere, so we have no way to know
163805
+ if something was previously rejected.
163806
+
163807
+ if (config && config.retryLoadOnScroll === true) {
163808
+ }
163809
+ */
163810
+ // Convert the preventCache value in stack data to a boolean
163811
+ const preventCache = Boolean(stackData.preventCache);
163812
+ let imagePromise;
163813
+ if (preventCache) {
163814
+ imagePromise = cornerstone.loadImage(newImageId);
163815
+ }
163816
+ else {
163817
+ imagePromise = cornerstone.loadAndCacheImage(newImageId);
163818
+ }
163819
+ imagePromise.then(doneCallback, failCallback);
163820
+ triggerEvent(element, EVENTS.STACK_SCROLL, eventData);
163821
+ }
163822
+ exports["default"] = scrollToIndex;
163823
+
163824
+
162946
163825
  /***/ }),
162947
163826
 
162948
163827
  /***/ 6694:
@@ -163519,8 +164398,7 @@ exports.setDefaultToolsProps = setDefaultToolsProps;
163519
164398
  */
163520
164399
  const registerExternalTool = function (toolName, toolClass) {
163521
164400
  if (dvTools[toolName] || DEFAULT_TOOLS[toolName]) {
163522
- console.error(`${toolName} already exists`);
163523
- return;
164401
+ console.warn(`${toolName} already exists, it will be replaced`);
163524
164402
  }
163525
164403
  dvTools[toolClass.name] = toolClass;
163526
164404
  DEFAULT_TOOLS[toolName] = {
@@ -164090,7 +164968,7 @@ const addTool = function (toolName, customConfig, targetElementId) {
164090
164968
  if (!toolClassName) {
164091
164969
  throw new Error(`Tool ${toolName} class not found. Please check tools/default or pass a valid tool class name in the configuration object.`);
164092
164970
  }
164093
- const toolClass = cornerstone_tools_1.default[toolClassName] || default_1.dvTools[toolClassName];
164971
+ const toolClass = default_1.dvTools[toolClassName] || cornerstone_tools_1.default[toolClassName];
164094
164972
  if (targetElementId) {
164095
164973
  let element = document.getElementById(targetElementId);
164096
164974
  cornerstone_tools_1.default.addToolForElement(element, toolClass, defaultConfig);
@@ -165041,9 +165919,9 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
165041
165919
  };
165042
165920
  Object.defineProperty(exports, "__esModule", ({ value: true }));
165043
165921
  exports.registerNRRDImageLoader = exports.initializeFileImageLoader = exports.initializeWebImageLoader = exports.initializeImageLoader = exports.setActiveLayer = exports.getActiveLayer = exports.updateLayer = exports.buildLayer = exports.anonymize = exports.exportImageToBase64 = exports.importNRRDImage = exports.buildDataAsync = exports.buildData = exports.getCachedPixelData = exports.buildHeader = exports.getImageMetadata = exports.getDistanceBetweenSlices = exports.getReslicedPixeldata = exports.getReslicedMetadata = exports.getMeanValue = exports.randomId = exports.getSortedStack = exports.getTypedArrayFromDataType = exports.getPixelRepresentation = exports.getMaxPixelValue = exports.getMinPixelValue = exports.getNormalOrientation = exports.setImageCustomPreset = exports.setImagePreset = exports.getImagePresets = exports.getDefaultECGLayout = exports.updateECGFrame = exports.syncECGFrame = exports.unrenderECG = exports.renderECG = exports.parseECG = exports.store = exports.deactivatePerformanceMonitor = exports.activatePerformanceMonitor = exports.getPerformanceMonitor = exports.getAvailableMemory = exports.getUsedMemory = exports.checkMemoryAllocation = exports.checkAndClearMemory = exports.cornerstoneDICOMImageLoader = exports.segModule = exports.parseDicom = exports.cornerstoneTools = exports.cornerstone = exports.VERSION = void 0;
165044
- exports.getDicomImageId = exports.loadReslicedImage = exports.getNrrdSerieDimensions = exports.getSliceNumberFromImageId = exports.getImageIdFromSlice = exports.loadNrrdImage = exports.getNrrdImageId = exports.buildNrrdImage = exports.getSopInstanceUIDFromLarvitarManager = exports.getImageFrame = exports.getSeriesDataFromLarvitarManager = exports.removeSeriesFromLarvitarManager = exports.resetLarvitarManager = exports.getLarvitarImageTracker = exports.getLarvitarManager = exports.populateLarvitarManager = exports.updateLarvitarManager = exports.parseContours = exports.HSVToRGB = exports.fillPixelData = exports.addColorMap = exports.applyColorMap = exports.getColormapsList = exports.resliceSeries = exports.rotateImageRight = exports.rotateImageLeft = exports.flipImageVertical = exports.flipImageHorizontal = exports.invertImage = exports.storeViewportData = exports.toggleMouseToolsListeners = exports.updateViewportData = exports.resetViewports = exports.updateImage = exports.renderImage = exports.resizeViewport = exports.unloadViewport = exports.disableViewport = exports.renderWebImage = exports.renderDICOMPDF = exports.renderFileImage = exports.loadAndCacheImages = exports.clearImageCache = exports.clearImageParsing = exports.parseDataSet = exports.readFiles = exports.readFile = exports.updateLoadedStack = exports.registerMultiFrameImageLoader = exports.registerResliceLoader = void 0;
165045
- exports.setActiveLabelmap = exports.addSegmentationMask = exports.initSegmentationModule = exports.removeMouseKeyHandlers = exports.addMouseKeyHandlers = exports.loadAnnotations = exports.saveAnnotations = exports.registerExternalTool = exports.setDefaultToolsProps = exports.getDefaultToolsByType = exports.dvTools = exports.DEFAULT_TOOLS = exports.exportAnnotations = exports.setToolPassive = exports.setToolEnabled = exports.setToolDisabled = exports.setToolActive = exports.addTool = exports.addDefaultTools = exports.setToolsStyle = exports.initializeCSTools = exports.csToolsUpdateImageIndex = exports.csToolsUpdateImageIds = exports.csToolsCreateStack = exports.setSegmentationConfig = exports.updateStackToolState = exports.syncToolStack = exports.clearCornerstoneElements = exports.addToolStateSingleSlice = exports.updateDiameterTool = exports.clearToolStateByName = exports.getToolState = exports.clearMeasurements = exports.addSeedsTool = exports.addStackStateToElement = exports.getCurrentMaskData = exports.addMaskEditingTool = exports.addContoursTool = exports.addDiameterTool = exports.getFileImageId = exports.populateFileManager = exports.resetFileManager = exports.resetFileLoader = exports.getFileManager = exports.clearMultiFrameCache = exports.getMultiFrameImageId = exports.buildMultiFrameImage = exports.loadMultiFrameImage = exports.cacheImages = exports.cacheImage = void 0;
165046
- exports.getActiveLabelmapBuffer = exports.toggleVisibility = exports.toggleContourMode = exports.disableBrushTool = exports.enableBrushTool = exports.deleteMask = exports.clearSegmentationState = exports.rgbToHex = exports.hexToRgb = exports.setBrushProps = exports.redoLastStroke = exports.undoLastStroke = exports.setActiveSegment = void 0;
165922
+ exports.getNrrdSerieDimensions = exports.getSliceNumberFromImageId = exports.getImageIdFromSlice = exports.loadNrrdImage = exports.getNrrdImageId = exports.buildNrrdImage = exports.getSopInstanceUIDFromLarvitarManager = exports.getImageFrame = exports.getSeriesDataFromLarvitarManager = exports.removeSeriesFromLarvitarManager = exports.resetLarvitarManager = exports.getLarvitarImageTracker = exports.getLarvitarManager = exports.populateLarvitarManager = exports.updateLarvitarManager = exports.parseContours = exports.HSVToRGB = exports.fillPixelData = exports.addColorMap = exports.applyColorMap = exports.getColormapsList = exports.resliceSeries = exports.rotateImageRight = exports.rotateImageLeft = exports.flipImageVertical = exports.flipImageHorizontal = exports.invertImage = exports.storeViewportData = exports.toggleMouseToolsListeners = exports.updateViewportData = exports.resetViewports = exports.redrawImage = exports.updateImage = exports.renderImage = exports.resizeViewport = exports.unloadViewport = exports.disableViewport = exports.renderWebImage = exports.renderDICOMPDF = exports.renderFileImage = exports.loadAndCacheImages = exports.clearImageCache = exports.clearImageParsing = exports.parseDataSet = exports.readFiles = exports.readFile = exports.updateLoadedStack = exports.registerDsaImageLoader = exports.registerMultiFrameImageLoader = exports.registerResliceLoader = void 0;
165923
+ exports.saveAnnotations = exports.registerExternalTool = exports.setDefaultToolsProps = exports.getDefaultToolsByType = exports.dvTools = exports.DEFAULT_TOOLS = exports.exportAnnotations = exports.setToolPassive = exports.setToolEnabled = exports.setToolDisabled = exports.setToolActive = exports.addTool = exports.addDefaultTools = exports.setToolsStyle = exports.initializeCSTools = exports.csToolsUpdateImageIndex = exports.csToolsUpdateImageIds = exports.csToolsCreateStack = exports.setSegmentationConfig = exports.updateStackToolState = exports.syncToolStack = exports.clearCornerstoneElements = exports.addToolStateSingleSlice = exports.updateDiameterTool = exports.clearToolStateByName = exports.getToolState = exports.clearMeasurements = exports.addSeedsTool = exports.addStackStateToElement = exports.getCurrentMaskData = exports.addMaskEditingTool = exports.addContoursTool = exports.addDiameterTool = exports.applyDSAShift = exports.getFileImageId = exports.populateFileManager = exports.resetFileManager = exports.resetFileLoader = exports.getFileManager = exports.populateDsaImageIds = exports.clearMultiFrameCache = exports.getMultiFrameImageId = exports.buildMultiFrameImage = exports.loadMultiFrameImage = exports.unloadAndRecacheImageStackDSA = exports.loadAndCacheImageStack = exports.cacheImages = exports.cacheImage = exports.getDicomImageId = exports.loadReslicedImage = void 0;
165924
+ exports.getActiveLabelmapBuffer = exports.toggleVisibility = exports.toggleContourMode = exports.disableBrushTool = exports.enableBrushTool = exports.deleteMask = exports.clearSegmentationState = exports.rgbToHex = exports.hexToRgb = exports.setBrushProps = exports.redoLastStroke = exports.undoLastStroke = exports.setActiveSegment = exports.setActiveLabelmap = exports.addSegmentationMask = exports.initSegmentationModule = exports.removeMouseKeyHandlers = exports.addMouseKeyHandlers = exports.loadAnnotations = void 0;
165047
165925
  const package_json_1 = __importDefault(__webpack_require__(4147));
165048
165926
  const VERSION = package_json_1.default.version;
165049
165927
  exports.VERSION = VERSION;
@@ -165119,6 +165997,7 @@ Object.defineProperty(exports, "initializeFileImageLoader", ({ enumerable: true,
165119
165997
  Object.defineProperty(exports, "registerNRRDImageLoader", ({ enumerable: true, get: function () { return imageLoading_1.registerNRRDImageLoader; } }));
165120
165998
  Object.defineProperty(exports, "registerResliceLoader", ({ enumerable: true, get: function () { return imageLoading_1.registerResliceLoader; } }));
165121
165999
  Object.defineProperty(exports, "registerMultiFrameImageLoader", ({ enumerable: true, get: function () { return imageLoading_1.registerMultiFrameImageLoader; } }));
166000
+ Object.defineProperty(exports, "registerDsaImageLoader", ({ enumerable: true, get: function () { return imageLoading_1.registerDsaImageLoader; } }));
165122
166001
  Object.defineProperty(exports, "updateLoadedStack", ({ enumerable: true, get: function () { return imageLoading_1.updateLoadedStack; } }));
165123
166002
  const imageParsing_1 = __webpack_require__(1539);
165124
166003
  Object.defineProperty(exports, "readFile", ({ enumerable: true, get: function () { return imageParsing_1.readFile; } }));
@@ -165136,6 +166015,7 @@ Object.defineProperty(exports, "unloadViewport", ({ enumerable: true, get: funct
165136
166015
  Object.defineProperty(exports, "resizeViewport", ({ enumerable: true, get: function () { return imageRendering_1.resizeViewport; } }));
165137
166016
  Object.defineProperty(exports, "renderImage", ({ enumerable: true, get: function () { return imageRendering_1.renderImage; } }));
165138
166017
  Object.defineProperty(exports, "updateImage", ({ enumerable: true, get: function () { return imageRendering_1.updateImage; } }));
166018
+ Object.defineProperty(exports, "redrawImage", ({ enumerable: true, get: function () { return imageRendering_1.redrawImage; } }));
165139
166019
  Object.defineProperty(exports, "resetViewports", ({ enumerable: true, get: function () { return imageRendering_1.resetViewports; } }));
165140
166020
  Object.defineProperty(exports, "updateViewportData", ({ enumerable: true, get: function () { return imageRendering_1.updateViewportData; } }));
165141
166021
  Object.defineProperty(exports, "storeViewportData", ({ enumerable: true, get: function () { return imageRendering_1.storeViewportData; } }));
@@ -165219,6 +166099,8 @@ const dicomLoader_1 = __webpack_require__(6790);
165219
166099
  Object.defineProperty(exports, "getDicomImageId", ({ enumerable: true, get: function () { return dicomLoader_1.getDicomImageId; } }));
165220
166100
  Object.defineProperty(exports, "cacheImage", ({ enumerable: true, get: function () { return dicomLoader_1.cacheImage; } }));
165221
166101
  Object.defineProperty(exports, "cacheImages", ({ enumerable: true, get: function () { return dicomLoader_1.cacheImages; } }));
166102
+ Object.defineProperty(exports, "loadAndCacheImageStack", ({ enumerable: true, get: function () { return dicomLoader_1.loadAndCacheImageStack; } }));
166103
+ Object.defineProperty(exports, "unloadAndRecacheImageStackDSA", ({ enumerable: true, get: function () { return dicomLoader_1.unloadAndRecacheImageStackDSA; } }));
165222
166104
  const resliceLoader_1 = __webpack_require__(5779);
165223
166105
  Object.defineProperty(exports, "loadReslicedImage", ({ enumerable: true, get: function () { return resliceLoader_1.loadReslicedImage; } }));
165224
166106
  const multiframeLoader_1 = __webpack_require__(934);
@@ -165226,6 +166108,8 @@ Object.defineProperty(exports, "loadMultiFrameImage", ({ enumerable: true, get:
165226
166108
  Object.defineProperty(exports, "buildMultiFrameImage", ({ enumerable: true, get: function () { return multiframeLoader_1.buildMultiFrameImage; } }));
165227
166109
  Object.defineProperty(exports, "getMultiFrameImageId", ({ enumerable: true, get: function () { return multiframeLoader_1.getMultiFrameImageId; } }));
165228
166110
  Object.defineProperty(exports, "clearMultiFrameCache", ({ enumerable: true, get: function () { return multiframeLoader_1.clearMultiFrameCache; } }));
166111
+ const dsaImageLoader_1 = __webpack_require__(6475);
166112
+ Object.defineProperty(exports, "populateDsaImageIds", ({ enumerable: true, get: function () { return dsaImageLoader_1.populateDsaImageIds; } }));
165229
166113
  const fileLoader_1 = __webpack_require__(9995);
165230
166114
  Object.defineProperty(exports, "getFileManager", ({ enumerable: true, get: function () { return fileLoader_1.getFileManager; } }));
165231
166115
  Object.defineProperty(exports, "resetFileLoader", ({ enumerable: true, get: function () { return fileLoader_1.resetFileLoader; } }));
@@ -165238,6 +166122,8 @@ Object.defineProperty(exports, "applyColorMap", ({ enumerable: true, get: functi
165238
166122
  Object.defineProperty(exports, "addColorMap", ({ enumerable: true, get: function () { return imageColormaps_1.addColorMap; } }));
165239
166123
  Object.defineProperty(exports, "fillPixelData", ({ enumerable: true, get: function () { return imageColormaps_1.fillPixelData; } }));
165240
166124
  Object.defineProperty(exports, "HSVToRGB", ({ enumerable: true, get: function () { return imageColormaps_1.HSVToRGB; } }));
166125
+ const applyDSA_1 = __webpack_require__(1446);
166126
+ Object.defineProperty(exports, "applyDSAShift", ({ enumerable: true, get: function () { return applyDSA_1.applyDSAShift; } }));
165241
166127
  const io_1 = __webpack_require__(5604);
165242
166128
  Object.defineProperty(exports, "saveAnnotations", ({ enumerable: true, get: function () { return io_1.saveAnnotations; } }));
165243
166129
  Object.defineProperty(exports, "loadAnnotations", ({ enumerable: true, get: function () { return io_1.loadAnnotations; } }));
@@ -165963,7 +166849,7 @@ module.exports = JSON.parse('{"x00000000":{"tag":"x00000000","vr":"UL","vm":"1",
165963
166849
  /***/ ((module) => {
165964
166850
 
165965
166851
  "use strict";
165966
- module.exports = JSON.parse('{"name":"larvitar","keywords":["DICOM","imaging","medical","cornerstone"],"version":"2.1.4","description":"typescript library for parsing, loading, rendering and interacting with DICOM images","repository":{"url":"https://github.com/dvisionlab/Larvitar.git","type":"git"},"main":"dist/larvitar.js","types":"dist/index.d.ts","files":["dist","imaging/**/*.d.ts"],"scripts":{"coverage":"typescript-coverage-report","generate-docs":"node_modules/.bin/jsdoc -c jsdoc.json","build":"webpack --config ./bundler/webpack.prod.js && cp ./dist/larvitar.js ./docs/examples/larvitar.js","dev":"webpack --progress --config ./bundler/webpack.dev.js && cp ./dist/larvitar.js ./docs/examples/larvitar.js","dev-wip":"webpack serve --config ./bundler/webpack.dev-wip.js"},"author":"Simone Manini <simone.manini@dvisionlab.com> (https://www.dvisionlab.com)","contributors":["Mattia Ronzoni <mattia.ronzoni@dvisionlab.com> (https://www.dvisionlab.com)","Sara Zanchi <sara.zanchi@dvisionlab.com> (https://www.dvisionlab.com)","Ale Re <ale.re@dvisionlab.com> (https://www.dvisionlab.com)","Laura Borghesi Re <laura.borghesi@dvisionlab.com> (https://www.dvisionlab.com)"],"license":"MIT","dependencies":{"@rollup/plugin-commonjs":"^17.1.0","cornerstone-core":"^2.6.1","cornerstone-file-image-loader":"^0.3.0","cornerstone-tools":"^6.0.7","cornerstone-wado-image-loader":"^4.13.2","cornerstone-web-image-loader":"^2.1.1","crypto-js":"^4.1.1","dicom-character-set":"^1.0.3","dicom-parser":"^1.8.13","docdash":"^1.2.0","hammerjs":"^2.0.8","jpeg-lossless-decoder-js":"^2.0.7","keycode-js":"^3.1.0","lodash":"^4.17.15","pako":"^1.0.10","papaparse":"^5.3.0","pdfjs-dist":"^3.8.162","plotly.js-dist-min":"^2.27.1","uuid":"^8.3.2"},"devDependencies":{"@babel/core":"^7.21.8","@types/cornerstone-core":"^2.3.0","@types/crypto-js":"^4.1.1","@types/hammerjs":"^2.0.41","@types/lodash":"^4.14.192","@types/papaparse":"^5.3.7","@types/pdfjs-dist":"^2.10.378","@types/plotly.js":"^2.12.30","@types/plotly.js-dist-min":"^2.3.4","@types/uuid":"^9.0.1","babel-loader":"^9.1.2","clean-webpack-plugin":"^4.0.0","copy-webpack-plugin":"^11.0.0","fs":"^0.0.1-security","html-loader":"^4.2.0","html-webpack-plugin":"^5.5.0","ip":"^1.1.8","jsdoc":"^3.6.4","portfinder-sync":"^0.0.2","ts-loader":"^9.4.2","typescript":"^5.0.2","typescript-coverage-report":"^0.7.0","webpack":"^5.76.3","webpack-bundle-analyzer":"^4.8.0","webpack-cli":"^5.0.1","webpack-dev-server":"^4.13.1"}}');
166852
+ module.exports = JSON.parse('{"name":"larvitar","keywords":["DICOM","imaging","medical","cornerstone"],"version":"2.1.6","description":"typescript library for parsing, loading, rendering and interacting with DICOM images","repository":{"url":"https://github.com/dvisionlab/Larvitar.git","type":"git"},"main":"dist/larvitar.js","types":"dist/index.d.ts","files":["dist","imaging/**/*.d.ts"],"scripts":{"coverage":"typescript-coverage-report","generate-docs":"node_modules/.bin/jsdoc -c jsdoc.json","build":"webpack --config ./bundler/webpack.prod.js && cp ./dist/larvitar.js ./docs/examples/larvitar.js","dev":"webpack --progress --config ./bundler/webpack.dev.js && cp ./dist/larvitar.js ./docs/examples/larvitar.js","dev-wip":"webpack serve --config ./bundler/webpack.dev-wip.js"},"author":"Simone Manini <simone.manini@dvisionlab.com> (https://www.dvisionlab.com)","contributors":["Mattia Ronzoni <mattia.ronzoni@dvisionlab.com> (https://www.dvisionlab.com)","Sara Zanchi <sara.zanchi@dvisionlab.com> (https://www.dvisionlab.com)","Ale Re <ale.re@dvisionlab.com> (https://www.dvisionlab.com)","Laura Borghesi Re <laura.borghesi@dvisionlab.com> (https://www.dvisionlab.com)"],"license":"MIT","dependencies":{"@rollup/plugin-commonjs":"^17.1.0","cornerstone-core":"^2.6.1","cornerstone-file-image-loader":"^0.3.0","cornerstone-tools":"^6.0.7","cornerstone-wado-image-loader":"^4.13.2","cornerstone-web-image-loader":"^2.1.1","crypto-js":"^4.1.1","dicom-character-set":"^1.0.3","dicom-parser":"^1.8.13","docdash":"^1.2.0","hammerjs":"^2.0.8","jpeg-lossless-decoder-js":"^2.0.7","keycode-js":"^3.1.0","lodash":"^4.17.15","pako":"^1.0.10","papaparse":"^5.3.0","pdfjs-dist":"^3.8.162","plotly.js-dist-min":"^2.27.1","uuid":"^8.3.2"},"devDependencies":{"@babel/core":"^7.21.8","@types/cornerstone-core":"^2.3.0","@types/crypto-js":"^4.1.1","@types/hammerjs":"^2.0.41","@types/lodash":"^4.14.192","@types/papaparse":"^5.3.7","@types/pdfjs-dist":"^2.10.378","@types/plotly.js":"^2.12.30","@types/plotly.js-dist-min":"^2.3.4","@types/uuid":"^9.0.1","babel-loader":"^9.1.2","clean-webpack-plugin":"^4.0.0","copy-webpack-plugin":"^11.0.0","fs":"^0.0.1-security","html-loader":"^4.2.0","html-webpack-plugin":"^5.5.0","ip":"^1.1.8","jsdoc":"^3.6.4","portfinder-sync":"^0.0.2","ts-loader":"^9.4.2","typescript":"^5.0.2","typescript-coverage-report":"^0.7.0","webpack":"^5.76.3","webpack-bundle-analyzer":"^4.8.0","webpack-cli":"^5.0.1","webpack-dev-server":"^4.13.1"}}');
165967
166853
 
165968
166854
  /***/ })
165969
166855