@cornerstonejs/nifti-volume-loader 2.0.0-beta.6 → 2.0.0-beta.7

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.
@@ -12,7 +12,7 @@ type NiftiImageProperties = {
12
12
  export default class NiftiImageVolume extends ImageVolume {
13
13
  loadStatus: LoadStatus;
14
14
  controller: AbortController;
15
- constructor(imageVolumeProperties: Types.IVolume, streamingProperties: NiftiImageProperties);
15
+ constructor(imageVolumeProperties: Types.ImageVolumeProps, streamingProperties: NiftiImageProperties);
16
16
  cancelLoading: () => void;
17
17
  clearLoadCallbacks(): void;
18
18
  load: (callback: (...args: unknown[]) => void, priority?: number) => void;
@@ -1 +1 @@
1
- {"version":3,"file":"NiftiImageVolume.js","sourceRoot":"","sources":["../../src/NiftiImageVolume.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,KAAK,EAAE,MAAM,qBAAqB,CAAC;AAkBzD,MAAM,CAAC,OAAO,OAAO,gBAAiB,SAAQ,WAAW;IAIvD,YACE,qBAAoC,EACpC,mBAAyC;QAEzC,KAAK,CAAC,qBAAqB,CAAC,CAAC;QAWxB,kBAAa,GAAG,GAAG,EAAE;YAC1B,MAAM,EAAE,UAAU,EAAE,GAAG,IAAI,CAAC;YAE5B,IAAI,CAAC,UAAU,IAAI,CAAC,UAAU,CAAC,OAAO,EAAE;gBACtC,OAAO;aACR;YAGD,UAAU,CAAC,OAAO,GAAG,KAAK,CAAC;YAG3B,IAAI,CAAC,kBAAkB,EAAE,CAAC;YAE1B,IAAI,CAAC,UAAU,CAAC,KAAK,EAAE,CAAC;QAC1B,CAAC,CAAC;QAeK,SAAI,GAAG,CACZ,QAAsC,EACtC,QAAQ,GAAG,CAAC,EACN,EAAE;QAMV,CAAC,CAAC;QA/CA,IAAI,CAAC,UAAU,GAAG,mBAAmB,CAAC,UAAU,CAAC;QACjD,IAAI,CAAC,UAAU,GAAG,mBAAmB,CAAC,UAAU,CAAC;IACnD,CAAC;IA0BM,kBAAkB;QACvB,IAAI,CAAC,UAAU,CAAC,SAAS,GAAG,EAAE,CAAC;IACjC,CAAC;IAmBM,OAAO;QACZ,KAAK,CAAC,sBAAsB,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;IAC9C,CAAC;CACF"}
1
+ {"version":3,"file":"NiftiImageVolume.js","sourceRoot":"","sources":["../../src/NiftiImageVolume.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,KAAK,EAAE,MAAM,qBAAqB,CAAC;AAkBzD,MAAM,CAAC,OAAO,OAAO,gBAAiB,SAAQ,WAAW;IAIvD,YACE,qBAA6C,EAC7C,mBAAyC;QAEzC,KAAK,CAAC,qBAAqB,CAAC,CAAC;QAWxB,kBAAa,GAAG,GAAG,EAAE;YAC1B,MAAM,EAAE,UAAU,EAAE,GAAG,IAAI,CAAC;YAE5B,IAAI,CAAC,UAAU,IAAI,CAAC,UAAU,CAAC,OAAO,EAAE;gBACtC,OAAO;aACR;YAGD,UAAU,CAAC,OAAO,GAAG,KAAK,CAAC;YAG3B,IAAI,CAAC,kBAAkB,EAAE,CAAC;YAE1B,IAAI,CAAC,UAAU,CAAC,KAAK,EAAE,CAAC;QAC1B,CAAC,CAAC;QAeK,SAAI,GAAG,CACZ,QAAsC,EACtC,QAAQ,GAAG,CAAC,EACN,EAAE;QAMV,CAAC,CAAC;QA/CA,IAAI,CAAC,UAAU,GAAG,mBAAmB,CAAC,UAAU,CAAC;QACjD,IAAI,CAAC,UAAU,GAAG,mBAAmB,CAAC,UAAU,CAAC;IACnD,CAAC;IA0BM,kBAAkB;QACvB,IAAI,CAAC,UAAU,CAAC,SAAS,GAAG,EAAE,CAAC;IACjC,CAAC;IAmBM,OAAO;QACZ,KAAK,CAAC,sBAAsB,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;IAC9C,CAAC;CACF"}
@@ -1,4 +1,4 @@
1
- import type { Types } from '@cornerstonejs/core';
1
+ import { Types } from '@cornerstonejs/core';
2
2
  declare const invertDataPerFrame: (dimensions: any, imageDataArray: any) => any;
3
3
  declare function rasToLps(niftiHeader: any): {
4
4
  origin: Types.Point3;
@@ -1,10 +1,12 @@
1
+ import { getShouldUseSharedArrayBuffer } from '@cornerstonejs/core';
1
2
  import { parseAffineMatrix } from './affineUtilities';
2
3
  const invertDataPerFrame = (dimensions, imageDataArray) => {
3
4
  let TypedArrayConstructor;
4
5
  let bytesPerVoxel;
5
6
  if (imageDataArray instanceof Uint8Array ||
6
7
  imageDataArray instanceof ArrayBuffer ||
7
- imageDataArray instanceof SharedArrayBuffer) {
8
+ (getShouldUseSharedArrayBuffer() &&
9
+ imageDataArray instanceof SharedArrayBuffer)) {
8
10
  TypedArrayConstructor = Uint8Array;
9
11
  bytesPerVoxel = 1;
10
12
  }
@@ -1 +1 @@
1
- {"version":3,"file":"convert.js","sourceRoot":"","sources":["../../../src/helpers/convert.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"convert.js","sourceRoot":"","sources":["../../../src/helpers/convert.ts"],"names":[],"mappings":"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"}
@@ -1,4 +1,3 @@
1
1
  import NiftiImageVolume from '../NiftiImageVolume';
2
2
  export declare const urlsMap: Map<any, any>;
3
- export declare const getTypedNiftiArray: (datatypeCode: any, niftiImageBuffer: any) => Float32Array | Int16Array | Uint8Array;
4
3
  export default function fetchAndAllocateNiftiVolume(volumeId: string): Promise<NiftiImageVolume>;
@@ -1,14 +1,11 @@
1
1
  import * as NiftiReader from 'nifti-reader-js';
2
- import { cache, utilities, Enums, eventTarget, triggerEvent, } from '@cornerstonejs/core';
3
- import { vec3 } from 'gl-matrix';
4
- import makeVolumeMetadata from './makeVolumeMetadata';
2
+ import { eventTarget, triggerEvent } from '@cornerstonejs/core';
5
3
  import NiftiImageVolume from '../NiftiImageVolume';
6
- import * as NIFTICONSTANTS from './niftiConstants';
7
- import { invertDataPerFrame, rasToLps } from './convert';
8
- import modalityScaleNifti from './modalityScaleNifti';
4
+ import { rasToLps } from './convert';
9
5
  import Events from '../enums/Events';
10
6
  import { NIFTI_LOADER_SCHEME } from '../constants';
11
- const { createUint8SharedArray, createFloat32SharedArray } = utilities;
7
+ import makeVolumeMetadata from './makeVolumeMetadata';
8
+ import modalityScaleNifti from './modalityScaleNifti';
12
9
  export const urlsMap = new Map();
13
10
  function fetchArrayBuffer(url, onProgress, signal, onload) {
14
11
  return new Promise((resolve, reject) => {
@@ -45,18 +42,6 @@ function fetchArrayBuffer(url, onProgress, signal, onload) {
45
42
  xhr.send();
46
43
  });
47
44
  }
48
- export const getTypedNiftiArray = (datatypeCode, niftiImageBuffer) => {
49
- switch (datatypeCode) {
50
- case NIFTICONSTANTS.NIFTI_TYPE_UINT8:
51
- return new Uint8Array(niftiImageBuffer);
52
- case NIFTICONSTANTS.NIFTI_TYPE_FLOAT32:
53
- return new Float32Array(niftiImageBuffer);
54
- case NIFTICONSTANTS.NIFTI_TYPE_INT16:
55
- return new Int16Array(niftiImageBuffer);
56
- default:
57
- throw new Error(`datatypeCode ${datatypeCode} is not yet supported`);
58
- }
59
- };
60
45
  export default async function fetchAndAllocateNiftiVolume(volumeId) {
61
46
  const niftiURL = volumeId.substring(NIFTI_LOADER_SCHEME.length + 1);
62
47
  const progress = (loaded, total) => {
@@ -85,63 +70,10 @@ export default async function fetchAndAllocateNiftiVolume(volumeId) {
85
70
  niftiHeader = NiftiReader.readHeader(niftiBuffer);
86
71
  niftiImage = NiftiReader.readImage(niftiHeader, niftiBuffer);
87
72
  }
88
- const typedNiftiArray = getTypedNiftiArray(niftiHeader.datatypeCode, niftiImage);
73
+ const { scalarData, pixelRepresentation } = modalityScaleNifti(niftiHeader, niftiImage);
89
74
  const { orientation, origin, spacing } = rasToLps(niftiHeader);
90
- invertDataPerFrame(niftiHeader.dims.slice(1, 4), typedNiftiArray);
91
- modalityScaleNifti(typedNiftiArray, niftiHeader);
92
- const volumeMetadata = makeVolumeMetadata(niftiHeader, orientation, typedNiftiArray);
93
- const scanAxisNormal = vec3.create();
94
- vec3.set(scanAxisNormal, orientation[6], orientation[7], orientation[8]);
95
- const { BitsAllocated, PixelRepresentation, PhotometricInterpretation, ImageOrientationPatient, Columns, Rows, } = volumeMetadata;
96
- const rowCosineVec = vec3.fromValues(ImageOrientationPatient[0], ImageOrientationPatient[1], ImageOrientationPatient[2]);
97
- const colCosineVec = vec3.fromValues(ImageOrientationPatient[3], ImageOrientationPatient[4], ImageOrientationPatient[5]);
98
- const { dims } = niftiHeader;
99
- const numFrames = dims[3];
100
- const dimensions = [Columns, Rows, numFrames];
101
- const direction = new Float32Array([
102
- rowCosineVec[0],
103
- rowCosineVec[1],
104
- rowCosineVec[2],
105
- colCosineVec[0],
106
- colCosineVec[1],
107
- colCosineVec[2],
108
- scanAxisNormal[0],
109
- scanAxisNormal[1],
110
- scanAxisNormal[2],
111
- ]);
112
- const signed = PixelRepresentation === 1;
113
- let bytesPerVoxel = 1;
114
- if (BitsAllocated === 16 || BitsAllocated === 32) {
115
- bytesPerVoxel = 4;
116
- }
117
- const sizeInBytesPerComponent = bytesPerVoxel * dimensions[0] * dimensions[1] * dimensions[2];
118
- let numComponents = 1;
119
- if (PhotometricInterpretation === 'RGB') {
120
- numComponents = 3;
121
- }
122
- const sizeInBytes = sizeInBytesPerComponent * numComponents;
123
- const isCacheable = cache.isCacheable(sizeInBytes);
124
- if (!isCacheable) {
125
- throw new Error(Enums.Events.CACHE_SIZE_EXCEEDED);
126
- }
127
- cache.decacheIfNecessaryUntilBytesAvailable(sizeInBytes);
128
- let scalarData;
129
- switch (BitsAllocated) {
130
- case 8:
131
- if (signed) {
132
- throw new Error('8 Bit signed images are not yet supported by this plugin.');
133
- }
134
- else {
135
- scalarData = createUint8SharedArray(dimensions[0] * dimensions[1] * dimensions[2]);
136
- }
137
- break;
138
- case 16:
139
- case 32:
140
- scalarData = createFloat32SharedArray(dimensions[0] * dimensions[1] * dimensions[2]);
141
- break;
142
- }
143
- scalarData.set(typedNiftiArray);
144
- const niftiImageVolume = new NiftiImageVolume({
75
+ const { volumeMetadata, dimensions, direction } = makeVolumeMetadata(niftiHeader, orientation, scalarData, pixelRepresentation);
76
+ return new NiftiImageVolume({
145
77
  volumeId,
146
78
  metadata: volumeMetadata,
147
79
  dimensions,
@@ -149,7 +81,8 @@ export default async function fetchAndAllocateNiftiVolume(volumeId) {
149
81
  origin,
150
82
  direction,
151
83
  scalarData,
152
- sizeInBytes,
84
+ sizeInBytes: scalarData.byteLength,
85
+ imageIds: [],
153
86
  }, {
154
87
  loadStatus: {
155
88
  loaded: false,
@@ -158,6 +91,5 @@ export default async function fetchAndAllocateNiftiVolume(volumeId) {
158
91
  },
159
92
  controller,
160
93
  });
161
- return niftiImageVolume;
162
94
  }
163
95
  //# sourceMappingURL=fetchAndAllocateNiftiVolume.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"fetchAndAllocateNiftiVolume.js","sourceRoot":"","sources":["../../../src/helpers/fetchAndAllocateNiftiVolume.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"fetchAndAllocateNiftiVolume.js","sourceRoot":"","sources":["../../../src/helpers/fetchAndAllocateNiftiVolume.ts"],"names":[],"mappings":"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"}
@@ -1,2 +1,6 @@
1
1
  import { Types } from '@cornerstonejs/core';
2
- export default function makeVolumeMetadata(niftiHeader: any, orientation: any, scalarData: any): Types.Metadata;
2
+ export default function makeVolumeMetadata(niftiHeader: any, orientation: any, scalarData: any, pixelRepresentation: any): {
3
+ volumeMetadata: Types.Metadata;
4
+ dimensions: Types.Point3;
5
+ direction: Types.Mat3;
6
+ };
@@ -1,17 +1,12 @@
1
+ import { utilities } from '@cornerstonejs/core';
1
2
  import { vec3 } from 'gl-matrix';
2
- export default function makeVolumeMetadata(niftiHeader, orientation, scalarData) {
3
+ const { windowLevel } = utilities;
4
+ export default function makeVolumeMetadata(niftiHeader, orientation, scalarData, pixelRepresentation) {
3
5
  const { numBitsPerVoxel, littleEndian, pixDims, dims } = niftiHeader;
4
- const rowCosines = vec3.create();
5
- const columnCosines = vec3.create();
6
- vec3.set(rowCosines, orientation[0], orientation[1], orientation[2]);
7
- vec3.set(columnCosines, orientation[3], orientation[4], orientation[5]);
8
6
  let min = Infinity;
9
7
  let max = -Infinity;
10
- const xDim = dims[1];
11
- const yDim = dims[2];
12
- const zDim = dims[3];
13
- const frameLength = xDim * yDim;
14
- const middleFrameIndex = Math.floor(zDim / 2);
8
+ const frameLength = dims[1] * dims[2];
9
+ const middleFrameIndex = Math.floor(dims[3] / 2);
15
10
  const offset = frameLength * middleFrameIndex;
16
11
  for (let voxelIndex = offset; voxelIndex < offset + frameLength; voxelIndex++) {
17
12
  const voxelValue = scalarData[voxelIndex];
@@ -22,30 +17,49 @@ export default function makeVolumeMetadata(niftiHeader, orientation, scalarData)
22
17
  min = voxelValue;
23
18
  }
24
19
  }
25
- const windowCenter = (max + min) / 2;
26
- const windowWidth = max - min;
20
+ const { windowWidth, windowCenter } = windowLevel.toWindowLevel(min, max);
21
+ const rowCosines = vec3.create();
22
+ const columnCosines = vec3.create();
23
+ const scanAxisNormal = vec3.create();
24
+ vec3.set(rowCosines, orientation[0], orientation[1], orientation[2]);
25
+ vec3.set(columnCosines, orientation[3], orientation[4], orientation[5]);
26
+ vec3.set(scanAxisNormal, orientation[6], orientation[7], orientation[8]);
27
27
  return {
28
- BitsAllocated: numBitsPerVoxel,
29
- BitsStored: numBitsPerVoxel,
30
- SamplesPerPixel: 1,
31
- HighBit: littleEndian ? numBitsPerVoxel - 1 : 1,
32
- PhotometricInterpretation: 'MONOCHROME2',
33
- PixelRepresentation: 1,
34
- ImageOrientationPatient: [
28
+ volumeMetadata: {
29
+ BitsAllocated: numBitsPerVoxel,
30
+ BitsStored: numBitsPerVoxel,
31
+ SamplesPerPixel: 1,
32
+ HighBit: littleEndian ? numBitsPerVoxel - 1 : 1,
33
+ PhotometricInterpretation: 'MONOCHROME2',
34
+ PixelRepresentation: pixelRepresentation,
35
+ ImageOrientationPatient: [
36
+ rowCosines[0],
37
+ rowCosines[1],
38
+ rowCosines[2],
39
+ columnCosines[0],
40
+ columnCosines[1],
41
+ columnCosines[2],
42
+ ],
43
+ PixelSpacing: [pixDims[1], pixDims[2]],
44
+ Columns: dims[1],
45
+ Rows: dims[2],
46
+ voiLut: [{ windowCenter, windowWidth }],
47
+ FrameOfReferenceUID: '1.2.3',
48
+ Modality: 'MR',
49
+ VOILUTFunction: 'LINEAR',
50
+ },
51
+ dimensions: [dims[1], dims[2], dims[3]],
52
+ direction: new Float32Array([
35
53
  rowCosines[0],
36
54
  rowCosines[1],
37
55
  rowCosines[2],
38
56
  columnCosines[0],
39
57
  columnCosines[1],
40
58
  columnCosines[2],
41
- ],
42
- PixelSpacing: [pixDims[1], pixDims[2]],
43
- Columns: xDim,
44
- Rows: yDim,
45
- voiLut: [{ windowCenter, windowWidth }],
46
- FrameOfReferenceUID: '1.2.3',
47
- Modality: 'MR',
48
- VOILUTFunction: 'LINEAR',
59
+ scanAxisNormal[0],
60
+ scanAxisNormal[1],
61
+ scanAxisNormal[2],
62
+ ]),
49
63
  };
50
64
  }
51
65
  //# sourceMappingURL=makeVolumeMetadata.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"makeVolumeMetadata.js","sourceRoot":"","sources":["../../../src/helpers/makeVolumeMetadata.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AAGjC,MAAM,CAAC,OAAO,UAAU,kBAAkB,CACxC,WAAW,EACX,WAAW,EACX,UAAU;IAEV,MAAM,EAAE,eAAe,EAAE,YAAY,EAAE,OAAO,EAAE,IAAI,EAAE,GAAG,WAAW,CAAC;IAErE,MAAM,UAAU,GAAG,IAAI,CAAC,MAAM,EAAE,CAAC;IACjC,MAAM,aAAa,GAAG,IAAI,CAAC,MAAM,EAAE,CAAC;IAEpC,IAAI,CAAC,GAAG,CAAC,UAAU,EAAE,WAAW,CAAC,CAAC,CAAC,EAAE,WAAW,CAAC,CAAC,CAAC,EAAE,WAAW,CAAC,CAAC,CAAC,CAAC,CAAC;IACrE,IAAI,CAAC,GAAG,CAAC,aAAa,EAAE,WAAW,CAAC,CAAC,CAAC,EAAE,WAAW,CAAC,CAAC,CAAC,EAAE,WAAW,CAAC,CAAC,CAAC,CAAC,CAAC;IAExE,IAAI,GAAG,GAAG,QAAQ,CAAC;IACnB,IAAI,GAAG,GAAG,CAAC,QAAQ,CAAC;IAEpB,MAAM,IAAI,GAAG,IAAI,CAAC,CAAC,CAAC,CAAC;IACrB,MAAM,IAAI,GAAG,IAAI,CAAC,CAAC,CAAC,CAAC;IACrB,MAAM,IAAI,GAAG,IAAI,CAAC,CAAC,CAAC,CAAC;IAErB,MAAM,WAAW,GAAG,IAAI,GAAG,IAAI,CAAC;IAEhC,MAAM,gBAAgB,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,GAAG,CAAC,CAAC,CAAC;IAE9C,MAAM,MAAM,GAAG,WAAW,GAAG,gBAAgB,CAAC;IAE9C,KACE,IAAI,UAAU,GAAG,MAAM,EACvB,UAAU,GAAG,MAAM,GAAG,WAAW,EACjC,UAAU,EAAE,EACZ;QACA,MAAM,UAAU,GAAG,UAAU,CAAC,UAAU,CAAC,CAAC;QAE1C,IAAI,UAAU,GAAG,GAAG,EAAE;YACpB,GAAG,GAAG,UAAU,CAAC;SAClB;QACD,IAAI,UAAU,GAAG,GAAG,EAAE;YACpB,GAAG,GAAG,UAAU,CAAC;SAClB;KACF;IAED,MAAM,YAAY,GAAG,CAAC,GAAG,GAAG,GAAG,CAAC,GAAG,CAAC,CAAC;IACrC,MAAM,WAAW,GAAG,GAAG,GAAG,GAAG,CAAC;IAE9B,OAAO;QACL,aAAa,EAAE,eAAe;QAC9B,UAAU,EAAE,eAAe;QAC3B,eAAe,EAAE,CAAC;QAClB,OAAO,EAAE,YAAY,CAAC,CAAC,CAAC,eAAe,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC;QAC/C,yBAAyB,EAAE,aAAa;QACxC,mBAAmB,EAAE,CAAC;QACtB,uBAAuB,EAAE;YACvB,UAAU,CAAC,CAAC,CAAC;YACb,UAAU,CAAC,CAAC,CAAC;YACb,UAAU,CAAC,CAAC,CAAC;YACb,aAAa,CAAC,CAAC,CAAC;YAChB,aAAa,CAAC,CAAC,CAAC;YAChB,aAAa,CAAC,CAAC,CAAC;SACjB;QACD,YAAY,EAAE,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,OAAO,CAAC,CAAC,CAAC,CAAC;QACtC,OAAO,EAAE,IAAI;QACb,IAAI,EAAE,IAAI;QAEV,MAAM,EAAE,CAAC,EAAE,YAAY,EAAE,WAAW,EAAE,CAAC;QAGvC,mBAAmB,EAAE,OAAO;QAC5B,QAAQ,EAAE,IAAI;QACd,cAAc,EAAE,QAAQ;KACzB,CAAC;AACJ,CAAC"}
1
+ {"version":3,"file":"makeVolumeMetadata.js","sourceRoot":"","sources":["../../../src/helpers/makeVolumeMetadata.ts"],"names":[],"mappings":"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"}
@@ -1 +1,5 @@
1
- export default function modalityScaleNifti(array: Float32Array | Int16Array | Uint8Array, niftiHeader: any): void;
1
+ import { Types } from '@cornerstonejs/core';
2
+ export default function modalityScaleNifti(niftiHeader: any, niftiImageBuffer: any): {
3
+ scalarData: Types.PixelDataTypedArray;
4
+ pixelRepresentation: number;
5
+ };
@@ -1,11 +1,148 @@
1
- export default function modalityScaleNifti(array, niftiHeader) {
2
- const arrayLength = array.length;
3
- const { scl_slope, scl_inter } = niftiHeader;
1
+ import { cache, Enums, getShouldUseSharedArrayBuffer, utilities, } from '@cornerstonejs/core';
2
+ import * as NIFTICONSTANTS from './niftiConstants';
3
+ const { createFloat32SharedArray, createInt16SharedArray, createUint8SharedArray, createUint16SharedArray, } = utilities;
4
+ export default function modalityScaleNifti(niftiHeader, niftiImageBuffer) {
5
+ const { datatypeCode, scl_slope, scl_inter } = niftiHeader;
6
+ let slope = scl_slope;
7
+ let inter = scl_inter;
4
8
  if (!scl_slope || scl_slope === 0 || Number.isNaN(scl_slope)) {
5
- return;
9
+ slope = 1;
6
10
  }
7
- for (let i = 0; i < arrayLength; i++) {
8
- array[i] = array[i] * scl_slope + scl_inter;
11
+ if (!scl_inter || Number.isNaN(scl_inter)) {
12
+ inter = 0;
9
13
  }
14
+ const hasNegativeRescale = inter < 0 || slope < 0;
15
+ const hasFloatRescale = inter % 1 !== 0 || slope % 1 !== 0;
16
+ let niiBuffer;
17
+ let scalarData;
18
+ let pixelRepresentation = 1;
19
+ switch (datatypeCode) {
20
+ case NIFTICONSTANTS.NIFTI_TYPE_UINT8:
21
+ niiBuffer = new Uint8Array(niftiImageBuffer);
22
+ if (hasFloatRescale) {
23
+ scalarData = allocateScalarData('Float32Array', niiBuffer);
24
+ }
25
+ else if (hasNegativeRescale) {
26
+ scalarData = allocateScalarData('Int16Array', niiBuffer);
27
+ }
28
+ else {
29
+ pixelRepresentation = 0;
30
+ scalarData = allocateScalarData('Uint8Array', niiBuffer);
31
+ }
32
+ break;
33
+ case NIFTICONSTANTS.NIFTI_TYPE_INT16:
34
+ niiBuffer = new Int16Array(niftiImageBuffer);
35
+ if (hasFloatRescale) {
36
+ scalarData = allocateScalarData('Float32Array', niiBuffer);
37
+ }
38
+ else {
39
+ scalarData = allocateScalarData('Int16Array', niiBuffer);
40
+ }
41
+ break;
42
+ case NIFTICONSTANTS.NIFTI_TYPE_INT32:
43
+ niiBuffer = new Int32Array(niftiImageBuffer);
44
+ scalarData = allocateScalarData('Float32Array', niiBuffer);
45
+ break;
46
+ case NIFTICONSTANTS.NIFTI_TYPE_FLOAT32: {
47
+ niiBuffer = new Float32Array(niftiImageBuffer);
48
+ scalarData = allocateScalarData('Float32Array', niiBuffer);
49
+ break;
50
+ }
51
+ case NIFTICONSTANTS.NIFTI_TYPE_INT8:
52
+ niiBuffer = new Int8Array(niftiImageBuffer);
53
+ if (hasFloatRescale) {
54
+ scalarData = allocateScalarData('Float32Array', niiBuffer);
55
+ }
56
+ else {
57
+ scalarData = allocateScalarData('Int8Array', niiBuffer);
58
+ }
59
+ break;
60
+ case NIFTICONSTANTS.NIFTI_TYPE_UINT16:
61
+ niiBuffer = new Uint16Array(niftiImageBuffer);
62
+ if (hasFloatRescale || hasNegativeRescale) {
63
+ scalarData = allocateScalarData('Float32Array', niiBuffer);
64
+ }
65
+ else {
66
+ pixelRepresentation = 0;
67
+ scalarData = allocateScalarData('Uint16Array', niiBuffer);
68
+ }
69
+ break;
70
+ case NIFTICONSTANTS.NIFTI_TYPE_UINT32:
71
+ niiBuffer = new Uint32Array(niftiImageBuffer);
72
+ scalarData = allocateScalarData('Float32Array', niiBuffer);
73
+ break;
74
+ default:
75
+ throw new Error(`NIFTI datatypeCode ${datatypeCode} is not yet supported`);
76
+ }
77
+ const nVox = scalarData.length;
78
+ if (slope !== 1 && inter !== 0) {
79
+ for (let i = 0; i < nVox; i++) {
80
+ scalarData[i] = intensityRaw2Scaled(scalarData[i], slope, inter);
81
+ }
82
+ }
83
+ niftiHeader.numBitsPerVoxel = (scalarData.byteLength / scalarData.length) * 8;
84
+ return {
85
+ scalarData,
86
+ pixelRepresentation,
87
+ };
88
+ }
89
+ function intensityRaw2Scaled(raw, scl_slope, scl_inter) {
90
+ return raw * scl_slope + scl_inter;
91
+ }
92
+ function checkCacheAvailable(bitsAllocated, length) {
93
+ const sizeInBytes = (bitsAllocated / 8) * length;
94
+ const isCacheable = cache.isCacheable(sizeInBytes);
95
+ if (!isCacheable) {
96
+ throw new Error(Enums.Events.CACHE_SIZE_EXCEEDED);
97
+ }
98
+ cache.decacheIfNecessaryUntilBytesAvailable(sizeInBytes);
99
+ return sizeInBytes;
100
+ }
101
+ function allocateScalarData(types, niiBuffer) {
102
+ let bitsAllocated;
103
+ let scalarData;
104
+ const useSharedArrayBuffer = getShouldUseSharedArrayBuffer();
105
+ const nVox = niiBuffer.length;
106
+ switch (types) {
107
+ case 'Float32Array':
108
+ bitsAllocated = 32;
109
+ checkCacheAvailable(bitsAllocated, nVox);
110
+ scalarData = useSharedArrayBuffer
111
+ ? createFloat32SharedArray(nVox)
112
+ : new Float32Array(nVox);
113
+ break;
114
+ case 'Int16Array':
115
+ bitsAllocated = 16;
116
+ checkCacheAvailable(bitsAllocated, nVox);
117
+ scalarData = useSharedArrayBuffer
118
+ ? createInt16SharedArray(nVox)
119
+ : new Int16Array(nVox);
120
+ break;
121
+ case 'Int8Array':
122
+ bitsAllocated = 8;
123
+ checkCacheAvailable(bitsAllocated, nVox);
124
+ scalarData = useSharedArrayBuffer
125
+ ? createInt16SharedArray(nVox)
126
+ : new Int16Array(nVox);
127
+ break;
128
+ case 'Uint16Array':
129
+ bitsAllocated = 16;
130
+ checkCacheAvailable(bitsAllocated, nVox);
131
+ scalarData = useSharedArrayBuffer
132
+ ? createUint16SharedArray(nVox)
133
+ : new Uint16Array(nVox);
134
+ break;
135
+ case 'Uint8Array':
136
+ bitsAllocated = 8;
137
+ checkCacheAvailable(bitsAllocated, nVox);
138
+ scalarData = useSharedArrayBuffer
139
+ ? createUint8SharedArray(nVox)
140
+ : new Uint8Array(nVox);
141
+ break;
142
+ default:
143
+ throw new Error(`TypedArray ${types} is not yet supported`);
144
+ }
145
+ scalarData.set(niiBuffer);
146
+ return scalarData;
10
147
  }
11
148
  //# sourceMappingURL=modalityScaleNifti.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"modalityScaleNifti.js","sourceRoot":"","sources":["../../../src/helpers/modalityScaleNifti.ts"],"names":[],"mappings":"AASA,MAAM,CAAC,OAAO,UAAU,kBAAkB,CACxC,KAA6C,EAC7C,WAAW;IAEX,MAAM,WAAW,GAAG,KAAK,CAAC,MAAM,CAAC;IACjC,MAAM,EAAE,SAAS,EAAE,SAAS,EAAE,GAAG,WAAW,CAAC;IAE7C,IAAI,CAAC,SAAS,IAAI,SAAS,KAAK,CAAC,IAAI,MAAM,CAAC,KAAK,CAAC,SAAS,CAAC,EAAE;QAE5D,OAAO;KACR;IAED,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,WAAW,EAAE,CAAC,EAAE,EAAE;QACpC,KAAK,CAAC,CAAC,CAAC,GAAG,KAAK,CAAC,CAAC,CAAC,GAAG,SAAS,GAAG,SAAS,CAAC;KAC7C;AACH,CAAC"}
1
+ {"version":3,"file":"modalityScaleNifti.js","sourceRoot":"","sources":["../../../src/helpers/modalityScaleNifti.ts"],"names":[],"mappings":"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"}