@cogeotiff/core 9.2.0 → 9.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/CHANGELOG.md CHANGED
@@ -1,5 +1,20 @@
1
1
  # Changelog
2
2
 
3
+ ## [9.3.0](https://github.com/blacha/cogeotiff/compare/core-v9.2.0...core-v9.3.0) (2026-02-20)
4
+
5
+
6
+ ### Features
7
+
8
+ * Add Predictor enum ([#1412](https://github.com/blacha/cogeotiff/issues/1412)) ([d66d251](https://github.com/blacha/cogeotiff/commit/d66d251eda3c9a372aa3e24092fbf042e0097bb8))
9
+ * **core:** add default read size as a optional arg ([a025899](https://github.com/blacha/cogeotiff/commit/a0258994fd488237156949c579221fccc8ffc137))
10
+ * typed arrays for tile offset and byte counts ([#1410](https://github.com/blacha/cogeotiff/issues/1410)) ([733f066](https://github.com/blacha/cogeotiff/commit/733f066ac1d3177b70003c36c07eb776be5b170e))
11
+
12
+
13
+ ### Performance Improvements
14
+
15
+ * **core:** improve tile loading performance for big tiff ([9848601](https://github.com/blacha/cogeotiff/commit/9848601931004ea9f97c146af981605a4f71f32e))
16
+ * **core:** use the byte count array if it is loaded ([#1415](https://github.com/blacha/cogeotiff/issues/1415)) ([8f16769](https://github.com/blacha/cogeotiff/commit/8f16769e4f485510916e6807e2a2e2a5da9f70cf))
17
+
3
18
  ## [9.2.0](https://github.com/blacha/cogeotiff/compare/core-v9.1.2...core-v9.2.0) (2026-02-18)
4
19
 
5
20
 
@@ -2,6 +2,7 @@ import { readFile } from 'fs/promises';
2
2
  import { TiffTag } from '../index.js';
3
3
  import { Tiff } from '../tiff.js';
4
4
  import { SourceMemory } from './source.memory.js';
5
+ Tiff.DefaultReadSize = 64 * 1024;
5
6
  // console.log = console.trace;
6
7
  /** Read a tile from every image inside of a tiff 300 tiles read */
7
8
  async function main() {
@@ -15,9 +16,10 @@ async function main() {
15
16
  // 6 images
16
17
  for (const img of tiff.images)
17
18
  await img.getTile(0, 0);
19
+ const img = tiff.images[0];
18
20
  // Force loading all the byte arrays in which benchmarks the bulk array loading
19
- await tiff.images[0].fetch(TiffTag.TileByteCounts);
20
- await tiff.images[0].fetch(TiffTag.TileOffsets);
21
+ await img.fetch(TiffTag.TileByteCounts);
22
+ await img.fetch(TiffTag.TileOffsets);
21
23
  }
22
24
  }
23
25
  void main();
@@ -2,6 +2,10 @@ import type { Source } from '../source.js';
2
2
  export declare class TestFileSource implements Source {
3
3
  url: URL;
4
4
  data: Promise<Buffer>;
5
+ fetches: {
6
+ offset: number;
7
+ length: number;
8
+ }[];
5
9
  constructor(fileName: URL);
6
10
  fetch(offset: number, length: number): Promise<ArrayBuffer>;
7
11
  get size(): Promise<number>;
@@ -1 +1 @@
1
- {"version":3,"file":"source.file.d.ts","sourceRoot":"","sources":["../../src/__benchmark__/source.file.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,cAAc,CAAC;AAI3C,qBAAa,cAAe,YAAW,MAAM;IAC3C,GAAG,EAAE,GAAG,CAAC;IACT,IAAI,EAAE,OAAO,CAAC,MAAM,CAAC,CAAC;gBAEV,QAAQ,EAAE,GAAG;IAQnB,KAAK,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,WAAW,CAAC;IAKjE,IAAI,IAAI,IAAI,OAAO,CAAC,MAAM,CAAC,CAI1B;CACF"}
1
+ {"version":3,"file":"source.file.d.ts","sourceRoot":"","sources":["../../src/__benchmark__/source.file.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,cAAc,CAAC;AAI3C,qBAAa,cAAe,YAAW,MAAM;IAC3C,GAAG,EAAE,GAAG,CAAC;IACT,IAAI,EAAE,OAAO,CAAC,MAAM,CAAC,CAAC;IACtB,OAAO,EAAE;QAAE,MAAM,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,MAAM,CAAA;KAAE,EAAE,CAAM;gBAEvC,QAAQ,EAAE,GAAG;IAQnB,KAAK,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,WAAW,CAAC;IAMjE,IAAI,IAAI,IAAI,OAAO,CAAC,MAAM,CAAC,CAI1B;CACF"}
@@ -5,6 +5,7 @@ const gunzipP = promisify(gunzip);
5
5
  export class TestFileSource {
6
6
  url;
7
7
  data;
8
+ fetches = [];
8
9
  constructor(fileName) {
9
10
  this.url = fileName;
10
11
  this.data = readFile(this.url).then((buf) => {
@@ -15,6 +16,7 @@ export class TestFileSource {
15
16
  }
16
17
  async fetch(offset, length) {
17
18
  const fileData = await this.data;
19
+ this.fetches.push({ offset, length });
18
20
  return fileData.buffer.slice(fileData.byteOffset + offset, fileData.byteOffset + offset + length);
19
21
  }
20
22
  get size() {
@@ -24,6 +24,8 @@ describe('CogRead', () => {
24
24
  assert.equal(tiff.version, TiffVersion.Tiff);
25
25
  assert.equal(tiff.images.length, 1);
26
26
  const firstImage = tiff.images[0];
27
+ const byteCounts = await firstImage.fetch(TiffTag.TileByteCounts);
28
+ assert.deepEqual([...(byteCounts ?? [])], [511]);
27
29
  assert.equal(firstImage.compression, 'application/zstd');
28
30
  assert.equal(firstImage.isTiled(), true);
29
31
  const firstTile = await firstImage.getTile(0, 0);
@@ -37,6 +39,12 @@ describe('CogRead', () => {
37
39
  assert.equal(tiff.version, TiffVersion.BigTiff);
38
40
  assert.equal(tiff.images[0].epsg, null);
39
41
  validate(tiff);
42
+ const [byteCounts, tileOffsets] = await Promise.all([
43
+ tiff.images[0].fetch(TiffTag.TileByteCounts),
44
+ tiff.images[0].fetch(TiffTag.TileOffsets),
45
+ ]);
46
+ assert.deepEqual([...(byteCounts ?? [])], [196608]);
47
+ assert.deepEqual([...(tileOffsets ?? [])], [272]);
40
48
  });
41
49
  it('should fail reading a empty byte tiff', async () => {
42
50
  const source = new SourceMemory(Buffer.from(''));
@@ -66,6 +74,71 @@ describe('CogRead', () => {
66
74
  await tiff.init();
67
75
  assert.equal(tiff.images.length, 5);
68
76
  });
77
+ it('should read the byte count array if it is loaded', async () => {
78
+ const source = new TestFileSource(new URL('../../data/rgba8_cog.tiff', import.meta.url));
79
+ const fetchSize = 16 * 1024;
80
+ const tiff = new Tiff(source);
81
+ tiff.defaultReadSize = fetchSize;
82
+ await tiff.init();
83
+ assert.equal(source.fetches.length, 1);
84
+ assert.equal(source.fetches[0].length, fetchSize);
85
+ const img = tiff.images[0];
86
+ const byteCounts = img.tags.get(TiffTag.TileByteCounts);
87
+ const tileOffsets = img.tags.get(TiffTag.TileOffsets);
88
+ assert.equal(source.fetches.length, 1);
89
+ assert.equal(byteCounts.type, 'offset');
90
+ assert.equal(byteCounts.isLoaded, true);
91
+ assert.equal(tileOffsets.type, 'offset');
92
+ assert.equal(tileOffsets.isLoaded, true);
93
+ const tile = await img.getTile(0, 0);
94
+ assert.equal(tile?.bytes.byteLength, byteCounts.value[0]);
95
+ assert.equal(source.fetches.length, 2);
96
+ assert.deepEqual(source.fetches[1], { offset: tileOffsets.value[0], length: byteCounts.value[0] });
97
+ // force the offset to be unloaded
98
+ byteCounts.isLoaded = false;
99
+ const oldValue = byteCounts.value;
100
+ byteCounts.value = [];
101
+ const tileB = await img.getTile(0, 0);
102
+ assert.equal(tileB?.bytes.byteLength, oldValue[0]);
103
+ assert.equal(source.fetches.length, 4);
104
+ // Read the tile offset then the tile
105
+ assert.deepEqual(source.fetches[2], { offset: tileOffsets.value[0] - 4, length: 4 });
106
+ assert.deepEqual(source.fetches[3], { offset: tileOffsets.value[0], length: oldValue[0] });
107
+ });
108
+ it('should read the byte count array if it is loaded (BigTiff)', async () => {
109
+ const source = new TestFileSource(new URL('../../data/rgba8_cog_big.tiff', import.meta.url));
110
+ const fetchSize = 16 * 1024;
111
+ const tiff = new Tiff(source);
112
+ tiff.defaultReadSize = fetchSize;
113
+ await tiff.init();
114
+ assert.equal(source.fetches.length, 1);
115
+ assert.equal(source.fetches[0].length, fetchSize);
116
+ const img = tiff.images[0];
117
+ const byteCounts = img.tags.get(TiffTag.TileByteCounts);
118
+ const tileOffsets = img.tags.get(TiffTag.TileOffsets);
119
+ assert.equal(source.fetches.length, 1);
120
+ assert.equal(byteCounts.type, 'offset');
121
+ assert.equal(byteCounts.isLoaded, true);
122
+ assert.equal(byteCounts.view == null, true);
123
+ assert.equal(tileOffsets.type, 'offset');
124
+ assert.equal(tileOffsets.isLoaded, false);
125
+ assert.equal(tileOffsets.view == null, false);
126
+ const tile = await img.getTile(0, 0);
127
+ assert.equal(tile?.bytes.byteLength, byteCounts.value[0]);
128
+ assert.equal(source.fetches.length, 2);
129
+ assert.deepEqual(source.fetches[1], { offset: tileOffsets.value[0], length: byteCounts.value[0] });
130
+ // force the offset to be unloaded
131
+ byteCounts.isLoaded = false;
132
+ const oldValue = byteCounts.value;
133
+ byteCounts.value = [];
134
+ byteCounts.view = undefined;
135
+ const tileB = await img.getTile(0, 0);
136
+ assert.equal(tileB?.bytes.byteLength, oldValue[0]);
137
+ assert.equal(source.fetches.length, 4);
138
+ // Read the tile offset then the tile
139
+ assert.deepEqual(source.fetches[2], { offset: tileOffsets.value[0] - 4, length: 4 });
140
+ assert.deepEqual(source.fetches[3], { offset: tileOffsets.value[0], length: oldValue[0] });
141
+ });
69
142
  it('should read ifds from anywhere in the file', async () => {
70
143
  const source = new TestFileSource(new URL('../../data/DEM_BS28_2016_1000_1141.tif', import.meta.url));
71
144
  const tiff = await Tiff.create(source);
@@ -83,7 +156,8 @@ describe('CogRead', () => {
83
156
  assert.equal(im.noData, -9999);
84
157
  assert.equal(im.valueGeo(TiffTagGeo.GTCitationGeoKey), 'NZGD2000 / New Zealand Transverse Mercator 2000');
85
158
  assert.equal(im.valueGeo(TiffTagGeo.GeodeticCitationGeoKey), 'NZGD2000');
86
- assert.deepEqual(await im.fetch(TiffTag.StripByteCounts), [8064, 8064, 8064, 8064, 8064, 8064, 8064, 5040]);
159
+ const stripCount = await im.fetch(TiffTag.StripByteCounts);
160
+ assert.deepEqual([...(stripCount ?? [])], [8064, 8064, 8064, 8064, 8064, 8064, 8064, 5040]);
87
161
  });
88
162
  it('should read sub array ifds', async () => {
89
163
  const source = new TestFileSource(new URL('../../data/east_coast_phase3_2023_AY31_1000_3335.tif.gz', import.meta.url));
@@ -128,5 +202,11 @@ describe('CogRead', () => {
128
202
  const tiff = await Tiff.create(source);
129
203
  assert.equal(tiff.images.length, 5);
130
204
  assert.equal(tiff.images[0].epsg, 3857);
205
+ const [byteCounts, tileOffsets] = await Promise.all([
206
+ tiff.images[0].fetch(TiffTag.TileByteCounts),
207
+ tiff.images[0].fetch(TiffTag.TileOffsets),
208
+ ]);
209
+ assert.deepEqual([...(byteCounts ?? [])], [64, 64, 68, 64, 64, 68, 64, 64, 68, 64, 64, 64, 64, 64, 64, 68]);
210
+ assert.deepEqual([...(tileOffsets ?? [])], [797, 861, 925, 993, 1057, 1121, 1189, 1253, 1317, 1385, 1449, 1513, 1577, 1641, 1705, 1769]);
131
211
  });
132
212
  });
@@ -69,6 +69,13 @@ export declare enum PlanarConfiguration {
69
69
  /** separate planes of data */
70
70
  Separate = 2
71
71
  }
72
+ export declare enum Predictor {
73
+ None = 1,
74
+ /** Horizontal differencing */
75
+ Horizontal = 2,
76
+ /** Floating point */
77
+ FloatingPoint = 3
78
+ }
72
79
  export declare enum SampleFormat {
73
80
  /** Unsigned integer data */
74
81
  Uint = 1,
@@ -374,11 +381,11 @@ export interface TiffTagType {
374
381
  [TiffTag.Photometric]: Photometric;
375
382
  [TiffTag.TileWidth]: number;
376
383
  [TiffTag.TileHeight]: number;
377
- [TiffTag.TileOffsets]: number[];
378
- [TiffTag.TileByteCounts]: number[];
384
+ [TiffTag.TileOffsets]: number[] | Uint32Array | Uint16Array;
385
+ [TiffTag.TileByteCounts]: number[] | Uint32Array | Uint16Array;
379
386
  [TiffTag.JpegTables]: number[];
380
- [TiffTag.StripByteCounts]: number[];
381
- [TiffTag.StripOffsets]: number[];
387
+ [TiffTag.StripByteCounts]: number[] | Uint32Array | Uint16Array;
388
+ [TiffTag.StripOffsets]: number[] | Uint32Array | Uint16Array;
382
389
  [TiffTag.SamplesPerPixel]: number;
383
390
  [TiffTag.SampleFormat]: SampleFormat[];
384
391
  [TiffTag.GdalMetadata]: string;
@@ -391,6 +398,7 @@ export interface TiffTagType {
391
398
  [TiffTag.GeoAsciiParams]: string;
392
399
  [TiffTag.PlanarConfiguration]: PlanarConfiguration;
393
400
  [TiffTag.Orientation]: Orientation;
401
+ [TiffTag.Predictor]: Predictor;
394
402
  [TiffTag.LercParameters]: number[];
395
403
  [TiffTag.CellLength]: unknown;
396
404
  [TiffTag.CellWidth]: unknown;
@@ -427,7 +435,6 @@ export interface TiffTagType {
427
435
  [TiffTag.Indexed]: unknown;
428
436
  [TiffTag.PageName]: unknown;
429
437
  [TiffTag.PageNumber]: unknown;
430
- [TiffTag.Predictor]: unknown;
431
438
  [TiffTag.PrimaryChromaticities]: unknown;
432
439
  [TiffTag.ReferenceBlackWhite]: unknown;
433
440
  [TiffTag.SMinSampleValue]: unknown;
@@ -1 +1 @@
1
- {"version":3,"file":"tiff.tag.id.d.ts","sourceRoot":"","sources":["../../src/const/tiff.tag.id.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"tiff.tag.id.d.ts","sourceRoot":"","sources":["../../src/const/tiff.tag.id.ts"],"names":[],"mappings":"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"}
@@ -84,6 +84,14 @@ export var PlanarConfiguration;
84
84
  /** separate planes of data */
85
85
  PlanarConfiguration[PlanarConfiguration["Separate"] = 2] = "Separate";
86
86
  })(PlanarConfiguration || (PlanarConfiguration = {}));
87
+ export var Predictor;
88
+ (function (Predictor) {
89
+ Predictor[Predictor["None"] = 1] = "None";
90
+ /** Horizontal differencing */
91
+ Predictor[Predictor["Horizontal"] = 2] = "Horizontal";
92
+ /** Floating point */
93
+ Predictor[Predictor["FloatingPoint"] = 3] = "FloatingPoint";
94
+ })(Predictor || (Predictor = {}));
87
95
  export var SampleFormat;
88
96
  (function (SampleFormat) {
89
97
  /** Unsigned integer data */
package/build/index.d.ts CHANGED
@@ -1,13 +1,15 @@
1
1
  export { TiffEndian } from './const/tiff.endian.js';
2
2
  export { TiffCompressionMimeType as TiffCompression, TiffMimeType } from './const/tiff.mime.js';
3
3
  export type { TiffTagGeoType, TiffTagType } from './const/tiff.tag.id.js';
4
- export { AngularUnit, Compression, LinearUnit, ModelTypeCode, OldSubFileType, Orientation, Photometric, PlanarConfiguration, RasterTypeKey, SampleFormat, SubFileType, TiffTag, TiffTagGeo, } from './const/tiff.tag.id.js';
4
+ export { AngularUnit, Compression, LinearUnit, ModelTypeCode, OldSubFileType, Orientation, Photometric, PlanarConfiguration, Predictor, RasterTypeKey, SampleFormat, SubFileType, TiffTag, TiffTagGeo, } from './const/tiff.tag.id.js';
5
5
  export { TiffTagValueType } from './const/tiff.tag.value.js';
6
6
  export { TiffVersion } from './const/tiff.version.js';
7
7
  export type { Tag, TagInline, TagLazy, TagOffset } from './read/tiff.tag.js';
8
8
  export { getTiffTagSize } from './read/tiff.value.reader.js';
9
9
  export type { Source } from './source.js';
10
+ export type { TiffImageTileCount } from './tiff.image.js';
10
11
  export { TiffImage } from './tiff.image.js';
12
+ export type { TiffCreationOptions } from './tiff.js';
11
13
  export { Tiff } from './tiff.js';
12
14
  export { toHex } from './util/util.hex.js';
13
15
  export type { BoundingBox, Point, Size, Vector } from './vector.js';
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,wBAAwB,CAAC;AACpD,OAAO,EAAE,uBAAuB,IAAI,eAAe,EAAE,YAAY,EAAE,MAAM,sBAAsB,CAAC;AAChG,YAAY,EAAE,cAAc,EAAE,WAAW,EAAE,MAAM,wBAAwB,CAAC;AAE1E,OAAO,EACL,WAAW,EACX,WAAW,EACX,UAAU,EACV,aAAa,EACb,cAAc,EACd,WAAW,EACX,WAAW,EACX,mBAAmB,EACnB,aAAa,EACb,YAAY,EACZ,WAAW,EACX,OAAO,EACP,UAAU,GACX,MAAM,wBAAwB,CAAC;AAChC,OAAO,EAAE,gBAAgB,EAAE,MAAM,2BAA2B,CAAC;AAC7D,OAAO,EAAE,WAAW,EAAE,MAAM,yBAAyB,CAAC;AACtD,YAAY,EAAE,GAAG,EAAE,SAAS,EAAE,OAAO,EAAE,SAAS,EAAE,MAAM,oBAAoB,CAAC;AAC7E,OAAO,EAAE,cAAc,EAAE,MAAM,6BAA6B,CAAC;AAC7D,YAAY,EAAE,MAAM,EAAE,MAAM,aAAa,CAAC;AAC1C,OAAO,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAC;AAC5C,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AACjC,OAAO,EAAE,KAAK,EAAE,MAAM,oBAAoB,CAAC;AAC3C,YAAY,EAAE,WAAW,EAAE,KAAK,EAAE,IAAI,EAAE,MAAM,EAAE,MAAM,aAAa,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,wBAAwB,CAAC;AACpD,OAAO,EAAE,uBAAuB,IAAI,eAAe,EAAE,YAAY,EAAE,MAAM,sBAAsB,CAAC;AAChG,YAAY,EAAE,cAAc,EAAE,WAAW,EAAE,MAAM,wBAAwB,CAAC;AAE1E,OAAO,EACL,WAAW,EACX,WAAW,EACX,UAAU,EACV,aAAa,EACb,cAAc,EACd,WAAW,EACX,WAAW,EACX,mBAAmB,EACnB,SAAS,EACT,aAAa,EACb,YAAY,EACZ,WAAW,EACX,OAAO,EACP,UAAU,GACX,MAAM,wBAAwB,CAAC;AAChC,OAAO,EAAE,gBAAgB,EAAE,MAAM,2BAA2B,CAAC;AAC7D,OAAO,EAAE,WAAW,EAAE,MAAM,yBAAyB,CAAC;AACtD,YAAY,EAAE,GAAG,EAAE,SAAS,EAAE,OAAO,EAAE,SAAS,EAAE,MAAM,oBAAoB,CAAC;AAC7E,OAAO,EAAE,cAAc,EAAE,MAAM,6BAA6B,CAAC;AAC7D,YAAY,EAAE,MAAM,EAAE,MAAM,aAAa,CAAC;AAC1C,YAAY,EAAE,kBAAkB,EAAE,MAAM,iBAAiB,CAAC;AAC1D,OAAO,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAC;AAC5C,YAAY,EAAE,mBAAmB,EAAE,MAAM,WAAW,CAAC;AACrD,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AACjC,OAAO,EAAE,KAAK,EAAE,MAAM,oBAAoB,CAAC;AAC3C,YAAY,EAAE,WAAW,EAAE,KAAK,EAAE,IAAI,EAAE,MAAM,EAAE,MAAM,aAAa,CAAC"}
package/build/index.js CHANGED
@@ -1,7 +1,7 @@
1
1
  export { TiffEndian } from './const/tiff.endian.js';
2
2
  export { TiffCompressionMimeType as TiffCompression, TiffMimeType } from './const/tiff.mime.js';
3
3
  // Tag value constants
4
- export { AngularUnit, Compression, LinearUnit, ModelTypeCode, OldSubFileType, Orientation, Photometric, PlanarConfiguration, RasterTypeKey, SampleFormat, SubFileType, TiffTag, TiffTagGeo, } from './const/tiff.tag.id.js';
4
+ export { AngularUnit, Compression, LinearUnit, ModelTypeCode, OldSubFileType, Orientation, Photometric, PlanarConfiguration, Predictor, RasterTypeKey, SampleFormat, SubFileType, TiffTag, TiffTagGeo, } from './const/tiff.tag.id.js';
5
5
  export { TiffTagValueType } from './const/tiff.tag.value.js';
6
6
  export { TiffVersion } from './const/tiff.version.js';
7
7
  export { getTiffTagSize } from './read/tiff.value.reader.js';
@@ -0,0 +1,2 @@
1
+ export declare const isLittleEndian: boolean;
2
+ //# sourceMappingURL=endian.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"endian.d.ts","sourceRoot":"","sources":["../../src/read/endian.ts"],"names":[],"mappings":"AAKA,eAAO,MAAM,cAAc,SAAiB,CAAC"}
@@ -0,0 +1,5 @@
1
+ const buffer = new ArrayBuffer(4);
2
+ const uint32 = new Uint32Array(buffer);
3
+ const uint8 = new Uint8Array(buffer);
4
+ uint32[0] = 1;
5
+ export const isLittleEndian = uint8[0] === 1;
@@ -33,7 +33,7 @@ export interface TagInline<T> extends TagBase {
33
33
  export interface TagOffset extends TagBase {
34
34
  type: 'offset';
35
35
  /** Values of the offsets this is a sparse array unless @see {TagOffset.isLoaded} is true */
36
- value: number[];
36
+ value: number[] | Uint32Array | Uint16Array;
37
37
  /** Have all the values been read */
38
38
  isLoaded: boolean;
39
39
  /** Raw buffer of the values for lazy decoding, as reading 100,000s of uint64s can take quite a long time */
@@ -1 +1 @@
1
- {"version":3,"file":"tiff.tag.d.ts","sourceRoot":"","sources":["../../src/read/tiff.tag.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,yBAAyB,CAAC;AACvD,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,4BAA4B,CAAC;AACnE,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAC;AAE5D,0BAA0B;AAC1B,MAAM,MAAM,GAAG,CAAC,CAAC,GAAG,OAAO,IAAI,OAAO,CAAC,CAAC,CAAC,GAAG,SAAS,CAAC,CAAC,CAAC,GAAG,SAAS,CAAC;AAErE,MAAM,WAAW,OAAO;IACtB,oBAAoB;IACpB,EAAE,EAAE,OAAO,CAAC;IACZ,2BAA2B;IAC3B,IAAI,EAAE,MAAM,CAAC;IACb,sDAAsD;IACtD,SAAS,EAAE,MAAM,CAAC;IAClB,uBAAuB;IACvB,KAAK,EAAE,MAAM,CAAC;IACd,gDAAgD;IAChD,QAAQ,EAAE,gBAAgB,CAAC;CAC5B;AAED,2EAA2E;AAC3E,MAAM,WAAW,OAAO,CAAC,CAAC,CAAE,SAAQ,OAAO;IACzC,IAAI,EAAE,MAAM,CAAC;IACb,0CAA0C;IAC1C,KAAK,CAAC,EAAE,CAAC,CAAC;IACV,+CAA+C;IAC/C,UAAU,EAAE,MAAM,CAAC;CACpB;AAED,kEAAkE;AAClE,MAAM,WAAW,SAAS,CAAC,CAAC,CAAE,SAAQ,OAAO;IAC3C,IAAI,EAAE,QAAQ,CAAC;IACf,uBAAuB;IACvB,KAAK,EAAE,CAAC,CAAC;CACV;AAED,oEAAoE;AACpE,MAAM,WAAW,SAAU,SAAQ,OAAO;IACxC,IAAI,EAAE,QAAQ,CAAC;IACf,4FAA4F;IAC5F,KAAK,EAAE,MAAM,EAAE,CAAC;IAChB,oCAAoC;IACpC,QAAQ,EAAE,OAAO,CAAC;IAClB,4GAA4G;IAC5G,IAAI,CAAC,EAAE,cAAc,CAAC;IACtB,+CAA+C;IAC/C,UAAU,EAAE,MAAM,CAAC;CACpB"}
1
+ {"version":3,"file":"tiff.tag.d.ts","sourceRoot":"","sources":["../../src/read/tiff.tag.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,yBAAyB,CAAC;AACvD,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,4BAA4B,CAAC;AACnE,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAC;AAE5D,0BAA0B;AAC1B,MAAM,MAAM,GAAG,CAAC,CAAC,GAAG,OAAO,IAAI,OAAO,CAAC,CAAC,CAAC,GAAG,SAAS,CAAC,CAAC,CAAC,GAAG,SAAS,CAAC;AAErE,MAAM,WAAW,OAAO;IACtB,oBAAoB;IACpB,EAAE,EAAE,OAAO,CAAC;IACZ,2BAA2B;IAC3B,IAAI,EAAE,MAAM,CAAC;IACb,sDAAsD;IACtD,SAAS,EAAE,MAAM,CAAC;IAClB,uBAAuB;IACvB,KAAK,EAAE,MAAM,CAAC;IACd,gDAAgD;IAChD,QAAQ,EAAE,gBAAgB,CAAC;CAC5B;AAED,2EAA2E;AAC3E,MAAM,WAAW,OAAO,CAAC,CAAC,CAAE,SAAQ,OAAO;IACzC,IAAI,EAAE,MAAM,CAAC;IACb,0CAA0C;IAC1C,KAAK,CAAC,EAAE,CAAC,CAAC;IACV,+CAA+C;IAC/C,UAAU,EAAE,MAAM,CAAC;CACpB;AAED,kEAAkE;AAClE,MAAM,WAAW,SAAS,CAAC,CAAC,CAAE,SAAQ,OAAO;IAC3C,IAAI,EAAE,QAAQ,CAAC;IACf,uBAAuB;IACvB,KAAK,EAAE,CAAC,CAAC;CACV;AAED,oEAAoE;AACpE,MAAM,WAAW,SAAU,SAAQ,OAAO;IACxC,IAAI,EAAE,QAAQ,CAAC;IACf,4FAA4F;IAC5F,KAAK,EAAE,MAAM,EAAE,GAAG,WAAW,GAAG,WAAW,CAAC;IAC5C,oCAAoC;IACpC,QAAQ,EAAE,OAAO,CAAC;IAClB,4GAA4G;IAC5G,IAAI,CAAC,EAAE,cAAc,CAAC;IACtB,+CAA+C;IAC/C,UAAU,EAAE,MAAM,CAAC;CACpB"}
@@ -1,6 +1,18 @@
1
+ import { TiffTagValueType } from '../const/tiff.tag.value.js';
1
2
  import type { Tiff } from '../tiff.js';
2
3
  import type { DataViewOffset } from './data.view.offset.js';
3
4
  import type { Tag, TagLazy, TagOffset } from './tiff.tag.js';
5
+ /**
6
+ * Convert a tiff tag value to a typed array if the local endian matches the tiff endian
7
+ *
8
+ * @param tiff
9
+ * @param bytes
10
+ * @param offset Offset in the data view to read from
11
+ * @param length Number of bytes to read
12
+ * @param type type of tiff tag
13
+ * @returns the value if the type is a typed array and the endianness matches otherwise null
14
+ */
15
+ export declare function readTypedValue<T>(tiff: Tiff, bytes: DataView, offset: number, length: number, type: TiffTagValueType): T | null;
4
16
  /**
5
17
  * Determine if all the data for the tiff tag is loaded in and use that to create the specific CogTiffTag
6
18
  *
@@ -16,8 +28,9 @@ export declare function fetchLazy<T>(tag: TagLazy<T>, tiff: Tiff): Promise<T>;
16
28
  /**
17
29
  * Fetch all the values from a {@link TagOffset}
18
30
  */
19
- export declare function fetchAllOffsets(tiff: Tiff, tag: TagOffset): Promise<number[]>;
31
+ export declare function fetchAllOffsets(tiff: Tiff, tag: TagOffset): Promise<TagOffset['value']>;
20
32
  export declare function setBytes(tag: TagOffset, view: DataViewOffset): void;
21
33
  /** Partially fetch the values of a {@link TagOffset} and return the value for the offset */
22
34
  export declare function getValueAt(tiff: Tiff, tag: TagOffset, index: number): Promise<number>;
35
+ export declare function getValueAtSync(tiff: Tiff, tag: TagOffset, index: number): number | null;
23
36
  //# sourceMappingURL=tiff.tag.factory.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"tiff.tag.factory.d.ts","sourceRoot":"","sources":["../../src/read/tiff.tag.factory.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,YAAY,CAAC;AAEvC,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAC;AAE5D,OAAO,KAAK,EAAE,GAAG,EAAE,OAAO,EAAE,SAAS,EAAE,MAAM,eAAe,CAAC;AAuF7D;;;;;;;;GAQG;AACH,wBAAgB,SAAS,CAAC,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,cAAc,EAAE,MAAM,EAAE,MAAM,GAAG,GAAG,CAAC,OAAO,CAAC,CA4CxF;AAED,iDAAiD;AACjD,wBAAsB,SAAS,CAAC,CAAC,EAAE,GAAG,EAAE,OAAO,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,IAAI,GAAG,OAAO,CAAC,CAAC,CAAC,CAQ1E;AAED;;GAEG;AACH,wBAAsB,eAAe,CAAC,IAAI,EAAE,IAAI,EAAE,GAAG,EAAE,SAAS,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC,CAYnF;AAED,wBAAgB,QAAQ,CAAC,GAAG,EAAE,SAAS,EAAE,IAAI,EAAE,cAAc,GAAG,IAAI,CAKnE;AAED,4FAA4F;AAC5F,wBAAsB,UAAU,CAAC,IAAI,EAAE,IAAI,EAAE,GAAG,EAAE,SAAS,EAAE,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAoB3F"}
1
+ {"version":3,"file":"tiff.tag.factory.d.ts","sourceRoot":"","sources":["../../src/read/tiff.tag.factory.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,gBAAgB,EAAE,MAAM,4BAA4B,CAAC;AAC9D,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,YAAY,CAAC;AAEvC,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAC;AAG5D,OAAO,KAAK,EAAE,GAAG,EAAE,OAAO,EAAE,SAAS,EAAE,MAAM,eAAe,CAAC;AAoD7D;;;;;;;;;GASG;AACH,wBAAgB,cAAc,CAAC,CAAC,EAC9B,IAAI,EAAE,IAAI,EACV,KAAK,EAAE,QAAQ,EACf,MAAM,EAAE,MAAM,EACd,MAAM,EAAE,MAAM,EACd,IAAI,EAAE,gBAAgB,GACrB,CAAC,GAAG,IAAI,CAkBV;AAgDD;;;;;;;;GAQG;AACH,wBAAgB,SAAS,CAAC,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,cAAc,EAAE,MAAM,EAAE,MAAM,GAAG,GAAG,CAAC,OAAO,CAAC,CAqDxF;AAED,iDAAiD;AACjD,wBAAsB,SAAS,CAAC,CAAC,EAAE,GAAG,EAAE,OAAO,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,IAAI,GAAG,OAAO,CAAC,CAAC,CAAC,CAQ1E;AAED;;GAEG;AACH,wBAAsB,eAAe,CAAC,IAAI,EAAE,IAAI,EAAE,GAAG,EAAE,SAAS,GAAG,OAAO,CAAC,SAAS,CAAC,OAAO,CAAC,CAAC,CAa7F;AAED,wBAAgB,QAAQ,CAAC,GAAG,EAAE,SAAS,EAAE,IAAI,EAAE,cAAc,GAAG,IAAI,CAKnE;AAED,4FAA4F;AAC5F,wBAAsB,UAAU,CAAC,IAAI,EAAE,IAAI,EAAE,GAAG,EAAE,SAAS,EAAE,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAoB3F;AAED,wBAAgB,cAAc,CAAC,IAAI,EAAE,IAAI,EAAE,GAAG,EAAE,SAAS,EAAE,KAAK,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAUvF"}
@@ -3,6 +3,7 @@ import { TiffTag, TiffTagConvertArray } from '../const/tiff.tag.id.js';
3
3
  import { TiffTagValueType } from '../const/tiff.tag.value.js';
4
4
  import { getUint, getUint64 } from '../util/bytes.js';
5
5
  import { hasBytes } from './data.view.offset.js';
6
+ import { isLittleEndian } from './endian.js';
6
7
  import { getTiffTagSize } from './tiff.value.reader.js';
7
8
  function readTagValue(fieldType, bytes, offset, isLittleEndian) {
8
9
  switch (fieldType) {
@@ -36,6 +37,31 @@ function readTagValue(fieldType, bytes, offset, isLittleEndian) {
36
37
  throw new Error(`Unknown read type "${fieldType}" "${TiffTagValueType[fieldType]}"`);
37
38
  }
38
39
  }
40
+ /**
41
+ * Convert a tiff tag value to a typed array if the local endian matches the tiff endian
42
+ *
43
+ * @param tiff
44
+ * @param bytes
45
+ * @param offset Offset in the data view to read from
46
+ * @param length Number of bytes to read
47
+ * @param type type of tiff tag
48
+ * @returns the value if the type is a typed array and the endianness matches otherwise null
49
+ */
50
+ export function readTypedValue(tiff, bytes, offset, length, type) {
51
+ switch (type) {
52
+ case TiffTagValueType.Uint8:
53
+ return new Uint8Array(bytes.buffer.slice(bytes.byteOffset + offset, bytes.byteOffset + offset + length));
54
+ case TiffTagValueType.Uint16:
55
+ if (tiff.isLittleEndian !== isLittleEndian)
56
+ return null;
57
+ return new Uint16Array(bytes.buffer.slice(bytes.byteOffset + offset, bytes.byteOffset + offset + length));
58
+ case TiffTagValueType.Uint32:
59
+ if (tiff.isLittleEndian !== isLittleEndian)
60
+ return null;
61
+ return new Uint32Array(bytes.buffer.slice(bytes.byteOffset + offset, bytes.byteOffset + offset + length));
62
+ }
63
+ return null;
64
+ }
39
65
  function readValue(tiff, tagId, bytes, offset, type, count) {
40
66
  const typeSize = getTiffTagSize(type);
41
67
  const dataLength = count * typeSize;
@@ -51,6 +77,15 @@ function readValue(tiff, tagId, bytes, offset, type, count) {
51
77
  case TiffTagValueType.Ascii:
52
78
  return String.fromCharCode.apply(null, new Uint8Array(bytes.buffer, offset, dataLength - 1));
53
79
  }
80
+ // TODO should we convert all tag values to typed arrays if possible?
81
+ if (tagId === TiffTag.TileOffsets ||
82
+ tagId === TiffTag.TileByteCounts ||
83
+ tagId === TiffTag.StripOffsets ||
84
+ tagId === TiffTag.StripByteCounts) {
85
+ const typedOutput = readTypedValue(tiff, bytes, offset, dataLength, type);
86
+ if (typedOutput)
87
+ return typedOutput;
88
+ }
54
89
  const output = [];
55
90
  for (let i = 0; i < dataLength; i += typeSize) {
56
91
  output.push(readTagValue(type, bytes, offset + i, tiff.isLittleEndian));
@@ -94,9 +129,16 @@ export function createTag(tiff, view, offset) {
94
129
  value: [],
95
130
  tagOffset: offset,
96
131
  };
97
- // Some offsets are quite long and don't need to read them often, so only read the tags we are interested in when we need to
98
- if (tagId === TiffTag.TileOffsets && hasBytes(view, dataOffset, dataLength))
99
- setBytes(tag, view);
132
+ if (hasBytes(view, dataOffset, dataLength)) {
133
+ const val = readTypedValue(tiff, view, dataOffset - view.sourceOffset, dataLength, dataType);
134
+ if (val) {
135
+ tag.value = val;
136
+ tag.isLoaded = true;
137
+ }
138
+ else {
139
+ setBytes(tag, view);
140
+ }
141
+ }
100
142
  return tag;
101
143
  }
102
144
  // If we already have the bytes in the view read them in
@@ -128,6 +170,7 @@ export async function fetchAllOffsets(tiff, tag) {
128
170
  tag.view.sourceOffset = tag.dataOffset;
129
171
  }
130
172
  tag.value = readValue(tiff, tag.id, tag.view, 0, tag.dataType, tag.count);
173
+ tag.view = undefined;
131
174
  tag.isLoaded = true;
132
175
  return tag.value;
133
176
  }
@@ -161,3 +204,17 @@ export async function getValueAt(tiff, tag, index) {
161
204
  tag.value[index] = value;
162
205
  return value;
163
206
  }
207
+ export function getValueAtSync(tiff, tag, index) {
208
+ if (index > tag.count || index < 0)
209
+ throw new Error('TagOffset: out of bounds :' + index);
210
+ if (tag.value[index] != null)
211
+ return tag.value[index];
212
+ if (tag.view == null)
213
+ return null;
214
+ const dataTypeSize = getTiffTagSize(tag.dataType);
215
+ const value = readValue(tiff, undefined, tag.view, index * dataTypeSize, tag.dataType, 1);
216
+ if (typeof value !== 'number')
217
+ throw new Error('Value is not a number');
218
+ tag.value[index] = value;
219
+ return value;
220
+ }
package/build/tiff.d.ts CHANGED
@@ -3,6 +3,10 @@ import { TiffGhostOptions } from './read/tiff.gdal.js';
3
3
  import type { TiffIfdConfig } from './read/tiff.ifd.config.js';
4
4
  import type { Source } from './source.js';
5
5
  import { TiffImage } from './tiff.image.js';
6
+ export interface TiffCreationOptions {
7
+ /** When initializing the tiff, read data in blocks of this size (in KB) */
8
+ defaultReadSize: number;
9
+ }
6
10
  export declare class Tiff {
7
11
  /** Read 16KB blocks at a time */
8
12
  static DefaultReadSize: number;
@@ -24,9 +28,9 @@ export declare class Tiff {
24
28
  isInitialized: boolean;
25
29
  private _initPromise?;
26
30
  /** A Tiff constructed from a source will not be pre-initialized with {@link init}. */
27
- constructor(source: Source);
31
+ constructor(source: Source, options?: TiffCreationOptions);
28
32
  /** Create a tiff and initialize it by reading the tiff headers */
29
- static create(source: Source): Promise<Tiff>;
33
+ static create(source: Source, options?: TiffCreationOptions): Promise<Tiff>;
30
34
  /**
31
35
  * Initialize the tiff loading in the header and all image headers.
32
36
  *
@@ -1 +1 @@
1
- {"version":3,"file":"tiff.d.ts","sourceRoot":"","sources":["../src/tiff.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,WAAW,EAAE,MAAM,yBAAyB,CAAC;AAItD,OAAO,EAAE,gBAAgB,EAAE,MAAM,qBAAqB,CAAC;AACvD,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,2BAA2B,CAAC;AAG/D,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,aAAa,CAAC;AAC1C,OAAO,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAC;AAI5C,qBAAa,IAAI;IACf,iCAAiC;IACjC,MAAM,CAAC,eAAe,SAAa;IACnC,iCAAiC;IACjC,eAAe,SAAwB;IACvC,+CAA+C;IAC/C,MAAM,EAAE,MAAM,CAAC;IACf,wBAAwB;IACxB,OAAO,cAAoB;IAC3B,0CAA0C;IAC1C,MAAM,EAAE,SAAS,EAAE,CAAM;IACzB,2BAA2B;IAC3B,OAAO,CAAC,EAAE,gBAAgB,CAAC;IAC3B,4CAA4C;IAC5C,SAAS,EAAE,aAAa,CAAiB;IACzC,8CAA8C;IAC9C,cAAc,UAAS;IACvB,6BAA6B;IAC7B,aAAa,UAAS;IAEtB,OAAO,CAAC,YAAY,CAAC,CAAgB;IAErC,sFAAsF;gBAC1E,MAAM,EAAE,MAAM;IAI1B,kEAAkE;IAClE,MAAM,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAI5C;;;;;OAKG;IACH,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC;IAMrB;;;;OAIG;IACH,oBAAoB,CAAC,UAAU,EAAE,MAAM,GAAG,SAAS;IAoBnD,qEAAqE;YACvD,UAAU;IAgExB;;;;;OAKG;IACH,OAAO,CAAC,OAAO;CAsBhB"}
1
+ {"version":3,"file":"tiff.d.ts","sourceRoot":"","sources":["../src/tiff.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,WAAW,EAAE,MAAM,yBAAyB,CAAC;AAItD,OAAO,EAAE,gBAAgB,EAAE,MAAM,qBAAqB,CAAC;AACvD,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,2BAA2B,CAAC;AAG/D,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,aAAa,CAAC;AAC1C,OAAO,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAC;AAI5C,MAAM,WAAW,mBAAmB;IAClC,2EAA2E;IAC3E,eAAe,EAAE,MAAM,CAAC;CACzB;AAED,qBAAa,IAAI;IACf,iCAAiC;IACjC,MAAM,CAAC,eAAe,SAAa;IACnC,iCAAiC;IACjC,eAAe,SAAwB;IACvC,+CAA+C;IAC/C,MAAM,EAAE,MAAM,CAAC;IACf,wBAAwB;IACxB,OAAO,cAAoB;IAC3B,0CAA0C;IAC1C,MAAM,EAAE,SAAS,EAAE,CAAM;IACzB,2BAA2B;IAC3B,OAAO,CAAC,EAAE,gBAAgB,CAAC;IAC3B,4CAA4C;IAC5C,SAAS,EAAE,aAAa,CAAiB;IACzC,8CAA8C;IAC9C,cAAc,UAAS;IACvB,6BAA6B;IAC7B,aAAa,UAAS;IAEtB,OAAO,CAAC,YAAY,CAAC,CAAgB;IAErC,sFAAsF;gBAC1E,MAAM,EAAE,MAAM,EAAE,OAAO,GAAE,mBAA+D;IAKpG,kEAAkE;IAClE,MAAM,CAAC,MAAM,CACX,MAAM,EAAE,MAAM,EACd,OAAO,GAAE,mBAA+D,GACvE,OAAO,CAAC,IAAI,CAAC;IAIhB;;;;;OAKG;IACH,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC;IAMrB;;;;OAIG;IACH,oBAAoB,CAAC,UAAU,EAAE,MAAM,GAAG,SAAS;IAoBnD,qEAAqE;YACvD,UAAU;IAgExB;;;;;OAKG;IACH,OAAO,CAAC,OAAO;CAsBhB"}
@@ -235,6 +235,9 @@ export declare class TiffImage {
235
235
  hasTile(x: number, y: number): Promise<boolean>;
236
236
  /**
237
237
  * Load the offset and byteCount of a tile
238
+ *
239
+ * if the tiff is sparse, offset and byteCount will be zero if the tile is empty
240
+ *
238
241
  * @param index index in the tile array
239
242
  * @returns Offset and byteCount for the tile
240
243
  */
@@ -1 +1 @@
1
- {"version":3,"file":"tiff.image.d.ts","sourceRoot":"","sources":["../src/tiff.image.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"tiff.image.d.ts","sourceRoot":"","sources":["../src/tiff.image.ts"],"names":[],"mappings":"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"}
@@ -1,6 +1,6 @@
1
1
  import { getCompressionMimeType, TiffCompressionMimeType, TiffMimeType } from './const/tiff.mime.js';
2
2
  import { Compression, ModelTypeCode, SubFileType, TiffTag, TiffTagGeo } from './const/tiff.tag.id.js';
3
- import { fetchAllOffsets, fetchLazy, getValueAt } from './read/tiff.tag.factory.js';
3
+ import { fetchAllOffsets, fetchLazy, getValueAt, getValueAtSync } from './read/tiff.tag.factory.js';
4
4
  import { getUint } from './util/bytes.js';
5
5
  /** Invalid EPSG code */
6
6
  export const InvalidProjectionCode = 32767;
@@ -494,15 +494,25 @@ export class TiffImage {
494
494
  }
495
495
  /**
496
496
  * Load the offset and byteCount of a tile
497
+ *
498
+ * if the tiff is sparse, offset and byteCount will be zero if the tile is empty
499
+ *
497
500
  * @param index index in the tile array
498
501
  * @returns Offset and byteCount for the tile
499
502
  */
500
503
  async getTileSize(index) {
504
+ // If both the tile offset and tile byte counts are loaded,
505
+ // we can get the offset and byte count synchronously without needing to fetch any additional data
506
+ const byteCounts = this.tags.get(TiffTag.TileByteCounts);
507
+ const tileOffset = getOffsetSync(this.tiff, this.tileOffset, index);
508
+ const tileSize = getOffsetSync(this.tiff, byteCounts, index);
509
+ if (tileOffset != null && tileSize != null)
510
+ return { offset: tileOffset, imageSize: tileSize };
501
511
  // GDAL optimizes tiles by storing the size of the tile in
502
512
  // the few bytes leading up to the tile
503
513
  const leaderBytes = this.tiff.options?.tileLeaderByteSize;
504
514
  if (leaderBytes) {
505
- const offset = await getOffset(this.tiff, this.tileOffset, index);
515
+ const offset = tileOffset ?? (await getOffset(this.tiff, this.tileOffset, index));
506
516
  // Sparse tiff no data found
507
517
  if (offset === 0)
508
518
  return { offset: 0, imageSize: 0 };
@@ -511,17 +521,22 @@ export class TiffImage {
511
521
  const bytes = await this.tiff.source.fetch(offset - leaderBytes, leaderBytes);
512
522
  return { offset, imageSize: getUint(new DataView(bytes), 0, leaderBytes, this.tiff.isLittleEndian) };
513
523
  }
514
- const byteCounts = this.tags.get(TiffTag.TileByteCounts);
515
524
  if (byteCounts == null)
516
525
  throw new Error('No tile byte counts found');
517
526
  const [offset, imageSize] = await Promise.all([
518
- getOffset(this.tiff, this.tileOffset, index),
519
- getOffset(this.tiff, byteCounts, index),
527
+ tileOffset ?? getOffset(this.tiff, this.tileOffset, index),
528
+ tileSize ?? getOffset(this.tiff, byteCounts, index),
520
529
  ]);
521
530
  return { offset, imageSize };
522
531
  }
523
532
  }
524
533
  function getOffset(tiff, x, index) {
534
+ const val = getOffsetSync(tiff, x, index);
535
+ if (val != null)
536
+ return Promise.resolve(val);
537
+ return getValueAt(tiff, x, index);
538
+ }
539
+ function getOffsetSync(tiff, x, index) {
525
540
  if (index < 0) {
526
541
  throw new Error(`Tiff: ${tiff.source.url.href} out of bounds ${TiffTag[x.id]} index:${index} total:${x.count}`);
527
542
  }
@@ -530,5 +545,7 @@ function getOffset(tiff, x, index) {
530
545
  return 0;
531
546
  if (x.type === 'inline')
532
547
  return x.value[index];
533
- return getValueAt(tiff, x, index);
548
+ if (x.isLoaded)
549
+ return x.value[index];
550
+ return getValueAtSync(tiff, x, index);
534
551
  }
package/build/tiff.js CHANGED
@@ -28,12 +28,13 @@ export class Tiff {
28
28
  isInitialized = false;
29
29
  _initPromise;
30
30
  /** A Tiff constructed from a source will not be pre-initialized with {@link init}. */
31
- constructor(source) {
31
+ constructor(source, options = { defaultReadSize: Tiff.DefaultReadSize }) {
32
32
  this.source = source;
33
+ this.defaultReadSize = options.defaultReadSize;
33
34
  }
34
35
  /** Create a tiff and initialize it by reading the tiff headers */
35
- static create(source) {
36
- return new Tiff(source).init();
36
+ static create(source, options = { defaultReadSize: Tiff.DefaultReadSize }) {
37
+ return new Tiff(source, options).init();
37
38
  }
38
39
  /**
39
40
  * Initialize the tiff loading in the header and all image headers.
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@cogeotiff/core",
3
- "version": "9.2.0",
3
+ "version": "9.3.0",
4
4
  "repository": {
5
5
  "type": "git",
6
6
  "url": "https://github.com/blacha/cogeotiff.git",
@@ -23,5 +23,5 @@
23
23
  "publishConfig": {
24
24
  "access": "public"
25
25
  },
26
- "gitHead": "62a59096f2df47bd12cc969afdda1d90c31d679e"
26
+ "gitHead": "82b82e9d9f8996dfb0cb48827c143e134acc9865"
27
27
  }
@@ -4,6 +4,7 @@ import { TiffTag } from '../index.js';
4
4
  import { Tiff } from '../tiff.js';
5
5
  import { SourceMemory } from './source.memory.js';
6
6
 
7
+ Tiff.DefaultReadSize = 64 * 1024;
7
8
  // console.log = console.trace;
8
9
  /** Read a tile from every image inside of a tiff 300 tiles read */
9
10
  async function main(): Promise<void> {
@@ -18,9 +19,10 @@ async function main(): Promise<void> {
18
19
  // 6 images
19
20
  for (const img of tiff.images) await img.getTile(0, 0);
20
21
 
22
+ const img = tiff.images[0];
21
23
  // Force loading all the byte arrays in which benchmarks the bulk array loading
22
- await tiff.images[0].fetch(TiffTag.TileByteCounts);
23
- await tiff.images[0].fetch(TiffTag.TileOffsets);
24
+ await img.fetch(TiffTag.TileByteCounts);
25
+ await img.fetch(TiffTag.TileOffsets);
24
26
  }
25
27
  }
26
28
 
@@ -9,6 +9,7 @@ const gunzipP = promisify(gunzip);
9
9
  export class TestFileSource implements Source {
10
10
  url: URL;
11
11
  data: Promise<Buffer>;
12
+ fetches: { offset: number; length: number }[] = [];
12
13
 
13
14
  constructor(fileName: URL) {
14
15
  this.url = fileName;
@@ -20,6 +21,7 @@ export class TestFileSource implements Source {
20
21
 
21
22
  async fetch(offset: number, length: number): Promise<ArrayBuffer> {
22
23
  const fileData = await this.data;
24
+ this.fetches.push({ offset, length });
23
25
  return fileData.buffer.slice(fileData.byteOffset + offset, fileData.byteOffset + offset + length) as ArrayBuffer;
24
26
  }
25
27
 
@@ -7,7 +7,7 @@ import { SourceMemory } from '../__benchmark__/source.memory.js';
7
7
  import { TiffMimeType } from '../const/tiff.mime.js';
8
8
  import { Photometric, SampleFormat } from '../const/tiff.tag.id.js';
9
9
  import { TiffVersion } from '../const/tiff.version.js';
10
- import { TiffTag, TiffTagGeo } from '../index.js';
10
+ import { TagOffset, TiffTag, TiffTagGeo } from '../index.js';
11
11
  import { Tiff } from '../tiff.js';
12
12
 
13
13
  function validate(tif: Tiff): void {
@@ -30,6 +30,8 @@ describe('CogRead', () => {
30
30
  assert.equal(tiff.version, TiffVersion.Tiff);
31
31
  assert.equal(tiff.images.length, 1);
32
32
  const firstImage = tiff.images[0];
33
+ const byteCounts = await firstImage.fetch(TiffTag.TileByteCounts);
34
+ assert.deepEqual([...(byteCounts ?? [])], [511]);
33
35
 
34
36
  assert.equal(firstImage.compression, 'application/zstd');
35
37
  assert.equal(firstImage.isTiled(), true);
@@ -48,6 +50,14 @@ describe('CogRead', () => {
48
50
  assert.equal(tiff.version, TiffVersion.BigTiff);
49
51
  assert.equal(tiff.images[0].epsg, null);
50
52
  validate(tiff);
53
+
54
+ const [byteCounts, tileOffsets] = await Promise.all([
55
+ tiff.images[0].fetch(TiffTag.TileByteCounts),
56
+ tiff.images[0].fetch(TiffTag.TileOffsets),
57
+ ]);
58
+
59
+ assert.deepEqual([...(byteCounts ?? [])], [196608]);
60
+ assert.deepEqual([...(tileOffsets ?? [])], [272]);
51
61
  });
52
62
 
53
63
  it('should fail reading a empty byte tiff', async () => {
@@ -87,6 +97,88 @@ describe('CogRead', () => {
87
97
  assert.equal(tiff.images.length, 5);
88
98
  });
89
99
 
100
+ it('should read the byte count array if it is loaded', async () => {
101
+ const source = new TestFileSource(new URL('../../data/rgba8_cog.tiff', import.meta.url));
102
+ const fetchSize = 16 * 1024;
103
+
104
+ const tiff = new Tiff(source);
105
+ tiff.defaultReadSize = fetchSize;
106
+ await tiff.init();
107
+
108
+ assert.equal(source.fetches.length, 1);
109
+ assert.equal(source.fetches[0].length, fetchSize);
110
+
111
+ const img = tiff.images[0];
112
+ const byteCounts = img.tags.get(TiffTag.TileByteCounts) as TagOffset;
113
+ const tileOffsets = img.tags.get(TiffTag.TileOffsets) as TagOffset;
114
+ assert.equal(source.fetches.length, 1);
115
+
116
+ assert.equal(byteCounts.type, 'offset');
117
+ assert.equal(byteCounts.isLoaded, true);
118
+
119
+ assert.equal(tileOffsets.type, 'offset');
120
+ assert.equal(tileOffsets.isLoaded, true);
121
+
122
+ const tile = await img.getTile(0, 0);
123
+ assert.equal(tile?.bytes.byteLength, byteCounts.value[0]);
124
+ assert.equal(source.fetches.length, 2);
125
+ assert.deepEqual(source.fetches[1], { offset: tileOffsets.value[0], length: byteCounts.value[0] });
126
+
127
+ // force the offset to be unloaded
128
+ byteCounts.isLoaded = false;
129
+ const oldValue = byteCounts.value;
130
+ byteCounts.value = [];
131
+ const tileB = await img.getTile(0, 0);
132
+ assert.equal(tileB?.bytes.byteLength, oldValue[0]);
133
+ assert.equal(source.fetches.length, 4);
134
+
135
+ // Read the tile offset then the tile
136
+ assert.deepEqual(source.fetches[2], { offset: tileOffsets.value[0] - 4, length: 4 });
137
+ assert.deepEqual(source.fetches[3], { offset: tileOffsets.value[0], length: oldValue[0] });
138
+ });
139
+
140
+ it('should read the byte count array if it is loaded (BigTiff)', async () => {
141
+ const source = new TestFileSource(new URL('../../data/rgba8_cog_big.tiff', import.meta.url));
142
+ const fetchSize = 16 * 1024;
143
+
144
+ const tiff = new Tiff(source);
145
+ tiff.defaultReadSize = fetchSize;
146
+ await tiff.init();
147
+
148
+ assert.equal(source.fetches.length, 1);
149
+ assert.equal(source.fetches[0].length, fetchSize);
150
+
151
+ const img = tiff.images[0];
152
+ const byteCounts = img.tags.get(TiffTag.TileByteCounts) as TagOffset;
153
+ const tileOffsets = img.tags.get(TiffTag.TileOffsets) as TagOffset;
154
+ assert.equal(source.fetches.length, 1);
155
+
156
+ assert.equal(byteCounts.type, 'offset');
157
+ assert.equal(byteCounts.isLoaded, true);
158
+ assert.equal(byteCounts.view == null, true);
159
+
160
+ assert.equal(tileOffsets.type, 'offset');
161
+ assert.equal(tileOffsets.isLoaded, false);
162
+ assert.equal(tileOffsets.view == null, false);
163
+
164
+ const tile = await img.getTile(0, 0);
165
+ assert.equal(tile?.bytes.byteLength, byteCounts.value[0]);
166
+ assert.equal(source.fetches.length, 2);
167
+ assert.deepEqual(source.fetches[1], { offset: tileOffsets.value[0], length: byteCounts.value[0] });
168
+
169
+ // force the offset to be unloaded
170
+ byteCounts.isLoaded = false;
171
+ const oldValue = byteCounts.value;
172
+ byteCounts.value = [];
173
+ byteCounts.view = undefined;
174
+ const tileB = await img.getTile(0, 0);
175
+ assert.equal(tileB?.bytes.byteLength, oldValue[0]);
176
+ assert.equal(source.fetches.length, 4);
177
+ // Read the tile offset then the tile
178
+ assert.deepEqual(source.fetches[2], { offset: tileOffsets.value[0] - 4, length: 4 });
179
+ assert.deepEqual(source.fetches[3], { offset: tileOffsets.value[0], length: oldValue[0] });
180
+ });
181
+
90
182
  it('should read ifds from anywhere in the file', async () => {
91
183
  const source = new TestFileSource(new URL('../../data/DEM_BS28_2016_1000_1141.tif', import.meta.url));
92
184
  const tiff = await Tiff.create(source);
@@ -109,7 +201,9 @@ describe('CogRead', () => {
109
201
 
110
202
  assert.equal(im.valueGeo(TiffTagGeo.GTCitationGeoKey), 'NZGD2000 / New Zealand Transverse Mercator 2000');
111
203
  assert.equal(im.valueGeo(TiffTagGeo.GeodeticCitationGeoKey), 'NZGD2000');
112
- assert.deepEqual(await im.fetch(TiffTag.StripByteCounts), [8064, 8064, 8064, 8064, 8064, 8064, 8064, 5040]);
204
+
205
+ const stripCount = await im.fetch(TiffTag.StripByteCounts);
206
+ assert.deepEqual([...(stripCount ?? [])], [8064, 8064, 8064, 8064, 8064, 8064, 8064, 5040]);
113
207
  });
114
208
 
115
209
  it('should read sub array ifds', async () => {
@@ -167,5 +261,16 @@ describe('CogRead', () => {
167
261
  const tiff = await Tiff.create(source);
168
262
  assert.equal(tiff.images.length, 5);
169
263
  assert.equal(tiff.images[0].epsg, 3857);
264
+
265
+ const [byteCounts, tileOffsets] = await Promise.all([
266
+ tiff.images[0].fetch(TiffTag.TileByteCounts),
267
+ tiff.images[0].fetch(TiffTag.TileOffsets),
268
+ ]);
269
+
270
+ assert.deepEqual([...(byteCounts ?? [])], [64, 64, 68, 64, 64, 68, 64, 64, 68, 64, 64, 64, 64, 64, 64, 68]);
271
+ assert.deepEqual(
272
+ [...(tileOffsets ?? [])],
273
+ [797, 861, 925, 993, 1057, 1121, 1189, 1253, 1317, 1385, 1449, 1513, 1577, 1641, 1705, 1769],
274
+ );
170
275
  });
171
276
  });
@@ -86,6 +86,14 @@ export enum PlanarConfiguration {
86
86
  Separate = 2,
87
87
  }
88
88
 
89
+ export enum Predictor {
90
+ None = 1,
91
+ /** Horizontal differencing */
92
+ Horizontal = 2,
93
+ /** Floating point */
94
+ FloatingPoint = 3,
95
+ }
96
+
89
97
  export enum SampleFormat {
90
98
  /** Unsigned integer data */
91
99
  Uint = 1,
@@ -417,12 +425,12 @@ export interface TiffTagType {
417
425
 
418
426
  [TiffTag.TileWidth]: number;
419
427
  [TiffTag.TileHeight]: number;
420
- [TiffTag.TileOffsets]: number[];
421
- [TiffTag.TileByteCounts]: number[];
428
+ [TiffTag.TileOffsets]: number[] | Uint32Array | Uint16Array;
429
+ [TiffTag.TileByteCounts]: number[] | Uint32Array | Uint16Array;
422
430
  [TiffTag.JpegTables]: number[];
423
431
 
424
- [TiffTag.StripByteCounts]: number[];
425
- [TiffTag.StripOffsets]: number[];
432
+ [TiffTag.StripByteCounts]: number[] | Uint32Array | Uint16Array;
433
+ [TiffTag.StripOffsets]: number[] | Uint32Array | Uint16Array;
426
434
 
427
435
  [TiffTag.SamplesPerPixel]: number;
428
436
  [TiffTag.SampleFormat]: SampleFormat[];
@@ -437,6 +445,7 @@ export interface TiffTagType {
437
445
 
438
446
  [TiffTag.PlanarConfiguration]: PlanarConfiguration;
439
447
  [TiffTag.Orientation]: Orientation;
448
+ [TiffTag.Predictor]: Predictor;
440
449
 
441
450
  [TiffTag.LercParameters]: number[];
442
451
 
@@ -478,7 +487,6 @@ export interface TiffTagType {
478
487
  [TiffTag.Indexed]: unknown;
479
488
  [TiffTag.PageName]: unknown;
480
489
  [TiffTag.PageNumber]: unknown;
481
- [TiffTag.Predictor]: unknown;
482
490
  [TiffTag.PrimaryChromaticities]: unknown;
483
491
  [TiffTag.ReferenceBlackWhite]: unknown;
484
492
  [TiffTag.SMinSampleValue]: unknown;
package/src/index.ts CHANGED
@@ -11,6 +11,7 @@ export {
11
11
  Orientation,
12
12
  Photometric,
13
13
  PlanarConfiguration,
14
+ Predictor,
14
15
  RasterTypeKey,
15
16
  SampleFormat,
16
17
  SubFileType,
@@ -22,7 +23,9 @@ export { TiffVersion } from './const/tiff.version.js';
22
23
  export type { Tag, TagInline, TagLazy, TagOffset } from './read/tiff.tag.js';
23
24
  export { getTiffTagSize } from './read/tiff.value.reader.js';
24
25
  export type { Source } from './source.js';
26
+ export type { TiffImageTileCount } from './tiff.image.js';
25
27
  export { TiffImage } from './tiff.image.js';
28
+ export type { TiffCreationOptions } from './tiff.js';
26
29
  export { Tiff } from './tiff.js';
27
30
  export { toHex } from './util/util.hex.js';
28
31
  export type { BoundingBox, Point, Size, Vector } from './vector.js';
@@ -0,0 +1,6 @@
1
+ const buffer = new ArrayBuffer(4);
2
+ const uint32 = new Uint32Array(buffer);
3
+ const uint8 = new Uint8Array(buffer);
4
+ uint32[0] = 1;
5
+
6
+ export const isLittleEndian = uint8[0] === 1;
@@ -5,6 +5,7 @@ import type { Tiff } from '../tiff.js';
5
5
  import { getUint, getUint64 } from '../util/bytes.js';
6
6
  import type { DataViewOffset } from './data.view.offset.js';
7
7
  import { hasBytes } from './data.view.offset.js';
8
+ import { isLittleEndian } from './endian.js';
8
9
  import type { Tag, TagLazy, TagOffset } from './tiff.tag.js';
9
10
  import { getTiffTagSize } from './tiff.value.reader.js';
10
11
 
@@ -57,6 +58,42 @@ function readTagValue(
57
58
  }
58
59
  }
59
60
 
61
+ /**
62
+ * Convert a tiff tag value to a typed array if the local endian matches the tiff endian
63
+ *
64
+ * @param tiff
65
+ * @param bytes
66
+ * @param offset Offset in the data view to read from
67
+ * @param length Number of bytes to read
68
+ * @param type type of tiff tag
69
+ * @returns the value if the type is a typed array and the endianness matches otherwise null
70
+ */
71
+ export function readTypedValue<T>(
72
+ tiff: Tiff,
73
+ bytes: DataView,
74
+ offset: number,
75
+ length: number,
76
+ type: TiffTagValueType,
77
+ ): T | null {
78
+ switch (type) {
79
+ case TiffTagValueType.Uint8:
80
+ return new Uint8Array(
81
+ bytes.buffer.slice(bytes.byteOffset + offset, bytes.byteOffset + offset + length),
82
+ ) as unknown as T;
83
+ case TiffTagValueType.Uint16:
84
+ if (tiff.isLittleEndian !== isLittleEndian) return null;
85
+ return new Uint16Array(
86
+ bytes.buffer.slice(bytes.byteOffset + offset, bytes.byteOffset + offset + length),
87
+ ) as unknown as T;
88
+ case TiffTagValueType.Uint32:
89
+ if (tiff.isLittleEndian !== isLittleEndian) return null;
90
+ return new Uint32Array(
91
+ bytes.buffer.slice(bytes.byteOffset + offset, bytes.byteOffset + offset + length),
92
+ ) as unknown as T;
93
+ }
94
+ return null;
95
+ }
96
+
60
97
  function readValue<T>(
61
98
  tiff: Tiff,
62
99
  tagId: TiffTag | undefined,
@@ -84,6 +121,17 @@ function readValue<T>(
84
121
  ) as unknown as T;
85
122
  }
86
123
 
124
+ // TODO should we convert all tag values to typed arrays if possible?
125
+ if (
126
+ tagId === TiffTag.TileOffsets ||
127
+ tagId === TiffTag.TileByteCounts ||
128
+ tagId === TiffTag.StripOffsets ||
129
+ tagId === TiffTag.StripByteCounts
130
+ ) {
131
+ const typedOutput = readTypedValue(tiff, bytes, offset, dataLength, type);
132
+ if (typedOutput) return typedOutput as unknown as T;
133
+ }
134
+
87
135
  const output = [];
88
136
  for (let i = 0; i < dataLength; i += typeSize) {
89
137
  output.push(readTagValue(type, bytes, offset + i, tiff.isLittleEndian));
@@ -133,8 +181,17 @@ export function createTag(tiff: Tiff, view: DataViewOffset, offset: number): Tag
133
181
  value: [],
134
182
  tagOffset: offset,
135
183
  };
136
- // Some offsets are quite long and don't need to read them often, so only read the tags we are interested in when we need to
137
- if (tagId === TiffTag.TileOffsets && hasBytes(view, dataOffset, dataLength)) setBytes(tag, view);
184
+
185
+ if (hasBytes(view, dataOffset, dataLength)) {
186
+ const val = readTypedValue(tiff, view, dataOffset - view.sourceOffset, dataLength, dataType);
187
+ if (val) {
188
+ tag.value = val as number[] | Uint32Array | Uint16Array;
189
+ tag.isLoaded = true;
190
+ } else {
191
+ setBytes(tag, view);
192
+ }
193
+ }
194
+
138
195
  return tag;
139
196
  }
140
197
 
@@ -161,7 +218,7 @@ export async function fetchLazy<T>(tag: TagLazy<T>, tiff: Tiff): Promise<T> {
161
218
  /**
162
219
  * Fetch all the values from a {@link TagOffset}
163
220
  */
164
- export async function fetchAllOffsets(tiff: Tiff, tag: TagOffset): Promise<number[]> {
221
+ export async function fetchAllOffsets(tiff: Tiff, tag: TagOffset): Promise<TagOffset['value']> {
165
222
  const dataTypeSize = getTiffTagSize(tag.dataType);
166
223
 
167
224
  if (tag.view == null) {
@@ -171,6 +228,7 @@ export async function fetchAllOffsets(tiff: Tiff, tag: TagOffset): Promise<numbe
171
228
  }
172
229
 
173
230
  tag.value = readValue(tiff, tag.id, tag.view, 0, tag.dataType, tag.count);
231
+ tag.view = undefined;
174
232
  tag.isLoaded = true;
175
233
  return tag.value;
176
234
  }
@@ -204,3 +262,15 @@ export async function getValueAt(tiff: Tiff, tag: TagOffset, index: number): Pro
204
262
  tag.value[index] = value;
205
263
  return value;
206
264
  }
265
+
266
+ export function getValueAtSync(tiff: Tiff, tag: TagOffset, index: number): number | null {
267
+ if (index > tag.count || index < 0) throw new Error('TagOffset: out of bounds :' + index);
268
+ if (tag.value[index] != null) return tag.value[index];
269
+ if (tag.view == null) return null;
270
+ const dataTypeSize = getTiffTagSize(tag.dataType);
271
+
272
+ const value = readValue(tiff, undefined, tag.view, index * dataTypeSize, tag.dataType, 1);
273
+ if (typeof value !== 'number') throw new Error('Value is not a number');
274
+ tag.value[index] = value;
275
+ return value;
276
+ }
@@ -38,7 +38,7 @@ export interface TagInline<T> extends TagBase {
38
38
  export interface TagOffset extends TagBase {
39
39
  type: 'offset';
40
40
  /** Values of the offsets this is a sparse array unless @see {TagOffset.isLoaded} is true */
41
- value: number[];
41
+ value: number[] | Uint32Array | Uint16Array;
42
42
  /** Have all the values been read */
43
43
  isLoaded: boolean;
44
44
  /** Raw buffer of the values for lazy decoding, as reading 100,000s of uint64s can take quite a long time */
package/src/tiff.image.ts CHANGED
@@ -1,7 +1,7 @@
1
1
  import { getCompressionMimeType, TiffCompressionMimeType, TiffMimeType } from './const/tiff.mime.js';
2
2
  import type { TiffTagGeoType, TiffTagType } from './const/tiff.tag.id.js';
3
3
  import { Compression, ModelTypeCode, SubFileType, TiffTag, TiffTagGeo } from './const/tiff.tag.id.js';
4
- import { fetchAllOffsets, fetchLazy, getValueAt } from './read/tiff.tag.factory.js';
4
+ import { fetchAllOffsets, fetchLazy, getValueAt, getValueAtSync } from './read/tiff.tag.factory.js';
5
5
  import type { Tag, TagInline, TagOffset } from './read/tiff.tag.js';
6
6
  import type { Tiff } from './tiff.js';
7
7
  import { getUint } from './util/bytes.js';
@@ -556,15 +556,25 @@ export class TiffImage {
556
556
 
557
557
  /**
558
558
  * Load the offset and byteCount of a tile
559
+ *
560
+ * if the tiff is sparse, offset and byteCount will be zero if the tile is empty
561
+ *
559
562
  * @param index index in the tile array
560
563
  * @returns Offset and byteCount for the tile
561
564
  */
562
565
  async getTileSize(index: number): Promise<{ offset: number; imageSize: number }> {
566
+ // If both the tile offset and tile byte counts are loaded,
567
+ // we can get the offset and byte count synchronously without needing to fetch any additional data
568
+ const byteCounts = this.tags.get(TiffTag.TileByteCounts) as TagOffset | TagInline<number[]>;
569
+ const tileOffset = getOffsetSync(this.tiff, this.tileOffset, index);
570
+ const tileSize = getOffsetSync(this.tiff, byteCounts, index);
571
+ if (tileOffset != null && tileSize != null) return { offset: tileOffset, imageSize: tileSize };
572
+
563
573
  // GDAL optimizes tiles by storing the size of the tile in
564
574
  // the few bytes leading up to the tile
565
575
  const leaderBytes = this.tiff.options?.tileLeaderByteSize;
566
576
  if (leaderBytes) {
567
- const offset = await getOffset(this.tiff, this.tileOffset, index);
577
+ const offset = tileOffset ?? (await getOffset(this.tiff, this.tileOffset, index));
568
578
  // Sparse tiff no data found
569
579
  if (offset === 0) return { offset: 0, imageSize: 0 };
570
580
 
@@ -574,22 +584,29 @@ export class TiffImage {
574
584
  return { offset, imageSize: getUint(new DataView(bytes), 0, leaderBytes, this.tiff.isLittleEndian) };
575
585
  }
576
586
 
577
- const byteCounts = this.tags.get(TiffTag.TileByteCounts) as TagOffset;
578
587
  if (byteCounts == null) throw new Error('No tile byte counts found');
579
588
  const [offset, imageSize] = await Promise.all([
580
- getOffset(this.tiff, this.tileOffset, index),
581
- getOffset(this.tiff, byteCounts, index),
589
+ tileOffset ?? getOffset(this.tiff, this.tileOffset, index),
590
+ tileSize ?? getOffset(this.tiff, byteCounts, index),
582
591
  ]);
583
592
  return { offset, imageSize };
584
593
  }
585
594
  }
586
595
 
587
596
  function getOffset(tiff: Tiff, x: TagOffset | TagInline<number[]>, index: number): number | Promise<number> {
597
+ const val = getOffsetSync(tiff, x, index);
598
+ if (val != null) return Promise.resolve(val);
599
+ return getValueAt(tiff, x as TagOffset, index);
600
+ }
601
+
602
+ function getOffsetSync(tiff: Tiff, x: TagOffset | TagInline<number[]>, index: number): number | null {
588
603
  if (index < 0) {
589
604
  throw new Error(`Tiff: ${tiff.source.url.href} out of bounds ${TiffTag[x.id]} index:${index} total:${x.count}`);
590
605
  }
591
606
  // Sparse tiffs may not have the full tileWidth * tileHeight in their offset arrays
592
607
  if (index >= x.count) return 0;
593
608
  if (x.type === 'inline') return x.value[index];
594
- return getValueAt(tiff, x, index);
609
+ if (x.isLoaded) return x.value[index];
610
+
611
+ return getValueAtSync(tiff, x, index);
595
612
  }
package/src/tiff.ts CHANGED
@@ -13,6 +13,11 @@ import { TiffImage } from './tiff.image.js';
13
13
  import { getUint } from './util/bytes.js';
14
14
  import { toHex } from './util/util.hex.js';
15
15
 
16
+ export interface TiffCreationOptions {
17
+ /** When initializing the tiff, read data in blocks of this size (in KB) */
18
+ defaultReadSize: number;
19
+ }
20
+
16
21
  export class Tiff {
17
22
  /** Read 16KB blocks at a time */
18
23
  static DefaultReadSize = 16 * 1024;
@@ -36,13 +41,17 @@ export class Tiff {
36
41
  private _initPromise?: Promise<Tiff>;
37
42
 
38
43
  /** A Tiff constructed from a source will not be pre-initialized with {@link init}. */
39
- constructor(source: Source) {
44
+ constructor(source: Source, options: TiffCreationOptions = { defaultReadSize: Tiff.DefaultReadSize }) {
40
45
  this.source = source;
46
+ this.defaultReadSize = options.defaultReadSize;
41
47
  }
42
48
 
43
49
  /** Create a tiff and initialize it by reading the tiff headers */
44
- static create(source: Source): Promise<Tiff> {
45
- return new Tiff(source).init();
50
+ static create(
51
+ source: Source,
52
+ options: TiffCreationOptions = { defaultReadSize: Tiff.DefaultReadSize },
53
+ ): Promise<Tiff> {
54
+ return new Tiff(source, options).init();
46
55
  }
47
56
 
48
57
  /**