blue-chestnut-solar-expert 0.0.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 (73) hide show
  1. package/LICENSE +21 -0
  2. package/dist/components/index.d.ts +33 -0
  3. package/dist/components/map-draw.d.ts +11 -0
  4. package/dist/components/solar-calculator.d.ts +11 -0
  5. package/dist/components/solar-expert.d.ts +11 -0
  6. package/dist/stencil-library/api-By7kNIGr.js +18774 -0
  7. package/dist/stencil-library/api-By7kNIGr.js.map +1 -0
  8. package/dist/stencil-library/app-globals-DQuL1Twl.js +6 -0
  9. package/dist/stencil-library/app-globals-DQuL1Twl.js.map +1 -0
  10. package/dist/stencil-library/decoder-DSavpK4g.js +29 -0
  11. package/dist/stencil-library/decoder-DSavpK4g.js.map +1 -0
  12. package/dist/stencil-library/deflate-Cpl_7R0h.js +13 -0
  13. package/dist/stencil-library/deflate-Cpl_7R0h.js.map +1 -0
  14. package/dist/stencil-library/index-CEfm4WRP.js +4170 -0
  15. package/dist/stencil-library/index-CEfm4WRP.js.map +1 -0
  16. package/dist/stencil-library/index-DimvNaNS.js +412 -0
  17. package/dist/stencil-library/index-DimvNaNS.js.map +1 -0
  18. package/dist/stencil-library/index.esm.js +12 -0
  19. package/dist/stencil-library/index.esm.js.map +1 -0
  20. package/dist/stencil-library/jpeg-3kYgfUiy.js +902 -0
  21. package/dist/stencil-library/jpeg-3kYgfUiy.js.map +1 -0
  22. package/dist/stencil-library/lerc-D9ISp5i_.js +2487 -0
  23. package/dist/stencil-library/lerc-D9ISp5i_.js.map +1 -0
  24. package/dist/stencil-library/loader.esm.js.map +1 -0
  25. package/dist/stencil-library/lucide-DGcPbaht.js +27006 -0
  26. package/dist/stencil-library/lucide-DGcPbaht.js.map +1 -0
  27. package/dist/stencil-library/lzw-15JscBc_.js +136 -0
  28. package/dist/stencil-library/lzw-15JscBc_.js.map +1 -0
  29. package/dist/stencil-library/map-draw.entry.esm.js.map +1 -0
  30. package/dist/stencil-library/map-draw.entry.js +2777 -0
  31. package/dist/stencil-library/map-draw.entry.js.map +1 -0
  32. package/dist/stencil-library/packbits-i_L--d7r.js +31 -0
  33. package/dist/stencil-library/packbits-i_L--d7r.js.map +1 -0
  34. package/dist/stencil-library/pako.esm-BdkEMvj8.js +6879 -0
  35. package/dist/stencil-library/pako.esm-BdkEMvj8.js.map +1 -0
  36. package/dist/stencil-library/raw-Cp-44rFp.js +12 -0
  37. package/dist/stencil-library/raw-Cp-44rFp.js.map +1 -0
  38. package/dist/stencil-library/solar-calculator.entry.esm.js.map +1 -0
  39. package/dist/stencil-library/solar-calculator.entry.js +70 -0
  40. package/dist/stencil-library/solar-calculator.entry.js.map +1 -0
  41. package/dist/stencil-library/solar-expert.entry.esm.js.map +1 -0
  42. package/dist/stencil-library/solar-expert.entry.js +66 -0
  43. package/dist/stencil-library/solar-expert.entry.js.map +1 -0
  44. package/dist/stencil-library/stencil-library.esm.js +51 -0
  45. package/dist/stencil-library/stencil-library.esm.js.map +1 -0
  46. package/dist/stencil-library/webimage-Cn4h3lmO.js +45 -0
  47. package/dist/stencil-library/webimage-Cn4h3lmO.js.map +1 -0
  48. package/dist/types/components/map-draw/map-draw.d.ts +58 -0
  49. package/dist/types/components/solar-calculator/solar-calculator.d.ts +15 -0
  50. package/dist/types/components/solar-expert/solar-expert.d.ts +15 -0
  51. package/dist/types/components.d.ts +81 -0
  52. package/dist/types/config.d.ts +15 -0
  53. package/dist/types/constants.d.ts +7 -0
  54. package/dist/types/index.d.ts +10 -0
  55. package/dist/types/stencil-public-runtime.d.ts +1702 -0
  56. package/dist/types/types/shapes.d.ts +32 -0
  57. package/dist/types/utils/api.d.ts +13 -0
  58. package/dist/types/utils/geometry/fitting.d.ts +89 -0
  59. package/dist/types/utils/geometry/gridMatch.d.ts +26 -0
  60. package/dist/types/utils/render/color.d.ts +3 -0
  61. package/dist/types/utils/render/polygon.d.ts +35 -0
  62. package/dist/types/utils/render/projection.d.ts +13 -0
  63. package/dist/types/utils/render/tools.d.ts +18 -0
  64. package/dist/types/utils/solar.d.ts +155 -0
  65. package/dist/types/utils/utils.d.ts +8 -0
  66. package/dist/types/utils/visualize.d.ts +111 -0
  67. package/loader/cdn.js +1 -0
  68. package/loader/index.cjs.js +1 -0
  69. package/loader/index.d.ts +24 -0
  70. package/loader/index.es2017.js +1 -0
  71. package/loader/index.js +2 -0
  72. package/package.json +66 -0
  73. package/readme.md +150 -0
@@ -0,0 +1,2487 @@
1
+ import { i as inflate_1 } from './pako.esm-BdkEMvj8.js';
2
+ import { a as getDefaultExportFromCjs, B as BaseDecoder, L as LercParameters, b as LercAddCompression } from './api-By7kNIGr.js';
3
+
4
+ var LercDecode$1 = {exports: {}};
5
+
6
+ /* jshint forin: false, bitwise: false */
7
+ var LercDecode = LercDecode$1.exports;
8
+
9
+ var hasRequiredLercDecode;
10
+
11
+ function requireLercDecode () {
12
+ if (hasRequiredLercDecode) return LercDecode$1.exports;
13
+ hasRequiredLercDecode = 1;
14
+ (function (module) {
15
+ /*
16
+ Copyright 2015-2021 Esri
17
+
18
+ Licensed under the Apache License, Version 2.0 (the "License");
19
+ you may not use this file except in compliance with the License.
20
+ You may obtain a copy of the License at
21
+
22
+ http://www.apache.org/licenses/LICENSE-2.0
23
+
24
+ Unless required by applicable law or agreed to in writing, software
25
+ distributed under the License is distributed on an "AS IS" BASIS,
26
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
27
+ See the License for the specific language governing permissions and
28
+ limitations under the License.
29
+
30
+ A copy of the license and additional notices are located with the
31
+ source distribution at:
32
+
33
+ http://github.com/Esri/lerc/
34
+
35
+ Contributors: Johannes Schmid, (LERC v1)
36
+ Chayanika Khatua, (LERC v1)
37
+ Wenxue Ju (LERC v1, v2.x)
38
+ */
39
+
40
+ /* 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 */
41
+
42
+ /**
43
+ * a module for decoding LERC blobs
44
+ * @module Lerc
45
+ */
46
+ (function() {
47
+ //this decoder supports all lerc versions, each version has its own class (LercDecode and Lerc2Decode).
48
+ //the exported module handles format variation autoamtically.
49
+
50
+ //the original LercDecode for Version 1
51
+ var LercDecode = (function() {
52
+
53
+ // Note: currently, this module only has an implementation for decoding LERC data, not encoding. The name of
54
+ // the class was chosen to be future proof.
55
+
56
+ var CntZImage = {};
57
+
58
+ CntZImage.defaultNoDataValue = -3.4027999387901484e+38; // smallest Float32 value
59
+
60
+ /**
61
+ * Decode a LERC byte stream and return an object containing the pixel data and some required and optional
62
+ * information about it, such as the image's width and height.
63
+ *
64
+ * @param {ArrayBuffer} input The LERC input byte stream
65
+ * @param {object} [options] Decoding options, containing any of the following properties:
66
+ * @config {number} [inputOffset = 0]
67
+ * Skip the first inputOffset bytes of the input byte stream. A valid LERC file is expected at that position.
68
+ * @config {Uint8Array} [encodedMask = null]
69
+ * If specified, the decoder will not read mask information from the input and use the specified encoded
70
+ * mask data instead. Mask header/data must not be present in the LERC byte stream in this case.
71
+ * @config {number} [noDataValue = LercCode.defaultNoDataValue]
72
+ * Pixel value to use for masked pixels.
73
+ * @config {ArrayBufferView|Array} [pixelType = Float32Array]
74
+ * The desired type of the pixelData array in the return value. Note that it is the caller's responsibility to
75
+ * provide an appropriate noDataValue if the default pixelType is overridden.
76
+ * @config {boolean} [returnMask = false]
77
+ * If true, the return value will contain a maskData property of type Uint8Array which has one element per
78
+ * pixel, the value of which is 1 or 0 depending on whether that pixel's data is present or masked. If the
79
+ * input LERC data does not contain a mask, maskData will not be returned.
80
+ * @config {boolean} [returnEncodedMask = false]
81
+ * If true, the return value will contain a encodedMaskData property, which can be passed into encode() as
82
+ * encodedMask.
83
+ * @config {boolean} [returnFileInfo = false]
84
+ * If true, the return value will have a fileInfo property that contains metadata obtained from the
85
+ * LERC headers and the decoding process.
86
+ * @config {boolean} [computeUsedBitDepths = false]
87
+ * If true, the fileInfo property in the return value will contain the set of all block bit depths
88
+ * encountered during decoding. Will only have an effect if returnFileInfo option is true.
89
+ * @returns {{width, height, pixelData, minValue, maxValue, noDataValue, maskData, encodedMaskData, fileInfo}}
90
+ */
91
+ CntZImage.decode = function(input, options) {
92
+ options = options || {};
93
+
94
+ var skipMask = options.encodedMaskData || (options.encodedMaskData === null);
95
+ var parsedData = parse(input, options.inputOffset || 0, skipMask);
96
+
97
+ var noDataValue = (options.noDataValue !== null) ? options.noDataValue : CntZImage.defaultNoDataValue;
98
+
99
+ var uncompressedData = uncompressPixelValues(parsedData, options.pixelType || Float32Array,
100
+ options.encodedMaskData, noDataValue, options.returnMask);
101
+
102
+ var result = {
103
+ width: parsedData.width,
104
+ height: parsedData.height,
105
+ pixelData: uncompressedData.resultPixels,
106
+ minValue: uncompressedData.minValue,
107
+ maxValue: parsedData.pixels.maxValue,
108
+ noDataValue: noDataValue
109
+ };
110
+
111
+ if (uncompressedData.resultMask) {
112
+ result.maskData = uncompressedData.resultMask;
113
+ }
114
+
115
+ if (options.returnEncodedMask && parsedData.mask) {
116
+ result.encodedMaskData = parsedData.mask.bitset ? parsedData.mask.bitset : null;
117
+ }
118
+
119
+ if (options.returnFileInfo) {
120
+ result.fileInfo = formatFileInfo(parsedData);
121
+ if (options.computeUsedBitDepths) {
122
+ result.fileInfo.bitDepths = computeUsedBitDepths(parsedData);
123
+ }
124
+ }
125
+
126
+ return result;
127
+ };
128
+
129
+ var uncompressPixelValues = function(data, TypedArrayClass, maskBitset, noDataValue, storeDecodedMask) {
130
+ var blockIdx = 0;
131
+ var numX = data.pixels.numBlocksX;
132
+ var numY = data.pixels.numBlocksY;
133
+ var blockWidth = Math.floor(data.width / numX);
134
+ var blockHeight = Math.floor(data.height / numY);
135
+ var scale = 2 * data.maxZError;
136
+ var minValue = Number.MAX_VALUE, currentValue;
137
+ maskBitset = maskBitset || ((data.mask) ? data.mask.bitset : null);
138
+
139
+ var resultPixels, resultMask;
140
+ resultPixels = new TypedArrayClass(data.width * data.height);
141
+ if (storeDecodedMask && maskBitset) {
142
+ resultMask = new Uint8Array(data.width * data.height);
143
+ }
144
+ var blockDataBuffer = new Float32Array(blockWidth * blockHeight);
145
+
146
+ var xx, yy;
147
+ for (var y = 0; y <= numY; y++) {
148
+ var thisBlockHeight = (y !== numY) ? blockHeight : (data.height % numY);
149
+ if (thisBlockHeight === 0) {
150
+ continue;
151
+ }
152
+ for (var x = 0; x <= numX; x++) {
153
+ var thisBlockWidth = (x !== numX) ? blockWidth : (data.width % numX);
154
+ if (thisBlockWidth === 0) {
155
+ continue;
156
+ }
157
+
158
+ var outPtr = y * data.width * blockHeight + x * blockWidth;
159
+ var outStride = data.width - thisBlockWidth;
160
+
161
+ var block = data.pixels.blocks[blockIdx];
162
+
163
+ var blockData, blockPtr, constValue;
164
+ if (block.encoding < 2) {
165
+ // block is either uncompressed or bit-stuffed (encodings 0 and 1)
166
+ if (block.encoding === 0) {
167
+ // block is uncompressed
168
+ blockData = block.rawData;
169
+ } else {
170
+ // block is bit-stuffed
171
+ unstuff(block.stuffedData, block.bitsPerPixel, block.numValidPixels, block.offset, scale, blockDataBuffer, data.pixels.maxValue);
172
+ blockData = blockDataBuffer;
173
+ }
174
+ blockPtr = 0;
175
+ }
176
+ else if (block.encoding === 2) {
177
+ // block is all 0
178
+ constValue = 0;
179
+ }
180
+ else {
181
+ // block has constant value (encoding === 3)
182
+ constValue = block.offset;
183
+ }
184
+
185
+ var maskByte;
186
+ if (maskBitset) {
187
+ for (yy = 0; yy < thisBlockHeight; yy++) {
188
+ if (outPtr & 7) {
189
+ //
190
+ maskByte = maskBitset[outPtr >> 3];
191
+ maskByte <<= outPtr & 7;
192
+ }
193
+ for (xx = 0; xx < thisBlockWidth; xx++) {
194
+ if (!(outPtr & 7)) {
195
+ // read next byte from mask
196
+ maskByte = maskBitset[outPtr >> 3];
197
+ }
198
+ if (maskByte & 128) {
199
+ // pixel data present
200
+ if (resultMask) {
201
+ resultMask[outPtr] = 1;
202
+ }
203
+ currentValue = (block.encoding < 2) ? blockData[blockPtr++] : constValue;
204
+ minValue = minValue > currentValue ? currentValue : minValue;
205
+ resultPixels[outPtr++] = currentValue;
206
+ } else {
207
+ // pixel data not present
208
+ if (resultMask) {
209
+ resultMask[outPtr] = 0;
210
+ }
211
+ resultPixels[outPtr++] = noDataValue;
212
+ }
213
+ maskByte <<= 1;
214
+ }
215
+ outPtr += outStride;
216
+ }
217
+ } else {
218
+ // mask not present, simply copy block over
219
+ if (block.encoding < 2) {
220
+ // duplicating this code block for performance reasons
221
+ // blockData case:
222
+ for (yy = 0; yy < thisBlockHeight; yy++) {
223
+ for (xx = 0; xx < thisBlockWidth; xx++) {
224
+ currentValue = blockData[blockPtr++];
225
+ minValue = minValue > currentValue ? currentValue : minValue;
226
+ resultPixels[outPtr++] = currentValue;
227
+ }
228
+ outPtr += outStride;
229
+ }
230
+ }
231
+ else {
232
+ // constValue case:
233
+ minValue = minValue > constValue ? constValue : minValue;
234
+ for (yy = 0; yy < thisBlockHeight; yy++) {
235
+ for (xx = 0; xx < thisBlockWidth; xx++) {
236
+ resultPixels[outPtr++] = constValue;
237
+ }
238
+ outPtr += outStride;
239
+ }
240
+ }
241
+ }
242
+ if ((block.encoding === 1) && (blockPtr !== block.numValidPixels)) {
243
+ throw "Block and Mask do not match";
244
+ }
245
+ blockIdx++;
246
+ }
247
+ }
248
+
249
+ return {
250
+ resultPixels: resultPixels,
251
+ resultMask: resultMask,
252
+ minValue: minValue
253
+ };
254
+ };
255
+
256
+ var formatFileInfo = function(data) {
257
+ return {
258
+ "fileIdentifierString": data.fileIdentifierString,
259
+ "fileVersion": data.fileVersion,
260
+ "imageType": data.imageType,
261
+ "height": data.height,
262
+ "width": data.width,
263
+ "maxZError": data.maxZError,
264
+ "eofOffset": data.eofOffset,
265
+ "mask": data.mask ? {
266
+ "numBlocksX": data.mask.numBlocksX,
267
+ "numBlocksY": data.mask.numBlocksY,
268
+ "numBytes": data.mask.numBytes,
269
+ "maxValue": data.mask.maxValue
270
+ } : null,
271
+ "pixels": {
272
+ "numBlocksX": data.pixels.numBlocksX,
273
+ "numBlocksY": data.pixels.numBlocksY,
274
+ "numBytes": data.pixels.numBytes,
275
+ "maxValue": data.pixels.maxValue,
276
+ "noDataValue": data.noDataValue
277
+ }
278
+ };
279
+ };
280
+
281
+ var computeUsedBitDepths = function(data) {
282
+ var numBlocks = data.pixels.numBlocksX * data.pixels.numBlocksY;
283
+ var bitDepths = {};
284
+ for (var i = 0; i < numBlocks; i++) {
285
+ var block = data.pixels.blocks[i];
286
+ if (block.encoding === 0) {
287
+ bitDepths.float32 = true;
288
+ } else if (block.encoding === 1) {
289
+ bitDepths[block.bitsPerPixel] = true;
290
+ } else {
291
+ bitDepths[0] = true;
292
+ }
293
+ }
294
+
295
+ return Object.keys(bitDepths);
296
+ };
297
+
298
+ var parse = function(input, fp, skipMask) {
299
+ var data = {};
300
+
301
+ // File header
302
+ var fileIdView = new Uint8Array(input, fp, 10);
303
+ data.fileIdentifierString = String.fromCharCode.apply(null, fileIdView);
304
+ if (data.fileIdentifierString.trim() !== "CntZImage") {
305
+ throw "Unexpected file identifier string: " + data.fileIdentifierString;
306
+ }
307
+ fp += 10;
308
+ var view = new DataView(input, fp, 24);
309
+ data.fileVersion = view.getInt32(0, true);
310
+ data.imageType = view.getInt32(4, true);
311
+ data.height = view.getUint32(8, true);
312
+ data.width = view.getUint32(12, true);
313
+ data.maxZError = view.getFloat64(16, true);
314
+ fp += 24;
315
+
316
+ // Mask Header
317
+ if (!skipMask) {
318
+ view = new DataView(input, fp, 16);
319
+ data.mask = {};
320
+ data.mask.numBlocksY = view.getUint32(0, true);
321
+ data.mask.numBlocksX = view.getUint32(4, true);
322
+ data.mask.numBytes = view.getUint32(8, true);
323
+ data.mask.maxValue = view.getFloat32(12, true);
324
+ fp += 16;
325
+
326
+ // Mask Data
327
+ if (data.mask.numBytes > 0) {
328
+ var bitset = new Uint8Array(Math.ceil(data.width * data.height / 8));
329
+ view = new DataView(input, fp, data.mask.numBytes);
330
+ var cnt = view.getInt16(0, true);
331
+ var ip = 2, op = 0;
332
+ do {
333
+ if (cnt > 0) {
334
+ while (cnt--) { bitset[op++] = view.getUint8(ip++); }
335
+ } else {
336
+ var val = view.getUint8(ip++);
337
+ cnt = -cnt;
338
+ while (cnt--) { bitset[op++] = val; }
339
+ }
340
+ cnt = view.getInt16(ip, true);
341
+ ip += 2;
342
+ } while (ip < data.mask.numBytes);
343
+ if ((cnt !== -32768) || (op < bitset.length)) {
344
+ throw "Unexpected end of mask RLE encoding";
345
+ }
346
+ data.mask.bitset = bitset;
347
+ fp += data.mask.numBytes;
348
+ }
349
+ else if ((data.mask.numBytes | data.mask.numBlocksY | data.mask.maxValue) === 0) { // Special case, all nodata
350
+ data.mask.bitset = new Uint8Array(Math.ceil(data.width * data.height / 8));
351
+ }
352
+ }
353
+
354
+ // Pixel Header
355
+ view = new DataView(input, fp, 16);
356
+ data.pixels = {};
357
+ data.pixels.numBlocksY = view.getUint32(0, true);
358
+ data.pixels.numBlocksX = view.getUint32(4, true);
359
+ data.pixels.numBytes = view.getUint32(8, true);
360
+ data.pixels.maxValue = view.getFloat32(12, true);
361
+ fp += 16;
362
+
363
+ var numBlocksX = data.pixels.numBlocksX;
364
+ var numBlocksY = data.pixels.numBlocksY;
365
+ // the number of blocks specified in the header does not take into account the blocks at the end of
366
+ // each row/column with a special width/height that make the image complete in case the width is not
367
+ // evenly divisible by the number of blocks.
368
+ var actualNumBlocksX = numBlocksX + ((data.width % numBlocksX) > 0 ? 1 : 0);
369
+ var actualNumBlocksY = numBlocksY + ((data.height % numBlocksY) > 0 ? 1 : 0);
370
+ data.pixels.blocks = new Array(actualNumBlocksX * actualNumBlocksY);
371
+ var blockI = 0;
372
+ for (var blockY = 0; blockY < actualNumBlocksY; blockY++) {
373
+ for (var blockX = 0; blockX < actualNumBlocksX; blockX++) {
374
+
375
+ // Block
376
+ var size = 0;
377
+ var bytesLeft = input.byteLength - fp;
378
+ view = new DataView(input, fp, Math.min(10, bytesLeft));
379
+ var block = {};
380
+ data.pixels.blocks[blockI++] = block;
381
+ var headerByte = view.getUint8(0); size++;
382
+ block.encoding = headerByte & 63;
383
+ if (block.encoding > 3) {
384
+ throw "Invalid block encoding (" + block.encoding + ")";
385
+ }
386
+ if (block.encoding === 2) {
387
+ fp++;
388
+ continue;
389
+ }
390
+ if ((headerByte !== 0) && (headerByte !== 2)) {
391
+ headerByte >>= 6;
392
+ block.offsetType = headerByte;
393
+ if (headerByte === 2) {
394
+ block.offset = view.getInt8(1); size++;
395
+ } else if (headerByte === 1) {
396
+ block.offset = view.getInt16(1, true); size += 2;
397
+ } else if (headerByte === 0) {
398
+ block.offset = view.getFloat32(1, true); size += 4;
399
+ } else {
400
+ throw "Invalid block offset type";
401
+ }
402
+
403
+ if (block.encoding === 1) {
404
+ headerByte = view.getUint8(size); size++;
405
+ block.bitsPerPixel = headerByte & 63;
406
+ headerByte >>= 6;
407
+ block.numValidPixelsType = headerByte;
408
+ if (headerByte === 2) {
409
+ block.numValidPixels = view.getUint8(size); size++;
410
+ } else if (headerByte === 1) {
411
+ block.numValidPixels = view.getUint16(size, true); size += 2;
412
+ } else if (headerByte === 0) {
413
+ block.numValidPixels = view.getUint32(size, true); size += 4;
414
+ } else {
415
+ throw "Invalid valid pixel count type";
416
+ }
417
+ }
418
+ }
419
+ fp += size;
420
+
421
+ if (block.encoding === 3) {
422
+ continue;
423
+ }
424
+
425
+ var arrayBuf, store8;
426
+ if (block.encoding === 0) {
427
+ var numPixels = (data.pixels.numBytes - 1) / 4;
428
+ if (numPixels !== Math.floor(numPixels)) {
429
+ throw "uncompressed block has invalid length";
430
+ }
431
+ arrayBuf = new ArrayBuffer(numPixels * 4);
432
+ store8 = new Uint8Array(arrayBuf);
433
+ store8.set(new Uint8Array(input, fp, numPixels * 4));
434
+ var rawData = new Float32Array(arrayBuf);
435
+ block.rawData = rawData;
436
+ fp += numPixels * 4;
437
+ } else if (block.encoding === 1) {
438
+ var dataBytes = Math.ceil(block.numValidPixels * block.bitsPerPixel / 8);
439
+ var dataWords = Math.ceil(dataBytes / 4);
440
+ arrayBuf = new ArrayBuffer(dataWords * 4);
441
+ store8 = new Uint8Array(arrayBuf);
442
+ store8.set(new Uint8Array(input, fp, dataBytes));
443
+ block.stuffedData = new Uint32Array(arrayBuf);
444
+ fp += dataBytes;
445
+ }
446
+ }
447
+ }
448
+ data.eofOffset = fp;
449
+ return data;
450
+ };
451
+
452
+ var unstuff = function(src, bitsPerPixel, numPixels, offset, scale, dest, maxValue) {
453
+ var bitMask = (1 << bitsPerPixel) - 1;
454
+ var i = 0, o;
455
+ var bitsLeft = 0;
456
+ var n, buffer;
457
+ var nmax = Math.ceil((maxValue - offset) / scale);
458
+ // get rid of trailing bytes that are already part of next block
459
+ var numInvalidTailBytes = src.length * 4 - Math.ceil(bitsPerPixel * numPixels / 8);
460
+ src[src.length - 1] <<= 8 * numInvalidTailBytes;
461
+
462
+ for (o = 0; o < numPixels; o++) {
463
+ if (bitsLeft === 0) {
464
+ buffer = src[i++];
465
+ bitsLeft = 32;
466
+ }
467
+ if (bitsLeft >= bitsPerPixel) {
468
+ n = (buffer >>> (bitsLeft - bitsPerPixel)) & bitMask;
469
+ bitsLeft -= bitsPerPixel;
470
+ } else {
471
+ var missingBits = (bitsPerPixel - bitsLeft);
472
+ n = ((buffer & bitMask) << missingBits) & bitMask;
473
+ buffer = src[i++];
474
+ bitsLeft = 32 - missingBits;
475
+ n += (buffer >>> bitsLeft);
476
+ }
477
+ //pixel values may exceed max due to quantization
478
+ dest[o] = n < nmax ? offset + n * scale : maxValue;
479
+ }
480
+ return dest;
481
+ };
482
+
483
+ return CntZImage;
484
+ })();
485
+
486
+ //version 2. Supports 2.1, 2.2, 2.3
487
+ var Lerc2Decode = (function() {
488
+ "use strict";
489
+ // Note: currently, this module only has an implementation for decoding LERC data, not encoding. The name of
490
+ // the class was chosen to be future proof, following LercDecode.
491
+
492
+ /*****************************************
493
+ * private static class bitsutffer used by Lerc2Decode
494
+ *******************************************/
495
+ var BitStuffer = {
496
+ //methods ending with 2 are for the new byte order used by Lerc2.3 and above.
497
+ //originalUnstuff is used to unpack Huffman code table. code is duplicated to unstuffx for performance reasons.
498
+ unstuff: function(src, dest, bitsPerPixel, numPixels, lutArr, offset, scale, maxValue) {
499
+ var bitMask = (1 << bitsPerPixel) - 1;
500
+ var i = 0, o;
501
+ var bitsLeft = 0;
502
+ var n, buffer, missingBits, nmax;
503
+
504
+ // get rid of trailing bytes that are already part of next block
505
+ var numInvalidTailBytes = src.length * 4 - Math.ceil(bitsPerPixel * numPixels / 8);
506
+ src[src.length - 1] <<= 8 * numInvalidTailBytes;
507
+ if (lutArr) {
508
+ for (o = 0; o < numPixels; o++) {
509
+ if (bitsLeft === 0) {
510
+ buffer = src[i++];
511
+ bitsLeft = 32;
512
+ }
513
+ if (bitsLeft >= bitsPerPixel) {
514
+ n = (buffer >>> (bitsLeft - bitsPerPixel)) & bitMask;
515
+ bitsLeft -= bitsPerPixel;
516
+ }
517
+ else {
518
+ missingBits = (bitsPerPixel - bitsLeft);
519
+ n = ((buffer & bitMask) << missingBits) & bitMask;
520
+ buffer = src[i++];
521
+ bitsLeft = 32 - missingBits;
522
+ n += (buffer >>> bitsLeft);
523
+ }
524
+ dest[o] = lutArr[n];//offset + lutArr[n] * scale;
525
+ }
526
+ }
527
+ else {
528
+ nmax = Math.ceil((maxValue - offset) / scale);
529
+ for (o = 0; o < numPixels; o++) {
530
+ if (bitsLeft === 0) {
531
+ buffer = src[i++];
532
+ bitsLeft = 32;
533
+ }
534
+ if (bitsLeft >= bitsPerPixel) {
535
+ n = (buffer >>> (bitsLeft - bitsPerPixel)) & bitMask;
536
+ bitsLeft -= bitsPerPixel;
537
+ }
538
+ else {
539
+ missingBits = (bitsPerPixel - bitsLeft);
540
+ n = ((buffer & bitMask) << missingBits) & bitMask;
541
+ buffer = src[i++];
542
+ bitsLeft = 32 - missingBits;
543
+ n += (buffer >>> bitsLeft);
544
+ }
545
+ //pixel values may exceed max due to quantization
546
+ dest[o] = n < nmax ? offset + n * scale : maxValue;
547
+ }
548
+ }
549
+ },
550
+
551
+ unstuffLUT: function(src, bitsPerPixel, numPixels, offset, scale, maxValue) {
552
+ var bitMask = (1 << bitsPerPixel) - 1;
553
+ var i = 0, o = 0, missingBits = 0, bitsLeft = 0, n = 0;
554
+ var buffer;
555
+ var dest = [];
556
+
557
+ // get rid of trailing bytes that are already part of next block
558
+ var numInvalidTailBytes = src.length * 4 - Math.ceil(bitsPerPixel * numPixels / 8);
559
+ src[src.length - 1] <<= 8 * numInvalidTailBytes;
560
+
561
+ var nmax = Math.ceil((maxValue - offset) / scale);
562
+ for (o = 0; o < numPixels; o++) {
563
+ if (bitsLeft === 0) {
564
+ buffer = src[i++];
565
+ bitsLeft = 32;
566
+ }
567
+ if (bitsLeft >= bitsPerPixel) {
568
+ n = (buffer >>> (bitsLeft - bitsPerPixel)) & bitMask;
569
+ bitsLeft -= bitsPerPixel;
570
+ } else {
571
+ missingBits = (bitsPerPixel - bitsLeft);
572
+ n = ((buffer & bitMask) << missingBits) & bitMask;
573
+ buffer = src[i++];
574
+ bitsLeft = 32 - missingBits;
575
+ n += (buffer >>> bitsLeft);
576
+ }
577
+ //dest.push(n);
578
+ dest[o] = n < nmax ? offset + n * scale : maxValue;
579
+ }
580
+ dest.unshift(offset);//1st one
581
+ return dest;
582
+ },
583
+
584
+ unstuff2: function(src, dest, bitsPerPixel, numPixels, lutArr, offset, scale, maxValue) {
585
+ var bitMask = (1 << bitsPerPixel) - 1;
586
+ var i = 0, o;
587
+ var bitsLeft = 0, bitPos = 0;
588
+ var n, buffer, missingBits;
589
+ if (lutArr) {
590
+ for (o = 0; o < numPixels; o++) {
591
+ if (bitsLeft === 0) {
592
+ buffer = src[i++];
593
+ bitsLeft = 32;
594
+ bitPos = 0;
595
+ }
596
+ if (bitsLeft >= bitsPerPixel) {
597
+ n = ((buffer >>> bitPos) & bitMask);
598
+ bitsLeft -= bitsPerPixel;
599
+ bitPos += bitsPerPixel;
600
+ } else {
601
+ missingBits = (bitsPerPixel - bitsLeft);
602
+ n = (buffer >>> bitPos) & bitMask;
603
+ buffer = src[i++];
604
+ bitsLeft = 32 - missingBits;
605
+ n |= (buffer & ((1 << missingBits) - 1)) << (bitsPerPixel - missingBits);
606
+ bitPos = missingBits;
607
+ }
608
+ dest[o] = lutArr[n];
609
+ }
610
+ }
611
+ else {
612
+ var nmax = Math.ceil((maxValue - offset) / scale);
613
+ for (o = 0; o < numPixels; o++) {
614
+ if (bitsLeft === 0) {
615
+ buffer = src[i++];
616
+ bitsLeft = 32;
617
+ bitPos = 0;
618
+ }
619
+ if (bitsLeft >= bitsPerPixel) {
620
+ //no unsigned left shift
621
+ n = ((buffer >>> bitPos) & bitMask);
622
+ bitsLeft -= bitsPerPixel;
623
+ bitPos += bitsPerPixel;
624
+ } else {
625
+ missingBits = (bitsPerPixel - bitsLeft);
626
+ n = (buffer >>> bitPos) & bitMask;//((buffer & bitMask) << missingBits) & bitMask;
627
+ buffer = src[i++];
628
+ bitsLeft = 32 - missingBits;
629
+ n |= (buffer & ((1 << missingBits) - 1)) << (bitsPerPixel - missingBits);
630
+ bitPos = missingBits;
631
+ }
632
+ //pixel values may exceed max due to quantization
633
+ dest[o] = n < nmax ? offset + n * scale : maxValue;
634
+ }
635
+ }
636
+ return dest;
637
+ },
638
+
639
+ unstuffLUT2: function(src, bitsPerPixel, numPixels, offset, scale, maxValue) {
640
+ var bitMask = (1 << bitsPerPixel) - 1;
641
+ var i = 0, o = 0, missingBits = 0, bitsLeft = 0, n = 0, bitPos = 0;
642
+ var buffer;
643
+ var dest = [];
644
+ var nmax = Math.ceil((maxValue - offset) / scale);
645
+ for (o = 0; o < numPixels; o++) {
646
+ if (bitsLeft === 0) {
647
+ buffer = src[i++];
648
+ bitsLeft = 32;
649
+ bitPos = 0;
650
+ }
651
+ if (bitsLeft >= bitsPerPixel) {
652
+ //no unsigned left shift
653
+ n = ((buffer >>> bitPos) & bitMask);
654
+ bitsLeft -= bitsPerPixel;
655
+ bitPos += bitsPerPixel;
656
+ } else {
657
+ missingBits = (bitsPerPixel - bitsLeft);
658
+ n = (buffer >>> bitPos) & bitMask;//((buffer & bitMask) << missingBits) & bitMask;
659
+ buffer = src[i++];
660
+ bitsLeft = 32 - missingBits;
661
+ n |= (buffer & ((1 << missingBits) - 1)) << (bitsPerPixel - missingBits);
662
+ bitPos = missingBits;
663
+ }
664
+ //dest.push(n);
665
+ dest[o] = n < nmax ? offset + n * scale : maxValue;
666
+ }
667
+ dest.unshift(offset);
668
+ return dest;
669
+ },
670
+
671
+ originalUnstuff: function(src, dest, bitsPerPixel, numPixels) {
672
+ var bitMask = (1 << bitsPerPixel) - 1;
673
+ var i = 0, o;
674
+ var bitsLeft = 0;
675
+ var n, buffer, missingBits;
676
+
677
+ // get rid of trailing bytes that are already part of next block
678
+ var numInvalidTailBytes = src.length * 4 - Math.ceil(bitsPerPixel * numPixels / 8);
679
+ src[src.length - 1] <<= 8 * numInvalidTailBytes;
680
+
681
+ for (o = 0; o < numPixels; o++) {
682
+ if (bitsLeft === 0) {
683
+ buffer = src[i++];
684
+ bitsLeft = 32;
685
+ }
686
+ if (bitsLeft >= bitsPerPixel) {
687
+ n = (buffer >>> (bitsLeft - bitsPerPixel)) & bitMask;
688
+ bitsLeft -= bitsPerPixel;
689
+ }
690
+ else {
691
+ missingBits = (bitsPerPixel - bitsLeft);
692
+ n = ((buffer & bitMask) << missingBits) & bitMask;
693
+ buffer = src[i++];
694
+ bitsLeft = 32 - missingBits;
695
+ n += (buffer >>> bitsLeft);
696
+ }
697
+ dest[o] = n;
698
+ }
699
+ return dest;
700
+ },
701
+
702
+ originalUnstuff2: function(src, dest, bitsPerPixel, numPixels) {
703
+ var bitMask = (1 << bitsPerPixel) - 1;
704
+ var i = 0, o;
705
+ var bitsLeft = 0, bitPos = 0;
706
+ var n, buffer, missingBits;
707
+ //micro-optimizations
708
+ for (o = 0; o < numPixels; o++) {
709
+ if (bitsLeft === 0) {
710
+ buffer = src[i++];
711
+ bitsLeft = 32;
712
+ bitPos = 0;
713
+ }
714
+ if (bitsLeft >= bitsPerPixel) {
715
+ //no unsigned left shift
716
+ n = ((buffer >>> bitPos) & bitMask);
717
+ bitsLeft -= bitsPerPixel;
718
+ bitPos += bitsPerPixel;
719
+ } else {
720
+ missingBits = (bitsPerPixel - bitsLeft);
721
+ n = (buffer >>> bitPos) & bitMask;//((buffer & bitMask) << missingBits) & bitMask;
722
+ buffer = src[i++];
723
+ bitsLeft = 32 - missingBits;
724
+ n |= (buffer & ((1 << missingBits) - 1)) << (bitsPerPixel - missingBits);
725
+ bitPos = missingBits;
726
+ }
727
+ dest[o] = n;
728
+ }
729
+ return dest;
730
+ }
731
+ };
732
+
733
+ /*****************************************
734
+ *private static class used by Lerc2Decode
735
+ ******************************************/
736
+ var Lerc2Helpers = {
737
+ HUFFMAN_LUT_BITS_MAX: 12, //use 2^12 lut, treat it like constant
738
+ computeChecksumFletcher32: function(input) {
739
+
740
+ var sum1 = 0xffff, sum2 = 0xffff;
741
+ var len = input.length;
742
+ var words = Math.floor(len / 2);
743
+ var i = 0;
744
+ while (words) {
745
+ var tlen = (words >= 359) ? 359 : words;
746
+ words -= tlen;
747
+ do {
748
+ sum1 += (input[i++] << 8);
749
+ sum2 += sum1 += input[i++];
750
+ } while (--tlen);
751
+
752
+ sum1 = (sum1 & 0xffff) + (sum1 >>> 16);
753
+ sum2 = (sum2 & 0xffff) + (sum2 >>> 16);
754
+ }
755
+
756
+ // add the straggler byte if it exists
757
+ if (len & 1) {
758
+ sum2 += sum1 += (input[i] << 8);
759
+ }
760
+ // second reduction step to reduce sums to 16 bits
761
+ sum1 = (sum1 & 0xffff) + (sum1 >>> 16);
762
+ sum2 = (sum2 & 0xffff) + (sum2 >>> 16);
763
+
764
+ return (sum2 << 16 | sum1) >>> 0;
765
+ },
766
+
767
+ readHeaderInfo: function(input, data) {
768
+ var ptr = data.ptr;
769
+ var fileIdView = new Uint8Array(input, ptr, 6);
770
+ var headerInfo = {};
771
+ headerInfo.fileIdentifierString = String.fromCharCode.apply(null, fileIdView);
772
+ if (headerInfo.fileIdentifierString.lastIndexOf("Lerc2", 0) !== 0) {
773
+ throw "Unexpected file identifier string (expect Lerc2 ): " + headerInfo.fileIdentifierString;
774
+ }
775
+ ptr += 6;
776
+ var view = new DataView(input, ptr, 8);
777
+ var fileVersion = view.getInt32(0, true);
778
+ headerInfo.fileVersion = fileVersion;
779
+ ptr += 4;
780
+ if (fileVersion >= 3) {
781
+ headerInfo.checksum = view.getUint32(4, true); //nrows
782
+ ptr += 4;
783
+ }
784
+
785
+ //keys start from here
786
+ view = new DataView(input, ptr, 12);
787
+ headerInfo.height = view.getUint32(0, true); //nrows
788
+ headerInfo.width = view.getUint32(4, true); //ncols
789
+ ptr += 8;
790
+ if (fileVersion >= 4) {
791
+ headerInfo.numDims = view.getUint32(8, true);
792
+ ptr += 4;
793
+ }
794
+ else {
795
+ headerInfo.numDims = 1;
796
+ }
797
+
798
+ view = new DataView(input, ptr, 40);
799
+ headerInfo.numValidPixel = view.getUint32(0, true);
800
+ headerInfo.microBlockSize = view.getInt32(4, true);
801
+ headerInfo.blobSize = view.getInt32(8, true);
802
+ headerInfo.imageType = view.getInt32(12, true);
803
+
804
+ headerInfo.maxZError = view.getFloat64(16, true);
805
+ headerInfo.zMin = view.getFloat64(24, true);
806
+ headerInfo.zMax = view.getFloat64(32, true);
807
+ ptr += 40;
808
+ data.headerInfo = headerInfo;
809
+ data.ptr = ptr;
810
+
811
+ var checksum, keyLength;
812
+ if (fileVersion >= 3) {
813
+ keyLength = fileVersion >= 4 ? 52 : 48;
814
+ checksum = this.computeChecksumFletcher32(new Uint8Array(input, ptr - keyLength, headerInfo.blobSize - 14));
815
+ if (checksum !== headerInfo.checksum) {
816
+ throw "Checksum failed.";
817
+ }
818
+ }
819
+ return true;
820
+ },
821
+
822
+ checkMinMaxRanges: function(input, data) {
823
+ var headerInfo = data.headerInfo;
824
+ var OutPixelTypeArray = this.getDataTypeArray(headerInfo.imageType);
825
+ var rangeBytes = headerInfo.numDims * this.getDataTypeSize(headerInfo.imageType);
826
+ var minValues = this.readSubArray(input, data.ptr, OutPixelTypeArray, rangeBytes);
827
+ var maxValues = this.readSubArray(input, data.ptr + rangeBytes, OutPixelTypeArray, rangeBytes);
828
+ data.ptr += (2 * rangeBytes);
829
+ var i, equal = true;
830
+ for (i = 0; i < headerInfo.numDims; i++) {
831
+ if (minValues[i] !== maxValues[i]) {
832
+ equal = false;
833
+ break;
834
+ }
835
+ }
836
+ headerInfo.minValues = minValues;
837
+ headerInfo.maxValues = maxValues;
838
+ return equal;
839
+ },
840
+
841
+ readSubArray: function(input, ptr, OutPixelTypeArray, numBytes) {
842
+ var rawData;
843
+ if (OutPixelTypeArray === Uint8Array) {
844
+ rawData = new Uint8Array(input, ptr, numBytes);
845
+ }
846
+ else {
847
+ var arrayBuf = new ArrayBuffer(numBytes);
848
+ var store8 = new Uint8Array(arrayBuf);
849
+ store8.set(new Uint8Array(input, ptr, numBytes));
850
+ rawData = new OutPixelTypeArray(arrayBuf);
851
+ }
852
+ return rawData;
853
+ },
854
+
855
+ readMask: function(input, data) {
856
+ var ptr = data.ptr;
857
+ var headerInfo = data.headerInfo;
858
+ var numPixels = headerInfo.width * headerInfo.height;
859
+ var numValidPixel = headerInfo.numValidPixel;
860
+
861
+ var view = new DataView(input, ptr, 4);
862
+ var mask = {};
863
+ mask.numBytes = view.getUint32(0, true);
864
+ ptr += 4;
865
+
866
+ // Mask Data
867
+ if ((0 === numValidPixel || numPixels === numValidPixel) && 0 !== mask.numBytes) {
868
+ throw ("invalid mask");
869
+ }
870
+ var bitset, resultMask;
871
+ if (numValidPixel === 0) {
872
+ bitset = new Uint8Array(Math.ceil(numPixels / 8));
873
+ mask.bitset = bitset;
874
+ resultMask = new Uint8Array(numPixels);
875
+ data.pixels.resultMask = resultMask;
876
+ ptr += mask.numBytes;
877
+ }// ????? else if (data.mask.numBytes > 0 && data.mask.numBytes< data.numValidPixel) {
878
+ else if (mask.numBytes > 0) {
879
+ bitset = new Uint8Array(Math.ceil(numPixels / 8));
880
+ view = new DataView(input, ptr, mask.numBytes);
881
+ var cnt = view.getInt16(0, true);
882
+ var ip = 2, op = 0, val = 0;
883
+ do {
884
+ if (cnt > 0) {
885
+ while (cnt--) { bitset[op++] = view.getUint8(ip++); }
886
+ } else {
887
+ val = view.getUint8(ip++);
888
+ cnt = -cnt;
889
+ while (cnt--) { bitset[op++] = val; }
890
+ }
891
+ cnt = view.getInt16(ip, true);
892
+ ip += 2;
893
+ } while (ip < mask.numBytes);
894
+ if ((cnt !== -32768) || (op < bitset.length)) {
895
+ throw "Unexpected end of mask RLE encoding";
896
+ }
897
+
898
+ resultMask = new Uint8Array(numPixels);
899
+ var mb = 0, k = 0;
900
+
901
+ for (k = 0; k < numPixels; k++) {
902
+ if (k & 7) {
903
+ mb = bitset[k >> 3];
904
+ mb <<= k & 7;
905
+ }
906
+ else {
907
+ mb = bitset[k >> 3];
908
+ }
909
+ if (mb & 128) {
910
+ resultMask[k] = 1;
911
+ }
912
+ }
913
+ data.pixels.resultMask = resultMask;
914
+
915
+ mask.bitset = bitset;
916
+ ptr += mask.numBytes;
917
+ }
918
+ data.ptr = ptr;
919
+ data.mask = mask;
920
+ return true;
921
+ },
922
+
923
+ readDataOneSweep: function(input, data, OutPixelTypeArray, useBSQForOutputDim) {
924
+ var ptr = data.ptr;
925
+ var headerInfo = data.headerInfo;
926
+ var numDims = headerInfo.numDims;
927
+ var numPixels = headerInfo.width * headerInfo.height;
928
+ var imageType = headerInfo.imageType;
929
+ var numBytes = headerInfo.numValidPixel * Lerc2Helpers.getDataTypeSize(imageType) * numDims;
930
+ //data.pixels.numBytes = numBytes;
931
+ var rawData;
932
+ var mask = data.pixels.resultMask;
933
+ if (OutPixelTypeArray === Uint8Array) {
934
+ rawData = new Uint8Array(input, ptr, numBytes);
935
+ }
936
+ else {
937
+ var arrayBuf = new ArrayBuffer(numBytes);
938
+ var store8 = new Uint8Array(arrayBuf);
939
+ store8.set(new Uint8Array(input, ptr, numBytes));
940
+ rawData = new OutPixelTypeArray(arrayBuf);
941
+ }
942
+ if (rawData.length === numPixels * numDims) {
943
+ if (useBSQForOutputDim) {
944
+ data.pixels.resultPixels = Lerc2Helpers.swapDimensionOrder(rawData, numPixels, numDims, OutPixelTypeArray, true);
945
+ }
946
+ else {
947
+ data.pixels.resultPixels = rawData;
948
+ }
949
+ }
950
+ else //mask
951
+ {
952
+ data.pixels.resultPixels = new OutPixelTypeArray(numPixels * numDims);
953
+ var z = 0, k = 0, i = 0, nStart = 0;
954
+ if (numDims > 1) {
955
+ if (useBSQForOutputDim) {
956
+ for (k = 0; k < numPixels; k++) {
957
+ if (mask[k]) {
958
+ nStart = k;
959
+ for (i = 0; i < numDims; i++, nStart+=numPixels) {
960
+ data.pixels.resultPixels[nStart] = rawData[z++];
961
+ }
962
+ }
963
+ }
964
+ }
965
+ else {
966
+ for (k = 0; k < numPixels; k++) {
967
+ if (mask[k]) {
968
+ nStart = k * numDims;
969
+ for (i = 0; i < numDims; i++) {
970
+ data.pixels.resultPixels[nStart + i] = rawData[z++];
971
+ }
972
+ }
973
+ }
974
+ }
975
+ }
976
+ else {
977
+ for (k = 0; k < numPixels; k++) {
978
+ if (mask[k]) {
979
+ data.pixels.resultPixels[k] = rawData[z++];
980
+ }
981
+ }
982
+ }
983
+ }
984
+ ptr += numBytes;
985
+ data.ptr = ptr; //return data;
986
+ return true;
987
+ },
988
+
989
+ readHuffmanTree: function(input, data) {
990
+ var BITS_MAX = this.HUFFMAN_LUT_BITS_MAX; //8 is slow for the large test image
991
+ //var size_max = 1 << BITS_MAX;
992
+ /* ************************
993
+ * reading code table
994
+ *************************/
995
+ var view = new DataView(input, data.ptr, 16);
996
+ data.ptr += 16;
997
+ var version = view.getInt32(0, true);
998
+ if (version < 2) {
999
+ throw "unsupported Huffman version";
1000
+ }
1001
+ var size = view.getInt32(4, true);
1002
+ var i0 = view.getInt32(8, true);
1003
+ var i1 = view.getInt32(12, true);
1004
+ if (i0 >= i1) {
1005
+ return false;
1006
+ }
1007
+ var blockDataBuffer = new Uint32Array(i1 - i0);
1008
+ Lerc2Helpers.decodeBits(input, data, blockDataBuffer);
1009
+ var codeTable = []; //size
1010
+ var i, j, k, len;
1011
+
1012
+ for (i = i0; i < i1; i++) {
1013
+ j = i - (i < size ? 0 : size);//wrap around
1014
+ codeTable[j] = { first: blockDataBuffer[i - i0], second: null };
1015
+ }
1016
+
1017
+ var dataBytes = input.byteLength - data.ptr;
1018
+ var dataWords = Math.ceil(dataBytes / 4);
1019
+ var arrayBuf = new ArrayBuffer(dataWords * 4);
1020
+ var store8 = new Uint8Array(arrayBuf);
1021
+ store8.set(new Uint8Array(input, data.ptr, dataBytes));
1022
+ var stuffedData = new Uint32Array(arrayBuf); //must start from x*4
1023
+ var bitPos = 0, word, srcPtr = 0;
1024
+ word = stuffedData[0];
1025
+ for (i = i0; i < i1; i++) {
1026
+ j = i - (i < size ? 0 : size);//wrap around
1027
+ len = codeTable[j].first;
1028
+ if (len > 0) {
1029
+ codeTable[j].second = (word << bitPos) >>> (32 - len);
1030
+
1031
+ if (32 - bitPos >= len) {
1032
+ bitPos += len;
1033
+ if (bitPos === 32) {
1034
+ bitPos = 0;
1035
+ srcPtr++;
1036
+ word = stuffedData[srcPtr];
1037
+ }
1038
+ }
1039
+ else {
1040
+ bitPos += len - 32;
1041
+ srcPtr++;
1042
+ word = stuffedData[srcPtr];
1043
+ codeTable[j].second |= word >>> (32 - bitPos);
1044
+ }
1045
+ }
1046
+ }
1047
+
1048
+ //finished reading code table
1049
+
1050
+ /* ************************
1051
+ * building lut
1052
+ *************************/
1053
+ var numBitsLUT = 0, numBitsLUTQick = 0;
1054
+ var tree = new TreeNode();
1055
+ for (i = 0; i < codeTable.length; i++) {
1056
+ if (codeTable[i] !== undefined) {
1057
+ numBitsLUT = Math.max(numBitsLUT, codeTable[i].first);
1058
+ }
1059
+ }
1060
+ if (numBitsLUT >= BITS_MAX) {
1061
+ numBitsLUTQick = BITS_MAX;
1062
+ }
1063
+ else {
1064
+ numBitsLUTQick = numBitsLUT;
1065
+ }
1066
+ // for debugging purpose
1067
+ // if (numBitsLUT >= 30) {
1068
+ // console.log("WARning, large NUM LUT BITS IS " + numBitsLUT);
1069
+ // }
1070
+ var decodeLut = [], entry, code, numEntries, jj, currentBit, node;
1071
+ for (i = i0; i < i1; i++) {
1072
+ j = i - (i < size ? 0 : size);//wrap around
1073
+ len = codeTable[j].first;
1074
+ if (len > 0) {
1075
+ entry = [len, j];
1076
+ if (len <= numBitsLUTQick) {
1077
+ code = codeTable[j].second << (numBitsLUTQick - len);
1078
+ numEntries = 1 << (numBitsLUTQick - len);
1079
+ for (k = 0; k < numEntries; k++) {
1080
+ decodeLut[code | k] = entry;
1081
+ }
1082
+ }
1083
+ else {
1084
+ //build tree
1085
+ code = codeTable[j].second;
1086
+ node = tree;
1087
+ for (jj = len - 1; jj >= 0; jj--) {
1088
+ currentBit = code >>> jj & 1; //no left shift as length could be 30,31
1089
+ if (currentBit) {
1090
+ if (!node.right) {
1091
+ node.right = new TreeNode();
1092
+ }
1093
+ node = node.right;
1094
+ }
1095
+ else {
1096
+ if (!node.left) {
1097
+ node.left = new TreeNode();
1098
+ }
1099
+ node = node.left;
1100
+ }
1101
+ if (jj === 0 && !node.val) {
1102
+ node.val = entry[1];
1103
+ }
1104
+ }
1105
+ }
1106
+ }
1107
+ }
1108
+ return {
1109
+ decodeLut: decodeLut,
1110
+ numBitsLUTQick: numBitsLUTQick,
1111
+ numBitsLUT: numBitsLUT,
1112
+ tree: tree,
1113
+ stuffedData: stuffedData,
1114
+ srcPtr: srcPtr,
1115
+ bitPos: bitPos
1116
+ };
1117
+ },
1118
+
1119
+ readHuffman: function(input, data, OutPixelTypeArray, useBSQForOutputDim) {
1120
+ var headerInfo = data.headerInfo;
1121
+ var numDims = headerInfo.numDims;
1122
+ var height = data.headerInfo.height;
1123
+ var width = data.headerInfo.width;
1124
+ var numPixels = width * height;
1125
+ //var size_max = 1 << BITS_MAX;
1126
+ /* ************************
1127
+ * reading huffman structure info
1128
+ *************************/
1129
+ var huffmanInfo = this.readHuffmanTree(input, data);
1130
+ var decodeLut = huffmanInfo.decodeLut;
1131
+ var tree = huffmanInfo.tree;
1132
+ //stuffedData includes huffman headers
1133
+ var stuffedData = huffmanInfo.stuffedData;
1134
+ var srcPtr = huffmanInfo.srcPtr;
1135
+ var bitPos = huffmanInfo.bitPos;
1136
+ var numBitsLUTQick = huffmanInfo.numBitsLUTQick;
1137
+ var numBitsLUT = huffmanInfo.numBitsLUT;
1138
+ var offset = data.headerInfo.imageType === 0 ? 128 : 0;
1139
+ /*************************
1140
+ * decode
1141
+ ***************************/
1142
+ var node, val, delta, mask = data.pixels.resultMask, valTmp, valTmpQuick, currentBit;
1143
+ var i, j, k, ii;
1144
+ var prevVal = 0;
1145
+ if (bitPos > 0) {
1146
+ srcPtr++;
1147
+ bitPos = 0;
1148
+ }
1149
+ var word = stuffedData[srcPtr];
1150
+ var deltaEncode = data.encodeMode === 1;
1151
+ var resultPixelsAllDim = new OutPixelTypeArray(numPixels * numDims);
1152
+ var resultPixels = resultPixelsAllDim;
1153
+ var iDim;
1154
+ // TODO: reevaluate the need to keep inlined decoding code as IE support is phasing out
1155
+ if (numDims < 2 || deltaEncode) {
1156
+ for (iDim = 0; iDim < numDims; iDim++) {
1157
+ if (numDims > 1) {
1158
+ //get the mem block of current dimension
1159
+ resultPixels = new OutPixelTypeArray(resultPixelsAllDim.buffer, numPixels * iDim, numPixels);
1160
+ prevVal = 0;
1161
+ }
1162
+ if (data.headerInfo.numValidPixel === width * height) { //all valid
1163
+ for (k = 0, i = 0; i < height; i++) {
1164
+ for (j = 0; j < width; j++, k++) {
1165
+ val = 0;
1166
+ valTmp = (word << bitPos) >>> (32 - numBitsLUTQick);
1167
+ valTmpQuick = valTmp;// >>> deltaBits;
1168
+ if (32 - bitPos < numBitsLUTQick) {
1169
+ valTmp |= ((stuffedData[srcPtr + 1]) >>> (64 - bitPos - numBitsLUTQick));
1170
+ valTmpQuick = valTmp;// >>> deltaBits;
1171
+ }
1172
+ if (decodeLut[valTmpQuick]) // if there, move the correct number of bits and done
1173
+ {
1174
+ val = decodeLut[valTmpQuick][1];
1175
+ bitPos += decodeLut[valTmpQuick][0];
1176
+ }
1177
+ else {
1178
+ valTmp = (word << bitPos) >>> (32 - numBitsLUT);
1179
+ valTmpQuick = valTmp;// >>> deltaBits;
1180
+ if (32 - bitPos < numBitsLUT) {
1181
+ valTmp |= ((stuffedData[srcPtr + 1]) >>> (64 - bitPos - numBitsLUT));
1182
+ valTmpQuick = valTmp;// >>> deltaBits;
1183
+ }
1184
+ node = tree;
1185
+ for (ii = 0; ii < numBitsLUT; ii++) {
1186
+ currentBit = valTmp >>> (numBitsLUT - ii - 1) & 1;
1187
+ node = currentBit ? node.right : node.left;
1188
+ if (!(node.left || node.right)) {
1189
+ val = node.val;
1190
+ bitPos = bitPos + ii + 1;
1191
+ break;
1192
+ }
1193
+ }
1194
+ }
1195
+
1196
+ if (bitPos >= 32) {
1197
+ bitPos -= 32;
1198
+ srcPtr++;
1199
+ word = stuffedData[srcPtr];
1200
+ }
1201
+
1202
+ delta = val - offset;
1203
+ if (deltaEncode) {
1204
+ if (j > 0) {
1205
+ delta += prevVal; // use overflow
1206
+ }
1207
+ else if (i > 0) {
1208
+ delta += resultPixels[k - width];
1209
+ }
1210
+ else {
1211
+ delta += prevVal;
1212
+ }
1213
+ delta &= 0xFF; //overflow
1214
+ resultPixels[k] = delta;//overflow
1215
+ prevVal = delta;
1216
+ }
1217
+ else {
1218
+ resultPixels[k] = delta;
1219
+ }
1220
+ }
1221
+ }
1222
+ }
1223
+ else { //not all valid, use mask
1224
+ for (k = 0, i = 0; i < height; i++) {
1225
+ for (j = 0; j < width; j++, k++) {
1226
+ if (mask[k]) {
1227
+ val = 0;
1228
+ valTmp = (word << bitPos) >>> (32 - numBitsLUTQick);
1229
+ valTmpQuick = valTmp;// >>> deltaBits;
1230
+ if (32 - bitPos < numBitsLUTQick) {
1231
+ valTmp |= ((stuffedData[srcPtr + 1]) >>> (64 - bitPos - numBitsLUTQick));
1232
+ valTmpQuick = valTmp;// >>> deltaBits;
1233
+ }
1234
+ if (decodeLut[valTmpQuick]) // if there, move the correct number of bits and done
1235
+ {
1236
+ val = decodeLut[valTmpQuick][1];
1237
+ bitPos += decodeLut[valTmpQuick][0];
1238
+ }
1239
+ else {
1240
+ valTmp = (word << bitPos) >>> (32 - numBitsLUT);
1241
+ valTmpQuick = valTmp;// >>> deltaBits;
1242
+ if (32 - bitPos < numBitsLUT) {
1243
+ valTmp |= ((stuffedData[srcPtr + 1]) >>> (64 - bitPos - numBitsLUT));
1244
+ valTmpQuick = valTmp;// >>> deltaBits;
1245
+ }
1246
+ node = tree;
1247
+ for (ii = 0; ii < numBitsLUT; ii++) {
1248
+ currentBit = valTmp >>> (numBitsLUT - ii - 1) & 1;
1249
+ node = currentBit ? node.right : node.left;
1250
+ if (!(node.left || node.right)) {
1251
+ val = node.val;
1252
+ bitPos = bitPos + ii + 1;
1253
+ break;
1254
+ }
1255
+ }
1256
+ }
1257
+
1258
+ if (bitPos >= 32) {
1259
+ bitPos -= 32;
1260
+ srcPtr++;
1261
+ word = stuffedData[srcPtr];
1262
+ }
1263
+
1264
+ delta = val - offset;
1265
+ if (deltaEncode) {
1266
+ if (j > 0 && mask[k - 1]) {
1267
+ delta += prevVal; // use overflow
1268
+ }
1269
+ else if (i > 0 && mask[k - width]) {
1270
+ delta += resultPixels[k - width];
1271
+ }
1272
+ else {
1273
+ delta += prevVal;
1274
+ }
1275
+
1276
+ delta &= 0xFF; //overflow
1277
+ resultPixels[k] = delta;//overflow
1278
+ prevVal = delta;
1279
+ }
1280
+ else {
1281
+ resultPixels[k] = delta;
1282
+ }
1283
+ }
1284
+ }
1285
+ }
1286
+ }
1287
+ }
1288
+ }
1289
+ else {
1290
+ for (k = 0, i = 0; i < height; i++) {
1291
+ for (j = 0; j < width; j++) {
1292
+ k = i * width + j;
1293
+ if (!mask || mask[k]) {
1294
+ for (iDim = 0; iDim < numDims; iDim++, k+=numPixels) {
1295
+ val = 0;
1296
+ valTmp = (word << bitPos) >>> (32 - numBitsLUTQick);
1297
+ valTmpQuick = valTmp;
1298
+ if (32 - bitPos < numBitsLUTQick) {
1299
+ valTmp |= ((stuffedData[srcPtr + 1]) >>> (64 - bitPos - numBitsLUTQick));
1300
+ valTmpQuick = valTmp;
1301
+ }
1302
+ if (decodeLut[valTmpQuick])
1303
+ {
1304
+ val = decodeLut[valTmpQuick][1];
1305
+ bitPos += decodeLut[valTmpQuick][0];
1306
+ }
1307
+ else {
1308
+ valTmp = (word << bitPos) >>> (32 - numBitsLUT);
1309
+ valTmpQuick = valTmp;
1310
+ if (32 - bitPos < numBitsLUT) {
1311
+ valTmp |= ((stuffedData[srcPtr + 1]) >>> (64 - bitPos - numBitsLUT));
1312
+ valTmpQuick = valTmp;
1313
+ }
1314
+ node = tree;
1315
+ for (ii = 0; ii < numBitsLUT; ii++) {
1316
+ currentBit = valTmp >>> (numBitsLUT - ii - 1) & 1;
1317
+ node = currentBit ? node.right : node.left;
1318
+ if (!(node.left || node.right)) {
1319
+ val = node.val;
1320
+ bitPos = bitPos + ii + 1;
1321
+ break;
1322
+ }
1323
+ }
1324
+ }
1325
+
1326
+ if (bitPos >= 32) {
1327
+ bitPos -= 32;
1328
+ srcPtr++;
1329
+ word = stuffedData[srcPtr];
1330
+ }
1331
+
1332
+ delta = val - offset;
1333
+ resultPixels[k] = delta;
1334
+ }
1335
+ }
1336
+ }
1337
+ }
1338
+ }
1339
+ data.ptr = data.ptr + (srcPtr + 1) * 4 + (bitPos > 0 ? 4 : 0);
1340
+ data.pixels.resultPixels = resultPixelsAllDim;
1341
+ //swap for BIP layout
1342
+ if (numDims > 1 && !useBSQForOutputDim) {
1343
+ data.pixels.resultPixels = Lerc2Helpers.swapDimensionOrder(resultPixelsAllDim, numPixels, numDims, OutPixelTypeArray);
1344
+ }
1345
+ },
1346
+
1347
+ decodeBits: function(input, data, blockDataBuffer, offset, iDim) {
1348
+ {
1349
+ //bitstuff encoding is 3
1350
+ var headerInfo = data.headerInfo;
1351
+ var fileVersion = headerInfo.fileVersion;
1352
+ //var block = {};
1353
+ var blockPtr = 0;
1354
+ var viewByteLength = ((input.byteLength - data.ptr) >= 5) ? 5 : (input.byteLength - data.ptr);
1355
+ var view = new DataView(input, data.ptr, viewByteLength);
1356
+ var headerByte = view.getUint8(0);
1357
+ blockPtr++;
1358
+ var bits67 = headerByte >> 6;
1359
+ var n = (bits67 === 0) ? 4 : 3 - bits67;
1360
+ var doLut = (headerByte & 32) > 0 ? true : false;//5th bit
1361
+ var numBits = headerByte & 31;
1362
+ var numElements = 0;
1363
+ if (n === 1) {
1364
+ numElements = view.getUint8(blockPtr); blockPtr++;
1365
+ } else if (n === 2) {
1366
+ numElements = view.getUint16(blockPtr, true); blockPtr += 2;
1367
+ } else if (n === 4) {
1368
+ numElements = view.getUint32(blockPtr, true); blockPtr += 4;
1369
+ } else {
1370
+ throw "Invalid valid pixel count type";
1371
+ }
1372
+ //fix: huffman codes are bit stuffed, but not bound by data's max value, so need to use originalUnstuff
1373
+ //offset = offset || 0;
1374
+ var scale = 2 * headerInfo.maxZError;
1375
+ var stuffedData, arrayBuf, store8, dataBytes, dataWords;
1376
+ var lutArr, lutData, lutBytes, lutBitsPerElement, bitsPerPixel;
1377
+ var zMax = headerInfo.numDims > 1 ? headerInfo.maxValues[iDim] : headerInfo.zMax;
1378
+ if (doLut) {
1379
+ data.counter.lut++;
1380
+ lutBytes = view.getUint8(blockPtr);
1381
+ lutBitsPerElement = numBits;
1382
+ blockPtr++;
1383
+ dataBytes = Math.ceil((lutBytes - 1) * numBits / 8);
1384
+ dataWords = Math.ceil(dataBytes / 4);
1385
+ arrayBuf = new ArrayBuffer(dataWords * 4);
1386
+ store8 = new Uint8Array(arrayBuf);
1387
+
1388
+ data.ptr += blockPtr;
1389
+ store8.set(new Uint8Array(input, data.ptr, dataBytes));
1390
+
1391
+ lutData = new Uint32Array(arrayBuf);
1392
+ data.ptr += dataBytes;
1393
+
1394
+ bitsPerPixel = 0;
1395
+ while ((lutBytes - 1) >>> bitsPerPixel) {
1396
+ bitsPerPixel++;
1397
+ }
1398
+ dataBytes = Math.ceil(numElements * bitsPerPixel / 8);
1399
+ dataWords = Math.ceil(dataBytes / 4);
1400
+ arrayBuf = new ArrayBuffer(dataWords * 4);
1401
+ store8 = new Uint8Array(arrayBuf);
1402
+ store8.set(new Uint8Array(input, data.ptr, dataBytes));
1403
+ stuffedData = new Uint32Array(arrayBuf);
1404
+ data.ptr += dataBytes;
1405
+ if (fileVersion >= 3) {
1406
+ lutArr = BitStuffer.unstuffLUT2(lutData, numBits, lutBytes - 1, offset, scale, zMax);
1407
+ }
1408
+ else {
1409
+ lutArr = BitStuffer.unstuffLUT(lutData, numBits, lutBytes - 1, offset, scale, zMax);
1410
+ }
1411
+ //lutArr.unshift(0);
1412
+ if (fileVersion >= 3) {
1413
+ //BitStuffer.unstuff2(block, blockDataBuffer, headerInfo.zMax);
1414
+ BitStuffer.unstuff2(stuffedData, blockDataBuffer, bitsPerPixel, numElements, lutArr);
1415
+ }
1416
+ else {
1417
+ BitStuffer.unstuff(stuffedData, blockDataBuffer, bitsPerPixel, numElements, lutArr);
1418
+ }
1419
+ }
1420
+ else {
1421
+ //console.debug("bitstuffer");
1422
+ data.counter.bitstuffer++;
1423
+ bitsPerPixel = numBits;
1424
+ data.ptr += blockPtr;
1425
+ if (bitsPerPixel > 0) {
1426
+ dataBytes = Math.ceil(numElements * bitsPerPixel / 8);
1427
+ dataWords = Math.ceil(dataBytes / 4);
1428
+ arrayBuf = new ArrayBuffer(dataWords * 4);
1429
+ store8 = new Uint8Array(arrayBuf);
1430
+ store8.set(new Uint8Array(input, data.ptr, dataBytes));
1431
+ stuffedData = new Uint32Array(arrayBuf);
1432
+ data.ptr += dataBytes;
1433
+ if (fileVersion >= 3) {
1434
+ if (offset == null) {
1435
+ BitStuffer.originalUnstuff2(stuffedData, blockDataBuffer, bitsPerPixel, numElements);
1436
+ }
1437
+ else {
1438
+ BitStuffer.unstuff2(stuffedData, blockDataBuffer, bitsPerPixel, numElements, false, offset, scale, zMax);
1439
+ }
1440
+ }
1441
+ else {
1442
+ if (offset == null) {
1443
+ BitStuffer.originalUnstuff(stuffedData, blockDataBuffer, bitsPerPixel, numElements);
1444
+ }
1445
+ else {
1446
+ BitStuffer.unstuff(stuffedData, blockDataBuffer, bitsPerPixel, numElements, false, offset, scale, zMax);
1447
+ }
1448
+ }
1449
+ }
1450
+ }
1451
+ }
1452
+
1453
+ },
1454
+
1455
+ readTiles: function(input, data, OutPixelTypeArray, useBSQForOutputDim) {
1456
+ var headerInfo = data.headerInfo;
1457
+ var width = headerInfo.width;
1458
+ var height = headerInfo.height;
1459
+ var numPixels = width * height;
1460
+ var microBlockSize = headerInfo.microBlockSize;
1461
+ var imageType = headerInfo.imageType;
1462
+ var dataTypeSize = Lerc2Helpers.getDataTypeSize(imageType);
1463
+ var numBlocksX = Math.ceil(width / microBlockSize);
1464
+ var numBlocksY = Math.ceil(height / microBlockSize);
1465
+ data.pixels.numBlocksY = numBlocksY;
1466
+ data.pixels.numBlocksX = numBlocksX;
1467
+ data.pixels.ptr = 0;
1468
+ 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;
1469
+ var view, block, arrayBuf, store8, rawData;
1470
+ var blockEncoding;
1471
+ var blockDataBuffer = new OutPixelTypeArray(microBlockSize * microBlockSize);
1472
+ var lastBlockHeight = (height % microBlockSize) || microBlockSize;
1473
+ var lastBlockWidth = (width % microBlockSize) || microBlockSize;
1474
+ var offsetType, offset;
1475
+ var numDims = headerInfo.numDims, iDim;
1476
+ var mask = data.pixels.resultMask;
1477
+ var resultPixels = data.pixels.resultPixels;
1478
+ var fileVersion = headerInfo.fileVersion;
1479
+ var fileVersionCheckNum = fileVersion >= 5 ? 14 : 15;
1480
+ var isDiffEncoding;
1481
+ var zMax = headerInfo.zMax;
1482
+ //var resultPixelsAllDim = resultPixels;
1483
+ var resultPixelsPrevDim;
1484
+ for (blockY = 0; blockY < numBlocksY; blockY++) {
1485
+ thisBlockHeight = (blockY !== numBlocksY - 1) ? microBlockSize : lastBlockHeight;
1486
+ for (blockX = 0; blockX < numBlocksX; blockX++) {
1487
+ //console.debug("y" + blockY + " x" + blockX);
1488
+ thisBlockWidth = (blockX !== numBlocksX - 1) ? microBlockSize : lastBlockWidth;
1489
+
1490
+ outPtr = blockY * width * microBlockSize + blockX * microBlockSize;
1491
+ outStride = width - thisBlockWidth;
1492
+
1493
+ for (iDim = 0; iDim < numDims; iDim++) {
1494
+ if (numDims > 1) {
1495
+ resultPixelsPrevDim = resultPixels;
1496
+ outPtr = blockY * width * microBlockSize + blockX * microBlockSize;
1497
+ resultPixels = new OutPixelTypeArray(data.pixels.resultPixels.buffer, numPixels * iDim * dataTypeSize, numPixels);
1498
+ zMax = headerInfo.maxValues[iDim];
1499
+ } else {
1500
+ resultPixelsPrevDim = null;
1501
+ }
1502
+ bytesLeft = input.byteLength - data.ptr;
1503
+ view = new DataView(input, data.ptr, Math.min(10, bytesLeft));
1504
+ block = {};
1505
+ blockPtr = 0;
1506
+ headerByte = view.getUint8(0);
1507
+ blockPtr++;
1508
+ isDiffEncoding = headerInfo.fileVersion >= 5 ? headerByte & 4 : 0;
1509
+ bits67 = (headerByte >> 6) & 0xFF;
1510
+ testCode = (headerByte >> 2) & fileVersionCheckNum; // use bits 2345 for integrity check
1511
+ if (testCode !== (((blockX * microBlockSize) >> 3) & fileVersionCheckNum)) {
1512
+ throw "integrity issue";
1513
+ }
1514
+
1515
+ if (isDiffEncoding && iDim === 0) {
1516
+ throw "integrity issue";
1517
+ }
1518
+
1519
+ blockEncoding = headerByte & 3;
1520
+ if (blockEncoding > 3) {
1521
+ data.ptr += blockPtr;
1522
+ throw "Invalid block encoding (" + blockEncoding + ")";
1523
+ }
1524
+ else if (blockEncoding === 2) { //constant 0
1525
+ if (isDiffEncoding) {
1526
+ if (mask) {
1527
+ for (row = 0; row < thisBlockHeight; row++) {
1528
+ for (col = 0; col < thisBlockWidth; col++) {
1529
+ if (mask[outPtr]) {
1530
+ resultPixels[outPtr] = resultPixelsPrevDim[outPtr];
1531
+ }
1532
+ outPtr++;
1533
+ }
1534
+ }
1535
+ }
1536
+ else {
1537
+ for (row = 0; row < thisBlockHeight; row++) {
1538
+ for (col = 0; col < thisBlockWidth; col++) {
1539
+ resultPixels[outPtr] = resultPixelsPrevDim[outPtr];
1540
+ outPtr++;
1541
+ }
1542
+ }
1543
+ }
1544
+ }
1545
+ data.counter.constant++;
1546
+ data.ptr += blockPtr;
1547
+ continue;
1548
+ }
1549
+ else if (blockEncoding === 0) { //uncompressed
1550
+ if (isDiffEncoding) {
1551
+ // doesn't make sense, should not happen
1552
+ throw "integrity issue";
1553
+ }
1554
+ data.counter.uncompressed++;
1555
+ data.ptr += blockPtr;
1556
+ numBytes = thisBlockHeight * thisBlockWidth * dataTypeSize;
1557
+ bytesleft = input.byteLength - data.ptr;
1558
+ numBytes = numBytes < bytesleft ? numBytes : bytesleft;
1559
+ //bit alignment
1560
+ arrayBuf = new ArrayBuffer((numBytes % dataTypeSize) === 0 ? numBytes : (numBytes + dataTypeSize - numBytes % dataTypeSize));
1561
+ store8 = new Uint8Array(arrayBuf);
1562
+ store8.set(new Uint8Array(input, data.ptr, numBytes));
1563
+ rawData = new OutPixelTypeArray(arrayBuf);
1564
+ z = 0;
1565
+ if (mask) {
1566
+ for (row = 0; row < thisBlockHeight; row++) {
1567
+ for (col = 0; col < thisBlockWidth; col++) {
1568
+ if (mask[outPtr]) {
1569
+ resultPixels[outPtr] = rawData[z++];
1570
+ }
1571
+ outPtr++;
1572
+ }
1573
+ outPtr += outStride;
1574
+ }
1575
+ }
1576
+ else {//all valid
1577
+ for (row = 0; row < thisBlockHeight; row++) {
1578
+ for (col = 0; col < thisBlockWidth; col++) {
1579
+ resultPixels[outPtr++] = rawData[z++];
1580
+ }
1581
+ outPtr += outStride;
1582
+ }
1583
+ }
1584
+ data.ptr += z * dataTypeSize;
1585
+ }
1586
+ else { //1 or 3
1587
+ offsetType = Lerc2Helpers.getDataTypeUsed((isDiffEncoding && imageType < 6) ? 4 : imageType, bits67);
1588
+ offset = Lerc2Helpers.getOnePixel(block, blockPtr, offsetType, view);
1589
+ blockPtr += Lerc2Helpers.getDataTypeSize(offsetType);
1590
+ if (blockEncoding === 3) //constant offset value
1591
+ {
1592
+ data.ptr += blockPtr;
1593
+ data.counter.constantoffset++;
1594
+ //you can delete the following resultMask case in favor of performance because val is constant and users use nodata mask, otherwise nodatavalue post processing handles it too.
1595
+ //while the above statement is true, we're not doing it as we want to keep invalid pixel value at 0 rather than arbitrary values
1596
+ if (mask) {
1597
+ for (row = 0; row < thisBlockHeight; row++) {
1598
+ for (col = 0; col < thisBlockWidth; col++) {
1599
+ if (mask[outPtr]) {
1600
+ resultPixels[outPtr] = isDiffEncoding ? Math.min(zMax, resultPixelsPrevDim[outPtr] + offset) : offset;
1601
+ }
1602
+ outPtr++;
1603
+ }
1604
+ outPtr += outStride;
1605
+ }
1606
+ }
1607
+ else {
1608
+ for (row = 0; row < thisBlockHeight; row++) {
1609
+ for (col = 0; col < thisBlockWidth; col++) {
1610
+ resultPixels[outPtr] = isDiffEncoding ? Math.min(zMax, resultPixelsPrevDim[outPtr] + offset) : offset;
1611
+ outPtr++;
1612
+ }
1613
+ outPtr += outStride;
1614
+ }
1615
+ }
1616
+ }
1617
+ else { //bitstuff encoding is 3
1618
+ data.ptr += blockPtr;
1619
+ //heavy lifting
1620
+ Lerc2Helpers.decodeBits(input, data, blockDataBuffer, offset, iDim);
1621
+ blockPtr = 0;
1622
+ // duplicate code to favor performance, diff encoding is for multidimension only
1623
+ if (isDiffEncoding) {
1624
+ if (mask) {
1625
+ for (row = 0; row < thisBlockHeight; row++) {
1626
+ for (col = 0; col < thisBlockWidth; col++) {
1627
+ if (mask[outPtr]) {
1628
+ resultPixels[outPtr] = blockDataBuffer[blockPtr++] + resultPixelsPrevDim[outPtr];
1629
+ }
1630
+ outPtr++;
1631
+ }
1632
+ outPtr += outStride;
1633
+ }
1634
+ }
1635
+ else {
1636
+ for (row = 0; row < thisBlockHeight; row++) {
1637
+ for (col = 0; col < thisBlockWidth; col++) {
1638
+ resultPixels[outPtr] = blockDataBuffer[blockPtr++] + resultPixelsPrevDim[outPtr];
1639
+ outPtr++;
1640
+ }
1641
+ outPtr += outStride;
1642
+ }
1643
+ }
1644
+ }
1645
+ else if (mask) {
1646
+ for (row = 0; row < thisBlockHeight; row++) {
1647
+ for (col = 0; col < thisBlockWidth; col++) {
1648
+ if (mask[outPtr]) {
1649
+ resultPixels[outPtr] = blockDataBuffer[blockPtr++];
1650
+ }
1651
+ outPtr++;
1652
+ }
1653
+ outPtr += outStride;
1654
+ }
1655
+ }
1656
+ else {
1657
+ for (row = 0; row < thisBlockHeight; row++) {
1658
+ for (col = 0; col < thisBlockWidth; col++) {
1659
+ resultPixels[outPtr++] = blockDataBuffer[blockPtr++];
1660
+ }
1661
+ outPtr += outStride;
1662
+ }
1663
+ }
1664
+ }
1665
+ }
1666
+ }
1667
+ }
1668
+ }
1669
+ //swap for BIP: it's always easier for clients to handle BSQ so we keep existing logic and introduce a swap here to minimze changes
1670
+ if (numDims > 1 && !useBSQForOutputDim) {
1671
+ data.pixels.resultPixels = Lerc2Helpers.swapDimensionOrder(data.pixels.resultPixels, numPixels, numDims, OutPixelTypeArray);
1672
+ }
1673
+ },
1674
+
1675
+ /*****************
1676
+ * private methods (helper methods)
1677
+ *****************/
1678
+
1679
+ formatFileInfo: function(data) {
1680
+ return {
1681
+ "fileIdentifierString": data.headerInfo.fileIdentifierString,
1682
+ "fileVersion": data.headerInfo.fileVersion,
1683
+ "imageType": data.headerInfo.imageType,
1684
+ "height": data.headerInfo.height,
1685
+ "width": data.headerInfo.width,
1686
+ "numValidPixel": data.headerInfo.numValidPixel,
1687
+ "microBlockSize": data.headerInfo.microBlockSize,
1688
+ "blobSize": data.headerInfo.blobSize,
1689
+ "maxZError": data.headerInfo.maxZError,
1690
+ "pixelType": Lerc2Helpers.getPixelType(data.headerInfo.imageType),
1691
+ "eofOffset": data.eofOffset,
1692
+ "mask": data.mask ? {
1693
+ "numBytes": data.mask.numBytes
1694
+ } : null,
1695
+ "pixels": {
1696
+ "numBlocksX": data.pixels.numBlocksX,
1697
+ "numBlocksY": data.pixels.numBlocksY,
1698
+ //"numBytes": data.pixels.numBytes,
1699
+ "maxValue": data.headerInfo.zMax,
1700
+ "minValue": data.headerInfo.zMin,
1701
+ "noDataValue": data.noDataValue
1702
+ }
1703
+ };
1704
+ },
1705
+
1706
+ constructConstantSurface: function(data, useBSQForOutputDim) {
1707
+ var val = data.headerInfo.zMax;
1708
+ var valMin = data.headerInfo.zMin;
1709
+ var maxValues = data.headerInfo.maxValues;
1710
+ var numDims = data.headerInfo.numDims;
1711
+ var numPixels = data.headerInfo.height * data.headerInfo.width;
1712
+ var i = 0, k = 0, nStart = 0;
1713
+ var mask = data.pixels.resultMask;
1714
+ var resultPixels = data.pixels.resultPixels;
1715
+ if (mask) {
1716
+ if (numDims > 1) {
1717
+ if (useBSQForOutputDim) {
1718
+ for (i = 0; i < numDims; i++) {
1719
+ nStart = i * numPixels;
1720
+ val = maxValues[i];
1721
+ for (k = 0; k < numPixels; k++) {
1722
+ if (mask[k]) {
1723
+ resultPixels[nStart + k] = val;
1724
+ }
1725
+ }
1726
+ }
1727
+ }
1728
+ else {
1729
+ for (k = 0; k < numPixels; k++) {
1730
+ if (mask[k]) {
1731
+ nStart = k * numDims;
1732
+ for (i = 0; i < numDims; i++) {
1733
+ resultPixels[nStart + numDims] = maxValues[i];
1734
+ }
1735
+ }
1736
+ }
1737
+ }
1738
+ }
1739
+ else {
1740
+ for (k = 0; k < numPixels; k++) {
1741
+ if (mask[k]) {
1742
+ resultPixels[k] = val;
1743
+ }
1744
+ }
1745
+ }
1746
+ }
1747
+ else {
1748
+ if (numDims > 1 && valMin !== val) {
1749
+ if (useBSQForOutputDim) {
1750
+ for (i = 0; i < numDims; i++) {
1751
+ nStart = i * numPixels;
1752
+ val = maxValues[i];
1753
+ for (k = 0; k < numPixels; k++) {
1754
+ resultPixels[nStart + k] = val;
1755
+ }
1756
+ }
1757
+ }
1758
+ else {
1759
+ for (k = 0; k < numPixels; k++) {
1760
+ nStart = k * numDims;
1761
+ for (i = 0; i < numDims; i++) {
1762
+ resultPixels[nStart + i] = maxValues[i];
1763
+ }
1764
+ }
1765
+ }
1766
+ }
1767
+ else {
1768
+ for (k = 0; k < numPixels * numDims; k++) {
1769
+ resultPixels[k] = val;
1770
+ }
1771
+ }
1772
+ }
1773
+ return;
1774
+ },
1775
+
1776
+ getDataTypeArray: function(t) {
1777
+ var tp;
1778
+ switch (t) {
1779
+ case 0: //char
1780
+ tp = Int8Array;
1781
+ break;
1782
+ case 1: //byte
1783
+ tp = Uint8Array;
1784
+ break;
1785
+ case 2: //short
1786
+ tp = Int16Array;
1787
+ break;
1788
+ case 3: //ushort
1789
+ tp = Uint16Array;
1790
+ break;
1791
+ case 4:
1792
+ tp = Int32Array;
1793
+ break;
1794
+ case 5:
1795
+ tp = Uint32Array;
1796
+ break;
1797
+ case 6:
1798
+ tp = Float32Array;
1799
+ break;
1800
+ case 7:
1801
+ tp = Float64Array;
1802
+ break;
1803
+ default:
1804
+ tp = Float32Array;
1805
+ }
1806
+ return tp;
1807
+ },
1808
+
1809
+ getPixelType: function(t) {
1810
+ var tp;
1811
+ switch (t) {
1812
+ case 0: //char
1813
+ tp = "S8";
1814
+ break;
1815
+ case 1: //byte
1816
+ tp = "U8";
1817
+ break;
1818
+ case 2: //short
1819
+ tp = "S16";
1820
+ break;
1821
+ case 3: //ushort
1822
+ tp = "U16";
1823
+ break;
1824
+ case 4:
1825
+ tp = "S32";
1826
+ break;
1827
+ case 5:
1828
+ tp = "U32";
1829
+ break;
1830
+ case 6:
1831
+ tp = "F32";
1832
+ break;
1833
+ case 7:
1834
+ tp = "F64";
1835
+ break;
1836
+ default:
1837
+ tp = "F32";
1838
+ }
1839
+ return tp;
1840
+ },
1841
+
1842
+ isValidPixelValue: function(t, val) {
1843
+ if (val == null) {
1844
+ return false;
1845
+ }
1846
+ var isValid;
1847
+ switch (t) {
1848
+ case 0: //char
1849
+ isValid = val >= -128 && val <= 127;
1850
+ break;
1851
+ case 1: //byte (unsigned char)
1852
+ isValid = val >= 0 && val <= 255;
1853
+ break;
1854
+ case 2: //short
1855
+ isValid = val >= -32768 && val <= 32767;
1856
+ break;
1857
+ case 3: //ushort
1858
+ isValid = val >= 0 && val <= 65536;
1859
+ break;
1860
+ case 4: //int 32
1861
+ isValid = val >= -2147483648 && val <= 2147483647;
1862
+ break;
1863
+ case 5: //uinit 32
1864
+ isValid = val >= 0 && val <= 4294967296;
1865
+ break;
1866
+ case 6:
1867
+ isValid = val >= -3.4027999387901484e+38 && val <= 3.4027999387901484e+38;
1868
+ break;
1869
+ case 7:
1870
+ isValid = val >= -1.7976931348623157e+308 && val <= 1.7976931348623157e+308;
1871
+ break;
1872
+ default:
1873
+ isValid = false;
1874
+ }
1875
+ return isValid;
1876
+ },
1877
+
1878
+ getDataTypeSize: function(t) {
1879
+ var s = 0;
1880
+ switch (t) {
1881
+ case 0: //ubyte
1882
+ case 1: //byte
1883
+ s = 1;
1884
+ break;
1885
+ case 2: //short
1886
+ case 3: //ushort
1887
+ s = 2;
1888
+ break;
1889
+ case 4:
1890
+ case 5:
1891
+ case 6:
1892
+ s = 4;
1893
+ break;
1894
+ case 7:
1895
+ s = 8;
1896
+ break;
1897
+ default:
1898
+ s = t;
1899
+ }
1900
+ return s;
1901
+ },
1902
+
1903
+ getDataTypeUsed: function(dt, tc) {
1904
+ var t = dt;
1905
+ switch (dt) {
1906
+ case 2: //short
1907
+ case 4: //long
1908
+ t = dt - tc;
1909
+ break;
1910
+ case 3: //ushort
1911
+ case 5: //ulong
1912
+ t = dt - 2 * tc;
1913
+ break;
1914
+ case 6: //float
1915
+ if (0 === tc) {
1916
+ t = dt;
1917
+ }
1918
+ else if (1 === tc) {
1919
+ t = 2;
1920
+ }
1921
+ else {
1922
+ t = 1;//byte
1923
+ }
1924
+ break;
1925
+ case 7: //double
1926
+ if (0 === tc) {
1927
+ t = dt;
1928
+ }
1929
+ else {
1930
+ t = dt - 2 * tc + 1;
1931
+ }
1932
+ break;
1933
+ default:
1934
+ t = dt;
1935
+ break;
1936
+ }
1937
+ return t;
1938
+ },
1939
+
1940
+ getOnePixel: function(block, blockPtr, offsetType, view) {
1941
+ var temp = 0;
1942
+ switch (offsetType) {
1943
+ case 0: //char
1944
+ temp = view.getInt8(blockPtr);
1945
+ break;
1946
+ case 1: //byte
1947
+ temp = view.getUint8(blockPtr);
1948
+ break;
1949
+ case 2:
1950
+ temp = view.getInt16(blockPtr, true);
1951
+ break;
1952
+ case 3:
1953
+ temp = view.getUint16(blockPtr, true);
1954
+ break;
1955
+ case 4:
1956
+ temp = view.getInt32(blockPtr, true);
1957
+ break;
1958
+ case 5:
1959
+ temp = view.getUInt32(blockPtr, true);
1960
+ break;
1961
+ case 6:
1962
+ temp = view.getFloat32(blockPtr, true);
1963
+ break;
1964
+ case 7:
1965
+ temp = view.getFloat64(blockPtr, true);
1966
+ break;
1967
+ default:
1968
+ throw ("the decoder does not understand this pixel type");
1969
+ }
1970
+ return temp;
1971
+ },
1972
+
1973
+ swapDimensionOrder: function(pixels, numPixels, numDims, OutPixelTypeArray, inputIsBIP) {
1974
+ var i = 0, j = 0, iDim = 0, temp = 0, swap = pixels;
1975
+ if (numDims > 1) {
1976
+ swap = new OutPixelTypeArray(numPixels * numDims);
1977
+ if (inputIsBIP) {
1978
+ for (i=0; i<numPixels; i++) {
1979
+ temp = i;
1980
+ for (iDim=0; iDim < numDims; iDim++, temp += numPixels) {
1981
+ swap[temp] = pixels[j++];
1982
+ }
1983
+ }
1984
+ }
1985
+ else {
1986
+ for (i=0; i<numPixels; i++) {
1987
+ temp = i;
1988
+ for (iDim=0; iDim < numDims; iDim++, temp += numPixels) {
1989
+ swap[j++] = pixels[temp];
1990
+ }
1991
+ }
1992
+ }
1993
+ }
1994
+ return swap;
1995
+ }
1996
+ };
1997
+
1998
+ /***************************************************
1999
+ *private class for a tree node. Huffman code is in Lerc2Helpers
2000
+ ****************************************************/
2001
+ var TreeNode = function(val, left, right) {
2002
+ this.val = val;
2003
+ this.left = left;
2004
+ this.right = right;
2005
+ };
2006
+
2007
+ var Lerc2Decode = {
2008
+ /*
2009
+ * ********removed options compared to LERC1. We can bring some of them back if needed.
2010
+ * removed pixel type. LERC2 is typed and doesn't require user to give pixel type
2011
+ * changed encodedMaskData to maskData. LERC2 's js version make it faster to use maskData directly.
2012
+ * 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.
2013
+ * removed nodatavalue. Because LERC2 pixels are typed, nodatavalue will sacrify a useful value for many types (8bit, 16bit) etc,
2014
+ * user has to be knowledgable enough about raster and their data to avoid usability issues. so nodata value is simply removed now.
2015
+ * We can add it back later if their's a clear requirement.
2016
+ * removed encodedMask. This option was not implemented in LercDecode. It can be done after decoding (less efficient)
2017
+ * removed computeUsedBitDepths.
2018
+ *
2019
+ *
2020
+ * response changes compared to LERC1
2021
+ * 1. encodedMaskData is not available
2022
+ * 2. noDataValue is optional (returns only if user's noDataValue is with in the valid data type range)
2023
+ * 3. maskData is always available
2024
+ */
2025
+ /*****************
2026
+ * public properties
2027
+ ******************/
2028
+ //HUFFMAN_LUT_BITS_MAX: 12, //use 2^12 lut, not configurable
2029
+
2030
+ /*****************
2031
+ * public methods
2032
+ *****************/
2033
+
2034
+ /**
2035
+ * Decode a LERC2 byte stream and return an object containing the pixel data and optional metadata.
2036
+ *
2037
+ * @param {ArrayBuffer} input The LERC input byte stream
2038
+ * @param {object} [options] options Decoding options
2039
+ * @param {number} [options.inputOffset] The number of bytes to skip in the input byte stream. A valid LERC file is expected at that position
2040
+ * @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
2041
+ * @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...]
2042
+ */
2043
+ decode: function(/*byte array*/ input, /*object*/ options) {
2044
+ //currently there's a bug in the sparse array, so please do not set to false
2045
+ options = options || {};
2046
+ var noDataValue = options.noDataValue;
2047
+
2048
+ //initialize
2049
+ var i = 0, data = {};
2050
+ data.ptr = options.inputOffset || 0;
2051
+ data.pixels = {};
2052
+
2053
+ // File header
2054
+ if (!Lerc2Helpers.readHeaderInfo(input, data)) {
2055
+ return;
2056
+ }
2057
+
2058
+ var headerInfo = data.headerInfo;
2059
+ var fileVersion = headerInfo.fileVersion;
2060
+ var OutPixelTypeArray = Lerc2Helpers.getDataTypeArray(headerInfo.imageType);
2061
+
2062
+ // version check
2063
+ if (fileVersion > 5) {
2064
+ throw "unsupported lerc version 2." + fileVersion;
2065
+ }
2066
+
2067
+ // Mask Header
2068
+ Lerc2Helpers.readMask(input, data);
2069
+ if (headerInfo.numValidPixel !== headerInfo.width * headerInfo.height && !data.pixels.resultMask) {
2070
+ data.pixels.resultMask = options.maskData;
2071
+ }
2072
+
2073
+ var numPixels = headerInfo.width * headerInfo.height;
2074
+ data.pixels.resultPixels = new OutPixelTypeArray(numPixels * headerInfo.numDims);
2075
+
2076
+ data.counter = {
2077
+ onesweep: 0,
2078
+ uncompressed: 0,
2079
+ lut: 0,
2080
+ bitstuffer: 0,
2081
+ constant: 0,
2082
+ constantoffset: 0
2083
+ };
2084
+ var useBSQForOutputDim = !options.returnPixelInterleavedDims;
2085
+ if (headerInfo.numValidPixel !== 0) {
2086
+ //not tested
2087
+ if (headerInfo.zMax === headerInfo.zMin) //constant surface
2088
+ {
2089
+ Lerc2Helpers.constructConstantSurface(data, useBSQForOutputDim);
2090
+ }
2091
+ else if (fileVersion >= 4 && Lerc2Helpers.checkMinMaxRanges(input, data)) {
2092
+ Lerc2Helpers.constructConstantSurface(data, useBSQForOutputDim);
2093
+ }
2094
+ else {
2095
+ var view = new DataView(input, data.ptr, 2);
2096
+ var bReadDataOneSweep = view.getUint8(0);
2097
+ data.ptr++;
2098
+ if (bReadDataOneSweep) {
2099
+ //console.debug("OneSweep");
2100
+ Lerc2Helpers.readDataOneSweep(input, data, OutPixelTypeArray, useBSQForOutputDim);
2101
+ }
2102
+ else {
2103
+ //lerc2.1: //bitstuffing + lut
2104
+ //lerc2.2: //bitstuffing + lut + huffman
2105
+ //lerc2.3: new bitstuffer
2106
+ if (fileVersion > 1 && headerInfo.imageType <= 1 && Math.abs(headerInfo.maxZError - 0.5) < 0.00001) {
2107
+ //this is 2.x plus 8 bit (unsigned and signed) data, possiblity of Huffman
2108
+ var flagHuffman = view.getUint8(1);
2109
+ data.ptr++;
2110
+ data.encodeMode = flagHuffman;
2111
+ if (flagHuffman > 2 || (fileVersion < 4 && flagHuffman > 1)) {
2112
+ throw "Invalid Huffman flag " + flagHuffman;
2113
+ }
2114
+ if (flagHuffman) {//1 - delta Huffman, 2 - Huffman
2115
+ //console.log("Huffman");
2116
+ Lerc2Helpers.readHuffman(input, data, OutPixelTypeArray, useBSQForOutputDim);
2117
+ }
2118
+ else {
2119
+ //console.log("Tiles");
2120
+ Lerc2Helpers.readTiles(input, data, OutPixelTypeArray, useBSQForOutputDim);
2121
+ }
2122
+ }
2123
+ else { //lerc2.x non-8 bit data
2124
+ //console.log("Tiles");
2125
+ Lerc2Helpers.readTiles(input, data, OutPixelTypeArray, useBSQForOutputDim);
2126
+ }
2127
+ }
2128
+ }
2129
+ }
2130
+
2131
+ data.eofOffset = data.ptr;
2132
+ var diff;
2133
+ if (options.inputOffset) {
2134
+ diff = data.headerInfo.blobSize + options.inputOffset - data.ptr;
2135
+ if (Math.abs(diff) >= 1) {
2136
+ //console.debug("incorrect eof: dataptr " + data.ptr + " offset " + options.inputOffset + " blobsize " + data.headerInfo.blobSize + " diff: " + diff);
2137
+ data.eofOffset = options.inputOffset + data.headerInfo.blobSize;
2138
+ }
2139
+ }
2140
+ else {
2141
+ diff = data.headerInfo.blobSize - data.ptr;
2142
+ if (Math.abs(diff) >= 1) {
2143
+ //console.debug("incorrect first band eof: dataptr " + data.ptr + " blobsize " + data.headerInfo.blobSize + " diff: " + diff);
2144
+ data.eofOffset = data.headerInfo.blobSize;
2145
+ }
2146
+ }
2147
+
2148
+ var result = {
2149
+ width: headerInfo.width,
2150
+ height: headerInfo.height,
2151
+ pixelData: data.pixels.resultPixels,
2152
+ minValue: headerInfo.zMin,
2153
+ maxValue: headerInfo.zMax,
2154
+ validPixelCount: headerInfo.numValidPixel,
2155
+ dimCount: headerInfo.numDims,
2156
+ dimStats: {
2157
+ minValues: headerInfo.minValues,
2158
+ maxValues: headerInfo.maxValues
2159
+ },
2160
+ maskData: data.pixels.resultMask
2161
+ //noDataValue: noDataValue
2162
+ };
2163
+
2164
+ //we should remove this if there's no existing client
2165
+ //optional noDataValue processing, it's user's responsiblity
2166
+ if (data.pixels.resultMask && Lerc2Helpers.isValidPixelValue(headerInfo.imageType, noDataValue)) {
2167
+ var mask = data.pixels.resultMask;
2168
+ for (i = 0; i < numPixels; i++) {
2169
+ if (!mask[i]) {
2170
+ result.pixelData[i] = noDataValue;
2171
+ }
2172
+ }
2173
+ result.noDataValue = noDataValue;
2174
+ }
2175
+ data.noDataValue = noDataValue;
2176
+ if (options.returnFileInfo) {
2177
+ result.fileInfo = Lerc2Helpers.formatFileInfo(data);
2178
+ }
2179
+ return result;
2180
+ },
2181
+
2182
+ getBandCount: function(/*byte array*/ input) {
2183
+ var count = 0;
2184
+ var i = 0;
2185
+ var temp = {};
2186
+ temp.ptr = 0;
2187
+ temp.pixels = {};
2188
+ while (i < input.byteLength - 58) {
2189
+ Lerc2Helpers.readHeaderInfo(input, temp);
2190
+ i += temp.headerInfo.blobSize;
2191
+ count++;
2192
+ temp.ptr = i;
2193
+ }
2194
+ return count;
2195
+ }
2196
+ };
2197
+
2198
+ return Lerc2Decode;
2199
+ })();
2200
+
2201
+ var isPlatformLittleEndian = (function() {
2202
+ var a = new ArrayBuffer(4);
2203
+ var b = new Uint8Array(a);
2204
+ var c = new Uint32Array(a);
2205
+ c[0] = 1;
2206
+ return b[0] === 1;
2207
+ })();
2208
+
2209
+ var Lerc = {
2210
+ /************wrapper**********************************************/
2211
+ /**
2212
+ * A wrapper for decoding both LERC1 and LERC2 byte streams capable of handling multiband pixel blocks for various pixel types.
2213
+ *
2214
+ * @alias module:Lerc
2215
+ * @param {ArrayBuffer} input The LERC input byte stream
2216
+ * @param {object} [options] The decoding options below are optional.
2217
+ * @param {number} [options.inputOffset] The number of bytes to skip in the input byte stream. A valid Lerc file is expected at that position.
2218
+ * @param {string} [options.pixelType] (LERC1 only) Default value is F32. Valid pixel types for input are U8/S8/S16/U16/S32/U32/F32.
2219
+ * @param {number} [options.noDataValue] (LERC1 only). It is recommended to use the returned mask instead of setting this value.
2220
+ * @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...]
2221
+ * @returns {{width, height, pixels, pixelType, mask, statistics}}
2222
+ * @property {number} width Width of decoded image.
2223
+ * @property {number} height Height of decoded image.
2224
+ * @property {array} pixels [band1, band2, …] Each band is a typed array of width*height.
2225
+ * @property {string} pixelType The type of pixels represented in the output.
2226
+ * @property {mask} mask Typed array with a size of width*height, or null if all pixels are valid.
2227
+ * @property {array} statistics [statistics_band1, statistics_band2, …] Each element is a statistics object representing min and max values
2228
+ **/
2229
+ decode: function(encodedData, options) {
2230
+ if (!isPlatformLittleEndian) {
2231
+ throw "Big endian system is not supported.";
2232
+ }
2233
+ options = options || {};
2234
+ var inputOffset = options.inputOffset || 0;
2235
+ var fileIdView = new Uint8Array(encodedData, inputOffset, 10);
2236
+ var fileIdentifierString = String.fromCharCode.apply(null, fileIdView);
2237
+ var lerc, majorVersion;
2238
+ if (fileIdentifierString.trim() === "CntZImage") {
2239
+ lerc = LercDecode;
2240
+ majorVersion = 1;
2241
+ }
2242
+ else if (fileIdentifierString.substring(0, 5) === "Lerc2") {
2243
+ lerc = Lerc2Decode;
2244
+ majorVersion = 2;
2245
+ }
2246
+ else {
2247
+ throw "Unexpected file identifier string: " + fileIdentifierString;
2248
+ }
2249
+
2250
+ var iPlane = 0, eof = encodedData.byteLength - 10, encodedMaskData, bandMasks = [], bandMask, maskData;
2251
+ var decodedPixelBlock = {
2252
+ width: 0,
2253
+ height: 0,
2254
+ pixels: [],
2255
+ pixelType: options.pixelType,
2256
+ mask: null,
2257
+ statistics: []
2258
+ };
2259
+ var uniqueBandMaskCount = 0;
2260
+
2261
+ while (inputOffset < eof) {
2262
+ var result = lerc.decode(encodedData, {
2263
+ inputOffset: inputOffset,//for both lerc1 and lerc2
2264
+ encodedMaskData: encodedMaskData,//lerc1 only
2265
+ maskData: maskData,//lerc2 only
2266
+ returnMask: iPlane === 0 ? true : false,//lerc1 only
2267
+ returnEncodedMask: iPlane === 0 ? true : false,//lerc1 only
2268
+ returnFileInfo: true,//for both lerc1 and lerc2
2269
+ returnPixelInterleavedDims: options.returnPixelInterleavedDims,//for ndim lerc2 only
2270
+ pixelType: options.pixelType || null,//lerc1 only
2271
+ noDataValue: options.noDataValue || null//lerc1 only
2272
+ });
2273
+
2274
+ inputOffset = result.fileInfo.eofOffset;
2275
+ maskData = result.maskData;//lerc2
2276
+ if (iPlane === 0) {
2277
+ encodedMaskData = result.encodedMaskData;//lerc1
2278
+ decodedPixelBlock.width = result.width;
2279
+ decodedPixelBlock.height = result.height;
2280
+ decodedPixelBlock.dimCount = result.dimCount || 1;
2281
+ //decodedPixelBlock.dimStats = decodedPixelBlock.dimStats;
2282
+ decodedPixelBlock.pixelType = result.pixelType || result.fileInfo.pixelType;
2283
+ decodedPixelBlock.mask = maskData;
2284
+ }
2285
+ if (majorVersion > 1) {
2286
+ if (maskData) {
2287
+ bandMasks.push(maskData);
2288
+ }
2289
+ if (result.fileInfo.mask && result.fileInfo.mask.numBytes > 0) {
2290
+ uniqueBandMaskCount++;
2291
+ }
2292
+ }
2293
+
2294
+ iPlane++;
2295
+ decodedPixelBlock.pixels.push(result.pixelData);
2296
+ decodedPixelBlock.statistics.push({
2297
+ minValue: result.minValue,
2298
+ maxValue: result.maxValue,
2299
+ noDataValue: result.noDataValue,
2300
+ dimStats: result.dimStats
2301
+ });
2302
+ }
2303
+ var i, j, numPixels;
2304
+ if (majorVersion > 1 && uniqueBandMaskCount > 1) {
2305
+ numPixels = decodedPixelBlock.width * decodedPixelBlock.height;
2306
+ decodedPixelBlock.bandMasks = bandMasks;
2307
+ maskData = new Uint8Array(numPixels);
2308
+ maskData.set(bandMasks[0]);
2309
+ for (i = 1; i < bandMasks.length; i++) {
2310
+ bandMask = bandMasks[i];
2311
+ for (j = 0; j < numPixels; j++) {
2312
+ maskData[j] = maskData[j] & bandMask[j];
2313
+ }
2314
+ }
2315
+ decodedPixelBlock.maskData = maskData;
2316
+ }
2317
+
2318
+ return decodedPixelBlock;
2319
+ }
2320
+ };
2321
+
2322
+ if (typeof undefined === "function" && undefined.amd) {/* jshint ignore:line */
2323
+ //amd loaders such as dojo and requireJS
2324
+ //http://wiki.commonjs.org/wiki/Modules/AsynchronousDefinition
2325
+ undefined([], function() { return Lerc; });/* jshint ignore:line */
2326
+ }
2327
+ else if ('object' !== "undefined" && module.exports) {/* jshint ignore:line */
2328
+ //commonJS module 1.0/1.1/1.1.1 systems, such as nodeJS
2329
+ //http://wiki.commonjs.org/wiki/Modules
2330
+ module.exports = Lerc;/* jshint ignore:line */
2331
+ }
2332
+ else {
2333
+ //assign to this, most likely window
2334
+ this.Lerc = Lerc;
2335
+ }
2336
+
2337
+ })();
2338
+ } (LercDecode$1));
2339
+ return LercDecode$1.exports;
2340
+ }
2341
+
2342
+ var LercDecodeExports = requireLercDecode();
2343
+ var Lerc = /*@__PURE__*/getDefaultExportFromCjs(LercDecodeExports);
2344
+
2345
+ var zstddec$1 = {};
2346
+
2347
+ var hasRequiredZstddec;
2348
+
2349
+ function requireZstddec () {
2350
+ if (hasRequiredZstddec) return zstddec$1;
2351
+ hasRequiredZstddec = 1;
2352
+ var _init;
2353
+ var instance;
2354
+ var heap;
2355
+ var IMPORT_OBJECT = {
2356
+ env: {
2357
+ emscripten_notify_memory_growth: function emscripten_notify_memory_growth(index) {
2358
+ heap = new Uint8Array(instance.exports.memory.buffer);
2359
+ }
2360
+ }
2361
+ };
2362
+ /**
2363
+ * ZSTD (Zstandard) decoder.
2364
+ */
2365
+ var ZSTDDecoder = /*#__PURE__*/function () {
2366
+ function ZSTDDecoder() {}
2367
+ var _proto = ZSTDDecoder.prototype;
2368
+ _proto.init = function init() {
2369
+ if (_init) return _init;
2370
+ if (typeof fetch !== 'undefined') {
2371
+ // Web.
2372
+ _init = fetch('data:application/wasm;base64,' + wasm).then(function (response) {
2373
+ return response.arrayBuffer();
2374
+ }).then(function (arrayBuffer) {
2375
+ return WebAssembly.instantiate(arrayBuffer, IMPORT_OBJECT);
2376
+ }).then(this._init);
2377
+ } else {
2378
+ // Node.js.
2379
+ _init = WebAssembly.instantiate(Buffer.from(wasm, 'base64'), IMPORT_OBJECT).then(this._init);
2380
+ }
2381
+ return _init;
2382
+ };
2383
+ _proto._init = function _init(result) {
2384
+ instance = result.instance;
2385
+ IMPORT_OBJECT.env.emscripten_notify_memory_growth(0); // initialize heap.
2386
+ };
2387
+ _proto.decode = function decode(array, uncompressedSize) {
2388
+ if (uncompressedSize === void 0) {
2389
+ uncompressedSize = 0;
2390
+ }
2391
+ if (!instance) throw new Error("ZSTDDecoder: Await .init() before decoding.");
2392
+ // Write compressed data into WASM memory.
2393
+ var compressedSize = array.byteLength;
2394
+ var compressedPtr = instance.exports.malloc(compressedSize);
2395
+ heap.set(array, compressedPtr);
2396
+ // Decompress into WASM memory.
2397
+ uncompressedSize = uncompressedSize || Number(instance.exports.ZSTD_findDecompressedSize(compressedPtr, compressedSize));
2398
+ var uncompressedPtr = instance.exports.malloc(uncompressedSize);
2399
+ var actualSize = instance.exports.ZSTD_decompress(uncompressedPtr, uncompressedSize, compressedPtr, compressedSize);
2400
+ // Read decompressed data and free WASM memory.
2401
+ var dec = heap.slice(uncompressedPtr, uncompressedPtr + actualSize);
2402
+ instance.exports.free(compressedPtr);
2403
+ instance.exports.free(uncompressedPtr);
2404
+ return dec;
2405
+ };
2406
+ return ZSTDDecoder;
2407
+ }();
2408
+ /**
2409
+ * BSD License
2410
+ *
2411
+ * For Zstandard software
2412
+ *
2413
+ * Copyright (c) 2016-present, Yann Collet, Facebook, Inc. All rights reserved.
2414
+ *
2415
+ * Redistribution and use in source and binary forms, with or without modification,
2416
+ * are permitted provided that the following conditions are met:
2417
+ *
2418
+ * * Redistributions of source code must retain the above copyright notice, this
2419
+ * list of conditions and the following disclaimer.
2420
+ *
2421
+ * * Redistributions in binary form must reproduce the above copyright notice,
2422
+ * this list of conditions and the following disclaimer in the documentation
2423
+ * and/or other materials provided with the distribution.
2424
+ *
2425
+ * * Neither the name Facebook nor the names of its contributors may be used to
2426
+ * endorse or promote products derived from this software without specific
2427
+ * prior written permission.
2428
+ *
2429
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
2430
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
2431
+ * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
2432
+ * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR
2433
+ * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
2434
+ * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
2435
+ * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
2436
+ * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
2437
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
2438
+ * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
2439
+ */
2440
+ // wasm:begin
2441
+ var wasm = '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IAMNACAEQQNxBEADQCACRQ0FIAAgAkF/aiICaiIDIAEgAmotAAA6AAAgA0EDcQ0ACwsgAkEDTQ0AA0AgACACQXxqIgJqIAEgAmooAgA2AgAgAkEDSw0ACwsgAkUNAgNAIAAgAkF/aiICaiABIAJqLQAAOgAAIAINAAsMAgsgAkEDTQ0AIAIhBANAIAMgASgCADYCACABQQRqIQEgA0EEaiEDIARBfGoiBEEDSw0ACyACQQNxIQILIAJFDQADQCADIAEtAAA6AAAgA0EBaiEDIAFBAWohASACQX9qIgINAAsLIAAL8wICAn8BfgJAIAJFDQAgACACaiIDQX9qIAE6AAAgACABOgAAIAJBA0kNACADQX5qIAE6AAAgACABOgABIANBfWogAToAACAAIAE6AAIgAkEHSQ0AIANBfGogAToAACAAIAE6AAMgAkEJSQ0AIABBACAAa0EDcSIEaiIDIAFB/wFxQYGChAhsIgE2AgAgAyACIARrQXxxIgRqIgJBfGogATYCACAEQQlJDQAgAyABNgIIIAMgATYCBCACQXhqIAE2AgAgAkF0aiABNgIAIARBGUkNACADIAE2AhggAyABNgIUIAMgATYCECADIAE2AgwgAkFwaiABNgIAIAJBbGogATYCACACQWhqIAE2AgAgAkFkaiABNgIAIAQgA0EEcUEYciIEayICQSBJDQAgAa0iBUIghiAFhCEFIAMgBGohAQNAIAEgBTcDGCABIAU3AxAgASAFNwMIIAEgBTcDACABQSBqIQEgAkFgaiICQR9LDQALCyAACy8BAn8gACgCBCAAKAIAQQJ0aiICLQACIQMgACACLwEAIAEgAi0AAxAIajYCACADCy8BAn8gACgCBCAAKAIAQQJ0aiICLQACIQMgACACLwEAIAEgAi0AAxAFajYCACADCx8AIAAgASACKAIEEAg2AgAgARAEGiAAIAJBCGo2AgQLCAAgAGdBH3MLugUBDX8jAEEQayIKJAACfyAEQQNNBEAgCkEANgIMIApBDGogAyAEEAsaIAAgASACIApBDGpBBBAVIgBBbCAAEAMbIAAgACAESxsMAQsgAEEAIAEoAgBBAXRBAmoQECENQVQgAygAACIGQQ9xIgBBCksNABogAiAAQQVqNgIAIAMgBGoiAkF8aiEMIAJBeWohDiACQXtqIRAgAEEGaiELQQQh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ASIDNgLE4AEgACgCvOABIQQgACABNgK84AEgACABIAJqNgK44AEgACABIAQgA2tqNgLA4AELpgEBAX8gACAAKALs4QEQFjYCyOABIABCADcD+OABIABCADcDuOABIABBwOABakIANwMAIABBqNAAaiIBQYyAgOAANgIAIABBADYCmOIBIABCADcDiOEBIABCAzcDgOEBIABBrNABakHgEikCADcCACAAQbTQAWpB6BIoAgA2AgAgACABNgIMIAAgAEGYIGo2AgggACAAQaAwajYCBCAAIABBEGo2AgALYQEBf0G4fyEDAkAgAUEDSQ0AIAIgABAhIgFBA3YiADYCCCACIAFBAXE2AgQgAiABQQF2QQNxIgM2AgACQCADQX9qIgFBAksNAAJAIAFBAWsOAgEAAgtBbA8LIAAhAwsgAwsMACAAIAEgAkEAEC4LiAQCA38CfiADEBYhBCAAQQBBKBAQIQAgBCACSwRAIAQPCyABRQRAQX8PCwJAAkAgA0EBRg0AIAEoAAAiBkGo6r5pRg0AQXYhAyAGQXBxQdDUtMIBRw0BQQghAyACQQhJDQEgAEEAQSgQECEAIAEoAAQhASAAQQE2AhQgACABrTcDAEEADwsgASACIAMQLyIDIAJLDQAgACADNgIYQXIhAyABIARqIgVBf2otAAAiAkEIcQ0AIAJBIHEiBkUEQEFwIQMgBS0AACIFQacBSw0BIAVBB3GtQgEgBUEDdkEKaq2GIgdCA4h+IAd8IQggBEEBaiEECyACQQZ2IQMgAkECdiEFAkAgAkEDcUF/aiICQQJLBEBBACECDAELAkACQAJAIAJBAWsOAgECAAsgASAEai0AACECIARBAWohBAwCCyABIARqLwAAIQIgBEECaiEEDAELIAEgBGooAAAhAiAEQQRqIQQLIAVBAXEhBQJ+AkACQAJAIANBf2oiA0ECTQRAIANBAWsOAgIDAQtCfyAGRQ0DGiABIARqMQAADAMLIAEgBGovAACtQoACfAwCCyABIARqKAAArQwBCyABIARqKQAACyEHIAAgBTYCICAAIAI2AhwgACAHNwMAQQAhAyAAQQA2AhQgACAHIAggBhsiBzcDCCAAIAdCgIAIIAdCgIAIVBs+AhALIAMLWwEBf0G4fyEDIAIQFiICIAFNBH8gACACakF/ai0AACIAQQNxQQJ0QaAeaigC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C0Egak8NAQsgByAHKQNoNwMQIAcgBykDYDcDCCAEIA0gB0EIaiAHQdwAaiAPIA4gESAQEB4hCwwBCyACIARqIQggBCAKEAcgAkERTwRAIARBEGohAgNAIAIgCkEQaiIKEAcgAkEQaiICIAhJDQALCyAIIAlrIQIgByATNgJcIAkgCCAOa0sEQCAJIAggEWtLBEBBbCELDAILIBAgAiAOayICaiIKIANqIBBNBEAgCCAKIAMQDxoMAgsgCCAKQQAgAmsQDyEIIAcgAiADaiIDNgJkIAggAmshCCAOIQILIAlBEE8EQCADIAhqIQMDQCAIIAIQByACQRBqIQIgCEEQaiIIIANJDQALDAELAkAgCUEHTQRAIAggAi0AADoAACAIIAItAAE6AAEgCCACLQACOgACIAggAi0AAzoAAyAIQQRqIAIgCUECdCIDQcAeaigCAGoiAhAXIAIgA0HgHmooAgBrIQIgBygCZCEDDAELIAggAhAMCyADQQlJDQAgAyAIaiEDIAhBCGoiCCACQQhqIgJrQQ9MBEADQCAIIAIQDCACQQhqIQIgCEEIaiIIIANJDQAMAgALAAsDQCAIIAIQByACQRBqIQIgCEEQaiIIIANJDQALCyAHQRhqEAQaIAsgDCALEAMiAhshDCAEIAQgC2ogAhshBCAFQX9qIgUNAAsgDBADDQFBbCEMIAdBGGoQBEECSQ0BQQAhCANAIAhBA0cEQCAAIAhBAnQiAmpBrNABaiACIAdqKAJENgIAIAhBAWohCAwBCwsgBygCXCEIC0G6fyEMIA8gCGsiACANIARrSw0AIAQEfyAEIAggABALIABqBUEACyABayEMCyAHQfAAaiQAIAwLkRcCFn8FfiMAQdABayIHJAAgByAAKALw4QEiCDYCvAEgASACaiESIAggACgCgOIBaiETAkACQCAFRQRAIAEhAwwBCyAAKALE4AEhESAAKALA4AEhFSAAKAK84AEhDyAAQQE2AozhAUEAIQgDQCAIQQNHBEAgByAIQQJ0IgJqIAAgAmpBrNABaigCADYCVCAIQQFqIQgMAQsLIAcgETYCZCAHIA82AmAgByABIA9rNgJoQWwhECAHQShqIAMgBBAGEAMNASAFQQQgBUEESBshFyAHQTxqIAdBKGogACgCABATIAdBxABqIAdBKGogACgCCBATIAdBzABqIAdB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IAdB0AFqJAAgEAslACAAQgA3AgAgAEEAOwEIIABBADoACyAAIAE2AgwgACACOgAKC7QFAQN/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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';
2442
+ // wasm:end
2443
+
2444
+ zstddec$1.ZSTDDecoder = ZSTDDecoder;
2445
+
2446
+ return zstddec$1;
2447
+ }
2448
+
2449
+ var zstddecExports = /*@__PURE__*/ requireZstddec();
2450
+ var zstddec = /*@__PURE__*/getDefaultExportFromCjs(zstddecExports);
2451
+
2452
+ const zstd = new zstddecExports.ZSTDDecoder();
2453
+
2454
+ class LercDecoder extends BaseDecoder {
2455
+ constructor(fileDirectory) {
2456
+ super();
2457
+
2458
+ this.planarConfiguration = typeof fileDirectory.PlanarConfiguration !== 'undefined' ? fileDirectory.PlanarConfiguration : 1;
2459
+ this.samplesPerPixel = typeof fileDirectory.SamplesPerPixel !== 'undefined' ? fileDirectory.SamplesPerPixel : 1;
2460
+
2461
+ this.addCompression = fileDirectory.LercParameters[LercParameters.AddCompression];
2462
+ }
2463
+
2464
+ decodeBlock(buffer) {
2465
+ switch (this.addCompression) {
2466
+ case LercAddCompression.None:
2467
+ break;
2468
+ case LercAddCompression.Deflate:
2469
+ buffer = inflate_1(new Uint8Array(buffer)).buffer; // eslint-disable-line no-param-reassign, prefer-destructuring
2470
+ break;
2471
+ case LercAddCompression.Zstandard:
2472
+ buffer = zstd.decode(new Uint8Array(buffer)).buffer; // eslint-disable-line no-param-reassign, prefer-destructuring
2473
+ break;
2474
+ default:
2475
+ throw new Error(`Unsupported LERC additional compression method identifier: ${this.addCompression}`);
2476
+ }
2477
+
2478
+ const lercResult = Lerc.decode(buffer, { returnPixelInterleavedDims: this.planarConfiguration === 1 });
2479
+ const lercData = lercResult.pixels[0];
2480
+ return lercData.buffer;
2481
+ }
2482
+ }
2483
+
2484
+ export { LercDecoder as default, zstd };
2485
+ //# sourceMappingURL=lerc-D9ISp5i_.js.map
2486
+
2487
+ //# sourceMappingURL=lerc-D9ISp5i_.js.map