@ohif/app 3.8.0-beta.73 → 3.8.0-beta.74
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/{121.bundle.21827fec690c01ee9ab3.js → 121.bundle.bd8acf52b6a7047ae832.js} +2 -2
- package/dist/141.bundle.556b4c1e4cab770417ac.js +8620 -0
- package/dist/{191.bundle.c0ea2d031ffddeca32c9.js → 183.bundle.25293de927ef032a6695.js} +195 -122
- package/dist/{188.bundle.acfe3c0e6eb9cc90aef1.js → 188.bundle.f1b3909e55be12d37c4a.js} +2 -2
- package/dist/{987.bundle.e19408decfd59aadd118.js → 217.bundle.9631d914f170f8d7ef63.js} +31558 -39396
- package/dist/{295.bundle.3a0d5062d65296c4bf5d.js → 295.bundle.688b6bbff493cd904ae7.js} +2 -2
- package/dist/{155.bundle.64e00e96835d61e99c0e.js → 325.bundle.3d260b1a7f80cfc892a0.js} +43 -58
- package/dist/{425.bundle.f796ed1020fbed0f1e71.js → 335.bundle.ec53cc58116ef1dc5fa3.js} +132 -518
- package/dist/{342.bundle.521c0217f82380c0c2ad.js → 342.bundle.c6165579c4ac3ef0d6a8.js} +2 -2
- package/dist/{41.bundle.8b3f6e6f4bd71b85ef14.js → 41.bundle.3c9bb4e3800dcea2c043.js} +28 -29
- package/dist/{433.bundle.6f2308ab10593784778c.js → 433.bundle.1474591f213852cffcba.js} +188 -172
- package/dist/{290.bundle.952de53057f98e2c5ef0.js → 445.bundle.38c6d2af64e41cd7c614.js} +1 -1049
- package/dist/{448.bundle.19df2fef38bb0f6a272a.js → 448.bundle.e6af6868af55a353b12b.js} +16 -22
- package/dist/487.bundle.de932b440ffc809978b5.js +1875 -0
- package/dist/{530.bundle.f4b7966fb33eafb8cd5d.js → 530.bundle.7c94543955552475c56a.js} +9 -9
- package/dist/{540.bundle.32224b29bfa11d1f1cec.js → 540.bundle.31780163f7065fd4d325.js} +15 -15
- package/dist/{544.bundle.1110b24e96863d719a95.js → 544.bundle.fcb790bae53294b49b05.js} +8 -8
- package/dist/{574.bundle.2b3369042aad5d553463.js → 574.bundle.b4eb8773d7741868e84b.js} +166 -45
- package/dist/{594.bundle.61a9f0567260e9bb4480.js → 594.bundle.6c0b915507752363e82a.js} +4 -4
- package/dist/{2.bundle.a849401e1fefc0898248.js → 633.bundle.7f782a390a22d9c7ec1d.js} +35 -43
- package/dist/{699.bundle.9f4eddf87548c0d0dca3.js → 699.bundle.7642c1505c1685f63897.js} +18 -35
- package/dist/702.bundle.963481fbf871984b646f.js +8426 -0
- package/dist/722.bundle.afab1fe6bfcd569130ac.js +1083 -0
- package/dist/{724.bundle.b57096deac9649aada4b.js → 724.bundle.ad52afcbec7501305d25.js} +20 -11
- package/dist/{90.bundle.70f4752bb4ac79aef269.js → 83.bundle.ff7db010621303a71a50.js} +419 -137
- package/dist/{862.bundle.47305c27f0fb939c2f97.js → 862.bundle.f49a379497bb3b43a942.js} +3 -3
- package/dist/{889.bundle.3816444220909bd1fc78.js → 889.bundle.67ca151a5e2d653b0021.js} +8 -8
- package/dist/{595.bundle.e8ff2d0672cb195d4ab8.js → 896.bundle.ba0b4c73e2331281159f.js} +686 -57
- package/dist/{905.bundle.2dd7f62cb6e49851926b.js → 905.bundle.e67fd55073b8ff735ed5.js} +4 -4
- package/dist/{907.bundle.d22edc6203167e985ab3.js → 907.bundle.0167da9471dcfa5c862e.js} +2 -2
- package/dist/94.bundle.ccec301dfb972a375ecc.js +784 -0
- package/dist/{961.bundle.f207f1ac54a174e67d82.js → 961.bundle.711da9767a4e31ea5aef.js} +2 -2
- package/dist/{app.bundle.5e5ee16c43a68961e8c4.js → app.bundle.c0c40b901a1bf1043f08.js} +98584 -89435
- package/dist/app.bundle.css +5 -4
- package/dist/cornerstoneDICOMImageLoader.min.js +1 -1
- package/dist/cornerstoneDICOMImageLoader.min.js.map +1 -1
- package/dist/histogram-worker.bundle.829e14ec12c2b41a4323.js +359 -0
- package/dist/index.html +1 -1
- package/dist/{polySeg.bundle.fe47718e6a8414f175b1.js → polySeg.bundle.c503e9460cef894737cd.js} +3 -6
- package/dist/sw.js +1 -1
- package/package.json +20 -19
- package/dist/425.css +0 -2
- /package/dist/{164.bundle.6b98e9caf53620fbd6ca.js → 164.bundle.55df0a2c8b3569d8e1f9.js} +0 -0
- /package/dist/{155.css → 325.css} +0 -0
- /package/dist/{2.css → 633.css} +0 -0
- /package/dist/{595.css → 896.css} +0 -0
|
@@ -1,1053 +1,5 @@
|
|
|
1
1
|
"use strict";
|
|
2
|
-
(globalThis["webpackChunk"] = globalThis["webpackChunk"] || []).push([[
|
|
3
|
-
|
|
4
|
-
/***/ 23722:
|
|
5
|
-
/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
// EXPORTS
|
|
9
|
-
__webpack_require__.d(__webpack_exports__, {
|
|
10
|
-
FC: () => (/* reexport */ esm_cornerstoneStreamingImageVolumeLoader)
|
|
11
|
-
});
|
|
12
|
-
|
|
13
|
-
// UNUSED EXPORTS: Enums, StreamingDynamicImageVolume, StreamingImageVolume, cornerstoneStreamingDynamicImageVolumeLoader, helpers
|
|
14
|
-
|
|
15
|
-
// EXTERNAL MODULE: ../../../node_modules/@cornerstonejs/core/dist/esm/index.js + 383 modules
|
|
16
|
-
var esm = __webpack_require__(50719);
|
|
17
|
-
// EXTERNAL MODULE: ../../../node_modules/gl-matrix/esm/index.js + 10 modules
|
|
18
|
-
var gl_matrix_esm = __webpack_require__(83636);
|
|
19
|
-
;// CONCATENATED MODULE: ../../../node_modules/@cornerstonejs/streaming-image-volume-loader/dist/esm/helpers/getVolumeInfo.js
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
const { createUint8SharedArray, createFloat32SharedArray } = esm.utilities;
|
|
23
|
-
function getVolumeInfo_getVolumeInfo(imageIds) {
|
|
24
|
-
const volumeMetadata = utilities.makeVolumeMetadata(imageIds);
|
|
25
|
-
const { BitsAllocated, PixelRepresentation, PhotometricInterpretation, ImageOrientationPatient, PixelSpacing, Columns, Rows, } = volumeMetadata;
|
|
26
|
-
const rowCosineVec = vec3.fromValues(ImageOrientationPatient[0], ImageOrientationPatient[1], ImageOrientationPatient[2]);
|
|
27
|
-
const colCosineVec = vec3.fromValues(ImageOrientationPatient[3], ImageOrientationPatient[4], ImageOrientationPatient[5]);
|
|
28
|
-
const scanAxisNormal = vec3.create();
|
|
29
|
-
vec3.cross(scanAxisNormal, rowCosineVec, colCosineVec);
|
|
30
|
-
const { zSpacing, origin, sortedImageIds } = utilities.sortImageIdsAndGetSpacing(imageIds, scanAxisNormal);
|
|
31
|
-
const numFrames = imageIds.length;
|
|
32
|
-
const spacing = [PixelSpacing[1], PixelSpacing[0], zSpacing];
|
|
33
|
-
const dimensions = [Columns, Rows, numFrames];
|
|
34
|
-
const direction = [
|
|
35
|
-
...rowCosineVec,
|
|
36
|
-
...colCosineVec,
|
|
37
|
-
...scanAxisNormal,
|
|
38
|
-
];
|
|
39
|
-
const signed = PixelRepresentation === 1;
|
|
40
|
-
const bytesPerVoxel = BitsAllocated === 16 ? 4 : 1;
|
|
41
|
-
const sizeInBytesPerComponent = bytesPerVoxel * dimensions[0] * dimensions[1] * dimensions[2];
|
|
42
|
-
let numComponents = 1;
|
|
43
|
-
if (PhotometricInterpretation === 'RGB') {
|
|
44
|
-
numComponents = 3;
|
|
45
|
-
}
|
|
46
|
-
const sizeInBytes = sizeInBytesPerComponent * numComponents;
|
|
47
|
-
const isCacheable = cache.isCacheable(sizeInBytes);
|
|
48
|
-
if (!isCacheable) {
|
|
49
|
-
throw new Error(Enums.Events.CACHE_SIZE_EXCEEDED);
|
|
50
|
-
}
|
|
51
|
-
cache.decacheIfNecessaryUntilBytesAvailable(sizeInBytes);
|
|
52
|
-
let scalarData;
|
|
53
|
-
switch (BitsAllocated) {
|
|
54
|
-
case 8:
|
|
55
|
-
if (signed) {
|
|
56
|
-
throw new Error('8 Bit signed images are not yet supported by this plugin.');
|
|
57
|
-
}
|
|
58
|
-
else {
|
|
59
|
-
scalarData = createUint8SharedArray(dimensions[0] * dimensions[1] * dimensions[2]);
|
|
60
|
-
}
|
|
61
|
-
break;
|
|
62
|
-
case 16:
|
|
63
|
-
scalarData = createFloat32SharedArray(dimensions[0] * dimensions[1] * dimensions[2]);
|
|
64
|
-
break;
|
|
65
|
-
case 24:
|
|
66
|
-
scalarData = createUint8SharedArray(dimensions[0] * dimensions[1] * dimensions[2] * numComponents);
|
|
67
|
-
break;
|
|
68
|
-
}
|
|
69
|
-
return {
|
|
70
|
-
metadata: volumeMetadata,
|
|
71
|
-
sortedImageIds,
|
|
72
|
-
dimensions,
|
|
73
|
-
spacing,
|
|
74
|
-
origin,
|
|
75
|
-
direction,
|
|
76
|
-
scalarData,
|
|
77
|
-
sizeInBytes,
|
|
78
|
-
};
|
|
79
|
-
}
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
;// CONCATENATED MODULE: ../../../node_modules/@cornerstonejs/streaming-image-volume-loader/dist/esm/helpers/splitImageIdsBy4DTags.js
|
|
83
|
-
|
|
84
|
-
const groupBy = (array, key) => {
|
|
85
|
-
return array.reduce((rv, x) => {
|
|
86
|
-
(rv[x[key]] = rv[x[key]] || []).push(x);
|
|
87
|
-
return rv;
|
|
88
|
-
}, {});
|
|
89
|
-
};
|
|
90
|
-
function getIPPGroups(imageIds) {
|
|
91
|
-
const ippMetadata = imageIds.map((imageId) => {
|
|
92
|
-
const { imagePositionPatient } = esm.metaData.get('imagePlaneModule', imageId);
|
|
93
|
-
return { imageId, imagePositionPatient };
|
|
94
|
-
});
|
|
95
|
-
if (!ippMetadata.every((item) => item.imagePositionPatient)) {
|
|
96
|
-
return null;
|
|
97
|
-
}
|
|
98
|
-
const positionGroups = groupBy(ippMetadata, 'imagePositionPatient');
|
|
99
|
-
const positions = Object.keys(positionGroups);
|
|
100
|
-
const frame_count = positionGroups[positions[0]].length;
|
|
101
|
-
if (frame_count === 1) {
|
|
102
|
-
return null;
|
|
103
|
-
}
|
|
104
|
-
const frame_count_equal = positions.every((k) => positionGroups[k].length === frame_count);
|
|
105
|
-
if (!frame_count_equal) {
|
|
106
|
-
return null;
|
|
107
|
-
}
|
|
108
|
-
return positionGroups;
|
|
109
|
-
}
|
|
110
|
-
function test4DTag(IPPGroups, value_getter) {
|
|
111
|
-
const frame_groups = {};
|
|
112
|
-
let first_frame_value_set = [];
|
|
113
|
-
const positions = Object.keys(IPPGroups);
|
|
114
|
-
for (let i = 0; i < positions.length; i++) {
|
|
115
|
-
const frame_value_set = new Set();
|
|
116
|
-
const frames = IPPGroups[positions[i]];
|
|
117
|
-
for (let j = 0; j < frames.length; j++) {
|
|
118
|
-
const frame_value = value_getter(frames[j].imageId) || 0;
|
|
119
|
-
frame_groups[frame_value] = frame_groups[frame_value] || [];
|
|
120
|
-
frame_groups[frame_value].push({ imageId: frames[j].imageId });
|
|
121
|
-
frame_value_set.add(frame_value);
|
|
122
|
-
if (frame_value_set.size - 1 < j) {
|
|
123
|
-
return undefined;
|
|
124
|
-
}
|
|
125
|
-
}
|
|
126
|
-
if (i == 0) {
|
|
127
|
-
first_frame_value_set = Array.from(frame_value_set);
|
|
128
|
-
}
|
|
129
|
-
else if (!setEquals(first_frame_value_set, frame_value_set)) {
|
|
130
|
-
return undefined;
|
|
131
|
-
}
|
|
132
|
-
}
|
|
133
|
-
return frame_groups;
|
|
134
|
-
}
|
|
135
|
-
function getTagValue(imageId, tag) {
|
|
136
|
-
const value = esm.metaData.get(tag, imageId);
|
|
137
|
-
try {
|
|
138
|
-
return parseFloat(value);
|
|
139
|
-
}
|
|
140
|
-
catch {
|
|
141
|
-
return undefined;
|
|
142
|
-
}
|
|
143
|
-
}
|
|
144
|
-
function getPhilipsPrivateBValue(imageId) {
|
|
145
|
-
const value = esm.metaData.get('20011003', imageId);
|
|
146
|
-
try {
|
|
147
|
-
const { InlineBinary } = value;
|
|
148
|
-
if (InlineBinary) {
|
|
149
|
-
const value_bytes = atob(InlineBinary);
|
|
150
|
-
const ary_buf = new ArrayBuffer(value_bytes.length);
|
|
151
|
-
const dv = new DataView(ary_buf);
|
|
152
|
-
for (let i = 0; i < value_bytes.length; i++) {
|
|
153
|
-
dv.setUint8(i, value_bytes.charCodeAt(i));
|
|
154
|
-
}
|
|
155
|
-
return new Float32Array(ary_buf)[0];
|
|
156
|
-
}
|
|
157
|
-
return parseFloat(value);
|
|
158
|
-
}
|
|
159
|
-
catch {
|
|
160
|
-
return undefined;
|
|
161
|
-
}
|
|
162
|
-
}
|
|
163
|
-
function getSiemensPrivateBValue(imageId) {
|
|
164
|
-
let value = esm.metaData.get('0019100c', imageId);
|
|
165
|
-
try {
|
|
166
|
-
const { InlineBinary } = value;
|
|
167
|
-
if (InlineBinary) {
|
|
168
|
-
value = atob(InlineBinary);
|
|
169
|
-
}
|
|
170
|
-
return parseFloat(value);
|
|
171
|
-
}
|
|
172
|
-
catch {
|
|
173
|
-
return undefined;
|
|
174
|
-
}
|
|
175
|
-
}
|
|
176
|
-
function getGEPrivateBValue(imageId) {
|
|
177
|
-
let value = esm.metaData.get('00431039', imageId);
|
|
178
|
-
try {
|
|
179
|
-
const { InlineBinary } = value;
|
|
180
|
-
if (InlineBinary) {
|
|
181
|
-
value = atob(InlineBinary).split('//');
|
|
182
|
-
}
|
|
183
|
-
return parseFloat(value[0]) % 100000;
|
|
184
|
-
}
|
|
185
|
-
catch {
|
|
186
|
-
return undefined;
|
|
187
|
-
}
|
|
188
|
-
}
|
|
189
|
-
function setEquals(set_a, set_b) {
|
|
190
|
-
if (set_a.length != set_b.size) {
|
|
191
|
-
return false;
|
|
192
|
-
}
|
|
193
|
-
for (let i = 0; i < set_a.length; i++) {
|
|
194
|
-
if (!set_b.has(set_a[i])) {
|
|
195
|
-
return false;
|
|
196
|
-
}
|
|
197
|
-
}
|
|
198
|
-
return true;
|
|
199
|
-
}
|
|
200
|
-
function getPetFrameReferenceTime(imageId) {
|
|
201
|
-
const moduleInfo = esm.metaData.get('petImageModule', imageId);
|
|
202
|
-
return moduleInfo ? moduleInfo['frameReferenceTime'] : 0;
|
|
203
|
-
}
|
|
204
|
-
function splitImageIdsBy4DTags_splitImageIdsBy4DTags(imageIds) {
|
|
205
|
-
const positionGroups = getIPPGroups(imageIds);
|
|
206
|
-
if (!positionGroups) {
|
|
207
|
-
return [imageIds];
|
|
208
|
-
}
|
|
209
|
-
const fncList2 = [
|
|
210
|
-
(imageId) => getTagValue(imageId, 'TemporalPositionIdentifier'),
|
|
211
|
-
(imageId) => getTagValue(imageId, 'DiffusionBValue'),
|
|
212
|
-
(imageId) => getTagValue(imageId, 'TriggerTime'),
|
|
213
|
-
(imageId) => getTagValue(imageId, 'EchoTime'),
|
|
214
|
-
(imageId) => getTagValue(imageId, 'EchoNumber'),
|
|
215
|
-
getPhilipsPrivateBValue,
|
|
216
|
-
getSiemensPrivateBValue,
|
|
217
|
-
getGEPrivateBValue,
|
|
218
|
-
getPetFrameReferenceTime,
|
|
219
|
-
];
|
|
220
|
-
for (let i = 0; i < fncList2.length; i++) {
|
|
221
|
-
const frame_groups = test4DTag(positionGroups, fncList2[i]);
|
|
222
|
-
if (frame_groups) {
|
|
223
|
-
const sortedKeys = Object.keys(frame_groups)
|
|
224
|
-
.map(Number.parseFloat)
|
|
225
|
-
.sort((a, b) => a - b);
|
|
226
|
-
const imageIdsGroups = sortedKeys.map((key) => frame_groups[key].map((item) => item.imageId));
|
|
227
|
-
return imageIdsGroups;
|
|
228
|
-
}
|
|
229
|
-
}
|
|
230
|
-
return [imageIds];
|
|
231
|
-
}
|
|
232
|
-
/* harmony default export */ const helpers_splitImageIdsBy4DTags = (splitImageIdsBy4DTags_splitImageIdsBy4DTags);
|
|
233
|
-
|
|
234
|
-
;// CONCATENATED MODULE: ../../../node_modules/@cornerstonejs/streaming-image-volume-loader/dist/esm/helpers/getDynamicVolumeInfo.js
|
|
235
|
-
|
|
236
|
-
function getDynamicVolumeInfo(imageIds) {
|
|
237
|
-
const timePoints = helpers_splitImageIdsBy4DTags(imageIds);
|
|
238
|
-
const isDynamicVolume = timePoints.length > 1;
|
|
239
|
-
return { isDynamicVolume, timePoints };
|
|
240
|
-
}
|
|
241
|
-
/* harmony default export */ const helpers_getDynamicVolumeInfo = (getDynamicVolumeInfo);
|
|
242
|
-
|
|
243
|
-
;// CONCATENATED MODULE: ../../../node_modules/@cornerstonejs/streaming-image-volume-loader/dist/esm/helpers/autoLoad.js
|
|
244
|
-
|
|
245
|
-
const autoLoad = (volumeId) => {
|
|
246
|
-
const renderingEngineAndViewportIds = getRenderingEngineAndViewportsContainingVolume(volumeId);
|
|
247
|
-
if (!renderingEngineAndViewportIds || !renderingEngineAndViewportIds.length) {
|
|
248
|
-
return;
|
|
249
|
-
}
|
|
250
|
-
renderingEngineAndViewportIds.forEach(({ renderingEngine, viewportIds }) => {
|
|
251
|
-
if (!renderingEngine.hasBeenDestroyed) {
|
|
252
|
-
renderingEngine.renderViewports(viewportIds);
|
|
253
|
-
}
|
|
254
|
-
});
|
|
255
|
-
};
|
|
256
|
-
function getRenderingEngineAndViewportsContainingVolume(volumeId) {
|
|
257
|
-
const renderingEnginesArray = (0,esm.getRenderingEngines)();
|
|
258
|
-
const renderingEngineAndViewportIds = [];
|
|
259
|
-
for (let i = 0; i < renderingEnginesArray.length; i++) {
|
|
260
|
-
const renderingEngine = renderingEnginesArray[i];
|
|
261
|
-
const viewports = esm.utilities.getViewportsWithVolumeId(volumeId, renderingEngine.id);
|
|
262
|
-
if (viewports.length) {
|
|
263
|
-
renderingEngineAndViewportIds.push({
|
|
264
|
-
renderingEngine,
|
|
265
|
-
viewportIds: viewports.map((viewport) => viewport.id),
|
|
266
|
-
});
|
|
267
|
-
}
|
|
268
|
-
}
|
|
269
|
-
return renderingEngineAndViewportIds;
|
|
270
|
-
}
|
|
271
|
-
/* harmony default export */ const helpers_autoLoad = (autoLoad);
|
|
272
|
-
|
|
273
|
-
;// CONCATENATED MODULE: ../../../node_modules/@cornerstonejs/streaming-image-volume-loader/dist/esm/helpers/scaleArray.js
|
|
274
|
-
function scaleArray(array, scalingParameters) {
|
|
275
|
-
const arrayLength = array.length;
|
|
276
|
-
const { rescaleSlope, rescaleIntercept, suvbw } = scalingParameters;
|
|
277
|
-
if (scalingParameters.modality === 'PT' && typeof suvbw === 'number') {
|
|
278
|
-
for (let i = 0; i < arrayLength; i++) {
|
|
279
|
-
array[i] = suvbw * (array[i] * rescaleSlope + rescaleIntercept);
|
|
280
|
-
}
|
|
281
|
-
}
|
|
282
|
-
else {
|
|
283
|
-
for (let i = 0; i < arrayLength; i++) {
|
|
284
|
-
array[i] = array[i] * rescaleSlope + rescaleIntercept;
|
|
285
|
-
}
|
|
286
|
-
}
|
|
287
|
-
return array;
|
|
288
|
-
}
|
|
289
|
-
|
|
290
|
-
;// CONCATENATED MODULE: ../../../node_modules/@cornerstonejs/streaming-image-volume-loader/dist/esm/helpers/index.js
|
|
291
|
-
|
|
292
|
-
|
|
293
|
-
|
|
294
|
-
|
|
295
|
-
|
|
296
|
-
|
|
297
|
-
|
|
298
|
-
;// CONCATENATED MODULE: ../../../node_modules/@cornerstonejs/streaming-image-volume-loader/dist/esm/BaseStreamingImageVolume.js
|
|
299
|
-
|
|
300
|
-
|
|
301
|
-
const requestTypeDefault = esm.Enums.RequestType.Prefetch;
|
|
302
|
-
const { ProgressiveIterator } = esm.utilities;
|
|
303
|
-
const { ImageQualityStatus } = esm.Enums;
|
|
304
|
-
const { imageRetrieveMetadataProvider } = esm.utilities;
|
|
305
|
-
class BaseStreamingImageVolume extends esm.ImageVolume {
|
|
306
|
-
constructor(imageVolumeProperties, streamingProperties) {
|
|
307
|
-
super(imageVolumeProperties);
|
|
308
|
-
this.framesLoaded = 0;
|
|
309
|
-
this.framesProcessed = 0;
|
|
310
|
-
this.framesUpdated = 0;
|
|
311
|
-
this.autoRenderOnLoad = true;
|
|
312
|
-
this.cachedFrames = [];
|
|
313
|
-
this.reRenderTarget = 0;
|
|
314
|
-
this.reRenderFraction = 2;
|
|
315
|
-
this.imagesLoader = this;
|
|
316
|
-
this.cancelLoading = () => {
|
|
317
|
-
const { loadStatus } = this;
|
|
318
|
-
if (!loadStatus || !loadStatus.loading) {
|
|
319
|
-
return;
|
|
320
|
-
}
|
|
321
|
-
loadStatus.loading = false;
|
|
322
|
-
loadStatus.cancelled = true;
|
|
323
|
-
this.clearLoadCallbacks();
|
|
324
|
-
const filterFunction = ({ additionalDetails }) => {
|
|
325
|
-
return additionalDetails.volumeId !== this.volumeId;
|
|
326
|
-
};
|
|
327
|
-
esm.imageLoadPoolManager.filterRequests(filterFunction);
|
|
328
|
-
};
|
|
329
|
-
this.load = (callback) => {
|
|
330
|
-
const { imageIds, loadStatus, numFrames } = this;
|
|
331
|
-
const { transferSyntaxUID } = esm.metaData.get('transferSyntax', imageIds[0]) || {};
|
|
332
|
-
const imageRetrieveConfiguration = esm.metaData.get(imageRetrieveMetadataProvider.IMAGE_RETRIEVE_CONFIGURATION, this.volumeId, transferSyntaxUID, 'volume');
|
|
333
|
-
this.imagesLoader = imageRetrieveConfiguration
|
|
334
|
-
? (imageRetrieveConfiguration.create ||
|
|
335
|
-
esm.ProgressiveRetrieveImages.createProgressive)(imageRetrieveConfiguration)
|
|
336
|
-
: this;
|
|
337
|
-
if (loadStatus.loading === true) {
|
|
338
|
-
return;
|
|
339
|
-
}
|
|
340
|
-
const { loaded } = this.loadStatus;
|
|
341
|
-
const totalNumFrames = imageIds.length;
|
|
342
|
-
if (loaded) {
|
|
343
|
-
if (callback) {
|
|
344
|
-
callback({
|
|
345
|
-
success: true,
|
|
346
|
-
framesLoaded: totalNumFrames,
|
|
347
|
-
framesProcessed: totalNumFrames,
|
|
348
|
-
numFrames,
|
|
349
|
-
totalNumFrames,
|
|
350
|
-
});
|
|
351
|
-
}
|
|
352
|
-
return;
|
|
353
|
-
}
|
|
354
|
-
if (callback) {
|
|
355
|
-
this.loadStatus.callbacks.push(callback);
|
|
356
|
-
}
|
|
357
|
-
this._prefetchImageIds();
|
|
358
|
-
};
|
|
359
|
-
this.loadStatus = streamingProperties.loadStatus;
|
|
360
|
-
}
|
|
361
|
-
invalidateVolume(immediate) {
|
|
362
|
-
const { imageData, vtkOpenGLTexture } = this;
|
|
363
|
-
const { numFrames } = this;
|
|
364
|
-
for (let i = 0; i < numFrames; i++) {
|
|
365
|
-
vtkOpenGLTexture.setUpdatedFrame(i);
|
|
366
|
-
}
|
|
367
|
-
imageData.modified();
|
|
368
|
-
if (immediate) {
|
|
369
|
-
helpers_autoLoad(this.volumeId);
|
|
370
|
-
}
|
|
371
|
-
}
|
|
372
|
-
clearLoadCallbacks() {
|
|
373
|
-
this.loadStatus.callbacks = [];
|
|
374
|
-
}
|
|
375
|
-
callLoadStatusCallback(evt) {
|
|
376
|
-
const { framesUpdated, framesProcessed, totalNumFrames } = evt;
|
|
377
|
-
const { volumeId, reRenderFraction, loadStatus, metadata } = this;
|
|
378
|
-
const { FrameOfReferenceUID } = metadata;
|
|
379
|
-
if (this.autoRenderOnLoad) {
|
|
380
|
-
if (framesUpdated > this.reRenderTarget ||
|
|
381
|
-
framesProcessed === totalNumFrames) {
|
|
382
|
-
this.reRenderTarget += reRenderFraction;
|
|
383
|
-
helpers_autoLoad(volumeId);
|
|
384
|
-
}
|
|
385
|
-
}
|
|
386
|
-
if (framesProcessed === totalNumFrames) {
|
|
387
|
-
loadStatus.callbacks.forEach((callback) => callback(evt));
|
|
388
|
-
const eventDetail = {
|
|
389
|
-
FrameOfReferenceUID,
|
|
390
|
-
volumeId: volumeId,
|
|
391
|
-
};
|
|
392
|
-
(0,esm.triggerEvent)(esm.eventTarget, esm.Enums.Events.IMAGE_VOLUME_LOADING_COMPLETED, eventDetail);
|
|
393
|
-
}
|
|
394
|
-
}
|
|
395
|
-
updateTextureAndTriggerEvents(imageIdIndex, imageId, imageQualityStatus = ImageQualityStatus.FULL_RESOLUTION) {
|
|
396
|
-
const frameIndex = this.imageIdIndexToFrameIndex(imageIdIndex);
|
|
397
|
-
const { cachedFrames, numFrames, totalNumFrames } = this;
|
|
398
|
-
const { FrameOfReferenceUID } = this.metadata;
|
|
399
|
-
const currentStatus = cachedFrames[frameIndex];
|
|
400
|
-
if (currentStatus > imageQualityStatus) {
|
|
401
|
-
return;
|
|
402
|
-
}
|
|
403
|
-
if (cachedFrames[frameIndex] === ImageQualityStatus.FULL_RESOLUTION) {
|
|
404
|
-
return;
|
|
405
|
-
}
|
|
406
|
-
const complete = imageQualityStatus === ImageQualityStatus.FULL_RESOLUTION;
|
|
407
|
-
cachedFrames[imageIdIndex] = imageQualityStatus;
|
|
408
|
-
this.framesUpdated++;
|
|
409
|
-
if (complete) {
|
|
410
|
-
this.framesLoaded++;
|
|
411
|
-
this.framesProcessed++;
|
|
412
|
-
}
|
|
413
|
-
this.vtkOpenGLTexture.setUpdatedFrame(frameIndex);
|
|
414
|
-
this.imageData.modified();
|
|
415
|
-
const eventDetail = {
|
|
416
|
-
FrameOfReferenceUID,
|
|
417
|
-
imageVolume: this,
|
|
418
|
-
};
|
|
419
|
-
(0,esm.triggerEvent)(esm.eventTarget, esm.Enums.Events.IMAGE_VOLUME_MODIFIED, eventDetail);
|
|
420
|
-
if (complete && this.framesProcessed === this.totalNumFrames) {
|
|
421
|
-
this.loadStatus.loaded = true;
|
|
422
|
-
this.loadStatus.loading = false;
|
|
423
|
-
}
|
|
424
|
-
this.callLoadStatusCallback({
|
|
425
|
-
success: true,
|
|
426
|
-
imageIdIndex,
|
|
427
|
-
imageId,
|
|
428
|
-
framesLoaded: this.framesLoaded,
|
|
429
|
-
framesProcessed: this.framesProcessed,
|
|
430
|
-
framesUpdated: this.framesUpdated,
|
|
431
|
-
numFrames,
|
|
432
|
-
totalNumFrames,
|
|
433
|
-
complete,
|
|
434
|
-
imageQualityStatus,
|
|
435
|
-
});
|
|
436
|
-
if (this.loadStatus.loaded) {
|
|
437
|
-
this.loadStatus.callbacks = [];
|
|
438
|
-
}
|
|
439
|
-
}
|
|
440
|
-
successCallback(imageId, image) {
|
|
441
|
-
const imageIdIndex = this.getImageIdIndex(imageId);
|
|
442
|
-
const options = this.getLoaderImageOptions(imageId);
|
|
443
|
-
const scalarData = this.getScalarDataByImageIdIndex(imageIdIndex);
|
|
444
|
-
handleArrayBufferLoad(scalarData, image, options);
|
|
445
|
-
const { scalingParameters } = image.preScale || {};
|
|
446
|
-
const { imageQualityStatus } = image;
|
|
447
|
-
const frameIndex = this.imageIdIndexToFrameIndex(imageIdIndex);
|
|
448
|
-
const cachedImage = esm.cache.getCachedImageBasedOnImageURI(imageId);
|
|
449
|
-
const cachedVolume = esm.cache.getVolumeContainingImageId(imageId);
|
|
450
|
-
if (this.loadStatus.cancelled) {
|
|
451
|
-
console.warn('volume load cancelled, returning for imageIdIndex: ', imageIdIndex);
|
|
452
|
-
return;
|
|
453
|
-
}
|
|
454
|
-
if (!cachedImage && !(cachedVolume && cachedVolume.volume !== this)) {
|
|
455
|
-
return this.updateTextureAndTriggerEvents(imageIdIndex, imageId, imageQualityStatus);
|
|
456
|
-
}
|
|
457
|
-
const isFromImageCache = !!cachedImage;
|
|
458
|
-
if (isFromImageCache && options.targetBuffer) {
|
|
459
|
-
this.imageCacheOffsetMap.set(imageId, {
|
|
460
|
-
imageIdIndex,
|
|
461
|
-
frameIndex,
|
|
462
|
-
offset: options.targetBuffer?.offset || 0,
|
|
463
|
-
length: options.targetBuffer?.length,
|
|
464
|
-
});
|
|
465
|
-
}
|
|
466
|
-
const cachedImageOrVolume = cachedImage || cachedVolume.volume;
|
|
467
|
-
this.handleImageComingFromCache(cachedImageOrVolume, isFromImageCache, scalingParameters, scalarData, frameIndex, scalarData.buffer, imageIdIndex, imageId);
|
|
468
|
-
}
|
|
469
|
-
errorCallback(imageId, permanent, error) {
|
|
470
|
-
if (!permanent) {
|
|
471
|
-
return;
|
|
472
|
-
}
|
|
473
|
-
const { totalNumFrames, numFrames } = this;
|
|
474
|
-
const imageIdIndex = this.getImageIdIndex(imageId);
|
|
475
|
-
this.framesProcessed++;
|
|
476
|
-
if (this.framesProcessed === totalNumFrames) {
|
|
477
|
-
this.loadStatus.loaded = true;
|
|
478
|
-
this.loadStatus.loading = false;
|
|
479
|
-
}
|
|
480
|
-
this.callLoadStatusCallback({
|
|
481
|
-
success: false,
|
|
482
|
-
imageId,
|
|
483
|
-
imageIdIndex,
|
|
484
|
-
error,
|
|
485
|
-
framesLoaded: this.framesLoaded,
|
|
486
|
-
framesProcessed: this.framesProcessed,
|
|
487
|
-
framesUpdated: this.framesUpdated,
|
|
488
|
-
numFrames,
|
|
489
|
-
totalNumFrames,
|
|
490
|
-
});
|
|
491
|
-
if (this.loadStatus.loaded) {
|
|
492
|
-
this.loadStatus.callbacks = [];
|
|
493
|
-
}
|
|
494
|
-
const eventDetail = {
|
|
495
|
-
error,
|
|
496
|
-
imageIdIndex,
|
|
497
|
-
imageId,
|
|
498
|
-
};
|
|
499
|
-
(0,esm.triggerEvent)(esm.eventTarget, esm.Enums.Events.IMAGE_LOAD_ERROR, eventDetail);
|
|
500
|
-
}
|
|
501
|
-
getLoaderImageOptions(imageId) {
|
|
502
|
-
const { transferSyntaxUID: transferSyntaxUID } = esm.metaData.get('transferSyntax', imageId) || {};
|
|
503
|
-
const imagePlaneModule = esm.metaData.get('imagePlaneModule', imageId) || {};
|
|
504
|
-
const { rows, columns } = imagePlaneModule;
|
|
505
|
-
const imageIdIndex = this.getImageIdIndex(imageId);
|
|
506
|
-
const scalarData = this.getScalarDataByImageIdIndex(imageIdIndex);
|
|
507
|
-
if (!scalarData) {
|
|
508
|
-
return null;
|
|
509
|
-
}
|
|
510
|
-
const arrayBuffer = scalarData.buffer;
|
|
511
|
-
const { type, length, lengthInBytes } = getScalarDataType(scalarData, this.numFrames);
|
|
512
|
-
const modalityLutModule = esm.metaData.get('modalityLutModule', imageId) || {};
|
|
513
|
-
const generalSeriesModule = esm.metaData.get('generalSeriesModule', imageId) || {};
|
|
514
|
-
const scalingParameters = {
|
|
515
|
-
rescaleSlope: modalityLutModule.rescaleSlope,
|
|
516
|
-
rescaleIntercept: modalityLutModule.rescaleIntercept,
|
|
517
|
-
modality: generalSeriesModule.modality,
|
|
518
|
-
};
|
|
519
|
-
if (scalingParameters.modality === 'PT') {
|
|
520
|
-
const suvFactor = esm.metaData.get('scalingModule', imageId);
|
|
521
|
-
if (suvFactor) {
|
|
522
|
-
this._addScalingToVolume(suvFactor);
|
|
523
|
-
scalingParameters.suvbw = suvFactor.suvbw;
|
|
524
|
-
}
|
|
525
|
-
}
|
|
526
|
-
const isSlopeAndInterceptNumbers = typeof scalingParameters.rescaleSlope === 'number' &&
|
|
527
|
-
typeof scalingParameters.rescaleIntercept === 'number';
|
|
528
|
-
this.isPreScaled = isSlopeAndInterceptNumbers;
|
|
529
|
-
const frameIndex = this.imageIdIndexToFrameIndex(imageIdIndex);
|
|
530
|
-
return {
|
|
531
|
-
targetBuffer: {
|
|
532
|
-
arrayBuffer: arrayBuffer instanceof ArrayBuffer ? undefined : arrayBuffer,
|
|
533
|
-
offset: frameIndex * lengthInBytes,
|
|
534
|
-
length,
|
|
535
|
-
type,
|
|
536
|
-
rows,
|
|
537
|
-
columns,
|
|
538
|
-
},
|
|
539
|
-
skipCreateImage: true,
|
|
540
|
-
preScale: {
|
|
541
|
-
enabled: true,
|
|
542
|
-
scalingParameters,
|
|
543
|
-
},
|
|
544
|
-
transferPixelData: true,
|
|
545
|
-
transferSyntaxUID,
|
|
546
|
-
loader: esm.imageLoader.loadImage,
|
|
547
|
-
additionalDetails: {
|
|
548
|
-
imageId,
|
|
549
|
-
imageIdIndex,
|
|
550
|
-
volumeId: this.volumeId,
|
|
551
|
-
},
|
|
552
|
-
};
|
|
553
|
-
}
|
|
554
|
-
callLoadImage(imageId, imageIdIndex, options) {
|
|
555
|
-
const { cachedFrames } = this;
|
|
556
|
-
if (cachedFrames[imageIdIndex] === ImageQualityStatus.FULL_RESOLUTION) {
|
|
557
|
-
return;
|
|
558
|
-
}
|
|
559
|
-
const uncompressedIterator = ProgressiveIterator.as(esm.imageLoader.loadImage(imageId, options));
|
|
560
|
-
return uncompressedIterator.forEach((image) => {
|
|
561
|
-
this.successCallback(imageId, image);
|
|
562
|
-
}, this.errorCallback.bind(this, imageIdIndex, imageId));
|
|
563
|
-
}
|
|
564
|
-
getImageIdsRequests(imageIds, priorityDefault) {
|
|
565
|
-
this.totalNumFrames = this.imageIds.length;
|
|
566
|
-
const autoRenderPercentage = 2;
|
|
567
|
-
if (this.autoRenderOnLoad) {
|
|
568
|
-
this.reRenderFraction =
|
|
569
|
-
this.totalNumFrames * (autoRenderPercentage / 100);
|
|
570
|
-
this.reRenderTarget = this.reRenderFraction;
|
|
571
|
-
}
|
|
572
|
-
const requests = imageIds.map((imageId) => {
|
|
573
|
-
const imageIdIndex = this.getImageIdIndex(imageId);
|
|
574
|
-
const requestType = requestTypeDefault;
|
|
575
|
-
const priority = priorityDefault;
|
|
576
|
-
const options = this.getLoaderImageOptions(imageId);
|
|
577
|
-
return {
|
|
578
|
-
callLoadImage: this.callLoadImage.bind(this),
|
|
579
|
-
imageId,
|
|
580
|
-
imageIdIndex,
|
|
581
|
-
options,
|
|
582
|
-
priority,
|
|
583
|
-
requestType,
|
|
584
|
-
additionalDetails: {
|
|
585
|
-
volumeId: this.volumeId,
|
|
586
|
-
},
|
|
587
|
-
};
|
|
588
|
-
});
|
|
589
|
-
return requests;
|
|
590
|
-
}
|
|
591
|
-
handleImageComingFromCache(cachedImageOrVolume, isFromImageCache, scalingParameters, scalarData, frameIndex, arrayBuffer, imageIdIndex, imageId) {
|
|
592
|
-
const imageLoadObject = isFromImageCache
|
|
593
|
-
? cachedImageOrVolume.imageLoadObject
|
|
594
|
-
: cachedImageOrVolume.convertToCornerstoneImage(imageId, imageIdIndex);
|
|
595
|
-
imageLoadObject.promise
|
|
596
|
-
.then((cachedImage) => {
|
|
597
|
-
const imageScalarData = this._scaleIfNecessary(cachedImage, scalingParameters);
|
|
598
|
-
const { pixelsPerImage, bytesPerImage } = this.cornerstoneImageMetaData;
|
|
599
|
-
const TypedArray = scalarData.constructor;
|
|
600
|
-
let byteOffset = bytesPerImage * frameIndex;
|
|
601
|
-
const bytePerPixel = bytesPerImage / pixelsPerImage;
|
|
602
|
-
if (scalarData.BYTES_PER_ELEMENT !== bytePerPixel) {
|
|
603
|
-
byteOffset *= scalarData.BYTES_PER_ELEMENT / bytePerPixel;
|
|
604
|
-
}
|
|
605
|
-
const volumeBufferView = new TypedArray(arrayBuffer, byteOffset, pixelsPerImage);
|
|
606
|
-
volumeBufferView.set(imageScalarData);
|
|
607
|
-
this.updateTextureAndTriggerEvents(imageIdIndex, imageId, cachedImage.imageQualityStatus);
|
|
608
|
-
})
|
|
609
|
-
.catch((err) => {
|
|
610
|
-
this.errorCallback(imageId, true, err);
|
|
611
|
-
});
|
|
612
|
-
}
|
|
613
|
-
getImageLoadRequests(_priority) {
|
|
614
|
-
throw new Error('Abstract method');
|
|
615
|
-
}
|
|
616
|
-
getImageIdsToLoad() {
|
|
617
|
-
throw new Error('Abstract method');
|
|
618
|
-
}
|
|
619
|
-
loadImages(imageIds, listener) {
|
|
620
|
-
this.loadStatus.loading = true;
|
|
621
|
-
const requests = this.getImageLoadRequests(5);
|
|
622
|
-
requests.reverse().forEach((request) => {
|
|
623
|
-
if (!request) {
|
|
624
|
-
return;
|
|
625
|
-
}
|
|
626
|
-
const { callLoadImage, imageId, imageIdIndex, options, priority, requestType, additionalDetails, } = request;
|
|
627
|
-
esm.imageLoadPoolManager.addRequest(callLoadImage.bind(this, imageId, imageIdIndex, options), requestType, additionalDetails, priority);
|
|
628
|
-
});
|
|
629
|
-
return Promise.resolve(true);
|
|
630
|
-
}
|
|
631
|
-
_prefetchImageIds() {
|
|
632
|
-
this.loadStatus.loading = true;
|
|
633
|
-
const imageIds = [...this.getImageIdsToLoad()];
|
|
634
|
-
imageIds.reverse();
|
|
635
|
-
this.totalNumFrames = this.imageIds.length;
|
|
636
|
-
const autoRenderPercentage = 2;
|
|
637
|
-
if (this.autoRenderOnLoad) {
|
|
638
|
-
this.reRenderFraction =
|
|
639
|
-
this.totalNumFrames * (autoRenderPercentage / 100);
|
|
640
|
-
this.reRenderTarget = this.reRenderFraction;
|
|
641
|
-
}
|
|
642
|
-
return this.imagesLoader.loadImages(imageIds, this).catch((e) => {
|
|
643
|
-
console.debug('progressive loading failed to complete', e);
|
|
644
|
-
});
|
|
645
|
-
}
|
|
646
|
-
_scaleIfNecessary(image, scalingParametersToUse) {
|
|
647
|
-
const imageIsAlreadyScaled = image.preScale?.scaled;
|
|
648
|
-
const noScalingParametersToUse = !scalingParametersToUse ||
|
|
649
|
-
!scalingParametersToUse.rescaleIntercept ||
|
|
650
|
-
!scalingParametersToUse.rescaleSlope;
|
|
651
|
-
if (!imageIsAlreadyScaled && noScalingParametersToUse) {
|
|
652
|
-
return image.getPixelData().slice(0);
|
|
653
|
-
}
|
|
654
|
-
if (!imageIsAlreadyScaled &&
|
|
655
|
-
scalingParametersToUse &&
|
|
656
|
-
scalingParametersToUse.rescaleIntercept !== undefined &&
|
|
657
|
-
scalingParametersToUse.rescaleSlope !== undefined) {
|
|
658
|
-
const pixelDataCopy = image.getPixelData().slice(0);
|
|
659
|
-
const scaledArray = scaleArray(pixelDataCopy, scalingParametersToUse);
|
|
660
|
-
return scaledArray;
|
|
661
|
-
}
|
|
662
|
-
const { rescaleSlope: rescaleSlopeToUse, rescaleIntercept: rescaleInterceptToUse, suvbw: suvbwToUse, } = scalingParametersToUse;
|
|
663
|
-
const { rescaleSlope: rescaleSlopeUsed, rescaleIntercept: rescaleInterceptUsed, suvbw: suvbwUsed, } = image.preScale.scalingParameters;
|
|
664
|
-
const rescaleSlopeIsSame = rescaleSlopeToUse === rescaleSlopeUsed;
|
|
665
|
-
const rescaleInterceptIsSame = rescaleInterceptToUse === rescaleInterceptUsed;
|
|
666
|
-
const suvbwIsSame = suvbwToUse === suvbwUsed;
|
|
667
|
-
if (rescaleSlopeIsSame && rescaleInterceptIsSame && suvbwIsSame) {
|
|
668
|
-
return image.getPixelData();
|
|
669
|
-
}
|
|
670
|
-
const pixelDataCopy = image.getPixelData().slice(0);
|
|
671
|
-
const newSuvbw = suvbwToUse / suvbwUsed;
|
|
672
|
-
const newRescaleSlope = rescaleSlopeToUse / rescaleSlopeUsed;
|
|
673
|
-
const newRescaleIntercept = rescaleInterceptToUse - rescaleInterceptUsed * newRescaleSlope;
|
|
674
|
-
const newScalingParameters = {
|
|
675
|
-
...scalingParametersToUse,
|
|
676
|
-
rescaleSlope: newRescaleSlope,
|
|
677
|
-
rescaleIntercept: newRescaleIntercept,
|
|
678
|
-
suvbw: newSuvbw,
|
|
679
|
-
};
|
|
680
|
-
const scaledArray = scaleArray(pixelDataCopy, newScalingParameters);
|
|
681
|
-
return scaledArray;
|
|
682
|
-
}
|
|
683
|
-
_addScalingToVolume(suvFactor) {
|
|
684
|
-
if (this.scaling) {
|
|
685
|
-
return;
|
|
686
|
-
}
|
|
687
|
-
const { suvbw, suvlbm, suvbsa } = suvFactor;
|
|
688
|
-
const petScaling = {};
|
|
689
|
-
if (suvlbm) {
|
|
690
|
-
petScaling.suvbwToSuvlbm = suvlbm / suvbw;
|
|
691
|
-
}
|
|
692
|
-
if (suvbsa) {
|
|
693
|
-
petScaling.suvbwToSuvbsa = suvbsa / suvbw;
|
|
694
|
-
}
|
|
695
|
-
if (suvbw) {
|
|
696
|
-
petScaling.suvbw = suvbw;
|
|
697
|
-
}
|
|
698
|
-
this.scaling = { PT: petScaling };
|
|
699
|
-
}
|
|
700
|
-
}
|
|
701
|
-
function getScalarDataType(scalarData, numFrames) {
|
|
702
|
-
let type, byteSize;
|
|
703
|
-
if (scalarData instanceof Uint8Array) {
|
|
704
|
-
type = 'Uint8Array';
|
|
705
|
-
byteSize = 1;
|
|
706
|
-
}
|
|
707
|
-
else if (scalarData instanceof Float32Array) {
|
|
708
|
-
type = 'Float32Array';
|
|
709
|
-
byteSize = 4;
|
|
710
|
-
}
|
|
711
|
-
else if (scalarData instanceof Uint16Array) {
|
|
712
|
-
type = 'Uint16Array';
|
|
713
|
-
byteSize = 2;
|
|
714
|
-
}
|
|
715
|
-
else if (scalarData instanceof Int16Array) {
|
|
716
|
-
type = 'Int16Array';
|
|
717
|
-
byteSize = 2;
|
|
718
|
-
}
|
|
719
|
-
else {
|
|
720
|
-
throw new Error('Unsupported array type');
|
|
721
|
-
}
|
|
722
|
-
const length = scalarData.length / numFrames;
|
|
723
|
-
const lengthInBytes = length * byteSize;
|
|
724
|
-
return { type, byteSize, length, lengthInBytes };
|
|
725
|
-
}
|
|
726
|
-
function handleArrayBufferLoad(scalarData, image, options) {
|
|
727
|
-
if (!(scalarData.buffer instanceof ArrayBuffer)) {
|
|
728
|
-
return;
|
|
729
|
-
}
|
|
730
|
-
const offset = options.targetBuffer.offset;
|
|
731
|
-
const length = options.targetBuffer.length;
|
|
732
|
-
const pixelData = image.pixelData ? image.pixelData : image.getPixelData();
|
|
733
|
-
try {
|
|
734
|
-
if (scalarData instanceof Float32Array) {
|
|
735
|
-
const bytesInFloat = 4;
|
|
736
|
-
const floatView = new Float32Array(pixelData);
|
|
737
|
-
if (floatView.length !== length) {
|
|
738
|
-
throw 'Error pixelData length does not match frame length';
|
|
739
|
-
}
|
|
740
|
-
scalarData.set(floatView, offset / bytesInFloat);
|
|
741
|
-
}
|
|
742
|
-
if (scalarData instanceof Int16Array) {
|
|
743
|
-
const bytesInInt16 = 2;
|
|
744
|
-
const intView = new Int16Array(pixelData);
|
|
745
|
-
if (intView.length !== length) {
|
|
746
|
-
throw 'Error pixelData length does not match frame length';
|
|
747
|
-
}
|
|
748
|
-
scalarData.set(intView, offset / bytesInInt16);
|
|
749
|
-
}
|
|
750
|
-
if (scalarData instanceof Uint16Array) {
|
|
751
|
-
const bytesInUint16 = 2;
|
|
752
|
-
const intView = new Uint16Array(pixelData);
|
|
753
|
-
if (intView.length !== length) {
|
|
754
|
-
throw 'Error pixelData length does not match frame length';
|
|
755
|
-
}
|
|
756
|
-
scalarData.set(intView, offset / bytesInUint16);
|
|
757
|
-
}
|
|
758
|
-
if (scalarData instanceof Uint8Array) {
|
|
759
|
-
const bytesInUint8 = 1;
|
|
760
|
-
const intView = new Uint8Array(pixelData);
|
|
761
|
-
if (intView.length !== length) {
|
|
762
|
-
throw 'Error pixelData length does not match frame length';
|
|
763
|
-
}
|
|
764
|
-
scalarData.set(intView, offset / bytesInUint8);
|
|
765
|
-
}
|
|
766
|
-
}
|
|
767
|
-
catch (e) {
|
|
768
|
-
console.error(e);
|
|
769
|
-
}
|
|
770
|
-
}
|
|
771
|
-
|
|
772
|
-
;// CONCATENATED MODULE: ../../../node_modules/@cornerstonejs/streaming-image-volume-loader/dist/esm/StreamingImageVolume.js
|
|
773
|
-
|
|
774
|
-
class StreamingImageVolume extends BaseStreamingImageVolume {
|
|
775
|
-
constructor(imageVolumeProperties, streamingProperties) {
|
|
776
|
-
if (!imageVolumeProperties.imageIds) {
|
|
777
|
-
imageVolumeProperties.imageIds = streamingProperties.imageIds;
|
|
778
|
-
}
|
|
779
|
-
super(imageVolumeProperties, streamingProperties);
|
|
780
|
-
this.getImageIdsToLoad = () => {
|
|
781
|
-
const { imageIds } = this;
|
|
782
|
-
this.numFrames = imageIds.length;
|
|
783
|
-
return imageIds;
|
|
784
|
-
};
|
|
785
|
-
}
|
|
786
|
-
getScalarData() {
|
|
787
|
-
return this.scalarData;
|
|
788
|
-
}
|
|
789
|
-
getImageLoadRequests(priority) {
|
|
790
|
-
const { imageIds } = this;
|
|
791
|
-
return this.getImageIdsRequests(imageIds, priority);
|
|
792
|
-
}
|
|
793
|
-
}
|
|
794
|
-
|
|
795
|
-
;// CONCATENATED MODULE: ../../../node_modules/@cornerstonejs/streaming-image-volume-loader/dist/esm/cornerstoneStreamingImageVolumeLoader.js
|
|
796
|
-
|
|
797
|
-
|
|
798
|
-
function cornerstoneStreamingImageVolumeLoader(volumeId, options) {
|
|
799
|
-
if (!options || !options.imageIds || !options.imageIds.length) {
|
|
800
|
-
throw new Error('ImageIds must be provided to create a streaming image volume');
|
|
801
|
-
}
|
|
802
|
-
async function getStreamingImageVolume() {
|
|
803
|
-
if (options.imageIds[0].split(':')[0] === 'wadouri') {
|
|
804
|
-
const [middleImageIndex, lastImageIndex] = [
|
|
805
|
-
Math.floor(options.imageIds.length / 2),
|
|
806
|
-
options.imageIds.length - 1,
|
|
807
|
-
];
|
|
808
|
-
const indexesToPrefetch = [0, middleImageIndex, lastImageIndex];
|
|
809
|
-
await Promise.all(indexesToPrefetch.map((index) => {
|
|
810
|
-
return new Promise((resolve, reject) => {
|
|
811
|
-
const imageId = options.imageIds[index];
|
|
812
|
-
esm.imageLoadPoolManager.addRequest(async () => {
|
|
813
|
-
esm.imageLoader.loadImage(imageId)
|
|
814
|
-
.then(() => {
|
|
815
|
-
console.log(`Prefetched imageId: ${imageId}`);
|
|
816
|
-
resolve(true);
|
|
817
|
-
})
|
|
818
|
-
.catch((err) => {
|
|
819
|
-
reject(err);
|
|
820
|
-
});
|
|
821
|
-
}, esm.Enums.RequestType.Prefetch, { volumeId }, 1);
|
|
822
|
-
});
|
|
823
|
-
})).catch(console.error);
|
|
824
|
-
}
|
|
825
|
-
const { dimensions, spacing, origin, scalarData, direction, sizeInBytes, metadata, imageIds, } = esm.utilities.generateVolumePropsFromImageIds(options.imageIds, volumeId);
|
|
826
|
-
const streamingImageVolume = new StreamingImageVolume({
|
|
827
|
-
volumeId,
|
|
828
|
-
metadata,
|
|
829
|
-
dimensions,
|
|
830
|
-
spacing,
|
|
831
|
-
origin,
|
|
832
|
-
direction,
|
|
833
|
-
scalarData,
|
|
834
|
-
sizeInBytes,
|
|
835
|
-
imageIds,
|
|
836
|
-
}, {
|
|
837
|
-
imageIds,
|
|
838
|
-
loadStatus: {
|
|
839
|
-
loaded: false,
|
|
840
|
-
loading: false,
|
|
841
|
-
cancelled: false,
|
|
842
|
-
cachedFrames: [],
|
|
843
|
-
callbacks: [],
|
|
844
|
-
},
|
|
845
|
-
});
|
|
846
|
-
return streamingImageVolume;
|
|
847
|
-
}
|
|
848
|
-
const streamingImageVolumePromise = getStreamingImageVolume();
|
|
849
|
-
return {
|
|
850
|
-
promise: streamingImageVolumePromise,
|
|
851
|
-
decache: () => {
|
|
852
|
-
streamingImageVolumePromise.then((streamingImageVolume) => {
|
|
853
|
-
streamingImageVolume.destroy();
|
|
854
|
-
streamingImageVolume = null;
|
|
855
|
-
});
|
|
856
|
-
},
|
|
857
|
-
cancel: () => {
|
|
858
|
-
streamingImageVolumePromise.then((streamingImageVolume) => {
|
|
859
|
-
streamingImageVolume.cancelLoading();
|
|
860
|
-
});
|
|
861
|
-
},
|
|
862
|
-
};
|
|
863
|
-
}
|
|
864
|
-
/* harmony default export */ const esm_cornerstoneStreamingImageVolumeLoader = (cornerstoneStreamingImageVolumeLoader);
|
|
865
|
-
|
|
866
|
-
;// CONCATENATED MODULE: ../../../node_modules/@cornerstonejs/streaming-image-volume-loader/dist/esm/enums/Events.js
|
|
867
|
-
var Events;
|
|
868
|
-
(function (Events) {
|
|
869
|
-
Events["DYNAMIC_VOLUME_TIME_POINT_INDEX_CHANGED"] = "DYNAMIC_VOLUME_TIME_POINT_INDEX_CHANGED";
|
|
870
|
-
})(Events || (Events = {}));
|
|
871
|
-
/* harmony default export */ const enums_Events = (Events);
|
|
872
|
-
|
|
873
|
-
;// CONCATENATED MODULE: ../../../node_modules/@cornerstonejs/streaming-image-volume-loader/dist/esm/enums/index.js
|
|
874
|
-
|
|
875
|
-
|
|
876
|
-
|
|
877
|
-
;// CONCATENATED MODULE: ../../../node_modules/@cornerstonejs/streaming-image-volume-loader/dist/esm/StreamingDynamicImageVolume.js
|
|
878
|
-
|
|
879
|
-
|
|
880
|
-
|
|
881
|
-
class StreamingDynamicImageVolume_StreamingDynamicImageVolume extends BaseStreamingImageVolume {
|
|
882
|
-
constructor(imageVolumeProperties, streamingProperties) {
|
|
883
|
-
StreamingDynamicImageVolume_StreamingDynamicImageVolume._ensureValidData(imageVolumeProperties, streamingProperties);
|
|
884
|
-
super(imageVolumeProperties, streamingProperties);
|
|
885
|
-
this._timePointIndex = 0;
|
|
886
|
-
this._getTimePointRequests = (timePoint, priority) => {
|
|
887
|
-
const { imageIds } = timePoint;
|
|
888
|
-
return this.getImageIdsRequests(imageIds, priority);
|
|
889
|
-
};
|
|
890
|
-
this._getTimePointsRequests = (priority) => {
|
|
891
|
-
const timePoints = this._getTimePointsToLoad();
|
|
892
|
-
let timePointsRequests = [];
|
|
893
|
-
timePoints.forEach((timePoint) => {
|
|
894
|
-
const timePointRequests = this._getTimePointRequests(timePoint, priority);
|
|
895
|
-
timePointsRequests = timePointsRequests.concat(timePointRequests);
|
|
896
|
-
});
|
|
897
|
-
return timePointsRequests;
|
|
898
|
-
};
|
|
899
|
-
this.getImageLoadRequests = (priority) => {
|
|
900
|
-
return this._getTimePointsRequests(priority);
|
|
901
|
-
};
|
|
902
|
-
this._numTimePoints = this.scalarData.length;
|
|
903
|
-
this._timePoints = this._getTimePointsData();
|
|
904
|
-
}
|
|
905
|
-
static _ensureValidData(imageVolumeProperties, streamingProperties) {
|
|
906
|
-
const imageIds = streamingProperties.imageIds;
|
|
907
|
-
const scalarDataArrays = (imageVolumeProperties.scalarData);
|
|
908
|
-
if (imageIds.length % scalarDataArrays.length !== 0) {
|
|
909
|
-
throw new Error(`Number of imageIds is not a multiple of ${scalarDataArrays.length}`);
|
|
910
|
-
}
|
|
911
|
-
}
|
|
912
|
-
_getTimePointsData() {
|
|
913
|
-
const { imageIds } = this;
|
|
914
|
-
const scalarData = this.scalarData;
|
|
915
|
-
const { numFrames } = this;
|
|
916
|
-
const numTimePoints = scalarData.length;
|
|
917
|
-
const timePoints = [];
|
|
918
|
-
for (let i = 0; i < numTimePoints; i++) {
|
|
919
|
-
const start = i * numFrames;
|
|
920
|
-
const end = start + numFrames;
|
|
921
|
-
timePoints.push({
|
|
922
|
-
imageIds: imageIds.slice(start, end),
|
|
923
|
-
scalarData: scalarData[i],
|
|
924
|
-
});
|
|
925
|
-
}
|
|
926
|
-
return timePoints;
|
|
927
|
-
}
|
|
928
|
-
_getTimePointsToLoad() {
|
|
929
|
-
const timePoints = this._timePoints;
|
|
930
|
-
const initialTimePointIndex = this._timePointIndex;
|
|
931
|
-
const timePointsToLoad = [timePoints[initialTimePointIndex]];
|
|
932
|
-
let leftIndex = initialTimePointIndex - 1;
|
|
933
|
-
let rightIndex = initialTimePointIndex + 1;
|
|
934
|
-
while (leftIndex >= 0 || rightIndex < timePoints.length) {
|
|
935
|
-
if (leftIndex >= 0) {
|
|
936
|
-
timePointsToLoad.push(timePoints[leftIndex--]);
|
|
937
|
-
}
|
|
938
|
-
if (rightIndex < timePoints.length) {
|
|
939
|
-
timePointsToLoad.push(timePoints[rightIndex++]);
|
|
940
|
-
}
|
|
941
|
-
}
|
|
942
|
-
return timePointsToLoad;
|
|
943
|
-
}
|
|
944
|
-
getImageIdsToLoad() {
|
|
945
|
-
const timePoints = this._getTimePointsToLoad();
|
|
946
|
-
let imageIds = [];
|
|
947
|
-
timePoints.forEach((timePoint) => {
|
|
948
|
-
const { imageIds: timePointIds } = timePoint;
|
|
949
|
-
imageIds = imageIds.concat(timePointIds);
|
|
950
|
-
});
|
|
951
|
-
return imageIds;
|
|
952
|
-
}
|
|
953
|
-
isDynamicVolume() {
|
|
954
|
-
return true;
|
|
955
|
-
}
|
|
956
|
-
get timePointIndex() {
|
|
957
|
-
return this._timePointIndex;
|
|
958
|
-
}
|
|
959
|
-
set timePointIndex(newTimePointIndex) {
|
|
960
|
-
if (newTimePointIndex < 0 || newTimePointIndex >= this.numTimePoints) {
|
|
961
|
-
throw new Error(`Invalid timePointIndex (${newTimePointIndex})`);
|
|
962
|
-
}
|
|
963
|
-
if (this._timePointIndex === newTimePointIndex) {
|
|
964
|
-
return;
|
|
965
|
-
}
|
|
966
|
-
const { imageData } = this;
|
|
967
|
-
this._timePointIndex = newTimePointIndex;
|
|
968
|
-
imageData.getPointData().setActiveScalars(`timePoint-${newTimePointIndex}`);
|
|
969
|
-
this.invalidateVolume(true);
|
|
970
|
-
(0,esm.triggerEvent)(esm.eventTarget, enums_Events.DYNAMIC_VOLUME_TIME_POINT_INDEX_CHANGED, {
|
|
971
|
-
volumeId: this.volumeId,
|
|
972
|
-
timePointIndex: newTimePointIndex,
|
|
973
|
-
});
|
|
974
|
-
}
|
|
975
|
-
get numTimePoints() {
|
|
976
|
-
return this._numTimePoints;
|
|
977
|
-
}
|
|
978
|
-
getScalarData() {
|
|
979
|
-
return this.scalarData[this._timePointIndex];
|
|
980
|
-
}
|
|
981
|
-
}
|
|
982
|
-
|
|
983
|
-
;// CONCATENATED MODULE: ../../../node_modules/@cornerstonejs/streaming-image-volume-loader/dist/esm/cornerstoneStreamingDynamicImageVolumeLoader.js
|
|
984
|
-
|
|
985
|
-
|
|
986
|
-
function get4DVolumeInfo(imageIds) {
|
|
987
|
-
const imageIdsGroups = splitImageIdsBy4DTags(imageIds);
|
|
988
|
-
return imageIdsGroups.map((imageIds) => getVolumeInfo(imageIds));
|
|
989
|
-
}
|
|
990
|
-
function cornerstoneStreamingDynamicImageVolumeLoader(volumeId, options) {
|
|
991
|
-
if (!options || !options.imageIds || !options.imageIds.length) {
|
|
992
|
-
throw new Error('ImageIds must be provided to create a 4D streaming image volume');
|
|
993
|
-
}
|
|
994
|
-
const { imageIds } = options;
|
|
995
|
-
const volumesInfo = get4DVolumeInfo(imageIds);
|
|
996
|
-
const { metadata: volumeMetadata, dimensions, spacing, origin, direction, sizeInBytes, } = volumesInfo[0];
|
|
997
|
-
const sortedImageIdsArrays = [];
|
|
998
|
-
const scalarDataArrays = [];
|
|
999
|
-
volumesInfo.forEach((volumeInfo) => {
|
|
1000
|
-
sortedImageIdsArrays.push(volumeInfo.sortedImageIds);
|
|
1001
|
-
scalarDataArrays.push(volumeInfo.scalarData);
|
|
1002
|
-
});
|
|
1003
|
-
const sortedImageIds = sortedImageIdsArrays.flat();
|
|
1004
|
-
let streamingImageVolume = new StreamingDynamicImageVolume({
|
|
1005
|
-
volumeId,
|
|
1006
|
-
metadata: volumeMetadata,
|
|
1007
|
-
dimensions,
|
|
1008
|
-
spacing,
|
|
1009
|
-
origin,
|
|
1010
|
-
direction,
|
|
1011
|
-
scalarData: scalarDataArrays,
|
|
1012
|
-
sizeInBytes,
|
|
1013
|
-
imageIds: sortedImageIds,
|
|
1014
|
-
}, {
|
|
1015
|
-
imageIds: sortedImageIds,
|
|
1016
|
-
loadStatus: {
|
|
1017
|
-
loaded: false,
|
|
1018
|
-
loading: false,
|
|
1019
|
-
cancelled: false,
|
|
1020
|
-
cachedFrames: [],
|
|
1021
|
-
callbacks: [],
|
|
1022
|
-
},
|
|
1023
|
-
});
|
|
1024
|
-
return {
|
|
1025
|
-
promise: Promise.resolve(streamingImageVolume),
|
|
1026
|
-
decache: () => {
|
|
1027
|
-
streamingImageVolume.destroy();
|
|
1028
|
-
streamingImageVolume = null;
|
|
1029
|
-
},
|
|
1030
|
-
cancel: () => {
|
|
1031
|
-
streamingImageVolume.cancelLoading();
|
|
1032
|
-
},
|
|
1033
|
-
};
|
|
1034
|
-
}
|
|
1035
|
-
/* harmony default export */ const esm_cornerstoneStreamingDynamicImageVolumeLoader = ((/* unused pure expression or super */ null && (cornerstoneStreamingDynamicImageVolumeLoader)));
|
|
1036
|
-
|
|
1037
|
-
;// CONCATENATED MODULE: ../../../node_modules/@cornerstonejs/streaming-image-volume-loader/dist/esm/index.js
|
|
1038
|
-
|
|
1039
|
-
|
|
1040
|
-
|
|
1041
|
-
|
|
1042
|
-
|
|
1043
|
-
|
|
1044
|
-
const helpers = {
|
|
1045
|
-
getDynamicVolumeInfo: helpers_getDynamicVolumeInfo,
|
|
1046
|
-
};
|
|
1047
|
-
|
|
1048
|
-
|
|
1049
|
-
|
|
1050
|
-
/***/ }),
|
|
2
|
+
(globalThis["webpackChunk"] = globalThis["webpackChunk"] || []).push([[445],{
|
|
1051
3
|
|
|
1052
4
|
/***/ 90445:
|
|
1053
5
|
/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {
|