@fideus-labs/fiff 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1,95 @@
1
+ /**
2
+ * TiffStore: a zarrita.js-compatible AsyncReadable store that presents
3
+ * TIFF files as OME-Zarr v0.5 datasets.
4
+ *
5
+ * Usage:
6
+ * const store = await TiffStore.fromUrl("https://example.com/image.ome.tif");
7
+ * const group = await zarr.open(store, { kind: "group" });
8
+ * // ... use zarrita.js as normal
9
+ */
10
+ import type GeoTIFF from "geotiff";
11
+ import { type ZarrDataType } from "./dtypes.js";
12
+ import { type OmeImage } from "./ome-xml.js";
13
+ import { type PyramidInfo } from "./ifd-indexer.js";
14
+ /** Options for opening a TiffStore. */
15
+ export interface TiffStoreOptions {
16
+ /** Pre-computed IFD byte offsets for fast random access. */
17
+ offsets?: number[];
18
+ /** Additional HTTP headers for remote TIFF requests. */
19
+ headers?: Record<string, string>;
20
+ }
21
+ /**
22
+ * A zarrita.js AsyncReadable store backed by a TIFF file.
23
+ *
24
+ * Implements the zarrita `AsyncReadable` interface:
25
+ * get(key: string): Promise<Uint8Array | undefined>
26
+ *
27
+ * Keys are routed as follows:
28
+ * - "zarr.json" -> root group metadata (OME-Zarr 0.5)
29
+ * - "{level}/zarr.json" -> array metadata for resolution level
30
+ * - "{level}/c/{indices}" -> chunk data (delegates to geotiff.js)
31
+ */
32
+ export declare class TiffStore {
33
+ private tiff;
34
+ private omeImages;
35
+ private pixels;
36
+ private pyramid;
37
+ private dtype;
38
+ private dimNames;
39
+ private chunkShapes;
40
+ private shapes;
41
+ private multiscale;
42
+ private omero;
43
+ private indexer;
44
+ private offsets?;
45
+ private rootJsonBytes;
46
+ private arrayJsonCache;
47
+ private constructor();
48
+ /**
49
+ * Open a TiffStore from a remote URL.
50
+ * The TIFF will be accessed via HTTP range requests.
51
+ */
52
+ static fromUrl(url: string, options?: TiffStoreOptions): Promise<TiffStore>;
53
+ /**
54
+ * Open a TiffStore from an in-memory ArrayBuffer.
55
+ */
56
+ static fromArrayBuffer(buffer: ArrayBuffer, options?: TiffStoreOptions): Promise<TiffStore>;
57
+ /**
58
+ * Open a TiffStore from a Blob or File.
59
+ */
60
+ static fromBlob(blob: Blob, options?: TiffStoreOptions): Promise<TiffStore>;
61
+ /**
62
+ * Open a TiffStore from an already-opened GeoTIFF instance.
63
+ */
64
+ static fromGeoTIFF(tiff: GeoTIFF, options?: TiffStoreOptions): Promise<TiffStore>;
65
+ /**
66
+ * Get a value from the store by key.
67
+ *
68
+ * This is the core zarrita.js AsyncReadable interface method.
69
+ */
70
+ get(key: string): Promise<Uint8Array | undefined>;
71
+ /** The number of resolution levels. */
72
+ get levels(): number;
73
+ /** The Zarr data type string. */
74
+ get dataType(): ZarrDataType;
75
+ /** The OME-XML images (if parsed). */
76
+ get ome(): OmeImage[];
77
+ /** The pyramid information. */
78
+ get pyramidInfo(): PyramidInfo;
79
+ /** Get the shape for a given level. */
80
+ getShape(level: number): number[];
81
+ /** Get the chunk shape for a given level. */
82
+ getChunkShape(level: number): number[];
83
+ /** The dimension names. */
84
+ get dimensionNames(): string[];
85
+ private getRootGroupJson;
86
+ private getArrayJson;
87
+ private getChunkData;
88
+ /**
89
+ * Map chunk indices to a plane selection.
90
+ * Non-spatial dimensions (t, c, z) map directly from chunk indices;
91
+ * spatial dimensions (y, x) are handled separately.
92
+ */
93
+ private indicesToSelection;
94
+ }
95
+ //# sourceMappingURL=tiff-store.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tiff-store.d.ts","sourceRoot":"","sources":["../src/tiff-store.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAGH,OAAO,KAAK,OAAO,MAAM,SAAS,CAAC;AAEnC,OAAO,EAAuC,KAAK,YAAY,EAAE,MAAM,aAAa,CAAC;AACrF,OAAO,EAGL,KAAK,QAAQ,EAEd,MAAM,cAAc,CAAC;AACtB,OAAO,EAIL,KAAK,WAAW,EAEjB,MAAM,kBAAkB,CAAC;AAe1B,uCAAuC;AACvC,MAAM,WAAW,gBAAgB;IAC/B,4DAA4D;IAC5D,OAAO,CAAC,EAAE,MAAM,EAAE,CAAC;IACnB,wDAAwD;IACxD,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;CAClC;AAED;;;;;;;;;;GAUG;AACH,qBAAa,SAAS;IACpB,OAAO,CAAC,IAAI,CAAU;IACtB,OAAO,CAAC,SAAS,CAAa;IAC9B,OAAO,CAAC,MAAM,CAAwB;IACtC,OAAO,CAAC,OAAO,CAAc;IAC7B,OAAO,CAAC,KAAK,CAAe;IAC5B,OAAO,CAAC,QAAQ,CAAW;IAC3B,OAAO,CAAC,WAAW,CAAa;IAChC,OAAO,CAAC,MAAM,CAAa;IAC3B,OAAO,CAAC,UAAU,CAAgB;IAClC,OAAO,CAAC,KAAK,CAA4B;IACzC,OAAO,CAAC,OAAO,CAGY;IAC3B,OAAO,CAAC,OAAO,CAAC,CAAW;IAG3B,OAAO,CAAC,aAAa,CAAyB;IAC9C,OAAO,CAAC,cAAc,CAAiC;IAEvD,OAAO;IA4BP;;;OAGG;WACU,OAAO,CAClB,GAAG,EAAE,MAAM,EACX,OAAO,GAAE,gBAAqB,GAC7B,OAAO,CAAC,SAAS,CAAC;IAKrB;;OAEG;WACU,eAAe,CAC1B,MAAM,EAAE,WAAW,EACnB,OAAO,GAAE,gBAAqB,GAC7B,OAAO,CAAC,SAAS,CAAC;IAKrB;;OAEG;WACU,QAAQ,CACnB,IAAI,EAAE,IAAI,EACV,OAAO,GAAE,gBAAqB,GAC7B,OAAO,CAAC,SAAS,CAAC;IAKrB;;OAEG;WACU,WAAW,CACtB,IAAI,EAAE,OAAO,EACb,OAAO,GAAE,gBAAqB,GAC7B,OAAO,CAAC,SAAS,CAAC;IA+FrB;;;;OAIG;IACG,GAAG,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,UAAU,GAAG,SAAS,CAAC;IAwBvD,uCAAuC;IACvC,IAAI,MAAM,IAAI,MAAM,CAEnB;IAED,iCAAiC;IACjC,IAAI,QAAQ,IAAI,YAAY,CAE3B;IAED,sCAAsC;IACtC,IAAI,GAAG,IAAI,QAAQ,EAAE,CAEpB;IAED,+BAA+B;IAC/B,IAAI,WAAW,IAAI,WAAW,CAE7B;IAED,uCAAuC;IACvC,QAAQ,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,EAAE;IAIjC,6CAA6C;IAC7C,aAAa,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,EAAE;IAItC,2BAA2B;IAC3B,IAAI,cAAc,IAAI,MAAM,EAAE,CAE7B;IAID,OAAO,CAAC,gBAAgB;IAQxB,OAAO,CAAC,YAAY;YAiBN,YAAY;IAuC1B;;;;OAIG;IACH,OAAO,CAAC,kBAAkB;CAU3B"}
@@ -0,0 +1,263 @@
1
+ /**
2
+ * TiffStore: a zarrita.js-compatible AsyncReadable store that presents
3
+ * TIFF files as OME-Zarr v0.5 datasets.
4
+ *
5
+ * Usage:
6
+ * const store = await TiffStore.fromUrl("https://example.com/image.ome.tif");
7
+ * const group = await zarr.open(store, { kind: "group" });
8
+ * // ... use zarrita.js as normal
9
+ */
10
+ import { fromUrl, fromArrayBuffer, fromBlob } from "geotiff";
11
+ import { tiffDtypeToZarr, omePixelTypeToZarr } from "./dtypes.js";
12
+ import { isOmeXml, parseOmeXml, } from "./ome-xml.js";
13
+ import { detectPyramid, createOmeIndexer, createPlainIndexer, } from "./ifd-indexer.js";
14
+ import { readChunk } from "./chunk-reader.js";
15
+ import { buildMultiscales, buildOmero, buildRootGroupJson, buildArrayJson, buildShape, } from "./metadata.js";
16
+ import { parseStoreKey, computeChunkShape } from "./utils.js";
17
+ /**
18
+ * A zarrita.js AsyncReadable store backed by a TIFF file.
19
+ *
20
+ * Implements the zarrita `AsyncReadable` interface:
21
+ * get(key: string): Promise<Uint8Array | undefined>
22
+ *
23
+ * Keys are routed as follows:
24
+ * - "zarr.json" -> root group metadata (OME-Zarr 0.5)
25
+ * - "{level}/zarr.json" -> array metadata for resolution level
26
+ * - "{level}/c/{indices}" -> chunk data (delegates to geotiff.js)
27
+ */
28
+ export class TiffStore {
29
+ tiff;
30
+ omeImages;
31
+ pixels;
32
+ pyramid;
33
+ dtype;
34
+ dimNames;
35
+ chunkShapes;
36
+ shapes;
37
+ multiscale;
38
+ omero;
39
+ indexer;
40
+ offsets;
41
+ // Cached serialized metadata
42
+ rootJsonBytes;
43
+ arrayJsonCache = new Map();
44
+ constructor(tiff, omeImages, pixels, pyramid, dtype, dimNames, chunkShapes, shapes, multiscale, omero, indexer, offsets) {
45
+ this.tiff = tiff;
46
+ this.omeImages = omeImages;
47
+ this.pixels = pixels;
48
+ this.pyramid = pyramid;
49
+ this.dtype = dtype;
50
+ this.dimNames = dimNames;
51
+ this.chunkShapes = chunkShapes;
52
+ this.shapes = shapes;
53
+ this.multiscale = multiscale;
54
+ this.omero = omero;
55
+ this.indexer = indexer;
56
+ this.offsets = offsets;
57
+ }
58
+ /**
59
+ * Open a TiffStore from a remote URL.
60
+ * The TIFF will be accessed via HTTP range requests.
61
+ */
62
+ static async fromUrl(url, options = {}) {
63
+ const tiff = await fromUrl(url, { headers: options.headers });
64
+ return TiffStore.fromGeoTIFF(tiff, options);
65
+ }
66
+ /**
67
+ * Open a TiffStore from an in-memory ArrayBuffer.
68
+ */
69
+ static async fromArrayBuffer(buffer, options = {}) {
70
+ const tiff = await fromArrayBuffer(buffer);
71
+ return TiffStore.fromGeoTIFF(tiff, options);
72
+ }
73
+ /**
74
+ * Open a TiffStore from a Blob or File.
75
+ */
76
+ static async fromBlob(blob, options = {}) {
77
+ const tiff = await fromBlob(blob);
78
+ return TiffStore.fromGeoTIFF(tiff, options);
79
+ }
80
+ /**
81
+ * Open a TiffStore from an already-opened GeoTIFF instance.
82
+ */
83
+ static async fromGeoTIFF(tiff, options = {}) {
84
+ const firstImage = await tiff.getImage(0);
85
+ // Try to parse OME-XML from the ImageDescription tag
86
+ let omeImages = [];
87
+ let pixels;
88
+ let imageDescription;
89
+ try {
90
+ imageDescription = firstImage.fileDirectory.getValue("ImageDescription");
91
+ }
92
+ catch {
93
+ // Tag not available synchronously, try async
94
+ try {
95
+ imageDescription = await firstImage.fileDirectory.loadValue("ImageDescription");
96
+ }
97
+ catch {
98
+ // No ImageDescription
99
+ }
100
+ }
101
+ if (imageDescription && isOmeXml(imageDescription)) {
102
+ omeImages = parseOmeXml(imageDescription);
103
+ if (omeImages.length > 0) {
104
+ pixels = omeImages[0].pixels;
105
+ }
106
+ }
107
+ // Determine data type
108
+ let dtype;
109
+ if (pixels) {
110
+ dtype = omePixelTypeToZarr(pixels.type);
111
+ }
112
+ else {
113
+ const sampleFormat = firstImage.getSampleFormat() ?? 1;
114
+ const bitsPerSample = firstImage.getBitsPerSample();
115
+ dtype = tiffDtypeToZarr(sampleFormat, bitsPerSample);
116
+ }
117
+ // Detect pyramid structure
118
+ const planesPerImage = pixels
119
+ ? pixels.sizeC * pixels.sizeZ * pixels.sizeT
120
+ : 1;
121
+ const pyramid = await detectPyramid(tiff, omeImages.length, planesPerImage);
122
+ // Build metadata
123
+ const imageName = omeImages[0]?.name;
124
+ const { multiscale, dimNames } = buildMultiscales(pixels, pyramid, imageName);
125
+ const omero = buildOmero(pixels, dtype);
126
+ // Compute shapes and chunk shapes for each level
127
+ const tileWidth = firstImage.getTileWidth();
128
+ const tileHeight = firstImage.getTileHeight();
129
+ const shapes = [];
130
+ const chunkShapes = [];
131
+ for (let level = 0; level < pyramid.levels; level++) {
132
+ const shape = buildShape(pixels, pyramid, level, dimNames);
133
+ shapes.push(shape);
134
+ // Use the same tile size for all levels, but clamp to actual dimensions
135
+ const levelTileW = Math.min(tileWidth, pyramid.widths[level]);
136
+ const levelTileH = Math.min(tileHeight, pyramid.heights[level]);
137
+ chunkShapes.push(computeChunkShape(levelTileW, levelTileH, dimNames.length));
138
+ }
139
+ // Create the appropriate indexer
140
+ let indexer;
141
+ if (pixels) {
142
+ indexer = createOmeIndexer(tiff, pixels, pyramid, 0, options.offsets);
143
+ }
144
+ else {
145
+ indexer = createPlainIndexer(tiff, options.offsets);
146
+ }
147
+ return new TiffStore(tiff, omeImages, pixels, pyramid, dtype, dimNames, chunkShapes, shapes, multiscale, omero, indexer, options.offsets);
148
+ }
149
+ // ------- AsyncReadable interface -------
150
+ /**
151
+ * Get a value from the store by key.
152
+ *
153
+ * This is the core zarrita.js AsyncReadable interface method.
154
+ */
155
+ async get(key) {
156
+ const parsed = parseStoreKey(key);
157
+ // Root group metadata
158
+ if (parsed.isRootMetadata) {
159
+ return this.getRootGroupJson();
160
+ }
161
+ // Array-level metadata
162
+ if (parsed.isMetadata && parsed.level >= 0) {
163
+ return this.getArrayJson(parsed.level);
164
+ }
165
+ // Chunk data
166
+ if (parsed.chunkIndices && parsed.level >= 0) {
167
+ return this.getChunkData(parsed.level, parsed.chunkIndices);
168
+ }
169
+ // Unknown key
170
+ return undefined;
171
+ }
172
+ // ------- Public accessors -------
173
+ /** The number of resolution levels. */
174
+ get levels() {
175
+ return this.pyramid.levels;
176
+ }
177
+ /** The Zarr data type string. */
178
+ get dataType() {
179
+ return this.dtype;
180
+ }
181
+ /** The OME-XML images (if parsed). */
182
+ get ome() {
183
+ return this.omeImages;
184
+ }
185
+ /** The pyramid information. */
186
+ get pyramidInfo() {
187
+ return this.pyramid;
188
+ }
189
+ /** Get the shape for a given level. */
190
+ getShape(level) {
191
+ return this.shapes[level];
192
+ }
193
+ /** Get the chunk shape for a given level. */
194
+ getChunkShape(level) {
195
+ return this.chunkShapes[level];
196
+ }
197
+ /** The dimension names. */
198
+ get dimensionNames() {
199
+ return this.dimNames;
200
+ }
201
+ // ------- Private methods -------
202
+ getRootGroupJson() {
203
+ if (!this.rootJsonBytes) {
204
+ const json = buildRootGroupJson(this.multiscale, this.omero);
205
+ this.rootJsonBytes = encodeJson(json);
206
+ }
207
+ return this.rootJsonBytes;
208
+ }
209
+ getArrayJson(level) {
210
+ if (level < 0 || level >= this.pyramid.levels) {
211
+ return undefined;
212
+ }
213
+ if (!this.arrayJsonCache.has(level)) {
214
+ const json = buildArrayJson(this.shapes[level], this.chunkShapes[level], this.dtype, this.dimNames);
215
+ this.arrayJsonCache.set(level, encodeJson(json));
216
+ }
217
+ return this.arrayJsonCache.get(level);
218
+ }
219
+ async getChunkData(level, chunkIndices) {
220
+ if (level < 0 || level >= this.pyramid.levels) {
221
+ return undefined;
222
+ }
223
+ // Map chunk indices to selection + spatial indices
224
+ // Dimension ordering matches dimNames: [t?, c?, z?, y, x]
225
+ const sel = this.indicesToSelection(chunkIndices);
226
+ const shape = this.shapes[level];
227
+ const chunkShape = this.chunkShapes[level];
228
+ // The last two indices are always y, x
229
+ const yIdx = this.dimNames.indexOf("y");
230
+ const xIdx = this.dimNames.indexOf("x");
231
+ const chunkY = chunkIndices[yIdx];
232
+ const chunkX = chunkIndices[xIdx];
233
+ const imageWidth = shape[xIdx];
234
+ const imageHeight = shape[yIdx];
235
+ const chunkWidth = chunkShape[xIdx];
236
+ const chunkHeight = chunkShape[yIdx];
237
+ return readChunk(this.indexer, sel, level, chunkY, chunkX, chunkHeight, chunkWidth, imageWidth, imageHeight, this.dtype);
238
+ }
239
+ /**
240
+ * Map chunk indices to a plane selection.
241
+ * Non-spatial dimensions (t, c, z) map directly from chunk indices;
242
+ * spatial dimensions (y, x) are handled separately.
243
+ */
244
+ indicesToSelection(chunkIndices) {
245
+ const sel = { c: 0, z: 0, t: 0 };
246
+ for (let i = 0; i < this.dimNames.length; i++) {
247
+ const dim = this.dimNames[i];
248
+ if (dim === "t")
249
+ sel.t = chunkIndices[i];
250
+ else if (dim === "c")
251
+ sel.c = chunkIndices[i];
252
+ else if (dim === "z")
253
+ sel.z = chunkIndices[i];
254
+ }
255
+ return sel;
256
+ }
257
+ }
258
+ // ---------- internal helpers ----------
259
+ function encodeJson(obj) {
260
+ const str = JSON.stringify(obj);
261
+ return new TextEncoder().encode(str);
262
+ }
263
+ //# sourceMappingURL=tiff-store.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tiff-store.js","sourceRoot":"","sources":["../src/tiff-store.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,64 @@
1
+ /**
2
+ * Utility helpers for key parsing, pixel window computation, and
3
+ * general-purpose functions used across the package.
4
+ */
5
+ /**
6
+ * Result of parsing a store key.
7
+ */
8
+ export interface ParsedKey {
9
+ /** The resolution level (e.g. 0 for full, 1 for 2x downsample). */
10
+ level: number;
11
+ /** Whether this is a zarr.json metadata key. */
12
+ isMetadata: boolean;
13
+ /** Whether this is a root-level zarr.json. */
14
+ isRootMetadata: boolean;
15
+ /** Chunk indices for data keys (e.g. [0, 3, 5] for c=0, y=3, x=5). */
16
+ chunkIndices?: number[];
17
+ }
18
+ /**
19
+ * Parse a zarr store key into its components.
20
+ *
21
+ * Expected key patterns (Zarr v3 with "/" separator):
22
+ * "zarr.json" -> root group metadata
23
+ * "0/zarr.json" -> level 0 array metadata
24
+ * "0/c/0/0/3/5" -> level 0, chunk at indices [0, 0, 3, 5]
25
+ *
26
+ * @param key - The store key (may or may not have a leading "/").
27
+ * @returns Parsed key information.
28
+ */
29
+ export declare function parseStoreKey(key: string): ParsedKey;
30
+ /**
31
+ * Compute the pixel window for a chunk within an image.
32
+ *
33
+ * @param chunkX - The x chunk index.
34
+ * @param chunkY - The y chunk index.
35
+ * @param chunkWidth - The width of each chunk in pixels.
36
+ * @param chunkHeight - The height of each chunk in pixels.
37
+ * @param imageWidth - The total image width in pixels.
38
+ * @param imageHeight - The total image height in pixels.
39
+ * @returns The pixel window [left, top, right, bottom] for geotiff readRasters.
40
+ */
41
+ export declare function computePixelWindow(chunkX: number, chunkY: number, chunkWidth: number, chunkHeight: number, imageWidth: number, imageHeight: number): [number, number, number, number];
42
+ /**
43
+ * Encode a TypedArray as raw little-endian bytes (Uint8Array).
44
+ * geotiff.js returns platform-endian typed arrays, and modern systems
45
+ * are little-endian which matches Zarr's default byte order.
46
+ *
47
+ * For edge chunks that don't fill the full chunk shape, the data is
48
+ * padded with the fill value (0) to the full chunk size.
49
+ */
50
+ export declare function encodeChunkBytes(data: ArrayBufferView, expectedElements: number, bytesPerElement: number): Uint8Array;
51
+ /**
52
+ * Compute the number of chunks along each dimension.
53
+ */
54
+ export declare function computeChunkCounts(shape: number[], chunkShape: number[]): number[];
55
+ /**
56
+ * Determine a reasonable chunk shape for TIFF tile dimensions.
57
+ * Uses the TIFF's native tile size if available, otherwise defaults.
58
+ */
59
+ export declare function computeChunkShape(tileWidth: number, tileHeight: number, ndim: number): number[];
60
+ /**
61
+ * Return the previous power of 2 that is <= n.
62
+ */
63
+ export declare function prevPowerOf2(n: number): number;
64
+ //# sourceMappingURL=utils.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"utils.d.ts","sourceRoot":"","sources":["../src/utils.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH;;GAEG;AACH,MAAM,WAAW,SAAS;IACxB,mEAAmE;IACnE,KAAK,EAAE,MAAM,CAAC;IACd,gDAAgD;IAChD,UAAU,EAAE,OAAO,CAAC;IACpB,8CAA8C;IAC9C,cAAc,EAAE,OAAO,CAAC;IACxB,sEAAsE;IACtE,YAAY,CAAC,EAAE,MAAM,EAAE,CAAC;CACzB;AAED;;;;;;;;;;GAUG;AACH,wBAAgB,aAAa,CAAC,GAAG,EAAE,MAAM,GAAG,SAAS,CAqCpD;AAED;;;;;;;;;;GAUG;AACH,wBAAgB,kBAAkB,CAChC,MAAM,EAAE,MAAM,EACd,MAAM,EAAE,MAAM,EACd,UAAU,EAAE,MAAM,EAClB,WAAW,EAAE,MAAM,EACnB,UAAU,EAAE,MAAM,EAClB,WAAW,EAAE,MAAM,GAClB,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,CAMlC;AAED;;;;;;;GAOG;AACH,wBAAgB,gBAAgB,CAC9B,IAAI,EAAE,eAAe,EACrB,gBAAgB,EAAE,MAAM,EACxB,eAAe,EAAE,MAAM,GACtB,UAAU,CAiBZ;AAED;;GAEG;AACH,wBAAgB,kBAAkB,CAChC,KAAK,EAAE,MAAM,EAAE,EACf,UAAU,EAAE,MAAM,EAAE,GACnB,MAAM,EAAE,CAEV;AAED;;;GAGG;AACH,wBAAgB,iBAAiB,CAC/B,SAAS,EAAE,MAAM,EACjB,UAAU,EAAE,MAAM,EAClB,IAAI,EAAE,MAAM,GACX,MAAM,EAAE,CAOV;AAED;;GAEG;AACH,wBAAgB,YAAY,CAAC,CAAC,EAAE,MAAM,GAAG,MAAM,CAK9C"}
package/dist/utils.js ADDED
@@ -0,0 +1,116 @@
1
+ /**
2
+ * Utility helpers for key parsing, pixel window computation, and
3
+ * general-purpose functions used across the package.
4
+ */
5
+ /**
6
+ * Parse a zarr store key into its components.
7
+ *
8
+ * Expected key patterns (Zarr v3 with "/" separator):
9
+ * "zarr.json" -> root group metadata
10
+ * "0/zarr.json" -> level 0 array metadata
11
+ * "0/c/0/0/3/5" -> level 0, chunk at indices [0, 0, 3, 5]
12
+ *
13
+ * @param key - The store key (may or may not have a leading "/").
14
+ * @returns Parsed key information.
15
+ */
16
+ export function parseStoreKey(key) {
17
+ // Normalize: strip leading "/"
18
+ const normalized = key.startsWith("/") ? key.slice(1) : key;
19
+ // Root metadata
20
+ if (normalized === "zarr.json") {
21
+ return { level: -1, isMetadata: true, isRootMetadata: true };
22
+ }
23
+ const parts = normalized.split("/");
24
+ // Level metadata: "{level}/zarr.json"
25
+ if (parts.length === 2 && parts[1] === "zarr.json") {
26
+ const level = parseInt(parts[0], 10);
27
+ if (isNaN(level)) {
28
+ return { level: -1, isMetadata: false, isRootMetadata: false };
29
+ }
30
+ return { level, isMetadata: true, isRootMetadata: false };
31
+ }
32
+ // Chunk data: "{level}/c/{indices...}"
33
+ // In Zarr v3 with default chunk_key_encoding (separator="/"),
34
+ // chunk keys look like: "{level}/c/{i0}/{i1}/..."
35
+ if (parts.length >= 3 && parts[1] === "c") {
36
+ const level = parseInt(parts[0], 10);
37
+ if (isNaN(level)) {
38
+ return { level: -1, isMetadata: false, isRootMetadata: false };
39
+ }
40
+ const chunkIndices = parts.slice(2).map((p) => parseInt(p, 10));
41
+ if (chunkIndices.some(isNaN)) {
42
+ return { level: -1, isMetadata: false, isRootMetadata: false };
43
+ }
44
+ return { level, isMetadata: false, isRootMetadata: false, chunkIndices };
45
+ }
46
+ // Unknown key
47
+ return { level: -1, isMetadata: false, isRootMetadata: false };
48
+ }
49
+ /**
50
+ * Compute the pixel window for a chunk within an image.
51
+ *
52
+ * @param chunkX - The x chunk index.
53
+ * @param chunkY - The y chunk index.
54
+ * @param chunkWidth - The width of each chunk in pixels.
55
+ * @param chunkHeight - The height of each chunk in pixels.
56
+ * @param imageWidth - The total image width in pixels.
57
+ * @param imageHeight - The total image height in pixels.
58
+ * @returns The pixel window [left, top, right, bottom] for geotiff readRasters.
59
+ */
60
+ export function computePixelWindow(chunkX, chunkY, chunkWidth, chunkHeight, imageWidth, imageHeight) {
61
+ const left = chunkX * chunkWidth;
62
+ const top = chunkY * chunkHeight;
63
+ const right = Math.min(left + chunkWidth, imageWidth);
64
+ const bottom = Math.min(top + chunkHeight, imageHeight);
65
+ return [left, top, right, bottom];
66
+ }
67
+ /**
68
+ * Encode a TypedArray as raw little-endian bytes (Uint8Array).
69
+ * geotiff.js returns platform-endian typed arrays, and modern systems
70
+ * are little-endian which matches Zarr's default byte order.
71
+ *
72
+ * For edge chunks that don't fill the full chunk shape, the data is
73
+ * padded with the fill value (0) to the full chunk size.
74
+ */
75
+ export function encodeChunkBytes(data, expectedElements, bytesPerElement) {
76
+ const actualElements = data.byteLength / bytesPerElement;
77
+ if (actualElements === expectedElements) {
78
+ // Fast path: data matches expected size exactly
79
+ return new Uint8Array(data.buffer, data.byteOffset, data.byteLength);
80
+ }
81
+ // Edge chunk: pad with zeros to fill the expected chunk size
82
+ const outputBytes = expectedElements * bytesPerElement;
83
+ const output = new Uint8Array(outputBytes);
84
+ output.set(new Uint8Array(data.buffer, data.byteOffset, data.byteLength), 0);
85
+ return output;
86
+ }
87
+ /**
88
+ * Compute the number of chunks along each dimension.
89
+ */
90
+ export function computeChunkCounts(shape, chunkShape) {
91
+ return shape.map((s, i) => Math.ceil(s / chunkShape[i]));
92
+ }
93
+ /**
94
+ * Determine a reasonable chunk shape for TIFF tile dimensions.
95
+ * Uses the TIFF's native tile size if available, otherwise defaults.
96
+ */
97
+ export function computeChunkShape(tileWidth, tileHeight, ndim) {
98
+ // For spatial dimensions use TIFF tile size; for other dims use 1
99
+ // Shape ordering: [t?, c?, z?, y, x]
100
+ const chunks = new Array(ndim).fill(1);
101
+ chunks[ndim - 2] = tileHeight; // y
102
+ chunks[ndim - 1] = tileWidth; // x
103
+ return chunks;
104
+ }
105
+ /**
106
+ * Return the previous power of 2 that is <= n.
107
+ */
108
+ export function prevPowerOf2(n) {
109
+ if (n <= 0)
110
+ return 1;
111
+ let p = 1;
112
+ while (p * 2 <= n)
113
+ p *= 2;
114
+ return p;
115
+ }
116
+ //# sourceMappingURL=utils.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"utils.js","sourceRoot":"","sources":["../src/utils.ts"],"names":[],"mappings":"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"}
package/package.json ADDED
@@ -0,0 +1,51 @@
1
+ {
2
+ "name": "@fideus-labs/fiff",
3
+ "version": "0.1.0",
4
+ "description": "Present TIFF files as a zarrita.js Zarr store following the NGFF OME-Zarr data model",
5
+ "type": "module",
6
+ "main": "./dist/index.js",
7
+ "module": "./dist/index.js",
8
+ "types": "./dist/index.d.ts",
9
+ "exports": {
10
+ ".": {
11
+ "import": "./dist/index.js",
12
+ "types": "./dist/index.d.ts"
13
+ }
14
+ },
15
+ "files": [
16
+ "dist",
17
+ "LICENSE.txt"
18
+ ],
19
+ "repository": {
20
+ "type": "git",
21
+ "url": "https://github.com/fideus-labs/fiff"
22
+ },
23
+ "license": "MIT",
24
+ "keywords": [
25
+ "tiff",
26
+ "ome-tiff",
27
+ "zarr",
28
+ "ome-zarr",
29
+ "ngff",
30
+ "zarrita",
31
+ "geotiff",
32
+ "bioimaging",
33
+ "microscopy",
34
+ "multiscale"
35
+ ],
36
+ "scripts": {
37
+ "build": "tsc -p tsconfig.build.json",
38
+ "test": "bun test",
39
+ "typecheck": "bun x tsc --noEmit",
40
+ "prepublishOnly": "bun run build"
41
+ },
42
+ "dependencies": {
43
+ "geotiff": "^3.0.4-beta.1",
44
+ "zarrita": "^0.6.1"
45
+ },
46
+ "devDependencies": {
47
+ "@fideus-labs/ngff-zarr": "file:/home/matt/src/ngff-zarr/ts/npm",
48
+ "@types/bun": "^1.2.15",
49
+ "typescript": "^5.9.3"
50
+ }
51
+ }