@vitessce/statistical-plots 3.5.12 → 3.6.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 (46) hide show
  1. package/dist/deflate-CENZcXCs.js +10 -0
  2. package/dist/{index-fa429ace.js → index-pAs1WCwy.js} +181500 -152951
  3. package/dist/index.js +1 -4
  4. package/dist/{jpeg-affe217d.js → jpeg-CM00LzXt.js} +20 -4
  5. package/dist/lerc-vsy3sZIv.js +2065 -0
  6. package/dist/{lzw-fdf7d374.js → lzw-Dv-TvqHY.js} +1 -4
  7. package/dist/{packbits-530d3977.js → packbits-DlIDTIdL.js} +1 -4
  8. package/dist/{pako.esm-68f84e2a.js → pako.esm-SxljTded.js} +33 -1839
  9. package/dist/{raw-5d9364f4.js → raw-C0V1wwX1.js} +1 -4
  10. package/dist/{webimage-57a383de.js → webimage-JQPK3vx3.js} +1 -4
  11. package/dist-tsc/CellSetCompositionBarPlotSubscriber.js +1 -1
  12. package/dist-tsc/CellSetExpressionPlotOptions.d.ts.map +1 -1
  13. package/dist-tsc/CellSetExpressionPlotOptions.js +7 -6
  14. package/dist-tsc/CellSetExpressionPlotSubscriber.js +1 -1
  15. package/dist-tsc/CellSetSizesPlotSubscriber.js +1 -1
  16. package/dist-tsc/DotPlotSubscriber.js +1 -1
  17. package/dist-tsc/ExpressionHistogramSubscriber.js +1 -1
  18. package/dist-tsc/FeatureBarPlotSubscriber.js +1 -1
  19. package/dist-tsc/FeatureSetEnrichmentBarPlotSubscriber.js +1 -1
  20. package/dist-tsc/FeatureStatsTable.d.ts.map +1 -1
  21. package/dist-tsc/FeatureStatsTable.js +13 -5
  22. package/dist-tsc/TreemapOptions.js +2 -2
  23. package/dist-tsc/TreemapSubscriber.js +1 -1
  24. package/dist-tsc/VolcanoPlotOptions.d.ts.map +1 -1
  25. package/dist-tsc/VolcanoPlotOptions.js +15 -3
  26. package/dist-tsc/VolcanoPlotSubscriber.js +1 -1
  27. package/dist-tsc/styles.d.ts +9 -1
  28. package/dist-tsc/styles.d.ts.map +1 -1
  29. package/dist-tsc/styles.js +2 -2
  30. package/package.json +12 -12
  31. package/src/CellSetCompositionBarPlotSubscriber.js +1 -1
  32. package/src/CellSetExpressionPlotOptions.js +7 -6
  33. package/src/CellSetExpressionPlotSubscriber.js +1 -1
  34. package/src/CellSetSizesPlotSubscriber.js +1 -1
  35. package/src/DotPlotSubscriber.js +1 -1
  36. package/src/ExpressionHistogramSubscriber.js +1 -1
  37. package/src/FeatureBarPlotSubscriber.js +1 -1
  38. package/src/FeatureSetEnrichmentBarPlotSubscriber.js +1 -1
  39. package/src/FeatureStatsTable.js +15 -5
  40. package/src/TreemapOptions.js +2 -2
  41. package/src/TreemapSubscriber.js +1 -1
  42. package/src/VolcanoPlotOptions.js +18 -6
  43. package/src/VolcanoPlotSubscriber.js +1 -1
  44. package/src/styles.js +2 -2
  45. package/dist/deflate-9e272e07.js +0 -13
  46. package/dist/lerc-eeb05714.js +0 -2014
@@ -0,0 +1,2065 @@
1
+ import { i as inflate_1 } from "./pako.esm-SxljTded.js";
2
+ import { g as getDefaultExportFromCjs, B as BaseDecoder } from "./index-pAs1WCwy.js";
3
+ const LercParameters = {
4
+ AddCompression: 1
5
+ };
6
+ const LercAddCompression = {
7
+ None: 0,
8
+ Deflate: 1,
9
+ Zstandard: 2
10
+ };
11
+ var LercDecode = { exports: {} };
12
+ var hasRequiredLercDecode;
13
+ function requireLercDecode() {
14
+ if (hasRequiredLercDecode) return LercDecode.exports;
15
+ hasRequiredLercDecode = 1;
16
+ (function(module) {
17
+ /* Copyright 2015-2021 Esri. Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. You may obtain a copy of the License at http://www.apache.org/licenses/LICENSE-2.0 @preserve */
18
+ (function() {
19
+ var LercDecode2 = function() {
20
+ var CntZImage = {};
21
+ CntZImage.defaultNoDataValue = -34027999387901484e22;
22
+ CntZImage.decode = function(input, options) {
23
+ options = options || {};
24
+ var skipMask = options.encodedMaskData || options.encodedMaskData === null;
25
+ var parsedData = parse(input, options.inputOffset || 0, skipMask);
26
+ var noDataValue = options.noDataValue !== null ? options.noDataValue : CntZImage.defaultNoDataValue;
27
+ var uncompressedData = uncompressPixelValues(
28
+ parsedData,
29
+ options.pixelType || Float32Array,
30
+ options.encodedMaskData,
31
+ noDataValue,
32
+ options.returnMask
33
+ );
34
+ var result = {
35
+ width: parsedData.width,
36
+ height: parsedData.height,
37
+ pixelData: uncompressedData.resultPixels,
38
+ minValue: uncompressedData.minValue,
39
+ maxValue: parsedData.pixels.maxValue,
40
+ noDataValue
41
+ };
42
+ if (uncompressedData.resultMask) {
43
+ result.maskData = uncompressedData.resultMask;
44
+ }
45
+ if (options.returnEncodedMask && parsedData.mask) {
46
+ result.encodedMaskData = parsedData.mask.bitset ? parsedData.mask.bitset : null;
47
+ }
48
+ if (options.returnFileInfo) {
49
+ result.fileInfo = formatFileInfo(parsedData);
50
+ if (options.computeUsedBitDepths) {
51
+ result.fileInfo.bitDepths = computeUsedBitDepths(parsedData);
52
+ }
53
+ }
54
+ return result;
55
+ };
56
+ var uncompressPixelValues = function(data, TypedArrayClass, maskBitset, noDataValue, storeDecodedMask) {
57
+ var blockIdx = 0;
58
+ var numX = data.pixels.numBlocksX;
59
+ var numY = data.pixels.numBlocksY;
60
+ var blockWidth = Math.floor(data.width / numX);
61
+ var blockHeight = Math.floor(data.height / numY);
62
+ var scale = 2 * data.maxZError;
63
+ var minValue = Number.MAX_VALUE, currentValue;
64
+ maskBitset = maskBitset || (data.mask ? data.mask.bitset : null);
65
+ var resultPixels, resultMask;
66
+ resultPixels = new TypedArrayClass(data.width * data.height);
67
+ if (storeDecodedMask && maskBitset) {
68
+ resultMask = new Uint8Array(data.width * data.height);
69
+ }
70
+ var blockDataBuffer = new Float32Array(blockWidth * blockHeight);
71
+ var xx, yy;
72
+ for (var y = 0; y <= numY; y++) {
73
+ var thisBlockHeight = y !== numY ? blockHeight : data.height % numY;
74
+ if (thisBlockHeight === 0) {
75
+ continue;
76
+ }
77
+ for (var x = 0; x <= numX; x++) {
78
+ var thisBlockWidth = x !== numX ? blockWidth : data.width % numX;
79
+ if (thisBlockWidth === 0) {
80
+ continue;
81
+ }
82
+ var outPtr = y * data.width * blockHeight + x * blockWidth;
83
+ var outStride = data.width - thisBlockWidth;
84
+ var block = data.pixels.blocks[blockIdx];
85
+ var blockData, blockPtr, constValue;
86
+ if (block.encoding < 2) {
87
+ if (block.encoding === 0) {
88
+ blockData = block.rawData;
89
+ } else {
90
+ unstuff(block.stuffedData, block.bitsPerPixel, block.numValidPixels, block.offset, scale, blockDataBuffer, data.pixels.maxValue);
91
+ blockData = blockDataBuffer;
92
+ }
93
+ blockPtr = 0;
94
+ } else if (block.encoding === 2) {
95
+ constValue = 0;
96
+ } else {
97
+ constValue = block.offset;
98
+ }
99
+ var maskByte;
100
+ if (maskBitset) {
101
+ for (yy = 0; yy < thisBlockHeight; yy++) {
102
+ if (outPtr & 7) {
103
+ maskByte = maskBitset[outPtr >> 3];
104
+ maskByte <<= outPtr & 7;
105
+ }
106
+ for (xx = 0; xx < thisBlockWidth; xx++) {
107
+ if (!(outPtr & 7)) {
108
+ maskByte = maskBitset[outPtr >> 3];
109
+ }
110
+ if (maskByte & 128) {
111
+ if (resultMask) {
112
+ resultMask[outPtr] = 1;
113
+ }
114
+ currentValue = block.encoding < 2 ? blockData[blockPtr++] : constValue;
115
+ minValue = minValue > currentValue ? currentValue : minValue;
116
+ resultPixels[outPtr++] = currentValue;
117
+ } else {
118
+ if (resultMask) {
119
+ resultMask[outPtr] = 0;
120
+ }
121
+ resultPixels[outPtr++] = noDataValue;
122
+ }
123
+ maskByte <<= 1;
124
+ }
125
+ outPtr += outStride;
126
+ }
127
+ } else {
128
+ if (block.encoding < 2) {
129
+ for (yy = 0; yy < thisBlockHeight; yy++) {
130
+ for (xx = 0; xx < thisBlockWidth; xx++) {
131
+ currentValue = blockData[blockPtr++];
132
+ minValue = minValue > currentValue ? currentValue : minValue;
133
+ resultPixels[outPtr++] = currentValue;
134
+ }
135
+ outPtr += outStride;
136
+ }
137
+ } else {
138
+ minValue = minValue > constValue ? constValue : minValue;
139
+ for (yy = 0; yy < thisBlockHeight; yy++) {
140
+ for (xx = 0; xx < thisBlockWidth; xx++) {
141
+ resultPixels[outPtr++] = constValue;
142
+ }
143
+ outPtr += outStride;
144
+ }
145
+ }
146
+ }
147
+ if (block.encoding === 1 && blockPtr !== block.numValidPixels) {
148
+ throw "Block and Mask do not match";
149
+ }
150
+ blockIdx++;
151
+ }
152
+ }
153
+ return {
154
+ resultPixels,
155
+ resultMask,
156
+ minValue
157
+ };
158
+ };
159
+ var formatFileInfo = function(data) {
160
+ return {
161
+ "fileIdentifierString": data.fileIdentifierString,
162
+ "fileVersion": data.fileVersion,
163
+ "imageType": data.imageType,
164
+ "height": data.height,
165
+ "width": data.width,
166
+ "maxZError": data.maxZError,
167
+ "eofOffset": data.eofOffset,
168
+ "mask": data.mask ? {
169
+ "numBlocksX": data.mask.numBlocksX,
170
+ "numBlocksY": data.mask.numBlocksY,
171
+ "numBytes": data.mask.numBytes,
172
+ "maxValue": data.mask.maxValue
173
+ } : null,
174
+ "pixels": {
175
+ "numBlocksX": data.pixels.numBlocksX,
176
+ "numBlocksY": data.pixels.numBlocksY,
177
+ "numBytes": data.pixels.numBytes,
178
+ "maxValue": data.pixels.maxValue,
179
+ "noDataValue": data.noDataValue
180
+ }
181
+ };
182
+ };
183
+ var computeUsedBitDepths = function(data) {
184
+ var numBlocks = data.pixels.numBlocksX * data.pixels.numBlocksY;
185
+ var bitDepths = {};
186
+ for (var i = 0; i < numBlocks; i++) {
187
+ var block = data.pixels.blocks[i];
188
+ if (block.encoding === 0) {
189
+ bitDepths.float32 = true;
190
+ } else if (block.encoding === 1) {
191
+ bitDepths[block.bitsPerPixel] = true;
192
+ } else {
193
+ bitDepths[0] = true;
194
+ }
195
+ }
196
+ return Object.keys(bitDepths);
197
+ };
198
+ var parse = function(input, fp, skipMask) {
199
+ var data = {};
200
+ var fileIdView = new Uint8Array(input, fp, 10);
201
+ data.fileIdentifierString = String.fromCharCode.apply(null, fileIdView);
202
+ if (data.fileIdentifierString.trim() !== "CntZImage") {
203
+ throw "Unexpected file identifier string: " + data.fileIdentifierString;
204
+ }
205
+ fp += 10;
206
+ var view = new DataView(input, fp, 24);
207
+ data.fileVersion = view.getInt32(0, true);
208
+ data.imageType = view.getInt32(4, true);
209
+ data.height = view.getUint32(8, true);
210
+ data.width = view.getUint32(12, true);
211
+ data.maxZError = view.getFloat64(16, true);
212
+ fp += 24;
213
+ if (!skipMask) {
214
+ view = new DataView(input, fp, 16);
215
+ data.mask = {};
216
+ data.mask.numBlocksY = view.getUint32(0, true);
217
+ data.mask.numBlocksX = view.getUint32(4, true);
218
+ data.mask.numBytes = view.getUint32(8, true);
219
+ data.mask.maxValue = view.getFloat32(12, true);
220
+ fp += 16;
221
+ if (data.mask.numBytes > 0) {
222
+ var bitset = new Uint8Array(Math.ceil(data.width * data.height / 8));
223
+ view = new DataView(input, fp, data.mask.numBytes);
224
+ var cnt = view.getInt16(0, true);
225
+ var ip = 2, op = 0;
226
+ do {
227
+ if (cnt > 0) {
228
+ while (cnt--) {
229
+ bitset[op++] = view.getUint8(ip++);
230
+ }
231
+ } else {
232
+ var val = view.getUint8(ip++);
233
+ cnt = -cnt;
234
+ while (cnt--) {
235
+ bitset[op++] = val;
236
+ }
237
+ }
238
+ cnt = view.getInt16(ip, true);
239
+ ip += 2;
240
+ } while (ip < data.mask.numBytes);
241
+ if (cnt !== -32768 || op < bitset.length) {
242
+ throw "Unexpected end of mask RLE encoding";
243
+ }
244
+ data.mask.bitset = bitset;
245
+ fp += data.mask.numBytes;
246
+ } else if ((data.mask.numBytes | data.mask.numBlocksY | data.mask.maxValue) === 0) {
247
+ data.mask.bitset = new Uint8Array(Math.ceil(data.width * data.height / 8));
248
+ }
249
+ }
250
+ view = new DataView(input, fp, 16);
251
+ data.pixels = {};
252
+ data.pixels.numBlocksY = view.getUint32(0, true);
253
+ data.pixels.numBlocksX = view.getUint32(4, true);
254
+ data.pixels.numBytes = view.getUint32(8, true);
255
+ data.pixels.maxValue = view.getFloat32(12, true);
256
+ fp += 16;
257
+ var numBlocksX = data.pixels.numBlocksX;
258
+ var numBlocksY = data.pixels.numBlocksY;
259
+ var actualNumBlocksX = numBlocksX + (data.width % numBlocksX > 0 ? 1 : 0);
260
+ var actualNumBlocksY = numBlocksY + (data.height % numBlocksY > 0 ? 1 : 0);
261
+ data.pixels.blocks = new Array(actualNumBlocksX * actualNumBlocksY);
262
+ var blockI = 0;
263
+ for (var blockY = 0; blockY < actualNumBlocksY; blockY++) {
264
+ for (var blockX = 0; blockX < actualNumBlocksX; blockX++) {
265
+ var size = 0;
266
+ var bytesLeft = input.byteLength - fp;
267
+ view = new DataView(input, fp, Math.min(10, bytesLeft));
268
+ var block = {};
269
+ data.pixels.blocks[blockI++] = block;
270
+ var headerByte = view.getUint8(0);
271
+ size++;
272
+ block.encoding = headerByte & 63;
273
+ if (block.encoding > 3) {
274
+ throw "Invalid block encoding (" + block.encoding + ")";
275
+ }
276
+ if (block.encoding === 2) {
277
+ fp++;
278
+ continue;
279
+ }
280
+ if (headerByte !== 0 && headerByte !== 2) {
281
+ headerByte >>= 6;
282
+ block.offsetType = headerByte;
283
+ if (headerByte === 2) {
284
+ block.offset = view.getInt8(1);
285
+ size++;
286
+ } else if (headerByte === 1) {
287
+ block.offset = view.getInt16(1, true);
288
+ size += 2;
289
+ } else if (headerByte === 0) {
290
+ block.offset = view.getFloat32(1, true);
291
+ size += 4;
292
+ } else {
293
+ throw "Invalid block offset type";
294
+ }
295
+ if (block.encoding === 1) {
296
+ headerByte = view.getUint8(size);
297
+ size++;
298
+ block.bitsPerPixel = headerByte & 63;
299
+ headerByte >>= 6;
300
+ block.numValidPixelsType = headerByte;
301
+ if (headerByte === 2) {
302
+ block.numValidPixels = view.getUint8(size);
303
+ size++;
304
+ } else if (headerByte === 1) {
305
+ block.numValidPixels = view.getUint16(size, true);
306
+ size += 2;
307
+ } else if (headerByte === 0) {
308
+ block.numValidPixels = view.getUint32(size, true);
309
+ size += 4;
310
+ } else {
311
+ throw "Invalid valid pixel count type";
312
+ }
313
+ }
314
+ }
315
+ fp += size;
316
+ if (block.encoding === 3) {
317
+ continue;
318
+ }
319
+ var arrayBuf, store8;
320
+ if (block.encoding === 0) {
321
+ var numPixels = (data.pixels.numBytes - 1) / 4;
322
+ if (numPixels !== Math.floor(numPixels)) {
323
+ throw "uncompressed block has invalid length";
324
+ }
325
+ arrayBuf = new ArrayBuffer(numPixels * 4);
326
+ store8 = new Uint8Array(arrayBuf);
327
+ store8.set(new Uint8Array(input, fp, numPixels * 4));
328
+ var rawData = new Float32Array(arrayBuf);
329
+ block.rawData = rawData;
330
+ fp += numPixels * 4;
331
+ } else if (block.encoding === 1) {
332
+ var dataBytes = Math.ceil(block.numValidPixels * block.bitsPerPixel / 8);
333
+ var dataWords = Math.ceil(dataBytes / 4);
334
+ arrayBuf = new ArrayBuffer(dataWords * 4);
335
+ store8 = new Uint8Array(arrayBuf);
336
+ store8.set(new Uint8Array(input, fp, dataBytes));
337
+ block.stuffedData = new Uint32Array(arrayBuf);
338
+ fp += dataBytes;
339
+ }
340
+ }
341
+ }
342
+ data.eofOffset = fp;
343
+ return data;
344
+ };
345
+ var unstuff = function(src, bitsPerPixel, numPixels, offset, scale, dest, maxValue) {
346
+ var bitMask = (1 << bitsPerPixel) - 1;
347
+ var i = 0, o;
348
+ var bitsLeft = 0;
349
+ var n, buffer;
350
+ var nmax = Math.ceil((maxValue - offset) / scale);
351
+ var numInvalidTailBytes = src.length * 4 - Math.ceil(bitsPerPixel * numPixels / 8);
352
+ src[src.length - 1] <<= 8 * numInvalidTailBytes;
353
+ for (o = 0; o < numPixels; o++) {
354
+ if (bitsLeft === 0) {
355
+ buffer = src[i++];
356
+ bitsLeft = 32;
357
+ }
358
+ if (bitsLeft >= bitsPerPixel) {
359
+ n = buffer >>> bitsLeft - bitsPerPixel & bitMask;
360
+ bitsLeft -= bitsPerPixel;
361
+ } else {
362
+ var missingBits = bitsPerPixel - bitsLeft;
363
+ n = (buffer & bitMask) << missingBits & bitMask;
364
+ buffer = src[i++];
365
+ bitsLeft = 32 - missingBits;
366
+ n += buffer >>> bitsLeft;
367
+ }
368
+ dest[o] = n < nmax ? offset + n * scale : maxValue;
369
+ }
370
+ return dest;
371
+ };
372
+ return CntZImage;
373
+ }();
374
+ var Lerc2Decode = /* @__PURE__ */ function() {
375
+ var BitStuffer = {
376
+ //methods ending with 2 are for the new byte order used by Lerc2.3 and above.
377
+ //originalUnstuff is used to unpack Huffman code table. code is duplicated to unstuffx for performance reasons.
378
+ unstuff: function(src, dest, bitsPerPixel, numPixels, lutArr, offset, scale, maxValue) {
379
+ var bitMask = (1 << bitsPerPixel) - 1;
380
+ var i = 0, o;
381
+ var bitsLeft = 0;
382
+ var n, buffer, missingBits, nmax;
383
+ var numInvalidTailBytes = src.length * 4 - Math.ceil(bitsPerPixel * numPixels / 8);
384
+ src[src.length - 1] <<= 8 * numInvalidTailBytes;
385
+ if (lutArr) {
386
+ for (o = 0; o < numPixels; o++) {
387
+ if (bitsLeft === 0) {
388
+ buffer = src[i++];
389
+ bitsLeft = 32;
390
+ }
391
+ if (bitsLeft >= bitsPerPixel) {
392
+ n = buffer >>> bitsLeft - bitsPerPixel & bitMask;
393
+ bitsLeft -= bitsPerPixel;
394
+ } else {
395
+ missingBits = bitsPerPixel - bitsLeft;
396
+ n = (buffer & bitMask) << missingBits & bitMask;
397
+ buffer = src[i++];
398
+ bitsLeft = 32 - missingBits;
399
+ n += buffer >>> bitsLeft;
400
+ }
401
+ dest[o] = lutArr[n];
402
+ }
403
+ } else {
404
+ nmax = Math.ceil((maxValue - offset) / scale);
405
+ for (o = 0; o < numPixels; o++) {
406
+ if (bitsLeft === 0) {
407
+ buffer = src[i++];
408
+ bitsLeft = 32;
409
+ }
410
+ if (bitsLeft >= bitsPerPixel) {
411
+ n = buffer >>> bitsLeft - bitsPerPixel & bitMask;
412
+ bitsLeft -= bitsPerPixel;
413
+ } else {
414
+ missingBits = bitsPerPixel - bitsLeft;
415
+ n = (buffer & bitMask) << missingBits & bitMask;
416
+ buffer = src[i++];
417
+ bitsLeft = 32 - missingBits;
418
+ n += buffer >>> bitsLeft;
419
+ }
420
+ dest[o] = n < nmax ? offset + n * scale : maxValue;
421
+ }
422
+ }
423
+ },
424
+ unstuffLUT: function(src, bitsPerPixel, numPixels, offset, scale, maxValue) {
425
+ var bitMask = (1 << bitsPerPixel) - 1;
426
+ var i = 0, o = 0, missingBits = 0, bitsLeft = 0, n = 0;
427
+ var buffer;
428
+ var dest = [];
429
+ var numInvalidTailBytes = src.length * 4 - Math.ceil(bitsPerPixel * numPixels / 8);
430
+ src[src.length - 1] <<= 8 * numInvalidTailBytes;
431
+ var nmax = Math.ceil((maxValue - offset) / scale);
432
+ for (o = 0; o < numPixels; o++) {
433
+ if (bitsLeft === 0) {
434
+ buffer = src[i++];
435
+ bitsLeft = 32;
436
+ }
437
+ if (bitsLeft >= bitsPerPixel) {
438
+ n = buffer >>> bitsLeft - bitsPerPixel & bitMask;
439
+ bitsLeft -= bitsPerPixel;
440
+ } else {
441
+ missingBits = bitsPerPixel - bitsLeft;
442
+ n = (buffer & bitMask) << missingBits & bitMask;
443
+ buffer = src[i++];
444
+ bitsLeft = 32 - missingBits;
445
+ n += buffer >>> bitsLeft;
446
+ }
447
+ dest[o] = n < nmax ? offset + n * scale : maxValue;
448
+ }
449
+ dest.unshift(offset);
450
+ return dest;
451
+ },
452
+ unstuff2: function(src, dest, bitsPerPixel, numPixels, lutArr, offset, scale, maxValue) {
453
+ var bitMask = (1 << bitsPerPixel) - 1;
454
+ var i = 0, o;
455
+ var bitsLeft = 0, bitPos = 0;
456
+ var n, buffer, missingBits;
457
+ if (lutArr) {
458
+ for (o = 0; o < numPixels; o++) {
459
+ if (bitsLeft === 0) {
460
+ buffer = src[i++];
461
+ bitsLeft = 32;
462
+ bitPos = 0;
463
+ }
464
+ if (bitsLeft >= bitsPerPixel) {
465
+ n = buffer >>> bitPos & bitMask;
466
+ bitsLeft -= bitsPerPixel;
467
+ bitPos += bitsPerPixel;
468
+ } else {
469
+ missingBits = bitsPerPixel - bitsLeft;
470
+ n = buffer >>> bitPos & bitMask;
471
+ buffer = src[i++];
472
+ bitsLeft = 32 - missingBits;
473
+ n |= (buffer & (1 << missingBits) - 1) << bitsPerPixel - missingBits;
474
+ bitPos = missingBits;
475
+ }
476
+ dest[o] = lutArr[n];
477
+ }
478
+ } else {
479
+ var nmax = Math.ceil((maxValue - offset) / scale);
480
+ for (o = 0; o < numPixels; o++) {
481
+ if (bitsLeft === 0) {
482
+ buffer = src[i++];
483
+ bitsLeft = 32;
484
+ bitPos = 0;
485
+ }
486
+ if (bitsLeft >= bitsPerPixel) {
487
+ n = buffer >>> bitPos & bitMask;
488
+ bitsLeft -= bitsPerPixel;
489
+ bitPos += bitsPerPixel;
490
+ } else {
491
+ missingBits = bitsPerPixel - bitsLeft;
492
+ n = buffer >>> bitPos & bitMask;
493
+ buffer = src[i++];
494
+ bitsLeft = 32 - missingBits;
495
+ n |= (buffer & (1 << missingBits) - 1) << bitsPerPixel - missingBits;
496
+ bitPos = missingBits;
497
+ }
498
+ dest[o] = n < nmax ? offset + n * scale : maxValue;
499
+ }
500
+ }
501
+ return dest;
502
+ },
503
+ unstuffLUT2: function(src, bitsPerPixel, numPixels, offset, scale, maxValue) {
504
+ var bitMask = (1 << bitsPerPixel) - 1;
505
+ var i = 0, o = 0, missingBits = 0, bitsLeft = 0, n = 0, bitPos = 0;
506
+ var buffer;
507
+ var dest = [];
508
+ var nmax = Math.ceil((maxValue - offset) / scale);
509
+ for (o = 0; o < numPixels; o++) {
510
+ if (bitsLeft === 0) {
511
+ buffer = src[i++];
512
+ bitsLeft = 32;
513
+ bitPos = 0;
514
+ }
515
+ if (bitsLeft >= bitsPerPixel) {
516
+ n = buffer >>> bitPos & bitMask;
517
+ bitsLeft -= bitsPerPixel;
518
+ bitPos += bitsPerPixel;
519
+ } else {
520
+ missingBits = bitsPerPixel - bitsLeft;
521
+ n = buffer >>> bitPos & bitMask;
522
+ buffer = src[i++];
523
+ bitsLeft = 32 - missingBits;
524
+ n |= (buffer & (1 << missingBits) - 1) << bitsPerPixel - missingBits;
525
+ bitPos = missingBits;
526
+ }
527
+ dest[o] = n < nmax ? offset + n * scale : maxValue;
528
+ }
529
+ dest.unshift(offset);
530
+ return dest;
531
+ },
532
+ originalUnstuff: function(src, dest, bitsPerPixel, numPixels) {
533
+ var bitMask = (1 << bitsPerPixel) - 1;
534
+ var i = 0, o;
535
+ var bitsLeft = 0;
536
+ var n, buffer, missingBits;
537
+ var numInvalidTailBytes = src.length * 4 - Math.ceil(bitsPerPixel * numPixels / 8);
538
+ src[src.length - 1] <<= 8 * numInvalidTailBytes;
539
+ for (o = 0; o < numPixels; o++) {
540
+ if (bitsLeft === 0) {
541
+ buffer = src[i++];
542
+ bitsLeft = 32;
543
+ }
544
+ if (bitsLeft >= bitsPerPixel) {
545
+ n = buffer >>> bitsLeft - bitsPerPixel & bitMask;
546
+ bitsLeft -= bitsPerPixel;
547
+ } else {
548
+ missingBits = bitsPerPixel - bitsLeft;
549
+ n = (buffer & bitMask) << missingBits & bitMask;
550
+ buffer = src[i++];
551
+ bitsLeft = 32 - missingBits;
552
+ n += buffer >>> bitsLeft;
553
+ }
554
+ dest[o] = n;
555
+ }
556
+ return dest;
557
+ },
558
+ originalUnstuff2: function(src, dest, bitsPerPixel, numPixels) {
559
+ var bitMask = (1 << bitsPerPixel) - 1;
560
+ var i = 0, o;
561
+ var bitsLeft = 0, bitPos = 0;
562
+ var n, buffer, missingBits;
563
+ for (o = 0; o < numPixels; o++) {
564
+ if (bitsLeft === 0) {
565
+ buffer = src[i++];
566
+ bitsLeft = 32;
567
+ bitPos = 0;
568
+ }
569
+ if (bitsLeft >= bitsPerPixel) {
570
+ n = buffer >>> bitPos & bitMask;
571
+ bitsLeft -= bitsPerPixel;
572
+ bitPos += bitsPerPixel;
573
+ } else {
574
+ missingBits = bitsPerPixel - bitsLeft;
575
+ n = buffer >>> bitPos & bitMask;
576
+ buffer = src[i++];
577
+ bitsLeft = 32 - missingBits;
578
+ n |= (buffer & (1 << missingBits) - 1) << bitsPerPixel - missingBits;
579
+ bitPos = missingBits;
580
+ }
581
+ dest[o] = n;
582
+ }
583
+ return dest;
584
+ }
585
+ };
586
+ var Lerc2Helpers = {
587
+ HUFFMAN_LUT_BITS_MAX: 12,
588
+ //use 2^12 lut, treat it like constant
589
+ computeChecksumFletcher32: function(input) {
590
+ var sum1 = 65535, sum2 = 65535;
591
+ var len = input.length;
592
+ var words = Math.floor(len / 2);
593
+ var i = 0;
594
+ while (words) {
595
+ var tlen = words >= 359 ? 359 : words;
596
+ words -= tlen;
597
+ do {
598
+ sum1 += input[i++] << 8;
599
+ sum2 += sum1 += input[i++];
600
+ } while (--tlen);
601
+ sum1 = (sum1 & 65535) + (sum1 >>> 16);
602
+ sum2 = (sum2 & 65535) + (sum2 >>> 16);
603
+ }
604
+ if (len & 1) {
605
+ sum2 += sum1 += input[i] << 8;
606
+ }
607
+ sum1 = (sum1 & 65535) + (sum1 >>> 16);
608
+ sum2 = (sum2 & 65535) + (sum2 >>> 16);
609
+ return (sum2 << 16 | sum1) >>> 0;
610
+ },
611
+ readHeaderInfo: function(input, data) {
612
+ var ptr = data.ptr;
613
+ var fileIdView = new Uint8Array(input, ptr, 6);
614
+ var headerInfo = {};
615
+ headerInfo.fileIdentifierString = String.fromCharCode.apply(null, fileIdView);
616
+ if (headerInfo.fileIdentifierString.lastIndexOf("Lerc2", 0) !== 0) {
617
+ throw "Unexpected file identifier string (expect Lerc2 ): " + headerInfo.fileIdentifierString;
618
+ }
619
+ ptr += 6;
620
+ var view = new DataView(input, ptr, 8);
621
+ var fileVersion = view.getInt32(0, true);
622
+ headerInfo.fileVersion = fileVersion;
623
+ ptr += 4;
624
+ if (fileVersion >= 3) {
625
+ headerInfo.checksum = view.getUint32(4, true);
626
+ ptr += 4;
627
+ }
628
+ view = new DataView(input, ptr, 12);
629
+ headerInfo.height = view.getUint32(0, true);
630
+ headerInfo.width = view.getUint32(4, true);
631
+ ptr += 8;
632
+ if (fileVersion >= 4) {
633
+ headerInfo.numDims = view.getUint32(8, true);
634
+ ptr += 4;
635
+ } else {
636
+ headerInfo.numDims = 1;
637
+ }
638
+ view = new DataView(input, ptr, 40);
639
+ headerInfo.numValidPixel = view.getUint32(0, true);
640
+ headerInfo.microBlockSize = view.getInt32(4, true);
641
+ headerInfo.blobSize = view.getInt32(8, true);
642
+ headerInfo.imageType = view.getInt32(12, true);
643
+ headerInfo.maxZError = view.getFloat64(16, true);
644
+ headerInfo.zMin = view.getFloat64(24, true);
645
+ headerInfo.zMax = view.getFloat64(32, true);
646
+ ptr += 40;
647
+ data.headerInfo = headerInfo;
648
+ data.ptr = ptr;
649
+ var checksum, keyLength;
650
+ if (fileVersion >= 3) {
651
+ keyLength = fileVersion >= 4 ? 52 : 48;
652
+ checksum = this.computeChecksumFletcher32(new Uint8Array(input, ptr - keyLength, headerInfo.blobSize - 14));
653
+ if (checksum !== headerInfo.checksum) {
654
+ throw "Checksum failed.";
655
+ }
656
+ }
657
+ return true;
658
+ },
659
+ checkMinMaxRanges: function(input, data) {
660
+ var headerInfo = data.headerInfo;
661
+ var OutPixelTypeArray = this.getDataTypeArray(headerInfo.imageType);
662
+ var rangeBytes = headerInfo.numDims * this.getDataTypeSize(headerInfo.imageType);
663
+ var minValues = this.readSubArray(input, data.ptr, OutPixelTypeArray, rangeBytes);
664
+ var maxValues = this.readSubArray(input, data.ptr + rangeBytes, OutPixelTypeArray, rangeBytes);
665
+ data.ptr += 2 * rangeBytes;
666
+ var i, equal = true;
667
+ for (i = 0; i < headerInfo.numDims; i++) {
668
+ if (minValues[i] !== maxValues[i]) {
669
+ equal = false;
670
+ break;
671
+ }
672
+ }
673
+ headerInfo.minValues = minValues;
674
+ headerInfo.maxValues = maxValues;
675
+ return equal;
676
+ },
677
+ readSubArray: function(input, ptr, OutPixelTypeArray, numBytes) {
678
+ var rawData;
679
+ if (OutPixelTypeArray === Uint8Array) {
680
+ rawData = new Uint8Array(input, ptr, numBytes);
681
+ } else {
682
+ var arrayBuf = new ArrayBuffer(numBytes);
683
+ var store8 = new Uint8Array(arrayBuf);
684
+ store8.set(new Uint8Array(input, ptr, numBytes));
685
+ rawData = new OutPixelTypeArray(arrayBuf);
686
+ }
687
+ return rawData;
688
+ },
689
+ readMask: function(input, data) {
690
+ var ptr = data.ptr;
691
+ var headerInfo = data.headerInfo;
692
+ var numPixels = headerInfo.width * headerInfo.height;
693
+ var numValidPixel = headerInfo.numValidPixel;
694
+ var view = new DataView(input, ptr, 4);
695
+ var mask = {};
696
+ mask.numBytes = view.getUint32(0, true);
697
+ ptr += 4;
698
+ if ((0 === numValidPixel || numPixels === numValidPixel) && 0 !== mask.numBytes) {
699
+ throw "invalid mask";
700
+ }
701
+ var bitset, resultMask;
702
+ if (numValidPixel === 0) {
703
+ bitset = new Uint8Array(Math.ceil(numPixels / 8));
704
+ mask.bitset = bitset;
705
+ resultMask = new Uint8Array(numPixels);
706
+ data.pixels.resultMask = resultMask;
707
+ ptr += mask.numBytes;
708
+ } else if (mask.numBytes > 0) {
709
+ bitset = new Uint8Array(Math.ceil(numPixels / 8));
710
+ view = new DataView(input, ptr, mask.numBytes);
711
+ var cnt = view.getInt16(0, true);
712
+ var ip = 2, op = 0, val = 0;
713
+ do {
714
+ if (cnt > 0) {
715
+ while (cnt--) {
716
+ bitset[op++] = view.getUint8(ip++);
717
+ }
718
+ } else {
719
+ val = view.getUint8(ip++);
720
+ cnt = -cnt;
721
+ while (cnt--) {
722
+ bitset[op++] = val;
723
+ }
724
+ }
725
+ cnt = view.getInt16(ip, true);
726
+ ip += 2;
727
+ } while (ip < mask.numBytes);
728
+ if (cnt !== -32768 || op < bitset.length) {
729
+ throw "Unexpected end of mask RLE encoding";
730
+ }
731
+ resultMask = new Uint8Array(numPixels);
732
+ var mb = 0, k = 0;
733
+ for (k = 0; k < numPixels; k++) {
734
+ if (k & 7) {
735
+ mb = bitset[k >> 3];
736
+ mb <<= k & 7;
737
+ } else {
738
+ mb = bitset[k >> 3];
739
+ }
740
+ if (mb & 128) {
741
+ resultMask[k] = 1;
742
+ }
743
+ }
744
+ data.pixels.resultMask = resultMask;
745
+ mask.bitset = bitset;
746
+ ptr += mask.numBytes;
747
+ }
748
+ data.ptr = ptr;
749
+ data.mask = mask;
750
+ return true;
751
+ },
752
+ readDataOneSweep: function(input, data, OutPixelTypeArray, useBSQForOutputDim) {
753
+ var ptr = data.ptr;
754
+ var headerInfo = data.headerInfo;
755
+ var numDims = headerInfo.numDims;
756
+ var numPixels = headerInfo.width * headerInfo.height;
757
+ var imageType = headerInfo.imageType;
758
+ var numBytes = headerInfo.numValidPixel * Lerc2Helpers.getDataTypeSize(imageType) * numDims;
759
+ var rawData;
760
+ var mask = data.pixels.resultMask;
761
+ if (OutPixelTypeArray === Uint8Array) {
762
+ rawData = new Uint8Array(input, ptr, numBytes);
763
+ } else {
764
+ var arrayBuf = new ArrayBuffer(numBytes);
765
+ var store8 = new Uint8Array(arrayBuf);
766
+ store8.set(new Uint8Array(input, ptr, numBytes));
767
+ rawData = new OutPixelTypeArray(arrayBuf);
768
+ }
769
+ if (rawData.length === numPixels * numDims) {
770
+ if (useBSQForOutputDim) {
771
+ data.pixels.resultPixels = Lerc2Helpers.swapDimensionOrder(rawData, numPixels, numDims, OutPixelTypeArray, true);
772
+ } else {
773
+ data.pixels.resultPixels = rawData;
774
+ }
775
+ } else {
776
+ data.pixels.resultPixels = new OutPixelTypeArray(numPixels * numDims);
777
+ var z = 0, k = 0, i = 0, nStart = 0;
778
+ if (numDims > 1) {
779
+ if (useBSQForOutputDim) {
780
+ for (k = 0; k < numPixels; k++) {
781
+ if (mask[k]) {
782
+ nStart = k;
783
+ for (i = 0; i < numDims; i++, nStart += numPixels) {
784
+ data.pixels.resultPixels[nStart] = rawData[z++];
785
+ }
786
+ }
787
+ }
788
+ } else {
789
+ for (k = 0; k < numPixels; k++) {
790
+ if (mask[k]) {
791
+ nStart = k * numDims;
792
+ for (i = 0; i < numDims; i++) {
793
+ data.pixels.resultPixels[nStart + i] = rawData[z++];
794
+ }
795
+ }
796
+ }
797
+ }
798
+ } else {
799
+ for (k = 0; k < numPixels; k++) {
800
+ if (mask[k]) {
801
+ data.pixels.resultPixels[k] = rawData[z++];
802
+ }
803
+ }
804
+ }
805
+ }
806
+ ptr += numBytes;
807
+ data.ptr = ptr;
808
+ return true;
809
+ },
810
+ readHuffmanTree: function(input, data) {
811
+ var BITS_MAX = this.HUFFMAN_LUT_BITS_MAX;
812
+ var view = new DataView(input, data.ptr, 16);
813
+ data.ptr += 16;
814
+ var version = view.getInt32(0, true);
815
+ if (version < 2) {
816
+ throw "unsupported Huffman version";
817
+ }
818
+ var size = view.getInt32(4, true);
819
+ var i0 = view.getInt32(8, true);
820
+ var i1 = view.getInt32(12, true);
821
+ if (i0 >= i1) {
822
+ return false;
823
+ }
824
+ var blockDataBuffer = new Uint32Array(i1 - i0);
825
+ Lerc2Helpers.decodeBits(input, data, blockDataBuffer);
826
+ var codeTable = [];
827
+ var i, j, k, len;
828
+ for (i = i0; i < i1; i++) {
829
+ j = i - (i < size ? 0 : size);
830
+ codeTable[j] = { first: blockDataBuffer[i - i0], second: null };
831
+ }
832
+ var dataBytes = input.byteLength - data.ptr;
833
+ var dataWords = Math.ceil(dataBytes / 4);
834
+ var arrayBuf = new ArrayBuffer(dataWords * 4);
835
+ var store8 = new Uint8Array(arrayBuf);
836
+ store8.set(new Uint8Array(input, data.ptr, dataBytes));
837
+ var stuffedData = new Uint32Array(arrayBuf);
838
+ var bitPos = 0, word, srcPtr = 0;
839
+ word = stuffedData[0];
840
+ for (i = i0; i < i1; i++) {
841
+ j = i - (i < size ? 0 : size);
842
+ len = codeTable[j].first;
843
+ if (len > 0) {
844
+ codeTable[j].second = word << bitPos >>> 32 - len;
845
+ if (32 - bitPos >= len) {
846
+ bitPos += len;
847
+ if (bitPos === 32) {
848
+ bitPos = 0;
849
+ srcPtr++;
850
+ word = stuffedData[srcPtr];
851
+ }
852
+ } else {
853
+ bitPos += len - 32;
854
+ srcPtr++;
855
+ word = stuffedData[srcPtr];
856
+ codeTable[j].second |= word >>> 32 - bitPos;
857
+ }
858
+ }
859
+ }
860
+ var numBitsLUT = 0, numBitsLUTQick = 0;
861
+ var tree = new TreeNode();
862
+ for (i = 0; i < codeTable.length; i++) {
863
+ if (codeTable[i] !== void 0) {
864
+ numBitsLUT = Math.max(numBitsLUT, codeTable[i].first);
865
+ }
866
+ }
867
+ if (numBitsLUT >= BITS_MAX) {
868
+ numBitsLUTQick = BITS_MAX;
869
+ } else {
870
+ numBitsLUTQick = numBitsLUT;
871
+ }
872
+ var decodeLut = [], entry, code, numEntries, jj, currentBit, node;
873
+ for (i = i0; i < i1; i++) {
874
+ j = i - (i < size ? 0 : size);
875
+ len = codeTable[j].first;
876
+ if (len > 0) {
877
+ entry = [len, j];
878
+ if (len <= numBitsLUTQick) {
879
+ code = codeTable[j].second << numBitsLUTQick - len;
880
+ numEntries = 1 << numBitsLUTQick - len;
881
+ for (k = 0; k < numEntries; k++) {
882
+ decodeLut[code | k] = entry;
883
+ }
884
+ } else {
885
+ code = codeTable[j].second;
886
+ node = tree;
887
+ for (jj = len - 1; jj >= 0; jj--) {
888
+ currentBit = code >>> jj & 1;
889
+ if (currentBit) {
890
+ if (!node.right) {
891
+ node.right = new TreeNode();
892
+ }
893
+ node = node.right;
894
+ } else {
895
+ if (!node.left) {
896
+ node.left = new TreeNode();
897
+ }
898
+ node = node.left;
899
+ }
900
+ if (jj === 0 && !node.val) {
901
+ node.val = entry[1];
902
+ }
903
+ }
904
+ }
905
+ }
906
+ }
907
+ return {
908
+ decodeLut,
909
+ numBitsLUTQick,
910
+ numBitsLUT,
911
+ tree,
912
+ stuffedData,
913
+ srcPtr,
914
+ bitPos
915
+ };
916
+ },
917
+ readHuffman: function(input, data, OutPixelTypeArray, useBSQForOutputDim) {
918
+ var headerInfo = data.headerInfo;
919
+ var numDims = headerInfo.numDims;
920
+ var height = data.headerInfo.height;
921
+ var width = data.headerInfo.width;
922
+ var numPixels = width * height;
923
+ var huffmanInfo = this.readHuffmanTree(input, data);
924
+ var decodeLut = huffmanInfo.decodeLut;
925
+ var tree = huffmanInfo.tree;
926
+ var stuffedData = huffmanInfo.stuffedData;
927
+ var srcPtr = huffmanInfo.srcPtr;
928
+ var bitPos = huffmanInfo.bitPos;
929
+ var numBitsLUTQick = huffmanInfo.numBitsLUTQick;
930
+ var numBitsLUT = huffmanInfo.numBitsLUT;
931
+ var offset = data.headerInfo.imageType === 0 ? 128 : 0;
932
+ var node, val, delta, mask = data.pixels.resultMask, valTmp, valTmpQuick, currentBit;
933
+ var i, j, k, ii;
934
+ var prevVal = 0;
935
+ if (bitPos > 0) {
936
+ srcPtr++;
937
+ bitPos = 0;
938
+ }
939
+ var word = stuffedData[srcPtr];
940
+ var deltaEncode = data.encodeMode === 1;
941
+ var resultPixelsAllDim = new OutPixelTypeArray(numPixels * numDims);
942
+ var resultPixels = resultPixelsAllDim;
943
+ var iDim;
944
+ if (numDims < 2 || deltaEncode) {
945
+ for (iDim = 0; iDim < numDims; iDim++) {
946
+ if (numDims > 1) {
947
+ resultPixels = new OutPixelTypeArray(resultPixelsAllDim.buffer, numPixels * iDim, numPixels);
948
+ prevVal = 0;
949
+ }
950
+ if (data.headerInfo.numValidPixel === width * height) {
951
+ for (k = 0, i = 0; i < height; i++) {
952
+ for (j = 0; j < width; j++, k++) {
953
+ val = 0;
954
+ valTmp = word << bitPos >>> 32 - numBitsLUTQick;
955
+ valTmpQuick = valTmp;
956
+ if (32 - bitPos < numBitsLUTQick) {
957
+ valTmp |= stuffedData[srcPtr + 1] >>> 64 - bitPos - numBitsLUTQick;
958
+ valTmpQuick = valTmp;
959
+ }
960
+ if (decodeLut[valTmpQuick]) {
961
+ val = decodeLut[valTmpQuick][1];
962
+ bitPos += decodeLut[valTmpQuick][0];
963
+ } else {
964
+ valTmp = word << bitPos >>> 32 - numBitsLUT;
965
+ valTmpQuick = valTmp;
966
+ if (32 - bitPos < numBitsLUT) {
967
+ valTmp |= stuffedData[srcPtr + 1] >>> 64 - bitPos - numBitsLUT;
968
+ valTmpQuick = valTmp;
969
+ }
970
+ node = tree;
971
+ for (ii = 0; ii < numBitsLUT; ii++) {
972
+ currentBit = valTmp >>> numBitsLUT - ii - 1 & 1;
973
+ node = currentBit ? node.right : node.left;
974
+ if (!(node.left || node.right)) {
975
+ val = node.val;
976
+ bitPos = bitPos + ii + 1;
977
+ break;
978
+ }
979
+ }
980
+ }
981
+ if (bitPos >= 32) {
982
+ bitPos -= 32;
983
+ srcPtr++;
984
+ word = stuffedData[srcPtr];
985
+ }
986
+ delta = val - offset;
987
+ if (deltaEncode) {
988
+ if (j > 0) {
989
+ delta += prevVal;
990
+ } else if (i > 0) {
991
+ delta += resultPixels[k - width];
992
+ } else {
993
+ delta += prevVal;
994
+ }
995
+ delta &= 255;
996
+ resultPixels[k] = delta;
997
+ prevVal = delta;
998
+ } else {
999
+ resultPixels[k] = delta;
1000
+ }
1001
+ }
1002
+ }
1003
+ } else {
1004
+ for (k = 0, i = 0; i < height; i++) {
1005
+ for (j = 0; j < width; j++, k++) {
1006
+ if (mask[k]) {
1007
+ val = 0;
1008
+ valTmp = word << bitPos >>> 32 - numBitsLUTQick;
1009
+ valTmpQuick = valTmp;
1010
+ if (32 - bitPos < numBitsLUTQick) {
1011
+ valTmp |= stuffedData[srcPtr + 1] >>> 64 - bitPos - numBitsLUTQick;
1012
+ valTmpQuick = valTmp;
1013
+ }
1014
+ if (decodeLut[valTmpQuick]) {
1015
+ val = decodeLut[valTmpQuick][1];
1016
+ bitPos += decodeLut[valTmpQuick][0];
1017
+ } else {
1018
+ valTmp = word << bitPos >>> 32 - numBitsLUT;
1019
+ valTmpQuick = valTmp;
1020
+ if (32 - bitPos < numBitsLUT) {
1021
+ valTmp |= stuffedData[srcPtr + 1] >>> 64 - bitPos - numBitsLUT;
1022
+ valTmpQuick = valTmp;
1023
+ }
1024
+ node = tree;
1025
+ for (ii = 0; ii < numBitsLUT; ii++) {
1026
+ currentBit = valTmp >>> numBitsLUT - ii - 1 & 1;
1027
+ node = currentBit ? node.right : node.left;
1028
+ if (!(node.left || node.right)) {
1029
+ val = node.val;
1030
+ bitPos = bitPos + ii + 1;
1031
+ break;
1032
+ }
1033
+ }
1034
+ }
1035
+ if (bitPos >= 32) {
1036
+ bitPos -= 32;
1037
+ srcPtr++;
1038
+ word = stuffedData[srcPtr];
1039
+ }
1040
+ delta = val - offset;
1041
+ if (deltaEncode) {
1042
+ if (j > 0 && mask[k - 1]) {
1043
+ delta += prevVal;
1044
+ } else if (i > 0 && mask[k - width]) {
1045
+ delta += resultPixels[k - width];
1046
+ } else {
1047
+ delta += prevVal;
1048
+ }
1049
+ delta &= 255;
1050
+ resultPixels[k] = delta;
1051
+ prevVal = delta;
1052
+ } else {
1053
+ resultPixels[k] = delta;
1054
+ }
1055
+ }
1056
+ }
1057
+ }
1058
+ }
1059
+ }
1060
+ } else {
1061
+ for (k = 0, i = 0; i < height; i++) {
1062
+ for (j = 0; j < width; j++) {
1063
+ k = i * width + j;
1064
+ if (!mask || mask[k]) {
1065
+ for (iDim = 0; iDim < numDims; iDim++, k += numPixels) {
1066
+ val = 0;
1067
+ valTmp = word << bitPos >>> 32 - numBitsLUTQick;
1068
+ valTmpQuick = valTmp;
1069
+ if (32 - bitPos < numBitsLUTQick) {
1070
+ valTmp |= stuffedData[srcPtr + 1] >>> 64 - bitPos - numBitsLUTQick;
1071
+ valTmpQuick = valTmp;
1072
+ }
1073
+ if (decodeLut[valTmpQuick]) {
1074
+ val = decodeLut[valTmpQuick][1];
1075
+ bitPos += decodeLut[valTmpQuick][0];
1076
+ } else {
1077
+ valTmp = word << bitPos >>> 32 - numBitsLUT;
1078
+ valTmpQuick = valTmp;
1079
+ if (32 - bitPos < numBitsLUT) {
1080
+ valTmp |= stuffedData[srcPtr + 1] >>> 64 - bitPos - numBitsLUT;
1081
+ valTmpQuick = valTmp;
1082
+ }
1083
+ node = tree;
1084
+ for (ii = 0; ii < numBitsLUT; ii++) {
1085
+ currentBit = valTmp >>> numBitsLUT - ii - 1 & 1;
1086
+ node = currentBit ? node.right : node.left;
1087
+ if (!(node.left || node.right)) {
1088
+ val = node.val;
1089
+ bitPos = bitPos + ii + 1;
1090
+ break;
1091
+ }
1092
+ }
1093
+ }
1094
+ if (bitPos >= 32) {
1095
+ bitPos -= 32;
1096
+ srcPtr++;
1097
+ word = stuffedData[srcPtr];
1098
+ }
1099
+ delta = val - offset;
1100
+ resultPixels[k] = delta;
1101
+ }
1102
+ }
1103
+ }
1104
+ }
1105
+ }
1106
+ data.ptr = data.ptr + (srcPtr + 1) * 4 + (bitPos > 0 ? 4 : 0);
1107
+ data.pixels.resultPixels = resultPixelsAllDim;
1108
+ if (numDims > 1 && !useBSQForOutputDim) {
1109
+ data.pixels.resultPixels = Lerc2Helpers.swapDimensionOrder(resultPixelsAllDim, numPixels, numDims, OutPixelTypeArray);
1110
+ }
1111
+ },
1112
+ decodeBits: function(input, data, blockDataBuffer, offset, iDim) {
1113
+ {
1114
+ var headerInfo = data.headerInfo;
1115
+ var fileVersion = headerInfo.fileVersion;
1116
+ var blockPtr = 0;
1117
+ var viewByteLength = input.byteLength - data.ptr >= 5 ? 5 : input.byteLength - data.ptr;
1118
+ var view = new DataView(input, data.ptr, viewByteLength);
1119
+ var headerByte = view.getUint8(0);
1120
+ blockPtr++;
1121
+ var bits67 = headerByte >> 6;
1122
+ var n = bits67 === 0 ? 4 : 3 - bits67;
1123
+ var doLut = (headerByte & 32) > 0 ? true : false;
1124
+ var numBits = headerByte & 31;
1125
+ var numElements = 0;
1126
+ if (n === 1) {
1127
+ numElements = view.getUint8(blockPtr);
1128
+ blockPtr++;
1129
+ } else if (n === 2) {
1130
+ numElements = view.getUint16(blockPtr, true);
1131
+ blockPtr += 2;
1132
+ } else if (n === 4) {
1133
+ numElements = view.getUint32(blockPtr, true);
1134
+ blockPtr += 4;
1135
+ } else {
1136
+ throw "Invalid valid pixel count type";
1137
+ }
1138
+ var scale = 2 * headerInfo.maxZError;
1139
+ var stuffedData, arrayBuf, store8, dataBytes, dataWords;
1140
+ var lutArr, lutData, lutBytes, bitsPerPixel;
1141
+ var zMax = headerInfo.numDims > 1 ? headerInfo.maxValues[iDim] : headerInfo.zMax;
1142
+ if (doLut) {
1143
+ data.counter.lut++;
1144
+ lutBytes = view.getUint8(blockPtr);
1145
+ blockPtr++;
1146
+ dataBytes = Math.ceil((lutBytes - 1) * numBits / 8);
1147
+ dataWords = Math.ceil(dataBytes / 4);
1148
+ arrayBuf = new ArrayBuffer(dataWords * 4);
1149
+ store8 = new Uint8Array(arrayBuf);
1150
+ data.ptr += blockPtr;
1151
+ store8.set(new Uint8Array(input, data.ptr, dataBytes));
1152
+ lutData = new Uint32Array(arrayBuf);
1153
+ data.ptr += dataBytes;
1154
+ bitsPerPixel = 0;
1155
+ while (lutBytes - 1 >>> bitsPerPixel) {
1156
+ bitsPerPixel++;
1157
+ }
1158
+ dataBytes = Math.ceil(numElements * bitsPerPixel / 8);
1159
+ dataWords = Math.ceil(dataBytes / 4);
1160
+ arrayBuf = new ArrayBuffer(dataWords * 4);
1161
+ store8 = new Uint8Array(arrayBuf);
1162
+ store8.set(new Uint8Array(input, data.ptr, dataBytes));
1163
+ stuffedData = new Uint32Array(arrayBuf);
1164
+ data.ptr += dataBytes;
1165
+ if (fileVersion >= 3) {
1166
+ lutArr = BitStuffer.unstuffLUT2(lutData, numBits, lutBytes - 1, offset, scale, zMax);
1167
+ } else {
1168
+ lutArr = BitStuffer.unstuffLUT(lutData, numBits, lutBytes - 1, offset, scale, zMax);
1169
+ }
1170
+ if (fileVersion >= 3) {
1171
+ BitStuffer.unstuff2(stuffedData, blockDataBuffer, bitsPerPixel, numElements, lutArr);
1172
+ } else {
1173
+ BitStuffer.unstuff(stuffedData, blockDataBuffer, bitsPerPixel, numElements, lutArr);
1174
+ }
1175
+ } else {
1176
+ data.counter.bitstuffer++;
1177
+ bitsPerPixel = numBits;
1178
+ data.ptr += blockPtr;
1179
+ if (bitsPerPixel > 0) {
1180
+ dataBytes = Math.ceil(numElements * bitsPerPixel / 8);
1181
+ dataWords = Math.ceil(dataBytes / 4);
1182
+ arrayBuf = new ArrayBuffer(dataWords * 4);
1183
+ store8 = new Uint8Array(arrayBuf);
1184
+ store8.set(new Uint8Array(input, data.ptr, dataBytes));
1185
+ stuffedData = new Uint32Array(arrayBuf);
1186
+ data.ptr += dataBytes;
1187
+ if (fileVersion >= 3) {
1188
+ if (offset == null) {
1189
+ BitStuffer.originalUnstuff2(stuffedData, blockDataBuffer, bitsPerPixel, numElements);
1190
+ } else {
1191
+ BitStuffer.unstuff2(stuffedData, blockDataBuffer, bitsPerPixel, numElements, false, offset, scale, zMax);
1192
+ }
1193
+ } else {
1194
+ if (offset == null) {
1195
+ BitStuffer.originalUnstuff(stuffedData, blockDataBuffer, bitsPerPixel, numElements);
1196
+ } else {
1197
+ BitStuffer.unstuff(stuffedData, blockDataBuffer, bitsPerPixel, numElements, false, offset, scale, zMax);
1198
+ }
1199
+ }
1200
+ }
1201
+ }
1202
+ }
1203
+ },
1204
+ readTiles: function(input, data, OutPixelTypeArray, useBSQForOutputDim) {
1205
+ var headerInfo = data.headerInfo;
1206
+ var width = headerInfo.width;
1207
+ var height = headerInfo.height;
1208
+ var numPixels = width * height;
1209
+ var microBlockSize = headerInfo.microBlockSize;
1210
+ var imageType = headerInfo.imageType;
1211
+ var dataTypeSize = Lerc2Helpers.getDataTypeSize(imageType);
1212
+ var numBlocksX = Math.ceil(width / microBlockSize);
1213
+ var numBlocksY = Math.ceil(height / microBlockSize);
1214
+ data.pixels.numBlocksY = numBlocksY;
1215
+ data.pixels.numBlocksX = numBlocksX;
1216
+ data.pixels.ptr = 0;
1217
+ var row = 0, col = 0, blockY = 0, blockX = 0, thisBlockHeight = 0, thisBlockWidth = 0, bytesLeft = 0, headerByte = 0, bits67 = 0, testCode = 0, outPtr = 0, outStride = 0, numBytes = 0, bytesleft = 0, z = 0, blockPtr = 0;
1218
+ var view, block, arrayBuf, store8, rawData;
1219
+ var blockEncoding;
1220
+ var blockDataBuffer = new OutPixelTypeArray(microBlockSize * microBlockSize);
1221
+ var lastBlockHeight = height % microBlockSize || microBlockSize;
1222
+ var lastBlockWidth = width % microBlockSize || microBlockSize;
1223
+ var offsetType, offset;
1224
+ var numDims = headerInfo.numDims, iDim;
1225
+ var mask = data.pixels.resultMask;
1226
+ var resultPixels = data.pixels.resultPixels;
1227
+ var fileVersion = headerInfo.fileVersion;
1228
+ var fileVersionCheckNum = fileVersion >= 5 ? 14 : 15;
1229
+ var isDiffEncoding;
1230
+ var zMax = headerInfo.zMax;
1231
+ var resultPixelsPrevDim;
1232
+ for (blockY = 0; blockY < numBlocksY; blockY++) {
1233
+ thisBlockHeight = blockY !== numBlocksY - 1 ? microBlockSize : lastBlockHeight;
1234
+ for (blockX = 0; blockX < numBlocksX; blockX++) {
1235
+ thisBlockWidth = blockX !== numBlocksX - 1 ? microBlockSize : lastBlockWidth;
1236
+ outPtr = blockY * width * microBlockSize + blockX * microBlockSize;
1237
+ outStride = width - thisBlockWidth;
1238
+ for (iDim = 0; iDim < numDims; iDim++) {
1239
+ if (numDims > 1) {
1240
+ resultPixelsPrevDim = resultPixels;
1241
+ outPtr = blockY * width * microBlockSize + blockX * microBlockSize;
1242
+ resultPixels = new OutPixelTypeArray(data.pixels.resultPixels.buffer, numPixels * iDim * dataTypeSize, numPixels);
1243
+ zMax = headerInfo.maxValues[iDim];
1244
+ } else {
1245
+ resultPixelsPrevDim = null;
1246
+ }
1247
+ bytesLeft = input.byteLength - data.ptr;
1248
+ view = new DataView(input, data.ptr, Math.min(10, bytesLeft));
1249
+ block = {};
1250
+ blockPtr = 0;
1251
+ headerByte = view.getUint8(0);
1252
+ blockPtr++;
1253
+ isDiffEncoding = headerInfo.fileVersion >= 5 ? headerByte & 4 : 0;
1254
+ bits67 = headerByte >> 6 & 255;
1255
+ testCode = headerByte >> 2 & fileVersionCheckNum;
1256
+ if (testCode !== (blockX * microBlockSize >> 3 & fileVersionCheckNum)) {
1257
+ throw "integrity issue";
1258
+ }
1259
+ if (isDiffEncoding && iDim === 0) {
1260
+ throw "integrity issue";
1261
+ }
1262
+ blockEncoding = headerByte & 3;
1263
+ if (blockEncoding > 3) {
1264
+ data.ptr += blockPtr;
1265
+ throw "Invalid block encoding (" + blockEncoding + ")";
1266
+ } else if (blockEncoding === 2) {
1267
+ if (isDiffEncoding) {
1268
+ if (mask) {
1269
+ for (row = 0; row < thisBlockHeight; row++) {
1270
+ for (col = 0; col < thisBlockWidth; col++) {
1271
+ if (mask[outPtr]) {
1272
+ resultPixels[outPtr] = resultPixelsPrevDim[outPtr];
1273
+ }
1274
+ outPtr++;
1275
+ }
1276
+ }
1277
+ } else {
1278
+ for (row = 0; row < thisBlockHeight; row++) {
1279
+ for (col = 0; col < thisBlockWidth; col++) {
1280
+ resultPixels[outPtr] = resultPixelsPrevDim[outPtr];
1281
+ outPtr++;
1282
+ }
1283
+ }
1284
+ }
1285
+ }
1286
+ data.counter.constant++;
1287
+ data.ptr += blockPtr;
1288
+ continue;
1289
+ } else if (blockEncoding === 0) {
1290
+ if (isDiffEncoding) {
1291
+ throw "integrity issue";
1292
+ }
1293
+ data.counter.uncompressed++;
1294
+ data.ptr += blockPtr;
1295
+ numBytes = thisBlockHeight * thisBlockWidth * dataTypeSize;
1296
+ bytesleft = input.byteLength - data.ptr;
1297
+ numBytes = numBytes < bytesleft ? numBytes : bytesleft;
1298
+ arrayBuf = new ArrayBuffer(numBytes % dataTypeSize === 0 ? numBytes : numBytes + dataTypeSize - numBytes % dataTypeSize);
1299
+ store8 = new Uint8Array(arrayBuf);
1300
+ store8.set(new Uint8Array(input, data.ptr, numBytes));
1301
+ rawData = new OutPixelTypeArray(arrayBuf);
1302
+ z = 0;
1303
+ if (mask) {
1304
+ for (row = 0; row < thisBlockHeight; row++) {
1305
+ for (col = 0; col < thisBlockWidth; col++) {
1306
+ if (mask[outPtr]) {
1307
+ resultPixels[outPtr] = rawData[z++];
1308
+ }
1309
+ outPtr++;
1310
+ }
1311
+ outPtr += outStride;
1312
+ }
1313
+ } else {
1314
+ for (row = 0; row < thisBlockHeight; row++) {
1315
+ for (col = 0; col < thisBlockWidth; col++) {
1316
+ resultPixels[outPtr++] = rawData[z++];
1317
+ }
1318
+ outPtr += outStride;
1319
+ }
1320
+ }
1321
+ data.ptr += z * dataTypeSize;
1322
+ } else {
1323
+ offsetType = Lerc2Helpers.getDataTypeUsed(isDiffEncoding && imageType < 6 ? 4 : imageType, bits67);
1324
+ offset = Lerc2Helpers.getOnePixel(block, blockPtr, offsetType, view);
1325
+ blockPtr += Lerc2Helpers.getDataTypeSize(offsetType);
1326
+ if (blockEncoding === 3) {
1327
+ data.ptr += blockPtr;
1328
+ data.counter.constantoffset++;
1329
+ if (mask) {
1330
+ for (row = 0; row < thisBlockHeight; row++) {
1331
+ for (col = 0; col < thisBlockWidth; col++) {
1332
+ if (mask[outPtr]) {
1333
+ resultPixels[outPtr] = isDiffEncoding ? Math.min(zMax, resultPixelsPrevDim[outPtr] + offset) : offset;
1334
+ }
1335
+ outPtr++;
1336
+ }
1337
+ outPtr += outStride;
1338
+ }
1339
+ } else {
1340
+ for (row = 0; row < thisBlockHeight; row++) {
1341
+ for (col = 0; col < thisBlockWidth; col++) {
1342
+ resultPixels[outPtr] = isDiffEncoding ? Math.min(zMax, resultPixelsPrevDim[outPtr] + offset) : offset;
1343
+ outPtr++;
1344
+ }
1345
+ outPtr += outStride;
1346
+ }
1347
+ }
1348
+ } else {
1349
+ data.ptr += blockPtr;
1350
+ Lerc2Helpers.decodeBits(input, data, blockDataBuffer, offset, iDim);
1351
+ blockPtr = 0;
1352
+ if (isDiffEncoding) {
1353
+ if (mask) {
1354
+ for (row = 0; row < thisBlockHeight; row++) {
1355
+ for (col = 0; col < thisBlockWidth; col++) {
1356
+ if (mask[outPtr]) {
1357
+ resultPixels[outPtr] = blockDataBuffer[blockPtr++] + resultPixelsPrevDim[outPtr];
1358
+ }
1359
+ outPtr++;
1360
+ }
1361
+ outPtr += outStride;
1362
+ }
1363
+ } else {
1364
+ for (row = 0; row < thisBlockHeight; row++) {
1365
+ for (col = 0; col < thisBlockWidth; col++) {
1366
+ resultPixels[outPtr] = blockDataBuffer[blockPtr++] + resultPixelsPrevDim[outPtr];
1367
+ outPtr++;
1368
+ }
1369
+ outPtr += outStride;
1370
+ }
1371
+ }
1372
+ } else if (mask) {
1373
+ for (row = 0; row < thisBlockHeight; row++) {
1374
+ for (col = 0; col < thisBlockWidth; col++) {
1375
+ if (mask[outPtr]) {
1376
+ resultPixels[outPtr] = blockDataBuffer[blockPtr++];
1377
+ }
1378
+ outPtr++;
1379
+ }
1380
+ outPtr += outStride;
1381
+ }
1382
+ } else {
1383
+ for (row = 0; row < thisBlockHeight; row++) {
1384
+ for (col = 0; col < thisBlockWidth; col++) {
1385
+ resultPixels[outPtr++] = blockDataBuffer[blockPtr++];
1386
+ }
1387
+ outPtr += outStride;
1388
+ }
1389
+ }
1390
+ }
1391
+ }
1392
+ }
1393
+ }
1394
+ }
1395
+ if (numDims > 1 && !useBSQForOutputDim) {
1396
+ data.pixels.resultPixels = Lerc2Helpers.swapDimensionOrder(data.pixels.resultPixels, numPixels, numDims, OutPixelTypeArray);
1397
+ }
1398
+ },
1399
+ /*****************
1400
+ * private methods (helper methods)
1401
+ *****************/
1402
+ formatFileInfo: function(data) {
1403
+ return {
1404
+ "fileIdentifierString": data.headerInfo.fileIdentifierString,
1405
+ "fileVersion": data.headerInfo.fileVersion,
1406
+ "imageType": data.headerInfo.imageType,
1407
+ "height": data.headerInfo.height,
1408
+ "width": data.headerInfo.width,
1409
+ "numValidPixel": data.headerInfo.numValidPixel,
1410
+ "microBlockSize": data.headerInfo.microBlockSize,
1411
+ "blobSize": data.headerInfo.blobSize,
1412
+ "maxZError": data.headerInfo.maxZError,
1413
+ "pixelType": Lerc2Helpers.getPixelType(data.headerInfo.imageType),
1414
+ "eofOffset": data.eofOffset,
1415
+ "mask": data.mask ? {
1416
+ "numBytes": data.mask.numBytes
1417
+ } : null,
1418
+ "pixels": {
1419
+ "numBlocksX": data.pixels.numBlocksX,
1420
+ "numBlocksY": data.pixels.numBlocksY,
1421
+ //"numBytes": data.pixels.numBytes,
1422
+ "maxValue": data.headerInfo.zMax,
1423
+ "minValue": data.headerInfo.zMin,
1424
+ "noDataValue": data.noDataValue
1425
+ }
1426
+ };
1427
+ },
1428
+ constructConstantSurface: function(data, useBSQForOutputDim) {
1429
+ var val = data.headerInfo.zMax;
1430
+ var valMin = data.headerInfo.zMin;
1431
+ var maxValues = data.headerInfo.maxValues;
1432
+ var numDims = data.headerInfo.numDims;
1433
+ var numPixels = data.headerInfo.height * data.headerInfo.width;
1434
+ var i = 0, k = 0, nStart = 0;
1435
+ var mask = data.pixels.resultMask;
1436
+ var resultPixels = data.pixels.resultPixels;
1437
+ if (mask) {
1438
+ if (numDims > 1) {
1439
+ if (useBSQForOutputDim) {
1440
+ for (i = 0; i < numDims; i++) {
1441
+ nStart = i * numPixels;
1442
+ val = maxValues[i];
1443
+ for (k = 0; k < numPixels; k++) {
1444
+ if (mask[k]) {
1445
+ resultPixels[nStart + k] = val;
1446
+ }
1447
+ }
1448
+ }
1449
+ } else {
1450
+ for (k = 0; k < numPixels; k++) {
1451
+ if (mask[k]) {
1452
+ nStart = k * numDims;
1453
+ for (i = 0; i < numDims; i++) {
1454
+ resultPixels[nStart + numDims] = maxValues[i];
1455
+ }
1456
+ }
1457
+ }
1458
+ }
1459
+ } else {
1460
+ for (k = 0; k < numPixels; k++) {
1461
+ if (mask[k]) {
1462
+ resultPixels[k] = val;
1463
+ }
1464
+ }
1465
+ }
1466
+ } else {
1467
+ if (numDims > 1 && valMin !== val) {
1468
+ if (useBSQForOutputDim) {
1469
+ for (i = 0; i < numDims; i++) {
1470
+ nStart = i * numPixels;
1471
+ val = maxValues[i];
1472
+ for (k = 0; k < numPixels; k++) {
1473
+ resultPixels[nStart + k] = val;
1474
+ }
1475
+ }
1476
+ } else {
1477
+ for (k = 0; k < numPixels; k++) {
1478
+ nStart = k * numDims;
1479
+ for (i = 0; i < numDims; i++) {
1480
+ resultPixels[nStart + i] = maxValues[i];
1481
+ }
1482
+ }
1483
+ }
1484
+ } else {
1485
+ for (k = 0; k < numPixels * numDims; k++) {
1486
+ resultPixels[k] = val;
1487
+ }
1488
+ }
1489
+ }
1490
+ return;
1491
+ },
1492
+ getDataTypeArray: function(t) {
1493
+ var tp;
1494
+ switch (t) {
1495
+ case 0:
1496
+ tp = Int8Array;
1497
+ break;
1498
+ case 1:
1499
+ tp = Uint8Array;
1500
+ break;
1501
+ case 2:
1502
+ tp = Int16Array;
1503
+ break;
1504
+ case 3:
1505
+ tp = Uint16Array;
1506
+ break;
1507
+ case 4:
1508
+ tp = Int32Array;
1509
+ break;
1510
+ case 5:
1511
+ tp = Uint32Array;
1512
+ break;
1513
+ case 6:
1514
+ tp = Float32Array;
1515
+ break;
1516
+ case 7:
1517
+ tp = Float64Array;
1518
+ break;
1519
+ default:
1520
+ tp = Float32Array;
1521
+ }
1522
+ return tp;
1523
+ },
1524
+ getPixelType: function(t) {
1525
+ var tp;
1526
+ switch (t) {
1527
+ case 0:
1528
+ tp = "S8";
1529
+ break;
1530
+ case 1:
1531
+ tp = "U8";
1532
+ break;
1533
+ case 2:
1534
+ tp = "S16";
1535
+ break;
1536
+ case 3:
1537
+ tp = "U16";
1538
+ break;
1539
+ case 4:
1540
+ tp = "S32";
1541
+ break;
1542
+ case 5:
1543
+ tp = "U32";
1544
+ break;
1545
+ case 6:
1546
+ tp = "F32";
1547
+ break;
1548
+ case 7:
1549
+ tp = "F64";
1550
+ break;
1551
+ default:
1552
+ tp = "F32";
1553
+ }
1554
+ return tp;
1555
+ },
1556
+ isValidPixelValue: function(t, val) {
1557
+ if (val == null) {
1558
+ return false;
1559
+ }
1560
+ var isValid;
1561
+ switch (t) {
1562
+ case 0:
1563
+ isValid = val >= -128 && val <= 127;
1564
+ break;
1565
+ case 1:
1566
+ isValid = val >= 0 && val <= 255;
1567
+ break;
1568
+ case 2:
1569
+ isValid = val >= -32768 && val <= 32767;
1570
+ break;
1571
+ case 3:
1572
+ isValid = val >= 0 && val <= 65536;
1573
+ break;
1574
+ case 4:
1575
+ isValid = val >= -2147483648 && val <= 2147483647;
1576
+ break;
1577
+ case 5:
1578
+ isValid = val >= 0 && val <= 4294967296;
1579
+ break;
1580
+ case 6:
1581
+ isValid = val >= -34027999387901484e22 && val <= 34027999387901484e22;
1582
+ break;
1583
+ case 7:
1584
+ isValid = val >= -17976931348623157e292 && val <= 17976931348623157e292;
1585
+ break;
1586
+ default:
1587
+ isValid = false;
1588
+ }
1589
+ return isValid;
1590
+ },
1591
+ getDataTypeSize: function(t) {
1592
+ var s = 0;
1593
+ switch (t) {
1594
+ case 0:
1595
+ //ubyte
1596
+ case 1:
1597
+ s = 1;
1598
+ break;
1599
+ case 2:
1600
+ //short
1601
+ case 3:
1602
+ s = 2;
1603
+ break;
1604
+ case 4:
1605
+ case 5:
1606
+ case 6:
1607
+ s = 4;
1608
+ break;
1609
+ case 7:
1610
+ s = 8;
1611
+ break;
1612
+ default:
1613
+ s = t;
1614
+ }
1615
+ return s;
1616
+ },
1617
+ getDataTypeUsed: function(dt, tc) {
1618
+ var t = dt;
1619
+ switch (dt) {
1620
+ case 2:
1621
+ //short
1622
+ case 4:
1623
+ t = dt - tc;
1624
+ break;
1625
+ case 3:
1626
+ //ushort
1627
+ case 5:
1628
+ t = dt - 2 * tc;
1629
+ break;
1630
+ case 6:
1631
+ if (0 === tc) {
1632
+ t = dt;
1633
+ } else if (1 === tc) {
1634
+ t = 2;
1635
+ } else {
1636
+ t = 1;
1637
+ }
1638
+ break;
1639
+ case 7:
1640
+ if (0 === tc) {
1641
+ t = dt;
1642
+ } else {
1643
+ t = dt - 2 * tc + 1;
1644
+ }
1645
+ break;
1646
+ default:
1647
+ t = dt;
1648
+ break;
1649
+ }
1650
+ return t;
1651
+ },
1652
+ getOnePixel: function(block, blockPtr, offsetType, view) {
1653
+ var temp = 0;
1654
+ switch (offsetType) {
1655
+ case 0:
1656
+ temp = view.getInt8(blockPtr);
1657
+ break;
1658
+ case 1:
1659
+ temp = view.getUint8(blockPtr);
1660
+ break;
1661
+ case 2:
1662
+ temp = view.getInt16(blockPtr, true);
1663
+ break;
1664
+ case 3:
1665
+ temp = view.getUint16(blockPtr, true);
1666
+ break;
1667
+ case 4:
1668
+ temp = view.getInt32(blockPtr, true);
1669
+ break;
1670
+ case 5:
1671
+ temp = view.getUInt32(blockPtr, true);
1672
+ break;
1673
+ case 6:
1674
+ temp = view.getFloat32(blockPtr, true);
1675
+ break;
1676
+ case 7:
1677
+ temp = view.getFloat64(blockPtr, true);
1678
+ break;
1679
+ default:
1680
+ throw "the decoder does not understand this pixel type";
1681
+ }
1682
+ return temp;
1683
+ },
1684
+ swapDimensionOrder: function(pixels, numPixels, numDims, OutPixelTypeArray, inputIsBIP) {
1685
+ var i = 0, j = 0, iDim = 0, temp = 0, swap = pixels;
1686
+ if (numDims > 1) {
1687
+ swap = new OutPixelTypeArray(numPixels * numDims);
1688
+ if (inputIsBIP) {
1689
+ for (i = 0; i < numPixels; i++) {
1690
+ temp = i;
1691
+ for (iDim = 0; iDim < numDims; iDim++, temp += numPixels) {
1692
+ swap[temp] = pixels[j++];
1693
+ }
1694
+ }
1695
+ } else {
1696
+ for (i = 0; i < numPixels; i++) {
1697
+ temp = i;
1698
+ for (iDim = 0; iDim < numDims; iDim++, temp += numPixels) {
1699
+ swap[j++] = pixels[temp];
1700
+ }
1701
+ }
1702
+ }
1703
+ }
1704
+ return swap;
1705
+ }
1706
+ };
1707
+ var TreeNode = function(val, left, right) {
1708
+ this.val = val;
1709
+ this.left = left;
1710
+ this.right = right;
1711
+ };
1712
+ var Lerc2Decode2 = {
1713
+ /*
1714
+ * ********removed options compared to LERC1. We can bring some of them back if needed.
1715
+ * removed pixel type. LERC2 is typed and doesn't require user to give pixel type
1716
+ * changed encodedMaskData to maskData. LERC2 's js version make it faster to use maskData directly.
1717
+ * removed returnMask. mask is used by LERC2 internally and is cost free. In case of user input mask, it's returned as well and has neglible cost.
1718
+ * removed nodatavalue. Because LERC2 pixels are typed, nodatavalue will sacrify a useful value for many types (8bit, 16bit) etc,
1719
+ * user has to be knowledgable enough about raster and their data to avoid usability issues. so nodata value is simply removed now.
1720
+ * We can add it back later if their's a clear requirement.
1721
+ * removed encodedMask. This option was not implemented in LercDecode. It can be done after decoding (less efficient)
1722
+ * removed computeUsedBitDepths.
1723
+ *
1724
+ *
1725
+ * response changes compared to LERC1
1726
+ * 1. encodedMaskData is not available
1727
+ * 2. noDataValue is optional (returns only if user's noDataValue is with in the valid data type range)
1728
+ * 3. maskData is always available
1729
+ */
1730
+ /*****************
1731
+ * public properties
1732
+ ******************/
1733
+ //HUFFMAN_LUT_BITS_MAX: 12, //use 2^12 lut, not configurable
1734
+ /*****************
1735
+ * public methods
1736
+ *****************/
1737
+ /**
1738
+ * Decode a LERC2 byte stream and return an object containing the pixel data and optional metadata.
1739
+ *
1740
+ * @param {ArrayBuffer} input The LERC input byte stream
1741
+ * @param {object} [options] options Decoding options
1742
+ * @param {number} [options.inputOffset] The number of bytes to skip in the input byte stream. A valid LERC file is expected at that position
1743
+ * @param {boolean} [options.returnFileInfo] If true, the return value will have a fileInfo property that contains metadata obtained from the LERC headers and the decoding process
1744
+ * @param {boolean} [options.returnPixelInterleavedDims] If true, returned dimensions are pixel-interleaved, a.k.a [p1_dim0, p1_dim1, p1_dimn, p2_dim0...], default is [p1_dim0, p2_dim0, ..., p1_dim1, p2_dim1...]
1745
+ */
1746
+ decode: function(input, options) {
1747
+ options = options || {};
1748
+ var noDataValue = options.noDataValue;
1749
+ var i = 0, data = {};
1750
+ data.ptr = options.inputOffset || 0;
1751
+ data.pixels = {};
1752
+ if (!Lerc2Helpers.readHeaderInfo(input, data)) {
1753
+ return;
1754
+ }
1755
+ var headerInfo = data.headerInfo;
1756
+ var fileVersion = headerInfo.fileVersion;
1757
+ var OutPixelTypeArray = Lerc2Helpers.getDataTypeArray(headerInfo.imageType);
1758
+ if (fileVersion > 5) {
1759
+ throw "unsupported lerc version 2." + fileVersion;
1760
+ }
1761
+ Lerc2Helpers.readMask(input, data);
1762
+ if (headerInfo.numValidPixel !== headerInfo.width * headerInfo.height && !data.pixels.resultMask) {
1763
+ data.pixels.resultMask = options.maskData;
1764
+ }
1765
+ var numPixels = headerInfo.width * headerInfo.height;
1766
+ data.pixels.resultPixels = new OutPixelTypeArray(numPixels * headerInfo.numDims);
1767
+ data.counter = {
1768
+ onesweep: 0,
1769
+ uncompressed: 0,
1770
+ lut: 0,
1771
+ bitstuffer: 0,
1772
+ constant: 0,
1773
+ constantoffset: 0
1774
+ };
1775
+ var useBSQForOutputDim = !options.returnPixelInterleavedDims;
1776
+ if (headerInfo.numValidPixel !== 0) {
1777
+ if (headerInfo.zMax === headerInfo.zMin) {
1778
+ Lerc2Helpers.constructConstantSurface(data, useBSQForOutputDim);
1779
+ } else if (fileVersion >= 4 && Lerc2Helpers.checkMinMaxRanges(input, data)) {
1780
+ Lerc2Helpers.constructConstantSurface(data, useBSQForOutputDim);
1781
+ } else {
1782
+ var view = new DataView(input, data.ptr, 2);
1783
+ var bReadDataOneSweep = view.getUint8(0);
1784
+ data.ptr++;
1785
+ if (bReadDataOneSweep) {
1786
+ Lerc2Helpers.readDataOneSweep(input, data, OutPixelTypeArray, useBSQForOutputDim);
1787
+ } else {
1788
+ if (fileVersion > 1 && headerInfo.imageType <= 1 && Math.abs(headerInfo.maxZError - 0.5) < 1e-5) {
1789
+ var flagHuffman = view.getUint8(1);
1790
+ data.ptr++;
1791
+ data.encodeMode = flagHuffman;
1792
+ if (flagHuffman > 2 || fileVersion < 4 && flagHuffman > 1) {
1793
+ throw "Invalid Huffman flag " + flagHuffman;
1794
+ }
1795
+ if (flagHuffman) {
1796
+ Lerc2Helpers.readHuffman(input, data, OutPixelTypeArray, useBSQForOutputDim);
1797
+ } else {
1798
+ Lerc2Helpers.readTiles(input, data, OutPixelTypeArray, useBSQForOutputDim);
1799
+ }
1800
+ } else {
1801
+ Lerc2Helpers.readTiles(input, data, OutPixelTypeArray, useBSQForOutputDim);
1802
+ }
1803
+ }
1804
+ }
1805
+ }
1806
+ data.eofOffset = data.ptr;
1807
+ var diff;
1808
+ if (options.inputOffset) {
1809
+ diff = data.headerInfo.blobSize + options.inputOffset - data.ptr;
1810
+ if (Math.abs(diff) >= 1) {
1811
+ data.eofOffset = options.inputOffset + data.headerInfo.blobSize;
1812
+ }
1813
+ } else {
1814
+ diff = data.headerInfo.blobSize - data.ptr;
1815
+ if (Math.abs(diff) >= 1) {
1816
+ data.eofOffset = data.headerInfo.blobSize;
1817
+ }
1818
+ }
1819
+ var result = {
1820
+ width: headerInfo.width,
1821
+ height: headerInfo.height,
1822
+ pixelData: data.pixels.resultPixels,
1823
+ minValue: headerInfo.zMin,
1824
+ maxValue: headerInfo.zMax,
1825
+ validPixelCount: headerInfo.numValidPixel,
1826
+ dimCount: headerInfo.numDims,
1827
+ dimStats: {
1828
+ minValues: headerInfo.minValues,
1829
+ maxValues: headerInfo.maxValues
1830
+ },
1831
+ maskData: data.pixels.resultMask
1832
+ //noDataValue: noDataValue
1833
+ };
1834
+ if (data.pixels.resultMask && Lerc2Helpers.isValidPixelValue(headerInfo.imageType, noDataValue)) {
1835
+ var mask = data.pixels.resultMask;
1836
+ for (i = 0; i < numPixels; i++) {
1837
+ if (!mask[i]) {
1838
+ result.pixelData[i] = noDataValue;
1839
+ }
1840
+ }
1841
+ result.noDataValue = noDataValue;
1842
+ }
1843
+ data.noDataValue = noDataValue;
1844
+ if (options.returnFileInfo) {
1845
+ result.fileInfo = Lerc2Helpers.formatFileInfo(data);
1846
+ }
1847
+ return result;
1848
+ },
1849
+ getBandCount: function(input) {
1850
+ var count = 0;
1851
+ var i = 0;
1852
+ var temp = {};
1853
+ temp.ptr = 0;
1854
+ temp.pixels = {};
1855
+ while (i < input.byteLength - 58) {
1856
+ Lerc2Helpers.readHeaderInfo(input, temp);
1857
+ i += temp.headerInfo.blobSize;
1858
+ count++;
1859
+ temp.ptr = i;
1860
+ }
1861
+ return count;
1862
+ }
1863
+ };
1864
+ return Lerc2Decode2;
1865
+ }();
1866
+ var isPlatformLittleEndian = function() {
1867
+ var a = new ArrayBuffer(4);
1868
+ var b = new Uint8Array(a);
1869
+ var c = new Uint32Array(a);
1870
+ c[0] = 1;
1871
+ return b[0] === 1;
1872
+ }();
1873
+ var Lerc2 = {
1874
+ /************wrapper**********************************************/
1875
+ /**
1876
+ * A wrapper for decoding both LERC1 and LERC2 byte streams capable of handling multiband pixel blocks for various pixel types.
1877
+ *
1878
+ * @alias module:Lerc
1879
+ * @param {ArrayBuffer} input The LERC input byte stream
1880
+ * @param {object} [options] The decoding options below are optional.
1881
+ * @param {number} [options.inputOffset] The number of bytes to skip in the input byte stream. A valid Lerc file is expected at that position.
1882
+ * @param {string} [options.pixelType] (LERC1 only) Default value is F32. Valid pixel types for input are U8/S8/S16/U16/S32/U32/F32.
1883
+ * @param {number} [options.noDataValue] (LERC1 only). It is recommended to use the returned mask instead of setting this value.
1884
+ * @param {boolean} [options.returnPixelInterleavedDims] (nDim LERC2 only) If true, returned dimensions are pixel-interleaved, a.k.a [p1_dim0, p1_dim1, p1_dimn, p2_dim0...], default is [p1_dim0, p2_dim0, ..., p1_dim1, p2_dim1...]
1885
+ * @returns {{width, height, pixels, pixelType, mask, statistics}}
1886
+ * @property {number} width Width of decoded image.
1887
+ * @property {number} height Height of decoded image.
1888
+ * @property {array} pixels [band1, band2, …] Each band is a typed array of width*height.
1889
+ * @property {string} pixelType The type of pixels represented in the output.
1890
+ * @property {mask} mask Typed array with a size of width*height, or null if all pixels are valid.
1891
+ * @property {array} statistics [statistics_band1, statistics_band2, …] Each element is a statistics object representing min and max values
1892
+ **/
1893
+ decode: function(encodedData, options) {
1894
+ if (!isPlatformLittleEndian) {
1895
+ throw "Big endian system is not supported.";
1896
+ }
1897
+ options = options || {};
1898
+ var inputOffset = options.inputOffset || 0;
1899
+ var fileIdView = new Uint8Array(encodedData, inputOffset, 10);
1900
+ var fileIdentifierString = String.fromCharCode.apply(null, fileIdView);
1901
+ var lerc, majorVersion;
1902
+ if (fileIdentifierString.trim() === "CntZImage") {
1903
+ lerc = LercDecode2;
1904
+ majorVersion = 1;
1905
+ } else if (fileIdentifierString.substring(0, 5) === "Lerc2") {
1906
+ lerc = Lerc2Decode;
1907
+ majorVersion = 2;
1908
+ } else {
1909
+ throw "Unexpected file identifier string: " + fileIdentifierString;
1910
+ }
1911
+ var iPlane = 0, eof = encodedData.byteLength - 10, encodedMaskData, bandMasks = [], bandMask, maskData;
1912
+ var decodedPixelBlock = {
1913
+ width: 0,
1914
+ height: 0,
1915
+ pixels: [],
1916
+ pixelType: options.pixelType,
1917
+ mask: null,
1918
+ statistics: []
1919
+ };
1920
+ var uniqueBandMaskCount = 0;
1921
+ while (inputOffset < eof) {
1922
+ var result = lerc.decode(encodedData, {
1923
+ inputOffset,
1924
+ //for both lerc1 and lerc2
1925
+ encodedMaskData,
1926
+ //lerc1 only
1927
+ maskData,
1928
+ //lerc2 only
1929
+ returnMask: iPlane === 0 ? true : false,
1930
+ //lerc1 only
1931
+ returnEncodedMask: iPlane === 0 ? true : false,
1932
+ //lerc1 only
1933
+ returnFileInfo: true,
1934
+ //for both lerc1 and lerc2
1935
+ returnPixelInterleavedDims: options.returnPixelInterleavedDims,
1936
+ //for ndim lerc2 only
1937
+ pixelType: options.pixelType || null,
1938
+ //lerc1 only
1939
+ noDataValue: options.noDataValue || null
1940
+ //lerc1 only
1941
+ });
1942
+ inputOffset = result.fileInfo.eofOffset;
1943
+ maskData = result.maskData;
1944
+ if (iPlane === 0) {
1945
+ encodedMaskData = result.encodedMaskData;
1946
+ decodedPixelBlock.width = result.width;
1947
+ decodedPixelBlock.height = result.height;
1948
+ decodedPixelBlock.dimCount = result.dimCount || 1;
1949
+ decodedPixelBlock.pixelType = result.pixelType || result.fileInfo.pixelType;
1950
+ decodedPixelBlock.mask = maskData;
1951
+ }
1952
+ if (majorVersion > 1) {
1953
+ if (maskData) {
1954
+ bandMasks.push(maskData);
1955
+ }
1956
+ if (result.fileInfo.mask && result.fileInfo.mask.numBytes > 0) {
1957
+ uniqueBandMaskCount++;
1958
+ }
1959
+ }
1960
+ iPlane++;
1961
+ decodedPixelBlock.pixels.push(result.pixelData);
1962
+ decodedPixelBlock.statistics.push({
1963
+ minValue: result.minValue,
1964
+ maxValue: result.maxValue,
1965
+ noDataValue: result.noDataValue,
1966
+ dimStats: result.dimStats
1967
+ });
1968
+ }
1969
+ var i, j, numPixels;
1970
+ if (majorVersion > 1 && uniqueBandMaskCount > 1) {
1971
+ numPixels = decodedPixelBlock.width * decodedPixelBlock.height;
1972
+ decodedPixelBlock.bandMasks = bandMasks;
1973
+ maskData = new Uint8Array(numPixels);
1974
+ maskData.set(bandMasks[0]);
1975
+ for (i = 1; i < bandMasks.length; i++) {
1976
+ bandMask = bandMasks[i];
1977
+ for (j = 0; j < numPixels; j++) {
1978
+ maskData[j] = maskData[j] & bandMask[j];
1979
+ }
1980
+ }
1981
+ decodedPixelBlock.maskData = maskData;
1982
+ }
1983
+ return decodedPixelBlock;
1984
+ }
1985
+ };
1986
+ if (module.exports) {
1987
+ module.exports = Lerc2;
1988
+ } else {
1989
+ this.Lerc = Lerc2;
1990
+ }
1991
+ })();
1992
+ })(LercDecode);
1993
+ return LercDecode.exports;
1994
+ }
1995
+ var LercDecodeExports = requireLercDecode();
1996
+ const Lerc = /* @__PURE__ */ getDefaultExportFromCjs(LercDecodeExports);
1997
+ let init;
1998
+ let instance;
1999
+ let heap;
2000
+ const IMPORT_OBJECT = {
2001
+ env: {
2002
+ emscripten_notify_memory_growth: function(index) {
2003
+ heap = new Uint8Array(instance.exports.memory.buffer);
2004
+ }
2005
+ }
2006
+ };
2007
+ class ZSTDDecoder {
2008
+ init() {
2009
+ if (init) return init;
2010
+ if (typeof fetch !== "undefined") {
2011
+ init = fetch("data:application/wasm;base64," + wasm).then((response) => response.arrayBuffer()).then((arrayBuffer) => WebAssembly.instantiate(arrayBuffer, IMPORT_OBJECT)).then(this._init);
2012
+ } else {
2013
+ init = WebAssembly.instantiate(Buffer.from(wasm, "base64"), IMPORT_OBJECT).then(this._init);
2014
+ }
2015
+ return init;
2016
+ }
2017
+ _init(result) {
2018
+ instance = result.instance;
2019
+ IMPORT_OBJECT.env.emscripten_notify_memory_growth(0);
2020
+ }
2021
+ decode(array, uncompressedSize = 0) {
2022
+ if (!instance) throw new Error(`ZSTDDecoder: Await .init() before decoding.`);
2023
+ const compressedSize = array.byteLength;
2024
+ const compressedPtr = instance.exports.malloc(compressedSize);
2025
+ heap.set(array, compressedPtr);
2026
+ uncompressedSize = uncompressedSize || Number(instance.exports.ZSTD_findDecompressedSize(compressedPtr, compressedSize));
2027
+ const uncompressedPtr = instance.exports.malloc(uncompressedSize);
2028
+ const actualSize = instance.exports.ZSTD_decompress(uncompressedPtr, uncompressedSize, compressedPtr, compressedSize);
2029
+ const dec = heap.slice(uncompressedPtr, uncompressedPtr + actualSize);
2030
+ instance.exports.free(compressedPtr);
2031
+ instance.exports.free(uncompressedPtr);
2032
+ return dec;
2033
+ }
2034
+ }
2035
+ const wasm = "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IAMNACAEQQNxBEADQCACRQ0FIAAgAkF/aiICaiIDIAEgAmotAAA6AAAgA0EDcQ0ACwsgAkEDTQ0AA0AgACACQXxqIgJqIAEgAmooAgA2AgAgAkEDSw0ACwsgAkUNAgNAIAAgAkF/aiICaiABIAJqLQAAOgAAIAINAAsMAgsgAkEDTQ0AIAIhBANAIAMgASgCADYCACABQQRqIQEgA0EEaiEDIARBfGoiBEEDSw0ACyACQQNxIQILIAJFDQADQCADIAEtAAA6AAAgA0EBaiEDIAFBAWohASACQX9qIgINAAsLIAAL8wICAn8BfgJAIAJFDQAgACACaiIDQX9qIAE6AAAgACABOgAAIAJBA0kNACADQX5qIAE6AAAgACABOgABIANBfWogAToAACAAIAE6AAIgAkEHSQ0AIANBfGogAToAACAAIAE6AAMgAkEJSQ0AIABBACAAa0EDcSIEaiIDIAFB/wFxQYGChAhsIgE2AgAgAyACIARrQXxxIgRqIgJBfGogATYCACAEQQlJDQAgAyABNgIIIAMgATYCBCACQXhqIAE2AgAgAkF0aiABNgIAIARBGUkNACADIAE2AhggAyABNgIUIAMgATYCECADIAE2AgwgAkFwaiABNgIAIAJBbGogATYCACACQWhqIAE2AgAgAkFkaiABNgIAIAQgA0EEcUEYciIEayICQSBJDQAgAa0iBUIghiAFhCEFIAMgBGohAQNAIAEgBTcDGCABIAU3AxAgASAFNwMIIAEgBTcDACABQSBqIQEgAkFgaiICQR9LDQALCyAACy8BAn8gACgCBCAAKAIAQQJ0aiICLQACIQMgACACLwEAIAEgAi0AAxAIajYCACADCy8BAn8gACgCBCAAKAIAQQJ0aiICLQACIQMgACACLwEAIAEgAi0AAxAFajYCACADCx8AIAAgASACKAIEEAg2AgAgARAEGiAAIAJBCGo2AgQLCAAgAGdBH3MLugUBDX8jAEEQayIKJAACfyAEQQNNBEAgCkEANgIMIApBDGogAyAEEAsaIAAgASACIApBDGpBBBAVIgBBbCAAEAMbIAAgACAESxsMAQsgAEEAIAEoAgBBAXRBAmoQECENQVQgAygAACIGQQ9xIgBBCksNABogAiAAQQVqNgIAIAMgBGoiAkF8aiEMIAJBeWohDiACQXtqIRAgAEEGaiELQQQh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ASIDNgLE4AEgACgCvOABIQQgACABNgK84AEgACABIAJqNgK44AEgACABIAQgA2tqNgLA4AELpgEBAX8gACAAKALs4QEQFjYCyOABIABCADcD+OABIABCADcDuOABIABBwOABakIANwMAIABBqNAAaiIBQYyAgOAANgIAIABBADYCmOIBIABCADcDiOEBIABCAzcDgOEBIABBrNABakHgEikCADcCACAAQbTQAWpB6BIoAgA2AgAgACABNgIMIAAgAEGYIGo2AgggACAAQaAwajYCBCAAIABBEGo2AgALYQEBf0G4fyEDAkAgAUEDSQ0AIAIgABAhIgFBA3YiADYCCCACIAFBAXE2AgQgAiABQQF2QQNxIgM2AgACQCADQX9qIgFBAksNAAJAIAFBAWsOAgEAAgtBbA8LIAAhAwsgAwsMACAAIAEgAkEAEC4LiAQCA38CfiADEBYhBCAAQQBBKBAQIQAgBCACSwRAIAQPCyABRQRAQX8PCwJAAkAgA0EBRg0AIAEoAAAiBkGo6r5pRg0AQXYhAyAGQXBxQdDUtMIBRw0BQQghAyACQQhJDQEgAEEAQSgQECEAIAEoAAQhASAAQQE2AhQgACABrTcDAEEADwsgASACIAMQLyIDIAJLDQAgACADNgIYQXIhAyABIARqIgVBf2otAAAiAkEIcQ0AIAJBIHEiBkUEQEFwIQMgBS0AACIFQacBSw0BIAVBB3GtQgEgBUEDdkEKaq2GIgdCA4h+IAd8IQggBEEBaiEECyACQQZ2IQMgAkECdiEFAkAgAkEDcUF/aiICQQJLBEBBACECDAELAkACQAJAIAJBAWsOAgECAAsgASAEai0AACECIARBAWohBAwCCyABIARqLwAAIQIgBEECaiEEDAELIAEgBGooAAAhAiAEQQRqIQQLIAVBAXEhBQJ+AkACQAJAIANBf2oiA0ECTQRAIANBAWsOAgIDAQtCfyAGRQ0DGiABIARqMQAADAMLIAEgBGovAACtQoACfAwCCyABIARqKAAArQwBCyABIARqKQAACyEHIAAgBTYCICAAIAI2AhwgACAHNwMAQQAhAyAAQQA2AhQgACAHIAggBhsiBzcDCCAAIAdCgIAIIAdCgIAIVBs+AhALIAMLWwEBf0G4fyEDIAIQFiICIAFNBH8gACACakF/ai0AACIAQQNxQQJ0QaAeaigC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C0Egak8NAQsgByAHKQNoNwMQIAcgBykDYDcDCCAEIA0gB0EIaiAHQdwAaiAPIA4gESAQEB4hCwwBCyACIARqIQggBCAKEAcgAkERTwRAIARBEGohAgNAIAIgCkEQaiIKEAcgAkEQaiICIAhJDQALCyAIIAlrIQIgByATNgJcIAkgCCAOa0sEQCAJIAggEWtLBEBBbCELDAILIBAgAiAOayICaiIKIANqIBBNBEAgCCAKIAMQDxoMAgsgCCAKQQAgAmsQDyEIIAcgAiADaiIDNgJkIAggAmshCCAOIQILIAlBEE8EQCADIAhqIQMDQCAIIAIQByACQRBqIQIgCEEQaiIIIANJDQALDAELAkAgCUEHTQRAIAggAi0AADoAACAIIAItAAE6AAEgCCACLQACOgACIAggAi0AAzoAAyAIQQRqIAIgCUECdCIDQcAeaigCAGoiAhAXIAIgA0HgHmooAgBrIQIgBygCZCEDDAELIAggAhAMCyADQQlJDQAgAyAIaiEDIAhBCGoiCCACQQhqIgJrQQ9MBEADQCAIIAIQDCACQQhqIQIgCEEIaiIIIANJDQAMAgALAAsDQCAIIAIQByACQRBqIQIgCEEQaiIIIANJDQALCyAHQRhqEAQaIAsgDCALEAMiAhshDCAEIAQgC2ogAhshBCAFQX9qIgUNAAsgDBADDQFBbCEMIAdBGGoQBEECSQ0BQQAhCANAIAhBA0cEQCAAIAhBAnQiAmpBrNABaiACIAdqKAJENgIAIAhBAWohCAwBCwsgBygCXCEIC0G6fyEMIA8gCGsiACANIARrSw0AIAQEfyAEIAggABALIABqBUEACyABayEMCyAHQfAAaiQAIAwLkRcCFn8FfiMAQdABayIHJAAgByAAKALw4QEiCDYCvAEgASACaiESIAggACgCgOIBaiETAkACQCAFRQRAIAEhAwwBCyAAKALE4AEhESAAKALA4AEhFSAAKAK84AEhDyAAQQE2AozhAUEAIQgDQCAIQQNHBEAgByAIQQJ0IgJqIAAgAmpBrNABaigCADYCVCAIQQFqIQgMAQsLIAcgETYCZCAHIA82AmAgByABIA9rNgJoQWwhECAHQShqIAMgBBAGEAMNASAFQQQgBUEESBshFyAHQTxqIAdBKGogACgCABATIAdBxABqIAdBKGogACgCCBATIAdBzABqIAdBKGogACgCBBATQQAhBCAHQeAAaiEMIAdB5ABqIQoDQCAHQShqEARBAksgBCAXTnJFBEAgBygCQCAHKAI8QQN0aikCACIdQhCIp0H/AXEhCyAHKAJQIAcoAkxBA3RqKQIAIh5CEIinQf8BcSEJIAcoAkggBygCREEDdGopAgAiH0IgiKchCCAeQiCIISAgHUIgiKchAgJAIB9CEIinQf8BcSIDQQJPBEACQCAGRSADQRlJckUEQCAIIAdBKGogA0EgIAcoAixrIg0gDSADSxsiDRAFIAMgDWsiA3RqIQggB0EoahAEGiADRQ0BIAdBKGogAxAFIAhqIQgMAQsgB0EoaiADEAUgCGohCCAHQShqEAQaCyAHKQJUISEgByAINgJUIAcgITcDWAwBCwJAIANFBEAgAgRAIAcoAlQhCAwDCyAHKAJYIQgMAQsCQAJAIAdBKGpBARAFIAggAkVqaiIDQQNGBEAgBygCVEF/aiIDIANFaiEIDAELIANBAnQgB2ooAlQiCCAIRWohCCADQQFGDQELIAcgBygCWDYCXAsLIAcgBygCVDYCWCAHIAg2AlQLICCnIQMgCQRAIAdBKGogCRAFIANqIQMLIAkgC2pBFE8EQCAHQShqEAQaCyALBEAgB0EoaiALEAUgAmohAgsgB0EoahAEGiAHIAcoAmggAmoiCSADajYCaCAKIAwgCCAJSxsoAgAhDSAHIAdBKGogHUIYiKdB/wFxEAggHadB//8DcWo2AjwgByAHQShqIB5CGIinQf8BcRAIIB6nQf//A3FqNgJMIAdBKGoQBBogB0EoaiAfQhiIp0H/AXEQCCEOIAdB8ABqIARBBHRqIgsgCSANaiAIazYCDCALIAg2AgggCyADNgIEIAsgAjYCACAHIA4gH6dB//8DcWo2AkQgBEEBaiEEDAELCyAEIBdIDQEgEkFgaiEYIAdB4ABqIRogB0HkAGohGyABIQMDQCAHQShqEARBAksgBCAFTnJFBEAgBygCQCAHKAI8QQN0aikCACIdQhCIp0H/AXEhCyAHKAJQIAcoAkxBA3RqKQIAIh5CEIinQf8BcSEIIAcoAkggBygCREEDdGopAgAiH0IgiKchCSAeQiCIISAgHUIgiKchDAJAIB9CEIinQf8BcSICQQJPBEACQCAGRSACQRlJckUEQCAJIAdBKGogAkEgIAcoAixrIgogCiACSxsiChAFIAIgCmsiAnRqIQkgB0EoahAEGiACRQ0BIAdBKGogAhAFIAlqIQkMAQsgB0EoaiACEAUgCWohCSAHQShqEAQaCyAHKQJUISEgByAJNgJUIAcgITcDWAwBCwJAIAJFBEAgDARAIAcoAlQhCQwDCyAHKAJYIQkMAQsCQAJAIAdBKGpBARAFIAkgDEVqaiICQQNGBEAgBygCVEF/aiICIAJFaiEJDAELIAJBAnQgB2ooAlQiCSAJRWohCSACQQFGDQELIAcgBygCWDYCXAsLIAcgBygCVDYCWCAHIAk2AlQLICCnIRQgCARAIAdBKGogCBAFIBRqIRQLIAggC2pBFE8EQCAHQShqEAQaCyALBEAgB0EoaiALEAUgDGohDAsgB0EoahAEGiAHIAcoAmggDGoiGSAUajYCaCAbIBogCSAZSxsoAgAhHCAHIAdBKGogHUIYiKdB/wFxEAggHadB//8DcWo2AjwgByAHQShqIB5CGIinQf8BcRAIIB6nQf//A3FqNgJMIAdBKGoQBBogByAHQShqIB9CGIinQf8BcRAIIB+nQf//A3FqNgJEIAcgB0HwAGogBEEDcUEEdGoiDSkDCCIdNwPIASAHIA0pAwAiHjcDwAECQAJAAkAgBygCvAEiDiAepyICaiIWIBNLDQAgAyAHKALEASIKIAJqIgtqIBhLDQAgEiADayALQSBqTw0BCyAHIAcpA8gBNwMQIAcgBykDwAE3AwggAyASIAdBCGogB0G8AWogEyAPIBUgERAeIQsMAQsgAiADaiEIIAMgDhAHIAJBEU8EQCADQRBqIQIDQCACIA5BEGoiDhAHIAJBEGoiAiAISQ0ACwsgCCAdpyIOayECIAcgFjYCvAEgDiAIIA9rSwRAIA4gCCAVa0sEQEFsIQsMAgsgESACIA9rIgJqIhYgCmogEU0EQCAIIBYgChAPGgwCCyAIIBZBACACaxAPIQggByACIApqIgo2AsQBIAggAmshCCAPIQILIA5BEE8EQCAIIApqIQoDQCAIIAIQByACQRBqIQIgCEEQaiIIIApJDQALDAELAkAgDkEHTQRAIAggAi0AADoAACAIIAItAAE6AAEgCCACLQACOgACIAggAi0AAzoAAyAIQQRqIAIgDkECdCIKQcAeaigCAGoiAhAXIAIgCkHgHmooAgBrIQIgBygCxAEhCgwBCyAIIAIQDAsgCkEJSQ0AIAggCmohCiAIQQhqIgggAkEIaiICa0EPTARAA0AgCCACEAwgAkEIaiECIAhBCGoiCCAKSQ0ADAIACwALA0AgCCACEAcgAkEQaiECIAhBEGoiCCAKSQ0ACwsgCxADBEAgCyEQDAQFIA0gDDYCACANIBkgHGogCWs2AgwgDSAJNgIIIA0gFDYCBCAEQQFqIQQgAyALaiEDDAILAAsLIAQgBUgNASAEIBdrIQtBACEEA0AgCyAFSARAIAcgB0HwAGogC0EDcUEEdGoiAikDCCIdNwPIASAHIAIpAwAiHjcDwAECQAJAAkAgBygCvAEiDCAepyICaiIKIBNLDQAgAyAHKALEASIJIAJqIhBqIBhLDQAgEiADayAQQSBqTw0BCyAHIAcpA8gBNwMgIAcgBykDwAE3AxggAyASIAdBGGogB0G8AWogEyAPIBUgERAeIRAMAQsgAiADaiEIIAMgDBAHIAJBEU8EQCADQRBqIQIDQCACIAxBEGoiDBAHIAJBEGoiAiAISQ0ACwsgCCAdpyIGayECIAcgCjYCvAEgBiAIIA9rSwRAIAYgCCAVa0sEQEFsIRAMAgsgESACIA9rIgJqIgwgCWogEU0EQCAIIAwgCRAPGgwCCyAIIAxBACACaxAPIQggByACIAlqIgk2AsQBIAggAmshCCAPIQILIAZBEE8EQCAIIAlqIQYDQCAIIAIQByACQRBqIQIgCEEQaiIIIAZJDQALDAELAkAgBkEHTQRAIAggAi0AADoAACAIIAItAAE6AAEgCCACLQACOgACIAggAi0AAzoAAyAIQQRqIAIgBkECdCIGQcAeaigCAGoiAhAXIAIgBkHgHmooAgBrIQIgBygCxAEhCQwBCyAIIAIQDAsgCUEJSQ0AIAggCWohBiAIQQhqIgggAkEIaiICa0EPTARAA0AgCCACEAwgAkEIaiECIAhBCGoiCCAGSQ0ADAIACwALA0AgCCACEAcgAkEQaiECIAhBEGoiCCAGSQ0ACwsgEBADDQMgC0EBaiELIAMgEGohAwwBCwsDQCAEQQNHBEAgACAEQQJ0IgJqQazQAWogAiAHaigCVDYCACAEQQFqIQQMAQsLIAcoArwBIQgLQbp/IRAgEyAIayIAIBIgA2tLDQAgAwR/IAMgCCAAEAsgAGoFQQALIAFrIRALIAdB0AFqJAAgEAslACAAQgA3AgAgAEEAOwEIIABBADoACyAAIAE2AgwgACACOgAKC7QFAQN/IwBBMGsiBCQAIABB/wFqIgVBfWohBgJAIAMvAQIEQCAEQRhqIAEgAhAGIgIQAw0BIARBEGogBEEYaiADEBwgBEEIaiAEQRhqIAMQHCAAIQMDQAJAIARBGGoQBCADIAZPckUEQCADIARBEGogBEEYahASOgAAIAMgBEEIaiAEQRhqEBI6AAEgBEEYahAERQ0BIANBAmohAwsgBUF+aiEFAn8DQEG6fyECIAMiASAFSw0FIAEgBEEQaiAEQRhqEBI6AAAgAUEBaiEDIARBGGoQBEEDRgRAQQIhAiAEQQhqDAILIAMgBUsNBSABIARBCGogBEEYahASOgABIAFBAmohA0EDIQIgBEEYahAEQQNHDQALIARBEGoLIQUgAyAFIARBGGoQEjoAACABIAJqIABrIQIMAwsgAyAEQRBqIARBGGoQEjoAAiADIARBCGogBEEYahASOgADIANBBGohAwwAAAsACyAEQRhqIAEgAhAGIgIQAw0AIARBEGogBEEYaiADEBwgBEEIaiAEQRhqIAMQHCAAIQMDQAJAIARBGGoQBCADIAZPckUEQCADIARBEGogBEEYahAROgAAIAMgBEEIaiAEQRhqEBE6AAEgBEEYahAERQ0BIANBAmohAwsgBUF+aiEFAn8DQEG6fyECIAMiASAFSw0EIAEgBEEQaiAEQRhqEBE6AAAgAUEBaiEDIARBGGoQBEEDRgRAQQIhAiAEQQhqDAILIAMgBUsNBCABIARBCGogBEEYahAROgABIAFBAmohA0EDIQIgBEEYahAEQQNHDQALIARBEGoLIQUgAyAFIARBGGoQEToAACABIAJqIABrIQIMAgsgAyAEQRBqIARBGGoQEToAAiADIARBCGogBEEYahAROgADIANBBGohAwwAAAsACyAEQTBqJAAgAgtpAQF/An8CQAJAIAJBB00NACABKAAAQbfIwuF+Rw0AIAAgASgABDYCmOIBQWIgAEEQaiABIAIQPiIDEAMNAhogAEKBgICAEDcDiOEBIAAgASADaiACIANrECoMAQsgACABIAIQKgtBAAsLrQMBBn8jAEGAAWsiAyQAQWIhCAJAIAJBCUkNACAAQZjQAGogAUEIaiIEIAJBeGogAEGY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wOABCwutAgIEfwF+IwBBQGoiBCQAAkACQCACQQhJDQAgASgAAEFwcUHQ1LTCAUcNACABIAIQIiEBIABCADcDCCAAQQA2AgQgACABNgIADAELIARBGGogASACEC0iAxADBEAgACADEBoMAQsgAwRAIABBuH8QGgwBCyACIAQoAjAiA2shAiABIANqIQMDQAJAIAAgAyACIARBCGoQLCIFEAMEfyAFBSACIAVBA2oiBU8NAUG4fwsQGgwCCyAGQQFqIQYgAiAFayECIAMgBWohAyAEKAIMRQ0ACyAEKAI4BEAgAkEDTQRAIABBuH8QGgwCCyADQQRqIQMLIAQoAighAiAEKQMYIQcgAEEANgIEIAAgAyABazYCACAAIAIgBmytIAcgB0J/URs3AwgLIARBQGskAAslAQF/IwBBEGsiAiQAIAIgACABEFEgAigCACEAIAJBEGokACAAC30BBH8jAEGQBGsiBCQAIARB/wE2AggCQCAEQRBqIARBCGogBEEMaiABIAIQFSIGEAMEQCAGIQUMAQtBVCEFIAQoAgwiB0EGSw0AIAMgBEEQaiAEKAIIIAcQQSIFEAMNACAAIAEgBmogAiAGayADEDwhBQsgBEGQBGokACAFC4cBAgJ/An5BABAWIQMCQANAIAEgA08EQAJAIAAoAABBcHFB0NS0wgFGBEAgACABECIiAhADRQ0BQn4PCyAAIAEQVSIEQn1WDQMgBCAFfCIFIARUIQJCfiEEIAINAyAAIAEQUiICEAMNAwsgASACayEBIAAgAmohAAwBCwtCfiAFIAEbIQQLIAQLPwIBfwF+IwBBMGsiAiQAAn5CfiACQQhqIAAgARAtDQAaQgAgAigCHEEBRg0AGiACKQMICyEDIAJBMGokACADC40BAQJ/IwBBMGsiASQAAkAgAEUNACAAKAKI4gENACABIABB/OEBaigCADYCKCABIAApAvThATcDICAAEDAgACgCqOIBIQIgASABKAIoNgIYIAEgASkDIDcDECACIAFBEGoQGyAAQQA2AqjiASABIAEoAig2AgggASABKQMgNwMAIAAgARAbCyABQTBqJAALKgECfyMAQRBrIgAkACAAQQA2AgggAEIANwMAIAAQWCEBIABBEGokACABC4cBAQN/IwBBEGsiAiQAAkAgACgCAEUgACgCBEVzDQAgAiAAKAIINgIIIAIgACkCADcDAAJ/IAIoAgAiAQRAIAIoAghBqOMJIAERBQAMAQtBqOMJECgLIgFFDQAgASAAKQIANwL04QEgAUH84QFqIAAoAgg2AgAgARBZIAEhAwsgAkEQaiQAIAMLywEBAn8jAEEgayIBJAAgAEGBgIDAADYCtOIBIABBADYCiOIBIABBADYC7OEBIABCADcDkOIBIABBADYCpOMJIABBADYC3OIBIABCADcCzOIBIABBADYCvOIBIABBADYCxOABIABCADcCnOIBIABBpOIBakIANwIAIABBrOIBakEANgIAIAFCADcCECABQgA3AhggASABKQMYNwMIIAEgASkDEDcDACABKAIIQQh2QQFxIQIgAEEANgLg4gEgACACNgKM4gEgAUEgaiQAC3YBA38jAEEwayIBJAAgAARAIAEgAEHE0AFqIgIoAgA2AiggASAAKQK80AE3AyAgACgCACEDIAEgAigCADYCGCABIAApArzQATcDECADIAFBEGoQGyABIAEoAig2AgggASABKQMgNwMAIAAgARAbCyABQTBqJAALzAEBAX8gACABKAK00AE2ApjiASAAIAEoAgQiAjYCwOABIAAgAjYCvOABIAAgAiABKAIIaiICNgK44AEgACACNgLE4AEgASgCuNABBEAgAEKBgICAEDcDiOEBIAAgAUGk0ABqNgIMIAAgAUGUIGo2AgggACABQZwwajYCBCAAIAFBDGo2AgAgAEGs0AFqIAFBqNABaigCADYCACAAQbDQAWogAUGs0AFqKAIANgIAIABBtNABaiABQbDQAWooAgA2AgAPCyAAQgA3A4jhAQs7ACACRQRAQbp/DwsgBEUEQEFsDwsgAiAEEGAEQCAAIAEgAiADIAQgBRBhDwsgACABIAIgAyAEIAUQZQtGAQF/IwBBEGsiBSQAIAVBCGogBBAOAn8gBS0ACQRAIAAgASACIAMgBBAyDAELIAAgASACIAMgBBA0CyEAIAVBEGokACAACzQAIAAgAyAEIAUQNiIFEAMEQCAFDwsgBSAESQR/IAEgAiADIAVqIAQgBWsgABA1BUG4fwsLRgEBfyMAQRBrIgUkACAFQQhqIAQQDgJ/IAUtAAkEQCAAIAEgAiADIAQQYgwBCyAAIAEgAiADIAQQNQshACAFQRBqJAAgAAtZAQF/QQ8hAiABIABJBEAgAUEE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";
2036
+ const zstd = new ZSTDDecoder();
2037
+ class LercDecoder extends BaseDecoder {
2038
+ constructor(fileDirectory) {
2039
+ super();
2040
+ this.planarConfiguration = typeof fileDirectory.PlanarConfiguration !== "undefined" ? fileDirectory.PlanarConfiguration : 1;
2041
+ this.samplesPerPixel = typeof fileDirectory.SamplesPerPixel !== "undefined" ? fileDirectory.SamplesPerPixel : 1;
2042
+ this.addCompression = fileDirectory.LercParameters[LercParameters.AddCompression];
2043
+ }
2044
+ decodeBlock(buffer) {
2045
+ switch (this.addCompression) {
2046
+ case LercAddCompression.None:
2047
+ break;
2048
+ case LercAddCompression.Deflate:
2049
+ buffer = inflate_1(new Uint8Array(buffer)).buffer;
2050
+ break;
2051
+ case LercAddCompression.Zstandard:
2052
+ buffer = zstd.decode(new Uint8Array(buffer)).buffer;
2053
+ break;
2054
+ default:
2055
+ throw new Error(`Unsupported LERC additional compression method identifier: ${this.addCompression}`);
2056
+ }
2057
+ const lercResult = Lerc.decode(buffer, { returnPixelInterleavedDims: this.planarConfiguration === 1 });
2058
+ const lercData = lercResult.pixels[0];
2059
+ return lercData.buffer;
2060
+ }
2061
+ }
2062
+ export {
2063
+ LercDecoder as default,
2064
+ zstd
2065
+ };