@ohif/app 3.7.0-beta.8 → 3.7.0-beta.80

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.
Files changed (66) hide show
  1. package/dist/{917.bundle.d238efac58b7fe8fd1a3.js → 12.bundle.4a052141b46dec16862d.js} +6 -6
  2. package/dist/{295.bundle.957b1159fec14b9199a1.js → 125.bundle.253395f320b72180da63.js} +6 -6
  3. package/dist/{208.bundle.37c2a73b3387e657568c.js → 128.bundle.5198a2266456afecd420.js} +41 -59
  4. package/dist/{351.bundle.0742237651aef9694a65.js → 181.bundle.fa57199595cf28f44c7b.js} +226 -204
  5. package/dist/{351.css → 181.css} +1 -1
  6. package/dist/{744.bundle.23011553706b687f67e4.js → 19.bundle.75ec1ec14786e136b7b3.js} +240 -375
  7. package/dist/{606.bundle.5d876f5f3dd8287f0a28.js → 202.bundle.96bbb4547a346fe3921f.js} +1420 -750
  8. package/dist/{926.bundle.dbc9d0e591cb9217fda2.js → 220.bundle.f7e1c96c94245e70f2be.js} +990 -400
  9. package/dist/221.bundle.8a81cea315fa7697c0e0.js +1722 -0
  10. package/dist/221.css +2 -0
  11. package/dist/{664.bundle.09abae984223969d1bde.js → 23.bundle.e008ad788170f2ed5569.js} +5 -6
  12. package/dist/{976.bundle.dcbddf56a7d8f388bb8a.js → 236.bundle.d2da6d1991e1229bf913.js} +87 -103
  13. package/dist/{55.bundle.550a823e75eb608e8d5e.js → 250.bundle.36909d7bc681d66087d1.js} +52 -36
  14. package/dist/{973.bundle.03b016e6095622adf12f.js → 281.bundle.21a9e3178ddebe01b958.js} +18 -14
  15. package/dist/{82.bundle.10c2133333748ec6fba0.js → 342.bundle.70da5239bd664aa5d41a.js} +1768 -475
  16. package/dist/{192.bundle.2dc14a6e3c4c6be913b0.js → 348.bundle.8c5b950d30e5aa992290.js} +86 -73
  17. package/dist/{404.bundle.5d57295bc05206092d42.js → 359.bundle.d2a3abe1a5cd3ca3cd8e.js} +46 -131
  18. package/dist/{790.bundle.cedf27deeed29266a92b.js → 410.bundle.be538faa9c7fad92189b.js} +11 -9
  19. package/dist/{151.bundle.31ea35044218837bf73f.js → 417.bundle.af0a207c29b109f84159.js} +49 -17
  20. package/dist/{569.bundle.c8e771a8d28e237b32be.js → 451.bundle.dc0d14c3724464cca2bf.js} +86 -106
  21. package/dist/{581.bundle.dc6197189f7c88c27d4c.js → 471.bundle.2206d4c0ac2ad0df2362.js} +78 -99
  22. package/dist/{199.bundle.e4ac6606dd62e42e9da4.js → 506.bundle.97e53732423192fee818.js} +11 -9
  23. package/dist/{531.bundle.2a82fb1d69e5b57cc72b.js → 530.bundle.a03b6f942ace3e1baa1e.js} +726 -447
  24. package/dist/579.css +1 -0
  25. package/dist/{935.bundle.deeffff0e4f7b528e3c3.js → 604.bundle.a51f83e64004bca5f497.js} +2 -3
  26. package/dist/613.bundle.549d71231abfed24a2dc.js +532 -0
  27. package/dist/{984.bundle.e7dcbd3b8992748823fb.js → 663.bundle.b0f98b6e7221b1b9cf6a.js} +68 -38
  28. package/dist/{205.bundle.b5a473c200dcf2bbcdb4.js → 686.bundle.dccef1f36e4bc79bcc48.js} +6 -6
  29. package/dist/{50.bundle.424f8d05f1bebaafcf2c.js → 687.bundle.ab0ffdccae4610b00224.js} +218 -9
  30. package/dist/{331.bundle.bd0c13931a21d53086c9.js → 754.bundle.e3ce6855d8d4d187f224.js} +12423 -7549
  31. package/dist/{728.bundle.d13856835357400fef82.js → 774.bundle.d365320749c4f67cda70.js} +93 -64
  32. package/dist/{381.bundle.0905e683605fcbc0895f.js → 775.bundle.2285e7e0e67878948c0d.js} +16 -16
  33. package/dist/{270.bundle.4564621556b0f963a004.js → 777.bundle.ae3fdb8a470caecc0c6a.js} +1330 -929
  34. package/dist/{283.bundle.085cddb2f16e430677b0.js → 782.bundle.ee8dba2e8582b55cb38d.js} +117 -67
  35. package/dist/{642.bundle.25e56df5f0bcd2c729b4.js → 814.bundle.eec4458e893e6055f0fc.js} +6 -6
  36. package/dist/{799.bundle.758558e64147e5aad612.js → 822.bundle.5fca45a4f40f5259aec5.js} +81 -34
  37. package/dist/831.bundle.83658f62fcc769043605.js +16700 -0
  38. package/dist/{953.bundle.3b0189ebc11cf0946f18.js → 886.bundle.a9de117c3a42b7907cf6.js} +34 -29
  39. package/dist/945.min.worker.js +1 -1
  40. package/dist/945.min.worker.js.map +1 -1
  41. package/dist/{707.bundle.17a9d7352409b6269596.js → 967.bundle.cce1d004b2ff178b1a8e.js} +895 -572
  42. package/dist/_redirects +1 -1
  43. package/dist/app-config.js +35 -17
  44. package/dist/{app.bundle.837996a8f7dd2aaac338.js → app.bundle.681f66ab37cef811e68b.js} +73339 -68140
  45. package/dist/app.bundle.css +13 -12
  46. package/dist/assets/yandex-browser-manifest.json +1 -1
  47. package/dist/cornerstoneDICOMImageLoader.min.js +1 -1
  48. package/dist/cornerstoneDICOMImageLoader.min.js.map +1 -1
  49. package/dist/{dicom-microscopy-viewer.bundle.aa60bdf008c32c39cfd7.js → dicom-microscopy-viewer.bundle.2c146384eb9466d02ff8.js} +5 -4
  50. package/dist/es6-shim.min.js +3569 -2
  51. package/dist/google.js +8 -7
  52. package/dist/index.html +1 -1
  53. package/dist/{index.worker.1c69152d710fa7b84bce.worker.js → index.worker.e62ecca63f1a2e124230.worker.js} +2 -2
  54. package/dist/index.worker.e62ecca63f1a2e124230.worker.js.map +1 -0
  55. package/dist/init-service-worker.js +3 -5
  56. package/dist/oidc-client.min.js +10857 -39
  57. package/dist/polyfill.min.js +184 -1
  58. package/dist/silent-refresh.html +18 -9
  59. package/dist/sw.js +1 -1
  60. package/package.json +20 -21
  61. package/dist/616.bundle.eb4887184da6c57bf7a3.js +0 -685
  62. package/dist/780.bundle.fd0f13dc92e9caa0581e.js +0 -4769
  63. package/dist/index.worker.1c69152d710fa7b84bce.worker.js.map +0 -1
  64. /package/dist/{806.css → 19.css} +0 -0
  65. /package/dist/{55.css → 250.css} +0 -0
  66. /package/dist/{707.css → 967.css} +0 -0
@@ -1,19 +1,23 @@
1
- (globalThis["webpackChunk"] = globalThis["webpackChunk"] || []).push([[606],{
1
+ (self["webpackChunk"] = self["webpackChunk"] || []).push([[202],{
2
2
 
3
- /***/ 4606:
3
+ /***/ 91202:
4
4
  /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {
5
5
 
6
6
  "use strict";
7
7
  /* harmony export */ __webpack_require__.d(__webpack_exports__, {
8
- /* harmony export */ adaptersSR: () => (/* binding */ adapters)
8
+ /* harmony export */ Y: () => (/* binding */ index),
9
+ /* harmony export */ adaptersSEG: () => (/* binding */ adaptersSEG),
10
+ /* harmony export */ adaptersSR: () => (/* binding */ adaptersSR),
11
+ /* harmony export */ helpers: () => (/* binding */ index$1)
9
12
  /* harmony export */ });
10
- /* unused harmony export default */
11
- /* harmony import */ var dcmjs__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(22737);
12
- /* harmony import */ var ndarray__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(73373);
13
- /* harmony import */ var ndarray__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(ndarray__WEBPACK_IMPORTED_MODULE_1__);
14
- /* harmony import */ var lodash_clonedeep__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(71975);
15
- /* harmony import */ var lodash_clonedeep__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(lodash_clonedeep__WEBPACK_IMPORTED_MODULE_2__);
16
- /* harmony import */ var gl_matrix__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(88256);
13
+ /* harmony import */ var dcmjs__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(67540);
14
+ /* harmony import */ var buffer__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(58955);
15
+ /* harmony import */ var ndarray__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(87513);
16
+ /* harmony import */ var ndarray__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(ndarray__WEBPACK_IMPORTED_MODULE_2__);
17
+ /* harmony import */ var lodash_clonedeep__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(11677);
18
+ /* harmony import */ var lodash_clonedeep__WEBPACK_IMPORTED_MODULE_3___default = /*#__PURE__*/__webpack_require__.n(lodash_clonedeep__WEBPACK_IMPORTED_MODULE_3__);
19
+ /* harmony import */ var gl_matrix__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(45451);
20
+
17
21
 
18
22
 
19
23
 
@@ -67,6 +71,337 @@ function _objectSpread2(target) {
67
71
  }
68
72
  return target;
69
73
  }
74
+ function _regeneratorRuntime() {
75
+ _regeneratorRuntime = function () {
76
+ return exports;
77
+ };
78
+ var exports = {},
79
+ Op = Object.prototype,
80
+ hasOwn = Op.hasOwnProperty,
81
+ defineProperty = Object.defineProperty || function (obj, key, desc) {
82
+ obj[key] = desc.value;
83
+ },
84
+ $Symbol = "function" == typeof Symbol ? Symbol : {},
85
+ iteratorSymbol = $Symbol.iterator || "@@iterator",
86
+ asyncIteratorSymbol = $Symbol.asyncIterator || "@@asyncIterator",
87
+ toStringTagSymbol = $Symbol.toStringTag || "@@toStringTag";
88
+ function define(obj, key, value) {
89
+ return Object.defineProperty(obj, key, {
90
+ value: value,
91
+ enumerable: !0,
92
+ configurable: !0,
93
+ writable: !0
94
+ }), obj[key];
95
+ }
96
+ try {
97
+ define({}, "");
98
+ } catch (err) {
99
+ define = function (obj, key, value) {
100
+ return obj[key] = value;
101
+ };
102
+ }
103
+ function wrap(innerFn, outerFn, self, tryLocsList) {
104
+ var protoGenerator = outerFn && outerFn.prototype instanceof Generator ? outerFn : Generator,
105
+ generator = Object.create(protoGenerator.prototype),
106
+ context = new Context(tryLocsList || []);
107
+ return defineProperty(generator, "_invoke", {
108
+ value: makeInvokeMethod(innerFn, self, context)
109
+ }), generator;
110
+ }
111
+ function tryCatch(fn, obj, arg) {
112
+ try {
113
+ return {
114
+ type: "normal",
115
+ arg: fn.call(obj, arg)
116
+ };
117
+ } catch (err) {
118
+ return {
119
+ type: "throw",
120
+ arg: err
121
+ };
122
+ }
123
+ }
124
+ exports.wrap = wrap;
125
+ var ContinueSentinel = {};
126
+ function Generator() {}
127
+ function GeneratorFunction() {}
128
+ function GeneratorFunctionPrototype() {}
129
+ var IteratorPrototype = {};
130
+ define(IteratorPrototype, iteratorSymbol, function () {
131
+ return this;
132
+ });
133
+ var getProto = Object.getPrototypeOf,
134
+ NativeIteratorPrototype = getProto && getProto(getProto(values([])));
135
+ NativeIteratorPrototype && NativeIteratorPrototype !== Op && hasOwn.call(NativeIteratorPrototype, iteratorSymbol) && (IteratorPrototype = NativeIteratorPrototype);
136
+ var Gp = GeneratorFunctionPrototype.prototype = Generator.prototype = Object.create(IteratorPrototype);
137
+ function defineIteratorMethods(prototype) {
138
+ ["next", "throw", "return"].forEach(function (method) {
139
+ define(prototype, method, function (arg) {
140
+ return this._invoke(method, arg);
141
+ });
142
+ });
143
+ }
144
+ function AsyncIterator(generator, PromiseImpl) {
145
+ function invoke(method, arg, resolve, reject) {
146
+ var record = tryCatch(generator[method], generator, arg);
147
+ if ("throw" !== record.type) {
148
+ var result = record.arg,
149
+ value = result.value;
150
+ return value && "object" == typeof value && hasOwn.call(value, "__await") ? PromiseImpl.resolve(value.__await).then(function (value) {
151
+ invoke("next", value, resolve, reject);
152
+ }, function (err) {
153
+ invoke("throw", err, resolve, reject);
154
+ }) : PromiseImpl.resolve(value).then(function (unwrapped) {
155
+ result.value = unwrapped, resolve(result);
156
+ }, function (error) {
157
+ return invoke("throw", error, resolve, reject);
158
+ });
159
+ }
160
+ reject(record.arg);
161
+ }
162
+ var previousPromise;
163
+ defineProperty(this, "_invoke", {
164
+ value: function (method, arg) {
165
+ function callInvokeWithMethodAndArg() {
166
+ return new PromiseImpl(function (resolve, reject) {
167
+ invoke(method, arg, resolve, reject);
168
+ });
169
+ }
170
+ return previousPromise = previousPromise ? previousPromise.then(callInvokeWithMethodAndArg, callInvokeWithMethodAndArg) : callInvokeWithMethodAndArg();
171
+ }
172
+ });
173
+ }
174
+ function makeInvokeMethod(innerFn, self, context) {
175
+ var state = "suspendedStart";
176
+ return function (method, arg) {
177
+ if ("executing" === state) throw new Error("Generator is already running");
178
+ if ("completed" === state) {
179
+ if ("throw" === method) throw arg;
180
+ return doneResult();
181
+ }
182
+ for (context.method = method, context.arg = arg;;) {
183
+ var delegate = context.delegate;
184
+ if (delegate) {
185
+ var delegateResult = maybeInvokeDelegate(delegate, context);
186
+ if (delegateResult) {
187
+ if (delegateResult === ContinueSentinel) continue;
188
+ return delegateResult;
189
+ }
190
+ }
191
+ if ("next" === context.method) context.sent = context._sent = context.arg;else if ("throw" === context.method) {
192
+ if ("suspendedStart" === state) throw state = "completed", context.arg;
193
+ context.dispatchException(context.arg);
194
+ } else "return" === context.method && context.abrupt("return", context.arg);
195
+ state = "executing";
196
+ var record = tryCatch(innerFn, self, context);
197
+ if ("normal" === record.type) {
198
+ if (state = context.done ? "completed" : "suspendedYield", record.arg === ContinueSentinel) continue;
199
+ return {
200
+ value: record.arg,
201
+ done: context.done
202
+ };
203
+ }
204
+ "throw" === record.type && (state = "completed", context.method = "throw", context.arg = record.arg);
205
+ }
206
+ };
207
+ }
208
+ function maybeInvokeDelegate(delegate, context) {
209
+ var methodName = context.method,
210
+ method = delegate.iterator[methodName];
211
+ if (undefined === method) return context.delegate = null, "throw" === methodName && delegate.iterator.return && (context.method = "return", context.arg = undefined, maybeInvokeDelegate(delegate, context), "throw" === context.method) || "return" !== methodName && (context.method = "throw", context.arg = new TypeError("The iterator does not provide a '" + methodName + "' method")), ContinueSentinel;
212
+ var record = tryCatch(method, delegate.iterator, context.arg);
213
+ if ("throw" === record.type) return context.method = "throw", context.arg = record.arg, context.delegate = null, ContinueSentinel;
214
+ var info = record.arg;
215
+ return info ? info.done ? (context[delegate.resultName] = info.value, context.next = delegate.nextLoc, "return" !== context.method && (context.method = "next", context.arg = undefined), context.delegate = null, ContinueSentinel) : info : (context.method = "throw", context.arg = new TypeError("iterator result is not an object"), context.delegate = null, ContinueSentinel);
216
+ }
217
+ function pushTryEntry(locs) {
218
+ var entry = {
219
+ tryLoc: locs[0]
220
+ };
221
+ 1 in locs && (entry.catchLoc = locs[1]), 2 in locs && (entry.finallyLoc = locs[2], entry.afterLoc = locs[3]), this.tryEntries.push(entry);
222
+ }
223
+ function resetTryEntry(entry) {
224
+ var record = entry.completion || {};
225
+ record.type = "normal", delete record.arg, entry.completion = record;
226
+ }
227
+ function Context(tryLocsList) {
228
+ this.tryEntries = [{
229
+ tryLoc: "root"
230
+ }], tryLocsList.forEach(pushTryEntry, this), this.reset(!0);
231
+ }
232
+ function values(iterable) {
233
+ if (iterable) {
234
+ var iteratorMethod = iterable[iteratorSymbol];
235
+ if (iteratorMethod) return iteratorMethod.call(iterable);
236
+ if ("function" == typeof iterable.next) return iterable;
237
+ if (!isNaN(iterable.length)) {
238
+ var i = -1,
239
+ next = function next() {
240
+ for (; ++i < iterable.length;) if (hasOwn.call(iterable, i)) return next.value = iterable[i], next.done = !1, next;
241
+ return next.value = undefined, next.done = !0, next;
242
+ };
243
+ return next.next = next;
244
+ }
245
+ }
246
+ return {
247
+ next: doneResult
248
+ };
249
+ }
250
+ function doneResult() {
251
+ return {
252
+ value: undefined,
253
+ done: !0
254
+ };
255
+ }
256
+ return GeneratorFunction.prototype = GeneratorFunctionPrototype, defineProperty(Gp, "constructor", {
257
+ value: GeneratorFunctionPrototype,
258
+ configurable: !0
259
+ }), defineProperty(GeneratorFunctionPrototype, "constructor", {
260
+ value: GeneratorFunction,
261
+ configurable: !0
262
+ }), GeneratorFunction.displayName = define(GeneratorFunctionPrototype, toStringTagSymbol, "GeneratorFunction"), exports.isGeneratorFunction = function (genFun) {
263
+ var ctor = "function" == typeof genFun && genFun.constructor;
264
+ return !!ctor && (ctor === GeneratorFunction || "GeneratorFunction" === (ctor.displayName || ctor.name));
265
+ }, exports.mark = function (genFun) {
266
+ return Object.setPrototypeOf ? Object.setPrototypeOf(genFun, GeneratorFunctionPrototype) : (genFun.__proto__ = GeneratorFunctionPrototype, define(genFun, toStringTagSymbol, "GeneratorFunction")), genFun.prototype = Object.create(Gp), genFun;
267
+ }, exports.awrap = function (arg) {
268
+ return {
269
+ __await: arg
270
+ };
271
+ }, defineIteratorMethods(AsyncIterator.prototype), define(AsyncIterator.prototype, asyncIteratorSymbol, function () {
272
+ return this;
273
+ }), exports.AsyncIterator = AsyncIterator, exports.async = function (innerFn, outerFn, self, tryLocsList, PromiseImpl) {
274
+ void 0 === PromiseImpl && (PromiseImpl = Promise);
275
+ var iter = new AsyncIterator(wrap(innerFn, outerFn, self, tryLocsList), PromiseImpl);
276
+ return exports.isGeneratorFunction(outerFn) ? iter : iter.next().then(function (result) {
277
+ return result.done ? result.value : iter.next();
278
+ });
279
+ }, defineIteratorMethods(Gp), define(Gp, toStringTagSymbol, "Generator"), define(Gp, iteratorSymbol, function () {
280
+ return this;
281
+ }), define(Gp, "toString", function () {
282
+ return "[object Generator]";
283
+ }), exports.keys = function (val) {
284
+ var object = Object(val),
285
+ keys = [];
286
+ for (var key in object) keys.push(key);
287
+ return keys.reverse(), function next() {
288
+ for (; keys.length;) {
289
+ var key = keys.pop();
290
+ if (key in object) return next.value = key, next.done = !1, next;
291
+ }
292
+ return next.done = !0, next;
293
+ };
294
+ }, exports.values = values, Context.prototype = {
295
+ constructor: Context,
296
+ reset: function (skipTempReset) {
297
+ if (this.prev = 0, this.next = 0, this.sent = this._sent = undefined, this.done = !1, this.delegate = null, this.method = "next", this.arg = undefined, this.tryEntries.forEach(resetTryEntry), !skipTempReset) for (var name in this) "t" === name.charAt(0) && hasOwn.call(this, name) && !isNaN(+name.slice(1)) && (this[name] = undefined);
298
+ },
299
+ stop: function () {
300
+ this.done = !0;
301
+ var rootRecord = this.tryEntries[0].completion;
302
+ if ("throw" === rootRecord.type) throw rootRecord.arg;
303
+ return this.rval;
304
+ },
305
+ dispatchException: function (exception) {
306
+ if (this.done) throw exception;
307
+ var context = this;
308
+ function handle(loc, caught) {
309
+ return record.type = "throw", record.arg = exception, context.next = loc, caught && (context.method = "next", context.arg = undefined), !!caught;
310
+ }
311
+ for (var i = this.tryEntries.length - 1; i >= 0; --i) {
312
+ var entry = this.tryEntries[i],
313
+ record = entry.completion;
314
+ if ("root" === entry.tryLoc) return handle("end");
315
+ if (entry.tryLoc <= this.prev) {
316
+ var hasCatch = hasOwn.call(entry, "catchLoc"),
317
+ hasFinally = hasOwn.call(entry, "finallyLoc");
318
+ if (hasCatch && hasFinally) {
319
+ if (this.prev < entry.catchLoc) return handle(entry.catchLoc, !0);
320
+ if (this.prev < entry.finallyLoc) return handle(entry.finallyLoc);
321
+ } else if (hasCatch) {
322
+ if (this.prev < entry.catchLoc) return handle(entry.catchLoc, !0);
323
+ } else {
324
+ if (!hasFinally) throw new Error("try statement without catch or finally");
325
+ if (this.prev < entry.finallyLoc) return handle(entry.finallyLoc);
326
+ }
327
+ }
328
+ }
329
+ },
330
+ abrupt: function (type, arg) {
331
+ for (var i = this.tryEntries.length - 1; i >= 0; --i) {
332
+ var entry = this.tryEntries[i];
333
+ if (entry.tryLoc <= this.prev && hasOwn.call(entry, "finallyLoc") && this.prev < entry.finallyLoc) {
334
+ var finallyEntry = entry;
335
+ break;
336
+ }
337
+ }
338
+ finallyEntry && ("break" === type || "continue" === type) && finallyEntry.tryLoc <= arg && arg <= finallyEntry.finallyLoc && (finallyEntry = null);
339
+ var record = finallyEntry ? finallyEntry.completion : {};
340
+ return record.type = type, record.arg = arg, finallyEntry ? (this.method = "next", this.next = finallyEntry.finallyLoc, ContinueSentinel) : this.complete(record);
341
+ },
342
+ complete: function (record, afterLoc) {
343
+ if ("throw" === record.type) throw record.arg;
344
+ return "break" === record.type || "continue" === record.type ? this.next = record.arg : "return" === record.type ? (this.rval = this.arg = record.arg, this.method = "return", this.next = "end") : "normal" === record.type && afterLoc && (this.next = afterLoc), ContinueSentinel;
345
+ },
346
+ finish: function (finallyLoc) {
347
+ for (var i = this.tryEntries.length - 1; i >= 0; --i) {
348
+ var entry = this.tryEntries[i];
349
+ if (entry.finallyLoc === finallyLoc) return this.complete(entry.completion, entry.afterLoc), resetTryEntry(entry), ContinueSentinel;
350
+ }
351
+ },
352
+ catch: function (tryLoc) {
353
+ for (var i = this.tryEntries.length - 1; i >= 0; --i) {
354
+ var entry = this.tryEntries[i];
355
+ if (entry.tryLoc === tryLoc) {
356
+ var record = entry.completion;
357
+ if ("throw" === record.type) {
358
+ var thrown = record.arg;
359
+ resetTryEntry(entry);
360
+ }
361
+ return thrown;
362
+ }
363
+ }
364
+ throw new Error("illegal catch attempt");
365
+ },
366
+ delegateYield: function (iterable, resultName, nextLoc) {
367
+ return this.delegate = {
368
+ iterator: values(iterable),
369
+ resultName: resultName,
370
+ nextLoc: nextLoc
371
+ }, "next" === this.method && (this.arg = undefined), ContinueSentinel;
372
+ }
373
+ }, exports;
374
+ }
375
+ function asyncGeneratorStep(gen, resolve, reject, _next, _throw, key, arg) {
376
+ try {
377
+ var info = gen[key](arg);
378
+ var value = info.value;
379
+ } catch (error) {
380
+ reject(error);
381
+ return;
382
+ }
383
+ if (info.done) {
384
+ resolve(value);
385
+ } else {
386
+ Promise.resolve(value).then(_next, _throw);
387
+ }
388
+ }
389
+ function _asyncToGenerator(fn) {
390
+ return function () {
391
+ var self = this,
392
+ args = arguments;
393
+ return new Promise(function (resolve, reject) {
394
+ var gen = fn.apply(self, args);
395
+ function _next(value) {
396
+ asyncGeneratorStep(gen, resolve, reject, _next, _throw, "next", value);
397
+ }
398
+ function _throw(err) {
399
+ asyncGeneratorStep(gen, resolve, reject, _next, _throw, "throw", err);
400
+ }
401
+ _next(undefined);
402
+ });
403
+ };
404
+ }
70
405
  function _classCallCheck(instance, Constructor) {
71
406
  if (!(instance instanceof Constructor)) {
72
407
  throw new TypeError("Cannot call a class as a function");
@@ -203,19 +538,68 @@ function _toPropertyKey(arg) {
203
538
  return typeof key === "symbol" ? key : String(key);
204
539
  }
205
540
 
206
- var toArray = function toArray(x) {
207
- return Array.isArray(x) ? x : [x];
541
+ var toArray = function (x) { return (Array.isArray(x) ? x : [x]); };
542
+
543
+ /**
544
+ * Returns a function that checks if a given content item's ConceptNameCodeSequence.CodeMeaning
545
+ * matches the provided codeMeaningName.
546
+ * @param codeMeaningName - The CodeMeaning to match against.
547
+ * @returns A function that takes a content item and returns a boolean indicating whether the
548
+ * content item's CodeMeaning matches the provided codeMeaningName.
549
+ */
550
+ var codeMeaningEquals = function (codeMeaningName) {
551
+ return function (contentItem) {
552
+ return (contentItem.ConceptNameCodeSequence.CodeMeaning === codeMeaningName);
553
+ };
208
554
  };
209
- var codeMeaningEquals = function codeMeaningEquals(codeMeaningName) {
210
- return function (contentItem) {
211
- return contentItem.ConceptNameCodeSequence.CodeMeaning === codeMeaningName;
212
- };
555
+
556
+ /**
557
+ * Checks if a given content item's GraphicType property matches a specified value.
558
+ * @param {string} graphicType - The value to compare the content item's GraphicType property to.
559
+ * @returns {function} A function that takes a content item and returns a boolean indicating whether its GraphicType property matches the specified value.
560
+ */
561
+ var graphicTypeEquals = function (graphicType) {
562
+ return function (contentItem) {
563
+ return contentItem && contentItem.GraphicType === graphicType;
564
+ };
213
565
  };
214
566
 
567
+ var datasetToDict = dcmjs__WEBPACK_IMPORTED_MODULE_0__/* .data */ .aT.datasetToDict;
568
+ /**
569
+ * Trigger file download from an array buffer
570
+ * @param bufferOrDataset - ArrayBuffer or DicomDataset
571
+ * @param filename - name of the file to download
572
+ */
573
+ function downloadDICOMData(bufferOrDataset, filename) {
574
+ var blob;
575
+ if (bufferOrDataset instanceof ArrayBuffer) {
576
+ blob = new Blob([bufferOrDataset], { type: "application/dicom" });
577
+ }
578
+ else {
579
+ if (!bufferOrDataset._meta) {
580
+ throw new Error("Dataset must have a _meta property");
581
+ }
582
+ var buffer = buffer__WEBPACK_IMPORTED_MODULE_1__/* .Buffer */ .lW.from(datasetToDict(bufferOrDataset).write());
583
+ blob = new Blob([buffer], { type: "application/dicom" });
584
+ }
585
+ var link = document.createElement("a");
586
+ link.href = window.URL.createObjectURL(blob);
587
+ link.download = filename;
588
+ link.click();
589
+ }
590
+
591
+ var index$1 = /*#__PURE__*/Object.freeze({
592
+ __proto__: null,
593
+ codeMeaningEquals: codeMeaningEquals,
594
+ downloadDICOMData: downloadDICOMData,
595
+ graphicTypeEquals: graphicTypeEquals,
596
+ toArray: toArray
597
+ });
598
+
215
599
  var TID1500$1 = dcmjs__WEBPACK_IMPORTED_MODULE_0__/* .utilities */ .hC.TID1500,
216
600
  addAccessors$1 = dcmjs__WEBPACK_IMPORTED_MODULE_0__/* .utilities */ .hC.addAccessors;
217
601
  var StructuredReport$1 = dcmjs__WEBPACK_IMPORTED_MODULE_0__/* .derivations */ .U7.StructuredReport;
218
- var Normalizer$3 = dcmjs__WEBPACK_IMPORTED_MODULE_0__/* .normalizers */ .oq.Normalizer;
602
+ var Normalizer$4 = dcmjs__WEBPACK_IMPORTED_MODULE_0__/* .normalizers */ .oq.Normalizer;
219
603
  var TID1500MeasurementReport$1 = TID1500$1.TID1500MeasurementReport,
220
604
  TID1501MeasurementGroup$1 = TID1500$1.TID1501MeasurementGroup;
221
605
  var DicomMetaDictionary$3 = dcmjs__WEBPACK_IMPORTED_MODULE_0__/* .data */ .aT.DicomMetaDictionary;
@@ -347,7 +731,7 @@ var MeasurementReport$1 = /*#__PURE__*/function () {
347
731
  ReferencedSOPClassUID: sopCommonModule.sopClassUID,
348
732
  ReferencedSOPInstanceUID: sopCommonModule.sopInstanceUID
349
733
  };
350
- if (Normalizer$3.isMultiframeSOPClassUID(sopCommonModule.sopClassUID)) {
734
+ if (Normalizer$4.isMultiframeSOPClassUID(sopCommonModule.sopClassUID)) {
351
735
  ReferencedSOPSequence.ReferencedFrameNumber = frameNumber;
352
736
  }
353
737
 
@@ -1181,80 +1565,353 @@ ArrowAnnotate$1.isValidCornerstoneTrackingIdentifier = function (TrackingIdentif
1181
1565
  };
1182
1566
  MeasurementReport$1.registerTool(ArrowAnnotate$1);
1183
1567
 
1184
- var _utilities$orientatio$1 = dcmjs__WEBPACK_IMPORTED_MODULE_0__/* .utilities */ .hC.orientation,
1185
- rotateDirectionCosinesInPlane$1 = _utilities$orientatio$1.rotateDirectionCosinesInPlane,
1186
- flipIOP$1 = _utilities$orientatio$1.flipImageOrientationPatient,
1187
- flipMatrix2D$1 = _utilities$orientatio$1.flipMatrix2D,
1188
- rotateMatrix902D$1 = _utilities$orientatio$1.rotateMatrix902D;
1189
- var datasetToBlob$1 = dcmjs__WEBPACK_IMPORTED_MODULE_0__/* .utilities */ .hC.datasetToBlob,
1190
- BitArray$2 = dcmjs__WEBPACK_IMPORTED_MODULE_0__/* .utilities */ .hC.BitArray,
1191
- DicomMessage$1 = dcmjs__WEBPACK_IMPORTED_MODULE_0__/* .utilities */ .hC.DicomMessage,
1192
- DicomMetaDictionary$2 = dcmjs__WEBPACK_IMPORTED_MODULE_0__/* .utilities */ .hC.DicomMetaDictionary;
1193
- var Normalizer$2 = dcmjs__WEBPACK_IMPORTED_MODULE_0__/* .normalizers */ .oq.Normalizer;
1194
- var SegmentationDerivation$1 = dcmjs__WEBPACK_IMPORTED_MODULE_0__/* .derivations */ .U7.Segmentation;
1195
- var Segmentation$3 = {
1196
- generateSegmentation: generateSegmentation$2,
1197
- generateToolState: generateToolState$2
1198
- };
1199
-
1200
- /**
1201
- *
1202
- * @typedef {Object} BrushData
1203
- * @property {Object} toolState - The cornerstoneTools global toolState.
1204
- * @property {Object[]} segments - The cornerstoneTools segment metadata that corresponds to the
1205
- * seriesInstanceUid.
1206
- */
1207
-
1208
- /**
1209
- * generateSegmentation - Generates cornerstoneTools brush data, given a stack of
1210
- * imageIds, images and the cornerstoneTools brushData.
1211
- *
1212
- * @param {object[]} images An array of the cornerstone image objects.
1213
- * @param {BrushData} brushData and object containing the brushData.
1214
- * @returns {type} description
1215
- */
1216
- function generateSegmentation$2(images, brushData) {
1217
- var options = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {
1218
- includeSliceSpacing: true
1219
- };
1220
- var toolState = brushData.toolState,
1221
- segments = brushData.segments;
1222
-
1223
- // Calculate the dimensions of the data cube.
1224
- var image0 = images[0];
1225
- var dims = {
1226
- x: image0.columns,
1227
- y: image0.rows,
1228
- z: images.length
1229
- };
1230
- dims.xy = dims.x * dims.y;
1231
- var numSegments = _getSegCount(seg, segments);
1232
- if (!numSegments) {
1233
- throw new Error("No segments to export!");
1568
+ var TID300CobbAngle$2 = dcmjs__WEBPACK_IMPORTED_MODULE_0__/* .utilities */ .hC.TID300.CobbAngle;
1569
+ var COBB_ANGLE = "CobbAngle";
1570
+ var CobbAngle$1 = /*#__PURE__*/function () {
1571
+ function CobbAngle() {
1572
+ _classCallCheck(this, CobbAngle);
1234
1573
  }
1235
- var isMultiframe = image0.imageId.includes("?frame");
1236
- var seg = _createSegFromImages$1(images, isMultiframe, options);
1237
- var _getNumberOfFramesPer = _getNumberOfFramesPerSegment(toolState, images, segments),
1238
- referencedFramesPerSegment = _getNumberOfFramesPer.referencedFramesPerSegment,
1239
- segmentIndicies = _getNumberOfFramesPer.segmentIndicies;
1240
- var NumberOfFrames = 0;
1241
- for (var i = 0; i < referencedFramesPerSegment.length; i++) {
1242
- NumberOfFrames += referencedFramesPerSegment[i].length;
1574
+ _createClass(CobbAngle, null, [{
1575
+ key: "getMeasurementData",
1576
+ value:
1577
+ // TODO: this function is required for all Cornerstone Tool Adapters, since it is called by MeasurementReport.
1578
+ function getMeasurementData(MeasurementGroup) {
1579
+ var _MeasurementReport$ge = MeasurementReport$1.getSetupMeasurementData(MeasurementGroup),
1580
+ defaultState = _MeasurementReport$ge.defaultState,
1581
+ NUMGroup = _MeasurementReport$ge.NUMGroup,
1582
+ SCOORDGroup = _MeasurementReport$ge.SCOORDGroup;
1583
+ var state = _objectSpread2(_objectSpread2({}, defaultState), {}, {
1584
+ rAngle: NUMGroup.MeasuredValueSequence.NumericValue,
1585
+ toolType: CobbAngle.toolType,
1586
+ handles: {
1587
+ start: {},
1588
+ end: {},
1589
+ start2: {
1590
+ highlight: true,
1591
+ drawnIndependently: true
1592
+ },
1593
+ end2: {
1594
+ highlight: true,
1595
+ drawnIndependently: true
1596
+ },
1597
+ textBox: {
1598
+ hasMoved: false,
1599
+ movesIndependently: false,
1600
+ drawnIndependently: true,
1601
+ allowedOutsideImage: true,
1602
+ hasBoundingBox: true
1603
+ }
1604
+ }
1605
+ });
1606
+ var _SCOORDGroup$GraphicD = _slicedToArray(SCOORDGroup.GraphicData, 8);
1607
+ state.handles.start.x = _SCOORDGroup$GraphicD[0];
1608
+ state.handles.start.y = _SCOORDGroup$GraphicD[1];
1609
+ state.handles.end.x = _SCOORDGroup$GraphicD[2];
1610
+ state.handles.end.y = _SCOORDGroup$GraphicD[3];
1611
+ state.handles.start2.x = _SCOORDGroup$GraphicD[4];
1612
+ state.handles.start2.y = _SCOORDGroup$GraphicD[5];
1613
+ state.handles.end2.x = _SCOORDGroup$GraphicD[6];
1614
+ state.handles.end2.y = _SCOORDGroup$GraphicD[7];
1615
+ return state;
1616
+ }
1617
+ }, {
1618
+ key: "getTID300RepresentationArguments",
1619
+ value: function getTID300RepresentationArguments(tool) {
1620
+ var handles = tool.handles,
1621
+ finding = tool.finding,
1622
+ findingSites = tool.findingSites;
1623
+ var point1 = handles.start;
1624
+ var point2 = handles.end;
1625
+ var point3 = handles.start2;
1626
+ var point4 = handles.end2;
1627
+ var rAngle = tool.rAngle;
1628
+ var trackingIdentifierTextValue = "cornerstoneTools@^4.0.0:CobbAngle";
1629
+ return {
1630
+ point1: point1,
1631
+ point2: point2,
1632
+ point3: point3,
1633
+ point4: point4,
1634
+ rAngle: rAngle,
1635
+ trackingIdentifierTextValue: trackingIdentifierTextValue,
1636
+ finding: finding,
1637
+ findingSites: findingSites || []
1638
+ };
1639
+ }
1640
+ }]);
1641
+ return CobbAngle;
1642
+ }();
1643
+ CobbAngle$1.toolType = COBB_ANGLE;
1644
+ CobbAngle$1.utilityToolType = COBB_ANGLE;
1645
+ CobbAngle$1.TID300Representation = TID300CobbAngle$2;
1646
+ CobbAngle$1.isValidCornerstoneTrackingIdentifier = function (TrackingIdentifier) {
1647
+ if (!TrackingIdentifier.includes(":")) {
1648
+ return false;
1243
1649
  }
1244
- seg.setNumberOfFrames(NumberOfFrames);
1245
- for (var _i = 0; _i < segmentIndicies.length; _i++) {
1246
- var segmentIndex = segmentIndicies[_i];
1247
- var referencedFrameIndicies = referencedFramesPerSegment[_i];
1248
-
1249
- // Frame numbers start from 1.
1250
- var referencedFrameNumbers = referencedFrameIndicies.map(function (element) {
1251
- return element + 1;
1252
- });
1253
- var segment = segments[segmentIndex];
1254
- seg.addSegment(segment, _extractCornerstoneToolsPixelData(segmentIndex, referencedFrameIndicies, toolState, images, dims), referencedFrameNumbers);
1650
+ var _TrackingIdentifier$s = TrackingIdentifier.split(":"),
1651
+ _TrackingIdentifier$s2 = _slicedToArray(_TrackingIdentifier$s, 2),
1652
+ cornerstone4Tag = _TrackingIdentifier$s2[0],
1653
+ toolType = _TrackingIdentifier$s2[1];
1654
+ if (cornerstone4Tag !== CORNERSTONE_4_TAG) {
1655
+ return false;
1656
+ }
1657
+ return toolType === COBB_ANGLE;
1658
+ };
1659
+ MeasurementReport$1.registerTool(CobbAngle$1);
1660
+
1661
+ var TID300Angle = dcmjs__WEBPACK_IMPORTED_MODULE_0__/* .utilities */ .hC.TID300.Angle;
1662
+ var ANGLE = "Angle";
1663
+ var Angle$1 = /*#__PURE__*/function () {
1664
+ function Angle() {
1665
+ _classCallCheck(this, Angle);
1666
+ }
1667
+ _createClass(Angle, null, [{
1668
+ key: "getMeasurementData",
1669
+ value:
1670
+ /**
1671
+ * Generate TID300 measurement data for a plane angle measurement - use a Angle, but label it as Angle
1672
+ */
1673
+ function getMeasurementData(MeasurementGroup) {
1674
+ var _MeasurementReport$ge = MeasurementReport$1.getSetupMeasurementData(MeasurementGroup),
1675
+ defaultState = _MeasurementReport$ge.defaultState,
1676
+ NUMGroup = _MeasurementReport$ge.NUMGroup,
1677
+ SCOORDGroup = _MeasurementReport$ge.SCOORDGroup;
1678
+ var state = _objectSpread2(_objectSpread2({}, defaultState), {}, {
1679
+ rAngle: NUMGroup.MeasuredValueSequence.NumericValue,
1680
+ toolType: Angle.toolType,
1681
+ handles: {
1682
+ start: {},
1683
+ middle: {},
1684
+ end: {},
1685
+ textBox: {
1686
+ hasMoved: false,
1687
+ movesIndependently: false,
1688
+ drawnIndependently: true,
1689
+ allowedOutsideImage: true,
1690
+ hasBoundingBox: true
1691
+ }
1692
+ }
1693
+ });
1694
+ var _SCOORDGroup$GraphicD = _slicedToArray(SCOORDGroup.GraphicData, 8);
1695
+ state.handles.start.x = _SCOORDGroup$GraphicD[0];
1696
+ state.handles.start.y = _SCOORDGroup$GraphicD[1];
1697
+ state.handles.middle.x = _SCOORDGroup$GraphicD[2];
1698
+ state.handles.middle.y = _SCOORDGroup$GraphicD[3];
1699
+ state.handles.middle.x = _SCOORDGroup$GraphicD[4];
1700
+ state.handles.middle.y = _SCOORDGroup$GraphicD[5];
1701
+ state.handles.end.x = _SCOORDGroup$GraphicD[6];
1702
+ state.handles.end.y = _SCOORDGroup$GraphicD[7];
1703
+ return state;
1704
+ }
1705
+ }, {
1706
+ key: "getTID300RepresentationArguments",
1707
+ value: function getTID300RepresentationArguments(tool) {
1708
+ var handles = tool.handles,
1709
+ finding = tool.finding,
1710
+ findingSites = tool.findingSites;
1711
+ var point1 = handles.start;
1712
+ var point2 = handles.middle;
1713
+ var point3 = handles.middle;
1714
+ var point4 = handles.end;
1715
+ var rAngle = tool.rAngle;
1716
+ var trackingIdentifierTextValue = "cornerstoneTools@^4.0.0:Angle";
1717
+ return {
1718
+ point1: point1,
1719
+ point2: point2,
1720
+ point3: point3,
1721
+ point4: point4,
1722
+ rAngle: rAngle,
1723
+ trackingIdentifierTextValue: trackingIdentifierTextValue,
1724
+ finding: finding,
1725
+ findingSites: findingSites || []
1726
+ };
1727
+ }
1728
+ }]);
1729
+ return Angle;
1730
+ }();
1731
+ Angle$1.toolType = ANGLE;
1732
+ Angle$1.utilityToolType = ANGLE;
1733
+ Angle$1.TID300Representation = TID300Angle;
1734
+ Angle$1.isValidCornerstoneTrackingIdentifier = function (TrackingIdentifier) {
1735
+ if (!TrackingIdentifier.includes(":")) {
1736
+ return false;
1737
+ }
1738
+ var _TrackingIdentifier$s = TrackingIdentifier.split(":"),
1739
+ _TrackingIdentifier$s2 = _slicedToArray(_TrackingIdentifier$s, 2),
1740
+ cornerstone4Tag = _TrackingIdentifier$s2[0],
1741
+ toolType = _TrackingIdentifier$s2[1];
1742
+ if (cornerstone4Tag !== CORNERSTONE_4_TAG) {
1743
+ return false;
1744
+ }
1745
+ return toolType === ANGLE;
1746
+ };
1747
+ MeasurementReport$1.registerTool(Angle$1);
1748
+
1749
+ var TID300Polyline$2 = dcmjs__WEBPACK_IMPORTED_MODULE_0__/* .utilities */ .hC.TID300.Polyline;
1750
+ var RectangleRoi = /*#__PURE__*/function () {
1751
+ function RectangleRoi() {
1752
+ _classCallCheck(this, RectangleRoi);
1753
+ }
1754
+ _createClass(RectangleRoi, null, [{
1755
+ key: "getMeasurementData",
1756
+ value: function getMeasurementData(MeasurementGroup) {
1757
+ var _MeasurementReport$ge = MeasurementReport$1.getSetupMeasurementData(MeasurementGroup),
1758
+ defaultState = _MeasurementReport$ge.defaultState,
1759
+ SCOORDGroup = _MeasurementReport$ge.SCOORDGroup,
1760
+ NUMGroup = _MeasurementReport$ge.NUMGroup;
1761
+ var state = _objectSpread2(_objectSpread2({}, defaultState), {}, {
1762
+ toolType: RectangleRoi.toolType,
1763
+ handles: {
1764
+ start: {},
1765
+ end: {},
1766
+ textBox: {
1767
+ active: false,
1768
+ hasMoved: false,
1769
+ movesIndependently: false,
1770
+ drawnIndependently: true,
1771
+ allowedOutsideImage: true,
1772
+ hasBoundingBox: true
1773
+ },
1774
+ initialRotation: 0
1775
+ },
1776
+ cachedStats: {
1777
+ area: NUMGroup ? NUMGroup.MeasuredValueSequence.NumericValue : 0
1778
+ },
1779
+ color: undefined,
1780
+ invalidated: true
1781
+ });
1782
+ var _SCOORDGroup$GraphicD = _slicedToArray(SCOORDGroup.GraphicData, 6);
1783
+ state.handles.start.x = _SCOORDGroup$GraphicD[0];
1784
+ state.handles.start.y = _SCOORDGroup$GraphicD[1];
1785
+ _SCOORDGroup$GraphicD[2];
1786
+ _SCOORDGroup$GraphicD[3];
1787
+ state.handles.end.x = _SCOORDGroup$GraphicD[4];
1788
+ state.handles.end.y = _SCOORDGroup$GraphicD[5];
1789
+ return state;
1790
+ }
1791
+ }, {
1792
+ key: "getTID300RepresentationArguments",
1793
+ value: function getTID300RepresentationArguments(tool) {
1794
+ var finding = tool.finding,
1795
+ findingSites = tool.findingSites,
1796
+ _tool$cachedStats = tool.cachedStats,
1797
+ cachedStats = _tool$cachedStats === void 0 ? {} : _tool$cachedStats,
1798
+ handles = tool.handles;
1799
+ var start = handles.start,
1800
+ end = handles.end;
1801
+ var points = [start, {
1802
+ x: start.x,
1803
+ y: end.y
1804
+ }, end, {
1805
+ x: end.x,
1806
+ y: start.y
1807
+ }];
1808
+ var area = cachedStats.area,
1809
+ perimeter = cachedStats.perimeter;
1810
+ var trackingIdentifierTextValue = "cornerstoneTools@^4.0.0:RectangleRoi";
1811
+ return {
1812
+ points: points,
1813
+ area: area,
1814
+ perimeter: perimeter,
1815
+ trackingIdentifierTextValue: trackingIdentifierTextValue,
1816
+ finding: finding,
1817
+ findingSites: findingSites || []
1818
+ };
1819
+ }
1820
+ }]);
1821
+ return RectangleRoi;
1822
+ }();
1823
+ RectangleRoi.toolType = "RectangleRoi";
1824
+ RectangleRoi.utilityToolType = "RectangleRoi";
1825
+ RectangleRoi.TID300Representation = TID300Polyline$2;
1826
+ RectangleRoi.isValidCornerstoneTrackingIdentifier = function (TrackingIdentifier) {
1827
+ if (!TrackingIdentifier.includes(":")) {
1828
+ return false;
1829
+ }
1830
+ var _TrackingIdentifier$s = TrackingIdentifier.split(":"),
1831
+ _TrackingIdentifier$s2 = _slicedToArray(_TrackingIdentifier$s, 2),
1832
+ cornerstone4Tag = _TrackingIdentifier$s2[0],
1833
+ toolType = _TrackingIdentifier$s2[1];
1834
+ if (cornerstone4Tag !== CORNERSTONE_4_TAG) {
1835
+ return false;
1836
+ }
1837
+ return toolType === RectangleRoi.toolType;
1838
+ };
1839
+ MeasurementReport$1.registerTool(RectangleRoi);
1840
+
1841
+ var _utilities$orientatio$1 = dcmjs__WEBPACK_IMPORTED_MODULE_0__/* .utilities */ .hC.orientation,
1842
+ rotateDirectionCosinesInPlane$1 = _utilities$orientatio$1.rotateDirectionCosinesInPlane,
1843
+ flipIOP$1 = _utilities$orientatio$1.flipImageOrientationPatient,
1844
+ flipMatrix2D$1 = _utilities$orientatio$1.flipMatrix2D,
1845
+ rotateMatrix902D$1 = _utilities$orientatio$1.rotateMatrix902D;
1846
+ var datasetToBlob = dcmjs__WEBPACK_IMPORTED_MODULE_0__/* .utilities */ .hC.datasetToBlob,
1847
+ BitArray$2 = dcmjs__WEBPACK_IMPORTED_MODULE_0__/* .utilities */ .hC.BitArray,
1848
+ DicomMessage$1 = dcmjs__WEBPACK_IMPORTED_MODULE_0__/* .utilities */ .hC.DicomMessage,
1849
+ DicomMetaDictionary$2 = dcmjs__WEBPACK_IMPORTED_MODULE_0__/* .utilities */ .hC.DicomMetaDictionary;
1850
+ var Normalizer$3 = dcmjs__WEBPACK_IMPORTED_MODULE_0__/* .normalizers */ .oq.Normalizer;
1851
+ var SegmentationDerivation$2 = dcmjs__WEBPACK_IMPORTED_MODULE_0__/* .derivations */ .U7.Segmentation;
1852
+ var Segmentation$5 = {
1853
+ generateSegmentation: generateSegmentation$3,
1854
+ generateToolState: generateToolState$3
1855
+ };
1856
+
1857
+ /**
1858
+ *
1859
+ * @typedef {Object} BrushData
1860
+ * @property {Object} toolState - The cornerstoneTools global toolState.
1861
+ * @property {Object[]} segments - The cornerstoneTools segment metadata that corresponds to the
1862
+ * seriesInstanceUid.
1863
+ */
1864
+
1865
+ /**
1866
+ * generateSegmentation - Generates cornerstoneTools brush data, given a stack of
1867
+ * imageIds, images and the cornerstoneTools brushData.
1868
+ *
1869
+ * @param {object[]} images An array of the cornerstone image objects.
1870
+ * @param {BrushData} brushData and object containing the brushData.
1871
+ * @returns {type} description
1872
+ */
1873
+ function generateSegmentation$3(images, brushData) {
1874
+ var options = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {
1875
+ includeSliceSpacing: true
1876
+ };
1877
+ var toolState = brushData.toolState,
1878
+ segments = brushData.segments;
1879
+
1880
+ // Calculate the dimensions of the data cube.
1881
+ var image0 = images[0];
1882
+ var dims = {
1883
+ x: image0.columns,
1884
+ y: image0.rows,
1885
+ z: images.length
1886
+ };
1887
+ dims.xy = dims.x * dims.y;
1888
+ var numSegments = _getSegCount(seg, segments);
1889
+ if (!numSegments) {
1890
+ throw new Error("No segments to export!");
1891
+ }
1892
+ var isMultiframe = image0.imageId.includes("?frame");
1893
+ var seg = _createSegFromImages$1(images, isMultiframe, options);
1894
+ var _getNumberOfFramesPer = _getNumberOfFramesPerSegment(toolState, images, segments),
1895
+ referencedFramesPerSegment = _getNumberOfFramesPer.referencedFramesPerSegment,
1896
+ segmentIndicies = _getNumberOfFramesPer.segmentIndicies;
1897
+ var NumberOfFrames = 0;
1898
+ for (var i = 0; i < referencedFramesPerSegment.length; i++) {
1899
+ NumberOfFrames += referencedFramesPerSegment[i].length;
1900
+ }
1901
+ seg.setNumberOfFrames(NumberOfFrames);
1902
+ for (var _i = 0; _i < segmentIndicies.length; _i++) {
1903
+ var segmentIndex = segmentIndicies[_i];
1904
+ var referencedFrameIndicies = referencedFramesPerSegment[_i];
1905
+
1906
+ // Frame numbers start from 1.
1907
+ var referencedFrameNumbers = referencedFrameIndicies.map(function (element) {
1908
+ return element + 1;
1909
+ });
1910
+ var segment = segments[segmentIndex];
1911
+ seg.addSegment(segment, _extractCornerstoneToolsPixelData(segmentIndex, referencedFrameIndicies, toolState, images, dims), referencedFrameNumbers);
1255
1912
  }
1256
1913
  seg.bitPackPixelData();
1257
- var segBlob = datasetToBlob$1(seg.dataset);
1914
+ var segBlob = datasetToBlob(seg.dataset);
1258
1915
  return segBlob;
1259
1916
  }
1260
1917
  function _extractCornerstoneToolsPixelData(segmentIndex, referencedFrames, toolState, images, dims) {
@@ -1332,8 +1989,8 @@ function _createSegFromImages$1(images, isMultiframe, options) {
1332
1989
  datasets.push(_dataset);
1333
1990
  }
1334
1991
  }
1335
- var multiframe = Normalizer$2.normalizeToDataset(datasets);
1336
- return new SegmentationDerivation$1([multiframe], options);
1992
+ var multiframe = Normalizer$3.normalizeToDataset(datasets);
1993
+ return new SegmentationDerivation$2([multiframe], options);
1337
1994
  }
1338
1995
 
1339
1996
  /**
@@ -1346,11 +2003,11 @@ function _createSegFromImages$1(images, isMultiframe, options) {
1346
2003
  * @returns {Object} The toolState and an object from which the
1347
2004
  * segment metadata can be derived.
1348
2005
  */
1349
- function generateToolState$2(imageIds, arrayBuffer, metadataProvider) {
2006
+ function generateToolState$3(imageIds, arrayBuffer, metadataProvider) {
1350
2007
  var dicomData = DicomMessage$1.readFile(arrayBuffer);
1351
2008
  var dataset = DicomMetaDictionary$2.naturalizeDataset(dicomData.dict);
1352
2009
  dataset._meta = DicomMetaDictionary$2.namifyDataset(dicomData.meta);
1353
- var multiframe = Normalizer$2.normalizeToDataset([dataset]);
2010
+ var multiframe = Normalizer$3.normalizeToDataset([dataset]);
1354
2011
  var imagePlaneModule = metadataProvider.get("imagePlaneModule", imageIds[0]);
1355
2012
  if (!imagePlaneModule) {
1356
2013
  console.warn("Insufficient metadata, imagePlaneModule missing.");
@@ -1370,7 +2027,7 @@ function generateToolState$2(imageIds, arrayBuffer, metadataProvider) {
1370
2027
  for (var i = 0; i < PerFrameFunctionalGroupsSequence.length; i++) {
1371
2028
  var PerFrameFunctionalGroups = PerFrameFunctionalGroupsSequence[i];
1372
2029
  var ImageOrientationPatientI = sharedImageOrientationPatient || PerFrameFunctionalGroups.PlaneOrientationSequence.ImageOrientationPatient;
1373
- var pixelDataI2D = ndarray__WEBPACK_IMPORTED_MODULE_1___default()(new Uint8Array(pixelData.buffer, i * sliceLength, sliceLength), [multiframe.Rows, multiframe.Columns]);
2030
+ var pixelDataI2D = ndarray__WEBPACK_IMPORTED_MODULE_2___default()(new Uint8Array(pixelData.buffer, i * sliceLength, sliceLength), [multiframe.Rows, multiframe.Columns]);
1374
2031
  var alignedPixelDataI = alignPixelDataWithSourceData$1(pixelDataI2D, ImageOrientationPatientI, validOrientations);
1375
2032
  if (!alignedPixelDataI) {
1376
2033
  console.warn("This segmentation object is not in-plane with the source data. Bailing out of IO. It'd be better to render this with vtkjs. ");
@@ -1465,7 +2122,7 @@ function addImageIdSpecificBrushToolState(toolState, imageId, segmentIndex, pixe
1465
2122
  function getImageIdOfSourceImage(SourceImageSequence, imageIds, metadataProvider) {
1466
2123
  var ReferencedSOPInstanceUID = SourceImageSequence.ReferencedSOPInstanceUID,
1467
2124
  ReferencedFrameNumber = SourceImageSequence.ReferencedFrameNumber;
1468
- return ReferencedFrameNumber ? getImageIdOfReferencedFrame$1(ReferencedSOPInstanceUID, ReferencedFrameNumber, imageIds, metadataProvider) : getImageIdOfReferencedSingleFramedSOPInstance$1(ReferencedSOPInstanceUID, imageIds, metadataProvider);
2125
+ return ReferencedFrameNumber ? getImageIdOfReferencedFrame$1(ReferencedSOPInstanceUID, ReferencedFrameNumber, imageIds, metadataProvider) : getImageIdOfReferencedSingleFramedSOPInstance(ReferencedSOPInstanceUID, imageIds, metadataProvider);
1469
2126
  }
1470
2127
 
1471
2128
  /**
@@ -1478,7 +2135,7 @@ function getImageIdOfSourceImage(SourceImageSequence, imageIds, metadataProvider
1478
2135
  * from the cornerstone imageIds.
1479
2136
  * @return {String} The imageId that corresponds to the sopInstanceUid.
1480
2137
  */
1481
- function getImageIdOfReferencedSingleFramedSOPInstance$1(sopInstanceUid, imageIds, metadataProvider) {
2138
+ function getImageIdOfReferencedSingleFramedSOPInstance(sopInstanceUid, imageIds, metadataProvider) {
1482
2139
  return imageIds.find(function (imageId) {
1483
2140
  var sopCommonModule = metadataProvider.get("sopCommonModule", imageId);
1484
2141
  if (!sopCommonModule) {
@@ -1604,26 +2261,37 @@ function getSegmentMetadata$1(multiframe) {
1604
2261
  };
1605
2262
  }
1606
2263
 
1607
- var _utilities$orientatio = dcmjs__WEBPACK_IMPORTED_MODULE_0__/* .utilities */ .hC.orientation,
1608
- rotateDirectionCosinesInPlane = _utilities$orientatio.rotateDirectionCosinesInPlane,
2264
+ /**
2265
+ * Cornerstone adapters events
2266
+ */
2267
+ var Events;
2268
+ (function (Events) {
2269
+ /**
2270
+ * Cornerstone segmentation load progress event
2271
+ */
2272
+ Events["SEGMENTATION_LOAD_PROGRESS"] = "CORNERSTONE_ADAPTER_SEGMENTATION_LOAD_PROGRESS";
2273
+ })(Events || (Events = {}));
2274
+ var Events$1 = Events;
2275
+
2276
+ var index = /*#__PURE__*/Object.freeze({
2277
+ __proto__: null,
2278
+ Events: Events$1
2279
+ });
2280
+
2281
+ var _utilities$orientatio = dcmjs__WEBPACK_IMPORTED_MODULE_0__/* .utilities */ .hC.orientation,
2282
+ rotateDirectionCosinesInPlane = _utilities$orientatio.rotateDirectionCosinesInPlane,
1609
2283
  flipIOP = _utilities$orientatio.flipImageOrientationPatient,
1610
2284
  flipMatrix2D = _utilities$orientatio.flipMatrix2D,
1611
2285
  rotateMatrix902D = _utilities$orientatio.rotateMatrix902D,
1612
2286
  nearlyEqual = _utilities$orientatio.nearlyEqual;
1613
- var datasetToBlob = dcmjs__WEBPACK_IMPORTED_MODULE_0__/* .utilities */ .hC.datasetToBlob,
1614
- BitArray$1 = dcmjs__WEBPACK_IMPORTED_MODULE_0__/* .utilities */ .hC.BitArray,
1615
- DicomMessage = dcmjs__WEBPACK_IMPORTED_MODULE_0__/* .utilities */ .hC.DicomMessage,
1616
- DicomMetaDictionary$1 = dcmjs__WEBPACK_IMPORTED_MODULE_0__/* .utilities */ .hC.DicomMetaDictionary;
1617
- var Normalizer$1 = dcmjs__WEBPACK_IMPORTED_MODULE_0__/* .normalizers */ .oq.Normalizer;
1618
- var SegmentationDerivation = dcmjs__WEBPACK_IMPORTED_MODULE_0__/* .derivations */ .U7.Segmentation;
2287
+ var BitArray$1 = dcmjs__WEBPACK_IMPORTED_MODULE_0__/* .data */ .aT.BitArray,
2288
+ DicomMessage = dcmjs__WEBPACK_IMPORTED_MODULE_0__/* .data */ .aT.DicomMessage,
2289
+ DicomMetaDictionary$1 = dcmjs__WEBPACK_IMPORTED_MODULE_0__/* .data */ .aT.DicomMetaDictionary;
2290
+ var Normalizer$2 = dcmjs__WEBPACK_IMPORTED_MODULE_0__/* .normalizers */ .oq.Normalizer;
2291
+ var SegmentationDerivation$1 = dcmjs__WEBPACK_IMPORTED_MODULE_0__/* .derivations */ .U7.Segmentation;
1619
2292
  var _utilities$compressio = dcmjs__WEBPACK_IMPORTED_MODULE_0__/* .utilities */ .hC.compression,
1620
2293
  encode = _utilities$compressio.encode,
1621
2294
  decode = _utilities$compressio.decode;
1622
- var Segmentation$2 = {
1623
- generateSegmentation: generateSegmentation$1,
1624
- generateToolState: generateToolState$1,
1625
- fillSegmentation: fillSegmentation$1
1626
- };
1627
2295
 
1628
2296
  /**
1629
2297
  *
@@ -1632,10 +2300,9 @@ var Segmentation$2 = {
1632
2300
  * @property {Object[]} segments - The cornerstoneTools segment metadata that corresponds to the
1633
2301
  * seriesInstanceUid.
1634
2302
  */
1635
-
1636
2303
  var generateSegmentationDefaultOptions = {
1637
2304
  includeSliceSpacing: true,
1638
- rleEncode: true
2305
+ rleEncode: false
1639
2306
  };
1640
2307
 
1641
2308
  /**
@@ -1648,7 +2315,7 @@ var generateSegmentationDefaultOptions = {
1648
2315
  * @param {Object} userOptions Options to pass to the segmentation derivation and `fillSegmentation`.
1649
2316
  * @returns {Blob}
1650
2317
  */
1651
- function generateSegmentation$1(images, inputLabelmaps3D) {
2318
+ function generateSegmentation$2(images, inputLabelmaps3D) {
1652
2319
  var userOptions = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {};
1653
2320
  var isMultiframe = images[0].imageId.includes("?frame");
1654
2321
  var segmentation = _createSegFromImages(images, isMultiframe, userOptions);
@@ -1656,12 +2323,13 @@ function generateSegmentation$1(images, inputLabelmaps3D) {
1656
2323
  }
1657
2324
 
1658
2325
  /**
1659
- * fillSegmentation - Fills a derived segmentation dataset with cornerstoneTools `LabelMap3D` data.
2326
+ * Fills a given segmentation object with data from the input labelmaps3D
1660
2327
  *
1661
- * @param {object[]} segmentation An empty segmentation derived dataset.
1662
- * @param {Object|Object[]} inputLabelmaps3D The cornerstone `Labelmap3D` object, or an array of objects.
1663
- * @param {Object} userOptions Options object to override default options.
1664
- * @returns {Blob} description
2328
+ * @param segmentation - The segmentation object to be filled.
2329
+ * @param inputLabelmaps3D - An array of 3D labelmaps, or a single 3D labelmap.
2330
+ * @param userOptions - Optional configuration settings. Will override the default options.
2331
+ *
2332
+ * @returns {object} The filled segmentation object.
1665
2333
  */
1666
2334
  function fillSegmentation$1(segmentation, inputLabelmaps3D) {
1667
2335
  var userOptions = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {};
@@ -1714,7 +2382,7 @@ function fillSegmentation$1(segmentation, inputLabelmaps3D) {
1714
2382
  return element + 1;
1715
2383
  });
1716
2384
  var segmentMetadata = metadata[segmentIndex];
1717
- var labelmaps = _getLabelmapsFromRefernecedFrameIndicies(labelmap3D, referencedFrameIndicies);
2385
+ var labelmaps = _getLabelmapsFromReferencedFrameIndicies(labelmap3D, referencedFrameIndicies);
1718
2386
  segmentation.addSegmentFromLabelmap(segmentMetadata, labelmaps, segmentIndex, referencedFrameNumbers);
1719
2387
  }
1720
2388
  }
@@ -1743,10 +2411,9 @@ function fillSegmentation$1(segmentation, inputLabelmaps3D) {
1743
2411
  // If no rleEncoding, at least bitpack the data.
1744
2412
  segmentation.bitPackPixelData();
1745
2413
  }
1746
- var segBlob = datasetToBlob(segmentation.dataset);
1747
- return segBlob;
2414
+ return segmentation;
1748
2415
  }
1749
- function _getLabelmapsFromRefernecedFrameIndicies(labelmap3D, referencedFrameIndicies) {
2416
+ function _getLabelmapsFromReferencedFrameIndicies(labelmap3D, referencedFrameIndicies) {
1750
2417
  var labelmaps2D = labelmap3D.labelmaps2D;
1751
2418
  var labelmaps = [];
1752
2419
  for (var i = 0; i < referencedFrameIndicies.length; i++) {
@@ -1782,8 +2449,8 @@ function _createSegFromImages(images, isMultiframe, options) {
1782
2449
  datasets.push(_dataset);
1783
2450
  }
1784
2451
  }
1785
- var multiframe = Normalizer$1.normalizeToDataset(datasets);
1786
- return new SegmentationDerivation([multiframe], options);
2452
+ var multiframe = Normalizer$2.normalizeToDataset(datasets);
2453
+ return new SegmentationDerivation$1([multiframe], options);
1787
2454
  }
1788
2455
 
1789
2456
  /**
@@ -1793,8 +2460,7 @@ function _createSegFromImages(images, isMultiframe, options) {
1793
2460
  * @param {string[]} imageIds - An array of the imageIds.
1794
2461
  * @param {ArrayBuffer} arrayBuffer - The SEG arrayBuffer.
1795
2462
  * @param {*} metadataProvider.
1796
- * @param {bool} skipOverlapping - skip checks for overlapping segs, default value false.
1797
- * @param {number} tolerance - default value 1.e-3.
2463
+ * @param {obj} options - Options object.
1798
2464
  *
1799
2465
  * @return {[]ArrayBuffer}a list of array buffer for each labelMap
1800
2466
  * @return {Object} an object from which the segment metadata can be derived
@@ -1802,83 +2468,9 @@ function _createSegFromImages(images, isMultiframe, options) {
1802
2468
  * @return {[][][]} 3D list containing the track of segments per frame for each labelMap
1803
2469
  * (available only for the overlapping case).
1804
2470
  */
1805
- function generateToolState$1(imageIds, arrayBuffer, metadataProvider) {
1806
- var skipOverlapping = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : false;
1807
- var tolerance = arguments.length > 4 && arguments[4] !== undefined ? arguments[4] : 1e-3;
1808
- var dicomData = DicomMessage.readFile(arrayBuffer);
1809
- var dataset = DicomMetaDictionary$1.naturalizeDataset(dicomData.dict);
1810
- dataset._meta = DicomMetaDictionary$1.namifyDataset(dicomData.meta);
1811
- var multiframe = Normalizer$1.normalizeToDataset([dataset]);
1812
- var imagePlaneModule = metadataProvider.get("imagePlaneModule", imageIds[0]);
1813
- var generalSeriesModule = metadataProvider.get("generalSeriesModule", imageIds[0]);
1814
- var SeriesInstanceUID = generalSeriesModule.seriesInstanceUID;
1815
- if (!imagePlaneModule) {
1816
- console.warn("Insufficient metadata, imagePlaneModule missing.");
1817
- }
1818
- var ImageOrientationPatient = Array.isArray(imagePlaneModule.rowCosines) ? [].concat(_toConsumableArray(imagePlaneModule.rowCosines), _toConsumableArray(imagePlaneModule.columnCosines)) : [imagePlaneModule.rowCosines.x, imagePlaneModule.rowCosines.y, imagePlaneModule.rowCosines.z, imagePlaneModule.columnCosines.x, imagePlaneModule.columnCosines.y, imagePlaneModule.columnCosines.z];
1819
-
1820
- // Get IOP from ref series, compute supported orientations:
1821
- var validOrientations = getValidOrientations(ImageOrientationPatient);
1822
- var sliceLength = multiframe.Columns * multiframe.Rows;
1823
- var segMetadata = getSegmentMetadata(multiframe, SeriesInstanceUID);
1824
- var TransferSyntaxUID = multiframe._meta.TransferSyntaxUID.Value[0];
1825
- var pixelData;
1826
- if (TransferSyntaxUID === "1.2.840.10008.1.2.5") {
1827
- var rleEncodedFrames = Array.isArray(multiframe.PixelData) ? multiframe.PixelData : [multiframe.PixelData];
1828
- pixelData = decode(rleEncodedFrames, multiframe.Rows, multiframe.Columns);
1829
- if (multiframe.BitsStored === 1) {
1830
- console.warn("No implementation for rle + bitbacking.");
1831
- return;
1832
- }
1833
- } else {
1834
- pixelData = unpackPixelData(multiframe);
1835
- if (!pixelData) {
1836
- throw new Error("Fractional segmentations are not yet supported");
1837
- }
1838
- }
1839
- var orientation = checkOrientation(multiframe, validOrientations, [imagePlaneModule.rows, imagePlaneModule.columns, imageIds.length], tolerance);
1840
- var overlapping = false;
1841
- if (!skipOverlapping) {
1842
- overlapping = checkSEGsOverlapping(pixelData, multiframe, imageIds, validOrientations, metadataProvider, tolerance);
1843
- }
1844
- var insertFunction;
1845
- switch (orientation) {
1846
- case "Planar":
1847
- if (overlapping) {
1848
- insertFunction = insertOverlappingPixelDataPlanar;
1849
- } else {
1850
- insertFunction = insertPixelDataPlanar;
1851
- }
1852
- break;
1853
- case "Perpendicular":
1854
- //insertFunction = insertPixelDataPerpendicular;
1855
- throw new Error("Segmentations orthogonal to the acquisition plane of the source data are not yet supported.");
1856
- case "Oblique":
1857
- throw new Error("Segmentations oblique to the acquisition plane of the source data are not yet supported.");
1858
- }
1859
-
1860
- /* if SEGs are overlapping:
1861
- 1) the labelmapBuffer will contain M volumes which have non-overlapping segments;
1862
- 2) segmentsOnFrame will have M * numberOfFrames values to track in which labelMap are the segments;
1863
- 3) insertFunction will return the number of LabelMaps
1864
- 4) generateToolState return is an array*/
1865
-
1866
- var segmentsOnFrameArray = [];
1867
- segmentsOnFrameArray[0] = [];
1868
- var segmentsOnFrame = [];
1869
- var arrayBufferLength = sliceLength * imageIds.length * 2; // 2 bytes per label voxel in cst4.
1870
- var labelmapBufferArray = [];
1871
- labelmapBufferArray[0] = new ArrayBuffer(arrayBufferLength);
1872
- insertFunction(segmentsOnFrame, segmentsOnFrameArray, labelmapBufferArray, pixelData, multiframe, imageIds, validOrientations, metadataProvider, tolerance);
1873
- return {
1874
- labelmapBufferArray: labelmapBufferArray,
1875
- segMetadata: segMetadata,
1876
- segmentsOnFrame: segmentsOnFrame,
1877
- segmentsOnFrameArray: segmentsOnFrameArray
1878
- };
1879
- }
1880
-
1881
- // function insertPixelDataPerpendicular(
2471
+ function generateToolState$2(_x, _x2, _x3, _x4) {
2472
+ return _generateToolState.apply(this, arguments);
2473
+ } // function insertPixelDataPerpendicular(
1882
2474
  // segmentsOnFrame,
1883
2475
  // labelmapBuffer,
1884
2476
  // pixelData,
@@ -1893,30 +2485,23 @@ function generateToolState$1(imageIds, arrayBuffer, metadataProvider) {
1893
2485
  // Rows,
1894
2486
  // Columns
1895
2487
  // } = multiframe;
1896
-
1897
2488
  // const firstImagePlaneModule = metadataProvider.get(
1898
2489
  // "imagePlaneModule",
1899
2490
  // imageIds[0]
1900
2491
  // );
1901
-
1902
2492
  // const lastImagePlaneModule = metadataProvider.get(
1903
2493
  // "imagePlaneModule",
1904
2494
  // imageIds[imageIds.length - 1]
1905
2495
  // );
1906
-
1907
2496
  // console.log(firstImagePlaneModule);
1908
2497
  // console.log(lastImagePlaneModule);
1909
-
1910
2498
  // const corners = [
1911
2499
  // ...getCorners(firstImagePlaneModule),
1912
2500
  // ...getCorners(lastImagePlaneModule)
1913
2501
  // ];
1914
-
1915
2502
  // console.log(`corners:`);
1916
2503
  // console.log(corners);
1917
-
1918
2504
  // const indexToWorld = mat4.create();
1919
-
1920
2505
  // const ippFirstFrame = firstImagePlaneModule.imagePositionPatient;
1921
2506
  // const rowCosines = Array.isArray(firstImagePlaneModule.rowCosines)
1922
2507
  // ? [...firstImagePlaneModule.rowCosines]
@@ -1925,7 +2510,6 @@ function generateToolState$1(imageIds, arrayBuffer, metadataProvider) {
1925
2510
  // firstImagePlaneModule.rowCosines.y,
1926
2511
  // firstImagePlaneModule.rowCosines.z
1927
2512
  // ];
1928
-
1929
2513
  // const columnCosines = Array.isArray(firstImagePlaneModule.columnCosines)
1930
2514
  // ? [...firstImagePlaneModule.columnCosines]
1931
2515
  // : [
@@ -1933,9 +2517,7 @@ function generateToolState$1(imageIds, arrayBuffer, metadataProvider) {
1933
2517
  // firstImagePlaneModule.columnCosines.y,
1934
2518
  // firstImagePlaneModule.columnCosines.z
1935
2519
  // ];
1936
-
1937
2520
  // const { pixelSpacing } = firstImagePlaneModule;
1938
-
1939
2521
  // mat4.set(
1940
2522
  // indexToWorld,
1941
2523
  // // Column 1
@@ -1959,50 +2541,36 @@ function generateToolState$1(imageIds, arrayBuffer, metadataProvider) {
1959
2541
  // 0,
1960
2542
  // 1
1961
2543
  // );
1962
-
1963
2544
  // // TODO -> Get origin and (x,y,z) increments to build a translation matrix:
1964
2545
  // // TODO -> Equation C.7.6.2.1-1
1965
-
1966
2546
  // // | cx*di rx* Xx 0 | |x|
1967
2547
  // // | cy*di ry Xy 0 | |y|
1968
2548
  // // | cz*di rz Xz 0 | |z|
1969
2549
  // // | tx ty tz 1 | |1|
1970
-
1971
2550
  // // const [
1972
2551
  // // 0, 0 , 0 , 0,
1973
2552
  // // 0, 0 , 0 , 0,
1974
2553
  // // 0, 0 , 0 , 0,
1975
2554
  // // ipp[0], ipp[1] , ipp[2] , 1,
1976
2555
  // // ]
1977
-
1978
2556
  // // Each frame:
1979
-
1980
2557
  // // Find which corner the first voxel lines up with (one of 8 corners.)
1981
-
1982
2558
  // // Find how i,j,k orient with respect to source volume.
1983
2559
  // // Go through each frame, find location in source to start, and whether to increment +/ix,+/-y,+/-z
1984
2560
  // // through each voxel.
1985
-
1986
2561
  // // [1,0,0,0,1,0]
1987
-
1988
2562
  // // const [
1989
-
1990
2563
  // // ]
1991
-
1992
2564
  // // Invert transformation matrix to get worldToIndex
1993
-
1994
2565
  // // Apply world to index on each point to fill up the matrix.
1995
-
1996
2566
  // // const sharedImageOrientationPatient = SharedFunctionalGroupsSequence.PlaneOrientationSequence
1997
2567
  // // ? SharedFunctionalGroupsSequence.PlaneOrientationSequence
1998
2568
  // // .ImageOrientationPatient
1999
2569
  // // : undefined;
2000
2570
  // // const sliceLength = Columns * Rows;
2001
2571
  // }
2002
-
2003
2572
  // function getCorners(imagePlaneModule) {
2004
2573
  // // console.log(imagePlaneModule);
2005
-
2006
2574
  // const {
2007
2575
  // rows,
2008
2576
  // columns,
@@ -2012,22 +2580,18 @@ function generateToolState$1(imageIds, arrayBuffer, metadataProvider) {
2012
2580
  // rowPixelSpacing,
2013
2581
  // columnPixelSpacing
2014
2582
  // } = imagePlaneModule;
2015
-
2016
2583
  // const rowLength = columns * columnPixelSpacing;
2017
2584
  // const columnLength = rows * rowPixelSpacing;
2018
-
2019
2585
  // const entireRowVector = [
2020
2586
  // rowLength * columnCosines[0],
2021
2587
  // rowLength * columnCosines[1],
2022
2588
  // rowLength * columnCosines[2]
2023
2589
  // ];
2024
-
2025
2590
  // const entireColumnVector = [
2026
2591
  // columnLength * rowCosines[0],
2027
2592
  // columnLength * rowCosines[1],
2028
2593
  // columnLength * rowCosines[2]
2029
2594
  // ];
2030
-
2031
2595
  // const topLeft = [ipp[0], ipp[1], ipp[2]];
2032
2596
  // const topRight = [
2033
2597
  // topLeft[0] + entireRowVector[0],
@@ -2039,29 +2603,160 @@ function generateToolState$1(imageIds, arrayBuffer, metadataProvider) {
2039
2603
  // topLeft[1] + entireColumnVector[1],
2040
2604
  // topLeft[2] + entireColumnVector[2]
2041
2605
  // ];
2042
-
2043
2606
  // const bottomRight = [
2044
2607
  // bottomLeft[0] + entireRowVector[0],
2045
2608
  // bottomLeft[1] + entireRowVector[1],
2046
2609
  // bottomLeft[2] + entireRowVector[2]
2047
2610
  // ];
2048
-
2049
2611
  // return [topLeft, topRight, bottomLeft, bottomRight];
2050
2612
  // }
2051
-
2052
2613
  /**
2053
2614
  * Find the reference frame of the segmentation frame in the source data.
2054
2615
  *
2055
2616
  * @param {Object} multiframe dicom metadata
2056
2617
  * @param {Int} frameSegment frame dicom index
2057
2618
  * @param {String[]} imageIds A list of imageIds.
2058
- * @param {Object} metadataProvider A Cornerstone metadataProvider to query
2059
- * metadata from imageIds.
2619
+ * @param {Object} sopUIDImageIdIndexMap A map of SOPInstanceUID to imageId
2060
2620
  * @param {Float} tolerance The tolerance parameter
2061
2621
  *
2062
2622
  * @returns {String} Returns the imageId
2063
2623
  */
2064
- function findReferenceSourceImageId(multiframe, frameSegment, imageIds, metadataProvider, tolerance) {
2624
+ function _generateToolState() {
2625
+ _generateToolState = _asyncToGenerator( /*#__PURE__*/_regeneratorRuntime().mark(function _callee(imageIds, arrayBuffer, metadataProvider, options) {
2626
+ var _options$skipOverlapp, skipOverlapping, _options$tolerance, tolerance, _options$TypedArrayCo, TypedArrayConstructor, _options$maxBytesPerC, maxBytesPerChunk, eventTarget, triggerEvent, dicomData, dataset, multiframe, imagePlaneModule, generalSeriesModule, SeriesInstanceUID, ImageOrientationPatient, validOrientations, sliceLength, segMetadata, TransferSyntaxUID, pixelData, pixelDataChunks, rleEncodedFrames, orientation, sopUIDImageIdIndexMap, overlapping, insertFunction, segmentsOnFrameArray, segmentsOnFrame, arrayBufferLength, labelmapBufferArray, imageIdMaps, segmentsPixelIndices, centroidXYZ;
2627
+ return _regeneratorRuntime().wrap(function _callee$(_context) {
2628
+ while (1) switch (_context.prev = _context.next) {
2629
+ case 0:
2630
+ _options$skipOverlapp = options.skipOverlapping, skipOverlapping = _options$skipOverlapp === void 0 ? false : _options$skipOverlapp, _options$tolerance = options.tolerance, tolerance = _options$tolerance === void 0 ? 1e-3 : _options$tolerance, _options$TypedArrayCo = options.TypedArrayConstructor, TypedArrayConstructor = _options$TypedArrayCo === void 0 ? Uint8Array : _options$TypedArrayCo, _options$maxBytesPerC = options.maxBytesPerChunk, maxBytesPerChunk = _options$maxBytesPerC === void 0 ? 199000000 : _options$maxBytesPerC, eventTarget = options.eventTarget, triggerEvent = options.triggerEvent;
2631
+ dicomData = DicomMessage.readFile(arrayBuffer);
2632
+ dataset = DicomMetaDictionary$1.naturalizeDataset(dicomData.dict);
2633
+ dataset._meta = DicomMetaDictionary$1.namifyDataset(dicomData.meta);
2634
+ multiframe = Normalizer$2.normalizeToDataset([dataset]);
2635
+ imagePlaneModule = metadataProvider.get("imagePlaneModule", imageIds[0]);
2636
+ generalSeriesModule = metadataProvider.get("generalSeriesModule", imageIds[0]);
2637
+ SeriesInstanceUID = generalSeriesModule.seriesInstanceUID;
2638
+ if (!imagePlaneModule) {
2639
+ console.warn("Insufficient metadata, imagePlaneModule missing.");
2640
+ }
2641
+ ImageOrientationPatient = Array.isArray(imagePlaneModule.rowCosines) ? [].concat(_toConsumableArray(imagePlaneModule.rowCosines), _toConsumableArray(imagePlaneModule.columnCosines)) : [imagePlaneModule.rowCosines.x, imagePlaneModule.rowCosines.y, imagePlaneModule.rowCosines.z, imagePlaneModule.columnCosines.x, imagePlaneModule.columnCosines.y, imagePlaneModule.columnCosines.z]; // Get IOP from ref series, compute supported orientations:
2642
+ validOrientations = getValidOrientations(ImageOrientationPatient);
2643
+ sliceLength = multiframe.Columns * multiframe.Rows;
2644
+ segMetadata = getSegmentMetadata(multiframe, SeriesInstanceUID);
2645
+ TransferSyntaxUID = multiframe._meta.TransferSyntaxUID.Value[0];
2646
+ if (!(TransferSyntaxUID === "1.2.840.10008.1.2.5")) {
2647
+ _context.next = 23;
2648
+ break;
2649
+ }
2650
+ rleEncodedFrames = Array.isArray(multiframe.PixelData) ? multiframe.PixelData : [multiframe.PixelData];
2651
+ pixelData = decode(rleEncodedFrames, multiframe.Rows, multiframe.Columns);
2652
+ if (!(multiframe.BitsStored === 1)) {
2653
+ _context.next = 20;
2654
+ break;
2655
+ }
2656
+ console.warn("No implementation for rle + bitbacking.");
2657
+ return _context.abrupt("return");
2658
+ case 20:
2659
+ // Todo: need to test this with rle data
2660
+ pixelDataChunks = [pixelData];
2661
+ _context.next = 26;
2662
+ break;
2663
+ case 23:
2664
+ pixelDataChunks = unpackPixelData(multiframe, {
2665
+ maxBytesPerChunk: maxBytesPerChunk
2666
+ });
2667
+ if (pixelDataChunks) {
2668
+ _context.next = 26;
2669
+ break;
2670
+ }
2671
+ throw new Error("Fractional segmentations are not yet supported");
2672
+ case 26:
2673
+ orientation = checkOrientation(multiframe, validOrientations, [imagePlaneModule.rows, imagePlaneModule.columns, imageIds.length], tolerance); // Pre-compute the sop UID to imageId index map so that in the for loop
2674
+ // we don't have to call metadataProvider.get() for each imageId over
2675
+ // and over again.
2676
+ sopUIDImageIdIndexMap = imageIds.reduce(function (acc, imageId) {
2677
+ var _metadataProvider$get = metadataProvider.get("generalImageModule", imageId),
2678
+ sopInstanceUid = _metadataProvider$get.sopInstanceUid;
2679
+ acc[sopInstanceUid] = imageId;
2680
+ return acc;
2681
+ }, {});
2682
+ overlapping = false;
2683
+ if (!skipOverlapping) {
2684
+ overlapping = checkSEGsOverlapping(pixelDataChunks, multiframe, imageIds, validOrientations, metadataProvider, tolerance, TypedArrayConstructor, sopUIDImageIdIndexMap);
2685
+ }
2686
+ _context.t0 = orientation;
2687
+ _context.next = _context.t0 === "Planar" ? 33 : _context.t0 === "Perpendicular" ? 35 : _context.t0 === "Oblique" ? 36 : 37;
2688
+ break;
2689
+ case 33:
2690
+ if (overlapping) {
2691
+ insertFunction = insertOverlappingPixelDataPlanar;
2692
+ } else {
2693
+ insertFunction = insertPixelDataPlanar;
2694
+ }
2695
+ return _context.abrupt("break", 37);
2696
+ case 35:
2697
+ throw new Error("Segmentations orthogonal to the acquisition plane of the source data are not yet supported.");
2698
+ case 36:
2699
+ throw new Error("Segmentations oblique to the acquisition plane of the source data are not yet supported.");
2700
+ case 37:
2701
+ /* if SEGs are overlapping:
2702
+ 1) the labelmapBuffer will contain M volumes which have non-overlapping segments;
2703
+ 2) segmentsOnFrame will have M * numberOfFrames values to track in which labelMap are the segments;
2704
+ 3) insertFunction will return the number of LabelMaps
2705
+ 4) generateToolState return is an array*/
2706
+ segmentsOnFrameArray = [];
2707
+ segmentsOnFrameArray[0] = [];
2708
+ segmentsOnFrame = [];
2709
+ arrayBufferLength = sliceLength * imageIds.length * TypedArrayConstructor.BYTES_PER_ELEMENT;
2710
+ labelmapBufferArray = [];
2711
+ labelmapBufferArray[0] = new ArrayBuffer(arrayBufferLength);
2712
+
2713
+ // Precompute the indices and metadata so that we don't have to call
2714
+ // a function for each imageId in the for loop.
2715
+ imageIdMaps = imageIds.reduce(function (acc, curr, index) {
2716
+ acc.indices[curr] = index;
2717
+ acc.metadata[curr] = metadataProvider.get("instance", curr);
2718
+ return acc;
2719
+ }, {
2720
+ indices: {},
2721
+ metadata: {}
2722
+ }); // This is the centroid calculation for each segment Index, the data structure
2723
+ // is a Map with key = segmentIndex and value = {imageIdIndex: centroid, ...}
2724
+ // later on we will use this data structure to calculate the centroid of the
2725
+ // segment in the labelmapBuffer
2726
+ segmentsPixelIndices = new Map();
2727
+ _context.next = 47;
2728
+ return insertFunction(segmentsOnFrame, segmentsOnFrameArray, labelmapBufferArray, pixelDataChunks, multiframe, imageIds, validOrientations, metadataProvider, tolerance, TypedArrayConstructor, segmentsPixelIndices, sopUIDImageIdIndexMap, imageIdMaps, eventTarget, triggerEvent);
2729
+ case 47:
2730
+ // calculate the centroid of each segment
2731
+ centroidXYZ = new Map();
2732
+ segmentsPixelIndices.forEach(function (imageIdIndexBufferIndex, segmentIndex) {
2733
+ var _calculateCentroid = calculateCentroid(imageIdIndexBufferIndex, multiframe),
2734
+ xAcc = _calculateCentroid.xAcc,
2735
+ yAcc = _calculateCentroid.yAcc,
2736
+ zAcc = _calculateCentroid.zAcc,
2737
+ count = _calculateCentroid.count;
2738
+ centroidXYZ.set(segmentIndex, {
2739
+ x: Math.floor(xAcc / count),
2740
+ y: Math.floor(yAcc / count),
2741
+ z: Math.floor(zAcc / count)
2742
+ });
2743
+ });
2744
+ return _context.abrupt("return", {
2745
+ labelmapBufferArray: labelmapBufferArray,
2746
+ segMetadata: segMetadata,
2747
+ segmentsOnFrame: segmentsOnFrame,
2748
+ segmentsOnFrameArray: segmentsOnFrameArray,
2749
+ centroids: centroidXYZ
2750
+ });
2751
+ case 50:
2752
+ case "end":
2753
+ return _context.stop();
2754
+ }
2755
+ }, _callee);
2756
+ }));
2757
+ return _generateToolState.apply(this, arguments);
2758
+ }
2759
+ function findReferenceSourceImageId(multiframe, frameSegment, imageIds, metadataProvider, tolerance, sopUIDImageIdIndexMap) {
2065
2760
  var imageId = undefined;
2066
2761
  if (!multiframe) {
2067
2762
  return imageId;
@@ -2101,7 +2796,7 @@ function findReferenceSourceImageId(multiframe, frameSegment, imageIds, metadata
2101
2796
  }
2102
2797
  }
2103
2798
  if (frameSourceImageSequence) {
2104
- imageId = getImageIdOfSourceImagebySourceImageSequence(frameSourceImageSequence, imageIds, metadataProvider);
2799
+ imageId = getImageIdOfSourceImageBySourceImageSequence(frameSourceImageSequence, sopUIDImageIdIndexMap);
2105
2800
  }
2106
2801
  if (imageId === undefined && ReferencedSeriesSequence) {
2107
2802
  var referencedSeriesSequence = Array.isArray(ReferencedSeriesSequence) ? ReferencedSeriesSequence[0] : ReferencedSeriesSequence;
@@ -2116,7 +2811,7 @@ function findReferenceSourceImageId(multiframe, frameSegment, imageIds, metadata
2116
2811
  * @returns {boolean} Returns a flag if segmentations overlapping
2117
2812
  */
2118
2813
 
2119
- function checkSEGsOverlapping(pixelData, multiframe, imageIds, validOrientations, metadataProvider, tolerance) {
2814
+ function checkSEGsOverlapping(pixelData, multiframe, imageIds, validOrientations, metadataProvider, tolerance, TypedArrayConstructor, sopUIDImageIdIndexMap) {
2120
2815
  var SharedFunctionalGroupsSequence = multiframe.SharedFunctionalGroupsSequence,
2121
2816
  PerFrameFunctionalGroupsSequence = multiframe.PerFrameFunctionalGroupsSequence,
2122
2817
  SegmentSequence = multiframe.SegmentSequence,
@@ -2143,7 +2838,7 @@ function checkSEGsOverlapping(pixelData, multiframe, imageIds, validOrientations
2143
2838
  console.warn("Could not retrieve the segment index for frame segment " + frameSegment + ", skipping this frame.");
2144
2839
  return "continue";
2145
2840
  }
2146
- var imageId = findReferenceSourceImageId(multiframe, frameSegment, imageIds, metadataProvider, tolerance);
2841
+ var imageId = findReferenceSourceImageId(multiframe, frameSegment, imageIds, metadataProvider, tolerance, sopUIDImageIdIndexMap);
2147
2842
  if (!imageId) {
2148
2843
  console.warn("Image not present in stack, can't import frame : " + frameSegment + ".");
2149
2844
  return "continue";
@@ -2171,12 +2866,13 @@ function checkSEGsOverlapping(pixelData, multiframe, imageIds, validOrientations
2171
2866
  for (_iterator.s(); !(_step = _iterator.n()).done;) {
2172
2867
  var _step$value = _slicedToArray(_step.value, 2),
2173
2868
  role = _step$value[1];
2174
- var temp2DArray = new Uint16Array(sliceLength).fill(0);
2869
+ var temp2DArray = new TypedArrayConstructor(sliceLength).fill(0);
2175
2870
  for (var i = 0; i < role.length; ++i) {
2176
2871
  var _frameSegment = role[i];
2177
2872
  var PerFrameFunctionalGroups = PerFrameFunctionalGroupsSequence[_frameSegment];
2178
2873
  var ImageOrientationPatientI = sharedImageOrientationPatient || PerFrameFunctionalGroups.PlaneOrientationSequence.ImageOrientationPatient;
2179
- var pixelDataI2D = ndarray__WEBPACK_IMPORTED_MODULE_1___default()(new Uint8Array(pixelData.buffer, _frameSegment * sliceLength, sliceLength), [Rows, Columns]);
2874
+ var view = readFromUnpackedChunks(pixelData, _frameSegment * sliceLength, sliceLength);
2875
+ var pixelDataI2D = ndarray__WEBPACK_IMPORTED_MODULE_2___default()(view, [Rows, Columns]);
2180
2876
  var alignedPixelDataI = alignPixelDataWithSourceData(pixelDataI2D, ImageOrientationPatientI, validOrientations, tolerance);
2181
2877
  if (!alignedPixelDataI) {
2182
2878
  console.warn("Individual SEG frames are out of plane with respect to the first SEG frame, this is not yet supported, skipping this frame.");
@@ -2200,15 +2896,14 @@ function checkSEGsOverlapping(pixelData, multiframe, imageIds, validOrientations
2200
2896
  }
2201
2897
  return false;
2202
2898
  }
2203
- function insertOverlappingPixelDataPlanar(segmentsOnFrame, segmentsOnFrameArray, labelmapBufferArray, pixelData, multiframe, imageIds, validOrientations, metadataProvider, tolerance) {
2899
+ function insertOverlappingPixelDataPlanar(segmentsOnFrame, segmentsOnFrameArray, labelmapBufferArray, pixelData, multiframe, imageIds, validOrientations, metadataProvider, tolerance, TypedArrayConstructor, segmentsPixelIndices, sopUIDImageIdIndexMap) {
2204
2900
  var SharedFunctionalGroupsSequence = multiframe.SharedFunctionalGroupsSequence,
2205
2901
  PerFrameFunctionalGroupsSequence = multiframe.PerFrameFunctionalGroupsSequence,
2206
2902
  Rows = multiframe.Rows,
2207
2903
  Columns = multiframe.Columns;
2208
2904
  var sharedImageOrientationPatient = SharedFunctionalGroupsSequence.PlaneOrientationSequence ? SharedFunctionalGroupsSequence.PlaneOrientationSequence.ImageOrientationPatient : undefined;
2209
2905
  var sliceLength = Columns * Rows;
2210
- var arrayBufferLength = sliceLength * imageIds.length * 2; // 2 bytes per label voxel in cst4.
2211
-
2906
+ var arrayBufferLength = sliceLength * imageIds.length * TypedArrayConstructor.BYTES_PER_ELEMENT;
2212
2907
  // indicate the number of labelMaps
2213
2908
  var M = 1;
2214
2909
 
@@ -2219,7 +2914,7 @@ function insertOverlappingPixelDataPlanar(segmentsOnFrame, segmentsOnFrameArray,
2219
2914
  var tempBuffer = labelmapBufferArray[m].slice(0);
2220
2915
 
2221
2916
  // temp list for checking overlaps
2222
- var tempSegmentsOnFrame = lodash_clonedeep__WEBPACK_IMPORTED_MODULE_2___default()(segmentsOnFrameArray[m]);
2917
+ var tempSegmentsOnFrame = lodash_clonedeep__WEBPACK_IMPORTED_MODULE_3___default()(segmentsOnFrameArray[m]);
2223
2918
 
2224
2919
  /** split overlapping SEGs algorithm for each segment:
2225
2920
  * A) copy the labelmapBuffer in the array with index 0
@@ -2241,12 +2936,17 @@ function insertOverlappingPixelDataPlanar(segmentsOnFrame, segmentsOnFrameArray,
2241
2936
  return "continue";
2242
2937
  }
2243
2938
  var ImageOrientationPatientI = sharedImageOrientationPatient || PerFrameFunctionalGroups.PlaneOrientationSequence.ImageOrientationPatient;
2244
- var pixelDataI2D = ndarray__WEBPACK_IMPORTED_MODULE_1___default()(new Uint8Array(pixelData.buffer, _i2 * sliceLength, sliceLength), [Rows, Columns]);
2939
+
2940
+ // Since we moved to the chunks approach, we need to read the data
2941
+ // and handle scenarios where the portion of data is in one chunk
2942
+ // and the other portion is in another chunk
2943
+ var view = readFromUnpackedChunks(pixelData, _i2 * sliceLength, sliceLength);
2944
+ var pixelDataI2D = ndarray__WEBPACK_IMPORTED_MODULE_2___default()(view, [Rows, Columns]);
2245
2945
  var alignedPixelDataI = alignPixelDataWithSourceData(pixelDataI2D, ImageOrientationPatientI, validOrientations, tolerance);
2246
2946
  if (!alignedPixelDataI) {
2247
2947
  throw new Error("Individual SEG frames are out of plane with respect to the first SEG frame. " + "This is not yet supported. Aborting segmentation loading.");
2248
2948
  }
2249
- var imageId = findReferenceSourceImageId(multiframe, _i2, imageIds, metadataProvider, tolerance);
2949
+ var imageId = findReferenceSourceImageId(multiframe, _i2, imageIds, metadataProvider, tolerance, sopUIDImageIdIndexMap);
2250
2950
  if (!imageId) {
2251
2951
  console.warn("Image not present in stack, can't import frame : " + _i2 + ".");
2252
2952
  i = _i2;
@@ -2259,9 +2959,8 @@ function insertOverlappingPixelDataPlanar(segmentsOnFrame, segmentsOnFrameArray,
2259
2959
  var imageIdIndex = imageIds.findIndex(function (element) {
2260
2960
  return element === imageId;
2261
2961
  });
2262
- var byteOffset = sliceLength * 2 * imageIdIndex; // 2 bytes/pixel
2263
-
2264
- var labelmap2DView = new Uint16Array(tempBuffer, byteOffset, sliceLength);
2962
+ var byteOffset = sliceLength * imageIdIndex * TypedArrayConstructor.BYTES_PER_ELEMENT;
2963
+ var labelmap2DView = new TypedArrayConstructor(tempBuffer, byteOffset, sliceLength);
2265
2964
  var data = alignedPixelDataI.data;
2266
2965
  var segmentOnFrame = false;
2267
2966
  for (var j = 0, len = alignedPixelDataI.data.length; j < len; ++j) {
@@ -2274,7 +2973,7 @@ function insertOverlappingPixelDataPlanar(segmentsOnFrame, segmentsOnFrameArray,
2274
2973
  M++;
2275
2974
  }
2276
2975
  tempBuffer = labelmapBufferArray[m].slice(0);
2277
- tempSegmentsOnFrame = lodash_clonedeep__WEBPACK_IMPORTED_MODULE_2___default()(segmentsOnFrameArray[m]);
2976
+ tempSegmentsOnFrame = lodash_clonedeep__WEBPACK_IMPORTED_MODULE_3___default()(segmentsOnFrameArray[m]);
2278
2977
  _i2 = 0;
2279
2978
  break;
2280
2979
  } else {
@@ -2300,12 +2999,12 @@ function insertOverlappingPixelDataPlanar(segmentsOnFrame, segmentsOnFrameArray,
2300
2999
  if (_ret2 === "continue") continue;
2301
3000
  }
2302
3001
  labelmapBufferArray[m] = tempBuffer.slice(0);
2303
- segmentsOnFrameArray[m] = lodash_clonedeep__WEBPACK_IMPORTED_MODULE_2___default()(tempSegmentsOnFrame);
3002
+ segmentsOnFrameArray[m] = lodash_clonedeep__WEBPACK_IMPORTED_MODULE_3___default()(tempSegmentsOnFrame);
2304
3003
 
2305
3004
  // reset temp variables/buffers for new segment
2306
3005
  m = 0;
2307
3006
  tempBuffer = labelmapBufferArray[m].slice(0);
2308
- tempSegmentsOnFrame = lodash_clonedeep__WEBPACK_IMPORTED_MODULE_2___default()(segmentsOnFrameArray[m]);
3007
+ tempSegmentsOnFrame = lodash_clonedeep__WEBPACK_IMPORTED_MODULE_3___default()(segmentsOnFrameArray[m]);
2309
3008
  }
2310
3009
  }
2311
3010
  var getSegmentIndex = function getSegmentIndex(multiframe, frame) {
@@ -2314,60 +3013,93 @@ var getSegmentIndex = function getSegmentIndex(multiframe, frame) {
2314
3013
  var PerFrameFunctionalGroups = PerFrameFunctionalGroupsSequence[frame];
2315
3014
  return PerFrameFunctionalGroups && PerFrameFunctionalGroups.SegmentIdentificationSequence ? PerFrameFunctionalGroups.SegmentIdentificationSequence.ReferencedSegmentNumber : SharedFunctionalGroupsSequence.SegmentIdentificationSequence ? SharedFunctionalGroupsSequence.SegmentIdentificationSequence.ReferencedSegmentNumber : undefined;
2316
3015
  };
2317
- function insertPixelDataPlanar(segmentsOnFrame, segmentsOnFrameArray, labelmapBufferArray, pixelData, multiframe, imageIds, validOrientations, metadataProvider, tolerance) {
3016
+ function insertPixelDataPlanar(segmentsOnFrame, segmentsOnFrameArray, labelmapBufferArray, pixelData, multiframe, imageIds, validOrientations, metadataProvider, tolerance, TypedArrayConstructor, segmentsPixelIndices, sopUIDImageIdIndexMap, imageIdMaps, eventTarget, triggerEvent) {
2318
3017
  var SharedFunctionalGroupsSequence = multiframe.SharedFunctionalGroupsSequence,
2319
3018
  PerFrameFunctionalGroupsSequence = multiframe.PerFrameFunctionalGroupsSequence,
2320
3019
  Rows = multiframe.Rows,
2321
3020
  Columns = multiframe.Columns;
2322
3021
  var sharedImageOrientationPatient = SharedFunctionalGroupsSequence.PlaneOrientationSequence ? SharedFunctionalGroupsSequence.PlaneOrientationSequence.ImageOrientationPatient : undefined;
2323
3022
  var sliceLength = Columns * Rows;
2324
- var _loop5 = function _loop5() {
2325
- var PerFrameFunctionalGroups = PerFrameFunctionalGroupsSequence[i];
2326
- var ImageOrientationPatientI = sharedImageOrientationPatient || PerFrameFunctionalGroups.PlaneOrientationSequence.ImageOrientationPatient;
2327
- var pixelDataI2D = ndarray__WEBPACK_IMPORTED_MODULE_1___default()(new Uint8Array(pixelData.buffer, i * sliceLength, sliceLength), [Rows, Columns]);
2328
- var alignedPixelDataI = alignPixelDataWithSourceData(pixelDataI2D, ImageOrientationPatientI, validOrientations, tolerance);
2329
- if (!alignedPixelDataI) {
2330
- throw new Error("Individual SEG frames are out of plane with respect to the first SEG frame. " + "This is not yet supported. Aborting segmentation loading.");
2331
- }
2332
- var segmentIndex = getSegmentIndex(multiframe, i);
2333
- if (segmentIndex === undefined) {
2334
- throw new Error("Could not retrieve the segment index. Aborting segmentation loading.");
2335
- }
2336
- var imageId = findReferenceSourceImageId(multiframe, i, imageIds, metadataProvider, tolerance);
2337
- if (!imageId) {
2338
- console.warn("Image not present in stack, can't import frame : " + i + ".");
2339
- return "continue";
2340
- }
2341
- var sourceImageMetadata = metadataProvider.get("instance", imageId);
2342
- if (Rows !== sourceImageMetadata.Rows || Columns !== sourceImageMetadata.Columns) {
2343
- throw new Error("Individual SEG frames have different geometry dimensions (Rows and Columns) " + "respect to the source image reference frame. This is not yet supported. " + "Aborting segmentation loading. ");
2344
- }
2345
- var imageIdIndex = imageIds.findIndex(function (element) {
2346
- return element === imageId;
2347
- });
2348
- var byteOffset = sliceLength * 2 * imageIdIndex; // 2 bytes/pixel
2349
-
2350
- var labelmap2DView = new Uint16Array(labelmapBufferArray[0], byteOffset, sliceLength);
2351
- var data = alignedPixelDataI.data;
2352
- for (var j = 0, len = alignedPixelDataI.data.length; j < len; ++j) {
2353
- if (data[j]) {
2354
- for (var x = j; x < len; ++x) {
2355
- if (data[x]) {
2356
- labelmap2DView[x] = segmentIndex;
2357
- }
3023
+ var i = 0;
3024
+ var groupsLen = PerFrameFunctionalGroupsSequence.length;
3025
+ var chunkSize = Math.ceil(groupsLen / 10); // 10% of total length
3026
+
3027
+ var shouldTriggerEvent = triggerEvent && eventTarget;
3028
+
3029
+ // Below, we chunk the processing of the frames to avoid blocking the main thread
3030
+ // if the segmentation is large. We also use a promise to allow the caller to
3031
+ // wait for the processing to finish.
3032
+ return new Promise(function (resolve) {
3033
+ function processInChunks() {
3034
+ // process one chunk
3035
+ for (var end = Math.min(i + chunkSize, groupsLen); i < end; ++i) {
3036
+ var PerFrameFunctionalGroups = PerFrameFunctionalGroupsSequence[i];
3037
+ var ImageOrientationPatientI = sharedImageOrientationPatient || PerFrameFunctionalGroups.PlaneOrientationSequence.ImageOrientationPatient;
3038
+ var view = readFromUnpackedChunks(pixelData, i * sliceLength, sliceLength);
3039
+ var pixelDataI2D = ndarray__WEBPACK_IMPORTED_MODULE_2___default()(view, [Rows, Columns]);
3040
+ var alignedPixelDataI = alignPixelDataWithSourceData(pixelDataI2D, ImageOrientationPatientI, validOrientations, tolerance);
3041
+ if (!alignedPixelDataI) {
3042
+ throw new Error("Individual SEG frames are out of plane with respect to the first SEG frame. " + "This is not yet supported. Aborting segmentation loading.");
2358
3043
  }
2359
- if (!segmentsOnFrame[imageIdIndex]) {
2360
- segmentsOnFrame[imageIdIndex] = [];
3044
+ var segmentIndex = getSegmentIndex(multiframe, i);
3045
+ if (segmentIndex === undefined) {
3046
+ throw new Error("Could not retrieve the segment index. Aborting segmentation loading.");
2361
3047
  }
2362
- segmentsOnFrame[imageIdIndex].push(segmentIndex);
2363
- break;
3048
+ if (!segmentsPixelIndices.has(segmentIndex)) {
3049
+ segmentsPixelIndices.set(segmentIndex, {});
3050
+ }
3051
+ var imageId = findReferenceSourceImageId(multiframe, i, imageIds, metadataProvider, tolerance, sopUIDImageIdIndexMap);
3052
+ if (!imageId) {
3053
+ console.warn("Image not present in stack, can't import frame : " + i + ".");
3054
+ continue;
3055
+ }
3056
+ var sourceImageMetadata = imageIdMaps.metadata[imageId];
3057
+ if (Rows !== sourceImageMetadata.Rows || Columns !== sourceImageMetadata.Columns) {
3058
+ throw new Error("Individual SEG frames have different geometry dimensions (Rows and Columns) " + "respect to the source image reference frame. This is not yet supported. " + "Aborting segmentation loading. ");
3059
+ }
3060
+ var imageIdIndex = imageIdMaps.indices[imageId];
3061
+ var byteOffset = sliceLength * imageIdIndex * TypedArrayConstructor.BYTES_PER_ELEMENT;
3062
+ var labelmap2DView = new TypedArrayConstructor(labelmapBufferArray[0], byteOffset, sliceLength);
3063
+ var data = alignedPixelDataI.data;
3064
+ var indexCache = [];
3065
+ for (var j = 0, len = alignedPixelDataI.data.length; j < len; ++j) {
3066
+ if (data[j]) {
3067
+ for (var x = j; x < len; ++x) {
3068
+ if (data[x]) {
3069
+ labelmap2DView[x] = segmentIndex;
3070
+ indexCache.push(x);
3071
+ }
3072
+ }
3073
+ if (!segmentsOnFrame[imageIdIndex]) {
3074
+ segmentsOnFrame[imageIdIndex] = [];
3075
+ }
3076
+ segmentsOnFrame[imageIdIndex].push(segmentIndex);
3077
+ break;
3078
+ }
3079
+ }
3080
+ var segmentIndexObject = segmentsPixelIndices.get(segmentIndex);
3081
+ segmentIndexObject[imageIdIndex] = indexCache;
3082
+ segmentsPixelIndices.set(segmentIndex, segmentIndexObject);
3083
+ }
3084
+
3085
+ // trigger an event after each chunk
3086
+ if (shouldTriggerEvent) {
3087
+ var percentComplete = Math.round(i / groupsLen * 100);
3088
+ triggerEvent(eventTarget, Events$1.SEGMENTATION_LOAD_PROGRESS, {
3089
+ percentComplete: percentComplete
3090
+ });
3091
+ }
3092
+
3093
+ // schedule next chunk
3094
+ if (i < groupsLen) {
3095
+ setTimeout(processInChunks, 0);
3096
+ } else {
3097
+ // resolve the Promise when all chunks have been processed
3098
+ resolve();
2364
3099
  }
2365
3100
  }
2366
- };
2367
- for (var i = 0, groupsLen = PerFrameFunctionalGroupsSequence.length; i < groupsLen; ++i) {
2368
- var _ret3 = _loop5();
2369
- if (_ret3 === "continue") continue;
2370
- }
3101
+ processInChunks();
3102
+ });
2371
3103
  }
2372
3104
  function checkOrientation(multiframe, validOrientations, sourceDataDimensions, tolerance) {
2373
3105
  var SharedFunctionalGroupsSequence = multiframe.SharedFunctionalGroupsSequence,
@@ -2406,12 +3138,13 @@ function checkIfPerpendicular(iop1, iop2, tolerance) {
2406
3138
  }
2407
3139
 
2408
3140
  /**
2409
- * unpackPixelData - Unpacks bitpacked pixelData if the Segmentation is BINARY.
3141
+ * unpackPixelData - Unpacks bit packed pixelData if the Segmentation is BINARY.
2410
3142
  *
2411
3143
  * @param {Object} multiframe The multiframe dataset.
3144
+ * @param {Object} options Options for the unpacking.
2412
3145
  * @return {Uint8Array} The unpacked pixelData.
2413
3146
  */
2414
- function unpackPixelData(multiframe) {
3147
+ function unpackPixelData(multiframe, options) {
2415
3148
  var segType = multiframe.SegmentationType;
2416
3149
  var data;
2417
3150
  if (Array.isArray(multiframe.PixelData)) {
@@ -2423,7 +3156,10 @@ function unpackPixelData(multiframe) {
2423
3156
  dcmjs__WEBPACK_IMPORTED_MODULE_0__/* .log */ .cM.error("This segmentation pixeldata is undefined.");
2424
3157
  }
2425
3158
  if (segType === "BINARY") {
2426
- return BitArray$1.unpack(data);
3159
+ // For extreme big data, we can't unpack the data at once and we need to
3160
+ // chunk it and unpack each chunk separately.
3161
+ // MAX 2GB is the limit right now to allocate a buffer
3162
+ return getUnpackedChunks(data, options.maxBytesPerChunk);
2427
3163
  }
2428
3164
  var pixelData = new Uint8Array(data);
2429
3165
  var max = multiframe.MaximumFractionalValue;
@@ -2437,20 +3173,35 @@ function unpackPixelData(multiframe) {
2437
3173
  dcmjs__WEBPACK_IMPORTED_MODULE_0__/* .log */ .cM.warn("This segmentation object is actually binary... processing as such.");
2438
3174
  return pixelData;
2439
3175
  }
3176
+ function getUnpackedChunks(data, maxBytesPerChunk) {
3177
+ var bitArray = new Uint8Array(data);
3178
+ var chunks = [];
3179
+ var maxBitsPerChunk = maxBytesPerChunk * 8;
3180
+ var numberOfChunks = Math.ceil(bitArray.length * 8 / maxBitsPerChunk);
3181
+ for (var i = 0; i < numberOfChunks; i++) {
3182
+ var startBit = i * maxBitsPerChunk;
3183
+ var endBit = Math.min(startBit + maxBitsPerChunk, bitArray.length * 8);
3184
+ var startByte = Math.floor(startBit / 8);
3185
+ var endByte = Math.ceil(endBit / 8);
3186
+ var chunk = bitArray.slice(startByte, endByte);
3187
+ var unpackedChunk = BitArray$1.unpack(chunk);
3188
+ chunks.push(unpackedChunk);
3189
+ }
3190
+ return chunks;
3191
+ }
2440
3192
 
2441
3193
  /**
2442
- * getImageIdOfSourceImagebySourceImageSequence - Returns the Cornerstone imageId of the source image.
3194
+ * getImageIdOfSourceImageBySourceImageSequence - Returns the Cornerstone imageId of the source image.
2443
3195
  *
2444
3196
  * @param {Object} SourceImageSequence Sequence describing the source image.
2445
3197
  * @param {String[]} imageIds A list of imageIds.
2446
- * @param {Object} metadataProvider A Cornerstone metadataProvider to query
2447
- * metadata from imageIds.
3198
+ * @param {Object} sopUIDImageIdIndexMap A map of SOPInstanceUIDs to imageIds.
2448
3199
  * @return {String} The corresponding imageId.
2449
3200
  */
2450
- function getImageIdOfSourceImagebySourceImageSequence(SourceImageSequence, imageIds, metadataProvider) {
3201
+ function getImageIdOfSourceImageBySourceImageSequence(SourceImageSequence, sopUIDImageIdIndexMap) {
2451
3202
  var ReferencedSOPInstanceUID = SourceImageSequence.ReferencedSOPInstanceUID,
2452
3203
  ReferencedFrameNumber = SourceImageSequence.ReferencedFrameNumber;
2453
- return ReferencedFrameNumber ? getImageIdOfReferencedFrame(ReferencedSOPInstanceUID, ReferencedFrameNumber, imageIds, metadataProvider) : getImageIdOfReferencedSingleFramedSOPInstance(ReferencedSOPInstanceUID, imageIds, metadataProvider);
3204
+ return ReferencedFrameNumber ? getImageIdOfReferencedFrame(ReferencedSOPInstanceUID, ReferencedFrameNumber, sopUIDImageIdIndexMap) : sopUIDImageIdIndexMap[ReferencedSOPInstanceUID];
2454
3205
  }
2455
3206
 
2456
3207
  /**
@@ -2460,7 +3211,7 @@ function getImageIdOfSourceImagebySourceImageSequence(SourceImageSequence, image
2460
3211
  * @param {String} FrameOfReferenceUID Frame of reference.
2461
3212
  * @param {Object} PerFrameFunctionalGroup Sequence describing segmentation reference attributes per frame.
2462
3213
  * @param {String[]} imageIds A list of imageIds.
2463
- * @param {Object} metadataProvider A Cornerstone metadataProvider to query
3214
+ * @param {Object} sopUIDImageIdIndexMap A map of SOPInstanceUIDs to imageIds.
2464
3215
  * @param {Float} tolerance The tolerance parameter
2465
3216
  *
2466
3217
  * @return {String} The corresponding imageId.
@@ -2480,26 +3231,6 @@ function getImageIdOfSourceImagebyGeometry(ReferencedSeriesInstanceUID, FrameOfR
2480
3231
  }
2481
3232
  }
2482
3233
 
2483
- /**
2484
- * getImageIdOfReferencedSingleFramedSOPInstance - Returns the imageId
2485
- * corresponding to the specified sopInstanceUid for single-frame images.
2486
- *
2487
- * @param {String} sopInstanceUid The sopInstanceUid of the desired image.
2488
- * @param {String[]} imageIds The list of imageIds.
2489
- * @param {Object} metadataProvider The metadataProvider to obtain sopInstanceUids
2490
- * from the cornerstone imageIds.
2491
- * @return {String} The imageId that corresponds to the sopInstanceUid.
2492
- */
2493
- function getImageIdOfReferencedSingleFramedSOPInstance(sopInstanceUid, imageIds, metadataProvider) {
2494
- return imageIds.find(function (imageId) {
2495
- var sopCommonModule = metadataProvider.get("sopCommonModule", imageId);
2496
- if (!sopCommonModule) {
2497
- return;
2498
- }
2499
- return sopCommonModule.sopInstanceUID === sopInstanceUid;
2500
- });
2501
- }
2502
-
2503
3234
  /**
2504
3235
  * getImageIdOfReferencedFrame - Returns the imageId corresponding to the
2505
3236
  * specified sopInstanceUid and frameNumber for multi-frame images.
@@ -2507,23 +3238,16 @@ function getImageIdOfReferencedSingleFramedSOPInstance(sopInstanceUid, imageIds,
2507
3238
  * @param {String} sopInstanceUid The sopInstanceUid of the desired image.
2508
3239
  * @param {Number} frameNumber The frame number.
2509
3240
  * @param {String} imageIds The list of imageIds.
2510
- * @param {Object} metadataProvider The metadataProvider to obtain sopInstanceUids
2511
- * from the cornerstone imageIds.
3241
+ * @param {Object} sopUIDImageIdIndexMap A map of SOPInstanceUIDs to imageIds.
2512
3242
  * @return {String} The imageId that corresponds to the sopInstanceUid.
2513
3243
  */
2514
- function getImageIdOfReferencedFrame(sopInstanceUid, frameNumber, imageIds, metadataProvider) {
2515
- var imageId = imageIds.find(function (imageId) {
2516
- var sopCommonModule = metadataProvider.get("sopCommonModule", imageId);
2517
- if (!sopCommonModule) {
2518
- return;
2519
- }
2520
- var imageIdFrameNumber = Number(imageId.split("frame=")[1]);
2521
- return (
2522
- //frameNumber is zero indexed for cornerstoneDICOMImageLoader image Ids.
2523
- sopCommonModule.sopInstanceUID === sopInstanceUid && imageIdFrameNumber === frameNumber - 1
2524
- );
2525
- });
2526
- return imageId;
3244
+ function getImageIdOfReferencedFrame(sopInstanceUid, frameNumber, sopUIDImageIdIndexMap) {
3245
+ var imageId = sopUIDImageIdIndexMap[sopInstanceUid];
3246
+ if (!imageId) {
3247
+ return;
3248
+ }
3249
+ var imageIdFrameNumber = Number(imageId.split("frame=")[1]);
3250
+ return imageIdFrameNumber === frameNumber - 1 ? imageId : undefined;
2527
3251
  }
2528
3252
 
2529
3253
  /**
@@ -2604,397 +3328,228 @@ function alignPixelDataWithSourceData(pixelData2D, iop, orientations, tolerance)
2604
3328
  * compareArrays - Returns true if array1 and array2 are equal
2605
3329
  * within a tolerance.
2606
3330
  *
2607
- * @param {Number[]} array1 - An array.
2608
- * @param {Number[]} array2 - An array.
2609
- * @param {Number} tolerance.
2610
- * @return {Boolean} True if array1 and array2 are equal.
2611
- */
2612
- function compareArrays(array1, array2, tolerance) {
2613
- if (array1.length != array2.length) {
2614
- return false;
2615
- }
2616
- for (var i = 0; i < array1.length; ++i) {
2617
- if (!nearlyEqual(array1[i], array2[i], tolerance)) {
2618
- return false;
2619
- }
2620
- }
2621
- return true;
2622
- }
2623
- function getSegmentMetadata(multiframe, seriesInstanceUid) {
2624
- var segmentSequence = multiframe.SegmentSequence;
2625
- var data = [];
2626
- if (Array.isArray(segmentSequence)) {
2627
- data = [undefined].concat(_toConsumableArray(segmentSequence));
2628
- } else {
2629
- // Only one segment, will be stored as an object.
2630
- data = [undefined, segmentSequence];
2631
- }
2632
- return {
2633
- seriesInstanceUid: seriesInstanceUid,
2634
- data: data
2635
- };
2636
- }
2637
-
2638
- var Segmentation$1 = {
2639
- generateSegmentation: generateSegmentation,
2640
- generateToolState: generateToolState,
2641
- fillSegmentation: fillSegmentation
2642
- };
2643
-
2644
- /**
2645
- * generateSegmentation - Generates a DICOM Segmentation object given cornerstoneTools data.
2646
- *
2647
- * @param {object[]} images An array of the cornerstone image objects.
2648
- * @param {Object|Object[]} labelmaps3DorBrushData For 4.X: The cornerstone `Labelmap3D` object, or an array of objects.
2649
- * For 3.X: the BrushData.
2650
- * @param {number} cornerstoneToolsVersion The cornerstoneTools major version to map against.
2651
- * @returns {Object}
2652
- */
2653
- function generateSegmentation(images, labelmaps3DorBrushData) {
2654
- var options = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {
2655
- includeSliceSpacing: true
2656
- };
2657
- var cornerstoneToolsVersion = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : 4;
2658
- if (cornerstoneToolsVersion === 4) {
2659
- return Segmentation$2.generateSegmentation(images, labelmaps3DorBrushData, options);
2660
- }
2661
- if (cornerstoneToolsVersion === 3) {
2662
- return Segmentation$3.generateSegmentation(images, labelmaps3DorBrushData, options);
2663
- }
2664
- console.warn("No generateSegmentation adapater for cornerstone version ".concat(cornerstoneToolsVersion, ", exiting."));
2665
- }
2666
-
2667
- /**
2668
- * generateToolState - Given a set of cornrstoneTools imageIds and a Segmentation buffer,
2669
- * derive cornerstoneTools toolState and brush metadata.
2670
- *
2671
- * @param {string[]} imageIds An array of the imageIds.
2672
- * @param {ArrayBuffer} arrayBuffer The SEG arrayBuffer.
2673
- * @param {*} metadataProvider
2674
- * @param {bool} skipOverlapping - skip checks for overlapping segs, default value false.
2675
- * @param {number} tolerance - default value 1.e-3.
2676
- * @param {number} cornerstoneToolsVersion - default value 4.
2677
- *
2678
- * @returns {Object} The toolState and an object from which the
2679
- * segment metadata can be derived.
2680
- */
2681
- function generateToolState(imageIds, arrayBuffer, metadataProvider) {
2682
- var skipOverlapping = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : false;
2683
- var tolerance = arguments.length > 4 && arguments[4] !== undefined ? arguments[4] : 1e-3;
2684
- var cornerstoneToolsVersion = arguments.length > 5 && arguments[5] !== undefined ? arguments[5] : 4;
2685
- if (cornerstoneToolsVersion === 4) {
2686
- return Segmentation$2.generateToolState(imageIds, arrayBuffer, metadataProvider, skipOverlapping, tolerance);
2687
- }
2688
- if (cornerstoneToolsVersion === 3) {
2689
- return Segmentation$3.generateToolState(imageIds, arrayBuffer, metadataProvider);
2690
- }
2691
- console.warn("No generateToolState adapater for cornerstone version ".concat(cornerstoneToolsVersion, ", exiting."));
2692
- }
2693
-
2694
- /**
2695
- * fillSegmentation - Fills a derived segmentation dataset with cornerstoneTools `LabelMap3D` data.
2696
- *
2697
- * @param {object[]} segmentation An empty segmentation derived dataset.
2698
- * @param {Object|Object[]} inputLabelmaps3D The cornerstone `Labelmap3D` object, or an array of objects.
2699
- * @param {Object} userOptions Options object to override default options.
2700
- * @returns {Blob} description
2701
- */
2702
- function fillSegmentation(segmentation, inputLabelmaps3D) {
2703
- var options = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {
2704
- includeSliceSpacing: true
2705
- };
2706
- var cornerstoneToolsVersion = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : 4;
2707
- if (cornerstoneToolsVersion === 4) {
2708
- return Segmentation$2.fillSegmentation(segmentation, inputLabelmaps3D, options);
2709
- }
2710
- console.warn("No generateSegmentation adapater for cornerstone version ".concat(cornerstoneToolsVersion, ", exiting."));
2711
- }
2712
-
2713
- var TID300CobbAngle$2 = dcmjs__WEBPACK_IMPORTED_MODULE_0__/* .utilities */ .hC.TID300.CobbAngle;
2714
- var COBB_ANGLE = "CobbAngle";
2715
- var CobbAngle$1 = /*#__PURE__*/function () {
2716
- function CobbAngle() {
2717
- _classCallCheck(this, CobbAngle);
2718
- }
2719
- _createClass(CobbAngle, null, [{
2720
- key: "getMeasurementData",
2721
- value:
2722
- // TODO: this function is required for all Cornerstone Tool Adapters, since it is called by MeasurementReport.
2723
- function getMeasurementData(MeasurementGroup) {
2724
- var _MeasurementReport$ge = MeasurementReport$1.getSetupMeasurementData(MeasurementGroup),
2725
- defaultState = _MeasurementReport$ge.defaultState,
2726
- NUMGroup = _MeasurementReport$ge.NUMGroup,
2727
- SCOORDGroup = _MeasurementReport$ge.SCOORDGroup;
2728
- var state = _objectSpread2(_objectSpread2({}, defaultState), {}, {
2729
- rAngle: NUMGroup.MeasuredValueSequence.NumericValue,
2730
- toolType: CobbAngle.toolType,
2731
- handles: {
2732
- start: {},
2733
- end: {},
2734
- start2: {
2735
- highlight: true,
2736
- drawnIndependently: true
2737
- },
2738
- end2: {
2739
- highlight: true,
2740
- drawnIndependently: true
2741
- },
2742
- textBox: {
2743
- hasMoved: false,
2744
- movesIndependently: false,
2745
- drawnIndependently: true,
2746
- allowedOutsideImage: true,
2747
- hasBoundingBox: true
2748
- }
2749
- }
2750
- });
2751
- var _SCOORDGroup$GraphicD = _slicedToArray(SCOORDGroup.GraphicData, 8);
2752
- state.handles.start.x = _SCOORDGroup$GraphicD[0];
2753
- state.handles.start.y = _SCOORDGroup$GraphicD[1];
2754
- state.handles.end.x = _SCOORDGroup$GraphicD[2];
2755
- state.handles.end.y = _SCOORDGroup$GraphicD[3];
2756
- state.handles.start2.x = _SCOORDGroup$GraphicD[4];
2757
- state.handles.start2.y = _SCOORDGroup$GraphicD[5];
2758
- state.handles.end2.x = _SCOORDGroup$GraphicD[6];
2759
- state.handles.end2.y = _SCOORDGroup$GraphicD[7];
2760
- return state;
2761
- }
2762
- }, {
2763
- key: "getTID300RepresentationArguments",
2764
- value: function getTID300RepresentationArguments(tool) {
2765
- var handles = tool.handles,
2766
- finding = tool.finding,
2767
- findingSites = tool.findingSites;
2768
- var point1 = handles.start;
2769
- var point2 = handles.end;
2770
- var point3 = handles.start2;
2771
- var point4 = handles.end2;
2772
- var rAngle = tool.rAngle;
2773
- var trackingIdentifierTextValue = "cornerstoneTools@^4.0.0:CobbAngle";
2774
- return {
2775
- point1: point1,
2776
- point2: point2,
2777
- point3: point3,
2778
- point4: point4,
2779
- rAngle: rAngle,
2780
- trackingIdentifierTextValue: trackingIdentifierTextValue,
2781
- finding: finding,
2782
- findingSites: findingSites || []
2783
- };
2784
- }
2785
- }]);
2786
- return CobbAngle;
2787
- }();
2788
- CobbAngle$1.toolType = COBB_ANGLE;
2789
- CobbAngle$1.utilityToolType = COBB_ANGLE;
2790
- CobbAngle$1.TID300Representation = TID300CobbAngle$2;
2791
- CobbAngle$1.isValidCornerstoneTrackingIdentifier = function (TrackingIdentifier) {
2792
- if (!TrackingIdentifier.includes(":")) {
2793
- return false;
2794
- }
2795
- var _TrackingIdentifier$s = TrackingIdentifier.split(":"),
2796
- _TrackingIdentifier$s2 = _slicedToArray(_TrackingIdentifier$s, 2),
2797
- cornerstone4Tag = _TrackingIdentifier$s2[0],
2798
- toolType = _TrackingIdentifier$s2[1];
2799
- if (cornerstone4Tag !== CORNERSTONE_4_TAG) {
2800
- return false;
2801
- }
2802
- return toolType === COBB_ANGLE;
2803
- };
2804
- MeasurementReport$1.registerTool(CobbAngle$1);
2805
-
2806
- var TID300Angle = dcmjs__WEBPACK_IMPORTED_MODULE_0__/* .utilities */ .hC.TID300.Angle;
2807
- var ANGLE = "Angle";
2808
- var Angle$1 = /*#__PURE__*/function () {
2809
- function Angle() {
2810
- _classCallCheck(this, Angle);
2811
- }
2812
- _createClass(Angle, null, [{
2813
- key: "getMeasurementData",
2814
- value:
2815
- /**
2816
- * Generate TID300 measurement data for a plane angle measurement - use a Angle, but label it as Angle
2817
- */
2818
- function getMeasurementData(MeasurementGroup) {
2819
- var _MeasurementReport$ge = MeasurementReport$1.getSetupMeasurementData(MeasurementGroup),
2820
- defaultState = _MeasurementReport$ge.defaultState,
2821
- NUMGroup = _MeasurementReport$ge.NUMGroup,
2822
- SCOORDGroup = _MeasurementReport$ge.SCOORDGroup;
2823
- var state = _objectSpread2(_objectSpread2({}, defaultState), {}, {
2824
- rAngle: NUMGroup.MeasuredValueSequence.NumericValue,
2825
- toolType: Angle.toolType,
2826
- handles: {
2827
- start: {},
2828
- middle: {},
2829
- end: {},
2830
- textBox: {
2831
- hasMoved: false,
2832
- movesIndependently: false,
2833
- drawnIndependently: true,
2834
- allowedOutsideImage: true,
2835
- hasBoundingBox: true
2836
- }
2837
- }
2838
- });
2839
- var _SCOORDGroup$GraphicD = _slicedToArray(SCOORDGroup.GraphicData, 8);
2840
- state.handles.start.x = _SCOORDGroup$GraphicD[0];
2841
- state.handles.start.y = _SCOORDGroup$GraphicD[1];
2842
- state.handles.middle.x = _SCOORDGroup$GraphicD[2];
2843
- state.handles.middle.y = _SCOORDGroup$GraphicD[3];
2844
- state.handles.middle.x = _SCOORDGroup$GraphicD[4];
2845
- state.handles.middle.y = _SCOORDGroup$GraphicD[5];
2846
- state.handles.end.x = _SCOORDGroup$GraphicD[6];
2847
- state.handles.end.y = _SCOORDGroup$GraphicD[7];
2848
- return state;
2849
- }
2850
- }, {
2851
- key: "getTID300RepresentationArguments",
2852
- value: function getTID300RepresentationArguments(tool) {
2853
- var handles = tool.handles,
2854
- finding = tool.finding,
2855
- findingSites = tool.findingSites;
2856
- var point1 = handles.start;
2857
- var point2 = handles.middle;
2858
- var point3 = handles.middle;
2859
- var point4 = handles.end;
2860
- var rAngle = tool.rAngle;
2861
- var trackingIdentifierTextValue = "cornerstoneTools@^4.0.0:Angle";
2862
- return {
2863
- point1: point1,
2864
- point2: point2,
2865
- point3: point3,
2866
- point4: point4,
2867
- rAngle: rAngle,
2868
- trackingIdentifierTextValue: trackingIdentifierTextValue,
2869
- finding: finding,
2870
- findingSites: findingSites || []
2871
- };
2872
- }
2873
- }]);
2874
- return Angle;
2875
- }();
2876
- Angle$1.toolType = ANGLE;
2877
- Angle$1.utilityToolType = ANGLE;
2878
- Angle$1.TID300Representation = TID300Angle;
2879
- Angle$1.isValidCornerstoneTrackingIdentifier = function (TrackingIdentifier) {
2880
- if (!TrackingIdentifier.includes(":")) {
3331
+ * @param {Number[]} array1 - An array.
3332
+ * @param {Number[]} array2 - An array.
3333
+ * @param {Number} tolerance.
3334
+ * @return {Boolean} True if array1 and array2 are equal.
3335
+ */
3336
+ function compareArrays(array1, array2, tolerance) {
3337
+ if (array1.length != array2.length) {
2881
3338
  return false;
2882
3339
  }
2883
- var _TrackingIdentifier$s = TrackingIdentifier.split(":"),
2884
- _TrackingIdentifier$s2 = _slicedToArray(_TrackingIdentifier$s, 2),
2885
- cornerstone4Tag = _TrackingIdentifier$s2[0],
2886
- toolType = _TrackingIdentifier$s2[1];
2887
- if (cornerstone4Tag !== CORNERSTONE_4_TAG) {
2888
- return false;
3340
+ for (var i = 0; i < array1.length; ++i) {
3341
+ if (!nearlyEqual(array1[i], array2[i], tolerance)) {
3342
+ return false;
3343
+ }
2889
3344
  }
2890
- return toolType === ANGLE;
2891
- };
2892
- MeasurementReport$1.registerTool(Angle$1);
3345
+ return true;
3346
+ }
3347
+ function getSegmentMetadata(multiframe, seriesInstanceUid) {
3348
+ var segmentSequence = multiframe.SegmentSequence;
3349
+ var data = [];
3350
+ if (Array.isArray(segmentSequence)) {
3351
+ data = [undefined].concat(_toConsumableArray(segmentSequence));
3352
+ } else {
3353
+ // Only one segment, will be stored as an object.
3354
+ data = [undefined, segmentSequence];
3355
+ }
3356
+ return {
3357
+ seriesInstanceUid: seriesInstanceUid,
3358
+ data: data
3359
+ };
3360
+ }
2893
3361
 
2894
- var TID300Polyline$2 = dcmjs__WEBPACK_IMPORTED_MODULE_0__/* .utilities */ .hC.TID300.Polyline;
2895
- var RectangleRoi = /*#__PURE__*/function () {
2896
- function RectangleRoi() {
2897
- _classCallCheck(this, RectangleRoi);
3362
+ /**
3363
+ * Reads a range of bytes from an array of ArrayBuffer chunks and
3364
+ * aggregate them into a new Uint8Array.
3365
+ *
3366
+ * @param {ArrayBuffer[]} chunks - An array of ArrayBuffer chunks.
3367
+ * @param {number} offset - The offset of the first byte to read.
3368
+ * @param {number} length - The number of bytes to read.
3369
+ * @returns {Uint8Array} A new Uint8Array containing the requested bytes.
3370
+ */
3371
+ function readFromUnpackedChunks(chunks, offset, length) {
3372
+ var mapping = getUnpackedOffsetAndLength(chunks, offset, length);
3373
+
3374
+ // If all the data is in one chunk, we can just slice that chunk
3375
+ if (mapping.start.chunkIndex === mapping.end.chunkIndex) {
3376
+ return new Uint8Array(chunks[mapping.start.chunkIndex].buffer, mapping.start.offset, length);
3377
+ } else {
3378
+ // If the data spans multiple chunks, we need to create a new Uint8Array and copy the data from each chunk
3379
+ var result = new Uint8Array(length);
3380
+ var resultOffset = 0;
3381
+ for (var i = mapping.start.chunkIndex; i <= mapping.end.chunkIndex; i++) {
3382
+ var start = i === mapping.start.chunkIndex ? mapping.start.offset : 0;
3383
+ var end = i === mapping.end.chunkIndex ? mapping.end.offset : chunks[i].length;
3384
+ result.set(new Uint8Array(chunks[i].buffer, start, end - start), resultOffset);
3385
+ resultOffset += end - start;
3386
+ }
3387
+ return result;
2898
3388
  }
2899
- _createClass(RectangleRoi, null, [{
2900
- key: "getMeasurementData",
2901
- value: function getMeasurementData(MeasurementGroup) {
2902
- var _MeasurementReport$ge = MeasurementReport$1.getSetupMeasurementData(MeasurementGroup),
2903
- defaultState = _MeasurementReport$ge.defaultState,
2904
- SCOORDGroup = _MeasurementReport$ge.SCOORDGroup,
2905
- NUMGroup = _MeasurementReport$ge.NUMGroup;
2906
- var state = _objectSpread2(_objectSpread2({}, defaultState), {}, {
2907
- toolType: RectangleRoi.toolType,
2908
- handles: {
2909
- start: {},
2910
- end: {},
2911
- textBox: {
2912
- active: false,
2913
- hasMoved: false,
2914
- movesIndependently: false,
2915
- drawnIndependently: true,
2916
- allowedOutsideImage: true,
2917
- hasBoundingBox: true
2918
- },
2919
- initialRotation: 0
2920
- },
2921
- cachedStats: {
2922
- area: NUMGroup ? NUMGroup.MeasuredValueSequence.NumericValue : 0
2923
- },
2924
- color: undefined,
2925
- invalidated: true
2926
- });
2927
- var _SCOORDGroup$GraphicD = _slicedToArray(SCOORDGroup.GraphicData, 6);
2928
- state.handles.start.x = _SCOORDGroup$GraphicD[0];
2929
- state.handles.start.y = _SCOORDGroup$GraphicD[1];
2930
- _SCOORDGroup$GraphicD[2];
2931
- _SCOORDGroup$GraphicD[3];
2932
- state.handles.end.x = _SCOORDGroup$GraphicD[4];
2933
- state.handles.end.y = _SCOORDGroup$GraphicD[5];
2934
- return state;
3389
+ }
3390
+ function getUnpackedOffsetAndLength(chunks, offset, length) {
3391
+ var totalBytes = chunks.reduce(function (total, chunk) {
3392
+ return total + chunk.length;
3393
+ }, 0);
3394
+ if (offset < 0 || offset + length > totalBytes) {
3395
+ throw new Error("Offset and length out of bounds");
3396
+ }
3397
+ var startChunkIndex = 0;
3398
+ var startOffsetInChunk = offset;
3399
+ while (startOffsetInChunk >= chunks[startChunkIndex].length) {
3400
+ startOffsetInChunk -= chunks[startChunkIndex].length;
3401
+ startChunkIndex++;
3402
+ }
3403
+ var endChunkIndex = startChunkIndex;
3404
+ var endOffsetInChunk = startOffsetInChunk + length;
3405
+ while (endOffsetInChunk > chunks[endChunkIndex].length) {
3406
+ endOffsetInChunk -= chunks[endChunkIndex].length;
3407
+ endChunkIndex++;
3408
+ }
3409
+ return {
3410
+ start: {
3411
+ chunkIndex: startChunkIndex,
3412
+ offset: startOffsetInChunk
3413
+ },
3414
+ end: {
3415
+ chunkIndex: endChunkIndex,
3416
+ offset: endOffsetInChunk
2935
3417
  }
2936
- }, {
2937
- key: "getTID300RepresentationArguments",
2938
- value: function getTID300RepresentationArguments(tool) {
2939
- var finding = tool.finding,
2940
- findingSites = tool.findingSites,
2941
- _tool$cachedStats = tool.cachedStats,
2942
- cachedStats = _tool$cachedStats === void 0 ? {} : _tool$cachedStats,
2943
- handles = tool.handles;
2944
- var start = handles.start,
2945
- end = handles.end;
2946
- var points = [start, {
2947
- x: start.x,
2948
- y: end.y
2949
- }, end, {
2950
- x: end.x,
2951
- y: start.y
2952
- }];
2953
- var area = cachedStats.area,
2954
- perimeter = cachedStats.perimeter;
2955
- var trackingIdentifierTextValue = "cornerstoneTools@^4.0.0:RectangleRoi";
2956
- return {
2957
- points: points,
2958
- area: area,
2959
- perimeter: perimeter,
2960
- trackingIdentifierTextValue: trackingIdentifierTextValue,
2961
- finding: finding,
2962
- findingSites: findingSites || []
2963
- };
3418
+ };
3419
+ }
3420
+ function calculateCentroid(imageIdIndexBufferIndex, multiframe) {
3421
+ var xAcc = 0;
3422
+ var yAcc = 0;
3423
+ var zAcc = 0;
3424
+ var count = 0;
3425
+ for (var _i3 = 0, _Object$entries = Object.entries(imageIdIndexBufferIndex); _i3 < _Object$entries.length; _i3++) {
3426
+ var _Object$entries$_i = _slicedToArray(_Object$entries[_i3], 2),
3427
+ imageIdIndex = _Object$entries$_i[0],
3428
+ bufferIndices = _Object$entries$_i[1];
3429
+ var z = Number(imageIdIndex);
3430
+ if (!bufferIndices || bufferIndices.length === 0) {
3431
+ continue;
3432
+ }
3433
+ var _iterator2 = _createForOfIteratorHelper(bufferIndices),
3434
+ _step2;
3435
+ try {
3436
+ for (_iterator2.s(); !(_step2 = _iterator2.n()).done;) {
3437
+ var bufferIndex = _step2.value;
3438
+ var y = Math.floor(bufferIndex / multiframe.Rows);
3439
+ var x = bufferIndex % multiframe.Rows;
3440
+ xAcc += x;
3441
+ yAcc += y;
3442
+ zAcc += z;
3443
+ count++;
3444
+ }
3445
+ } catch (err) {
3446
+ _iterator2.e(err);
3447
+ } finally {
3448
+ _iterator2.f();
2964
3449
  }
2965
- }]);
2966
- return RectangleRoi;
2967
- }();
2968
- RectangleRoi.toolType = "RectangleRoi";
2969
- RectangleRoi.utilityToolType = "RectangleRoi";
2970
- RectangleRoi.TID300Representation = TID300Polyline$2;
2971
- RectangleRoi.isValidCornerstoneTrackingIdentifier = function (TrackingIdentifier) {
2972
- if (!TrackingIdentifier.includes(":")) {
2973
- return false;
2974
- }
2975
- var _TrackingIdentifier$s = TrackingIdentifier.split(":"),
2976
- _TrackingIdentifier$s2 = _slicedToArray(_TrackingIdentifier$s, 2),
2977
- cornerstone4Tag = _TrackingIdentifier$s2[0],
2978
- toolType = _TrackingIdentifier$s2[1];
2979
- if (cornerstone4Tag !== CORNERSTONE_4_TAG) {
2980
- return false;
2981
3450
  }
2982
- return toolType === RectangleRoi.toolType;
3451
+ return {
3452
+ xAcc: xAcc,
3453
+ yAcc: yAcc,
3454
+ zAcc: zAcc,
3455
+ count: count
3456
+ };
3457
+ }
3458
+ var Segmentation$4 = {
3459
+ generateSegmentation: generateSegmentation$2,
3460
+ generateToolState: generateToolState$2,
3461
+ fillSegmentation: fillSegmentation$1
2983
3462
  };
2984
- MeasurementReport$1.registerTool(RectangleRoi);
2985
3463
 
2986
- var Cornerstone = {
2987
- Length: Length$1,
2988
- FreehandRoi: FreehandRoi,
2989
- Bidirectional: Bidirectional$1,
2990
- EllipticalRoi: EllipticalRoi,
2991
- CircleRoi: CircleRoi,
2992
- ArrowAnnotate: ArrowAnnotate$1,
2993
- MeasurementReport: MeasurementReport$1,
2994
- Segmentation: Segmentation$1,
2995
- CobbAngle: CobbAngle$1,
2996
- Angle: Angle$1,
2997
- RectangleRoi: RectangleRoi
3464
+ var Segmentation$3 = {
3465
+ generateSegmentation: generateSegmentation$1,
3466
+ generateToolState: generateToolState$1,
3467
+ fillSegmentation: fillSegmentation
3468
+ };
3469
+
3470
+ /**
3471
+ * generateSegmentation - Generates a DICOM Segmentation object given cornerstoneTools data.
3472
+ *
3473
+ * @param {object[]} images An array of the cornerstone image objects.
3474
+ * @param {Object|Object[]} labelmaps3DorBrushData For 4.X: The cornerstone `Labelmap3D` object, or an array of objects.
3475
+ * For 3.X: the BrushData.
3476
+ * @param {number} cornerstoneToolsVersion The cornerstoneTools major version to map against.
3477
+ * @returns {Object}
3478
+ */
3479
+ function generateSegmentation$1(images, labelmaps3DorBrushData) {
3480
+ var options = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {
3481
+ includeSliceSpacing: true
3482
+ };
3483
+ var cornerstoneToolsVersion = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : 4;
3484
+ if (cornerstoneToolsVersion === 4) {
3485
+ return Segmentation$4.generateSegmentation(images, labelmaps3DorBrushData, options);
3486
+ }
3487
+ if (cornerstoneToolsVersion === 3) {
3488
+ return Segmentation$5.generateSegmentation(images, labelmaps3DorBrushData, options);
3489
+ }
3490
+ console.warn("No generateSegmentation adapater for cornerstone version ".concat(cornerstoneToolsVersion, ", exiting."));
3491
+ }
3492
+
3493
+ /**
3494
+ * generateToolState - Given a set of cornrstoneTools imageIds and a Segmentation buffer,
3495
+ * derive cornerstoneTools toolState and brush metadata.
3496
+ *
3497
+ * @param {string[]} imageIds An array of the imageIds.
3498
+ * @param {ArrayBuffer} arrayBuffer The SEG arrayBuffer.
3499
+ * @param {*} metadataProvider
3500
+ * @param {bool} skipOverlapping - skip checks for overlapping segs, default value false.
3501
+ * @param {number} tolerance - default value 1.e-3.
3502
+ * @param {number} cornerstoneToolsVersion - default value 4.
3503
+ *
3504
+ * @returns {Object} The toolState and an object from which the
3505
+ * segment metadata can be derived.
3506
+ */
3507
+ function generateToolState$1(imageIds, arrayBuffer, metadataProvider) {
3508
+ var skipOverlapping = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : false;
3509
+ var tolerance = arguments.length > 4 && arguments[4] !== undefined ? arguments[4] : 1e-3;
3510
+ var cornerstoneToolsVersion = arguments.length > 5 && arguments[5] !== undefined ? arguments[5] : 4;
3511
+ if (cornerstoneToolsVersion === 4) {
3512
+ return Segmentation$4.generateToolState(imageIds, arrayBuffer, metadataProvider, skipOverlapping, tolerance);
3513
+ }
3514
+ if (cornerstoneToolsVersion === 3) {
3515
+ return Segmentation$5.generateToolState(imageIds, arrayBuffer, metadataProvider);
3516
+ }
3517
+ console.warn("No generateToolState adapater for cornerstone version ".concat(cornerstoneToolsVersion, ", exiting."));
3518
+ }
3519
+
3520
+ /**
3521
+ * fillSegmentation - Fills a derived segmentation dataset with cornerstoneTools `LabelMap3D` data.
3522
+ *
3523
+ * @param {object[]} segmentation An empty segmentation derived dataset.
3524
+ * @param {Object|Object[]} inputLabelmaps3D The cornerstone `Labelmap3D` object, or an array of objects.
3525
+ * @param {Object} userOptions Options object to override default options.
3526
+ * @returns {Blob} description
3527
+ */
3528
+ function fillSegmentation(segmentation, inputLabelmaps3D) {
3529
+ var options = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {
3530
+ includeSliceSpacing: true
3531
+ };
3532
+ var cornerstoneToolsVersion = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : 4;
3533
+ if (cornerstoneToolsVersion === 4) {
3534
+ return Segmentation$4.fillSegmentation(segmentation, inputLabelmaps3D, options);
3535
+ }
3536
+ console.warn("No generateSegmentation adapater for cornerstone version ".concat(cornerstoneToolsVersion, ", exiting."));
3537
+ }
3538
+
3539
+ var CornerstoneSR = {
3540
+ Length: Length$1,
3541
+ FreehandRoi: FreehandRoi,
3542
+ Bidirectional: Bidirectional$1,
3543
+ EllipticalRoi: EllipticalRoi,
3544
+ CircleRoi: CircleRoi,
3545
+ ArrowAnnotate: ArrowAnnotate$1,
3546
+ MeasurementReport: MeasurementReport$1,
3547
+ CobbAngle: CobbAngle$1,
3548
+ Angle: Angle$1,
3549
+ RectangleRoi: RectangleRoi
3550
+ };
3551
+ var CornerstoneSEG = {
3552
+ Segmentation: Segmentation$3
2998
3553
  };
2999
3554
 
3000
3555
  /******************************************************************************
@@ -3049,7 +3604,7 @@ var CodingScheme = {
3049
3604
 
3050
3605
  var TID1500 = dcmjs__WEBPACK_IMPORTED_MODULE_0__/* .utilities */ .hC.TID1500, addAccessors = dcmjs__WEBPACK_IMPORTED_MODULE_0__/* .utilities */ .hC.addAccessors;
3051
3606
  var StructuredReport = dcmjs__WEBPACK_IMPORTED_MODULE_0__/* .derivations */ .U7.StructuredReport;
3052
- var Normalizer = dcmjs__WEBPACK_IMPORTED_MODULE_0__/* .normalizers */ .oq.Normalizer;
3607
+ var Normalizer$1 = dcmjs__WEBPACK_IMPORTED_MODULE_0__/* .normalizers */ .oq.Normalizer;
3053
3608
  var TID1500MeasurementReport = TID1500.TID1500MeasurementReport, TID1501MeasurementGroup = TID1500.TID1501MeasurementGroup;
3054
3609
  var DicomMetaDictionary = dcmjs__WEBPACK_IMPORTED_MODULE_0__/* .data */ .aT.DicomMetaDictionary;
3055
3610
  var FINDING = { CodingSchemeDesignator: "DCM", CodeValue: "121071" };
@@ -3218,7 +3773,7 @@ var MeasurementReport = /** @class */ (function () {
3218
3773
  if ((instance &&
3219
3774
  instance.NumberOfFrames &&
3220
3775
  instance.NumberOfFrames > 1) ||
3221
- Normalizer.isMultiframeSOPClassUID(sopClassUID)) {
3776
+ Normalizer$1.isMultiframeSOPClassUID(sopClassUID)) {
3222
3777
  ReferencedSOPSequence.ReferencedFrameNumber = frameNumber;
3223
3778
  }
3224
3779
  // Loop through each tool type for the image
@@ -3853,26 +4408,26 @@ var EllipticalROI = /** @class */ (function () {
3853
4408
  ]);
3854
4409
  pointsWorld.push(worldPos);
3855
4410
  }
3856
- var majorAxisStart = gl_matrix__WEBPACK_IMPORTED_MODULE_3__/* .vec3.fromValues */ .R3.fromValues.apply(gl_matrix__WEBPACK_IMPORTED_MODULE_3__/* .vec3 */ .R3, pointsWorld[0]);
3857
- var majorAxisEnd = gl_matrix__WEBPACK_IMPORTED_MODULE_3__/* .vec3.fromValues */ .R3.fromValues.apply(gl_matrix__WEBPACK_IMPORTED_MODULE_3__/* .vec3 */ .R3, pointsWorld[1]);
3858
- var minorAxisStart = gl_matrix__WEBPACK_IMPORTED_MODULE_3__/* .vec3.fromValues */ .R3.fromValues.apply(gl_matrix__WEBPACK_IMPORTED_MODULE_3__/* .vec3 */ .R3, pointsWorld[2]);
3859
- var minorAxisEnd = gl_matrix__WEBPACK_IMPORTED_MODULE_3__/* .vec3.fromValues */ .R3.fromValues.apply(gl_matrix__WEBPACK_IMPORTED_MODULE_3__/* .vec3 */ .R3, pointsWorld[3]);
3860
- var majorAxisVec = gl_matrix__WEBPACK_IMPORTED_MODULE_3__/* .vec3.create */ .R3.create();
3861
- gl_matrix__WEBPACK_IMPORTED_MODULE_3__/* .vec3.sub */ .R3.sub(majorAxisVec, majorAxisEnd, majorAxisStart);
4411
+ var majorAxisStart = gl_matrix__WEBPACK_IMPORTED_MODULE_4__/* .vec3.fromValues */ .R3.fromValues.apply(gl_matrix__WEBPACK_IMPORTED_MODULE_4__/* .vec3 */ .R3, pointsWorld[0]);
4412
+ var majorAxisEnd = gl_matrix__WEBPACK_IMPORTED_MODULE_4__/* .vec3.fromValues */ .R3.fromValues.apply(gl_matrix__WEBPACK_IMPORTED_MODULE_4__/* .vec3 */ .R3, pointsWorld[1]);
4413
+ var minorAxisStart = gl_matrix__WEBPACK_IMPORTED_MODULE_4__/* .vec3.fromValues */ .R3.fromValues.apply(gl_matrix__WEBPACK_IMPORTED_MODULE_4__/* .vec3 */ .R3, pointsWorld[2]);
4414
+ var minorAxisEnd = gl_matrix__WEBPACK_IMPORTED_MODULE_4__/* .vec3.fromValues */ .R3.fromValues.apply(gl_matrix__WEBPACK_IMPORTED_MODULE_4__/* .vec3 */ .R3, pointsWorld[3]);
4415
+ var majorAxisVec = gl_matrix__WEBPACK_IMPORTED_MODULE_4__/* .vec3.create */ .R3.create();
4416
+ gl_matrix__WEBPACK_IMPORTED_MODULE_4__/* .vec3.sub */ .R3.sub(majorAxisVec, majorAxisEnd, majorAxisStart);
3862
4417
  // normalize majorAxisVec to avoid scaling issues
3863
- gl_matrix__WEBPACK_IMPORTED_MODULE_3__/* .vec3.normalize */ .R3.normalize(majorAxisVec, majorAxisVec);
3864
- var minorAxisVec = gl_matrix__WEBPACK_IMPORTED_MODULE_3__/* .vec3.create */ .R3.create();
3865
- gl_matrix__WEBPACK_IMPORTED_MODULE_3__/* .vec3.sub */ .R3.sub(minorAxisVec, minorAxisEnd, minorAxisStart);
3866
- gl_matrix__WEBPACK_IMPORTED_MODULE_3__/* .vec3.normalize */ .R3.normalize(minorAxisVec, minorAxisVec);
4418
+ gl_matrix__WEBPACK_IMPORTED_MODULE_4__/* .vec3.normalize */ .R3.normalize(majorAxisVec, majorAxisVec);
4419
+ var minorAxisVec = gl_matrix__WEBPACK_IMPORTED_MODULE_4__/* .vec3.create */ .R3.create();
4420
+ gl_matrix__WEBPACK_IMPORTED_MODULE_4__/* .vec3.sub */ .R3.sub(minorAxisVec, minorAxisEnd, minorAxisStart);
4421
+ gl_matrix__WEBPACK_IMPORTED_MODULE_4__/* .vec3.normalize */ .R3.normalize(minorAxisVec, minorAxisVec);
3867
4422
  var imagePlaneModule = metadata.get("imagePlaneModule", referencedImageId);
3868
4423
  if (!imagePlaneModule) {
3869
4424
  throw new Error("imageId does not have imagePlaneModule metadata");
3870
4425
  }
3871
4426
  var columnCosines = imagePlaneModule.columnCosines;
3872
4427
  // find which axis is parallel to the columnCosines
3873
- var columnCosinesVec = gl_matrix__WEBPACK_IMPORTED_MODULE_3__/* .vec3.fromValues */ .R3.fromValues(columnCosines[0], columnCosines[1], columnCosines[2]);
3874
- var projectedMajorAxisOnColVec = gl_matrix__WEBPACK_IMPORTED_MODULE_3__/* .vec3.dot */ .R3.dot(columnCosinesVec, majorAxisVec);
3875
- var projectedMinorAxisOnColVec = gl_matrix__WEBPACK_IMPORTED_MODULE_3__/* .vec3.dot */ .R3.dot(columnCosinesVec, minorAxisVec);
4428
+ var columnCosinesVec = gl_matrix__WEBPACK_IMPORTED_MODULE_4__/* .vec3.fromValues */ .R3.fromValues(columnCosines[0], columnCosines[1], columnCosines[2]);
4429
+ var projectedMajorAxisOnColVec = gl_matrix__WEBPACK_IMPORTED_MODULE_4__/* .vec3.dot */ .R3.dot(columnCosinesVec, majorAxisVec);
4430
+ var projectedMinorAxisOnColVec = gl_matrix__WEBPACK_IMPORTED_MODULE_4__/* .vec3.dot */ .R3.dot(columnCosinesVec, minorAxisVec);
3876
4431
  var absoluteOfMajorDotProduct = Math.abs(projectedMajorAxisOnColVec);
3877
4432
  var absoluteOfMinorDotProduct = Math.abs(projectedMinorAxisOnColVec);
3878
4433
  var ellipsePoints = [];
@@ -4177,7 +4732,7 @@ var PlanarFreehandROI = /** @class */ (function () {
4177
4732
  ]);
4178
4733
  worldCoords.push(point);
4179
4734
  }
4180
- var distanceBetweenFirstAndLastPoint = gl_matrix__WEBPACK_IMPORTED_MODULE_3__/* .vec3.distance */ .R3.distance(worldCoords[worldCoords.length - 1], worldCoords[0]);
4735
+ var distanceBetweenFirstAndLastPoint = gl_matrix__WEBPACK_IMPORTED_MODULE_4__/* .vec3.distance */ .R3.distance(worldCoords[worldCoords.length - 1], worldCoords[0]);
4181
4736
  var isOpenContour = true;
4182
4737
  // If the contour is closed, this should have been encoded as exactly the same point, so check for a very small difference.
4183
4738
  if (distanceBetweenFirstAndLastPoint < closedContourThreshold) {
@@ -4329,7 +4884,116 @@ Probe.isValidCornerstoneTrackingIdentifier = function (TrackingIdentifier) {
4329
4884
  };
4330
4885
  MeasurementReport.registerTool(Probe);
4331
4886
 
4332
- var Cornerstone3D = {
4887
+ var Normalizer = dcmjs__WEBPACK_IMPORTED_MODULE_0__/* .normalizers */ .oq.Normalizer;
4888
+ var SegmentationDerivation = dcmjs__WEBPACK_IMPORTED_MODULE_0__/* .derivations */ .U7.Segmentation;
4889
+ /**
4890
+ * generateSegmentation - Generates a DICOM Segmentation object given cornerstoneTools data.
4891
+ *
4892
+ * @param images - An array of the cornerstone image objects, which includes imageId and metadata
4893
+ * @param labelmaps - An array of the 3D Volumes that contain the segmentation data.
4894
+ */
4895
+ function generateSegmentation(images, labelmaps, metadata, options) {
4896
+ if (options === void 0) { options = {}; }
4897
+ var segmentation = _createMultiframeSegmentationFromReferencedImages(images, metadata, options);
4898
+ return fillSegmentation$1(segmentation, labelmaps, options);
4899
+ }
4900
+ /**
4901
+ * _createMultiframeSegmentationFromReferencedImages - description
4902
+ *
4903
+ * @param images - An array of the cornerstone image objects related to the reference
4904
+ * series that the segmentation is derived from. You can use methods such as
4905
+ * volume.getCornerstoneImages() to get this array.
4906
+ *
4907
+ * @param options - the options object for the SegmentationDerivation.
4908
+ * @returns The Seg derived dataSet.
4909
+ */
4910
+ function _createMultiframeSegmentationFromReferencedImages(images, metadata, options) {
4911
+ var datasets = images.map(function (image) {
4912
+ // add the sopClassUID to the dataset
4913
+ var instance = metadata.get("instance", image.imageId);
4914
+ return __assign(__assign(__assign({}, image), instance), {
4915
+ // Todo: move to dcmjs tag style
4916
+ SOPClassUID: instance.SopClassUID || instance.SOPClassUID, SOPInstanceUID: instance.SopInstanceUID || instance.SOPInstanceUID, PixelData: image.getPixelData(), _vrMap: {
4917
+ PixelData: "OW"
4918
+ }, _meta: {} });
4919
+ });
4920
+ var multiframe = Normalizer.normalizeToDataset(datasets);
4921
+ return new SegmentationDerivation([multiframe], options);
4922
+ }
4923
+
4924
+ /**
4925
+ * Generates 2D label maps from a 3D label map.
4926
+ * @param labelmap3D - The 3D label map object to generate 2D label maps from. It is derived
4927
+ * from the volume labelmap.
4928
+ * @returns The label map object containing the 2D label maps and segments on label maps.
4929
+ */
4930
+ function generateLabelMaps2DFrom3D(labelmap3D) {
4931
+ // 1. we need to generate labelmaps2D from labelmaps3D, a labelmap2D is for each
4932
+ // slice
4933
+ var scalarData = labelmap3D.scalarData, dimensions = labelmap3D.dimensions;
4934
+ // scalarData is a flat array of all the pixels in the volume.
4935
+ var labelmaps2D = [];
4936
+ var segmentsOnLabelmap3D = new Set();
4937
+ // X-Y are the row and column dimensions, Z is the number of slices.
4938
+ for (var z = 0; z < dimensions[2]; z++) {
4939
+ var pixelData = scalarData.slice(z * dimensions[0] * dimensions[1], (z + 1) * dimensions[0] * dimensions[1]);
4940
+ var segmentsOnLabelmap = [];
4941
+ for (var i = 0; i < pixelData.length; i++) {
4942
+ var segment = pixelData[i];
4943
+ if (!segmentsOnLabelmap.includes(segment) && segment !== 0) {
4944
+ segmentsOnLabelmap.push(segment);
4945
+ }
4946
+ }
4947
+ var labelmap2D = {
4948
+ segmentsOnLabelmap: segmentsOnLabelmap,
4949
+ pixelData: pixelData,
4950
+ rows: dimensions[1],
4951
+ columns: dimensions[0]
4952
+ };
4953
+ if (segmentsOnLabelmap.length === 0) {
4954
+ continue;
4955
+ }
4956
+ segmentsOnLabelmap.forEach(function (segmentIndex) {
4957
+ segmentsOnLabelmap3D.add(segmentIndex);
4958
+ });
4959
+ labelmaps2D[dimensions[2] - 1 - z] = labelmap2D;
4960
+ }
4961
+ // remove segment 0 from segmentsOnLabelmap3D
4962
+ labelmap3D.segmentsOnLabelmap = Array.from(segmentsOnLabelmap3D);
4963
+ labelmap3D.labelmaps2D = labelmaps2D;
4964
+ return labelmap3D;
4965
+ }
4966
+
4967
+ var Segmentation$2 = CornerstoneSEG.Segmentation;
4968
+ var generateToolStateCornerstoneLegacy = Segmentation$2.generateToolState;
4969
+ /**
4970
+ * generateToolState - Given a set of cornerstoneTools imageIds and a Segmentation buffer,
4971
+ * derive cornerstoneTools toolState and brush metadata.
4972
+ *
4973
+ * @param imageIds - An array of the imageIds.
4974
+ * @param arrayBuffer - The SEG arrayBuffer.
4975
+ * @param skipOverlapping - skip checks for overlapping segs, default value false.
4976
+ * @param tolerance - default value 1.e-3.
4977
+ *
4978
+ * @returns a list of array buffer for each labelMap
4979
+ * an object from which the segment metadata can be derived
4980
+ * list containing the track of segments per frame
4981
+ * list containing the track of segments per frame for each labelMap (available only for the overlapping case).
4982
+ */
4983
+ function generateToolState(imageIds, arrayBuffer, metadataProvider, skipOverlapping, tolerance) {
4984
+ if (skipOverlapping === void 0) { skipOverlapping = false; }
4985
+ if (tolerance === void 0) { tolerance = 1e-3; }
4986
+ return generateToolStateCornerstoneLegacy(imageIds, arrayBuffer, metadataProvider, skipOverlapping, tolerance);
4987
+ }
4988
+
4989
+ var Segmentation$1 = /*#__PURE__*/Object.freeze({
4990
+ __proto__: null,
4991
+ generateLabelMaps2DFrom3D: generateLabelMaps2DFrom3D,
4992
+ generateSegmentation: generateSegmentation,
4993
+ generateToolState: generateToolState
4994
+ });
4995
+
4996
+ var Cornerstone3DSR = {
4333
4997
  Bidirectional: Bidirectional,
4334
4998
  CobbAngle: CobbAngle,
4335
4999
  Angle: Angle,
@@ -4344,6 +5008,9 @@ var Cornerstone3D = {
4344
5008
  CodeScheme: CodingScheme,
4345
5009
  CORNERSTONE_3D_TAG: CORNERSTONE_3D_TAG
4346
5010
  };
5011
+ var Cornerstone3DSEG = {
5012
+ Segmentation: Segmentation$1
5013
+ };
4347
5014
 
4348
5015
  var Colors = dcmjs__WEBPACK_IMPORTED_MODULE_0__/* .data */ .aT.Colors,
4349
5016
  BitArray = dcmjs__WEBPACK_IMPORTED_MODULE_0__/* .data */ .aT.BitArray;
@@ -4528,23 +5195,26 @@ var Segmentation = /*#__PURE__*/function () {
4528
5195
  return Segmentation;
4529
5196
  }();
4530
5197
 
4531
- var VTKjs = {
4532
- Segmentation: Segmentation
5198
+ var VTKjsSEG = {
5199
+ Segmentation: Segmentation
4533
5200
  };
4534
5201
 
4535
- var adapters = {
4536
- Cornerstone: Cornerstone,
4537
- Cornerstone3D: Cornerstone3D,
4538
- VTKjs: VTKjs
5202
+ var adaptersSR = {
5203
+ Cornerstone: CornerstoneSR,
5204
+ Cornerstone3D: Cornerstone3DSR
5205
+ };
5206
+ var adaptersSEG = {
5207
+ Cornerstone: CornerstoneSEG,
5208
+ Cornerstone3D: Cornerstone3DSEG,
5209
+ VTKjs: VTKjsSEG
4539
5210
  };
4540
5211
 
4541
5212
 
4542
- //# sourceMappingURL=adapters.es.js.map
4543
5213
 
4544
5214
 
4545
5215
  /***/ }),
4546
5216
 
4547
- /***/ 78738:
5217
+ /***/ 27318:
4548
5218
  /***/ ((module) => {
4549
5219
 
4550
5220
  "use strict";
@@ -4562,7 +5232,7 @@ module.exports = iota
4562
5232
 
4563
5233
  /***/ }),
4564
5234
 
4565
- /***/ 28998:
5235
+ /***/ 8516:
4566
5236
  /***/ ((module) => {
4567
5237
 
4568
5238
  /*!
@@ -4580,11 +5250,11 @@ module.exports = function isBuffer (obj) {
4580
5250
 
4581
5251
  /***/ }),
4582
5252
 
4583
- /***/ 73373:
5253
+ /***/ 87513:
4584
5254
  /***/ ((module, __unused_webpack_exports, __webpack_require__) => {
4585
5255
 
4586
- var iota = __webpack_require__(78738)
4587
- var isBuffer = __webpack_require__(28998)
5256
+ var iota = __webpack_require__(27318)
5257
+ var isBuffer = __webpack_require__(8516)
4588
5258
 
4589
5259
  var hasTypedArrays = ((typeof Float64Array) !== "undefined")
4590
5260