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