@fideus-labs/fiff 0.2.0 → 0.3.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.md CHANGED
@@ -37,8 +37,14 @@
37
37
  valid OME-TIFF files with embedded OME-XML metadata
38
38
  - 🔻 **Full pyramid support** -- Multi-resolution levels are written as SubIFDs,
39
39
  matching the modern OME-TIFF pyramid convention
40
- - 🗜️ **Deflate compression** -- Optional zlib/deflate compression for smaller
41
- files, compatible with all major TIFF readers
40
+ - 🗜️ **Deflate compression** -- Async zlib/deflate via native `CompressionStream`
41
+ (non-blocking) with synchronous pako fallback
42
+ - 🧱 **Tiled output** -- Large images are automatically written as 256x256 tiles
43
+ (configurable), the OME-TIFF recommended format for efficient random access
44
+ - ⚡ **Parallel plane reading** -- Planes are read with bounded concurrency
45
+ (configurable) for faster writes from async data sources
46
+ - 💾 **BigTIFF support** -- Automatic 64-bit offset format when files exceed
47
+ 4 GB, with manual override via `format` option
42
48
  - 📐 **5D support** -- Handles all dimension orders (XYZCT, XYZTC, etc.) and
43
49
  arbitrary combinations of T, C, Z, Y, X axes
44
50
 
@@ -176,6 +182,9 @@ const buffer = await toOmeTiff(multiscales, {
176
182
  dimensionOrder: "XYZCT", // IFD layout order, default "XYZCT"
177
183
  imageName: "my-image", // name in OME-XML metadata
178
184
  creator: "my-app", // creator string in OME-XML
185
+ tileSize: 256, // tile size in px (0 = strip-based), default 256
186
+ concurrency: 4, // parallel plane reads, default 4
187
+ format: "auto", // "auto" | "classic" | "bigtiff", default "auto"
179
188
  });
180
189
  ```
181
190
 
@@ -259,13 +268,16 @@ All factory methods accept an optional `TiffStoreOptions` object:
259
268
 
260
269
  ### WriteOptions
261
270
 
262
- | Option | Type | Default | Description |
263
- | ------------------ | ---------------------- | ----------- | ---------------------------------------- |
264
- | `compression` | `"none" \| "deflate"` | `"deflate"` | Pixel data compression |
265
- | `compressionLevel` | `number` | `6` | Deflate level 1-9 (higher = smaller) |
266
- | `dimensionOrder` | `string` | `"XYZCT"` | IFD plane layout order |
267
- | `imageName` | `string` | `"image"` | Image name in OME-XML |
268
- | `creator` | `string` | `"fiff"` | Creator string in OME-XML |
271
+ | Option | Type | Default | Description |
272
+ | ------------------ | -------------------------------------- | ----------- | ----------------------------------------- |
273
+ | `compression` | `"none" \| "deflate"` | `"deflate"` | Pixel data compression |
274
+ | `compressionLevel` | `number` | `6` | Deflate level 1-9 (higher = smaller) |
275
+ | `dimensionOrder` | `string` | `"XYZCT"` | IFD plane layout order |
276
+ | `imageName` | `string` | `"image"` | Image name in OME-XML |
277
+ | `creator` | `string` | `"fiff"` | Creator string in OME-XML |
278
+ | `tileSize` | `number` | `256` | Tile size (0 = strip-based, must be x16) |
279
+ | `concurrency` | `number` | `4` | Max parallel plane reads |
280
+ | `format` | `"auto" \| "classic" \| "bigtiff"` | `"auto"` | TIFF format (auto-detects BigTIFF > 4 GB) |
269
281
 
270
282
  ## 🛠️ Development
271
283
 
@@ -298,7 +310,7 @@ src/
298
310
  ome-xml-writer.ts # OME-XML generation from Multiscales metadata
299
311
  test/
300
312
  fixtures.ts # Test TIFF generation helpers
301
- *.test.ts # 175 tests across 11 files
313
+ *.test.ts # 201 tests across 11 files
302
314
  ```
303
315
 
304
316
  ### 📝 Commands
package/dist/index.d.ts CHANGED
@@ -22,7 +22,7 @@ export type { PyramidInfo, PlaneSelection } from "./ifd-indexer.js";
22
22
  export type { OmeAxis, OmeMultiscale, OmeDataset, OmeCoordinateTransformation, OmeroMetadata, OmeroChannel, ZarrGroupMetadata, ZarrArrayMetadata, } from "./metadata.js";
23
23
  export { toOmeTiff, type WriteOptions } from "./write.js";
24
24
  export { buildOmeXml, type OmeXmlWriterOptions, type DimensionInfo } from "./ome-xml-writer.js";
25
- export { buildTiff, makeImageTags, compressDeflate, type WritableIfd, type TiffTag, type BuildTiffOptions, } from "./tiff-writer.js";
25
+ export { buildTiff, makeImageTags, sliceTiles, compressDeflate, compressDeflateAsync, DEFAULT_TILE_SIZE, type WritableIfd, type TiffTag, type BuildTiffOptions, } from "./tiff-writer.js";
26
26
  export { parseOmeXml, isOmeXml, getIfdIndex } from "./ome-xml.js";
27
27
  export { tiffDtypeToZarr, omePixelTypeToZarr, zarrToOmePixelType, zarrToTiffDtype, bytesPerElement, type TiffDtypeInfo, } from "./dtypes.js";
28
28
  export { parseStoreKey, computePixelWindow } from "./utils.js";
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAGA;;;;;;;;;;;;;;;;GAgBG;AAEH,OAAO,EAAE,SAAS,EAAE,KAAK,gBAAgB,EAAE,MAAM,iBAAiB,CAAC;AAGnE,YAAY,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAChD,YAAY,EAAE,QAAQ,EAAE,SAAS,EAAE,UAAU,EAAE,cAAc,EAAE,MAAM,cAAc,CAAC;AACpF,YAAY,EAAE,WAAW,EAAE,cAAc,EAAE,MAAM,kBAAkB,CAAC;AACpE,YAAY,EACV,OAAO,EACP,aAAa,EACb,UAAU,EACV,2BAA2B,EAC3B,aAAa,EACb,YAAY,EACZ,iBAAiB,EACjB,iBAAiB,GAClB,MAAM,eAAe,CAAC;AAGvB,OAAO,EAAE,SAAS,EAAE,KAAK,YAAY,EAAE,MAAM,YAAY,CAAC;AAC1D,OAAO,EAAE,WAAW,EAAE,KAAK,mBAAmB,EAAE,KAAK,aAAa,EAAE,MAAM,qBAAqB,CAAC;AAChG,OAAO,EACL,SAAS,EACT,aAAa,EACb,eAAe,EACf,KAAK,WAAW,EAChB,KAAK,OAAO,EACZ,KAAK,gBAAgB,GACtB,MAAM,kBAAkB,CAAC;AAG1B,OAAO,EAAE,WAAW,EAAE,QAAQ,EAAE,WAAW,EAAE,MAAM,cAAc,CAAC;AAClE,OAAO,EACL,eAAe,EACf,kBAAkB,EAClB,kBAAkB,EAClB,eAAe,EACf,eAAe,EACf,KAAK,aAAa,GACnB,MAAM,aAAa,CAAC;AACrB,OAAO,EAAE,aAAa,EAAE,kBAAkB,EAAE,MAAM,YAAY,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAGA;;;;;;;;;;;;;;;;GAgBG;AAEH,OAAO,EAAE,SAAS,EAAE,KAAK,gBAAgB,EAAE,MAAM,iBAAiB,CAAC;AAGnE,YAAY,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAChD,YAAY,EAAE,QAAQ,EAAE,SAAS,EAAE,UAAU,EAAE,cAAc,EAAE,MAAM,cAAc,CAAC;AACpF,YAAY,EAAE,WAAW,EAAE,cAAc,EAAE,MAAM,kBAAkB,CAAC;AACpE,YAAY,EACV,OAAO,EACP,aAAa,EACb,UAAU,EACV,2BAA2B,EAC3B,aAAa,EACb,YAAY,EACZ,iBAAiB,EACjB,iBAAiB,GAClB,MAAM,eAAe,CAAC;AAGvB,OAAO,EAAE,SAAS,EAAE,KAAK,YAAY,EAAE,MAAM,YAAY,CAAC;AAC1D,OAAO,EAAE,WAAW,EAAE,KAAK,mBAAmB,EAAE,KAAK,aAAa,EAAE,MAAM,qBAAqB,CAAC;AAChG,OAAO,EACL,SAAS,EACT,aAAa,EACb,UAAU,EACV,eAAe,EACf,oBAAoB,EACpB,iBAAiB,EACjB,KAAK,WAAW,EAChB,KAAK,OAAO,EACZ,KAAK,gBAAgB,GACtB,MAAM,kBAAkB,CAAC;AAG1B,OAAO,EAAE,WAAW,EAAE,QAAQ,EAAE,WAAW,EAAE,MAAM,cAAc,CAAC;AAClE,OAAO,EACL,eAAe,EACf,kBAAkB,EAClB,kBAAkB,EAClB,eAAe,EACf,eAAe,EACf,KAAK,aAAa,GACnB,MAAM,aAAa,CAAC;AACrB,OAAO,EAAE,aAAa,EAAE,kBAAkB,EAAE,MAAM,YAAY,CAAC"}
package/dist/index.js CHANGED
@@ -21,7 +21,7 @@ export { TiffStore } from "./tiff-store.js";
21
21
  // Writer
22
22
  export { toOmeTiff } from "./write.js";
23
23
  export { buildOmeXml } from "./ome-xml-writer.js";
24
- export { buildTiff, makeImageTags, compressDeflate, } from "./tiff-writer.js";
24
+ export { buildTiff, makeImageTags, sliceTiles, compressDeflate, compressDeflateAsync, DEFAULT_TILE_SIZE, } from "./tiff-writer.js";
25
25
  // Export utilities that may be useful
26
26
  export { parseOmeXml, isOmeXml, getIfdIndex } from "./ome-xml.js";
27
27
  export { tiffDtypeToZarr, omePixelTypeToZarr, zarrToOmePixelType, zarrToTiffDtype, bytesPerElement, } from "./dtypes.js";
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,wDAAwD;AACxD,+BAA+B;AAE/B;;;;;;;;;;;;;;;;GAgBG;AAEH,OAAO,EAAE,SAAS,EAAyB,MAAM,iBAAiB,CAAC;AAiBnE,SAAS;AACT,OAAO,EAAE,SAAS,EAAqB,MAAM,YAAY,CAAC;AAC1D,OAAO,EAAE,WAAW,EAAgD,MAAM,qBAAqB,CAAC;AAChG,OAAO,EACL,SAAS,EACT,aAAa,EACb,eAAe,GAIhB,MAAM,kBAAkB,CAAC;AAE1B,sCAAsC;AACtC,OAAO,EAAE,WAAW,EAAE,QAAQ,EAAE,WAAW,EAAE,MAAM,cAAc,CAAC;AAClE,OAAO,EACL,eAAe,EACf,kBAAkB,EAClB,kBAAkB,EAClB,eAAe,EACf,eAAe,GAEhB,MAAM,aAAa,CAAC;AACrB,OAAO,EAAE,aAAa,EAAE,kBAAkB,EAAE,MAAM,YAAY,CAAC"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,wDAAwD;AACxD,+BAA+B;AAE/B;;;;;;;;;;;;;;;;GAgBG;AAEH,OAAO,EAAE,SAAS,EAAyB,MAAM,iBAAiB,CAAC;AAiBnE,SAAS;AACT,OAAO,EAAE,SAAS,EAAqB,MAAM,YAAY,CAAC;AAC1D,OAAO,EAAE,WAAW,EAAgD,MAAM,qBAAqB,CAAC;AAChG,OAAO,EACL,SAAS,EACT,aAAa,EACb,UAAU,EACV,eAAe,EACf,oBAAoB,EACpB,iBAAiB,GAIlB,MAAM,kBAAkB,CAAC;AAE1B,sCAAsC;AACtC,OAAO,EAAE,WAAW,EAAE,QAAQ,EAAE,WAAW,EAAE,MAAM,cAAc,CAAC;AAClE,OAAO,EACL,eAAe,EACf,kBAAkB,EAClB,kBAAkB,EAClB,eAAe,EACf,eAAe,GAEhB,MAAM,aAAa,CAAC;AACrB,OAAO,EAAE,aAAa,EAAE,kBAAkB,EAAE,MAAM,YAAY,CAAC"}
@@ -4,6 +4,7 @@ export declare const TIFF_TYPE_ASCII = 2;
4
4
  export declare const TIFF_TYPE_SHORT = 3;
5
5
  export declare const TIFF_TYPE_LONG = 4;
6
6
  export declare const TIFF_TYPE_RATIONAL = 5;
7
+ export declare const TIFF_TYPE_LONG8 = 16;
7
8
  /** Well-known TIFF tags. */
8
9
  export declare const TAG_NEW_SUBFILE_TYPE = 254;
9
10
  export declare const TAG_IMAGE_WIDTH = 256;
@@ -17,11 +18,17 @@ export declare const TAG_SAMPLES_PER_PIXEL = 277;
17
18
  export declare const TAG_ROWS_PER_STRIP = 278;
18
19
  export declare const TAG_STRIP_BYTE_COUNTS = 279;
19
20
  export declare const TAG_PLANAR_CONFIGURATION = 284;
20
- export declare const TAG_SAMPLE_FORMAT = 339;
21
+ export declare const TAG_TILE_WIDTH = 322;
22
+ export declare const TAG_TILE_LENGTH = 323;
23
+ export declare const TAG_TILE_OFFSETS = 324;
24
+ export declare const TAG_TILE_BYTE_COUNTS = 325;
21
25
  export declare const TAG_SUB_IFDS = 330;
26
+ export declare const TAG_SAMPLE_FORMAT = 339;
22
27
  /** TIFF compression codes. */
23
28
  export declare const COMPRESSION_NONE = 1;
24
29
  export declare const COMPRESSION_DEFLATE = 8;
30
+ /** Default tile size (OME-TIFF convention). Must be a multiple of 16. */
31
+ export declare const DEFAULT_TILE_SIZE = 256;
25
32
  /** A single TIFF tag entry. */
26
33
  export interface TiffTag {
27
34
  /** TIFF tag number (e.g. 256 for ImageWidth). */
@@ -33,33 +40,83 @@ export interface TiffTag {
33
40
  }
34
41
  /** Describes one IFD (image) to be written. */
35
42
  export interface WritableIfd {
36
- /** Tags for this IFD (excluding StripOffsets/StripByteCounts — those are auto-generated). */
43
+ /** Tags for this IFD (excluding offset/bytecount tags — those are auto-generated). */
37
44
  tags: TiffTag[];
38
- /** Raw (possibly compressed) strip data. Each entry is one strip. */
39
- strips: Uint8Array[];
45
+ /**
46
+ * Raw pixel data tiles. Each entry is one tile (row-major, left-to-right
47
+ * then top-to-bottom). For strip-based images, this is a single entry
48
+ * containing the entire plane.
49
+ */
50
+ tiles: Uint8Array[];
40
51
  /** Optional SubIFDs attached to this IFD (for pyramid sub-resolutions). */
41
52
  subIfds?: WritableIfd[];
42
53
  }
43
54
  /** Options for buildTiff. */
44
55
  export interface BuildTiffOptions {
45
- /** Compression to apply to strip data before writing. Default: "none". */
56
+ /** Compression to apply to tile data before writing. Default: "none". */
46
57
  compression?: "none" | "deflate";
47
58
  /** Deflate compression level (1-9). Default: 6. */
48
59
  compressionLevel?: number;
60
+ /**
61
+ * TIFF format to use.
62
+ * - "auto": Use classic TIFF when possible, BigTIFF when file exceeds 4 GB.
63
+ * - "classic": Force classic TIFF (32-bit offsets). Fails if file > 4 GB.
64
+ * - "bigtiff": Force BigTIFF (64-bit offsets).
65
+ * Default: "auto".
66
+ */
67
+ format?: "auto" | "classic" | "bigtiff";
49
68
  }
50
69
  /**
51
70
  * Build a complete TIFF file from a list of IFDs.
52
71
  *
72
+ * Tiles are compressed (if requested) eagerly and in parallel where
73
+ * possible. The uncompressed data is released after compression to
74
+ * minimise peak memory usage.
75
+ *
53
76
  * @param ifds - Main IFD chain (linked via next-IFD pointers).
54
- * @param options - Build options (compression, etc.).
77
+ * @param options - Build options (compression, format, etc.).
55
78
  * @returns A complete TIFF file as an ArrayBuffer.
56
79
  */
57
- export declare function buildTiff(ifds: WritableIfd[], options?: BuildTiffOptions): ArrayBuffer;
80
+ export declare function buildTiff(ifds: WritableIfd[], options?: BuildTiffOptions): Promise<ArrayBuffer>;
58
81
  /**
59
82
  * Compress a Uint8Array using deflate (zlib-wrapped, RFC 1950).
60
83
  * Compatible with TIFF compression code 8 and geotiff.js's pako.inflate().
84
+ *
85
+ * Prefers the native CompressionStream API (async, non-blocking) when
86
+ * available, falling back to synchronous pako.deflate().
87
+ */
88
+ export declare function compressDeflateAsync(data: Uint8Array, level?: number): Promise<Uint8Array>;
89
+ /**
90
+ * Compress a Uint8Array using deflate (zlib-wrapped, RFC 1950) synchronously.
91
+ * Compatible with TIFF compression code 8 and geotiff.js's pako.inflate().
61
92
  */
62
93
  export declare function compressDeflate(data: Uint8Array, level?: number): Uint8Array;
63
- /** Create a standard set of tags for a grayscale image plane. */
64
- export declare function makeImageTags(width: number, height: number, bitsPerSample: number, sampleFormat: number, compression?: "none" | "deflate", imageDescription?: string, isSubResolution?: boolean): TiffTag[];
94
+ /**
95
+ * Create a standard set of tags for a tiled grayscale image plane.
96
+ *
97
+ * @param width - Image width in pixels.
98
+ * @param height - Image height in pixels.
99
+ * @param bitsPerSample - Bits per sample (8, 16, 32, 64).
100
+ * @param sampleFormat - TIFF SampleFormat (1=uint, 2=int, 3=float).
101
+ * @param compression - Compression type. Default: "none".
102
+ * @param imageDescription - Optional OME-XML string for the first IFD.
103
+ * @param isSubResolution - Whether this is a SubIFD (sets NewSubfileType=1).
104
+ * @param tileSize - Tile width and height. Default: 256. Use 0 for strip-based.
105
+ */
106
+ export declare function makeImageTags(width: number, height: number, bitsPerSample: number, sampleFormat: number, compression?: "none" | "deflate", imageDescription?: string, isSubResolution?: boolean, tileSize?: number): TiffTag[];
107
+ /**
108
+ * Slice a 2D pixel plane into tiles suitable for TIFF tiled output.
109
+ *
110
+ * Tiles that extend beyond the image boundary are zero-padded to the
111
+ * full tile size (required by the TIFF spec for tiled images).
112
+ *
113
+ * @param planeBytes - Raw pixel data for the entire plane (row-major, little-endian).
114
+ * @param width - Image width in pixels.
115
+ * @param height - Image height in pixels.
116
+ * @param bytesPerPixel - Bytes per pixel (e.g. 2 for uint16).
117
+ * @param tileW - Tile width in pixels.
118
+ * @param tileH - Tile height in pixels.
119
+ * @returns Array of tile buffers, in row-major tile order (left-to-right, top-to-bottom).
120
+ */
121
+ export declare function sliceTiles(planeBytes: Uint8Array, width: number, height: number, bytesPerPixel: number, tileW: number, tileH: number): Uint8Array[];
65
122
  //# sourceMappingURL=tiff-writer.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"tiff-writer.d.ts","sourceRoot":"","sources":["../src/tiff-writer.ts"],"names":[],"mappings":"AA2BA,gDAAgD;AAChD,eAAO,MAAM,cAAc,IAAI,CAAC;AAChC,eAAO,MAAM,eAAe,IAAI,CAAC;AACjC,eAAO,MAAM,eAAe,IAAI,CAAC;AACjC,eAAO,MAAM,cAAc,IAAI,CAAC;AAChC,eAAO,MAAM,kBAAkB,IAAI,CAAC;AAUpC,4BAA4B;AAC5B,eAAO,MAAM,oBAAoB,MAAM,CAAC;AACxC,eAAO,MAAM,eAAe,MAAM,CAAC;AACnC,eAAO,MAAM,gBAAgB,MAAM,CAAC;AACpC,eAAO,MAAM,mBAAmB,MAAM,CAAC;AACvC,eAAO,MAAM,eAAe,MAAM,CAAC;AACnC,eAAO,MAAM,eAAe,MAAM,CAAC;AACnC,eAAO,MAAM,qBAAqB,MAAM,CAAC;AACzC,eAAO,MAAM,iBAAiB,MAAM,CAAC;AACrC,eAAO,MAAM,qBAAqB,MAAM,CAAC;AACzC,eAAO,MAAM,kBAAkB,MAAM,CAAC;AACtC,eAAO,MAAM,qBAAqB,MAAM,CAAC;AACzC,eAAO,MAAM,wBAAwB,MAAM,CAAC;AAC5C,eAAO,MAAM,iBAAiB,MAAM,CAAC;AACrC,eAAO,MAAM,YAAY,MAAM,CAAC;AAEhC,8BAA8B;AAC9B,eAAO,MAAM,gBAAgB,IAAI,CAAC;AAClC,eAAO,MAAM,mBAAmB,IAAI,CAAC;AAIrC,+BAA+B;AAC/B,MAAM,WAAW,OAAO;IACtB,iDAAiD;IACjD,GAAG,EAAE,MAAM,CAAC;IACZ,iDAAiD;IACjD,IAAI,EAAE,MAAM,CAAC;IACb,iDAAiD;IACjD,MAAM,EAAE,MAAM,EAAE,GAAG,MAAM,CAAC;CAC3B;AAED,+CAA+C;AAC/C,MAAM,WAAW,WAAW;IAC1B,6FAA6F;IAC7F,IAAI,EAAE,OAAO,EAAE,CAAC;IAChB,qEAAqE;IACrE,MAAM,EAAE,UAAU,EAAE,CAAC;IACrB,2EAA2E;IAC3E,OAAO,CAAC,EAAE,WAAW,EAAE,CAAC;CACzB;AAED,6BAA6B;AAC7B,MAAM,WAAW,gBAAgB;IAC/B,0EAA0E;IAC1E,WAAW,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IACjC,mDAAmD;IACnD,gBAAgB,CAAC,EAAE,MAAM,CAAC;CAC3B;AAmCD;;;;;;GAMG;AACH,wBAAgB,SAAS,CACvB,IAAI,EAAE,WAAW,EAAE,EACnB,OAAO,GAAE,gBAAqB,GAC7B,WAAW,CA4Bb;AAED;;;GAGG;AACH,wBAAgB,eAAe,CAC7B,IAAI,EAAE,UAAU,EAChB,KAAK,GAAE,MAAU,GAChB,UAAU,CAEZ;AA8TD,iEAAiE;AACjE,wBAAgB,aAAa,CAC3B,KAAK,EAAE,MAAM,EACb,MAAM,EAAE,MAAM,EACd,aAAa,EAAE,MAAM,EACrB,YAAY,EAAE,MAAM,EACpB,WAAW,GAAE,MAAM,GAAG,SAAkB,EACxC,gBAAgB,CAAC,EAAE,MAAM,EACzB,eAAe,CAAC,EAAE,OAAO,GACxB,OAAO,EAAE,CA0BX"}
1
+ {"version":3,"file":"tiff-writer.d.ts","sourceRoot":"","sources":["../src/tiff-writer.ts"],"names":[],"mappings":"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"}
@@ -3,20 +3,28 @@
3
3
  /**
4
4
  * Low-level TIFF binary builder.
5
5
  *
6
- * Assembles IFD entries, tag values, strip data, and SubIFD chains into
7
- * a valid classic TIFF file (little-endian, magic 42).
6
+ * Assembles IFD entries, tag values, tile/strip data, and SubIFD chains into
7
+ * a valid TIFF file (little-endian). Supports both classic TIFF (32-bit
8
+ * offsets, magic 42) and BigTIFF (64-bit offsets, magic 43).
9
+ *
10
+ * Features:
11
+ * - Tiled output (default 256x256, configurable)
12
+ * - Deflate compression via CompressionStream (async, non-blocking)
13
+ * with synchronous pako fallback
14
+ * - Automatic BigTIFF when offsets exceed 4 GB
15
+ * - Compress-and-release: tiles are compressed eagerly, uncompressed
16
+ * data is released immediately to minimise peak memory
8
17
  *
9
18
  * Layout strategy (two-pass):
10
- * Pass 1: Collect all IFDs and pixel data, compute sizes.
11
- * Pass 2: Compute offsets and write into a pre-allocated ArrayBuffer.
19
+ * Pass 1: Compress tiles, resolve tags, compute sizes and offsets.
20
+ * Pass 2: Write into a pre-allocated ArrayBuffer.
12
21
  *
13
22
  * File layout:
14
- * [Header 8 bytes]
15
- * [Main IFD 0 entries + overflow data + strip data]
16
- * [Main IFD 1 entries + overflow data + strip data]
17
- * ...
18
- * [SubIFD 0,0 entries + overflow data + strip data]
19
- * [SubIFD 0,1 entries + overflow data + strip data]
23
+ * [Header 8 or 16 bytes]
24
+ * [Main IFD 0 entries + overflow data + tile data]
25
+ * [SubIFD 0,0 ...]
26
+ * [SubIFD 0,1 ...]
27
+ * [Main IFD 1 entries + overflow data + tile data]
20
28
  * ...
21
29
  */
22
30
  import { deflate } from "pako";
@@ -27,12 +35,14 @@ export const TIFF_TYPE_ASCII = 2; // 1 byte (null-terminated)
27
35
  export const TIFF_TYPE_SHORT = 3; // 2 bytes
28
36
  export const TIFF_TYPE_LONG = 4; // 4 bytes
29
37
  export const TIFF_TYPE_RATIONAL = 5; // 8 bytes (two LONGs)
38
+ export const TIFF_TYPE_LONG8 = 16; // 8 bytes (BigTIFF only)
30
39
  const TYPE_SIZES = {
31
40
  [TIFF_TYPE_BYTE]: 1,
32
41
  [TIFF_TYPE_ASCII]: 1,
33
42
  [TIFF_TYPE_SHORT]: 2,
34
43
  [TIFF_TYPE_LONG]: 4,
35
44
  [TIFF_TYPE_RATIONAL]: 8,
45
+ [TIFF_TYPE_LONG8]: 8,
36
46
  };
37
47
  /** Well-known TIFF tags. */
38
48
  export const TAG_NEW_SUBFILE_TYPE = 254;
@@ -47,58 +57,144 @@ export const TAG_SAMPLES_PER_PIXEL = 277;
47
57
  export const TAG_ROWS_PER_STRIP = 278;
48
58
  export const TAG_STRIP_BYTE_COUNTS = 279;
49
59
  export const TAG_PLANAR_CONFIGURATION = 284;
50
- export const TAG_SAMPLE_FORMAT = 339;
60
+ export const TAG_TILE_WIDTH = 322;
61
+ export const TAG_TILE_LENGTH = 323;
62
+ export const TAG_TILE_OFFSETS = 324;
63
+ export const TAG_TILE_BYTE_COUNTS = 325;
51
64
  export const TAG_SUB_IFDS = 330;
65
+ export const TAG_SAMPLE_FORMAT = 339;
52
66
  /** TIFF compression codes. */
53
67
  export const COMPRESSION_NONE = 1;
54
68
  export const COMPRESSION_DEFLATE = 8;
69
+ /** Default tile size (OME-TIFF convention). Must be a multiple of 16. */
70
+ export const DEFAULT_TILE_SIZE = 256;
71
+ const CLASSIC_FORMAT = {
72
+ headerSize: 8,
73
+ ifdEntrySize: 12,
74
+ offsetSize: 4,
75
+ inlineThreshold: 4,
76
+ offsetType: TIFF_TYPE_LONG,
77
+ magic: 42,
78
+ };
79
+ const BIGTIFF_FORMAT = {
80
+ headerSize: 16,
81
+ ifdEntrySize: 20,
82
+ offsetSize: 8,
83
+ inlineThreshold: 8,
84
+ offsetType: TIFF_TYPE_LONG8,
85
+ magic: 43,
86
+ };
55
87
  // ── Public API ──────────────────────────────────────────────────────
56
88
  /**
57
89
  * Build a complete TIFF file from a list of IFDs.
58
90
  *
91
+ * Tiles are compressed (if requested) eagerly and in parallel where
92
+ * possible. The uncompressed data is released after compression to
93
+ * minimise peak memory usage.
94
+ *
59
95
  * @param ifds - Main IFD chain (linked via next-IFD pointers).
60
- * @param options - Build options (compression, etc.).
96
+ * @param options - Build options (compression, format, etc.).
61
97
  * @returns A complete TIFF file as an ArrayBuffer.
62
98
  */
63
- export function buildTiff(ifds, options = {}) {
99
+ export async function buildTiff(ifds, options = {}) {
64
100
  const compression = options.compression ?? "none";
65
101
  const compressionLevel = options.compressionLevel ?? 6;
66
- // Compress strips if needed
67
- const processedIfds = ifds.map((ifd) => processIfd(ifd, compression, compressionLevel));
68
- // Pass 1: compute sizes and place all IFDs
69
- const placed = placeIfds(processedIfds);
70
- // Pass 2: compute total file size
71
- const totalSize = computeTotalSize(placed);
72
- // Pass 3: write into buffer
102
+ const formatOpt = options.format ?? "auto";
103
+ // Phase 1: Compress tiles eagerly (compress-and-release)
104
+ const processedIfds = await Promise.all(ifds.map((ifd) => processIfdAsync(ifd, compression, compressionLevel)));
105
+ // Phase 2: Determine format (auto-detect BigTIFF if needed)
106
+ const rawSize = estimateRawSize(processedIfds);
107
+ let fmt;
108
+ if (formatOpt === "bigtiff") {
109
+ fmt = BIGTIFF_FORMAT;
110
+ }
111
+ else if (formatOpt === "classic") {
112
+ fmt = CLASSIC_FORMAT;
113
+ if (rawSize > 0xffff_fffe) {
114
+ throw new Error(`File size (~${(rawSize / 1e9).toFixed(1)} GB) exceeds classic TIFF 4 GB limit. ` +
115
+ `Use format: "auto" or "bigtiff".`);
116
+ }
117
+ }
118
+ else {
119
+ // auto: use BigTIFF if estimated size > 3.9 GB (conservative)
120
+ fmt = rawSize > 3.9e9 ? BIGTIFF_FORMAT : CLASSIC_FORMAT;
121
+ }
122
+ // Phase 3: Compute sizes and place all IFDs
123
+ const placed = placeIfds(processedIfds, fmt);
124
+ // Phase 4: Compute total file size
125
+ const totalSize = computeTotalSize(placed, fmt);
126
+ // Phase 5: Write into buffer
73
127
  const buffer = new ArrayBuffer(totalSize);
74
128
  const view = new DataView(buffer);
75
- // Write TIFF header (little-endian)
76
- view.setUint16(0, 0x4949, true); // "II" byte order
77
- view.setUint16(2, 42, true); // magic number
78
- view.setUint32(4, placed.length > 0 ? placed[0].ifdOffset : 0, true); // offset to first IFD
79
- // Write all placed IFDs
129
+ writeHeader(view, fmt, placed.length > 0 ? placed[0].ifdOffset : 0);
80
130
  for (const p of placed) {
81
- writeIfd(view, buffer, p);
131
+ writeIfd(view, buffer, p, fmt);
82
132
  }
83
133
  return buffer;
84
134
  }
85
135
  /**
86
136
  * Compress a Uint8Array using deflate (zlib-wrapped, RFC 1950).
87
137
  * Compatible with TIFF compression code 8 and geotiff.js's pako.inflate().
138
+ *
139
+ * Prefers the native CompressionStream API (async, non-blocking) when
140
+ * available, falling back to synchronous pako.deflate().
141
+ */
142
+ export async function compressDeflateAsync(data, level = 6) {
143
+ // CompressionStream("deflate") produces zlib-wrapped output (RFC 1950),
144
+ // which is what TIFF code 8 expects and what geotiff.js decompresses.
145
+ // However, CompressionStream doesn't support compression level, so we
146
+ // only use it for the default level to avoid surprising behaviour.
147
+ // For non-default levels, we fall back to pako.
148
+ if (typeof globalThis.CompressionStream !== "undefined" &&
149
+ level === 6) {
150
+ const stream = new CompressionStream("deflate");
151
+ const writer = stream.writable.getWriter();
152
+ const reader = stream.readable.getReader();
153
+ // Write and close
154
+ writer.write(data);
155
+ writer.close();
156
+ // Collect chunks
157
+ const chunks = [];
158
+ let totalLen = 0;
159
+ while (true) {
160
+ const { done, value } = await reader.read();
161
+ if (done)
162
+ break;
163
+ chunks.push(value);
164
+ totalLen += value.length;
165
+ }
166
+ // Concatenate
167
+ const result = new Uint8Array(totalLen);
168
+ let offset = 0;
169
+ for (const chunk of chunks) {
170
+ result.set(chunk, offset);
171
+ offset += chunk.length;
172
+ }
173
+ return result;
174
+ }
175
+ return compressDeflate(data, level);
176
+ }
177
+ /**
178
+ * Compress a Uint8Array using deflate (zlib-wrapped, RFC 1950) synchronously.
179
+ * Compatible with TIFF compression code 8 and geotiff.js's pako.inflate().
88
180
  */
89
181
  export function compressDeflate(data, level = 6) {
90
182
  return deflate(data, { level: level });
91
183
  }
92
184
  // ── Internal helpers ────────────────────────────────────────────────
93
185
  /**
94
- * Process an IFD: compress strips if needed, add compression tag,
95
- * and recursively process SubIFDs.
186
+ * Process an IFD: compress tiles if needed, add compression tag,
187
+ * and recursively process SubIFDs. Async for CompressionStream support.
188
+ *
189
+ * This is the "compress-and-release" step: after compression, the
190
+ * original uncompressed tile data can be GC'd.
96
191
  */
97
- function processIfd(ifd, compression, level) {
98
- let strips = ifd.strips;
192
+ async function processIfdAsync(ifd, compression, level) {
193
+ let tiles = ifd.tiles;
99
194
  const tags = [...ifd.tags];
100
195
  if (compression === "deflate") {
101
- strips = strips.map((s) => compressDeflate(s, level));
196
+ // Compress all tiles in parallel
197
+ tiles = await Promise.all(tiles.map((t) => compressDeflateAsync(t, level)));
102
198
  // Replace or add Compression tag
103
199
  const compIdx = tags.findIndex((t) => t.tag === TAG_COMPRESSION);
104
200
  if (compIdx >= 0) {
@@ -108,8 +204,44 @@ function processIfd(ifd, compression, level) {
108
204
  tags.push({ tag: TAG_COMPRESSION, type: TIFF_TYPE_SHORT, values: [COMPRESSION_DEFLATE] });
109
205
  }
110
206
  }
111
- const subIfds = ifd.subIfds?.map((sub) => processIfd(sub, compression, level));
112
- return { tags, strips, subIfds };
207
+ const subIfds = ifd.subIfds
208
+ ? await Promise.all(ifd.subIfds.map((sub) => processIfdAsync(sub, compression, level)))
209
+ : undefined;
210
+ return { tags, tiles, subIfds };
211
+ }
212
+ /**
213
+ * Estimate raw file size (sum of all tile data + overhead per IFD).
214
+ * Used for BigTIFF auto-detection.
215
+ */
216
+ function estimateRawSize(ifds) {
217
+ let size = 16; // BigTIFF header (conservative)
218
+ for (const ifd of ifds) {
219
+ size += 256; // tags overhead estimate
220
+ for (const tile of ifd.tiles) {
221
+ size += tile.length;
222
+ }
223
+ if (ifd.subIfds) {
224
+ size += estimateRawSize(ifd.subIfds);
225
+ }
226
+ }
227
+ return size;
228
+ }
229
+ /** Write the TIFF file header. */
230
+ function writeHeader(view, fmt, firstIfdOffset) {
231
+ // Byte order: "II" (little-endian)
232
+ view.setUint16(0, 0x4949, true);
233
+ if (fmt.magic === 42) {
234
+ // Classic TIFF
235
+ view.setUint16(2, 42, true);
236
+ view.setUint32(4, firstIfdOffset, true);
237
+ }
238
+ else {
239
+ // BigTIFF
240
+ view.setUint16(2, 43, true);
241
+ view.setUint16(4, 8, true); // offset size
242
+ view.setUint16(6, 0, true); // padding
243
+ setBigUint64(view, 8, firstIfdOffset);
244
+ }
113
245
  }
114
246
  /** Resolve a TiffTag to its byte representation. */
115
247
  function resolveTag(tag) {
@@ -141,6 +273,9 @@ function resolveTag(tag) {
141
273
  case TIFF_TYPE_LONG:
142
274
  dv.setUint32(i * 4, tag.values[i], true);
143
275
  break;
276
+ case TIFF_TYPE_LONG8:
277
+ setBigUint64(dv, i * 8, tag.values[i]);
278
+ break;
144
279
  case TIFF_TYPE_RATIONAL:
145
280
  // Rationals are stored as two LONGs (numerator, denominator)
146
281
  dv.setUint32(i * 4, tag.values[i], true);
@@ -150,17 +285,22 @@ function resolveTag(tag) {
150
285
  return { tag: tag.tag, type: tag.type, count, valueBytes };
151
286
  }
152
287
  /**
153
- * Compute the byte size of an IFD entry block:
154
- * 2 bytes (entry count) + 12 bytes per entry + 4 bytes (next IFD offset)
288
+ * Compute the byte size of an IFD entry block.
289
+ * Classic: 2 + 12*N + 4
290
+ * BigTIFF: 8 + 20*N + 8
155
291
  */
156
- function ifdEntryBlockSize(numTags) {
157
- return 2 + numTags * 12 + 4;
292
+ function ifdEntryBlockSize(numTags, fmt) {
293
+ if (fmt.magic === 42) {
294
+ return 2 + numTags * 12 + 4;
295
+ }
296
+ // BigTIFF: 8 bytes entry count + 20 bytes per entry + 8 bytes next offset
297
+ return 8 + numTags * 20 + 8;
158
298
  }
159
- /** Compute overflow size for resolved tags (values that don't fit in 4 bytes). */
160
- function overflowSize(tags) {
299
+ /** Compute overflow size for resolved tags (values that don't fit inline). */
300
+ function overflowSize(tags, fmt) {
161
301
  let size = 0;
162
302
  for (const t of tags) {
163
- if (t.valueBytes.length > 4) {
303
+ if (t.valueBytes.length > fmt.inlineThreshold) {
164
304
  size += t.valueBytes.length;
165
305
  // Pad to word boundary (2-byte alignment)
166
306
  if (t.valueBytes.length % 2 !== 0)
@@ -169,48 +309,54 @@ function overflowSize(tags) {
169
309
  }
170
310
  return size;
171
311
  }
172
- /** Compute total strip data size. */
173
- function totalStripSize(strips) {
174
- return strips.reduce((sum, s) => sum + s.length, 0);
312
+ /** Compute total tile data size. */
313
+ function totalTileSize(tiles) {
314
+ return tiles.reduce((sum, t) => sum + t.length, 0);
175
315
  }
176
316
  /**
177
317
  * Place all IFDs sequentially, computing absolute offsets.
178
- * Returns a flat list of PlacedIfds (main chain first, then SubIFDs).
318
+ * Returns a flat list of PlacedIfds (main chain first, then SubIFDs interleaved).
179
319
  */
180
- function placeIfds(ifds) {
320
+ function placeIfds(ifds, fmt) {
181
321
  const allPlaced = [];
182
322
  function resolveIfdInfo(ifd) {
183
- // Build tags list — we'll add StripOffsets and StripByteCounts as placeholders
184
- // They'll be patched during the write phase
185
323
  const userTags = ifd.tags.map(resolveTag);
186
- // Add StripOffsets (placeholder count = number of strips, values will be patched)
187
- const stripOffsetsTag = {
188
- tag: TAG_STRIP_OFFSETS,
189
- type: TIFF_TYPE_LONG,
190
- count: ifd.strips.length,
191
- valueBytes: new Uint8Array(ifd.strips.length * 4),
324
+ // Determine if this is tiled or stripped based on tags
325
+ const hasTileWidth = ifd.tags.some((t) => t.tag === TAG_TILE_WIDTH);
326
+ // Add offset and byte-count tags as placeholders
327
+ const offsetTag = hasTileWidth ? TAG_TILE_OFFSETS : TAG_STRIP_OFFSETS;
328
+ const countTag = hasTileWidth ? TAG_TILE_BYTE_COUNTS : TAG_STRIP_BYTE_COUNTS;
329
+ const tileOffsetsTag = {
330
+ tag: offsetTag,
331
+ type: fmt.offsetType,
332
+ count: ifd.tiles.length,
333
+ valueBytes: new Uint8Array(ifd.tiles.length * fmt.offsetSize),
192
334
  };
193
- // Add StripByteCounts
194
- const stripByteCountsBytes = new Uint8Array(ifd.strips.length * 4);
195
- const sbcView = new DataView(stripByteCountsBytes.buffer);
196
- for (let i = 0; i < ifd.strips.length; i++) {
197
- sbcView.setUint32(i * 4, ifd.strips[i].length, true);
335
+ const tileByteCountsBytes = new Uint8Array(ifd.tiles.length * fmt.offsetSize);
336
+ const tbcView = new DataView(tileByteCountsBytes.buffer);
337
+ for (let i = 0; i < ifd.tiles.length; i++) {
338
+ if (fmt.offsetSize === 8) {
339
+ setBigUint64(tbcView, i * 8, ifd.tiles[i].length);
340
+ }
341
+ else {
342
+ tbcView.setUint32(i * 4, ifd.tiles[i].length, true);
343
+ }
198
344
  }
199
- const stripByteCountsTag = {
200
- tag: TAG_STRIP_BYTE_COUNTS,
201
- type: TIFF_TYPE_LONG,
202
- count: ifd.strips.length,
203
- valueBytes: stripByteCountsBytes,
345
+ const tileByteCountsTag = {
346
+ tag: countTag,
347
+ type: fmt.offsetType,
348
+ count: ifd.tiles.length,
349
+ valueBytes: tileByteCountsBytes,
204
350
  };
205
- const allTags = [...userTags, stripOffsetsTag, stripByteCountsTag];
351
+ const allTags = [...userTags, tileOffsetsTag, tileByteCountsTag];
206
352
  // Add SubIFDs tag if there are SubIFDs
207
353
  const subIfdInfos = (ifd.subIfds ?? []).map(resolveIfdInfo);
208
354
  if (subIfdInfos.length > 0) {
209
355
  const subIfdsTag = {
210
356
  tag: TAG_SUB_IFDS,
211
- type: TIFF_TYPE_LONG,
357
+ type: fmt.offsetType,
212
358
  count: subIfdInfos.length,
213
- valueBytes: new Uint8Array(subIfdInfos.length * 4), // placeholder offsets
359
+ valueBytes: new Uint8Array(subIfdInfos.length * fmt.offsetSize),
214
360
  };
215
361
  allTags.push(subIfdsTag);
216
362
  }
@@ -218,42 +364,41 @@ function placeIfds(ifds) {
218
364
  allTags.sort((a, b) => a.tag - b.tag);
219
365
  return {
220
366
  tags: allTags,
221
- strips: ifd.strips,
367
+ tiles: ifd.tiles,
222
368
  subIfdInfos,
223
- entryBlockSize: ifdEntryBlockSize(allTags.length),
224
- overflow: overflowSize(allTags),
225
- stripSize: totalStripSize(ifd.strips),
369
+ entryBlockSize: ifdEntryBlockSize(allTags.length, fmt),
370
+ overflow: overflowSize(allTags, fmt),
371
+ tileSize: totalTileSize(ifd.tiles),
226
372
  };
227
373
  }
228
374
  const mainInfos = ifds.map(resolveIfdInfo);
229
- // Second pass: place IFDs sequentially
230
- let cursor = 8; // Start after TIFF header
375
+ // Place IFDs sequentially
376
+ let cursor = fmt.headerSize;
231
377
  function placeIfdInfo(info) {
232
378
  const ifdOffset = cursor;
233
379
  cursor += info.entryBlockSize;
234
380
  const overflowOffset = cursor;
235
381
  cursor += info.overflow;
236
- const stripDataOffset = cursor;
237
- cursor += info.stripSize;
382
+ const tileDataOffset = cursor;
383
+ cursor += info.tileSize;
238
384
  const placed = {
239
385
  ifdOffset,
240
386
  tags: info.tags,
241
387
  overflowOffset,
242
388
  overflowSize: info.overflow,
243
- stripDataOffset,
244
- strips: info.strips,
245
- subIfds: [], // will be filled after SubIFD placement
246
- nextIfdOffset: 0, // will be patched below for main chain
389
+ tileDataOffset,
390
+ tiles: info.tiles,
391
+ subIfds: [],
392
+ nextIfdOffset: 0,
247
393
  };
248
394
  info.placed = placed;
249
395
  allPlaced.push(placed);
250
- // Place SubIFDs immediately after this IFD's strip data
396
+ // Place SubIFDs immediately after this IFD's tile data
251
397
  for (const subInfo of info.subIfdInfos) {
252
398
  placed.subIfds.push(placeIfdInfo(subInfo));
253
399
  }
254
400
  return placed;
255
401
  }
256
- // Place main chain IFDs (SubIFDs are placed within each main IFD's placeIfdInfo call)
257
402
  const mainPlaced = [];
258
403
  for (let i = 0; i < mainInfos.length; i++) {
259
404
  mainPlaced.push(placeIfdInfo(mainInfos[i]));
@@ -265,66 +410,112 @@ function placeIfds(ifds) {
265
410
  return allPlaced;
266
411
  }
267
412
  /** Compute total file size from placed IFDs. */
268
- function computeTotalSize(placed) {
413
+ function computeTotalSize(placed, fmt) {
269
414
  if (placed.length === 0)
270
- return 8;
271
- let maxEnd = 8;
415
+ return fmt.headerSize;
416
+ let maxEnd = fmt.headerSize;
272
417
  for (const p of placed) {
273
- const end = p.stripDataOffset + totalStripSize(p.strips);
418
+ const end = p.tileDataOffset + totalTileSize(p.tiles);
274
419
  if (end > maxEnd)
275
420
  maxEnd = end;
276
421
  }
277
422
  return maxEnd;
278
423
  }
279
- /** Write a single placed IFD (and its SubIFDs) into the buffer. */
280
- function writeIfd(view, buffer, placed) {
424
+ /** Write a single placed IFD into the buffer. */
425
+ function writeIfd(view, buffer, placed, fmt) {
281
426
  let pos = placed.ifdOffset;
427
+ const isBig = fmt.magic === 43;
282
428
  // Write entry count
283
- view.setUint16(pos, placed.tags.length, true);
284
- pos += 2;
285
- // Compute strip offsets for this IFD
286
- const stripOffsets = [];
287
- let stripCursor = placed.stripDataOffset;
288
- for (const strip of placed.strips) {
289
- stripOffsets.push(stripCursor);
290
- stripCursor += strip.length;
429
+ if (isBig) {
430
+ setBigUint64(view, pos, placed.tags.length);
431
+ pos += 8;
432
+ }
433
+ else {
434
+ view.setUint16(pos, placed.tags.length, true);
435
+ pos += 2;
436
+ }
437
+ // Compute tile offsets for this IFD
438
+ const tileOffsets = [];
439
+ let tileCursor = placed.tileDataOffset;
440
+ for (const tile of placed.tiles) {
441
+ tileOffsets.push(tileCursor);
442
+ tileCursor += tile.length;
291
443
  }
292
444
  // Compute SubIFD offsets
293
445
  const subIfdOffsets = placed.subIfds.map((s) => s.ifdOffset);
294
446
  // Track overflow cursor
295
447
  let overflowCursor = placed.overflowOffset;
296
- // Write each tag entry (12 bytes each)
448
+ // Determine which offset/bytecount tag numbers are in play
449
+ const isOffsetTag = (t) => t === TAG_TILE_OFFSETS || t === TAG_STRIP_OFFSETS;
450
+ const isByteCountTag = (t) => t === TAG_TILE_BYTE_COUNTS || t === TAG_STRIP_BYTE_COUNTS;
451
+ // Write each tag entry
297
452
  for (const tag of placed.tags) {
298
- view.setUint16(pos, tag.tag, true);
299
- view.setUint16(pos + 2, tag.type, true);
300
- view.setUint32(pos + 4, tag.count, true);
453
+ if (isBig) {
454
+ view.setUint16(pos, tag.tag, true);
455
+ view.setUint16(pos + 2, tag.type, true);
456
+ setBigUint64(view, pos + 4, tag.count);
457
+ }
458
+ else {
459
+ view.setUint16(pos, tag.tag, true);
460
+ view.setUint16(pos + 2, tag.type, true);
461
+ view.setUint32(pos + 4, tag.count, true);
462
+ }
463
+ const valueFieldOffset = isBig ? pos + 12 : pos + 8;
301
464
  // Determine the value bytes to write
302
465
  let valueBytes = tag.valueBytes;
303
- // Patch StripOffsets
304
- if (tag.tag === TAG_STRIP_OFFSETS) {
305
- valueBytes = new Uint8Array(stripOffsets.length * 4);
466
+ // Patch offset tags
467
+ if (isOffsetTag(tag.tag)) {
468
+ valueBytes = new Uint8Array(tileOffsets.length * fmt.offsetSize);
306
469
  const dv = new DataView(valueBytes.buffer, valueBytes.byteOffset, valueBytes.byteLength);
307
- for (let i = 0; i < stripOffsets.length; i++) {
308
- dv.setUint32(i * 4, stripOffsets[i], true);
470
+ for (let i = 0; i < tileOffsets.length; i++) {
471
+ if (fmt.offsetSize === 8) {
472
+ setBigUint64(dv, i * 8, tileOffsets[i]);
473
+ }
474
+ else {
475
+ dv.setUint32(i * 4, tileOffsets[i], true);
476
+ }
477
+ }
478
+ }
479
+ // Patch byte count tags — recompute from actual tile sizes
480
+ if (isByteCountTag(tag.tag)) {
481
+ valueBytes = new Uint8Array(placed.tiles.length * fmt.offsetSize);
482
+ const dv = new DataView(valueBytes.buffer, valueBytes.byteOffset, valueBytes.byteLength);
483
+ for (let i = 0; i < placed.tiles.length; i++) {
484
+ if (fmt.offsetSize === 8) {
485
+ setBigUint64(dv, i * 8, placed.tiles[i].length);
486
+ }
487
+ else {
488
+ dv.setUint32(i * 4, placed.tiles[i].length, true);
489
+ }
309
490
  }
310
491
  }
311
492
  // Patch SubIFDs offsets
312
493
  if (tag.tag === TAG_SUB_IFDS && subIfdOffsets.length > 0) {
313
- valueBytes = new Uint8Array(subIfdOffsets.length * 4);
494
+ valueBytes = new Uint8Array(subIfdOffsets.length * fmt.offsetSize);
314
495
  const dv = new DataView(valueBytes.buffer, valueBytes.byteOffset, valueBytes.byteLength);
315
496
  for (let i = 0; i < subIfdOffsets.length; i++) {
316
- dv.setUint32(i * 4, subIfdOffsets[i], true);
497
+ if (fmt.offsetSize === 8) {
498
+ setBigUint64(dv, i * 8, subIfdOffsets[i]);
499
+ }
500
+ else {
501
+ dv.setUint32(i * 4, subIfdOffsets[i], true);
502
+ }
317
503
  }
318
504
  }
319
- if (valueBytes.length <= 4) {
320
- // Inline: write value bytes directly in the 4-byte value/offset field
321
- const dest = new Uint8Array(buffer, pos + 8, 4);
505
+ if (valueBytes.length <= fmt.inlineThreshold) {
506
+ // Inline: write value bytes directly in the value/offset field
507
+ const dest = new Uint8Array(buffer, valueFieldOffset, fmt.inlineThreshold);
322
508
  dest.fill(0);
323
509
  dest.set(valueBytes);
324
510
  }
325
511
  else {
326
512
  // Overflow: write offset to overflow area, then write bytes there
327
- view.setUint32(pos + 8, overflowCursor, true);
513
+ if (fmt.offsetSize === 8) {
514
+ setBigUint64(view, valueFieldOffset, overflowCursor);
515
+ }
516
+ else {
517
+ view.setUint32(valueFieldOffset, overflowCursor, true);
518
+ }
328
519
  const dest = new Uint8Array(buffer, overflowCursor, valueBytes.length);
329
520
  dest.set(valueBytes);
330
521
  overflowCursor += valueBytes.length;
@@ -332,22 +523,37 @@ function writeIfd(view, buffer, placed) {
332
523
  if (valueBytes.length % 2 !== 0)
333
524
  overflowCursor += 1;
334
525
  }
335
- pos += 12;
526
+ pos += fmt.ifdEntrySize;
336
527
  }
337
528
  // Write next IFD offset
338
- view.setUint32(pos, placed.nextIfdOffset, true);
339
- // Write strip data
340
- let stripPos = placed.stripDataOffset;
341
- for (const strip of placed.strips) {
342
- const dest = new Uint8Array(buffer, stripPos, strip.length);
343
- dest.set(strip);
344
- stripPos += strip.length;
529
+ if (isBig) {
530
+ setBigUint64(view, pos, placed.nextIfdOffset);
531
+ }
532
+ else {
533
+ view.setUint32(pos, placed.nextIfdOffset, true);
534
+ }
535
+ // Write tile data
536
+ let tilePos = placed.tileDataOffset;
537
+ for (const tile of placed.tiles) {
538
+ const dest = new Uint8Array(buffer, tilePos, tile.length);
539
+ dest.set(tile);
540
+ tilePos += tile.length;
345
541
  }
346
- // SubIFDs are already in allPlaced and will be written by the caller's loop
347
542
  }
348
543
  // ── Convenience helpers for building IFD tags ───────────────────────
349
- /** Create a standard set of tags for a grayscale image plane. */
350
- export function makeImageTags(width, height, bitsPerSample, sampleFormat, compression = "none", imageDescription, isSubResolution) {
544
+ /**
545
+ * Create a standard set of tags for a tiled grayscale image plane.
546
+ *
547
+ * @param width - Image width in pixels.
548
+ * @param height - Image height in pixels.
549
+ * @param bitsPerSample - Bits per sample (8, 16, 32, 64).
550
+ * @param sampleFormat - TIFF SampleFormat (1=uint, 2=int, 3=float).
551
+ * @param compression - Compression type. Default: "none".
552
+ * @param imageDescription - Optional OME-XML string for the first IFD.
553
+ * @param isSubResolution - Whether this is a SubIFD (sets NewSubfileType=1).
554
+ * @param tileSize - Tile width and height. Default: 256. Use 0 for strip-based.
555
+ */
556
+ export function makeImageTags(width, height, bitsPerSample, sampleFormat, compression = "none", imageDescription, isSubResolution, tileSize = DEFAULT_TILE_SIZE) {
351
557
  const tags = [];
352
558
  if (isSubResolution) {
353
559
  tags.push({ tag: TAG_NEW_SUBFILE_TYPE, type: TIFF_TYPE_LONG, values: [1] });
@@ -362,12 +568,73 @@ export function makeImageTags(width, height, bitsPerSample, sampleFormat, compre
362
568
  });
363
569
  tags.push({ tag: TAG_PHOTOMETRIC, type: TIFF_TYPE_SHORT, values: [1] }); // MinIsBlack
364
570
  tags.push({ tag: TAG_SAMPLES_PER_PIXEL, type: TIFF_TYPE_SHORT, values: [1] });
365
- tags.push({ tag: TAG_ROWS_PER_STRIP, type: TIFF_TYPE_LONG, values: [height] }); // single strip
366
571
  tags.push({ tag: TAG_PLANAR_CONFIGURATION, type: TIFF_TYPE_SHORT, values: [1] }); // chunky
367
572
  tags.push({ tag: TAG_SAMPLE_FORMAT, type: TIFF_TYPE_SHORT, values: [sampleFormat] });
573
+ if (tileSize > 0 && (width > tileSize || height > tileSize)) {
574
+ // Tiled layout
575
+ tags.push({ tag: TAG_TILE_WIDTH, type: TIFF_TYPE_LONG, values: [tileSize] });
576
+ tags.push({ tag: TAG_TILE_LENGTH, type: TIFF_TYPE_LONG, values: [tileSize] });
577
+ }
578
+ else {
579
+ // Strip layout (single strip = entire plane) for small images
580
+ tags.push({ tag: TAG_ROWS_PER_STRIP, type: TIFF_TYPE_LONG, values: [height] });
581
+ }
368
582
  if (imageDescription) {
369
583
  tags.push({ tag: TAG_IMAGE_DESCRIPTION, type: TIFF_TYPE_ASCII, values: imageDescription });
370
584
  }
371
585
  return tags;
372
586
  }
587
+ /**
588
+ * Slice a 2D pixel plane into tiles suitable for TIFF tiled output.
589
+ *
590
+ * Tiles that extend beyond the image boundary are zero-padded to the
591
+ * full tile size (required by the TIFF spec for tiled images).
592
+ *
593
+ * @param planeBytes - Raw pixel data for the entire plane (row-major, little-endian).
594
+ * @param width - Image width in pixels.
595
+ * @param height - Image height in pixels.
596
+ * @param bytesPerPixel - Bytes per pixel (e.g. 2 for uint16).
597
+ * @param tileW - Tile width in pixels.
598
+ * @param tileH - Tile height in pixels.
599
+ * @returns Array of tile buffers, in row-major tile order (left-to-right, top-to-bottom).
600
+ */
601
+ export function sliceTiles(planeBytes, width, height, bytesPerPixel, tileW, tileH) {
602
+ const tilesX = Math.ceil(width / tileW);
603
+ const tilesY = Math.ceil(height / tileH);
604
+ const tiles = [];
605
+ const rowBytes = width * bytesPerPixel;
606
+ const tileRowBytes = tileW * bytesPerPixel;
607
+ const tileBytes = tileW * tileH * bytesPerPixel;
608
+ for (let ty = 0; ty < tilesY; ty++) {
609
+ for (let tx = 0; tx < tilesX; tx++) {
610
+ const tile = new Uint8Array(tileBytes); // zero-filled (handles padding)
611
+ const startY = ty * tileH;
612
+ const startX = tx * tileW;
613
+ // Number of valid rows/cols in this tile
614
+ const validRows = Math.min(tileH, height - startY);
615
+ const validCols = Math.min(tileW, width - startX);
616
+ const validRowBytes = validCols * bytesPerPixel;
617
+ for (let row = 0; row < validRows; row++) {
618
+ const srcOffset = (startY + row) * rowBytes + startX * bytesPerPixel;
619
+ const dstOffset = row * tileRowBytes;
620
+ tile.set(planeBytes.subarray(srcOffset, srcOffset + validRowBytes), dstOffset);
621
+ }
622
+ tiles.push(tile);
623
+ }
624
+ }
625
+ return tiles;
626
+ }
627
+ // ── BigTIFF helpers ─────────────────────────────────────────────────
628
+ /**
629
+ * Write a 64-bit unsigned integer to a DataView at the given offset.
630
+ * Uses two 32-bit writes since DataView.setBigUint64 may not be
631
+ * available in all environments.
632
+ */
633
+ function setBigUint64(view, offset, value) {
634
+ // Split into low 32 bits and high 32 bits (little-endian)
635
+ const lo = value >>> 0;
636
+ const hi = (value / 0x1_0000_0000) >>> 0;
637
+ view.setUint32(offset, lo, true);
638
+ view.setUint32(offset + 4, hi, true);
639
+ }
373
640
  //# sourceMappingURL=tiff-writer.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"tiff-writer.js","sourceRoot":"","sources":["../src/tiff-writer.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"tiff-writer.js","sourceRoot":"","sources":["../src/tiff-writer.ts"],"names":[],"mappings":"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"}
package/dist/write.d.ts CHANGED
@@ -2,8 +2,9 @@
2
2
  * High-level OME-TIFF writer.
3
3
  *
4
4
  * Converts an ngff-zarr Multiscales object to a complete OME-TIFF file
5
- * as an ArrayBuffer. Supports multi-resolution pyramids (via SubIFDs)
6
- * and optional deflate compression.
5
+ * as an ArrayBuffer. Supports multi-resolution pyramids (via SubIFDs),
6
+ * tiled output, deflate compression, parallel plane reading, and
7
+ * automatic BigTIFF detection.
7
8
  *
8
9
  * @example
9
10
  * ```ts
@@ -41,6 +42,28 @@ export interface WriteOptions {
41
42
  creator?: string;
42
43
  /** Image name. Falls back to multiscales.metadata.name or "image". */
43
44
  imageName?: string;
45
+ /**
46
+ * Tile size in pixels. Images larger than this in either dimension
47
+ * will use tiled output. Must be a multiple of 16.
48
+ * Default: 256 (OME-TIFF convention).
49
+ * Set to 0 to disable tiling (strip-based output).
50
+ */
51
+ tileSize?: number;
52
+ /**
53
+ * Maximum number of planes to read concurrently.
54
+ * Higher values use more memory but can speed up writes when
55
+ * reading from async data sources.
56
+ * Default: 4.
57
+ */
58
+ concurrency?: number;
59
+ /**
60
+ * TIFF format to use.
61
+ * - "auto": Classic TIFF when possible, BigTIFF for files > 4 GB.
62
+ * - "classic": Force classic TIFF (fails if file > 4 GB).
63
+ * - "bigtiff": Force BigTIFF (64-bit offsets).
64
+ * Default: "auto".
65
+ */
66
+ format?: "auto" | "classic" | "bigtiff";
44
67
  }
45
68
  /**
46
69
  * Convert an ngff-zarr Multiscales to an OME-TIFF ArrayBuffer.
@@ -50,6 +73,9 @@ export interface WriteOptions {
50
73
  * level goes in the main IFD chain; lower-resolution levels
51
74
  * are attached as SubIFDs to each corresponding main IFD.
52
75
  *
76
+ * Planes are read with bounded concurrency and tiles are compressed
77
+ * eagerly to minimise peak memory.
78
+ *
53
79
  * @param multiscales - The ngff-zarr Multiscales object to write.
54
80
  * @param options - Writer options.
55
81
  * @returns A complete OME-TIFF file as an ArrayBuffer.
@@ -1 +1 @@
1
- {"version":3,"file":"write.d.ts","sourceRoot":"","sources":["../src/write.ts"],"names":[],"mappings":"AAGA;;;;;;;;;;;;;;;GAeG;AAEH,OAAO,KAAK,EAAE,WAAW,EAAa,MAAM,wBAAwB,CAAC;AAcrE,uCAAuC;AACvC,MAAM,WAAW,YAAY;IAC3B;;;;OAIG;IACH,cAAc,CAAC,EACX,OAAO,GACP,OAAO,GACP,OAAO,GACP,OAAO,GACP,OAAO,GACP,OAAO,CAAC;IAEZ;;;;;OAKG;IACH,WAAW,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IAEjC;;;;;OAKG;IACH,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAE1B,+DAA+D;IAC/D,OAAO,CAAC,EAAE,MAAM,CAAC;IAEjB,sEAAsE;IACtE,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED;;;;;;;;;;;GAWG;AACH,wBAAsB,SAAS,CAC7B,WAAW,EAAE,WAAW,EACxB,OAAO,GAAE,YAAiB,GACzB,OAAO,CAAC,WAAW,CAAC,CAqFtB"}
1
+ {"version":3,"file":"write.d.ts","sourceRoot":"","sources":["../src/write.ts"],"names":[],"mappings":"AAGA;;;;;;;;;;;;;;;;GAgBG;AAEH,OAAO,KAAK,EAAE,WAAW,EAAa,MAAM,wBAAwB,CAAC;AAerE,uCAAuC;AACvC,MAAM,WAAW,YAAY;IAC3B;;;;OAIG;IACH,cAAc,CAAC,EACX,OAAO,GACP,OAAO,GACP,OAAO,GACP,OAAO,GACP,OAAO,GACP,OAAO,CAAC;IAEZ;;;;;OAKG;IACH,WAAW,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IAEjC;;;;;OAKG;IACH,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAE1B,+DAA+D;IAC/D,OAAO,CAAC,EAAE,MAAM,CAAC;IAEjB,sEAAsE;IACtE,SAAS,CAAC,EAAE,MAAM,CAAC;IAEnB;;;;;OAKG;IACH,QAAQ,CAAC,EAAE,MAAM,CAAC;IAElB;;;;;OAKG;IACH,WAAW,CAAC,EAAE,MAAM,CAAC;IAErB;;;;;;OAMG;IACH,MAAM,CAAC,EAAE,MAAM,GAAG,SAAS,GAAG,SAAS,CAAC;CACzC;AAED;;;;;;;;;;;;;;GAcG;AACH,wBAAsB,SAAS,CAC7B,WAAW,EAAE,WAAW,EACxB,OAAO,GAAE,YAAiB,GACzB,OAAO,CAAC,WAAW,CAAC,CAuFtB"}
package/dist/write.js CHANGED
@@ -3,7 +3,7 @@
3
3
  import * as zarr from "zarrita";
4
4
  import { zarrToTiffDtype, bytesPerElement } from "./dtypes.js";
5
5
  import { buildOmeXml, extractDimensions } from "./ome-xml-writer.js";
6
- import { buildTiff, makeImageTags, } from "./tiff-writer.js";
6
+ import { buildTiff, makeImageTags, sliceTiles, DEFAULT_TILE_SIZE, } from "./tiff-writer.js";
7
7
  /**
8
8
  * Convert an ngff-zarr Multiscales to an OME-TIFF ArrayBuffer.
9
9
  *
@@ -12,6 +12,9 @@ import { buildTiff, makeImageTags, } from "./tiff-writer.js";
12
12
  * level goes in the main IFD chain; lower-resolution levels
13
13
  * are attached as SubIFDs to each corresponding main IFD.
14
14
  *
15
+ * Planes are read with bounded concurrency and tiles are compressed
16
+ * eagerly to minimise peak memory.
17
+ *
15
18
  * @param multiscales - The ngff-zarr Multiscales object to write.
16
19
  * @param options - Writer options.
17
20
  * @returns A complete OME-TIFF file as an ArrayBuffer.
@@ -20,6 +23,9 @@ export async function toOmeTiff(multiscales, options = {}) {
20
23
  const dimensionOrder = options.dimensionOrder ?? "XYZCT";
21
24
  const compression = options.compression ?? "deflate";
22
25
  const compressionLevel = options.compressionLevel ?? 6;
26
+ const tileSize = options.tileSize ?? DEFAULT_TILE_SIZE;
27
+ const concurrency = options.concurrency ?? 4;
28
+ const format = options.format ?? "auto";
23
29
  const fullResImage = multiscales.images[0];
24
30
  const dtype = fullResImage.data.dtype;
25
31
  const dims = extractDimensions(multiscales);
@@ -31,51 +37,59 @@ export async function toOmeTiff(multiscales, options = {}) {
31
37
  creator: options.creator,
32
38
  imageName: options.imageName,
33
39
  });
34
- // Build a pseudo OmePixels for IFD index computation
35
- const pixels = {
36
- dimensionOrder: dimensionOrder,
37
- type: "",
38
- sizeX: dims.sizeX,
39
- sizeY: dims.sizeY,
40
- sizeZ: dims.sizeZ,
41
- sizeC: dims.sizeC,
42
- sizeT: dims.sizeT,
43
- bigEndian: false,
44
- interleaved: false,
45
- channels: [],
46
- };
47
40
  const totalPlanes = dims.sizeC * dims.sizeZ * dims.sizeT;
48
41
  const numLevels = multiscales.images.length;
49
- // Iterate planes in DimensionOrder order and build main IFDs
50
- const mainIfds = [];
51
- for (let ifdIdx = 0; ifdIdx < totalPlanes; ifdIdx++) {
52
- // Find the (c, z, t) that maps to this IFD index
42
+ // Build one IFD (with SubIFDs) for a given plane index.
43
+ const buildPlaneIfd = async (ifdIdx) => {
53
44
  const { c, z, t } = ifdIndexToPlane(ifdIdx, dims, dimensionOrder);
54
- // Read pixel data for full-resolution plane
55
- const stripData = await readPlane(fullResImage, dims, c, z, t, bpe);
56
- // Build tags
45
+ // Read + tile the full-resolution plane
46
+ const planeData = await readPlane(fullResImage, dims, c, z, t, bpe);
47
+ const mainTiles = slicePlane(planeData, dims.sizeX, dims.sizeY, bpe, tileSize);
57
48
  const isFirst = ifdIdx === 0;
58
49
  const tags = makeImageTags(dims.sizeX, dims.sizeY, tiffDtype.bitsPerSample, tiffDtype.sampleFormat, "none", // compression handled by buildTiff
59
- isFirst ? omeXml : undefined, false);
50
+ isFirst ? omeXml : undefined, false, tileSize);
60
51
  // Build SubIFDs for pyramid levels (if any)
61
52
  const subIfds = [];
62
53
  for (let level = 1; level < numLevels; level++) {
63
54
  const subImage = multiscales.images[level];
64
55
  const subDims = extractLevelDimensions(subImage, dims);
65
- const subStripData = await readPlane(subImage, subDims, c, z, t, bpe);
66
- const subTags = makeImageTags(subDims.sizeX, subDims.sizeY, tiffDtype.bitsPerSample, tiffDtype.sampleFormat, "none", // compression handled by buildTiff
67
- undefined, true);
68
- subIfds.push({ tags: subTags, strips: [subStripData] });
56
+ const subPlane = await readPlane(subImage, subDims, c, z, t, bpe);
57
+ const subTiles = slicePlane(subPlane, subDims.sizeX, subDims.sizeY, bpe, tileSize);
58
+ const subTags = makeImageTags(subDims.sizeX, subDims.sizeY, tiffDtype.bitsPerSample, tiffDtype.sampleFormat, "none", undefined, true, // isSubResolution
59
+ tileSize);
60
+ subIfds.push({ tags: subTags, tiles: subTiles });
69
61
  }
70
- mainIfds.push({
62
+ return {
71
63
  tags,
72
- strips: [stripData],
64
+ tiles: mainTiles,
73
65
  subIfds: subIfds.length > 0 ? subIfds : undefined,
74
- });
66
+ };
67
+ };
68
+ // Read planes with bounded concurrency
69
+ const mainIfds = new Array(totalPlanes);
70
+ const effectiveConcurrency = Math.max(1, Math.min(concurrency, totalPlanes));
71
+ for (let start = 0; start < totalPlanes; start += effectiveConcurrency) {
72
+ const end = Math.min(start + effectiveConcurrency, totalPlanes);
73
+ const batch = [];
74
+ for (let i = start; i < end; i++) {
75
+ batch.push(buildPlaneIfd(i).then((ifd) => { mainIfds[i] = ifd; }));
76
+ }
77
+ await Promise.all(batch);
75
78
  }
76
- return buildTiff(mainIfds, { compression, compressionLevel });
79
+ return buildTiff(mainIfds, { compression, compressionLevel, format });
77
80
  }
78
81
  // ── Internal helpers ────────────────────────────────────────────────
82
+ /**
83
+ * Slice a plane into tiles or return as a single strip.
84
+ * Decides based on whether the image is large enough to warrant tiling.
85
+ */
86
+ function slicePlane(planeBytes, width, height, bpe, tileSize) {
87
+ if (tileSize > 0 && (width > tileSize || height > tileSize)) {
88
+ return sliceTiles(planeBytes, width, height, bpe, tileSize, tileSize);
89
+ }
90
+ // Small image: single strip
91
+ return [planeBytes];
92
+ }
79
93
  /**
80
94
  * Map a linear IFD index back to (c, z, t) based on DimensionOrder.
81
95
  * This is the inverse of getIfdIndex.
package/dist/write.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"write.js","sourceRoot":"","sources":["../src/write.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"write.js","sourceRoot":"","sources":["../src/write.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@fideus-labs/fiff",
3
- "version": "0.2.0",
3
+ "version": "0.3.0",
4
4
  "description": "Present TIFF files as a zarrita.js Zarr store following the NGFF OME-Zarr data model",
5
5
  "type": "module",
6
6
  "main": "./dist/index.js",
@@ -40,7 +40,7 @@
40
40
  "prepublishOnly": "bun run build"
41
41
  },
42
42
  "dependencies": {
43
- "geotiff": "^3.0.4-beta.1",
43
+ "geotiff": "^3.0.3",
44
44
  "pako": "^2.1.0",
45
45
  "zarrita": "^0.6.1"
46
46
  },
@@ -54,7 +54,7 @@
54
54
  },
55
55
  "devDependencies": {
56
56
  "@fideus-labs/ngff-zarr": "^0.8.0",
57
- "@types/bun": "^1.2.15",
57
+ "@types/bun": "^1.3.9",
58
58
  "@types/pako": "^2.0.4",
59
59
  "typescript": "^5.9.3"
60
60
  }