@niivue/niivue 0.47.0 → 0.48.0

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/build/index.d.ts CHANGED
@@ -404,7 +404,8 @@ declare class NVImage {
404
404
  readMIF(buffer: ArrayBuffer, pairedImgData: ArrayBuffer | null): ArrayBuffer;
405
405
  readNRRD(dataBuffer: ArrayBuffer, pairedImgData: ArrayBuffer | null): ArrayBuffer;
406
406
  calculateRAS(): void;
407
- img2RAS(): TypedVoxelArray;
407
+ hdr2RAS(nVolumes?: number): nifti.NIFTI1 | nifti.NIFTI2;
408
+ img2RAS(nVolume?: number): TypedVoxelArray;
408
409
  vox2mm(XYZ: number[], mtx: mat4): vec3;
409
410
  mm2vox(mm: number[], frac?: boolean): Float32Array | vec3;
410
411
  arrayEquals(a: unknown[], b: unknown[]): boolean;
package/build/index.js CHANGED
@@ -10,7 +10,7 @@ var __publicField = (obj, key, value) => __defNormalProp(obj, typeof key !== "sy
10
10
  import { mat4 as mat46, vec2, vec3 as vec311, vec4 as vec48 } from "gl-matrix";
11
11
 
12
12
  // package.json
13
- var version = "0.47.0";
13
+ var version = "0.48.0";
14
14
 
15
15
  // src/logger.ts
16
16
  var _Log = class _Log {
@@ -20867,9 +20867,48 @@ var NVImage = class _NVImage {
20867
20867
  this.img2RASstart = outStart;
20868
20868
  this.calculateOblique();
20869
20869
  }
20870
+ // Reorient raw header data to RAS
20871
+ // assume single volume, use nVolumes to specify, set nVolumes = 0 for same as input
20872
+ hdr2RAS(nVolumes = 1) {
20873
+ if (!this.permRAS) {
20874
+ throw new Error("permRAS undefined");
20875
+ }
20876
+ if (!this.hdr) {
20877
+ throw new Error("hdr undefined");
20878
+ }
20879
+ const hdrBytes = hdrToArrayBuffer({ ...this.hdr, vox_offset: 352 }, false);
20880
+ const hdr = nifti.readHeader(hdrBytes.buffer, true);
20881
+ if (nVolumes === 1) {
20882
+ hdr.dims[0] = 3;
20883
+ hdr.dims[4] = 1;
20884
+ } else if (nVolumes > 1) {
20885
+ hdr.dims[0] = 4;
20886
+ hdr.dims[4] = nVolumes;
20887
+ }
20888
+ const perm = this.permRAS.slice();
20889
+ if (perm[0] === 1 && perm[1] === 2 && perm[2] === 3) {
20890
+ return hdr;
20891
+ }
20892
+ hdr.qform_code = 0;
20893
+ for (let i = 1; i < 4; i++) {
20894
+ hdr.dims[i] = this.dimsRAS[i];
20895
+ }
20896
+ for (let i = 0; i < this.pixDimsRAS.length; i++) {
20897
+ hdr.pixDims[i] = this.pixDimsRAS[i];
20898
+ }
20899
+ let k = 0;
20900
+ for (let i = 0; i < 4; i++) {
20901
+ for (let j = 0; j < 4; j++) {
20902
+ hdr.affine[i][j] = this.matRAS[k];
20903
+ k++;
20904
+ }
20905
+ }
20906
+ return hdr;
20907
+ }
20870
20908
  // Reorient raw image data to RAS
20871
20909
  // note that GPU-based orient shader is much faster
20872
- img2RAS() {
20910
+ // returns single 3D volume even for 4D input. Use nVolume to select volume (0 indexed)
20911
+ img2RAS(nVolume = 0) {
20873
20912
  if (!this.permRAS) {
20874
20913
  throw new Error("permRAS undefined");
20875
20914
  }
@@ -20884,7 +20923,13 @@ var NVImage = class _NVImage {
20884
20923
  return this.img;
20885
20924
  }
20886
20925
  const hdr = this.hdr;
20887
- const imgRAS = this.img.slice(0, hdr.dims[1] * hdr.dims[1] * hdr.dims[2] * hdr.dims[3]);
20926
+ const nVox = hdr.dims[1] * hdr.dims[2] * hdr.dims[3];
20927
+ let volSkip = nVolume * nVox;
20928
+ if (volSkip + nVox > this.img.length || volSkip < 0) {
20929
+ volSkip = 0;
20930
+ log.warn(`img2RAS nVolume (${nVolume}) out of bounds (${nVolume}+1)\xD7${nVox} > ${this.img.length}`);
20931
+ }
20932
+ const imgRAS = this.img.slice(0, nVox);
20888
20933
  const aperm = [Math.abs(perm[0]), Math.abs(perm[1]), Math.abs(perm[2])];
20889
20934
  const outdim = [hdr.dims[aperm[0]], hdr.dims[aperm[1]], hdr.dims[aperm[2]]];
20890
20935
  const inStep = [1, hdr.dims[1], hdr.dims[1] * hdr.dims[2]];
@@ -20903,7 +20948,7 @@ var NVImage = class _NVImage {
20903
20948
  const yi = outStart[1] + y * outStep[1];
20904
20949
  for (let x = 0; x < outdim[0]; x++) {
20905
20950
  const xi = outStart[0] + x * outStep[0];
20906
- imgRAS[j] = this.img[xi + yi + zi];
20951
+ imgRAS[j] = this.img[xi + yi + zi + volSkip];
20907
20952
  j++;
20908
20953
  }
20909
20954
  }