@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.
- package/CHANGELOG.md +20 -0
- package/build/__benchmark__/cog.read.benchmark.js +4 -0
- package/build/__benchmark__/cog.read.benchmark.js.map +1 -1
- package/build/__benchmark__/source.file.js +9 -2
- package/build/__benchmark__/source.file.js.map +1 -1
- package/build/__test__/cog.read.test.js +41 -1
- package/build/__test__/cog.read.test.js.map +1 -1
- package/build/cog.tiff.image.d.ts +36 -8
- package/build/cog.tiff.image.js +53 -19
- package/build/cog.tiff.image.js.map +1 -1
- package/build/cog.tiff.js +11 -1
- package/build/cog.tiff.js.map +1 -1
- package/build/const/tiff.endian.d.ts +2 -1
- package/build/const/tiff.endian.js +2 -1
- package/build/const/tiff.endian.js.map +1 -1
- package/build/index.d.ts +2 -1
- package/build/index.js +1 -0
- package/build/index.js.map +1 -1
- package/build/read/tiff.gdal.d.ts +4 -4
- package/build/read/tiff.gdal.js +4 -4
- package/build/read/tiff.tag.d.ts +3 -3
- package/build/read/tiff.tag.factory.d.ts +7 -1
- package/build/read/tiff.tag.factory.js +21 -2
- package/build/read/tiff.tag.factory.js.map +1 -1
- package/build/source.d.ts +12 -0
- package/package.json +2 -2
- package/src/__benchmark__/cog.read.benchmark.ts +5 -0
- package/src/__benchmark__/source.file.ts +9 -2
- package/src/__test__/cog.read.test.ts +51 -1
- package/src/cog.tiff.image.ts +51 -22
- package/src/cog.tiff.ts +14 -1
- package/src/const/tiff.endian.ts +2 -1
- package/src/index.ts +2 -1
- package/src/read/tiff.gdal.ts +4 -4
- package/src/read/tiff.tag.factory.ts +26 -5
- package/src/read/tiff.tag.ts +3 -3
- 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:
|
|
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];
|
package/src/read/tiff.tag.ts
CHANGED
|
@@ -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
|
|
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
|
|
41
|
-
/** Raw buffer of the values for lazy decoding,
|
|
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
|
}
|