@vitessce/gl 2.0.2 → 2.0.3

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