@niivue/niivue 0.55.0 → 0.57.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/README.md CHANGED
@@ -23,7 +23,7 @@ The command `npm run demo` will minify the project and locally host all of the [
23
23
 
24
24
  [Click here for the docs web page](https://niivue.github.io/niivue/devdocs/)
25
25
 
26
- # Projects and People using NiiVue
26
+ # NiiVue Users
27
27
 
28
28
  - Analysis of Functional NeuroImages (AFNI) [Scientific and Statistical Computing Core](https://afni.nimh.nih.gov/) (National Institutes of Health)
29
29
  - [BOOSTLET.js](https://boostlet.org/) image processing plugins work with NiiVue.
@@ -35,11 +35,14 @@ The command `npm run demo` will minify the project and locally host all of the [
35
35
  - [Digital Brain Bank](https://elifesciences.org/articles/73153) for navigating MRI datasets
36
36
  - FMRIB's Software Library (FSL) [Wellcome Centre for Integrative Neuroimaging](https://www.win.ox.ac.uk/) (University of Oxford)
37
37
  - FreeSurfer [Laboratories for Computational Neuroimaging](https://lcn.martinos.org/) (Massachusetts General Hospital) uses NiiVue for [FreeBrowse](https://github.com/freesurfer/freebrowse)
38
+ - [lazybids-ui](https://github.com/lazybids/lazybids-ui) is a web-based user interface for interacting with BIDS datasets.
38
39
  - [OpenNeuro.org](https://openneuro.org) uses NiiVue to visualize datasets
39
40
  - [neurodesk](https://www.neurodesk.org/) uses NiiVue for their [QSMxT Quantitative Susceptibility Mapping toolbox](https://github.com/QSMxT/QSMxT-UI)
41
+ - [neurosift](https://github.com/flatironinstitute/neurosift) provides NWB visualization and DANDI exploration
40
42
  - [Neuroinformatics Research and Development Group](http://neuroinformatics.uw.edu/) embeds NiiVue in [tractoscope](https://github.com/nrdg/tractoscope)
41
- - [nilearn](https://nilearn.github.io/stable/index.html) is extending [ipyniivue](https://github.com/niivue/ipyniivue)
43
+ - [NiiVueReader](https://github.com/BrunoDG/NiiVueReader) by Bruno Dias demonstrates a full stack deployment.
42
44
  - [niivue-vscode](https://github.com/niivue/niivue-vscode) is a VSCode extension for displaying images
45
+ - [nilearn](https://nilearn.github.io/stable/index.html) is extending [ipyniivue](https://github.com/niivue/ipyniivue)
43
46
  - [QuantCo](https://www.quantco.com/) is using NiiVue in medical imaging workflows
44
47
  - [FSL Clinical](https://fslclinical.com/) is using NiiVue in brain imaging reports
45
48
  - [brain2print](https://brain2print.org/) (from the NiiVue team) uses NiiVue for showing both volume data and converted meshes
package/build/index.d.ts CHANGED
@@ -152,13 +152,13 @@ declare class NVLabel3D {
152
152
  style: NVLabel3DStyle;
153
153
  points?: number[] | number[][];
154
154
  anchor: LabelAnchorPoint;
155
- onClick?: (label: NVLabel3D) => void;
155
+ onClick?: (label: NVLabel3D, e?: MouseEvent) => void;
156
156
  /**
157
157
  * @param text - The text of the label
158
158
  * @param style - The style of the label
159
159
  * @param points - An array of points label for label lines
160
160
  */
161
- constructor(text: string, style: NVLabel3DStyle, points?: number[] | number[][], anchor?: LabelAnchorPoint, onClick?: (label: NVLabel3D) => void);
161
+ constructor(text: string, style: NVLabel3DStyle, points?: number[] | number[][], anchor?: LabelAnchorPoint, onClick?: (label: NVLabel3D, e?: MouseEvent) => void);
162
162
  }
163
163
 
164
164
  /**
@@ -390,7 +390,7 @@ declare class NVImage {
390
390
  */
391
391
  constructor(dataBuffer?: ArrayBuffer | ArrayBuffer[] | ArrayBufferLike | null, name?: string, colormap?: string, opacity?: number, pairedImgData?: ArrayBuffer | null, cal_min?: number, cal_max?: number, trustCalMinMax?: boolean, percentileFrac?: number, ignoreZeroVoxels?: boolean, useQFormNotSForm?: boolean, colormapNegative?: string, frame4D?: number, imageType?: ImageType, cal_minNeg?: number, cal_maxNeg?: number, colorbarVisible?: boolean, colormapLabel?: LUT | null, colormapType?: number);
392
392
  init(dataBuffer?: ArrayBuffer | ArrayBuffer[] | ArrayBufferLike | null, name?: string, colormap?: string, opacity?: number, _pairedImgData?: ArrayBuffer | null, cal_min?: number, cal_max?: number, trustCalMinMax?: boolean, percentileFrac?: number, ignoreZeroVoxels?: boolean, useQFormNotSForm?: boolean, colormapNegative?: string, frame4D?: number, imageType?: ImageType, cal_minNeg?: number, cal_maxNeg?: number, colorbarVisible?: boolean, colormapLabel?: LUT | null, colormapType?: number, imgRaw?: ArrayBuffer | ArrayBufferLike | null): void;
393
- static new(dataBuffer?: ArrayBuffer | ArrayBuffer[] | ArrayBufferLike | null, name?: string, colormap?: string, opacity?: number, pairedImgData?: ArrayBuffer | null, cal_min?: number, cal_max?: number, trustCalMinMax?: boolean, percentileFrac?: number, ignoreZeroVoxels?: boolean, useQFormNotSForm?: boolean, colormapNegative?: string, frame4D?: number, imageType?: ImageType, cal_minNeg?: number, cal_maxNeg?: number, colorbarVisible?: boolean, colormapLabel?: LUT | null, colormapType?: number): Promise<NVImage>;
393
+ static new(dataBuffer: ArrayBuffer | ArrayBuffer[] | ArrayBufferLike | null, name: string, colormap: string, opacity: number, pairedImgData: ArrayBuffer | null, cal_min: number, cal_max: number, trustCalMinMax: boolean, percentileFrac: number, ignoreZeroVoxels: boolean, useQFormNotSForm: boolean, colormapNegative: string, frame4D: number, imageType: ImageType, cal_minNeg: number, cal_maxNeg: number, colorbarVisible: boolean, colormapLabel: LUT | null, colormapType: number, zarrData: null | unknown): Promise<NVImage>;
394
394
  computeObliqueAngle(mtx44: mat4): number;
395
395
  float32V1asRGBA(inImg: Float32Array): Uint8Array;
396
396
  loadImgV1(isFlipX?: boolean, isFlipY?: boolean, isFlipZ?: boolean): boolean;
@@ -403,6 +403,7 @@ declare class NVImage {
403
403
  readNPZ(buffer: ArrayBuffer): Promise<ArrayBuffer>;
404
404
  imageDataFromArrayBuffer(buffer: ArrayBuffer): Promise<ImageData>;
405
405
  readBMP(buffer: ArrayBuffer): Promise<ArrayBuffer>;
406
+ readZARR(buffer: ArrayBuffer, zarrData: unknown): Promise<Uint8Array>;
406
407
  readVMR(buffer: ArrayBuffer): ArrayBuffer;
407
408
  readFIB(buffer: ArrayBuffer): Promise<[ArrayBuffer, Float32Array]>;
408
409
  readSRC(buffer: ArrayBuffer): Promise<ArrayBuffer>;
@@ -775,8 +776,10 @@ type NVConfigOptions = {
775
776
  isAlphaClipDark: boolean;
776
777
  gradientOrder: number;
777
778
  gradientOpacity: number;
779
+ renderSilhouette: number;
778
780
  gradientAmount: number;
779
781
  invertScrollDirection: boolean;
782
+ is2DSliceShader: boolean;
780
783
  };
781
784
  declare const DEFAULT_OPTIONS: NVConfigOptions;
782
785
  type SceneData = {
@@ -1204,6 +1207,9 @@ type NVMeshLayer = {
1204
1207
  colormapType?: number;
1205
1208
  base64?: string;
1206
1209
  colorbarVisible?: boolean;
1210
+ showLegend?: boolean;
1211
+ labels?: NVLabel3D[];
1212
+ atlasValues?: AnyNumberArray;
1207
1213
  };
1208
1214
  declare const NVMeshLayerDefaults: {
1209
1215
  colormap: string;
@@ -1217,6 +1223,8 @@ declare const NVMeshLayerDefaults: {
1217
1223
  cal_maxNeg: number;
1218
1224
  colormapType: COLORMAP_TYPE;
1219
1225
  values: number[];
1226
+ useNegativeCmap: boolean;
1227
+ showLegend: boolean;
1220
1228
  };
1221
1229
  declare class NVMeshFromUrlOptions {
1222
1230
  url: string;
@@ -1330,6 +1338,7 @@ declare class NVMesh {
1330
1338
  updateFibers(gl: WebGL2RenderingContext): void;
1331
1339
  indexNearestXYZmm(Xmm: number, Ymm: number, Zmm: number): number[];
1332
1340
  unloadMesh(gl: WebGL2RenderingContext): void;
1341
+ scalars2RGBA(rgba: Uint8ClampedArray, layer: NVMeshLayer, scalars: AnyNumberArray, isNegativeCmap?: boolean): Uint8ClampedArray;
1333
1342
  blendColormap(u8: Uint8Array, additiveRGBA: Uint8Array, layer: NVMeshLayer, mn: number, mx: number, lut: Uint8ClampedArray, invert?: boolean): void;
1334
1343
  updateMesh(gl: WebGL2RenderingContext): void;
1335
1344
  reverseFaces(gl: WebGL2RenderingContext): void;
@@ -1498,6 +1507,7 @@ type Graph = {
1498
1507
  lineColor?: number[];
1499
1508
  textColor?: number[];
1500
1509
  lineThickness?: number;
1510
+ gridLineThickness?: number;
1501
1511
  lineAlpha?: number;
1502
1512
  lines?: number[][];
1503
1513
  selectedColumn?: number;
@@ -1565,6 +1575,8 @@ type UIData = {
1565
1575
  lastTwoTouchDistance: number;
1566
1576
  multiTouchGesture: boolean;
1567
1577
  dpr?: number;
1578
+ max2D?: number;
1579
+ max3D?: number;
1568
1580
  windowX: number;
1569
1581
  windowY: number;
1570
1582
  };
@@ -1617,6 +1629,7 @@ declare class Niivue {
1617
1629
  overlayTexture: WebGLTexture | null;
1618
1630
  overlayTextureID: WebGLTexture | null;
1619
1631
  sliceMMShader?: Shader;
1632
+ slice2DShader?: Shader;
1620
1633
  sliceV1Shader?: Shader;
1621
1634
  orientCubeShader?: Shader;
1622
1635
  orientCubeShaderVAO: WebGLVertexArrayObject | null;
@@ -1702,6 +1715,11 @@ declare class Niivue {
1702
1715
  VOLUME_ID: number;
1703
1716
  DISTANCE_FROM_CAMERA: number;
1704
1717
  graph: Graph;
1718
+ customLayout: Array<{
1719
+ sliceType: SLICE_TYPE;
1720
+ position: [number, number, number, number];
1721
+ sliceMM?: number;
1722
+ }>;
1705
1723
  meshShaders: Array<{
1706
1724
  Name: string;
1707
1725
  Frag: string;
@@ -2127,6 +2145,50 @@ declare class Niivue {
2127
2145
  * @see {@link https://niivue.github.io/niivue/features/layout.html | live demo usage}
2128
2146
  */
2129
2147
  setHeroImage(fraction: number): void;
2148
+ /**
2149
+ * Set a custom slice layout. This overrides the built-in layouts.
2150
+ * @param layout - Array of layout specifications for each slice view
2151
+ * @example
2152
+ * niivue.setCustomLayout([
2153
+ * // Left 50% - Sag
2154
+ * {sliceType: 2, position: [0, 0, 0.5, 1.0]},
2155
+ * // Top right - Cor
2156
+ * {sliceType: 1, position: [0.5, 0, 0.5, 0.5]},
2157
+ * // Bottom right - Ax
2158
+ * {sliceType: 0, position: [0.5, 0.5, 0.5, 0.5]}
2159
+ * ])
2160
+ *
2161
+ * produces:
2162
+ * +----------------+----------------+
2163
+ * | | |
2164
+ * | | coronal |
2165
+ * | | |
2166
+ * | | |
2167
+ * | sagittal +----------------+
2168
+ * | | |
2169
+ * | | axial |
2170
+ * | | |
2171
+ * | | |
2172
+ * +----------------+----------------+
2173
+ */
2174
+ setCustomLayout(layout: Array<{
2175
+ sliceType: SLICE_TYPE;
2176
+ position: [number, number, number, number];
2177
+ sliceMM?: number;
2178
+ }>): void;
2179
+ /**
2180
+ * Clear custom layout and rely on built-in layouts
2181
+ */
2182
+ clearCustomLayout(): void;
2183
+ /**
2184
+ * Get the current custom layout if set
2185
+ * @returns The current custom layout or null if using built-in layouts
2186
+ */
2187
+ getCustomLayout(): Array<{
2188
+ sliceType: SLICE_TYPE;
2189
+ position: [number, number, number, number];
2190
+ sliceMM?: number;
2191
+ }> | null;
2130
2192
  /**
2131
2193
  * control whether 2D slices use radiological or neurological convention.
2132
2194
  * @param isRadiologicalConvention - new display convention
@@ -2525,11 +2587,12 @@ declare class Niivue {
2525
2587
  /**
2526
2588
  * set volume rendering opacity influence of the gradient magnitude
2527
2589
  * @param gradientOpacity - amount of gradient magnitude influence on opacity (0..1), default 0 (no-influence)
2590
+ * @param renderSilhouette - make core transparent to enhance rims (0..1), default 0 (no-influence)
2528
2591
  * @example
2529
2592
  * niivue.setGradientOpacity(0.6);
2530
2593
  * @see {@link https://niivue.github.io/niivue/features/gradient.opacity.html | live demo usage}
2531
2594
  */
2532
- setGradientOpacity(gradientOpacity?: number): Promise<void>;
2595
+ setGradientOpacity(gradientOpacity?: number, renderSilhouette?: number): Promise<void>;
2533
2596
  overlayRGBA(volume: NVImage): Uint8ClampedArray;
2534
2597
  vox2mm(XYZ: number[], mtx: mat4): vec3;
2535
2598
  /**
@@ -2695,7 +2758,9 @@ declare class Niivue {
2695
2758
  * @see {@link https://niivue.github.io/niivue/features/cactus.html | live demo usage}
2696
2759
  */
2697
2760
  refreshDrawing(isForceRedraw?: boolean, useClickToSegmentBitmap?: boolean): void;
2761
+ r8Tex2D(texID: WebGLTexture | null, activeID: number, dims: number[], isInit?: boolean): WebGLTexture | null;
2698
2762
  r8Tex(texID: WebGLTexture | null, activeID: number, dims: number[], isInit?: boolean): WebGLTexture | null;
2763
+ rgbaTex2D(texID: WebGLTexture | null, activeID: number, dims: number[], data?: Uint8Array | null, isFlipVertical?: boolean): WebGLTexture | null;
2699
2764
  rgbaTex(texID: WebGLTexture | null, activeID: number, dims: number[], isInit?: boolean): WebGLTexture | null;
2700
2765
  rgba16Tex(texID: WebGLTexture | null, activeID: number, dims: number[], isInit?: boolean): WebGLTexture | null;
2701
2766
  requestCORSIfNotSameOrigin(img: HTMLImageElement, url: string): void;
@@ -3069,6 +3134,7 @@ declare class Niivue {
3069
3134
  * @see {@link https://niivue.github.io/niivue/features/mosaics.html | live demo usage}
3070
3135
  */
3071
3136
  drawMosaic(mosaicStr: string): void;
3137
+ calculateWidthHeight(sliceType: number, volScale: number[], containerWidth: number, containerHeight: number): [number, number];
3072
3138
  drawSceneCore(): string | void;
3073
3139
  drawScene(): string | void;
3074
3140
  get gl(): WebGL2RenderingContext;