@cogeotiff/core 8.0.2 → 8.1.1

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.
Files changed (37) hide show
  1. package/CHANGELOG.md +20 -0
  2. package/build/__benchmark__/cog.read.benchmark.js +4 -0
  3. package/build/__benchmark__/cog.read.benchmark.js.map +1 -1
  4. package/build/__benchmark__/source.file.js +9 -2
  5. package/build/__benchmark__/source.file.js.map +1 -1
  6. package/build/__test__/cog.read.test.js +41 -1
  7. package/build/__test__/cog.read.test.js.map +1 -1
  8. package/build/cog.tiff.image.d.ts +36 -8
  9. package/build/cog.tiff.image.js +53 -19
  10. package/build/cog.tiff.image.js.map +1 -1
  11. package/build/cog.tiff.js +11 -1
  12. package/build/cog.tiff.js.map +1 -1
  13. package/build/const/tiff.endian.d.ts +2 -1
  14. package/build/const/tiff.endian.js +2 -1
  15. package/build/const/tiff.endian.js.map +1 -1
  16. package/build/index.d.ts +2 -1
  17. package/build/index.js +1 -0
  18. package/build/index.js.map +1 -1
  19. package/build/read/tiff.gdal.d.ts +4 -4
  20. package/build/read/tiff.gdal.js +4 -4
  21. package/build/read/tiff.tag.d.ts +3 -3
  22. package/build/read/tiff.tag.factory.d.ts +7 -1
  23. package/build/read/tiff.tag.factory.js +21 -2
  24. package/build/read/tiff.tag.factory.js.map +1 -1
  25. package/build/source.d.ts +12 -0
  26. package/package.json +2 -2
  27. package/src/__benchmark__/cog.read.benchmark.ts +5 -0
  28. package/src/__benchmark__/source.file.ts +9 -2
  29. package/src/__test__/cog.read.test.ts +51 -1
  30. package/src/cog.tiff.image.ts +51 -22
  31. package/src/cog.tiff.ts +14 -1
  32. package/src/const/tiff.endian.ts +2 -1
  33. package/src/index.ts +2 -1
  34. package/src/read/tiff.gdal.ts +4 -4
  35. package/src/read/tiff.tag.factory.ts +26 -5
  36. package/src/read/tiff.tag.ts +3 -3
  37. package/src/source.ts +15 -0
@@ -44,6 +44,9 @@ function readTagValue(
44
44
  case TiffTagValueType.Float64:
45
45
  return bytes.getFloat64(offset, isLittleEndian);
46
46
 
47
+ case TiffTagValueType.Float32:
48
+ return bytes.getFloat32(offset, isLittleEndian);
49
+
47
50
  case TiffTagValueType.Uint64:
48
51
  return getUint64(bytes, offset, isLittleEndian);
49
52
  default:
@@ -51,7 +54,7 @@ function readTagValue(
51
54
  }
52
55
  }
53
56
 
54
- function readValue<T>(tiff: CogTiff, bytes: DataView, offset: number, type: number, count: number): T {
57
+ function readValue<T>(tiff: CogTiff, bytes: DataView, offset: number, type: TiffTagValueType, count: number): T {
55
58
  const typeSize = getTiffTagSize(type);
56
59
  const dataLength = count * typeSize;
57
60
 
@@ -61,9 +64,7 @@ function readValue<T>(tiff: CogTiff, bytes: DataView, offset: number, type: numb
61
64
  case TiffTagValueType.Ascii:
62
65
  return String.fromCharCode.apply(
63
66
  null,
64
- new Uint8Array(
65
- bytes.buffer.slice(bytes.byteOffset + offset, bytes.byteOffset + offset + dataLength - 1),
66
- ) as unknown as number[],
67
+ new Uint8Array(bytes.buffer, offset, dataLength - 1) as unknown as number[],
67
68
  ) as unknown as T;
68
69
  }
69
70
 
@@ -78,7 +79,7 @@ function readValue<T>(tiff: CogTiff, bytes: DataView, offset: number, type: numb
78
79
  /**
79
80
  * Determine if all the data for the tiff tag is loaded in and use that to create the specific CogTiffTag
80
81
  *
81
- * @see {Tag}
82
+ * @see {@link Tag}
82
83
  *
83
84
  * @param tiff
84
85
  * @param view Bytes to read from
@@ -110,6 +111,7 @@ export function createTag(tiff: CogTiff, view: DataViewOffset, offset: number):
110
111
  count: dataCount,
111
112
  dataType,
112
113
  dataOffset,
114
+ isLoaded: false,
113
115
  value: [],
114
116
  tagOffset: offset,
115
117
  };
@@ -127,6 +129,7 @@ export function createTag(tiff: CogTiff, view: DataViewOffset, offset: number):
127
129
  return { type: 'lazy', id: tagId, count: dataCount, dataOffset, dataType, tagOffset: offset };
128
130
  }
129
131
 
132
+ /** Fetch the value from a {@link TagLazy} tag */
130
133
  export async function fetchLazy<T>(tag: TagLazy<T>, tiff: CogTiff): Promise<T> {
131
134
  if (tag.value != null) return tag.value;
132
135
  const dataTypeSize = getTiffTagSize(tag.dataType);
@@ -137,6 +140,23 @@ export async function fetchLazy<T>(tag: TagLazy<T>, tiff: CogTiff): Promise<T> {
137
140
  return tag.value as T;
138
141
  }
139
142
 
143
+ /**
144
+ * Fetch all the values from a {@link TagOffset}
145
+ */
146
+ export async function fetchAllOffsets(tiff: CogTiff, tag: TagOffset): Promise<number[]> {
147
+ const dataTypeSize = getTiffTagSize(tag.dataType);
148
+
149
+ if (tag.view == null) {
150
+ const bytes = await tiff.source.fetch(tag.dataOffset, dataTypeSize * tag.count);
151
+ tag.view = new DataView(bytes) as DataViewOffset;
152
+ tag.view.sourceOffset = tag.dataOffset;
153
+ }
154
+
155
+ tag.value = readValue(tiff, tag.view, 0, tag.dataType, tag.count) as number[];
156
+ tag.isLoaded = true;
157
+ return tag.value;
158
+ }
159
+
140
160
  export function setBytes(tag: TagOffset, view: DataViewOffset): void {
141
161
  const dataTypeSize = getTiffTagSize(tag.dataType);
142
162
  const startBytes = view.byteOffset + tag.dataOffset - view.sourceOffset;
@@ -144,6 +164,7 @@ export function setBytes(tag: TagOffset, view: DataViewOffset): void {
144
164
  tag.view.sourceOffset = tag.dataOffset;
145
165
  }
146
166
 
167
+ /** Partially fetch the values of a {@link TagOffset} and return the value for the offset */
147
168
  export async function getValueAt(tiff: CogTiff, tag: TagOffset, index: number): Promise<number> {
148
169
  if (index > tag.count || index < 0) throw new Error('TagOffset: out of bounds :' + index);
149
170
  if (tag.value[index] != null) return tag.value[index];
@@ -34,11 +34,11 @@ export interface TagInline<T> extends TagBase {
34
34
  /** Tiff tag that is a list of offsets this can be partially read */
35
35
  export interface TagOffset extends TagBase {
36
36
  type: 'offset';
37
- /** Values of the offest's this is a sparse array unless @see {isLoaded} is true */
37
+ /** Values of the offsets this is a sparse array unless @see {TagOffset.isLoaded} is true */
38
38
  value: number[];
39
39
  /** has all the values been read */
40
- isLoaded?: boolean;
41
- /** Raw buffer of the values for lazy decoding, Reading 1000s of uint64s can take quite a while */
40
+ isLoaded: boolean;
41
+ /** Raw buffer of the values for lazy decoding, as reading 100,000s of uint64s can take quite a long time */
42
42
  view?: DataViewOffset;
43
43
  /** Where in the file the value is read from */
44
44
  dataOffset: number;
package/src/source.ts CHANGED
@@ -1,5 +1,20 @@
1
+ /**
2
+ * This is a partial re-implementation of @chunkd/source
3
+ * this is defined here so that @cogeotiff/core does not have any external dependencies
4
+ */
1
5
  export interface Source {
6
+ /** Where the source is located */
2
7
  url: URL;
8
+
9
+ /** Optional metadata about the source including the size in bytes of the file */
10
+ metadata?: {
11
+ /** Number of bytes in the file if known */
12
+ size?: number;
13
+ };
14
+
3
15
  /** Fetch bytes from a source */
4
16
  fetch(offset: number, length?: number): Promise<ArrayBuffer>;
17
+
18
+ /** Optionally close the source, useful for sources that have open connections of file descriptors */
19
+ close?(): Promise<void>;
5
20
  }