@niivue/niivue 0.43.0 → 0.43.2

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.
@@ -0,0 +1,2920 @@
1
+ import { mat4, vec3, vec4, vec2 } from 'gl-matrix';
2
+ import * as nifti from 'nifti-reader-js';
3
+ import { WebSocketSubject } from 'rxjs/webSocket';
4
+
5
+ type ColorMap = {
6
+ R: number[];
7
+ G: number[];
8
+ B: number[];
9
+ A: number[];
10
+ I: number[];
11
+ min?: number;
12
+ max?: number;
13
+ labels?: string[];
14
+ };
15
+ type LUT = {
16
+ lut: Uint8ClampedArray;
17
+ min?: number;
18
+ max?: number;
19
+ labels?: string[];
20
+ };
21
+ declare class ColorTables {
22
+ gamma: number;
23
+ version: number;
24
+ cluts: Record<string, ColorMap>;
25
+ /**
26
+ * Sets cluts to alphabetically sorted cmaps
27
+ */
28
+ constructor();
29
+ addColormap(key: string, cmap: ColorMap): void;
30
+ colormaps(): Array<keyof typeof this.cluts>;
31
+ colorMaps(): Array<keyof typeof this.cluts>;
32
+ colormapFromKey(name: string): ColorMap;
33
+ colormap(key?: string, isInvert?: boolean): Uint8ClampedArray;
34
+ makeLabelLut(cm: ColorMap, alphaFill?: number): LUT;
35
+ makeLabelLutFromUrl(name: string): Promise<LUT>;
36
+ makeDrawLut(name: string | ColorMap): LUT;
37
+ makeLut(Rsi: number[], Gsi: number[], Bsi: number[], Asi: number[], Isi: number[], isInvert: boolean): Uint8ClampedArray;
38
+ }
39
+ declare const cmapper: ColorTables;
40
+
41
+ declare class Shader {
42
+ program: WebGLProgram;
43
+ uniforms: Record<string, WebGLUniformLocation | null>;
44
+ isMatcap?: boolean;
45
+ constructor(gl: WebGL2RenderingContext, vertexSrc: string, fragmentSrc: string);
46
+ use(gl: WebGL2RenderingContext): void;
47
+ }
48
+
49
+ type Geometry = {
50
+ vertexBuffer: WebGLBuffer;
51
+ indexBuffer: WebGLBuffer;
52
+ indexCount: number;
53
+ vao: WebGLVertexArrayObject | null;
54
+ };
55
+ /**
56
+ * Object rendered with WebGL
57
+ **/
58
+ declare class NiivueObject3D {
59
+ static BLEND: number;
60
+ static CULL_FACE: number;
61
+ static CULL_FRONT: number;
62
+ static CULL_BACK: number;
63
+ static ENABLE_DEPTH_TEST: number;
64
+ sphereIdx: number[];
65
+ sphereVtx: number[];
66
+ renderShaders: number[];
67
+ isVisible: boolean;
68
+ isPickable: boolean;
69
+ vertexBuffer: WebGLVertexArrayObject;
70
+ indexCount: number;
71
+ indexBuffer: WebGLVertexArrayObject | null;
72
+ vao: WebGLVertexArrayObject | null;
73
+ mode: number;
74
+ glFlags: number;
75
+ id: number;
76
+ colorId: [number, number, number, number];
77
+ modelMatrix: mat4;
78
+ scale: number[];
79
+ position: number[];
80
+ rotation: number[];
81
+ rotationRadians: number;
82
+ extentsMin: number[];
83
+ extentsMax: number[];
84
+ furthestVertexFromOrigin?: number;
85
+ originNegate?: vec3;
86
+ fieldOfViewDeObliqueMM?: vec3;
87
+ mm?: vec4;
88
+ constructor(id: number, vertexBuffer: WebGLBuffer, mode: number, indexCount: number, indexBuffer?: WebGLVertexArrayObject | null, vao?: WebGLVertexArrayObject | null);
89
+ static generateCrosshairs: (gl: WebGL2RenderingContext, id: number, xyzMM: vec4, xyzMin: vec3, xyzMax: vec3, radius: number, sides?: number, gap?: number) => NiivueObject3D;
90
+ static generateCrosshairsGeometry: (gl: WebGL2RenderingContext, xyzMM: vec4, xyzMin: vec3, xyzMax: vec3, radius: number, sides?: number, gap?: number) => Geometry;
91
+ static getFirstPerpVector: (v1: vec3) => vec3;
92
+ static subdivide: (verts: number[], faces: number[]) => void;
93
+ static weldVertices: (verts: number[], faces: number[]) => number[];
94
+ static makeSphere: (vertices: number[], indices: number[], radius: number, origin?: vec3 | vec4) => void;
95
+ static makeCylinder: (vertices: number[], indices: number[], start: vec3, dest: vec3, radius: number, sides?: number, endcaps?: boolean) => void;
96
+ static makeColoredCylinder: (vertices: number[], indices: number[], colors: number[], start: vec3, dest: vec3, radius: number, rgba255?: number[], sides?: number, endcaps?: boolean) => void;
97
+ static makeColoredSphere: (vertices: number[], indices: number[], colors: number[], radius: number, origin?: vec3 | vec4, rgba255?: number[]) => void;
98
+ }
99
+
100
+ declare enum LabelTextAlignment {
101
+ LEFT = "left",
102
+ RIGHT = "right",
103
+ CENTER = "center"
104
+ }
105
+ declare enum LabelLineTerminator {
106
+ NONE = "none",
107
+ CIRCLE = "circle",
108
+ RING = "ring"
109
+ }
110
+ /**
111
+ * Class representing label style.
112
+ * @ignore
113
+ */
114
+ declare class NVLabel3DStyle {
115
+ textColor: number[];
116
+ textScale: number;
117
+ textAlignment?: LabelTextAlignment;
118
+ lineWidth: number;
119
+ lineColor: number[];
120
+ lineTerminator: LabelLineTerminator;
121
+ bulletScale?: number;
122
+ bulletColor?: number[];
123
+ backgroundColor?: number[];
124
+ /**
125
+ * @param textColor - Color of text
126
+ * @param textScale - Text Size (0.0..1.0)
127
+ * @param lineWidth - Line width
128
+ * @param lineColor - Line color
129
+ * @param bulletScale - Bullet size respective of text
130
+ * @param bulletColor - Bullet color
131
+ * @param backgroundColor - Background color of label
132
+ */
133
+ constructor(textColor?: number[], textScale?: number, textAlignment?: LabelTextAlignment, lineWidth?: number, lineColor?: number[], lineTerminator?: LabelLineTerminator, bulletScale?: number, bulletColor?: number[], backgroundColor?: number[]);
134
+ }
135
+ /**
136
+ * Label class
137
+ * @ignore
138
+ */
139
+ declare class NVLabel3D {
140
+ text: string;
141
+ style: NVLabel3DStyle;
142
+ points?: number[] | number[][];
143
+ /**
144
+ * @param text - The text of the label
145
+ * @param style - The style of the label
146
+ * @param points - An array of points label for label lines
147
+ */
148
+ constructor(text: string, style: NVLabel3DStyle, points?: number[] | number[][]);
149
+ }
150
+
151
+ /**
152
+ * Enum for NIfTI datatype codes
153
+ * // https://nifti.nimh.nih.gov/pub/dist/src/niftilib/nifti1.h
154
+ */
155
+ declare enum NiiDataType {
156
+ DT_NONE = 0,
157
+ DT_BINARY = 1,
158
+ DT_UINT8 = 2,
159
+ DT_INT16 = 4,
160
+ DT_INT32 = 8,
161
+ DT_FLOAT32 = 16,
162
+ DT_COMPLEX64 = 32,
163
+ DT_FLOAT64 = 64,
164
+ DT_RGB24 = 128,
165
+ DT_INT8 = 256,
166
+ DT_UINT16 = 512,
167
+ DT_UINT32 = 768,
168
+ DT_INT64 = 1024,
169
+ DT_UINT64 = 1280,
170
+ DT_FLOAT128 = 1536,
171
+ DT_COMPLEX128 = 1792,
172
+ DT_COMPLEX256 = 2048,
173
+ DT_RGBA32 = 2304
174
+ }
175
+ /**
176
+ * Enum for supported image types (e.g. NII, NRRD, DICOM)
177
+ */
178
+ declare enum ImageType {
179
+ UNKNOWN = 0,
180
+ NII = 1,
181
+ DCM = 2,
182
+ DCM_MANIFEST = 3,
183
+ MIH = 4,
184
+ MIF = 5,
185
+ NHDR = 6,
186
+ NRRD = 7,
187
+ MHD = 8,
188
+ MHA = 9,
189
+ MGH = 10,
190
+ MGZ = 11,
191
+ V = 12,
192
+ V16 = 13,
193
+ VMR = 14,
194
+ HEAD = 15,
195
+ DCM_FOLDER = 16
196
+ }
197
+ type ImageFromUrlOptions = {
198
+ url: string;
199
+ urlImageData?: string;
200
+ headers?: Record<string, string>;
201
+ name?: string;
202
+ colorMap?: string;
203
+ colormap?: string;
204
+ opacity?: number;
205
+ cal_min?: number;
206
+ cal_max?: number;
207
+ trustCalMinMax?: boolean;
208
+ percentileFrac?: number;
209
+ useQFormNotSForm?: boolean;
210
+ alphaThreshold?: boolean;
211
+ colormapNegative?: string;
212
+ cal_minNeg?: number;
213
+ cal_maxNeg?: number;
214
+ colorbarVisible?: boolean;
215
+ ignoreZeroVoxels?: boolean;
216
+ imageType?: ImageType;
217
+ frame4D?: number;
218
+ colormapLabel?: LUT | null;
219
+ pairedImgData?: null;
220
+ limitFrames4D?: number;
221
+ isManifest?: boolean;
222
+ urlImgData?: string;
223
+ buffer?: ArrayBuffer;
224
+ };
225
+ type ImageFromFileOptions = {
226
+ file: File | File[];
227
+ name?: string;
228
+ colormap?: string;
229
+ opacity?: number;
230
+ urlImgData?: File | null;
231
+ cal_min?: number;
232
+ cal_max?: number;
233
+ trustCalMinMax?: boolean;
234
+ percentileFrac?: number;
235
+ ignoreZeroVoxels?: boolean;
236
+ useQFormNotSForm?: boolean;
237
+ colormapNegative?: string;
238
+ imageType?: ImageType;
239
+ frame4D?: number;
240
+ limitFrames4D?: number;
241
+ };
242
+ type ImageFromBase64 = {
243
+ base64: string;
244
+ name?: string;
245
+ colormap?: string;
246
+ opacity?: number;
247
+ cal_min?: number;
248
+ cal_max?: number;
249
+ trustCalMinMax?: boolean;
250
+ percentileFrac?: number;
251
+ ignoreZeroVoxels?: boolean;
252
+ useQFormNotSForm?: boolean;
253
+ colormapNegative?: string;
254
+ frame4D?: number;
255
+ imageType?: ImageType;
256
+ cal_minNeg?: number;
257
+ cal_maxNeg?: number;
258
+ colorbarVisible?: boolean;
259
+ colormapLabel?: LUT | null;
260
+ };
261
+ type ImageMetadata = {
262
+ id: string;
263
+ datatypeCode: number;
264
+ nx: number;
265
+ ny: number;
266
+ nz: number;
267
+ nt: number;
268
+ dx: number;
269
+ dy: number;
270
+ dz: number;
271
+ dt: number;
272
+ bpv: number;
273
+ };
274
+ declare const NVImageFromUrlOptions: (url: string, urlImageData?: string, name?: string, colormap?: string, opacity?: number, 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, alphaThreshold?: boolean, colormapLabel?: null) => ImageFromUrlOptions;
275
+
276
+ type TypedVoxelArray = Float32Array | Uint8Array | Int16Array | Float64Array | Uint16Array;
277
+ /**
278
+ * a NVImage encapsulates some images data and provides methods to query and operate on images
279
+ */
280
+ declare class NVImage {
281
+ name: string;
282
+ id: string;
283
+ url?: string;
284
+ headers?: Record<string, string>;
285
+ _colormap: string;
286
+ _opacity: number;
287
+ percentileFrac: number;
288
+ ignoreZeroVoxels: boolean;
289
+ trustCalMinMax: boolean;
290
+ colormapNegative: string;
291
+ colormapLabel: LUT | null;
292
+ colormapInvert?: boolean;
293
+ nFrame4D?: number;
294
+ frame4D: number;
295
+ nTotalFrame4D?: number;
296
+ cal_minNeg: number;
297
+ cal_maxNeg: number;
298
+ colorbarVisible: boolean;
299
+ modulationImage: number | null;
300
+ modulateAlpha: number;
301
+ series: any;
302
+ nVox3D?: number;
303
+ oblique_angle?: number;
304
+ maxShearDeg?: number;
305
+ useQFormNotSForm: boolean;
306
+ alphaThreshold?: number;
307
+ pixDims?: number[];
308
+ matRAS?: mat4;
309
+ pixDimsRAS?: number[];
310
+ obliqueRAS?: mat4;
311
+ dimsRAS?: number[];
312
+ permRAS?: number[];
313
+ img2RASstep?: number[];
314
+ img2RASstart?: number[];
315
+ toRAS?: mat4;
316
+ toRASvox?: mat4;
317
+ frac2mm?: mat4;
318
+ frac2mmOrtho?: mat4;
319
+ extentsMinOrtho?: number[];
320
+ extentsMaxOrtho?: number[];
321
+ mm2ortho?: mat4;
322
+ hdr: nifti.NIFTI1 | nifti.NIFTI2 | null;
323
+ imageType?: ImageType;
324
+ img?: TypedVoxelArray;
325
+ imaginary?: Float32Array;
326
+ fileObject?: File | File[];
327
+ dims?: number[];
328
+ onColormapChange: (img: NVImage) => void;
329
+ onOpacityChange: (img: NVImage) => void;
330
+ mm000?: vec3;
331
+ mm100?: vec3;
332
+ mm010?: vec3;
333
+ mm001?: vec3;
334
+ cal_min?: number;
335
+ cal_max?: number;
336
+ robust_min?: number;
337
+ robust_max?: number;
338
+ global_min?: number;
339
+ global_max?: number;
340
+ urlImgData?: string;
341
+ isManifest?: boolean;
342
+ limitFrames4D?: number;
343
+ /**
344
+ *
345
+ * @param dataBuffer - an array buffer of image data to load (there are also methods that abstract this more. See loadFromUrl, and loadFromFile)
346
+ * @param name - a name for this image. Default is an empty string
347
+ * @param colormap - a color map to use. default is gray
348
+ * @param opacity - the opacity for this image. default is 1
349
+ * @param pairedImgData - Allows loading formats where header and image are separate files (e.g. nifti.hdr, nifti.img)
350
+ * @param cal_min - minimum intensity for color brightness/contrast
351
+ * @param cal_max - maximum intensity for color brightness/contrast
352
+ * @param trustCalMinMax - whether or not to trust cal_min and cal_max from the nifti header (trusting results in faster loading)
353
+ * @param percentileFrac - the percentile to use for setting the robust range of the display values (smart intensity setting for images with large ranges)
354
+ * @param ignoreZeroVoxels - whether or not to ignore zero voxels in setting the robust range of display values
355
+ * @param useQFormNotSForm - give precedence to QForm (Quaternion) or SForm (Matrix)
356
+ * @param colormapNegative - a color map to use for symmetrical negative intensities
357
+ * @param frame4D - volume displayed, 0 indexed, must be less than nFrame4D
358
+ *
359
+ * FIXME the following params are documented but not included in the actual constructor
360
+ * @param onColormapChange - callback for color map change
361
+ * @param onOpacityChange -callback for color map change
362
+ *
363
+ * TODO the following parameters were not documented
364
+ * @param imageType - TODO
365
+ * @param cal_minNeg - TODO
366
+ * @param cal_maxNeg - TODO
367
+ * @param colorbarVisible - TODO
368
+ * @param colormapLabel - TODO
369
+ */
370
+ constructor(dataBuffer?: ArrayBuffer | ArrayBuffer[] | 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);
371
+ computeObliqueAngle(mtx44: mat4): number;
372
+ calculateOblique(): void;
373
+ THD_daxes_to_NIFTI(xyzDelta: number[], xyzOrigin: number[], orientSpecific: number[]): void;
374
+ SetPixDimFromSForm(): void;
375
+ readDICOM(buf: ArrayBuffer | ArrayBuffer[]): ArrayBuffer;
376
+ readECAT(buffer: ArrayBuffer): ArrayBuffer;
377
+ readV16(buffer: ArrayBuffer): ArrayBuffer;
378
+ readVMR(buffer: ArrayBuffer): ArrayBuffer;
379
+ readMGH(buffer: ArrayBuffer): ArrayBuffer;
380
+ readHEAD(dataBuffer: ArrayBuffer, pairedImgData: ArrayBuffer | null): ArrayBuffer;
381
+ readMHA(buffer: ArrayBuffer, pairedImgData: ArrayBuffer | null): ArrayBuffer;
382
+ readMIF(buffer: ArrayBuffer, pairedImgData: ArrayBuffer | null): ArrayBuffer;
383
+ readNRRD(dataBuffer: ArrayBuffer, pairedImgData: ArrayBuffer | null): ArrayBuffer;
384
+ calculateRAS(): void;
385
+ img2RAS(): TypedVoxelArray;
386
+ vox2mm(XYZ: number[], mtx: mat4): vec3;
387
+ mm2vox(mm: number[], frac?: boolean): Float32Array | vec3;
388
+ arrayEquals(a: unknown[], b: unknown[]): boolean;
389
+ setColormap(cm: string): void;
390
+ setColormapLabel(cm: ColorMap): void;
391
+ setColormapLabelFromUrl(url: string): Promise<void>;
392
+ get colormap(): string;
393
+ get colorMap(): string;
394
+ set colormap(cm: string);
395
+ set colorMap(cm: string);
396
+ get opacity(): number;
397
+ set opacity(opacity: number);
398
+ calMinMax(): number[];
399
+ intensityRaw2Scaled(raw: number): number;
400
+ intensityScaled2Raw(scaled: number): number;
401
+ saveToUint8Array(fnm: string, drawing8?: Uint8Array | null): Uint8Array;
402
+ saveToDisk(fnm?: string, drawing8?: Uint8Array | null): Uint8Array;
403
+ static fetchDicomData(url: string, headers?: Record<string, string>): Promise<ArrayBuffer[]>;
404
+ static fetchPartial(url: string, bytesToLoad: number, headers?: Record<string, string>): Promise<Response>;
405
+ /**
406
+ * factory function to load and return a new NVImage instance from a given URL
407
+ * @returns NVImage instance
408
+ */
409
+ static loadFromUrl({ url, urlImgData, headers, name, colormap, opacity, cal_min, cal_max, trustCalMinMax, percentileFrac, ignoreZeroVoxels, useQFormNotSForm, colormapNegative, frame4D, isManifest, limitFrames4D, imageType, colorbarVisible, buffer }?: Partial<Omit<ImageFromUrlOptions, 'url'>> & {
410
+ url?: string | Uint8Array | ArrayBuffer;
411
+ }): Promise<NVImage>;
412
+ static readFileAsync(file: File, bytesToLoad?: number): Promise<ArrayBuffer>;
413
+ /**
414
+ * factory function to load and return a new NVImage instance from a file in the browser
415
+ */
416
+ static loadFromFile({ file, // file can be an array of file objects or a single file object
417
+ name, colormap, opacity, urlImgData, cal_min, cal_max, trustCalMinMax, percentileFrac, ignoreZeroVoxels, useQFormNotSForm, colormapNegative, frame4D, limitFrames4D, imageType }: ImageFromFileOptions): Promise<NVImage>;
418
+ /**
419
+ * factory function to load and return a new NVImage instance from a base64 encoded string
420
+ *
421
+ * @returns NVImage instance
422
+ * @example
423
+ * myImage = NVImage.loadFromBase64('SomeBase64String')
424
+ */
425
+ static createNiftiArray(dims?: number[], pixDims?: number[], affine?: number[], datatypeCode?: number, // DT_UINT8
426
+ img?: Uint8Array): Uint8Array;
427
+ static createNiftiHeader(dims?: number[], pixDims?: number[], affine?: number[], datatypeCode?: number): nifti.NIFTI1;
428
+ /**
429
+ * read a 3D slab of voxels from a volume
430
+ * @param voxStart - first row, column and slice (RAS order) for selection
431
+ * @param voxEnd - final row, column and slice (RAS order) for selection
432
+ * @param dataType - array data type. Options: 'same' (default), 'uint8', 'float32'
433
+ * @returns the an array where ret[0] is the voxel values and ret[1] is dimension of selection
434
+ * @see {@link https://niivue.github.io/niivue/features/slab_selection.html | live demo usage}
435
+ */
436
+ getVolumeData(voxStart?: number[], voxEnd?: number[], dataType?: string): [TypedVoxelArray, number[]];
437
+ /**
438
+ * write a 3D slab of voxels from a volume
439
+ * @param voxStart - first row, column and slice (RAS order) for selection
440
+ * @param voxEnd - final row, column and slice (RAS order) for selection
441
+ * @param img - array of voxel values to insert (RAS order)
442
+ * @see {@link https://niivue.github.io/niivue/features/slab_selection.html | live demo usage}
443
+ */
444
+ setVolumeData(voxStart?: number[], voxEnd?: number[], img?: TypedVoxelArray): void;
445
+ /**
446
+ * factory function to load and return a new NVImage instance from a base64 encoded string
447
+ *
448
+ * @returns NVImage instance
449
+ * @example
450
+ * myImage = NVImage.loadFromBase64('SomeBase64String')
451
+ */
452
+ static loadFromBase64({ base64, name, colormap, opacity, cal_min, cal_max, trustCalMinMax, percentileFrac, ignoreZeroVoxels, useQFormNotSForm, colormapNegative, frame4D, imageType, cal_minNeg, cal_maxNeg, colorbarVisible, colormapLabel }: ImageFromBase64): NVImage;
453
+ /**
454
+ * make a clone of a NVImage instance and return a new NVImage
455
+ * @returns NVImage instance
456
+ * @example
457
+ * myImage = NVImage.loadFromFile(SomeFileObject) // files can be from dialogs or drag and drop
458
+ * clonedImage = myImage.clone()
459
+ */
460
+ clone(): NVImage;
461
+ /**
462
+ * fill a NVImage instance with zeros for the image data
463
+ * @example
464
+ * myImage = NVImage.loadFromFile(SomeFileObject) // files can be from dialogs or drag and drop
465
+ * clonedImageWithZeros = myImage.clone().zeroImage()
466
+ */
467
+ zeroImage(): void;
468
+ /**
469
+ * get nifti specific metadata about the image
470
+ */
471
+ getImageMetadata(): ImageMetadata;
472
+ /**
473
+ * a factory function to make a zero filled image given a NVImage as a reference
474
+ * @param nvImage - an existing NVImage as a reference
475
+ * @param dataType - the output data type. Options: 'same', 'uint8'
476
+ * @returns new NVImage filled with zeros for the image data
477
+ * @example
478
+ * myImage = NVImage.loadFromFile(SomeFileObject) // files can be from dialogs or drag and drop
479
+ * newZeroImage = NVImage.zerosLike(myImage)
480
+ */
481
+ static zerosLike(nvImage: NVImage, dataType?: string): NVImage;
482
+ getValue(x: number, y: number, z: number, frame4D?: number, isReadImaginary?: boolean): number;
483
+ /**
484
+ * @param id - id of 3D Object (is this the base volume or an overlay?)
485
+ * @param gl - WebGL rendering context
486
+ * @returns new 3D object in model space
487
+ */
488
+ toNiivueObject3D(id: number, gl: WebGL2RenderingContext): NiivueObject3D;
489
+ /**
490
+ * Update options for image
491
+ */
492
+ applyOptionsUpdate(options: ImageFromUrlOptions): void;
493
+ getImageOptions(): ImageFromUrlOptions;
494
+ /**
495
+ * Converts NVImage to NIfTI compliant byte array
496
+ */
497
+ toUint8Array(drawingBytes?: Uint8Array | null): Uint8Array;
498
+ convertVox2Frac(vox: vec3): vec3;
499
+ convertFrac2Vox(frac: vec3): vec3;
500
+ convertFrac2MM(frac: vec3, isForceSliceMM?: boolean): vec4;
501
+ convertMM2Frac(mm: vec3 | vec4, isForceSliceMM?: boolean): vec3;
502
+ }
503
+
504
+ type FreeSurferConnectome = {
505
+ data_type: string;
506
+ points: Array<{
507
+ comments?: Array<{
508
+ text: string;
509
+ }>;
510
+ coordinates: {
511
+ x: number;
512
+ y: number;
513
+ z: number;
514
+ };
515
+ }>;
516
+ };
517
+ /**
518
+ * Represents a connectome
519
+ */
520
+ declare class NVConnectome extends NVMesh {
521
+ gl: WebGL2RenderingContext;
522
+ nodesChanged: EventTarget;
523
+ constructor(gl: WebGL2RenderingContext, connectome: LegacyConnectome);
524
+ static convertLegacyConnectome(json: LegacyConnectome): Connectome;
525
+ static convertFreeSurferConnectome(json: FreeSurferConnectome, colormap?: string): Connectome;
526
+ updateLabels(): void;
527
+ addConnectomeNode(node: NVConnectomeNode): void;
528
+ deleteConnectomeNode(node: NVConnectomeNode): void;
529
+ updateConnectomeNodeByIndex(index: number, updatedNode: NVConnectomeNode): void;
530
+ updateConnectomeNodeByPoint(point: [number, number, number], updatedNode: NVConnectomeNode): void;
531
+ addConnectomeEdge(first: number, second: number, colorValue: number): NVConnectomeEdge;
532
+ deleteConnectomeEdge(first: number, second: number): NVConnectomeEdge;
533
+ findClosestConnectomeNode(point: number[], distance: number): NVConnectomeNode | null;
534
+ updateConnectome(gl: WebGL2RenderingContext): void;
535
+ updateMesh(gl: WebGL2RenderingContext): void;
536
+ json(): Connectome;
537
+ /**
538
+ * Factory method to create connectome from options
539
+ */
540
+ static loadConnectomeFromUrl(gl: WebGL2RenderingContext, url: string): Promise<NVConnectome>;
541
+ }
542
+
543
+ /**
544
+ * Slice Type
545
+ * @ignore
546
+ */
547
+ declare enum SLICE_TYPE {
548
+ AXIAL = 0,
549
+ CORONAL = 1,
550
+ SAGITTAL = 2,
551
+ MULTIPLANAR = 3,
552
+ RENDER = 4
553
+ }
554
+ /**
555
+ * Multi-planar layout
556
+ * @ignore
557
+ */
558
+ declare enum MULTIPLANAR_TYPE {
559
+ AUTO = 0,
560
+ COLUMN = 1,
561
+ GRID = 2,
562
+ ROW = 3
563
+ }
564
+ /**
565
+ * Drag mode
566
+ * @ignore
567
+ */
568
+ declare enum DRAG_MODE {
569
+ none = 0,
570
+ contrast = 1,
571
+ measurement = 2,
572
+ pan = 3,
573
+ slicer3D = 4,
574
+ callbackOnly = 5
575
+ }
576
+ /**
577
+ * NVConfigOptions
578
+ */
579
+ type NVConfigOptions = {
580
+ textHeight: number;
581
+ colorbarHeight: number;
582
+ crosshairWidth: number;
583
+ crosshairGap: number;
584
+ rulerWidth: number;
585
+ show3Dcrosshair: boolean;
586
+ backColor: number[];
587
+ crosshairColor: number[];
588
+ fontColor: Float32List;
589
+ selectionBoxColor: number[];
590
+ clipPlaneColor: number[];
591
+ rulerColor: number[];
592
+ colorbarMargin: number;
593
+ trustCalMinMax: boolean;
594
+ clipPlaneHotKey: string;
595
+ viewModeHotKey: string;
596
+ doubleTouchTimeout: number;
597
+ longTouchTimeout: number;
598
+ keyDebounceTime: number;
599
+ isNearestInterpolation: boolean;
600
+ atlasOutline: number;
601
+ isRuler: boolean;
602
+ isColorbar: boolean;
603
+ isOrientCube: boolean;
604
+ multiplanarPadPixels: number;
605
+ multiplanarForceRender: boolean;
606
+ isRadiologicalConvention: boolean;
607
+ meshThicknessOn2D: number | string;
608
+ dragMode: DRAG_MODE;
609
+ yoke3Dto2DZoom: boolean;
610
+ isDepthPickMesh: boolean;
611
+ isCornerOrientationText: boolean;
612
+ sagittalNoseLeft: boolean;
613
+ isSliceMM: boolean;
614
+ isV1SliceShader: boolean;
615
+ isHighResolutionCapable: boolean;
616
+ logLevel: 'debug' | 'info' | 'warn' | 'error' | 'fatal' | 'silent';
617
+ loadingText: string;
618
+ isForceMouseClickToVoxelCenters: boolean;
619
+ dragAndDropEnabled: boolean;
620
+ drawingEnabled: boolean;
621
+ penValue: number;
622
+ floodFillNeighbors: number;
623
+ isFilledPen: boolean;
624
+ thumbnail: string;
625
+ maxDrawUndoBitmaps: number;
626
+ sliceType: SLICE_TYPE;
627
+ isAntiAlias: boolean | null;
628
+ isAdditiveBlend: boolean;
629
+ isResizeCanvas: boolean;
630
+ meshXRay: number;
631
+ limitFrames4D: number;
632
+ showLegend: boolean;
633
+ legendBackgroundColor: number[];
634
+ legendTextColor: number[];
635
+ multiplanarLayout: MULTIPLANAR_TYPE;
636
+ renderOverlayBlend: number;
637
+ sliceMosaicString: string;
638
+ };
639
+ declare const DEFAULT_OPTIONS: NVConfigOptions;
640
+ type SceneData = {
641
+ azimuth: number;
642
+ elevation: number;
643
+ crosshairPos: vec3;
644
+ clipPlane: number[];
645
+ clipPlaneDepthAziElev: number[];
646
+ volScaleMultiplier: number;
647
+ pan2Dxyzmm: vec4;
648
+ };
649
+ declare const INITIAL_SCENE_DATA: {
650
+ azimuth: number;
651
+ elevation: number;
652
+ crosshairPos: vec3;
653
+ clipPlane: number[];
654
+ clipPlaneDepthAziElev: number[];
655
+ volScaleMultiplier: number;
656
+ pan2Dxyzmm: vec4;
657
+ };
658
+ type Scene = {
659
+ onAzimuthElevationChange: (azimuth: number, elevation: number) => void;
660
+ onZoom3DChange: (scale: number) => void;
661
+ sceneData: SceneData;
662
+ renderAzimuth: number;
663
+ renderElevation: number;
664
+ volScaleMultiplier: number;
665
+ crosshairPos: vec3;
666
+ clipPlane: number[];
667
+ clipPlaneDepthAziElev: number[];
668
+ pan2Dxyzmm: vec4;
669
+ _elevation?: number;
670
+ _azimuth?: number;
671
+ };
672
+ type DocumentData = {
673
+ title: string;
674
+ imageOptionsArray: ImageFromUrlOptions[];
675
+ meshOptionsArray: unknown[];
676
+ opts: NVConfigOptions;
677
+ previewImageDataURL: string;
678
+ labels: NVLabel3D[];
679
+ encodedImageBlobs: string[];
680
+ encodedDrawingBlob: string;
681
+ meshesString?: string;
682
+ sceneData?: SceneData;
683
+ connectomes?: string[];
684
+ };
685
+ type ExportDocumentData = {
686
+ encodedImageBlobs: string[];
687
+ encodedDrawingBlob: string;
688
+ previewImageDataURL: string;
689
+ imageOptionsMap: Map<string, number>;
690
+ imageOptionsArray: ImageFromUrlOptions[];
691
+ sceneData: Partial<SceneData>;
692
+ opts: NVConfigOptions;
693
+ meshesString: string;
694
+ labels: NVLabel3D[];
695
+ connectomes: string[];
696
+ };
697
+ /**
698
+ * Creates and instance of NVDocument
699
+ * @ignore
700
+ */
701
+ declare class NVDocument {
702
+ data: DocumentData;
703
+ scene: Scene;
704
+ volumes: NVImage[];
705
+ meshDataObjects?: Array<NVMesh | NVConnectome>;
706
+ meshes: Array<NVMesh | NVConnectome>;
707
+ drawBitmap: Uint8Array | null;
708
+ imageOptionsMap: Map<any, any>;
709
+ meshOptionsMap: Map<any, any>;
710
+ constructor();
711
+ /**
712
+ * Title of the document
713
+ */
714
+ get title(): string;
715
+ /**
716
+ * Gets preview image blob
717
+ * @returns dataURL of preview image
718
+ */
719
+ get previewImageDataURL(): string;
720
+ /**
721
+ * Sets preview image blob
722
+ * @param dataURL - encoded preview image
723
+ */
724
+ set previewImageDataURL(dataURL: string);
725
+ /**
726
+ * @param title - title of document
727
+ */
728
+ set title(title: string);
729
+ get imageOptionsArray(): ImageFromUrlOptions[];
730
+ /**
731
+ * Gets the base 64 encoded blobs of associated images
732
+ */
733
+ get encodedImageBlobs(): string[];
734
+ /**
735
+ * Gets the base 64 encoded blob of the associated drawing
736
+ * TODO the return type was marked as string[] here, was that an error?
737
+ */
738
+ get encodedDrawingBlob(): string;
739
+ /**
740
+ * Gets the options of the {@link Niivue} instance
741
+ */
742
+ get opts(): NVConfigOptions;
743
+ /**
744
+ * Sets the options of the {@link Niivue} instance
745
+ */
746
+ set opts(opts: NVConfigOptions);
747
+ /**
748
+ * Gets the 3D labels of the {@link Niivue} instance
749
+ */
750
+ get labels(): NVLabel3D[];
751
+ /**
752
+ * Sets the 3D labels of the {@link Niivue} instance
753
+ */
754
+ set labels(labels: NVLabel3D[]);
755
+ /**
756
+ * Checks if document has an image by id
757
+ */
758
+ hasImage(image: NVImage): boolean;
759
+ /**
760
+ * Checks if document has an image by url
761
+ */
762
+ hasImageFromUrl(url: string): boolean;
763
+ /**
764
+ * Adds an image and the options an image was created with
765
+ */
766
+ addImageOptions(image: NVImage, imageOptions: ImageFromUrlOptions): void;
767
+ /**
768
+ * Removes image from the document as well as its options
769
+ */
770
+ removeImage(image: NVImage): void;
771
+ /**
772
+ * Returns the options for the image if it was added by url
773
+ */
774
+ getImageOptions(image: NVImage): ImageFromUrlOptions | null;
775
+ /**
776
+ * Converts NVDocument to JSON
777
+ */
778
+ json(): ExportDocumentData;
779
+ /**
780
+ * Downloads a JSON file with options, scene, images, meshes and drawing of {@link Niivue} instance
781
+ */
782
+ download(fileName: string): void;
783
+ /**
784
+ * Deserialize mesh data objects
785
+ */
786
+ static deserializeMeshDataObjects(document: NVDocument): void;
787
+ /**
788
+ * Factory method to return an instance of NVDocument from a URL
789
+ */
790
+ static loadFromUrl(url: string): Promise<NVDocument>;
791
+ /**
792
+ * Factory method to return an instance of NVDocument from a File object
793
+ */
794
+ static loadFromFile(file: Blob): Promise<NVDocument>;
795
+ /**
796
+ * Factory method to return an instance of NVDocument from JSON
797
+ */
798
+ static loadFromJSON(data: DocumentData): NVDocument;
799
+ }
800
+
801
+ type NiftiHeader = {
802
+ littleEndian: boolean;
803
+ dim_info: number;
804
+ dims: number[];
805
+ pixDims: number[];
806
+ intent_p1: number;
807
+ intent_p2: number;
808
+ intent_p3: number;
809
+ intent_code: number;
810
+ datatypeCode: number;
811
+ numBitsPerVoxel: number;
812
+ slice_start: number;
813
+ vox_offset: number;
814
+ scl_slope: number;
815
+ scl_inter: number;
816
+ slice_end: number;
817
+ slice_code: number;
818
+ xyzt_units: number;
819
+ cal_max: number;
820
+ cal_min: number;
821
+ slice_duration: number;
822
+ toffset: number;
823
+ description: string;
824
+ aux_file: string;
825
+ qform_code: number;
826
+ sform_code: number;
827
+ quatern_b: number;
828
+ quatern_c: number;
829
+ quatern_d: number;
830
+ qoffset_x: number;
831
+ qoffset_y: number;
832
+ qoffset_z: number;
833
+ affine: number[][];
834
+ intent_name: string;
835
+ magic: string;
836
+ };
837
+ type Volume = Record<string, any>;
838
+ type Point = {
839
+ comments: Array<{
840
+ text: string;
841
+ prefilled?: string;
842
+ }>;
843
+ coordinates: {
844
+ x: number;
845
+ y: number;
846
+ z: number;
847
+ };
848
+ };
849
+ /**
850
+ * Representes the vertices of a connectome
851
+ * @ignore
852
+ */
853
+ type NVConnectomeNode = {
854
+ name: string;
855
+ x: number;
856
+ y: number;
857
+ z: number;
858
+ colorValue: number;
859
+ sizeValue: number;
860
+ label?: NVLabel3D;
861
+ };
862
+ /**
863
+ * Represents edges between connectome nodes
864
+ * @ignore
865
+ */
866
+ type NVConnectomeEdge = {
867
+ first: number;
868
+ second: number;
869
+ colorValue: number;
870
+ };
871
+ type ConnectomeOptions = {
872
+ name: string;
873
+ nodeColormap: string;
874
+ nodeColormapNegative: string;
875
+ nodeMinColor: number;
876
+ nodeMaxColor: number;
877
+ nodeScale: number;
878
+ edgeColormap: string;
879
+ edgeColormapNegative: string;
880
+ edgeMin: number;
881
+ edgeMax: number;
882
+ edgeScale: number;
883
+ legendLineThickness?: number;
884
+ };
885
+ type Connectome = ConnectomeOptions & {
886
+ nodes: NVConnectomeNode[];
887
+ edges: NVConnectomeEdge[];
888
+ };
889
+ type LegacyNodes = {
890
+ names: string[];
891
+ prefilled: unknown[];
892
+ X: number[];
893
+ Y: number[];
894
+ Z: number[];
895
+ Color: number[];
896
+ Size: number[];
897
+ };
898
+ type LegacyConnectome = Partial<ConnectomeOptions> & {
899
+ nodes: LegacyNodes;
900
+ edges: number[];
901
+ };
902
+ type DragReleaseParams = {
903
+ fracStart: vec3;
904
+ fracEnd: vec3;
905
+ voxStart: vec3;
906
+ voxEnd: vec3;
907
+ mmStart: vec4;
908
+ mmEnd: vec4;
909
+ mmLength: number;
910
+ tileIdx: number;
911
+ axCorSag: SLICE_TYPE;
912
+ };
913
+
914
+ type ValuesArray = Array<{
915
+ id: string;
916
+ vals: Float32Array;
917
+ global_min?: number;
918
+ global_max?: number;
919
+ cal_min?: number;
920
+ cal_max?: number;
921
+ }>;
922
+ type TypedNumberArray = Float64Array | Float32Array | Uint32Array | Uint16Array | Uint8Array | Int32Array | Int16Array | Int8Array;
923
+ type AnyNumberArray = number[] | TypedNumberArray;
924
+ type DefaultMeshType = {
925
+ positions: Float32Array;
926
+ indices: Uint32Array;
927
+ colors?: Float32Array;
928
+ };
929
+ type TRACT = {
930
+ pts: Float32Array;
931
+ offsetPt0: Uint32Array;
932
+ dps: ValuesArray;
933
+ };
934
+ type TT = {
935
+ pts: Float32Array;
936
+ offsetPt0: Uint32Array;
937
+ };
938
+ type TRX = {
939
+ pts: Float32Array;
940
+ offsetPt0: Uint32Array;
941
+ dpg: ValuesArray;
942
+ dps: ValuesArray;
943
+ dpv: ValuesArray;
944
+ header: unknown;
945
+ };
946
+ type TRK = {
947
+ pts: Float32Array;
948
+ offsetPt0: Uint32Array;
949
+ dps: ValuesArray;
950
+ dpv: ValuesArray;
951
+ };
952
+ type TCK = {
953
+ pts: Float32Array;
954
+ offsetPt0: Uint32Array;
955
+ };
956
+ type VTK = DefaultMeshType | {
957
+ pts: Float32Array;
958
+ offsetPt0: Uint32Array;
959
+ };
960
+ type ANNOT = Uint32Array | {
961
+ scalars: Float32Array;
962
+ colormapLabel: LUT;
963
+ };
964
+ type MZ3 = Float32Array | {
965
+ positions: Float32Array | null;
966
+ indices: Uint32Array | null;
967
+ scalars: Float32Array;
968
+ colors: Float32Array | null;
969
+ };
970
+ type GII = {
971
+ scalars: Float32Array;
972
+ positions?: Float32Array;
973
+ indices?: Uint32Array;
974
+ colormapLabel?: LUT;
975
+ anatomicalStructurePrimary: string;
976
+ };
977
+ type MGH = AnyNumberArray | {
978
+ scalars: AnyNumberArray;
979
+ colormapLabel: LUT;
980
+ };
981
+ type X3D = {
982
+ positions: Float32Array;
983
+ indices: Uint32Array;
984
+ rgba255: Uint8Array;
985
+ };
986
+
987
+ /** Enum for text alignment
988
+ */
989
+ declare enum MeshType {
990
+ MESH = "mesh",
991
+ CONNECTOME = "connectome",
992
+ FIBER = "fiber"
993
+ }
994
+ type NVMeshLayer = {
995
+ name?: string;
996
+ key?: string;
997
+ url?: string;
998
+ headers?: Record<string, string>;
999
+ opacity: number;
1000
+ colormap: string;
1001
+ colormapNegative?: string;
1002
+ colormapInvert?: boolean;
1003
+ colormapLabel?: ColorMap | LUT;
1004
+ useNegativeCmap?: boolean;
1005
+ global_min?: number;
1006
+ global_max?: number;
1007
+ cal_min: number;
1008
+ cal_max: number;
1009
+ cal_minNeg: number;
1010
+ cal_maxNeg: number;
1011
+ isAdditiveBlend?: boolean;
1012
+ frame4D: number;
1013
+ nFrame4D: number;
1014
+ values: AnyNumberArray;
1015
+ outlineBorder?: number;
1016
+ isTransparentBelowCalMin?: boolean;
1017
+ alphaThreshold?: boolean;
1018
+ base64?: string;
1019
+ colorbarVisible?: boolean;
1020
+ };
1021
+ declare const NVMeshLayerDefaults: {
1022
+ colormap: string;
1023
+ opacity: number;
1024
+ nFrame4D: number;
1025
+ frame4D: number;
1026
+ outlineBorder: number;
1027
+ cal_min: number;
1028
+ cal_max: number;
1029
+ cal_minNeg: number;
1030
+ cal_maxNeg: number;
1031
+ values: number[];
1032
+ };
1033
+ declare class NVMeshFromUrlOptions {
1034
+ url: string;
1035
+ gl: WebGL2RenderingContext | null;
1036
+ name: string;
1037
+ opacity: number;
1038
+ rgba255: Uint8Array;
1039
+ visible: boolean;
1040
+ layers: NVMeshLayer[];
1041
+ colorbarVisible: boolean;
1042
+ constructor(url?: string, gl?: null, name?: string, opacity?: number, rgba255?: Uint8Array, visible?: boolean, layers?: never[], colorbarVisible?: boolean);
1043
+ }
1044
+ type BaseLoadParams = {
1045
+ gl: WebGL2RenderingContext;
1046
+ name: string;
1047
+ opacity: number;
1048
+ rgba255: number[] | Uint8Array;
1049
+ visible: boolean;
1050
+ layers: NVMeshLayer[];
1051
+ };
1052
+ type LoadFromUrlParams = Partial<BaseLoadParams> & {
1053
+ url: string;
1054
+ headers?: Record<string, string>;
1055
+ buffer?: ArrayBuffer;
1056
+ };
1057
+ type LoadFromFileParams = BaseLoadParams & {
1058
+ file: Blob;
1059
+ };
1060
+ type LoadFromBase64Params = BaseLoadParams & {
1061
+ base64: string;
1062
+ };
1063
+ /**
1064
+ * a NVMesh encapsulates some mesh data and provides methods to query and operate on meshes
1065
+ */
1066
+ declare class NVMesh {
1067
+ id: string;
1068
+ name: string;
1069
+ anatomicalStructurePrimary: string;
1070
+ colorbarVisible: boolean;
1071
+ furthestVertexFromOrigin: number;
1072
+ extentsMin: number | number[];
1073
+ extentsMax: number | number[];
1074
+ opacity: number;
1075
+ visible: boolean;
1076
+ meshShaderIndex: number;
1077
+ offsetPt0: Uint32Array | null;
1078
+ colormapInvert: boolean;
1079
+ fiberGroupColormap: ColorMap | null;
1080
+ indexBuffer: WebGLBuffer;
1081
+ vertexBuffer: WebGLBuffer;
1082
+ vao: WebGLVertexArrayObject;
1083
+ vaoFiber: WebGLVertexArrayObject;
1084
+ pts: Float32Array;
1085
+ tris?: Uint32Array;
1086
+ layers: NVMeshLayer[];
1087
+ type: MeshType;
1088
+ data_type?: string;
1089
+ rgba255: Uint8Array;
1090
+ fiberLength?: number;
1091
+ fiberLengths?: Uint32Array;
1092
+ fiberDither: number;
1093
+ fiberColor: string;
1094
+ fiberDecimationStride: number;
1095
+ fiberSides: number;
1096
+ fiberRadius: number;
1097
+ f32PerVertex: number;
1098
+ fiberMask?: unknown[];
1099
+ colormap?: ColorMap | LegacyConnectome | string | null;
1100
+ dpg?: ValuesArray | null;
1101
+ dps?: ValuesArray | null;
1102
+ dpv?: ValuesArray | null;
1103
+ hasConnectome: boolean;
1104
+ connectome?: LegacyConnectome | string;
1105
+ indexCount?: number;
1106
+ vertexCount: number;
1107
+ nodeScale: number;
1108
+ edgeScale: number;
1109
+ legendLineThickness: number;
1110
+ nodeColormap: string;
1111
+ edgeColormap: string;
1112
+ nodeColormapNegative?: string;
1113
+ edgeColormapNegative?: string;
1114
+ nodeMinColor?: number;
1115
+ nodeMaxColor?: number;
1116
+ edgeMin?: number;
1117
+ edgeMax?: number;
1118
+ nodes?: LegacyNodes | NVConnectomeNode[];
1119
+ edges?: number[] | NVConnectomeEdge[];
1120
+ points?: Point[];
1121
+ /**
1122
+ * @param pts - a 3xN array of vertex positions (X,Y,Z coordinates).
1123
+ * @param tris - a 3xN array of triangle indices (I,J,K; indexed from zero). Each triangle generated from three vertices.
1124
+ * @param name - a name for this image. Default is an empty string
1125
+ * @param rgba255 - the base color of the mesh. RGBA values from 0 to 255. Default is white
1126
+ * @param opacity - the opacity for this mesh. default is 1
1127
+ * @param visible - whether or not this image is to be visible
1128
+ * @param gl - WebGL rendering context
1129
+ * @param connectome - specify connectome edges and nodes. Default is null (not a connectome).
1130
+ * @param dpg - Data per group for tractography, see TRK format. Default is null (not tractograpgy)
1131
+ * @param dps - Data per streamline for tractography, see TRK format. Default is null (not tractograpgy)
1132
+ * @param dpv - Data per vertex for tractography, see TRK format. Default is null (not tractograpgy)
1133
+ * @param colorbarVisible - does this mesh display a colorbar
1134
+ * @param anatomicalStructurePrimary - region for mesh. Default is an empty string
1135
+ */
1136
+ constructor(pts: Float32Array, tris: Uint32Array, name: string | undefined, rgba255: Uint8Array | undefined, opacity: number | undefined, visible: boolean | undefined, gl: WebGL2RenderingContext, connectome?: LegacyConnectome | string | null, dpg?: ValuesArray | null, dps?: ValuesArray | null, dpv?: ValuesArray | null, colorbarVisible?: boolean, anatomicalStructurePrimary?: string);
1137
+ initValuesArray(va: ValuesArray): ValuesArray;
1138
+ linesToCylinders(gl: WebGL2RenderingContext, posClrF32: Float32Array, indices: number[]): void;
1139
+ updateFibers(gl: WebGL2RenderingContext): void;
1140
+ indexNearestXYZmm(Xmm: number, Ymm: number, Zmm: number): number[];
1141
+ updateMesh(gl: WebGL2RenderingContext): void;
1142
+ reverseFaces(gl: WebGL2RenderingContext): void;
1143
+ setLayerProperty(id: number, key: keyof NVMeshLayer, val: number | string | boolean, gl: WebGL2RenderingContext): void;
1144
+ setProperty(key: keyof this, val: unknown, gl: WebGL2RenderingContext): void;
1145
+ generatePosNormClr(pts: Float32Array, tris: Uint32Array, rgba255: Uint8Array): Float32Array;
1146
+ static readMesh(buffer: ArrayBuffer, name: string, gl: WebGL2RenderingContext, opacity?: number, rgba255?: Uint8Array, visible?: boolean): NVMesh;
1147
+ static loadLayer(layer: NVMeshLayer, nvmesh: NVMesh): Promise<void>;
1148
+ /**
1149
+ * factory function to load and return a new NVMesh instance from a given URL
1150
+ */
1151
+ static loadFromUrl({ url, headers, gl, name, opacity, rgba255, visible, layers, buffer }?: Partial<LoadFromUrlParams>): Promise<NVMesh>;
1152
+ static readFileAsync(file: Blob): Promise<ArrayBuffer>;
1153
+ /**
1154
+ * factory function to load and return a new NVMesh instance from a file in the browser
1155
+ *
1156
+ * @returns NVMesh instance
1157
+ */
1158
+ static loadFromFile({ file, gl, name, opacity, rgba255, visible, layers }?: Partial<LoadFromFileParams>): Promise<NVMesh>;
1159
+ /**
1160
+ * load and return a new NVMesh instance from a base64 encoded string
1161
+ */
1162
+ loadFromBase64({ base64, gl, name, opacity, rgba255, visible, layers }?: Partial<LoadFromBase64Params>): Promise<NVMesh>;
1163
+ static readGII(buffer: ArrayBuffer): GII;
1164
+ static readX3D(buffer: ArrayBuffer): X3D;
1165
+ static readNII(buffer: ArrayBuffer, n_vert?: number): Uint8Array | Float32Array | Int32Array | Int16Array;
1166
+ static readNII2(buffer: ArrayBuffer, n_vert?: number): Uint8Array | Float32Array | Int32Array | Int16Array;
1167
+ static readMGH(buffer: ArrayBuffer): MGH;
1168
+ static readSTL(buffer: ArrayBuffer): DefaultMeshType;
1169
+ static readTxtSTL(buffer: ArrayBuffer): DefaultMeshType;
1170
+ static readSRF(buffer: ArrayBuffer): DefaultMeshType;
1171
+ static readFreeSurfer(buffer: ArrayBuffer): DefaultMeshType;
1172
+ static readOBJ(buffer: ArrayBuffer): DefaultMeshType;
1173
+ static readOFF(buffer: ArrayBuffer): DefaultMeshType;
1174
+ static readGEO(buffer: ArrayBuffer, isFlipWinding?: boolean): DefaultMeshType;
1175
+ static readICO(buffer: ArrayBuffer): DefaultMeshType;
1176
+ static readPLY(buffer: ArrayBuffer): DefaultMeshType;
1177
+ static readMZ3(buffer: ArrayBuffer, n_vert?: number): MZ3;
1178
+ static readVTK(buffer: ArrayBuffer): VTK;
1179
+ static readASC(buffer: ArrayBuffer): DefaultMeshType;
1180
+ static readNV(buffer: ArrayBuffer): DefaultMeshType;
1181
+ static readANNOT(buffer: ArrayBuffer, n_vert: number, isReadColortables?: boolean): ANNOT;
1182
+ static readCURV(buffer: ArrayBuffer, n_vert: number): Float32Array;
1183
+ static readSTC(buffer: ArrayBuffer, n_vert: number): Float32Array;
1184
+ static readSMP(buffer: ArrayBuffer, n_vert: number): Float32Array;
1185
+ static readTxtVTK(buffer: ArrayBuffer): VTK;
1186
+ static readTRK(buffer: ArrayBuffer): TRK;
1187
+ static readTCK(buffer: ArrayBuffer): TCK;
1188
+ static readTSF(buffer: ArrayBuffer): Float32Array;
1189
+ static readTT(buffer: ArrayBuffer): TT;
1190
+ static readTRX(buffer: ArrayBuffer): TRX;
1191
+ static readTRACT(buffer: ArrayBuffer): TRACT;
1192
+ }
1193
+
1194
+ /**
1195
+ * Enum for sync operations
1196
+ */
1197
+ declare enum NVMESSAGE {
1198
+ ZOOM = 1,// "zoom",
1199
+ CLIP_PLANE = 2,// "clipPlane",
1200
+ AZIMUTH_ELEVATION = 3,// "ae",
1201
+ FRAME_CHANGED = 4,// "frame changed",
1202
+ VOLUME_ADDED_FROM_URL = 5,// "volume added from url",
1203
+ VOLUME_WITH_URL_REMOVED = 6,// "volume with url removed",
1204
+ COLORMAP_CHANGED = 7,// "color map has changed",
1205
+ OPACITY_CHANGED = 8,// "opacity has changed",
1206
+ MESH_FROM_URL_ADDED = 9,// "mesh added from url",
1207
+ MESH_WITH_URL_REMOVED = 10,// "mesh with url removed",
1208
+ CUSTOM_SHADER_ADDED = 11,// "custom shader added",
1209
+ SHADER_CHANGED = 12,// "mesh shader changed",
1210
+ MESH_PROPERTY_CHANGED = 13,// "mesh property changed",
1211
+ USER_JOINED = "user joined",// TODO this breaks the scheme a bit -- see session-bus::localStorageEventListener
1212
+ CREATE = "create",// TODO same as above
1213
+ VOLUME_LOADED_FROM_URL = "volume with url added"
1214
+ }
1215
+ type Message = {
1216
+ userKey?: string;
1217
+ from?: string;
1218
+ } & ({
1219
+ op: NVMESSAGE.ZOOM;
1220
+ zoom: number;
1221
+ } | {
1222
+ op: NVMESSAGE.CLIP_PLANE;
1223
+ clipPlane: number[];
1224
+ } | {
1225
+ op: NVMESSAGE.AZIMUTH_ELEVATION;
1226
+ elevation: number;
1227
+ azimuth: number;
1228
+ } | {
1229
+ op: NVMESSAGE.FRAME_CHANGED;
1230
+ url: string;
1231
+ index: number;
1232
+ } | {
1233
+ op: NVMESSAGE.VOLUME_ADDED_FROM_URL;
1234
+ imageOptions: any;
1235
+ } | {
1236
+ op: NVMESSAGE.VOLUME_LOADED_FROM_URL;
1237
+ url: string;
1238
+ } | {
1239
+ op: NVMESSAGE.VOLUME_WITH_URL_REMOVED;
1240
+ url: string;
1241
+ } | {
1242
+ op: NVMESSAGE.COLORMAP_CHANGED;
1243
+ url: string;
1244
+ colormap: string;
1245
+ } | {
1246
+ op: NVMESSAGE.OPACITY_CHANGED;
1247
+ url: string;
1248
+ opacity: number;
1249
+ } | {
1250
+ op: NVMESSAGE.MESH_FROM_URL_ADDED;
1251
+ meshOptions: LoadFromUrlParams;
1252
+ } | {
1253
+ op: NVMESSAGE.MESH_WITH_URL_REMOVED;
1254
+ url: string;
1255
+ } | {
1256
+ op: NVMESSAGE.CUSTOM_SHADER_ADDED;
1257
+ fragmentShaderText: string;
1258
+ name: string;
1259
+ } | {
1260
+ op: NVMESSAGE.SHADER_CHANGED;
1261
+ meshIndex: number;
1262
+ shaderIndex: number;
1263
+ } | {
1264
+ op: NVMESSAGE.MESH_PROPERTY_CHANGED;
1265
+ meshIndex: number;
1266
+ key: string;
1267
+ val: unknown;
1268
+ } | {
1269
+ op: NVMESSAGE.USER_JOINED;
1270
+ user: SessionUser;
1271
+ } | {
1272
+ op: NVMESSAGE.CREATE;
1273
+ key: string;
1274
+ });
1275
+
1276
+ /**
1277
+ * SessionUser specifies display name, user id and user key
1278
+ * @param userKey - Used to protect user properties
1279
+ */
1280
+ declare class SessionUser {
1281
+ id: string;
1282
+ displayName: string;
1283
+ key: string;
1284
+ properties: Map<string, string>;
1285
+ constructor(displayName?: string, userId?: string, userKey?: string, userProperties?: Map<string, string>);
1286
+ }
1287
+ /**
1288
+ * SessionBus is for synchronizing both remote and local instances
1289
+ */
1290
+ declare class SessionBus {
1291
+ userList: SessionUser[];
1292
+ user: SessionUser;
1293
+ userQueueName?: string;
1294
+ userListName?: string;
1295
+ onMessageCallback: (newMessage: Message) => void;
1296
+ isConnectedToServer: boolean;
1297
+ isController: boolean;
1298
+ sessionScene: {};
1299
+ sessionKey: string;
1300
+ sessionName: string;
1301
+ sessionSceneName: string;
1302
+ serverConnection$: WebSocketSubject<Message> | null;
1303
+ constructor(name: string, user: SessionUser, onMessageCallback: (newMessage: Message) => void, serverURL?: string, sessionKey?: string);
1304
+ sendSessionMessage(message: Message): void;
1305
+ connectToServer(serverURL: string, sessionName: string): void;
1306
+ subscribeToServer(): void;
1307
+ sendLocalMessage(message: Message): void;
1308
+ localStorageEventListener(e: StorageEvent): void;
1309
+ }
1310
+
1311
+ /**
1312
+ * NVController is for synchronizing both remote and local instances of Niivue
1313
+ * @ignore
1314
+ */
1315
+ declare class NVController {
1316
+ niivue: Niivue;
1317
+ mediaUrlMap: Map<string, unknown>;
1318
+ isInSession: boolean;
1319
+ user?: SessionUser;
1320
+ sessionBus?: SessionBus;
1321
+ onFrameChange: (_volume: NVImage, _index: number) => void;
1322
+ /**
1323
+ * @param niivue - niivue object to control
1324
+ */
1325
+ constructor(niivue: Niivue);
1326
+ onLocationChangeHandler(location: unknown): void;
1327
+ addVolume(volume: NVImage, url: string): void;
1328
+ addMesh(mesh: NVMesh, url: string): void;
1329
+ onNewMessage(msg: Message): void;
1330
+ /**
1331
+ * Connects to existing session or creates new session
1332
+ */
1333
+ connectToSession(sessionName: string, user?: SessionUser, serverBaseUrl?: string, sessionKey?: string): void;
1334
+ /**
1335
+ * Zoom level has changed
1336
+ */
1337
+ onZoom3DChangeHandler(zoom: number): void;
1338
+ /**
1339
+ * Azimuth and/or elevation has changed
1340
+ */
1341
+ onAzimuthElevationChangeHandler(azimuth: number, elevation: number): void;
1342
+ /**
1343
+ * Clip plane has changed
1344
+ */
1345
+ onClipPlaneChangeHandler(clipPlane: number[]): void;
1346
+ /**
1347
+ * Add an image and notify subscribers
1348
+ */
1349
+ onVolumeAddedFromUrlHandler(imageOptions: ImageFromUrlOptions, volume: NVImage): void;
1350
+ /**
1351
+ * A volume has been added
1352
+ */
1353
+ onImageLoadedHandler(volume: NVImage): void;
1354
+ /**
1355
+ * Notifies other users that a volume has been removed
1356
+ */
1357
+ onVolumeWithUrlRemovedHandler(url: string): void;
1358
+ /**
1359
+ * Notifies that a mesh has been loaded by URL
1360
+ */
1361
+ onMeshAddedFromUrlHandler(meshOptions: LoadFromUrlParams): void;
1362
+ /**
1363
+ * Notifies that a mesh has been added
1364
+ */
1365
+ onMeshLoadedHandler(mesh: NVMesh): void;
1366
+ onMeshWithUrlRemovedHandler(url: string): void;
1367
+ /**
1368
+ *
1369
+ * @param volume - volume that has changed color maps
1370
+ */
1371
+ onColormapChangeHandler(volume: NVImage): void;
1372
+ /**
1373
+ * @param volume - volume that has changed opacity
1374
+ */
1375
+ onOpacityChangeHandler(volume: NVImage): void;
1376
+ /**
1377
+ * Frame for 4D image has changed
1378
+ */
1379
+ onFrameChangeHandler(volume: NVImage, index: number): void;
1380
+ /**
1381
+ * Custom mesh shader has been added
1382
+ * @param fragmentShaderText - shader code to be compiled
1383
+ * @param name - name of shader, can be used as index
1384
+ */
1385
+ onCustomMeshShaderAddedHandler(fragmentShaderText: string, name: string): void;
1386
+ /**
1387
+ * Mesh shader has changed
1388
+ * @param meshIndex - index of mesh
1389
+ * @param shaderIndex - index of shader
1390
+ */
1391
+ onMeshShaderChanged(meshIndex: number, shaderIndex: number): void;
1392
+ /**
1393
+ * Mesh property has been changed
1394
+ * @param meshIndex - index of mesh
1395
+ * @param key - property index
1396
+ * @param val - property value
1397
+ */
1398
+ onMeshPropertyChanged(meshIndex: number, key: string, val: unknown): void;
1399
+ }
1400
+
1401
+ /**
1402
+ * Namespace for utility functions
1403
+ * @ignore
1404
+ */
1405
+ declare class NVUtilities {
1406
+ static arrayBufferToBase64(arrayBuffer: ArrayBuffer): string;
1407
+ static uint8tob64(bytes: Uint8Array): string;
1408
+ static download(content: string, fileName: string, contentType: string): void;
1409
+ static readFileAsync(file: Blob): Promise<ArrayBuffer>;
1410
+ static blobToBase64(blob: Blob): Promise<string>;
1411
+ static decompressBase64String(base64: string): string;
1412
+ static compressToBase64String(string: string): string;
1413
+ static arraysAreEqual(a: unknown[], b: unknown[]): boolean;
1414
+ /**
1415
+ * Generate a pre-filled number array.
1416
+ *
1417
+ * @param start - start value
1418
+ * @param stop - stop value
1419
+ * @param step - step value
1420
+ * @returns filled number array
1421
+ */
1422
+ static range(start: number, stop: number, step: number): number[];
1423
+ /**
1424
+ * convert spherical AZIMUTH, ELEVATION to Cartesian
1425
+ * @param azimuth - azimuth number
1426
+ * @param elevation - elevation number
1427
+ * @returns the converted [x, y, z] coordinates
1428
+ * @example
1429
+ * xyz = NVUtilities.sph2cartDeg(42, 42)
1430
+ */
1431
+ static sph2cartDeg(azimuth: number, elevation: number): number[];
1432
+ static vox2mm(XYZ: number[], mtx: mat4): vec3;
1433
+ }
1434
+
1435
+ /**
1436
+ * Class to load different mesh formats
1437
+ * @ignore
1438
+ */
1439
+ declare class NVMeshLoaders {
1440
+ static readTRACT(buffer: ArrayBuffer): TRACT;
1441
+ static readTT(buffer: ArrayBuffer): TT;
1442
+ static readTRX(buffer: ArrayBuffer): TRX;
1443
+ static readTSF(buffer: ArrayBuffer, n_vert?: number): Float32Array;
1444
+ static readTCK(buffer: ArrayBuffer): TCK;
1445
+ static readTRK(buffer: ArrayBuffer): TRK;
1446
+ static readTxtVTK(buffer: ArrayBuffer): VTK;
1447
+ static readLayer(name: string | undefined, buffer: ArrayBuffer, nvmesh: NVMesh, opacity?: number, colormap?: string, colormapNegative?: string, useNegativeCmap?: boolean, cal_min?: number | null, cal_max?: number | null, outlineBorder?: number): NVMeshLayer | undefined;
1448
+ static readSMP(buffer: ArrayBuffer, n_vert: number): Float32Array;
1449
+ static readSTC(buffer: ArrayBuffer, n_vert: number): Float32Array;
1450
+ static readCURV(buffer: ArrayBuffer, n_vert: number): Float32Array;
1451
+ static readANNOT(buffer: ArrayBuffer, n_vert: number, isReadColortables?: boolean): ANNOT;
1452
+ static readNV(buffer: ArrayBuffer): DefaultMeshType;
1453
+ static readASC(buffer: ArrayBuffer): DefaultMeshType;
1454
+ static readVTK(buffer: ArrayBuffer): VTK;
1455
+ static readDFS(buffer: ArrayBuffer): DefaultMeshType;
1456
+ static readMZ3(buffer: ArrayBuffer, n_vert?: number): MZ3;
1457
+ static readPLY(buffer: ArrayBuffer): DefaultMeshType;
1458
+ static readICO(buffer: ArrayBuffer): DefaultMeshType;
1459
+ static readGEO(buffer: ArrayBuffer, isFlipWinding?: boolean): DefaultMeshType;
1460
+ static readOFF(buffer: ArrayBuffer): DefaultMeshType;
1461
+ static readOBJMNI(buffer: ArrayBuffer): DefaultMeshType;
1462
+ static readOBJ(buffer: ArrayBuffer): DefaultMeshType;
1463
+ static readFreeSurfer(buffer: ArrayBuffer): DefaultMeshType;
1464
+ static readSRF(buffer: ArrayBuffer): DefaultMeshType;
1465
+ static readTxtSTL(buffer: ArrayBuffer): DefaultMeshType;
1466
+ static readSTL(buffer: ArrayBuffer): DefaultMeshType;
1467
+ static readNII2(buffer: ArrayBuffer, n_vert?: number, anatomicalStructurePrimary?: string): Int32Array | Float32Array | Int16Array | Uint8Array;
1468
+ static readNII(buffer: ArrayBuffer, n_vert?: number, anatomicalStructurePrimary?: string): Float32Array | Uint8Array | Int32Array | Int16Array;
1469
+ static readMGH(buffer: ArrayBuffer, n_vert?: number, isReadColortables?: boolean): MGH;
1470
+ static readX3D(buffer: ArrayBuffer): X3D;
1471
+ static readGII(buffer: ArrayBuffer, n_vert?: number): GII;
1472
+ }
1473
+
1474
+ type ColormapListEntry = {
1475
+ name: string;
1476
+ min: number;
1477
+ max: number;
1478
+ alphaThreshold: boolean;
1479
+ negative: boolean;
1480
+ visible: boolean;
1481
+ invert: boolean;
1482
+ };
1483
+ type Graph = {
1484
+ LTWH: number[];
1485
+ plotLTWH?: number[];
1486
+ opacity: number;
1487
+ vols: number[];
1488
+ autoSizeMultiplanar: boolean;
1489
+ normalizeValues: boolean;
1490
+ backColor?: number[];
1491
+ lineColor?: number[];
1492
+ textColor?: number[];
1493
+ lineThickness?: number;
1494
+ lineAlpha?: number;
1495
+ lines?: number[][];
1496
+ selectedColumn?: number;
1497
+ lineRGB?: number[][];
1498
+ };
1499
+ type Descriptive = {
1500
+ mean: number;
1501
+ stdev: number;
1502
+ nvox: number;
1503
+ volumeMM3: number;
1504
+ volumeML: number;
1505
+ min: number;
1506
+ max: number;
1507
+ meanNot0: number;
1508
+ stdevNot0: number;
1509
+ nvoxNot0: number;
1510
+ minNot0: number;
1511
+ maxNot0: number;
1512
+ cal_min: number;
1513
+ cal_max: number;
1514
+ robust_min: number;
1515
+ robust_max: number;
1516
+ };
1517
+ type SliceScale = {
1518
+ volScale: number[];
1519
+ vox: number[];
1520
+ longestAxis: number;
1521
+ dimsMM: vec3;
1522
+ };
1523
+ type MvpMatrix2D = {
1524
+ modelViewProjectionMatrix: mat4;
1525
+ modelMatrix: mat4;
1526
+ normalMatrix: mat4;
1527
+ leftTopMM: number[];
1528
+ fovMM: number[];
1529
+ };
1530
+ type MM = {
1531
+ mnMM: vec3;
1532
+ mxMM: vec3;
1533
+ rotation: mat4;
1534
+ fovMM: vec3;
1535
+ };
1536
+ type UIData = {
1537
+ mousedown: boolean;
1538
+ touchdown: boolean;
1539
+ mouseButtonLeftDown: boolean;
1540
+ mouseButtonCenterDown: boolean;
1541
+ mouseButtonRightDown: boolean;
1542
+ mouseDepthPicker: boolean;
1543
+ clickedTile: number;
1544
+ pan2DxyzmmAtMouseDown: vec4;
1545
+ prevX: number;
1546
+ prevY: number;
1547
+ currX: number;
1548
+ currY: number;
1549
+ currentTouchTime: number;
1550
+ lastTouchTime: number;
1551
+ touchTimer: NodeJS.Timeout | null;
1552
+ doubleTouch: boolean;
1553
+ isDragging: boolean;
1554
+ dragStart: number[];
1555
+ dragEnd: number[];
1556
+ dragClipPlaneStartDepthAziElev: number[];
1557
+ lastTwoTouchDistance: number;
1558
+ multiTouchGesture: boolean;
1559
+ dpr?: number;
1560
+ };
1561
+ type SaveImageOptions = {
1562
+ filename: string;
1563
+ isSaveDrawing: boolean;
1564
+ volumeByIndex: number;
1565
+ };
1566
+ /**
1567
+ * Niivue can be attached to a canvas. An instance of Niivue contains methods for
1568
+ * loading and rendering NIFTI image data in a WebGL 2.0 context.
1569
+ *
1570
+ * @example
1571
+ * let niivue = new Niivue({crosshairColor: [0,1,0,0.5], textHeight: 0.5}) // a see-through green crosshair, and larger text labels
1572
+ */
1573
+ declare class Niivue {
1574
+ canvas: HTMLCanvasElement | null;
1575
+ _gl: WebGL2RenderingContext | null;
1576
+ isBusy: boolean;
1577
+ needsRefresh: boolean;
1578
+ colormapTexture: WebGLTexture | null;
1579
+ colormapLists: ColormapListEntry[];
1580
+ volumeTexture: WebGLTexture | null;
1581
+ gradientTexture: WebGLTexture | null;
1582
+ gradientTextureAmount: number;
1583
+ drawTexture: WebGLTexture | null;
1584
+ drawUndoBitmaps: Uint8Array[];
1585
+ drawLut: LUT;
1586
+ drawOpacity: number;
1587
+ renderDrawAmbientOcclusion: number;
1588
+ colorbarHeight: number;
1589
+ drawPenLocation: number[];
1590
+ drawPenAxCorSag: number;
1591
+ drawFillOverwrites: boolean;
1592
+ drawPenFillPts: number[][];
1593
+ overlayTexture: WebGLTexture | null;
1594
+ overlayTextureID: WebGLTexture | null;
1595
+ sliceMMShader?: Shader;
1596
+ sliceV1Shader?: Shader;
1597
+ orientCubeShader?: Shader;
1598
+ orientCubeShaderVAO: WebGLVertexArrayObject | null;
1599
+ rectShader?: Shader;
1600
+ renderShader?: Shader;
1601
+ lineShader?: Shader;
1602
+ line3DShader?: Shader;
1603
+ passThroughShader?: Shader;
1604
+ renderGradientShader?: Shader;
1605
+ renderSliceShader?: Shader;
1606
+ renderVolumeShader?: Shader;
1607
+ pickingMeshShader?: Shader;
1608
+ pickingImageShader?: Shader;
1609
+ colorbarShader?: Shader;
1610
+ fontShader: Shader | null;
1611
+ fiberShader?: Shader;
1612
+ fontTexture: WebGLTexture | null;
1613
+ circleShader?: Shader;
1614
+ matCapTexture: WebGLTexture | null;
1615
+ bmpShader: Shader | null;
1616
+ bmpTexture: WebGLTexture | null;
1617
+ thumbnailVisible: boolean;
1618
+ bmpTextureWH: number;
1619
+ growCutShader?: Shader;
1620
+ orientShaderAtlasU: Shader | null;
1621
+ orientShaderAtlasI: Shader | null;
1622
+ orientShaderU: Shader | null;
1623
+ orientShaderI: Shader | null;
1624
+ orientShaderF: Shader | null;
1625
+ orientShaderRGBU: Shader | null;
1626
+ surfaceShader: Shader | null;
1627
+ blurShader: Shader | null;
1628
+ sobelShader: Shader | null;
1629
+ genericVAO: WebGLVertexArrayObject | null;
1630
+ unusedVAO: null;
1631
+ crosshairs3D: NiivueObject3D | null;
1632
+ private DEFAULT_FONT_GLYPH_SHEET;
1633
+ private DEFAULT_FONT_METRICS;
1634
+ private fontMetrics?;
1635
+ private fontMets;
1636
+ backgroundMasksOverlays: number;
1637
+ overlayOutlineWidth: number;
1638
+ overlayAlphaShader: number;
1639
+ isAlphaClipDark: boolean;
1640
+ position?: vec3;
1641
+ extentsMin?: vec3;
1642
+ extentsMax?: vec3;
1643
+ private resizeObserver;
1644
+ syncOpts: Record<string, unknown>;
1645
+ readyForSync: boolean;
1646
+ uiData: UIData;
1647
+ back: NVImage | null;
1648
+ overlays: NVImage[];
1649
+ deferredVolumes: ImageFromUrlOptions[];
1650
+ deferredMeshes: LoadFromUrlParams[];
1651
+ furthestVertexFromOrigin: number;
1652
+ volScale: number[];
1653
+ vox: number[];
1654
+ mousePos: number[];
1655
+ screenSlices: Array<{
1656
+ leftTopWidthHeight: number[];
1657
+ axCorSag: SLICE_TYPE;
1658
+ sliceFrac: number;
1659
+ AxyzMxy: number[];
1660
+ leftTopMM: number[];
1661
+ fovMM: number[];
1662
+ screen2frac?: number[];
1663
+ }>;
1664
+ cuboidVertexBuffer?: WebGLBuffer;
1665
+ otherNV: Niivue | Niivue[] | null;
1666
+ volumeObject3D: NiivueObject3D | null;
1667
+ pivot3D: number[];
1668
+ furthestFromPivot: number;
1669
+ currentClipPlaneIndex: number;
1670
+ lastCalled: number;
1671
+ selectedObjectId: number;
1672
+ CLIP_PLANE_ID: number;
1673
+ VOLUME_ID: number;
1674
+ DISTANCE_FROM_CAMERA: number;
1675
+ graph: Graph;
1676
+ meshShaders: Array<{
1677
+ Name: string;
1678
+ Frag: string;
1679
+ shader?: Shader;
1680
+ }>;
1681
+ dragModes: {
1682
+ contrast: DRAG_MODE;
1683
+ measurement: DRAG_MODE;
1684
+ none: DRAG_MODE;
1685
+ pan: DRAG_MODE;
1686
+ slicer3D: DRAG_MODE;
1687
+ callbackOnly: DRAG_MODE;
1688
+ };
1689
+ sliceTypeAxial: SLICE_TYPE;
1690
+ sliceTypeCoronal: SLICE_TYPE;
1691
+ sliceTypeSagittal: SLICE_TYPE;
1692
+ sliceTypeMultiplanar: SLICE_TYPE;
1693
+ sliceTypeRender: SLICE_TYPE;
1694
+ /**
1695
+ * callback function to run when the right mouse button is released after dragging
1696
+ * @example
1697
+ * niivue.onDragRelease = () => {
1698
+ * console.log('drag ended')
1699
+ * }
1700
+ */
1701
+ onDragRelease: (params: DragReleaseParams) => void;
1702
+ /**
1703
+ * callback function to run when the left mouse button is released
1704
+ * @example
1705
+ * niivue.onMouseUp = () => {
1706
+ * console.log('mouse up')
1707
+ * }
1708
+ */
1709
+ onMouseUp: (data: Partial<UIData>) => void;
1710
+ /**
1711
+ * callback function to run when the crosshair location changes
1712
+ * @example
1713
+ * niivue.onLocationChange = (data) => {
1714
+ * console.log('location changed')
1715
+ * console.log('mm: ', data.mm)
1716
+ * console.log('vox: ', data.vox)
1717
+ * console.log('frac: ', data.frac)
1718
+ * console.log('values: ', data.values)
1719
+ * }
1720
+ */
1721
+ onLocationChange: (location: unknown) => void;
1722
+ /**
1723
+ * callback function to run when the user changes the intensity range with the selection box action (right click)
1724
+ * @example
1725
+ * niivue.onIntensityChange = (volume) => {
1726
+ * console.log('intensity changed')
1727
+ * console.log('volume: ', volume)
1728
+ * }
1729
+ */
1730
+ onIntensityChange: (volume: NVImage) => void;
1731
+ /**
1732
+ * callback function to run when a new volume is loaded
1733
+ * @example
1734
+ * niivue.onImageLoaded = (volume) => {
1735
+ * console.log('volume loaded')
1736
+ * console.log('volume: ', volume)
1737
+ * }
1738
+ */
1739
+ onImageLoaded: (volume: NVImage) => void;
1740
+ /**
1741
+ * callback function to run when a new mesh is loaded
1742
+ * @example
1743
+ * niivue.onMeshLoaded = (mesh) => {
1744
+ * console.log('mesh loaded')
1745
+ * console.log('mesh: ', mesh)
1746
+ * }
1747
+ */
1748
+ onMeshLoaded: (mesh: NVMesh) => void;
1749
+ /**
1750
+ * callback function to run when the user changes the volume when a 4D image is loaded
1751
+ * @example
1752
+ * niivue.onFrameChange = (volume, frameNumber) => {
1753
+ * console.log('frame changed')
1754
+ * console.log('volume: ', volume)
1755
+ * console.log('frameNumber: ', frameNumber)
1756
+ * }
1757
+ */
1758
+ onFrameChange: (volume: NVImage, index: number) => void;
1759
+ /**
1760
+ * callback function to run when niivue reports an error
1761
+ * @example
1762
+ * niivue.onError = (error) => {
1763
+ * console.log('error: ', error)
1764
+ * }
1765
+ */
1766
+ onError: () => void;
1767
+ onColormapChange: () => void;
1768
+ /**
1769
+ * callback function to run when niivue reports detailed info
1770
+ * @example
1771
+ * niivue.onInfo = (info) => {
1772
+ * console.log('info: ', info)
1773
+ * }
1774
+ */
1775
+ onInfo: () => void;
1776
+ /**
1777
+ * callback function to run when niivue reports a warning
1778
+ * @example
1779
+ * niivue.onWarn = (warn) => {
1780
+ * console.log('warn: ', warn)
1781
+ * }
1782
+ */
1783
+ onWarn: () => void;
1784
+ /**
1785
+ * callback function to run when niivue reports a debug message
1786
+ * @example
1787
+ * niivue.onDebug = (debug) => {
1788
+ * console.log('debug: ', debug)
1789
+ * }
1790
+ */
1791
+ onDebug: () => void;
1792
+ /**
1793
+ * callback function to run when a volume is added from a url
1794
+ * @example
1795
+ * niivue.onVolumeAddedFromUrl = (imageOptions, volume) => {
1796
+ * console.log('volume added from url')
1797
+ * console.log('imageOptions: ', imageOptions)
1798
+ * console.log('volume: ', volume)
1799
+ * }
1800
+ */
1801
+ onVolumeAddedFromUrl: (imageOptions: ImageFromUrlOptions, volume: NVImage) => void;
1802
+ onVolumeWithUrlRemoved: (url: string) => void;
1803
+ /**
1804
+ * callback function to run when updateGLVolume is called (most users will not need to use
1805
+ * @example
1806
+ * niivue.onVolumeUpdated = () => {
1807
+ * console.log('volume updated')
1808
+ * }
1809
+ */
1810
+ onVolumeUpdated: () => void;
1811
+ /**
1812
+ * callback function to run when a mesh is added from a url
1813
+ * @example
1814
+ * niivue.onMeshAddedFromUrl = (meshOptions, mesh) => {
1815
+ * console.log('mesh added from url')
1816
+ * console.log('meshOptions: ', meshOptions)
1817
+ * console.log('mesh: ', mesh)
1818
+ * }
1819
+ */
1820
+ onMeshAddedFromUrl: (meshOptions: LoadFromUrlParams, mesh: NVMesh) => void;
1821
+ onMeshAdded: () => void;
1822
+ onMeshWithUrlRemoved: (url: string) => void;
1823
+ onZoom3DChange: (zoom: number) => void;
1824
+ /**
1825
+ * callback function to run when the user changes the rotation of the 3D rendering
1826
+ * @example
1827
+ * niivue.onAzimuthElevationChange = (azimuth, elevation) => {
1828
+ * console.log('azimuth: ', azimuth)
1829
+ * console.log('elevation: ', elevation)
1830
+ * }
1831
+ */
1832
+ onAzimuthElevationChange: (azimuth: number, elevation: number) => void;
1833
+ /**
1834
+ * callback function to run when the user changes the clip plane
1835
+ * @example
1836
+ * niivue.onClipPlaneChange = (clipPlane) => {
1837
+ * console.log('clipPlane: ', clipPlane)
1838
+ * }
1839
+ */
1840
+ onClipPlaneChange: (clipPlane: number[]) => void;
1841
+ onCustomMeshShaderAdded: (fragmentShaderText: string, name: string) => void;
1842
+ onMeshShaderChanged: (meshIndex: number, shaderIndex: number) => void;
1843
+ onMeshPropertyChanged: (meshIndex: number, key: string, val: unknown) => void;
1844
+ /**
1845
+ * callback function to run when the user loads a new NiiVue document
1846
+ * @example
1847
+ * niivue.onDocumentLoaded = (document) => {
1848
+ * console.log('document: ', document)
1849
+ * }
1850
+ */
1851
+ onDocumentLoaded: (document: NVDocument) => void;
1852
+ document: NVDocument;
1853
+ get scene(): Scene;
1854
+ get opts(): NVConfigOptions;
1855
+ get sliceMosaicString(): string;
1856
+ set sliceMosaicString(newSliceMosaicString: string);
1857
+ mediaUrlMap: Map<NVImage | NVMesh, string>;
1858
+ initialized: boolean;
1859
+ currentDrawUndoBitmap: number;
1860
+ loadingText: string;
1861
+ /**
1862
+ * @param options - options object to set modifiable Niivue properties
1863
+ */
1864
+ constructor(options?: Partial<NVConfigOptions>);
1865
+ get volumes(): NVImage[];
1866
+ set volumes(volumes: NVImage[]);
1867
+ get meshes(): NVMesh[];
1868
+ set meshes(meshes: NVMesh[]);
1869
+ get drawBitmap(): Uint8Array | null;
1870
+ set drawBitmap(drawBitmap: Uint8Array | null);
1871
+ get volScaleMultiplier(): number;
1872
+ set volScaleMultiplier(scale: number);
1873
+ /**
1874
+ * save webgl2 canvas as png format bitmap
1875
+ * @param filename - filename for screen capture
1876
+ * @example niivue.saveScene('test.png');
1877
+ * @see {@link https://niivue.github.io/niivue/features/ui.html | live demo usage}
1878
+ */
1879
+ saveScene(filename?: string): Promise<void>;
1880
+ /**
1881
+ * attach the Niivue instance to the webgl2 canvas by element id
1882
+ * @param id - the id of an html canvas element
1883
+ * @param isAntiAlias - determines if anti-aliasing is requested (if not specified, AA usage depends on hardware)
1884
+ * @example niivue = new Niivue().attachTo('gl')
1885
+ * @example niivue.attachTo('gl')
1886
+ * @see {@link https://niivue.github.io/niivue/features/basic.multiplanar.html | live demo usage}
1887
+ */
1888
+ attachTo(id: string, isAntiAlias?: null): Promise<this>;
1889
+ /**
1890
+ * attach the Niivue instance to a canvas element directly
1891
+ * @param canvas - the canvas element reference
1892
+ * @example
1893
+ * niivue = new Niivue()
1894
+ * niivue.attachToCanvas(document.getElementById(id))
1895
+ */
1896
+ attachToCanvas(canvas: HTMLCanvasElement, isAntiAlias?: boolean | null): Promise<this>;
1897
+ /**
1898
+ * Sync the scene controls (orientation, crosshair location, etc.) from one Niivue instance to another. useful for using one canvas to drive another.
1899
+ * @param otherNV - the other Niivue instance that is the main controller
1900
+ * @example
1901
+ * niivue1 = new Niivue()
1902
+ * niivue2 = new Niivue()
1903
+ * niivue2.syncWith(niivue1)
1904
+ * @deprecated use broadcastTo instead
1905
+ * @see {@link https://niivue.github.io/niivue/features/sync.mesh.html | live demo usage}
1906
+ */
1907
+ syncWith(otherNV: Niivue, syncOpts?: {
1908
+ '2d': boolean;
1909
+ '3d': boolean;
1910
+ }): void;
1911
+ /**
1912
+ * Sync the scene controls (orientation, crosshair location, etc.) from one Niivue instance to others. useful for using one canvas to drive another.
1913
+ * @param otherNV - the other Niivue instance(s)
1914
+ * @example
1915
+ * niivue1 = new Niivue()
1916
+ * niivue2 = new Niivue()
1917
+ * niivue3 = new Niivue()
1918
+ * niivue1.broadcastTo(niivue2)
1919
+ * niivue1.broadcastTo([niivue2, niivue3])
1920
+ * @see {@link https://niivue.github.io/niivue/features/sync.mesh.html | live demo usage}
1921
+ */
1922
+ broadcastTo(otherNV: Niivue | Niivue[], syncOpts?: {
1923
+ '2d': boolean;
1924
+ '3d': boolean;
1925
+ }): void;
1926
+ /**
1927
+ * Sync the scene controls (orientation, crosshair location, etc.) from one Niivue instance to another. useful for using one canvas to drive another.
1928
+ * @internal
1929
+ * @example
1930
+ * niivue1 = new Niivue()
1931
+ * niivue2 = new Niivue()
1932
+ * niivue2.syncWith(niivue1)
1933
+ * niivue2.sync()
1934
+ */
1935
+ sync(): void;
1936
+ /** Not documented publicly for now
1937
+ * test if two arrays have equal values for each element
1938
+ * @param a - the first array
1939
+ * @param b - the second array
1940
+ * @example Niivue.arrayEquals(a, b)
1941
+ *
1942
+ * TODO this should maybe just use array-equal from NPM
1943
+ */
1944
+ arrayEquals(a: unknown[], b: unknown[]): boolean;
1945
+ /**
1946
+ * callback function to handle resize window events, redraws the scene.
1947
+ * @internal
1948
+ */
1949
+ resizeListener(): void;
1950
+ /**
1951
+ * callback to handle mouse move events relative to the canvas
1952
+ * @internal
1953
+ * @returns the mouse position relative to the canvas
1954
+ */
1955
+ getRelativeMousePosition(event: MouseEvent, target?: EventTarget | null): {
1956
+ x: number;
1957
+ y: number;
1958
+ } | undefined;
1959
+ getNoPaddingNoBorderCanvasRelativeMousePosition(event: MouseEvent, target: EventTarget): {
1960
+ x: number;
1961
+ y: number;
1962
+ } | undefined;
1963
+ mouseContextMenuListener(e: MouseEvent): void;
1964
+ mouseDownListener(e: MouseEvent): void;
1965
+ mouseLeftButtonHandler(e: MouseEvent): void;
1966
+ mouseCenterButtonHandler(e: MouseEvent): void;
1967
+ mouseRightButtonHandler(e: MouseEvent): void;
1968
+ /**
1969
+ * calculate the the min and max voxel indices from an array of two values (used in selecting intensities with the selection box)
1970
+ * @param array - an array of two values
1971
+ * @returns an array of two values representing the min and max voxel indices
1972
+ */
1973
+ calculateMinMaxVoxIdx(array: number[]): number[];
1974
+ calculateNewRange({ volIdx }?: {
1975
+ volIdx?: number | undefined;
1976
+ }): void;
1977
+ generateMouseUpCallback(fracStart: vec3, fracEnd: vec3): void;
1978
+ mouseUpListener(): void;
1979
+ checkMultitouch(e: TouchEvent): void;
1980
+ touchStartListener(e: TouchEvent): void;
1981
+ touchEndListener(e: TouchEvent): void;
1982
+ mouseMoveListener(e: MouseEvent): void;
1983
+ resetBriCon(msg?: TouchEvent | MouseEvent | null): void;
1984
+ setDragStart(x: number, y: number): void;
1985
+ setDragEnd(x: number, y: number): void;
1986
+ touchMoveListener(e: TouchEvent): void;
1987
+ handlePinchZoom(e: TouchEvent): void;
1988
+ keyUpListener(e: KeyboardEvent): void;
1989
+ keyDownListener(e: KeyboardEvent): void;
1990
+ wheelListener(e: WheelEvent): void;
1991
+ registerInteractions(): void;
1992
+ dragEnterListener(e: MouseEvent): void;
1993
+ dragOverListener(e: MouseEvent): void;
1994
+ getFileExt(fullname: string, upperCase?: boolean): string;
1995
+ /**
1996
+ * Add an image and notify subscribers
1997
+ * @see {@link https://niivue.github.io/niivue/features/document.3d.html | live demo usage}
1998
+ */
1999
+ addVolumeFromUrl(imageOptions: ImageFromUrlOptions): Promise<NVImage>;
2000
+ /**
2001
+ * Find media by url
2002
+ */
2003
+ getMediaByUrl(url: string): NVImage | NVMesh | undefined;
2004
+ /**
2005
+ * Remove volume by url
2006
+ * @param url - Volume added by url to remove
2007
+ * @see {@link https://niivue.github.io/niivue/features/document.3d.html | live demo usage}
2008
+ */
2009
+ removeVolumeByUrl(url: string): void;
2010
+ readDirectory(directory: FileSystemDirectoryEntry): FileSystemEntry[];
2011
+ /**
2012
+ * Returns boolean: true if filename ends with mesh extension (TRK, pial, etc)
2013
+ * @param url - filename
2014
+ */
2015
+ isMeshExt(url: string): boolean;
2016
+ /**
2017
+ * Load an image or mesh from an array buffer
2018
+ * @param buffer - ArrayBuffer with the entire contents of a mesh or volume
2019
+ * @param name - string of filename, extension used to infer type (NIfTI, MGH, MZ3, etc)
2020
+ * @see {@link http://192.168.0.150:8080/features/draganddrop.html | live demo usage}
2021
+ */
2022
+ loadFromArrayBuffer(buffer: ArrayBuffer, name: string): Promise<void>;
2023
+ /**
2024
+ * Load a mesh or image from a file object
2025
+ * @param file - File object
2026
+ */
2027
+ loadFromFile(file: File): Promise<void>;
2028
+ dropListener(e: DragEvent): void;
2029
+ /**
2030
+ * insert a gap between slices of a mutliplanar view.
2031
+ * @param pixels - spacing between tiles of multiplanar view
2032
+ * @example niivue.setMultiplanarPadPixels(4)
2033
+ * @see {@link https://niivue.github.io/niivue/features/atlas.html | live demo usage}
2034
+ */
2035
+ setMultiplanarPadPixels(pixels: number): void;
2036
+ /**
2037
+ * control placement of 2D slices.
2038
+ * @param layout - AUTO: 0, COLUMN: 1, GRID: 2, ROW: 3,
2039
+ * @example niivue.setMultiplanarLayout(2)
2040
+ * @see {@link https://niivue.github.io/niivue/features/layout.html | live demo usage}
2041
+ */
2042
+ setMultiplanarLayout(layout: number): void;
2043
+ /**
2044
+ * determine if text appears at corner (true) or sides of 2D slice.
2045
+ * @param isCornerOrientationText - controls position of text
2046
+ * @example niivue.setCornerOrientationText(true)
2047
+ * @see {@link https://niivue.github.io/niivue/features/worldspace2.html | live demo usage}
2048
+ */
2049
+ setCornerOrientationText(isCornerOrientationText: boolean): void;
2050
+ /**
2051
+ * control whether 2D slices use radiological or neurological convention.
2052
+ * @param isRadiologicalConvention - new display convention
2053
+ * @example niivue.setRadiologicalConvention(true)
2054
+ * @see {@link https://niivue.github.io/niivue/features/worldspace.html | live demo usage}
2055
+ */
2056
+ setRadiologicalConvention(isRadiologicalConvention: boolean): void;
2057
+ /**
2058
+ * Reset scene to default settings.
2059
+ * @param options - @see NiiVueOptions
2060
+ * @param resetBriCon - also reset contrast (default false).
2061
+ * @example niivue.nv1.setDefaults(opts, true);
2062
+ * @see {@link https://niivue.github.io/niivue/features/connectome.html | live demo usage}
2063
+ */
2064
+ setDefaults(options?: Partial<NVConfigOptions>, resetBriCon?: boolean): void;
2065
+ /**
2066
+ * Limit visibility of mesh in front of a 2D image. Requires world-space mode.
2067
+ * @param meshThicknessOn2D - distance from voxels for clipping mesh. Use Infinity to show entire mesh or 0.0 to hide mesh.
2068
+ * @example niivue.setMeshThicknessOn2D(42)
2069
+ * @see {@link https://niivue.github.io/niivue/features/worldspace2.html | live demo usage}
2070
+ */
2071
+ setMeshThicknessOn2D(meshThicknessOn2D: number): void;
2072
+ /**
2073
+ * Create a custom multi-slice mosaic (aka lightbox, montage) view.
2074
+ * @param str - description of mosaic.
2075
+ * @example niivue.setSliceMosaicString("A 0 20 C 30 S 42")
2076
+ * @see {@link https://niivue.github.io/niivue/features/mosaics.html | live demo usage}
2077
+ */
2078
+ setSliceMosaicString(str: string): void;
2079
+ /**
2080
+ * control 2D slice view mode.
2081
+ * @param isSliceMM - control whether 2D slices use world space (true) or voxel space (false). Beware that voxel space mode limits properties like panning, zooming and mesh visibility.
2082
+ * @example niivue.setSliceMM(true)
2083
+ * @see {@link https://niivue.github.io/niivue/features/worldspace2.html | live demo usage}
2084
+ */
2085
+ setSliceMM(isSliceMM: boolean): void;
2086
+ /**
2087
+ * control whether voxel overlays are combined using additive (emission) or traditional (transmission) blending.
2088
+ * @param isAdditiveBlend - emission (true) or transmission (false) mixing
2089
+ * @example niivue.isAdditiveBlend(true)
2090
+ * @see {@link https://niivue.github.io/niivue/features/additive.voxels.html | live demo usage}
2091
+ */
2092
+ setAdditiveBlend(isAdditiveBlend: boolean): void;
2093
+ /**
2094
+ * Detect if display is using radiological or neurological convention.
2095
+ * @returns radiological convention status
2096
+ * @example let rc = niivue.getRadiologicalConvention()
2097
+ */
2098
+ getRadiologicalConvention(): boolean;
2099
+ /**
2100
+ * Force WebGL canvas to use high resolution display, regardless of browser defaults.
2101
+ * @param isHighResolutionCapable - allow high-DPI display
2102
+ * @example niivue.setHighResolutionCapable(true);
2103
+ * @see {@link https://niivue.github.io/niivue/features/sync.mesh.html | live demo usage}
2104
+ */
2105
+ setHighResolutionCapable(isHighResolutionCapable: boolean): void;
2106
+ /**
2107
+ * add a new volume to the canvas
2108
+ * @param volume - the new volume to add to the canvas
2109
+ * @example
2110
+ * niivue = new Niivue()
2111
+ * niivue.addVolume(NVImage.loadFromUrl({url:'../someURL.nii.gz'}))
2112
+ * @see {@link https://niivue.github.io/niivue/features/document.3d.html | live demo usage}
2113
+ */
2114
+ addVolume(volume: NVImage): void;
2115
+ /**
2116
+ * add a new mesh to the canvas
2117
+ * @param mesh - the new mesh to add to the canvas
2118
+ * @example
2119
+ * niivue = new Niivue()
2120
+ * niivue.addMesh(NVMesh.loadFromUrl({url:'../someURL.gii'}))
2121
+ * @see {@link https://niivue.github.io/niivue/features/document.3d.html | live demo usage}
2122
+ */
2123
+ addMesh(mesh: NVMesh): void;
2124
+ /**
2125
+ * get the index of a volume by its unique id. unique ids are assigned to the NVImage.id property when a new NVImage is created.
2126
+ * @param id - the id string to search for
2127
+ * @example
2128
+ * niivue = new Niivue()
2129
+ * niivue.getVolumeIndexByID(someVolume.id)
2130
+ */
2131
+ getVolumeIndexByID(id: string): number;
2132
+ drawAddUndoBitmap(): void;
2133
+ drawClearAllUndoBitmaps(): void;
2134
+ /**
2135
+ * Restore drawing to previous state
2136
+ * @example niivue.drawUndo();
2137
+ * @see {@link https://niivue.github.io/niivue/features/draw.ui.html | live demo usage}
2138
+ */
2139
+ drawUndo(): void;
2140
+ loadDrawing(drawingBitmap: NVImage): boolean;
2141
+ binarize(volume: NVImage): void;
2142
+ /**
2143
+ * Open drawing
2144
+ * @param filename - of NIfTI format drawing
2145
+ * @param isBinarize - if true will force drawing voxels to be either 0 or 1.
2146
+ * @example niivue.loadDrawingFromUrl("../images/lesion.nii.gz");
2147
+ * @see {@link https://niivue.github.io/niivue/features/draw.ui.html | live demo usage}
2148
+ */
2149
+ loadDrawingFromUrl(fnm: string, isBinarize?: boolean): Promise<boolean>;
2150
+ findOtsu(mlevel?: number): number[];
2151
+ /**
2152
+ * remove dark voxels in air
2153
+ * @param levels - (2-4) segment brain into this many types. For example drawOtsu(2) will create a binary drawing where bright voxels are colored and dark voxels are clear.
2154
+ * @example niivue.drawOtsu(3);
2155
+ * @see {@link https://niivue.github.io/niivue/features/draw.ui.html | live demo usage}
2156
+ */
2157
+ drawOtsu(levels?: number): void;
2158
+ /**
2159
+ * remove dark voxels in air
2160
+ * @param level - (1-5) larger values for more preserved voxels
2161
+ * @param volIndex - volume to dehaze
2162
+ * @example niivue.removeHaze(3, 0);
2163
+ * @see {@link https://niivue.github.io/niivue/features/draw.ui.html | live demo usage}
2164
+ */
2165
+ removeHaze(level?: number, volIndex?: number): void;
2166
+ /**
2167
+ * save voxel-based image to disk
2168
+ * @param fnm - filename of NIfTI image to create
2169
+ * @param isSaveDrawing - determines whether drawing or background image is saved
2170
+ * @param volumeByIndex - determines layer to save (0 for background)
2171
+ * @param volumeByIndex - determines layer to save (0 for background)
2172
+ * @example niivue.saveImage({ filename: "myimage.nii.gz", isSaveDrawing: true });
2173
+ * @see {@link https://niivue.github.io/niivue/features/draw.ui.html | live demo usage}
2174
+ */
2175
+ saveImage(options?: SaveImageOptions): Uint8Array | boolean;
2176
+ getMeshIndexByID(id: string | number): number;
2177
+ /**
2178
+ * change property of mesh, tractogram or connectome
2179
+ * @param id - identity of mesh to change
2180
+ * @param key - attribute to change
2181
+ * @param value - for attribute
2182
+ * @example niivue.setMeshProperty(niivue.meshes[0].id, 'fiberLength', 42)
2183
+ * @see {@link https://niivue.github.io/niivue/features/meshes.html | live demo usage}
2184
+ */
2185
+ setMeshProperty(id: number, key: keyof NVMesh, val: number): void;
2186
+ /**
2187
+ * returns the index of the mesh vertex that is closest to the provided coordinates
2188
+ * @param id - identity of mesh to change
2189
+ * @param Xmm - location in left/right dimension
2190
+ * @param Ymm - location in posterior/anterior dimension
2191
+ * @param Zmm - location in foot/head dimension
2192
+ * @returns the an array where ret[0] is the mesh index and ret[1] is distance from vertex to coordinates
2193
+ * @example niivue.indexNearestXYZmm(niivue.meshes[0].id, -22, 42, 13)
2194
+ * @see {@link https://niivue.github.io/niivue/features/clipplanes.html | live demo usage}
2195
+ */
2196
+ indexNearestXYZmm(mesh: number, Xmm: number, Ymm: number, Zmm: number): number[];
2197
+ /**
2198
+ * reverse triangle winding of mesh (swap front and back faces)
2199
+ * @param id - identity of mesh to change
2200
+ * @example niivue.reverseFaces(niivue.meshes[0].id)
2201
+ * @see {@link https://niivue.github.io/niivue/features/meshes.html | live demo usage}
2202
+ */
2203
+ reverseFaces(mesh: number): void;
2204
+ /**
2205
+ * reverse triangle winding of mesh (swap front and back faces)
2206
+ * @param mesh - identity of mesh to change
2207
+ * @param layer - selects the mesh overlay (e.g. GIfTI or STC file)
2208
+ * @param key - attribute to change
2209
+ * @param value - for attribute
2210
+ * @example niivue.setMeshLayerProperty(niivue.meshes[0].id, 0, 'frame4D', 22)
2211
+ * @see {@link https://niivue.github.io/niivue/features/mesh.4D.html | live demo usage}
2212
+ */
2213
+ setMeshLayerProperty(mesh: number, layer: number, key: keyof NVMeshLayer, val: number): void;
2214
+ /**
2215
+ * adjust offset position and scale of 2D sliceScale
2216
+ * @param xyzmmZoom - first three components are spatial, fourth is scaling
2217
+ * @example niivue.setPan2Dxyzmm([5,-4, 2, 1.5])
2218
+ */
2219
+ setPan2Dxyzmm(xyzmmZoom: vec4): void;
2220
+ /**
2221
+ * set rotation of 3D render view
2222
+ * @example niivue.setRenderAzimuthElevation(45, 15)
2223
+ * @see {@link https://niivue.github.io/niivue/features/mask.html | live demo usage}
2224
+ */
2225
+ setRenderAzimuthElevation(a: number, e: number): void;
2226
+ /**
2227
+ * get the index of an overlay by its unique id. unique ids are assigned to the NVImage.id property when a new NVImage is created.
2228
+ * @param id - the id string to search for
2229
+ * @see NiiVue#getVolumeIndexByID
2230
+ * @example
2231
+ * niivue = new Niivue()
2232
+ * niivue.getOverlayIndexByID(someVolume.id)
2233
+ */
2234
+ getOverlayIndexByID(id: string): number;
2235
+ /**
2236
+ * set the index of a volume. This will change it's ordering and appearance if there are multiple volumes loaded.
2237
+ * @param volume - the volume to update
2238
+ * @param toIndex - the index to move the volume to. The default is the background (0 index)
2239
+ * @example
2240
+ * niivue = new Niivue()
2241
+ * niivue.setVolume(someVolume, 1) // move it to the second position in the array of loaded volumes (0 is the first position)
2242
+ */
2243
+ setVolume(volume: NVImage, toIndex?: number): void;
2244
+ setMesh(mesh: NVMesh, toIndex?: number): void;
2245
+ /**
2246
+ * Remove a volume
2247
+ * @param volume - volume to delete
2248
+ * @example
2249
+ * niivue = new Niivue()
2250
+ * niivue.removeVolume(this.volumes[3])
2251
+ * @see {@link https://niivue.github.io/niivue/features/document.3d.html | live demo usage}
2252
+ */
2253
+ removeVolume(volume: NVImage): void;
2254
+ /**
2255
+ * Remove a volume by index
2256
+ * @param index - of volume to remove
2257
+ */
2258
+ removeVolumeByIndex(index: number): void;
2259
+ /**
2260
+ * Remove a triangulated mesh, connectome or tractogram
2261
+ * @param mesh - mesh to delete
2262
+ * @example
2263
+ * niivue = new Niivue()
2264
+ * niivue.removeMesh(this.meshes[3])
2265
+ * @see {@link https://niivue.github.io/niivue/features/multiuser.meshes.html | live demo usage}
2266
+ */
2267
+ removeMesh(mesh: NVMesh): void;
2268
+ /**
2269
+ * Remove a triangulated mesh, connectome or tractogram
2270
+ * @param url - URL of mesh to delete
2271
+ * @example
2272
+ * niivue.removeMeshByUrl('../images/cit168.mz3')
2273
+ */
2274
+ removeMeshByUrl(url: string): void;
2275
+ /**
2276
+ * Move a volume to the bottom of the stack of loaded volumes. The volume will become the background
2277
+ * @param volume - the volume to move
2278
+ * @example
2279
+ * niivue = new Niivue()
2280
+ * niivue.moveVolumeToBottom(this.volumes[3]) // move the 4th volume to the 0 position. It will be the new background
2281
+ */
2282
+ moveVolumeToBottom(volume: NVImage): void;
2283
+ /**
2284
+ * Move a volume up one index position in the stack of loaded volumes. This moves it up one layer
2285
+ * @param volume - the volume to move
2286
+ * @example
2287
+ * niivue = new Niivue()
2288
+ * niivue.moveVolumeUp(this.volumes[0]) // move the background image to the second index position (it was 0 index, now will be 1)
2289
+ */
2290
+ moveVolumeUp(volume: NVImage): void;
2291
+ /**
2292
+ * Move a volume down one index position in the stack of loaded volumes. This moves it down one layer
2293
+ * @param volume - the volume to move
2294
+ * @example
2295
+ * niivue = new Niivue()
2296
+ * niivue.moveVolumeDown(this.volumes[1]) // move the second image to the background position (it was 1 index, now will be 0)
2297
+ */
2298
+ moveVolumeDown(volume: NVImage): void;
2299
+ /**
2300
+ * Move a volume to the top position in the stack of loaded volumes. This will be the top layer
2301
+ * @param volume - the volume to move
2302
+ * @example
2303
+ * niivue = new Niivue()
2304
+ * niivue.moveVolumeToTop(this.volumes[0]) // move the background image to the top layer position
2305
+ */
2306
+ moveVolumeToTop(volume: NVImage): void;
2307
+ mouseDown(x: number, y: number): void;
2308
+ mouseMove(x: number, y: number): void;
2309
+ /**
2310
+ * convert spherical AZIMUTH, ELEVATION to Cartesian
2311
+ * @param azimuth - azimuth number
2312
+ * @param elevation - elevation number
2313
+ * @returns the converted [x, y, z] coordinates
2314
+ * @example
2315
+ * niivue = new Niivue()
2316
+ * xyz = niivue.sph2cartDeg(42, 42)
2317
+ */
2318
+ sph2cartDeg(azimuth: number, elevation: number): number[];
2319
+ /**
2320
+ * update the clip plane orientation in 3D view mode
2321
+ * @param azimuthElevationDepth - a two component vector. azimuth: camera position in degrees around object, typically 0..360 (or -180..+180). elevation: camera height in degrees, range -90..90
2322
+ * @example
2323
+ * niivue = new Niivue()
2324
+ * niivue.setClipPlane([42, 42])
2325
+ * @see {@link https://niivue.github.io/niivue/features/mask.html | live demo usage}
2326
+ */
2327
+ setClipPlane(depthAzimuthElevation: number[]): void;
2328
+ /**
2329
+ * set the crosshair and colorbar outline color
2330
+ * @param color - an RGBA array. values range from 0 to 1
2331
+ * @example
2332
+ * niivue = new Niivue()
2333
+ * niivue.setCrosshairColor([0, 1, 0, 0.5]) // set crosshair to transparent green
2334
+ * @see {@link https://niivue.github.io/niivue/features/colormaps.html | live demo usage}
2335
+ */
2336
+ setCrosshairColor(color: number[]): void;
2337
+ /**
2338
+ * set thickness of crosshair
2339
+ * @example niivue.crosshairWidth(2)
2340
+ * @see {@link https://niivue.github.io/niivue/features/colormaps.html | live demo usage}
2341
+ */
2342
+ setCrosshairWidth(crosshairWidth: number): void;
2343
+ setDrawColormap(name: string): void;
2344
+ /**
2345
+ * does dragging over a 2D slice create a drawing?
2346
+ * @param trueOrFalse - enabled (true) or not (false)
2347
+ * @example niivue.setDrawingEnabled(true)
2348
+ * @see {@link https://niivue.github.io/niivue/features/draw.ui.html | live demo usage}
2349
+ */
2350
+ setDrawingEnabled(trueOrFalse: boolean): void;
2351
+ /**
2352
+ * determine color and style of drawing
2353
+ * @param penValue - sets the color of the pen
2354
+ * @param isFilledPen - determines if dragging creates flood-filled shape
2355
+ * @example niivue.setPenValue(1, true)
2356
+ * @see {@link https://niivue.github.io/niivue/features/draw.ui.html | live demo usage}
2357
+ */
2358
+ setPenValue(penValue: number, isFilledPen?: boolean): void;
2359
+ /**
2360
+ * control whether drawing is transparent (0), opaque (1) or translucent (between 0 and 1).
2361
+ * @param opacity - translucency of drawing
2362
+ * @example niivue.setDrawOpacity(0.7)
2363
+ * @see {@link https://niivue.github.io/niivue/features/draw.ui.html | live demo usage}
2364
+ */
2365
+ setDrawOpacity(opacity: number): void;
2366
+ /**
2367
+ * set the selection box color. A selection box is drawn when you right click and drag to change image contrast
2368
+ * @param color - an RGBA array. values range from 0 to 1
2369
+ * @example
2370
+ * niivue = new Niivue()
2371
+ * niivue.setSelectionBoxColor([0, 1, 0, 0.5]) // set to transparent green
2372
+ * @see {@link https://niivue.github.io/niivue/features/colormaps.html | live demo usage}
2373
+ */
2374
+ setSelectionBoxColor(color: number[]): void;
2375
+ sliceScroll2D(posChange: number, x: number, y: number, isDelta?: boolean): void;
2376
+ /**
2377
+ * set the slice type. This changes the view mode
2378
+ * @param sliceType - an enum of slice types to use
2379
+ * @example
2380
+ * niivue = new Niivue()
2381
+ * niivue.setSliceType(Niivue.sliceTypeMultiplanar)
2382
+ * @see {@link https://niivue.github.io/niivue/features/basic.multiplanar.html | live demo usage}
2383
+ */
2384
+ setSliceType(st: SLICE_TYPE): this;
2385
+ /**
2386
+ * set the opacity of a volume given by volume index
2387
+ * @param volIdx - the volume index of the volume to change
2388
+ * @param newOpacity - the opacity value. valid values range from 0 to 1. 0 will effectively remove a volume from the scene
2389
+ * @example
2390
+ * niivue = new Niivue()
2391
+ * niivue.setOpacity(0, 0.5) // make the first volume transparent
2392
+ * @see {@link https://niivue.github.io/niivue/features/atlas.html | live demo usage}
2393
+ */
2394
+ setOpacity(volIdx: number, newOpacity: number): void;
2395
+ /**
2396
+ * set the scale of the 3D rendering. Larger numbers effectively zoom.
2397
+ * @param scale - the new scale value
2398
+ * @example
2399
+ * niivue.setScale(2) // zoom some
2400
+ * @see {@link https://niivue.github.io/niivue/features/shiny.volumes.html | live demo usage}
2401
+ */
2402
+ setScale(scale: number): void;
2403
+ /**
2404
+ * set the color of the 3D clip plane
2405
+ * @param color - the new color. expects an array of RGBA values. values can range from 0 to 1
2406
+ * @example
2407
+ * niivue.setClipPlaneColor([1, 1, 1, 0.5]) // white, transparent
2408
+ * @see {@link https://niivue.github.io/niivue/features/clipplanes.html | live demo usage}
2409
+ */
2410
+ setClipPlaneColor(color: number[]): void;
2411
+ /**
2412
+ * set proportion of volume rendering influenced by selected matcap.
2413
+ * @param gradientAmount - amount of matcap (0..1), default 0 (matte, surface normal does not influence color)
2414
+ * @example
2415
+ * niivue.setVolumeRenderIllumination(0.6);
2416
+ * @see {@link https://niivue.github.io/niivue/features/shiny.volumes.html | live demo usage}
2417
+ */
2418
+ setVolumeRenderIllumination(gradientAmount?: number): Promise<void>;
2419
+ overlayRGBA(volume: NVImage): Uint8ClampedArray;
2420
+ vox2mm(XYZ: number[], mtx: mat4): vec3;
2421
+ /**
2422
+ * clone a volume and return a new volume
2423
+ * @param index - the index of the volume to clone
2424
+ * @returns new volume to work with, but that volume is not added to the canvas
2425
+ * @example
2426
+ * niivue = new Niivue()
2427
+ * niivue.cloneVolume(0)
2428
+ */
2429
+ cloneVolume(index: number): NVImage;
2430
+ /**
2431
+ *
2432
+ * @param url - URL of NVDocument
2433
+ */
2434
+ loadDocumentFromUrl(url: string): Promise<void>;
2435
+ /**
2436
+ * Loads an NVDocument
2437
+ * @returns Niivue instance
2438
+ * @see {@link https://niivue.github.io/niivue/features/document.load.html | live demo usage}
2439
+ */
2440
+ loadDocument(document: NVDocument): this;
2441
+ /**
2442
+ * generates JavaScript to load the current scene as a document
2443
+ * @param canvasId - id of canvas NiiVue will be attached to
2444
+ * @param esm - bundled version of NiiVue
2445
+ * @example
2446
+ * const javascript = this.generateLoadDocumentJavaScript("gl1");
2447
+ * const html = `<html><body><canvas id="gl1"></canvas><script type="module" async>
2448
+ ${javascript}</script></body></html>`;
2449
+ */
2450
+ generateLoadDocumentJavaScript(canvasId: string, esm: string): string;
2451
+ /**
2452
+ * generates HTML of current scene
2453
+ * @param canvasId - id of canvas NiiVue will be attached to
2454
+ * @param esm - bundled version of NiiVue
2455
+ * @returns HTML with javascript of the current scene
2456
+ * @example
2457
+ * const template = `<html><body><canvas id="gl1"></canvas><script type="module" async>
2458
+ * %%javascript%%</script></body></html>`;
2459
+ * nv1.generateHTML("page.html", esm);
2460
+ */
2461
+ generateHTML(canvasId: string | undefined, esm: string): string;
2462
+ /**
2463
+ * save current scene as HTML
2464
+ * @param fileName - the name of the HTML file
2465
+ * @param canvasId - id of canvas NiiVue will be attached to
2466
+ * @param esm - bundled version of NiiVue
2467
+ */
2468
+ saveHTML(fileName: string | undefined, canvasId: string | undefined, esm: string): void;
2469
+ /**
2470
+ * Converts NiiVue scene to JSON
2471
+ */
2472
+ json(): ExportDocumentData;
2473
+ /**
2474
+ * save the entire scene (objects and settings) as a document
2475
+ * @param fileName - the name of the document storing the scene
2476
+ * @example
2477
+ * niivue.saveDocument("niivue.basic.nvd")
2478
+ * @see {@link https://niivue.github.io/niivue/features/document.3d.html | live demo usage}
2479
+ */
2480
+ saveDocument(fileName?: string): Promise<void>;
2481
+ /**
2482
+ * load an array of volume objects
2483
+ * @param volumeList - the array of objects to load. each object must have a resolvable "url" property at a minimum
2484
+ * @returns returns the Niivue instance
2485
+ * @example
2486
+ * niivue = new Niivue()
2487
+ * niivue.loadVolumes([{url: 'someImage.nii.gz}, {url: 'anotherImage.nii.gz'}])
2488
+ * @see {@link https://niivue.github.io/niivue/features/mask.html | live demo usage}
2489
+ */
2490
+ loadVolumes(volumeList: ImageFromUrlOptions[]): Promise<this>;
2491
+ /**
2492
+ * Add mesh and notify subscribers
2493
+ * @see {@link https://niivue.github.io/niivue/features/multiuser.meshes.html | live demo usage}
2494
+ */
2495
+ addMeshFromUrl(meshOptions: LoadFromUrlParams): Promise<NVMesh>;
2496
+ /**
2497
+ * load an array of meshes
2498
+ * @param meshList - the array of objects to load. each object must have a resolvable "url" property at a minimum
2499
+ * @returns Niivue instance
2500
+ * @example
2501
+ * niivue = new Niivue()
2502
+ * niivue.loadMeshes([{url: 'someMesh.gii'}])
2503
+ * @see {@link https://niivue.github.io/niivue/features/meshes.html | live demo usage}
2504
+ */
2505
+ loadMeshes(meshList: LoadFromUrlParams[]): Promise<this>;
2506
+ /**
2507
+ * load a connectome specified by url
2508
+ * @returns Niivue instance
2509
+ * @see {@link https://niivue.github.io/niivue/features/connectome.html | live demo usage}
2510
+ */
2511
+ loadConnectomeFromUrl(url: string, headers?: {}): Promise<this>;
2512
+ /**
2513
+ * load a connectome specified by url
2514
+ * @returns Niivue instance
2515
+ * @see {@link https://niivue.github.io/niivue/features/connectome.html | live demo usage}
2516
+ */
2517
+ loadFreeSurferConnectomeFromUrl(url: string, headers?: {}): Promise<this>;
2518
+ /**
2519
+ * load a connectome specified by json
2520
+ * @param connectome - freesurfer model
2521
+ * @returns Niivue instance
2522
+ * @see {@link https://niivue.github.io/niivue/features/connectome.html | live demo usage}
2523
+ */
2524
+ loadFreeSurferConnectome(json: FreeSurferConnectome): Promise<this>;
2525
+ handleNodeAdded(event: {
2526
+ detail: {
2527
+ node: NVConnectomeNode;
2528
+ };
2529
+ }): void;
2530
+ loadConnectomeAsMesh(json: Connectome | LegacyConnectome | FreeSurferConnectome): NVMesh;
2531
+ /**
2532
+ * load a connectome specified by json
2533
+ * @param connectome - model
2534
+ * @returns Niivue instance
2535
+ * @see {@link https://niivue.github.io/niivue/features/connectome.html | live demo usage}
2536
+ */
2537
+ loadConnectome(json: Connectome | LegacyConnectome): this;
2538
+ /**
2539
+ * generate a blank canvas for the pen tool
2540
+ * @example niivue.createEmptyDrawing()
2541
+ * @see {@link https://niivue.github.io/niivue/features/cactus.html | live demo usage}
2542
+ */
2543
+ createEmptyDrawing(): void;
2544
+ r16Tex(texID: WebGLTexture | null, activeID: number, dims: number[], img16: Int16Array): WebGLTexture;
2545
+ /**
2546
+ * dilate drawing so all voxels are colored.
2547
+ * works on drawing with multiple colors
2548
+ * @example niivue.drawGrowCut();
2549
+ * @see {@link https://niivue.github.io/niivue/features/draw2.html | live demo usage}
2550
+ */
2551
+ drawGrowCut(): void;
2552
+ drawPt(x: number, y: number, z: number, penValue: number): void;
2553
+ drawPenLine(ptA: number[], ptB: number[], penValue: number): void;
2554
+ drawFloodFillCore(img: Uint8Array, seedVx: number, neighbors?: number): void;
2555
+ drawFloodFill(seedXYZ: number[], newColor?: number, growSelectedCluster?: number, // if non-zero, growth based on background intensity POSITIVE_INFINITY for selected or bright, NEGATIVE_INFINITY for selected or darker
2556
+ forceMin?: number, forceMax?: number, neighbors?: number): void;
2557
+ drawPenFilled(): void;
2558
+ /**
2559
+ * close drawing: make sure you have saved any changes before calling this!
2560
+ * @example niivue.closeDrawing();
2561
+ * @see {@link https://niivue.github.io/niivue/features/draw.ui.html | live demo usage}
2562
+ */
2563
+ closeDrawing(): void;
2564
+ /**
2565
+ * copy drawing bitmap from CPU to GPU storage and redraw the screen
2566
+ * @param isForceRedraw - refreshes scene immediately (default true)
2567
+ * @example niivue.refreshDrawing();
2568
+ * @see {@link https://niivue.github.io/niivue/features/cactus.html | live demo usage}
2569
+ */
2570
+ refreshDrawing(isForceRedraw?: boolean): void;
2571
+ r8Tex(texID: WebGLTexture | null, activeID: number, dims: number[], isInit?: boolean): WebGLTexture | null;
2572
+ rgbaTex(texID: WebGLTexture | null, activeID: number, dims: number[], isInit?: boolean): WebGLTexture | null;
2573
+ requestCORSIfNotSameOrigin(img: HTMLImageElement, url: string): void;
2574
+ loadPngAsTexture(pngUrl: string, textureNum: number): Promise<WebGLTexture | null>;
2575
+ loadFontTexture(fontUrl: string): Promise<WebGLTexture | null>;
2576
+ loadBmpTexture(bmpUrl: string): Promise<WebGLTexture | null>;
2577
+ /**
2578
+ * Load matcap for illumination model.
2579
+ * @param name - name of matcap to load ("Shiny", "Cortex", "Cream")
2580
+ * @example
2581
+ * niivue.loadMatCapTexture("Cortex");
2582
+ * @see {@link https://niivue.github.io/niivue/features/shiny.volumes.html | live demo usage}
2583
+ */
2584
+ loadMatCapTexture(bmpUrl: string): Promise<WebGLTexture | null>;
2585
+ initFontMets(): void;
2586
+ /**
2587
+ * Load typeface for colorbars, measurements and orientation text.
2588
+ * @param name - name of matcap to load ("Roboto", "Garamond", "Ubuntu")
2589
+ * @example
2590
+ * niivue.loadMatCapTexture("Cortex");
2591
+ * @see {@link https://niivue.github.io/niivue/features/selectfont.html | live demo usage}
2592
+ */
2593
+ loadFont(fontSheetUrl?: any, metricsUrl?: {
2594
+ atlas: {
2595
+ type: string;
2596
+ distanceRange: number;
2597
+ size: number;
2598
+ width: number;
2599
+ height: number;
2600
+ yOrigin: string;
2601
+ };
2602
+ metrics: {
2603
+ emSize: number;
2604
+ lineHeight: number;
2605
+ ascender: number;
2606
+ descender: number;
2607
+ underlineY: number;
2608
+ underlineThickness: number;
2609
+ };
2610
+ glyphs: ({
2611
+ unicode: number;
2612
+ advance: number;
2613
+ planeBounds?: undefined;
2614
+ atlasBounds?: undefined;
2615
+ } | {
2616
+ unicode: number;
2617
+ advance: number;
2618
+ planeBounds: {
2619
+ left: number;
2620
+ bottom: number;
2621
+ right: number;
2622
+ top: number;
2623
+ };
2624
+ atlasBounds: {
2625
+ left: number;
2626
+ bottom: number;
2627
+ right: number;
2628
+ top: number;
2629
+ };
2630
+ })[];
2631
+ kerning: never[];
2632
+ }): Promise<void>;
2633
+ loadDefaultMatCap(): Promise<WebGLTexture | null>;
2634
+ loadDefaultFont(): Promise<void>;
2635
+ initText(): Promise<void>;
2636
+ meshShaderNameToNumber(meshShaderName?: string): number | undefined;
2637
+ /**
2638
+ * select new shader for triangulated meshes and connectomes. Note that this function requires the mesh is fully loaded: you may want use `await` with loadMeshes (as seen in live demo).
2639
+ * @param id - id of mesh to change
2640
+ * @param meshShaderNameOrNumber - identify shader for usage
2641
+ * @example niivue.setMeshShader('toon');
2642
+ * @see {@link https://niivue.github.io/niivue/features/meshes.html | live demo usage}
2643
+ */
2644
+ setMeshShader(id: number, meshShaderNameOrNumber?: number): void;
2645
+ /**
2646
+ *
2647
+ * @param fragmentShaderText - custom fragment shader.
2648
+ * @param name - title for new shader.
2649
+ * @returns created custom mesh shader
2650
+ */
2651
+ createCustomMeshShader(fragmentShaderText: string, name?: string): {
2652
+ Name: string;
2653
+ Frag: string;
2654
+ shader: Shader;
2655
+ };
2656
+ /**
2657
+ * Define a new GLSL shader program to influence mesh coloration
2658
+ * @param fragmentShaderText - custom fragment shader.
2659
+ * @param ame - title for new shader.
2660
+ * @returns index of the new shader (for setMeshShader)
2661
+ * @see {@link https://niivue.github.io/niivue/features/mesh.atlas.html | live demo usage}
2662
+ */
2663
+ setCustomMeshShader(fragmentShaderText?: string, name?: string): number;
2664
+ /**
2665
+ * retrieve all currently loaded meshes
2666
+ * @param sort - sort output alphabetically
2667
+ * @returns list of available mesh shader names
2668
+ * @example niivue.meshShaderNames();
2669
+ * @see {@link https://niivue.github.io/niivue/features/meshes.html | live demo usage}
2670
+ */
2671
+ meshShaderNames(sort?: boolean): string[];
2672
+ initRenderShader(shader: Shader, gradientAmount?: number): void;
2673
+ init(): Promise<this>;
2674
+ gradientGL(hdr: NiftiHeader): void;
2675
+ /**
2676
+ * update the webGL 2.0 scene after making changes to the array of volumes. It's always good to call this method after altering one or more volumes manually (outside of Niivue setter methods)
2677
+ * @example
2678
+ * niivue = new Niivue()
2679
+ * niivue.updateGLVolume()
2680
+ * @see {@link https://niivue.github.io/niivue/features/colormaps.html | live demo usage}
2681
+ */
2682
+ updateGLVolume(): void;
2683
+ /**
2684
+ * basic statistics for selected voxel-based image
2685
+ * @param layer - selects image to describe
2686
+ * @param masks - are optional binary images to filter voxles
2687
+ * @returns numeric values to describe image
2688
+ * @example niivue.getDescriptives(0);
2689
+ * @see {@link https://niivue.github.io/niivue/features/draw2.html | live demo usage}
2690
+ */
2691
+ getDescriptives(layer?: number, masks?: never[], drawingIsMask?: boolean): Descriptive;
2692
+ refreshLayers(overlayItem: NVImage, layer: number): void;
2693
+ /**
2694
+ * query all available color maps that can be applied to volumes
2695
+ * @param sort - whether or not to sort the returned array
2696
+ * @returns an array of colormap strings
2697
+ * @example
2698
+ * niivue = new Niivue()
2699
+ * colormaps = niivue.colormaps()
2700
+ * @see {@link https://niivue.github.io/niivue/features/colormaps.html | live demo usage}
2701
+ */
2702
+ colormaps(): string[];
2703
+ /**
2704
+ * create a new colormap
2705
+ * @param key - name of new colormap
2706
+ * @param colormap - properties (Red, Green, Blue, Alpha and Indices)
2707
+ * @see {@link https://niivue.github.io/niivue/features/colormaps.html | live demo usage}
2708
+ */
2709
+ addColormap(key: string, cmap: ColorMap): void;
2710
+ /**
2711
+ * update the colormap of an image given its ID
2712
+ * @param id - the ID of the NVImage
2713
+ * @param colormap - the name of the colormap to use
2714
+ * @example
2715
+ * niivue.setColormap(niivue.volumes[0].id,, 'red')
2716
+ * @see {@link https://niivue.github.io/niivue/features/colormaps.html | live demo usage}
2717
+ */
2718
+ setColormap(id: string, colormap: string): void;
2719
+ idx(A: number, B: number, C: number, DIM: Uint32Array): number;
2720
+ check_previous_slice(bw: Uint32Array, il: Uint32Array, r: number, c: number, sl: number, dim: Uint32Array, conn: number, tt: Uint32Array): number;
2721
+ do_initial_labelling(bw: Uint32Array, dim: Uint32Array, conn: number): [number, Uint32Array, Uint32Array];
2722
+ fill_tratab(tt: Uint32Array, nabo: Uint32Array, nr_set: number): void;
2723
+ translate_labels(il: Uint32Array, dim: Uint32Array, tt: Uint32Array, ttn: number): [number, Uint32Array];
2724
+ largest_original_cluster_labels(bw: Uint32Array, cl: number, ls: Uint32Array): [number, Uint32Array];
2725
+ bwlabel(img: Uint32Array, dim: Uint32Array, conn?: number, binarize?: boolean, onlyLargestClusterPerClass?: boolean): [number, Uint32Array];
2726
+ createConnectedLabelImage(id: string, conn?: number, binarize?: boolean, onlyLargestClusterPerClass?: boolean): Promise<NVImage>;
2727
+ scalecropUint8(img32: Float32Array, dst_min: number | undefined, dst_max: number | undefined, src_min: number, scale: number): Promise<Uint8Array>;
2728
+ scalecropFloat32(img32: Float32Array, dst_min: number | undefined, dst_max: number | undefined, src_min: number, scale: number): Promise<Float32Array>;
2729
+ getScale(volume: NVImage, dst_min?: number, dst_max?: number, f_low?: number, f_high?: number): [number, number];
2730
+ conformVox2Vox(inDims: number[], inAffine: number[], outDim?: number, outMM?: number, toRAS?: boolean): [mat4, mat4, mat4];
2731
+ createNiftiArray(dims?: number[], pixDims?: number[], affine?: number[], datatypeCode?: NiiDataType, img?: Uint8Array): Promise<Uint8Array>;
2732
+ niftiArray2NVImage(bytes?: Uint8Array): Promise<NVImage>;
2733
+ loadFromUrl(fnm: string): Promise<NVImage>;
2734
+ /**
2735
+ * FreeSurfer-style conform reslices any image to a 256x256x256 volume with 1mm voxels
2736
+ * @param volume - input volume to be re-oriented, intensity-scaled and resliced
2737
+ * @param toRAS - reslice to row, column slices to right-anterior-superior not left-inferior-anterior (default false).
2738
+ * @param isLinear - reslice with linear rather than nearest-neighbor interpolation (default true).
2739
+ * @param asFloat32 - use Float32 datatype rather than Uint8 (default false).
2740
+ * @param isRobustMinMax - clamp intensity with robust min max (~2%..98%) instead of FreeSurfer (0%..99.99%) (default false).
2741
+ * @see {@link https://niivue.github.io/niivue/features/torso.html | live demo usage}
2742
+ */
2743
+ conform(volume: NVImage, toRAS?: boolean, isLinear?: boolean, asFloat32?: boolean, isRobustMinMax?: boolean): Promise<NVImage>;
2744
+ /**
2745
+ * darken crevices and brighten corners when 3D rendering drawings.
2746
+ * @param amount - amount of ambient occlusion (default 0.4)
2747
+ * @see {@link https://niivue.github.io/niivue/features/torso.html | live demo usage}
2748
+ */
2749
+ setRenderDrawAmbientOcclusion(ao: number): void;
2750
+ setColorMap(id: string, colormap: string): void;
2751
+ /**
2752
+ * use given color map for negative voxels in image
2753
+ * @param id - the ID of the NVImage
2754
+ * @param colormapNegative - the name of the colormap to use
2755
+ * @example
2756
+ * niivue = new Niivue()
2757
+ * niivue.setColormapNegative(niivue.volumes[1].id,"winter");
2758
+ * @see {@link https://niivue.github.io/niivue/features/mosaics2.html | live demo usage}
2759
+ */
2760
+ setColormapNegative(id: string, colormapNegative: string): void;
2761
+ /**
2762
+ * modulate intensity of one image based on intensity of another
2763
+ * @param idTarget - the ID of the NVImage to be biased
2764
+ * @param idModulation - the ID of the NVImage that controls bias (empty string to disable modulation)
2765
+ * @param modulateAlpha - does the modulation influence alpha transparency (values greater than 1).
2766
+ * @example niivue.setModulationImage(niivue.volumes[0].id, niivue.volumes[1].id);
2767
+ * @see {@link https://niivue.github.io/niivue/features/modulate.html | live demo scalar usage}
2768
+ * @see {@link https://niivue.github.io/niivue/features/modulateAfni.html | live demo usage}
2769
+ */
2770
+ setModulationImage(idTarget: string, idModulation: string, modulateAlpha?: number): void;
2771
+ /**
2772
+ * adjust screen gamma. Low values emphasize shadows but can appear flat, high gamma hides shadow details.
2773
+ * @param gamma - selects luminance, default is 1
2774
+ * @example niivue.setGamma(1.0);
2775
+ * @see {@link https://niivue.github.io/niivue/features/colormaps.html | live demo usage}
2776
+ */
2777
+ setGamma(gamma?: number): void;
2778
+ /** Load all volumes for image opened with `limitFrames4D`, the user can also click the `...` on a 4D timeline to load deferred volumes
2779
+ * @param id - the ID of the 4D NVImage
2780
+ **/
2781
+ loadDeferred4DVolumes(id: string): Promise<void>;
2782
+ /**
2783
+ * show desired 3D volume from 4D time series
2784
+ * @param id - the ID of the 4D NVImage
2785
+ * @param frame4D - frame to display (indexed from zero)
2786
+ * @example nv1.setFrame4D(nv1.volumes[0].id, 42);
2787
+ * @see {@link https://niivue.github.io/niivue/features/timeseries.html | live demo usage}
2788
+ */
2789
+ setFrame4D(id: string, frame4D: number): void;
2790
+ /**
2791
+ * determine active 3D volume from 4D time series
2792
+ * @param id - the ID of the 4D NVImage
2793
+ * @returns currently selected volume (indexed from 0)
2794
+ * @example nv1.getFrame4D(nv1.volumes[0].id);
2795
+ * @see {@link https://niivue.github.io/niivue/features/timeseries.html | live demo usage}
2796
+ */
2797
+ getFrame4D(id: string): number;
2798
+ colormapFromKey(name: string): ColorMap;
2799
+ colormap(lutName?: string, isInvert?: boolean): Uint8ClampedArray;
2800
+ createColormapTexture(texture?: WebGLTexture | null, nRow?: number, nCol?: number): WebGLTexture | null;
2801
+ addColormapList(nm?: string, mn?: number, mx?: number, alpha?: boolean, neg?: boolean, vis?: boolean, inv?: boolean): void;
2802
+ refreshColormaps(): this | undefined;
2803
+ sliceScale(forceVox?: boolean): SliceScale;
2804
+ tileIndex(x: number, y: number): number;
2805
+ inRenderTile(x: number, y: number): number;
2806
+ sliceScroll3D(posChange?: number): void;
2807
+ deleteThumbnail(): void;
2808
+ inGraphTile(x: number, y: number): boolean;
2809
+ mouseClick(x: number, y: number, posChange?: number, isDelta?: boolean): void;
2810
+ drawRuler(): void;
2811
+ drawRuler10cm(startXYendXY: number[]): void;
2812
+ screenXY2mm(x: number, y: number, forceSlice?: number): vec4;
2813
+ dragForPanZoom(startXYendXY: number[]): void;
2814
+ dragForCenterButton(startXYendXY: number[]): void;
2815
+ dragForSlicer3D(startXYendXY: number[]): void;
2816
+ drawMeasurementTool(startXYendXY: number[]): void;
2817
+ drawRect(leftTopWidthHeight: number[], lineColor?: number[]): void;
2818
+ drawCircle(leftTopWidthHeight: number[], circleColor?: Float32List, fillPercent?: number): void;
2819
+ drawSelectionBox(leftTopWidthHeight: number[]): void;
2820
+ effectiveCanvasHeight(): number;
2821
+ effectiveCanvasWidth(): number;
2822
+ getAllLabels(): NVLabel3D[];
2823
+ getBulletMarginWidth(): number;
2824
+ getLegendPanelWidth(): number;
2825
+ getLegendPanelHeight(): number;
2826
+ reserveColorbarPanel(): number[];
2827
+ drawColorbarCore(layer: number | undefined, leftTopWidthHeight: number[] | undefined, isNegativeColor: boolean | undefined, min: number | undefined, max: number | undefined, isAlphaThreshold: boolean): void;
2828
+ drawColorbar(): void;
2829
+ textWidth(scale: number, str: string): number;
2830
+ textHeight(scale: number, str: string): number;
2831
+ drawChar(xy: number[], scale: number, char: number): number;
2832
+ drawLoadingText(text: string): void;
2833
+ drawText(xy: number[], str: string, scale?: number, color?: Float32List | null): void;
2834
+ drawTextRight(xy: number[], str: string, scale?: number, color?: number[] | null): void;
2835
+ drawTextLeft(xy: number[], str: string, scale?: number, color?: number[] | null): void;
2836
+ drawTextRightBelow(xy: number[], str: string, scale?: number, color?: number[] | null): void;
2837
+ drawTextBetween(startXYendXY: number[], str: string, scale?: number, color?: number[] | null): void;
2838
+ drawTextBelow(xy: number[], str: string, scale?: number, color?: number[] | null): void;
2839
+ updateInterpolation(layer: number, isForceLinear?: boolean): void;
2840
+ setAtlasOutline(isOutline: number): void;
2841
+ /**
2842
+ * select between nearest and linear interpolation for voxel based images
2843
+ * @param isNearest - whether nearest neighbor interpolation is used, else linear interpolation
2844
+ * @example niivue.setInterpolation(true);
2845
+ * @see {@link https://niivue.github.io/niivue/features/draw2.html | live demo usage}
2846
+ */
2847
+ setInterpolation(isNearest: boolean): void;
2848
+ calculateMvpMatrix2D(leftTopWidthHeight: number[], mn: vec3, mx: vec3, clipTolerance: number | undefined, clipDepth: number | undefined, azimuth: number | undefined, elevation: number | undefined, isRadiolgical: boolean): MvpMatrix2D;
2849
+ swizzleVec3MM(v3: vec3, axCorSag: SLICE_TYPE): vec3;
2850
+ screenFieldOfViewVox(axCorSag?: number): vec3;
2851
+ screenFieldOfViewMM(axCorSag?: number, forceSliceMM?: boolean): vec3;
2852
+ screenFieldOfViewExtendedVox(axCorSag?: number): MM;
2853
+ screenFieldOfViewExtendedMM(axCorSag?: number): MM;
2854
+ drawSliceOrientationText(leftTopWidthHeight: number[], axCorSag: SLICE_TYPE): void;
2855
+ xyMM2xyzMM(axCorSag: SLICE_TYPE, sliceFrac: number): number[];
2856
+ draw2D(leftTopWidthHeight: number[], axCorSag: SLICE_TYPE, customMM?: number): void;
2857
+ calculateMvpMatrix(_unused: unknown, leftTopWidthHeight: number[] | undefined, azimuth: number, elevation: number): mat4[];
2858
+ calculateModelMatrix(azimuth: number, elevation: number): mat4;
2859
+ calculateRayDirection(azimuth: number, elevation: number): vec3;
2860
+ sceneExtentsMinMax(isSliceMM?: boolean): vec3[];
2861
+ setPivot3D(): void;
2862
+ getMaxVols(): number;
2863
+ detectPartialllyLoaded4D(): boolean;
2864
+ drawGraph(): void;
2865
+ depthPicker(leftTopWidthHeight: number[], mvpMatrix: mat4): void;
2866
+ drawImage3D(mvpMatrix: mat4, azimuth: number, elevation: number): void;
2867
+ drawOrientationCube(leftTopWidthHeight: number[], azimuth?: number, elevation?: number): void;
2868
+ createOnLocationChange(axCorSag?: number): void;
2869
+ /**
2870
+ * Add a 3D Label
2871
+ * @param text - text of the label
2872
+ * @param style - label style
2873
+ * @param point - 3D point on the model
2874
+ */
2875
+ addLabel(text: string, style: NVLabel3DStyle, points?: number[] | number[][]): NVLabel3D;
2876
+ calculateScreenPoint(point: [number, number, number], mvpMatrix: mat4, leftTopWidthHeight: number[]): vec4;
2877
+ getLabelAtPoint(screenPoint: [number, number]): NVLabel3D | null;
2878
+ drawLabelLine(label: NVLabel3D, pos: vec2, mvpMatrix: mat4, leftTopWidthHeight: number[], secondPass?: boolean): void;
2879
+ draw3DLabel(label: NVLabel3D, pos: vec2, mvpMatrix: mat4, leftTopWidthHeight: number[], bulletMargin: number | undefined, legendWidth: number, secondPass?: boolean): void;
2880
+ draw3DLabels(mvpMatrix: mat4, leftTopWidthHeight: number[], secondPass?: boolean): void;
2881
+ draw3D(leftTopWidthHeight?: number[], mvpMatrix?: mat4 | null, modelMatrix?: mat4 | null, normalMatrix?: mat4 | null, azimuth?: number | null, elevation?: number): string | undefined;
2882
+ drawMesh3D(isDepthTest?: boolean, alpha?: number, m?: mat4, modelMtx?: mat4, normMtx?: mat4): void;
2883
+ drawCrosshairs3D(isDepthTest?: boolean, alpha?: number, mvpMtx?: mat4 | null, is2DView?: boolean, isSliceMM?: boolean): void;
2884
+ mm2frac(mm: vec3 | vec4, volIdx?: number, isForceSliceMM?: boolean): vec3;
2885
+ vox2frac(vox: vec3, volIdx?: number): vec3;
2886
+ frac2vox(frac: vec3, volIdx?: number): vec3;
2887
+ /**
2888
+ * move crosshair a fixed number of voxels (not mm)
2889
+ * @param x - translate left (-) or right (+)
2890
+ * @param y - translate posterior (-) or +anterior (+)
2891
+ * @param z - translate inferior (-) or superior (+)
2892
+ * @example niivue.moveCrosshairInVox(1, 0, 0)
2893
+ * @see {@link https://niivue.github.io/niivue/features/draw2.html | live demo usage}
2894
+ */
2895
+ moveCrosshairInVox(x: number, y: number, z: number): void;
2896
+ frac2mm(frac: vec3, volIdx?: number, isForceSliceMM?: boolean): vec4;
2897
+ screenXY2TextureFrac(x: number, y: number, i: number, restrict0to1?: boolean): vec3;
2898
+ canvasPos2frac(canvasPos: number[]): vec3;
2899
+ scaleSlice(w: number, h: number, widthPadPixels?: number, heightPadPixels?: number): number[];
2900
+ drawThumbnail(): void;
2901
+ drawLine(startXYendXY: number[], thickness?: number, lineColor?: number[]): void;
2902
+ draw3DLine(startXY: vec2, endXYZ: vec3, thickness?: number, lineColor?: number[]): void;
2903
+ drawDottedLine(startXYendXY: number[], thickness?: number, lineColor?: number[]): void;
2904
+ drawGraphLine(LTRB: number[], color?: number[], thickness?: number): void;
2905
+ drawCrossLinesMM(sliceIndex: number, axCorSag: SLICE_TYPE, axiMM: number[], corMM: number[], sagMM: number[]): void;
2906
+ drawCrossLines(sliceIndex: number, axCorSag: SLICE_TYPE, axiMM: number[], corMM: number[], sagMM: number[]): void;
2907
+ /**
2908
+ * display a lightbox or montage view
2909
+ * @param mosaicStr - specifies orientation (A,C,S) and location of slices.
2910
+ * @example niivue.setSliceMosaicString("A -10 0 20");
2911
+ * @see {@link https://niivue.github.io/niivue/features/mosaics.html | live demo usage}
2912
+ */
2913
+ drawMosaic(mosaicStr: string): void;
2914
+ drawSceneCore(): string | void;
2915
+ drawScene(): string | void;
2916
+ get gl(): WebGL2RenderingContext;
2917
+ set gl(gl: WebGL2RenderingContext | null);
2918
+ }
2919
+
2920
+ export { type Connectome, type ConnectomeOptions, DEFAULT_OPTIONS, DRAG_MODE, type DocumentData, type DragReleaseParams, type ExportDocumentData, INITIAL_SCENE_DATA, LabelLineTerminator, LabelTextAlignment, type LegacyConnectome, type LegacyNodes, MULTIPLANAR_TYPE, type NVConfigOptions, type NVConnectomeEdge, type NVConnectomeNode, NVController, NVDocument, NVImage, NVImageFromUrlOptions, NVLabel3D, NVLabel3DStyle, NVMesh, NVMeshFromUrlOptions, NVMeshLayerDefaults, NVMeshLoaders, NVUtilities, type NiftiHeader, Niivue, type Point, SLICE_TYPE, type Scene, type Volume, cmapper, ColorTables as colortables };