@gmgis/gm-sdk 1.12.5 → 2.0.2

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 (159) hide show
  1. package/dist/dist/index.js +1848 -0
  2. package/dist/gm.min.js +16983 -16483
  3. package/dist/index.js +1436 -1434
  4. package/dist/resources/ThirdParty/Workers/pako_deflate.min.js +1 -2
  5. package/dist/resources/ThirdParty/Workers/pako_inflate.min.js +1 -2
  6. package/dist/resources/ThirdParty/Workers/z-worker-pako.js +1 -1
  7. package/dist/resources/ThirdParty/google-earth-dbroot-parser.js +1 -8337
  8. package/dist/resources/ThirdParty/wasm_splats_bg.wasm +0 -0
  9. package/dist/resources/Workers/chunk-35SHYARM.js +26 -0
  10. package/dist/resources/Workers/chunk-37F5JSTI.js +26 -0
  11. package/dist/resources/Workers/chunk-3SSKC3VN.js +26 -0
  12. package/dist/resources/Workers/chunk-3W4GT7KQ.js +26 -0
  13. package/dist/resources/Workers/chunk-4IW2T6GF.js +26 -0
  14. package/dist/resources/Workers/chunk-5YEWO3HT.js +26 -0
  15. package/dist/resources/Workers/chunk-64RSHJUE.js +28 -0
  16. package/dist/resources/Workers/chunk-77IHZJJ3.js +26 -0
  17. package/dist/resources/Workers/chunk-7HTKERZY.js +26 -0
  18. package/dist/resources/Workers/{chunk-I2ITFFPX.js → chunk-A56XVLQR.js} +2 -13
  19. package/dist/resources/Workers/chunk-AJYK4IVJ.js +26 -0
  20. package/dist/resources/Workers/{chunk-PRGYLLJT.js → chunk-ARG42DC4.js} +2 -31
  21. package/dist/resources/Workers/chunk-AU7IKHOH.js +26 -0
  22. package/dist/resources/Workers/chunk-B4AA3ARO.js +26 -0
  23. package/dist/resources/Workers/chunk-CNCV5UL7.js +26 -0
  24. package/dist/resources/Workers/chunk-CYCB63OH.js +26 -0
  25. package/dist/resources/Workers/{chunk-DI5NGJUP.js → chunk-D6AA5QVT.js} +2 -20
  26. package/dist/resources/Workers/chunk-D6C66QON.js +26 -0
  27. package/dist/resources/Workers/chunk-DEPHB2WM.js +26 -0
  28. package/dist/resources/Workers/chunk-DMEY62ID.js +26 -0
  29. package/dist/resources/Workers/chunk-DQQ63PYM.js +26 -0
  30. package/dist/resources/Workers/chunk-ED5JPB3S.js +27 -0
  31. package/dist/resources/Workers/chunk-EZUYS2JF.js +26 -0
  32. package/dist/resources/Workers/chunk-FEVXJ54I.js +26 -0
  33. package/dist/resources/Workers/chunk-G5AGHVVC.js +26 -0
  34. package/dist/resources/Workers/{chunk-7JO7GPJN.js → chunk-GBYLG25F.js} +2 -15
  35. package/dist/resources/Workers/chunk-GILIDQNQ.js +26 -0
  36. package/dist/resources/Workers/chunk-HMIYSTF6.js +26 -0
  37. package/dist/resources/Workers/chunk-HTFSEEMT.js +26 -0
  38. package/dist/resources/Workers/chunk-HWXX4CWK.js +26 -0
  39. package/dist/resources/Workers/chunk-IYTZ52EY.js +26 -0
  40. package/dist/resources/Workers/chunk-J6UP6FLE.js +26 -0
  41. package/dist/resources/Workers/chunk-LEYMRMBK.js +27 -0
  42. package/dist/resources/Workers/chunk-M3MGYQSL.js +26 -0
  43. package/dist/resources/Workers/chunk-N4VJKXZS.js +26 -0
  44. package/dist/resources/Workers/chunk-NB3ML6JO.js +26 -0
  45. package/dist/resources/Workers/chunk-OFUUQVMR.js +26 -0
  46. package/dist/resources/Workers/chunk-OSW76XDF.js +26 -0
  47. package/dist/resources/Workers/chunk-PSPPBZWI.js +66 -0
  48. package/dist/resources/Workers/chunk-QN3VOORQ.js +26 -0
  49. package/dist/resources/Workers/chunk-QOUAJ6TL.js +26 -0
  50. package/dist/resources/Workers/chunk-RCV6KWXS.js +26 -0
  51. package/dist/resources/Workers/chunk-TCGIRNHN.js +26 -0
  52. package/dist/resources/Workers/chunk-U4IEOH5K.js +26 -0
  53. package/dist/resources/Workers/chunk-UP6I5URU.js +26 -0
  54. package/dist/resources/Workers/chunk-VTAIKJXX.js +26 -0
  55. package/dist/resources/Workers/chunk-VTBDSFTG.js +26 -0
  56. package/dist/resources/Workers/chunk-VW6VD53G.js +26 -0
  57. package/dist/resources/Workers/chunk-WGGIH7QW.js +26 -0
  58. package/dist/resources/Workers/chunk-WWA5PL4H.js +26 -0
  59. package/dist/resources/Workers/{chunk-6CHGCNMW.js → chunk-WZDE3RYP.js} +4 -34
  60. package/dist/resources/Workers/chunk-XRL4AVS5.js +26 -0
  61. package/dist/resources/Workers/combineGeometry.js +2 -40
  62. package/dist/resources/Workers/createBoxGeometry.js +2 -32
  63. package/dist/resources/Workers/createBoxOutlineGeometry.js +2 -209
  64. package/dist/resources/Workers/createCircleGeometry.js +2 -175
  65. package/dist/resources/Workers/createCircleOutlineGeometry.js +2 -121
  66. package/dist/resources/Workers/createCoplanarPolygonGeometry.js +2 -481
  67. package/dist/resources/Workers/createCoplanarPolygonOutlineGeometry.js +2 -199
  68. package/dist/resources/Workers/createCorridorGeometry.js +2 -1237
  69. package/dist/resources/Workers/createCorridorOutlineGeometry.js +2 -542
  70. package/dist/resources/Workers/createCylinderGeometry.js +2 -34
  71. package/dist/resources/Workers/createCylinderOutlineGeometry.js +2 -205
  72. package/dist/resources/Workers/createEllipseGeometry.js +2 -45
  73. package/dist/resources/Workers/createEllipseOutlineGeometry.js +2 -38
  74. package/dist/resources/Workers/createEllipsoidGeometry.js +2 -33
  75. package/dist/resources/Workers/createEllipsoidOutlineGeometry.js +2 -35
  76. package/dist/resources/Workers/createFrustumGeometry.js +2 -32
  77. package/dist/resources/Workers/createFrustumOutlineGeometry.js +2 -210
  78. package/dist/resources/Workers/createGeometry.js +2 -144
  79. package/dist/resources/Workers/createGroundPolylineGeometry.js +2 -1582
  80. package/dist/resources/Workers/createPlaneGeometry.js +2 -198
  81. package/dist/resources/Workers/createPlaneOutlineGeometry.js +2 -98
  82. package/dist/resources/Workers/createPolygonGeometry.js +2 -1381
  83. package/dist/resources/Workers/createPolygonOutlineGeometry.js +2 -509
  84. package/dist/resources/Workers/createPolylineGeometry.js +2 -470
  85. package/dist/resources/Workers/createPolylineVolumeGeometry.js +2 -354
  86. package/dist/resources/Workers/createPolylineVolumeOutlineGeometry.js +2 -251
  87. package/dist/resources/Workers/createRectangleGeometry.js +2 -1246
  88. package/dist/resources/Workers/createRectangleOutlineGeometry.js +2 -453
  89. package/dist/resources/Workers/createSimplePolylineGeometry.js +2 -374
  90. package/dist/resources/Workers/createSphereGeometry.js +2 -92
  91. package/dist/resources/Workers/createSphereOutlineGeometry.js +2 -92
  92. package/dist/resources/Workers/createTaskProcessorWorker.js +2 -8
  93. package/dist/resources/Workers/createVectorTileClampedPolylines.js +2 -466
  94. package/dist/resources/Workers/createVectorTileGeometries.js +2 -361
  95. package/dist/resources/Workers/createVectorTilePoints.js +2 -88
  96. package/dist/resources/Workers/createVectorTilePolygons.js +2 -359
  97. package/dist/resources/Workers/createVectorTilePolylines.js +2 -236
  98. package/dist/resources/Workers/createVerticesFromGoogleEarthEnterpriseBuffer.js +2 -539
  99. package/dist/resources/Workers/createVerticesFromHeightmap.js +2 -2252
  100. package/dist/resources/Workers/createVerticesFromQuantizedTerrainMesh.js +2 -729
  101. package/dist/resources/Workers/createWallGeometry.js +2 -464
  102. package/dist/resources/Workers/createWallOutlineGeometry.js +2 -312
  103. package/dist/resources/Workers/decodeDraco.js +2 -345
  104. package/dist/resources/Workers/decodeGoogleEarthEnterprisePacket.js +2 -2642
  105. package/dist/resources/Workers/decodeI3S.js +2 -1319
  106. package/dist/resources/Workers/gaussianSplatSorter.js +26 -0
  107. package/dist/resources/Workers/gaussianSplatTextureGenerator.js +26 -0
  108. package/dist/resources/Workers/transcodeKTX2.js +29 -3360
  109. package/dist/resources/Workers/transferTypedArrayTest.js +2 -17
  110. package/dist/resources/Workers/upsampleQuantizedTerrainMesh.js +2 -793
  111. package/package.json +74 -74
  112. package/dist/resources/ThirdParty/Workers/basis_transcoder.js +0 -21
  113. package/dist/resources/Workers/chunk-26GA3JAM.js +0 -139
  114. package/dist/resources/Workers/chunk-27HUZ7SA.js +0 -305
  115. package/dist/resources/Workers/chunk-2ZGOQXYU.js +0 -171
  116. package/dist/resources/Workers/chunk-3Q2L65QU.js +0 -1258
  117. package/dist/resources/Workers/chunk-472HQ3EH.js +0 -100
  118. package/dist/resources/Workers/chunk-5ODQSF26.js +0 -101
  119. package/dist/resources/Workers/chunk-5OOFQLKF.js +0 -634
  120. package/dist/resources/Workers/chunk-5PTXS2GO.js +0 -10390
  121. package/dist/resources/Workers/chunk-76BYBWHP.js +0 -122
  122. package/dist/resources/Workers/chunk-7BMOHCPM.js +0 -390
  123. package/dist/resources/Workers/chunk-7KTQP4VB.js +0 -59
  124. package/dist/resources/Workers/chunk-7O373FFS.js +0 -665
  125. package/dist/resources/Workers/chunk-AD63PIY6.js +0 -163
  126. package/dist/resources/Workers/chunk-BHQJ2NT7.js +0 -353
  127. package/dist/resources/Workers/chunk-C6YYBQXW.js +0 -102
  128. package/dist/resources/Workers/chunk-CKY7HOHV.js +0 -287
  129. package/dist/resources/Workers/chunk-DHYHSFFJ.js +0 -73
  130. package/dist/resources/Workers/chunk-E27BLMDD.js +0 -115
  131. package/dist/resources/Workers/chunk-E63IIM5T.js +0 -75
  132. package/dist/resources/Workers/chunk-E6V6SQZW.js +0 -456
  133. package/dist/resources/Workers/chunk-EJZTDTUH.js +0 -138
  134. package/dist/resources/Workers/chunk-FDOV2LBJ.js +0 -220
  135. package/dist/resources/Workers/chunk-FIGIZHAQ.js +0 -684
  136. package/dist/resources/Workers/chunk-GESF4OXQ.js +0 -1800
  137. package/dist/resources/Workers/chunk-GGZJN2TI.js +0 -2717
  138. package/dist/resources/Workers/chunk-GNBFYG7F.js +0 -1481
  139. package/dist/resources/Workers/chunk-GWCFU2SA.js +0 -300
  140. package/dist/resources/Workers/chunk-IBLIYJZR.js +0 -196
  141. package/dist/resources/Workers/chunk-JW4FOI6M.js +0 -476
  142. package/dist/resources/Workers/chunk-K4GQUNB5.js +0 -262
  143. package/dist/resources/Workers/chunk-M3GMB5OP.js +0 -834
  144. package/dist/resources/Workers/chunk-MXIZJAPH.js +0 -629
  145. package/dist/resources/Workers/chunk-N5KJGGCM.js +0 -1073
  146. package/dist/resources/Workers/chunk-NGPPMXRM.js +0 -435
  147. package/dist/resources/Workers/chunk-O3E4OAOE.js +0 -511
  148. package/dist/resources/Workers/chunk-PGRPDNHG.js +0 -1048
  149. package/dist/resources/Workers/chunk-S6MRMMQU.js +0 -157
  150. package/dist/resources/Workers/chunk-SMDOP47J.js +0 -945
  151. package/dist/resources/Workers/chunk-TGONEMZO.js +0 -421
  152. package/dist/resources/Workers/chunk-TKVT5GQM.js +0 -781
  153. package/dist/resources/Workers/chunk-U72QNFOJ.js +0 -758
  154. package/dist/resources/Workers/chunk-VJZB3WAV.js +0 -963
  155. package/dist/resources/Workers/chunk-VU2MNO7L.js +0 -239
  156. package/dist/resources/Workers/chunk-XY4BATBS.js +0 -500
  157. package/dist/resources/Workers/chunk-YFXQECWV.js +0 -2857
  158. package/dist/resources/Workers/chunk-YSGTGQQO.js +0 -398
  159. package/dist/resources/Workers/chunk-YZ733KKS.js +0 -368
@@ -1,7 +1,7 @@
1
1
  /**
2
2
  * @license
3
3
  * Cesium - https://github.com/CesiumGS/cesium
4
- * Version 1.122
4
+ * Version 1.132
5
5
  *
6
6
  * Copyright 2011-2022 Cesium Contributors
7
7
  *
@@ -23,2254 +23,4 @@
23
23
  * See https://github.com/CesiumGS/cesium/blob/main/LICENSE.md for full licensing details.
24
24
  */
25
25
 
26
- import {
27
- EllipsoidalOccluder_default,
28
- TerrainEncoding_default
29
- } from "./chunk-U72QNFOJ.js";
30
- import {
31
- createTaskProcessorWorker_default
32
- } from "./chunk-5ODQSF26.js";
33
- import {
34
- WebMercatorProjection_default
35
- } from "./chunk-E27BLMDD.js";
36
- import {
37
- OrientedBoundingBox_default
38
- } from "./chunk-M3GMB5OP.js";
39
- import "./chunk-NGPPMXRM.js";
40
- import "./chunk-CKY7HOHV.js";
41
- import {
42
- AxisAlignedBoundingBox_default
43
- } from "./chunk-S6MRMMQU.js";
44
- import "./chunk-3Q2L65QU.js";
45
- import "./chunk-2ZGOQXYU.js";
46
- import {
47
- BoundingSphere_default
48
- } from "./chunk-VJZB3WAV.js";
49
- import {
50
- Matrix4_default,
51
- Rectangle_default,
52
- Transforms_default
53
- } from "./chunk-5PTXS2GO.js";
54
- import "./chunk-K4GQUNB5.js";
55
- import {
56
- Cartesian2_default,
57
- Cartesian3_default,
58
- Ellipsoid_default
59
- } from "./chunk-YFXQECWV.js";
60
- import {
61
- Math_default
62
- } from "./chunk-XY4BATBS.js";
63
- import "./chunk-MXIZJAPH.js";
64
- import {
65
- RuntimeError_default
66
- } from "./chunk-6CHGCNMW.js";
67
- import {
68
- defaultValue_default
69
- } from "./chunk-7JO7GPJN.js";
70
- import {
71
- DeveloperError_default
72
- } from "./chunk-AD63PIY6.js";
73
- import {
74
- __commonJS,
75
- __toESM,
76
- defined_default
77
- } from "./chunk-E63IIM5T.js";
78
-
79
- // node_modules/lerc/LercDecode.js
80
- var require_LercDecode = __commonJS({
81
- "node_modules/lerc/LercDecode.js"(exports, module) {
82
- /* Copyright 2015-2018 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 */
83
- (function() {
84
- var LercDecode = function() {
85
- var CntZImage = {};
86
- CntZImage.defaultNoDataValue = -34027999387901484e22;
87
- CntZImage.decode = function(input, options) {
88
- options = options || {};
89
- var skipMask = options.encodedMaskData || options.encodedMaskData === null;
90
- var parsedData = parse(input, options.inputOffset || 0, skipMask);
91
- var noDataValue = options.noDataValue !== null ? options.noDataValue : CntZImage.defaultNoDataValue;
92
- var uncompressedData = uncompressPixelValues(
93
- parsedData,
94
- options.pixelType || Float32Array,
95
- options.encodedMaskData,
96
- noDataValue,
97
- options.returnMask
98
- );
99
- var result = {
100
- width: parsedData.width,
101
- height: parsedData.height,
102
- pixelData: uncompressedData.resultPixels,
103
- minValue: uncompressedData.minValue,
104
- maxValue: parsedData.pixels.maxValue,
105
- noDataValue
106
- };
107
- if (uncompressedData.resultMask) {
108
- result.maskData = uncompressedData.resultMask;
109
- }
110
- if (options.returnEncodedMask && parsedData.mask) {
111
- result.encodedMaskData = parsedData.mask.bitset ? parsedData.mask.bitset : null;
112
- }
113
- if (options.returnFileInfo) {
114
- result.fileInfo = formatFileInfo(parsedData);
115
- if (options.computeUsedBitDepths) {
116
- result.fileInfo.bitDepths = computeUsedBitDepths(parsedData);
117
- }
118
- }
119
- return result;
120
- };
121
- var uncompressPixelValues = function(data, TypedArrayClass, maskBitset, noDataValue, storeDecodedMask) {
122
- var blockIdx = 0;
123
- var numX = data.pixels.numBlocksX;
124
- var numY = data.pixels.numBlocksY;
125
- var blockWidth = Math.floor(data.width / numX);
126
- var blockHeight = Math.floor(data.height / numY);
127
- var scale = 2 * data.maxZError;
128
- var minValue = Number.MAX_VALUE, currentValue;
129
- maskBitset = maskBitset || (data.mask ? data.mask.bitset : null);
130
- var resultPixels, resultMask;
131
- resultPixels = new TypedArrayClass(data.width * data.height);
132
- if (storeDecodedMask && maskBitset) {
133
- resultMask = new Uint8Array(data.width * data.height);
134
- }
135
- var blockDataBuffer = new Float32Array(blockWidth * blockHeight);
136
- var xx, yy;
137
- for (var y = 0; y <= numY; y++) {
138
- var thisBlockHeight = y !== numY ? blockHeight : data.height % numY;
139
- if (thisBlockHeight === 0) {
140
- continue;
141
- }
142
- for (var x = 0; x <= numX; x++) {
143
- var thisBlockWidth = x !== numX ? blockWidth : data.width % numX;
144
- if (thisBlockWidth === 0) {
145
- continue;
146
- }
147
- var outPtr = y * data.width * blockHeight + x * blockWidth;
148
- var outStride = data.width - thisBlockWidth;
149
- var block = data.pixels.blocks[blockIdx];
150
- var blockData, blockPtr, constValue;
151
- if (block.encoding < 2) {
152
- if (block.encoding === 0) {
153
- blockData = block.rawData;
154
- } else {
155
- unstuff(block.stuffedData, block.bitsPerPixel, block.numValidPixels, block.offset, scale, blockDataBuffer, data.pixels.maxValue);
156
- blockData = blockDataBuffer;
157
- }
158
- blockPtr = 0;
159
- } else if (block.encoding === 2) {
160
- constValue = 0;
161
- } else {
162
- constValue = block.offset;
163
- }
164
- var maskByte;
165
- if (maskBitset) {
166
- for (yy = 0; yy < thisBlockHeight; yy++) {
167
- if (outPtr & 7) {
168
- maskByte = maskBitset[outPtr >> 3];
169
- maskByte <<= outPtr & 7;
170
- }
171
- for (xx = 0; xx < thisBlockWidth; xx++) {
172
- if (!(outPtr & 7)) {
173
- maskByte = maskBitset[outPtr >> 3];
174
- }
175
- if (maskByte & 128) {
176
- if (resultMask) {
177
- resultMask[outPtr] = 1;
178
- }
179
- currentValue = block.encoding < 2 ? blockData[blockPtr++] : constValue;
180
- minValue = minValue > currentValue ? currentValue : minValue;
181
- resultPixels[outPtr++] = currentValue;
182
- } else {
183
- if (resultMask) {
184
- resultMask[outPtr] = 0;
185
- }
186
- resultPixels[outPtr++] = noDataValue;
187
- }
188
- maskByte <<= 1;
189
- }
190
- outPtr += outStride;
191
- }
192
- } else {
193
- if (block.encoding < 2) {
194
- for (yy = 0; yy < thisBlockHeight; yy++) {
195
- for (xx = 0; xx < thisBlockWidth; xx++) {
196
- currentValue = blockData[blockPtr++];
197
- minValue = minValue > currentValue ? currentValue : minValue;
198
- resultPixels[outPtr++] = currentValue;
199
- }
200
- outPtr += outStride;
201
- }
202
- } else {
203
- minValue = minValue > constValue ? constValue : minValue;
204
- for (yy = 0; yy < thisBlockHeight; yy++) {
205
- for (xx = 0; xx < thisBlockWidth; xx++) {
206
- resultPixels[outPtr++] = constValue;
207
- }
208
- outPtr += outStride;
209
- }
210
- }
211
- }
212
- if (block.encoding === 1 && blockPtr !== block.numValidPixels) {
213
- throw "Block and Mask do not match";
214
- }
215
- blockIdx++;
216
- }
217
- }
218
- return {
219
- resultPixels,
220
- resultMask,
221
- minValue
222
- };
223
- };
224
- var formatFileInfo = function(data) {
225
- return {
226
- "fileIdentifierString": data.fileIdentifierString,
227
- "fileVersion": data.fileVersion,
228
- "imageType": data.imageType,
229
- "height": data.height,
230
- "width": data.width,
231
- "maxZError": data.maxZError,
232
- "eofOffset": data.eofOffset,
233
- "mask": data.mask ? {
234
- "numBlocksX": data.mask.numBlocksX,
235
- "numBlocksY": data.mask.numBlocksY,
236
- "numBytes": data.mask.numBytes,
237
- "maxValue": data.mask.maxValue
238
- } : null,
239
- "pixels": {
240
- "numBlocksX": data.pixels.numBlocksX,
241
- "numBlocksY": data.pixels.numBlocksY,
242
- "numBytes": data.pixels.numBytes,
243
- "maxValue": data.pixels.maxValue,
244
- "noDataValue": data.noDataValue
245
- }
246
- };
247
- };
248
- var computeUsedBitDepths = function(data) {
249
- var numBlocks = data.pixels.numBlocksX * data.pixels.numBlocksY;
250
- var bitDepths = {};
251
- for (var i = 0; i < numBlocks; i++) {
252
- var block = data.pixels.blocks[i];
253
- if (block.encoding === 0) {
254
- bitDepths.float32 = true;
255
- } else if (block.encoding === 1) {
256
- bitDepths[block.bitsPerPixel] = true;
257
- } else {
258
- bitDepths[0] = true;
259
- }
260
- }
261
- return Object.keys(bitDepths);
262
- };
263
- var parse = function(input, fp, skipMask) {
264
- var data = {};
265
- var fileIdView = new Uint8Array(input, fp, 10);
266
- data.fileIdentifierString = String.fromCharCode.apply(null, fileIdView);
267
- if (data.fileIdentifierString.trim() !== "CntZImage") {
268
- throw "Unexpected file identifier string: " + data.fileIdentifierString;
269
- }
270
- fp += 10;
271
- var view = new DataView(input, fp, 24);
272
- data.fileVersion = view.getInt32(0, true);
273
- data.imageType = view.getInt32(4, true);
274
- data.height = view.getUint32(8, true);
275
- data.width = view.getUint32(12, true);
276
- data.maxZError = view.getFloat64(16, true);
277
- fp += 24;
278
- if (!skipMask) {
279
- view = new DataView(input, fp, 16);
280
- data.mask = {};
281
- data.mask.numBlocksY = view.getUint32(0, true);
282
- data.mask.numBlocksX = view.getUint32(4, true);
283
- data.mask.numBytes = view.getUint32(8, true);
284
- data.mask.maxValue = view.getFloat32(12, true);
285
- fp += 16;
286
- if (data.mask.numBytes > 0) {
287
- var bitset = new Uint8Array(Math.ceil(data.width * data.height / 8));
288
- view = new DataView(input, fp, data.mask.numBytes);
289
- var cnt = view.getInt16(0, true);
290
- var ip = 2, op = 0;
291
- do {
292
- if (cnt > 0) {
293
- while (cnt--) {
294
- bitset[op++] = view.getUint8(ip++);
295
- }
296
- } else {
297
- var val = view.getUint8(ip++);
298
- cnt = -cnt;
299
- while (cnt--) {
300
- bitset[op++] = val;
301
- }
302
- }
303
- cnt = view.getInt16(ip, true);
304
- ip += 2;
305
- } while (ip < data.mask.numBytes);
306
- if (cnt !== -32768 || op < bitset.length) {
307
- throw "Unexpected end of mask RLE encoding";
308
- }
309
- data.mask.bitset = bitset;
310
- fp += data.mask.numBytes;
311
- } else if ((data.mask.numBytes | data.mask.numBlocksY | data.mask.maxValue) === 0) {
312
- data.mask.bitset = new Uint8Array(Math.ceil(data.width * data.height / 8));
313
- }
314
- }
315
- view = new DataView(input, fp, 16);
316
- data.pixels = {};
317
- data.pixels.numBlocksY = view.getUint32(0, true);
318
- data.pixels.numBlocksX = view.getUint32(4, true);
319
- data.pixels.numBytes = view.getUint32(8, true);
320
- data.pixels.maxValue = view.getFloat32(12, true);
321
- fp += 16;
322
- var numBlocksX = data.pixels.numBlocksX;
323
- var numBlocksY = data.pixels.numBlocksY;
324
- var actualNumBlocksX = numBlocksX + (data.width % numBlocksX > 0 ? 1 : 0);
325
- var actualNumBlocksY = numBlocksY + (data.height % numBlocksY > 0 ? 1 : 0);
326
- data.pixels.blocks = new Array(actualNumBlocksX * actualNumBlocksY);
327
- var blockI = 0;
328
- for (var blockY = 0; blockY < actualNumBlocksY; blockY++) {
329
- for (var blockX = 0; blockX < actualNumBlocksX; blockX++) {
330
- var size = 0;
331
- var bytesLeft = input.byteLength - fp;
332
- view = new DataView(input, fp, Math.min(10, bytesLeft));
333
- var block = {};
334
- data.pixels.blocks[blockI++] = block;
335
- var headerByte = view.getUint8(0);
336
- size++;
337
- block.encoding = headerByte & 63;
338
- if (block.encoding > 3) {
339
- throw "Invalid block encoding (" + block.encoding + ")";
340
- }
341
- if (block.encoding === 2) {
342
- fp++;
343
- continue;
344
- }
345
- if (headerByte !== 0 && headerByte !== 2) {
346
- headerByte >>= 6;
347
- block.offsetType = headerByte;
348
- if (headerByte === 2) {
349
- block.offset = view.getInt8(1);
350
- size++;
351
- } else if (headerByte === 1) {
352
- block.offset = view.getInt16(1, true);
353
- size += 2;
354
- } else if (headerByte === 0) {
355
- block.offset = view.getFloat32(1, true);
356
- size += 4;
357
- } else {
358
- throw "Invalid block offset type";
359
- }
360
- if (block.encoding === 1) {
361
- headerByte = view.getUint8(size);
362
- size++;
363
- block.bitsPerPixel = headerByte & 63;
364
- headerByte >>= 6;
365
- block.numValidPixelsType = headerByte;
366
- if (headerByte === 2) {
367
- block.numValidPixels = view.getUint8(size);
368
- size++;
369
- } else if (headerByte === 1) {
370
- block.numValidPixels = view.getUint16(size, true);
371
- size += 2;
372
- } else if (headerByte === 0) {
373
- block.numValidPixels = view.getUint32(size, true);
374
- size += 4;
375
- } else {
376
- throw "Invalid valid pixel count type";
377
- }
378
- }
379
- }
380
- fp += size;
381
- if (block.encoding === 3) {
382
- continue;
383
- }
384
- var arrayBuf, store8;
385
- if (block.encoding === 0) {
386
- var numPixels = (data.pixels.numBytes - 1) / 4;
387
- if (numPixels !== Math.floor(numPixels)) {
388
- throw "uncompressed block has invalid length";
389
- }
390
- arrayBuf = new ArrayBuffer(numPixels * 4);
391
- store8 = new Uint8Array(arrayBuf);
392
- store8.set(new Uint8Array(input, fp, numPixels * 4));
393
- var rawData = new Float32Array(arrayBuf);
394
- block.rawData = rawData;
395
- fp += numPixels * 4;
396
- } else if (block.encoding === 1) {
397
- var dataBytes = Math.ceil(block.numValidPixels * block.bitsPerPixel / 8);
398
- var dataWords = Math.ceil(dataBytes / 4);
399
- arrayBuf = new ArrayBuffer(dataWords * 4);
400
- store8 = new Uint8Array(arrayBuf);
401
- store8.set(new Uint8Array(input, fp, dataBytes));
402
- block.stuffedData = new Uint32Array(arrayBuf);
403
- fp += dataBytes;
404
- }
405
- }
406
- }
407
- data.eofOffset = fp;
408
- return data;
409
- };
410
- var unstuff = function(src, bitsPerPixel, numPixels, offset, scale, dest, maxValue) {
411
- var bitMask = (1 << bitsPerPixel) - 1;
412
- var i = 0, o;
413
- var bitsLeft = 0;
414
- var n, buffer;
415
- var nmax = Math.ceil((maxValue - offset) / scale);
416
- var numInvalidTailBytes = src.length * 4 - Math.ceil(bitsPerPixel * numPixels / 8);
417
- src[src.length - 1] <<= 8 * numInvalidTailBytes;
418
- for (o = 0; o < numPixels; o++) {
419
- if (bitsLeft === 0) {
420
- buffer = src[i++];
421
- bitsLeft = 32;
422
- }
423
- if (bitsLeft >= bitsPerPixel) {
424
- n = buffer >>> bitsLeft - bitsPerPixel & bitMask;
425
- bitsLeft -= bitsPerPixel;
426
- } else {
427
- var missingBits = bitsPerPixel - bitsLeft;
428
- n = (buffer & bitMask) << missingBits & bitMask;
429
- buffer = src[i++];
430
- bitsLeft = 32 - missingBits;
431
- n += buffer >>> bitsLeft;
432
- }
433
- dest[o] = n < nmax ? offset + n * scale : maxValue;
434
- }
435
- return dest;
436
- };
437
- return CntZImage;
438
- }();
439
- var Lerc2Decode = function() {
440
- "use strict";
441
- var BitStuffer = {
442
- //methods ending with 2 are for the new byte order used by Lerc2.3 and above.
443
- //originalUnstuff is used to unpack Huffman code table. code is duplicated to unstuffx for performance reasons.
444
- unstuff: function(src, dest, bitsPerPixel, numPixels, lutArr, offset, scale, maxValue) {
445
- var bitMask = (1 << bitsPerPixel) - 1;
446
- var i = 0, o;
447
- var bitsLeft = 0;
448
- var n, buffer, missingBits, nmax;
449
- var numInvalidTailBytes = src.length * 4 - Math.ceil(bitsPerPixel * numPixels / 8);
450
- src[src.length - 1] <<= 8 * numInvalidTailBytes;
451
- if (lutArr) {
452
- for (o = 0; o < numPixels; o++) {
453
- if (bitsLeft === 0) {
454
- buffer = src[i++];
455
- bitsLeft = 32;
456
- }
457
- if (bitsLeft >= bitsPerPixel) {
458
- n = buffer >>> bitsLeft - bitsPerPixel & bitMask;
459
- bitsLeft -= bitsPerPixel;
460
- } else {
461
- missingBits = bitsPerPixel - bitsLeft;
462
- n = (buffer & bitMask) << missingBits & bitMask;
463
- buffer = src[i++];
464
- bitsLeft = 32 - missingBits;
465
- n += buffer >>> bitsLeft;
466
- }
467
- dest[o] = lutArr[n];
468
- }
469
- } else {
470
- nmax = Math.ceil((maxValue - offset) / scale);
471
- for (o = 0; o < numPixels; o++) {
472
- if (bitsLeft === 0) {
473
- buffer = src[i++];
474
- bitsLeft = 32;
475
- }
476
- if (bitsLeft >= bitsPerPixel) {
477
- n = buffer >>> bitsLeft - bitsPerPixel & bitMask;
478
- bitsLeft -= bitsPerPixel;
479
- } else {
480
- missingBits = bitsPerPixel - bitsLeft;
481
- n = (buffer & bitMask) << missingBits & bitMask;
482
- buffer = src[i++];
483
- bitsLeft = 32 - missingBits;
484
- n += buffer >>> bitsLeft;
485
- }
486
- dest[o] = n < nmax ? offset + n * scale : maxValue;
487
- }
488
- }
489
- },
490
- unstuffLUT: 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;
493
- var buffer;
494
- var dest = [];
495
- var numInvalidTailBytes = src.length * 4 - Math.ceil(bitsPerPixel * numPixels / 8);
496
- src[src.length - 1] <<= 8 * numInvalidTailBytes;
497
- var nmax = Math.ceil((maxValue - offset) / scale);
498
- for (o = 0; o < numPixels; o++) {
499
- if (bitsLeft === 0) {
500
- buffer = src[i++];
501
- bitsLeft = 32;
502
- }
503
- if (bitsLeft >= bitsPerPixel) {
504
- n = buffer >>> bitsLeft - bitsPerPixel & bitMask;
505
- bitsLeft -= bitsPerPixel;
506
- } else {
507
- missingBits = bitsPerPixel - bitsLeft;
508
- n = (buffer & bitMask) << missingBits & bitMask;
509
- buffer = src[i++];
510
- bitsLeft = 32 - missingBits;
511
- n += buffer >>> bitsLeft;
512
- }
513
- dest[o] = n < nmax ? offset + n * scale : maxValue;
514
- }
515
- dest.unshift(offset);
516
- return dest;
517
- },
518
- unstuff2: function(src, dest, bitsPerPixel, numPixels, lutArr, offset, scale, maxValue) {
519
- var bitMask = (1 << bitsPerPixel) - 1;
520
- var i = 0, o;
521
- var bitsLeft = 0, bitPos = 0;
522
- var n, buffer, missingBits;
523
- if (lutArr) {
524
- for (o = 0; o < numPixels; o++) {
525
- if (bitsLeft === 0) {
526
- buffer = src[i++];
527
- bitsLeft = 32;
528
- bitPos = 0;
529
- }
530
- if (bitsLeft >= bitsPerPixel) {
531
- n = buffer >>> bitPos & bitMask;
532
- bitsLeft -= bitsPerPixel;
533
- bitPos += bitsPerPixel;
534
- } else {
535
- missingBits = bitsPerPixel - bitsLeft;
536
- n = buffer >>> bitPos & bitMask;
537
- buffer = src[i++];
538
- bitsLeft = 32 - missingBits;
539
- n |= (buffer & (1 << missingBits) - 1) << bitsPerPixel - missingBits;
540
- bitPos = missingBits;
541
- }
542
- dest[o] = lutArr[n];
543
- }
544
- } else {
545
- var nmax = Math.ceil((maxValue - offset) / scale);
546
- for (o = 0; o < numPixels; o++) {
547
- if (bitsLeft === 0) {
548
- buffer = src[i++];
549
- bitsLeft = 32;
550
- bitPos = 0;
551
- }
552
- if (bitsLeft >= bitsPerPixel) {
553
- n = buffer >>> bitPos & bitMask;
554
- bitsLeft -= bitsPerPixel;
555
- bitPos += bitsPerPixel;
556
- } else {
557
- missingBits = bitsPerPixel - bitsLeft;
558
- n = buffer >>> bitPos & bitMask;
559
- buffer = src[i++];
560
- bitsLeft = 32 - missingBits;
561
- n |= (buffer & (1 << missingBits) - 1) << bitsPerPixel - missingBits;
562
- bitPos = missingBits;
563
- }
564
- dest[o] = n < nmax ? offset + n * scale : maxValue;
565
- }
566
- }
567
- return dest;
568
- },
569
- unstuffLUT2: function(src, bitsPerPixel, numPixels, offset, scale, maxValue) {
570
- var bitMask = (1 << bitsPerPixel) - 1;
571
- var i = 0, o = 0, missingBits = 0, bitsLeft = 0, n = 0, bitPos = 0;
572
- var buffer;
573
- var dest = [];
574
- var nmax = Math.ceil((maxValue - offset) / scale);
575
- for (o = 0; o < numPixels; o++) {
576
- if (bitsLeft === 0) {
577
- buffer = src[i++];
578
- bitsLeft = 32;
579
- bitPos = 0;
580
- }
581
- if (bitsLeft >= bitsPerPixel) {
582
- n = buffer >>> bitPos & bitMask;
583
- bitsLeft -= bitsPerPixel;
584
- bitPos += bitsPerPixel;
585
- } else {
586
- missingBits = bitsPerPixel - bitsLeft;
587
- n = buffer >>> bitPos & bitMask;
588
- buffer = src[i++];
589
- bitsLeft = 32 - missingBits;
590
- n |= (buffer & (1 << missingBits) - 1) << bitsPerPixel - missingBits;
591
- bitPos = missingBits;
592
- }
593
- dest[o] = n < nmax ? offset + n * scale : maxValue;
594
- }
595
- dest.unshift(offset);
596
- return dest;
597
- },
598
- originalUnstuff: function(src, dest, bitsPerPixel, numPixels) {
599
- var bitMask = (1 << bitsPerPixel) - 1;
600
- var i = 0, o;
601
- var bitsLeft = 0;
602
- var n, buffer, missingBits;
603
- var numInvalidTailBytes = src.length * 4 - Math.ceil(bitsPerPixel * numPixels / 8);
604
- src[src.length - 1] <<= 8 * numInvalidTailBytes;
605
- for (o = 0; o < numPixels; o++) {
606
- if (bitsLeft === 0) {
607
- buffer = src[i++];
608
- bitsLeft = 32;
609
- }
610
- if (bitsLeft >= bitsPerPixel) {
611
- n = buffer >>> bitsLeft - bitsPerPixel & bitMask;
612
- bitsLeft -= bitsPerPixel;
613
- } else {
614
- missingBits = bitsPerPixel - bitsLeft;
615
- n = (buffer & bitMask) << missingBits & bitMask;
616
- buffer = src[i++];
617
- bitsLeft = 32 - missingBits;
618
- n += buffer >>> bitsLeft;
619
- }
620
- dest[o] = n;
621
- }
622
- return dest;
623
- },
624
- originalUnstuff2: function(src, dest, bitsPerPixel, numPixels) {
625
- var bitMask = (1 << bitsPerPixel) - 1;
626
- var i = 0, o;
627
- var bitsLeft = 0, bitPos = 0;
628
- var n, buffer, missingBits;
629
- for (o = 0; o < numPixels; o++) {
630
- if (bitsLeft === 0) {
631
- buffer = src[i++];
632
- bitsLeft = 32;
633
- bitPos = 0;
634
- }
635
- if (bitsLeft >= bitsPerPixel) {
636
- n = buffer >>> bitPos & bitMask;
637
- bitsLeft -= bitsPerPixel;
638
- bitPos += bitsPerPixel;
639
- } else {
640
- missingBits = bitsPerPixel - bitsLeft;
641
- n = buffer >>> bitPos & bitMask;
642
- buffer = src[i++];
643
- bitsLeft = 32 - missingBits;
644
- n |= (buffer & (1 << missingBits) - 1) << bitsPerPixel - missingBits;
645
- bitPos = missingBits;
646
- }
647
- dest[o] = n;
648
- }
649
- return dest;
650
- }
651
- };
652
- var Lerc2Helpers = {
653
- HUFFMAN_LUT_BITS_MAX: 12,
654
- //use 2^12 lut, treat it like constant
655
- computeChecksumFletcher32: function(input) {
656
- var sum1 = 65535, sum2 = 65535;
657
- var len = input.length;
658
- var words = Math.floor(len / 2);
659
- var i = 0;
660
- while (words) {
661
- var tlen = words >= 359 ? 359 : words;
662
- words -= tlen;
663
- do {
664
- sum1 += input[i++] << 8;
665
- sum2 += sum1 += input[i++];
666
- } while (--tlen);
667
- sum1 = (sum1 & 65535) + (sum1 >>> 16);
668
- sum2 = (sum2 & 65535) + (sum2 >>> 16);
669
- }
670
- if (len & 1) {
671
- sum2 += sum1 += input[i] << 8;
672
- }
673
- sum1 = (sum1 & 65535) + (sum1 >>> 16);
674
- sum2 = (sum2 & 65535) + (sum2 >>> 16);
675
- return (sum2 << 16 | sum1) >>> 0;
676
- },
677
- readHeaderInfo: function(input, data) {
678
- var ptr = data.ptr;
679
- var fileIdView = new Uint8Array(input, ptr, 6);
680
- var headerInfo = {};
681
- headerInfo.fileIdentifierString = String.fromCharCode.apply(null, fileIdView);
682
- if (headerInfo.fileIdentifierString.lastIndexOf("Lerc2", 0) !== 0) {
683
- throw "Unexpected file identifier string (expect Lerc2 ): " + headerInfo.fileIdentifierString;
684
- }
685
- ptr += 6;
686
- var view = new DataView(input, ptr, 8);
687
- var fileVersion = view.getInt32(0, true);
688
- headerInfo.fileVersion = fileVersion;
689
- ptr += 4;
690
- if (fileVersion >= 3) {
691
- headerInfo.checksum = view.getUint32(4, true);
692
- ptr += 4;
693
- }
694
- view = new DataView(input, ptr, 12);
695
- headerInfo.height = view.getUint32(0, true);
696
- headerInfo.width = view.getUint32(4, true);
697
- ptr += 8;
698
- if (fileVersion >= 4) {
699
- headerInfo.numDims = view.getUint32(8, true);
700
- ptr += 4;
701
- } else {
702
- headerInfo.numDims = 1;
703
- }
704
- view = new DataView(input, ptr, 40);
705
- headerInfo.numValidPixel = view.getUint32(0, true);
706
- headerInfo.microBlockSize = view.getInt32(4, true);
707
- headerInfo.blobSize = view.getInt32(8, true);
708
- headerInfo.imageType = view.getInt32(12, true);
709
- headerInfo.maxZError = view.getFloat64(16, true);
710
- headerInfo.zMin = view.getFloat64(24, true);
711
- headerInfo.zMax = view.getFloat64(32, true);
712
- ptr += 40;
713
- data.headerInfo = headerInfo;
714
- data.ptr = ptr;
715
- var checksum, keyLength;
716
- if (fileVersion >= 3) {
717
- keyLength = fileVersion >= 4 ? 52 : 48;
718
- checksum = this.computeChecksumFletcher32(new Uint8Array(input, ptr - keyLength, headerInfo.blobSize - 14));
719
- if (checksum !== headerInfo.checksum) {
720
- throw "Checksum failed.";
721
- }
722
- }
723
- return true;
724
- },
725
- checkMinMaxRanges: function(input, data) {
726
- var headerInfo = data.headerInfo;
727
- var OutPixelTypeArray = this.getDataTypeArray(headerInfo.imageType);
728
- var rangeBytes = headerInfo.numDims * this.getDataTypeSize(headerInfo.imageType);
729
- var minValues = this.readSubArray(input, data.ptr, OutPixelTypeArray, rangeBytes);
730
- var maxValues = this.readSubArray(input, data.ptr + rangeBytes, OutPixelTypeArray, rangeBytes);
731
- data.ptr += 2 * rangeBytes;
732
- var i, equal = true;
733
- for (i = 0; i < headerInfo.numDims; i++) {
734
- if (minValues[i] !== maxValues[i]) {
735
- equal = false;
736
- break;
737
- }
738
- }
739
- headerInfo.minValues = minValues;
740
- headerInfo.maxValues = maxValues;
741
- return equal;
742
- },
743
- readSubArray: function(input, ptr, OutPixelTypeArray, numBytes) {
744
- var rawData;
745
- if (OutPixelTypeArray === Uint8Array) {
746
- rawData = new Uint8Array(input, ptr, numBytes);
747
- } else {
748
- var arrayBuf = new ArrayBuffer(numBytes);
749
- var store8 = new Uint8Array(arrayBuf);
750
- store8.set(new Uint8Array(input, ptr, numBytes));
751
- rawData = new OutPixelTypeArray(arrayBuf);
752
- }
753
- return rawData;
754
- },
755
- readMask: function(input, data) {
756
- var ptr = data.ptr;
757
- var headerInfo = data.headerInfo;
758
- var numPixels = headerInfo.width * headerInfo.height;
759
- var numValidPixel = headerInfo.numValidPixel;
760
- var view = new DataView(input, ptr, 4);
761
- var mask = {};
762
- mask.numBytes = view.getUint32(0, true);
763
- ptr += 4;
764
- if ((0 === numValidPixel || numPixels === numValidPixel) && 0 !== mask.numBytes) {
765
- throw "invalid mask";
766
- }
767
- var bitset, resultMask;
768
- if (numValidPixel === 0) {
769
- bitset = new Uint8Array(Math.ceil(numPixels / 8));
770
- mask.bitset = bitset;
771
- resultMask = new Uint8Array(numPixels);
772
- data.pixels.resultMask = resultMask;
773
- ptr += mask.numBytes;
774
- } else if (mask.numBytes > 0) {
775
- bitset = new Uint8Array(Math.ceil(numPixels / 8));
776
- view = new DataView(input, ptr, mask.numBytes);
777
- var cnt = view.getInt16(0, true);
778
- var ip = 2, op = 0, val = 0;
779
- do {
780
- if (cnt > 0) {
781
- while (cnt--) {
782
- bitset[op++] = view.getUint8(ip++);
783
- }
784
- } else {
785
- val = view.getUint8(ip++);
786
- cnt = -cnt;
787
- while (cnt--) {
788
- bitset[op++] = val;
789
- }
790
- }
791
- cnt = view.getInt16(ip, true);
792
- ip += 2;
793
- } while (ip < mask.numBytes);
794
- if (cnt !== -32768 || op < bitset.length) {
795
- throw "Unexpected end of mask RLE encoding";
796
- }
797
- resultMask = new Uint8Array(numPixels);
798
- var mb = 0, k = 0;
799
- for (k = 0; k < numPixels; k++) {
800
- if (k & 7) {
801
- mb = bitset[k >> 3];
802
- mb <<= k & 7;
803
- } else {
804
- mb = bitset[k >> 3];
805
- }
806
- if (mb & 128) {
807
- resultMask[k] = 1;
808
- }
809
- }
810
- data.pixels.resultMask = resultMask;
811
- mask.bitset = bitset;
812
- ptr += mask.numBytes;
813
- }
814
- data.ptr = ptr;
815
- data.mask = mask;
816
- return true;
817
- },
818
- readDataOneSweep: function(input, data, OutPixelTypeArray) {
819
- var ptr = data.ptr;
820
- var headerInfo = data.headerInfo;
821
- var numDims = headerInfo.numDims;
822
- var numPixels = headerInfo.width * headerInfo.height;
823
- var imageType = headerInfo.imageType;
824
- var numBytes = headerInfo.numValidPixel * Lerc2Helpers.getDataTypeSize(imageType) * numDims;
825
- var rawData;
826
- var mask = data.pixels.resultMask;
827
- if (OutPixelTypeArray === Uint8Array) {
828
- rawData = new Uint8Array(input, ptr, numBytes);
829
- } else {
830
- var arrayBuf = new ArrayBuffer(numBytes);
831
- var store8 = new Uint8Array(arrayBuf);
832
- store8.set(new Uint8Array(input, ptr, numBytes));
833
- rawData = new OutPixelTypeArray(arrayBuf);
834
- }
835
- if (rawData.length === numPixels * numDims) {
836
- data.pixels.resultPixels = rawData;
837
- } else {
838
- data.pixels.resultPixels = new OutPixelTypeArray(numPixels * numDims);
839
- var z = 0, k = 0, i = 0, nStart = 0;
840
- if (numDims > 1) {
841
- for (i = 0; i < numDims; i++) {
842
- nStart = i * numPixels;
843
- for (k = 0; k < numPixels; k++) {
844
- if (mask[k]) {
845
- data.pixels.resultPixels[nStart + k] = rawData[z++];
846
- }
847
- }
848
- }
849
- } else {
850
- for (k = 0; k < numPixels; k++) {
851
- if (mask[k]) {
852
- data.pixels.resultPixels[k] = rawData[z++];
853
- }
854
- }
855
- }
856
- }
857
- ptr += numBytes;
858
- data.ptr = ptr;
859
- return true;
860
- },
861
- readHuffmanTree: function(input, data) {
862
- var BITS_MAX = this.HUFFMAN_LUT_BITS_MAX;
863
- var view = new DataView(input, data.ptr, 16);
864
- data.ptr += 16;
865
- var version = view.getInt32(0, true);
866
- if (version < 2) {
867
- throw "unsupported Huffman version";
868
- }
869
- var size = view.getInt32(4, true);
870
- var i0 = view.getInt32(8, true);
871
- var i1 = view.getInt32(12, true);
872
- if (i0 >= i1) {
873
- return false;
874
- }
875
- var blockDataBuffer = new Uint32Array(i1 - i0);
876
- Lerc2Helpers.decodeBits(input, data, blockDataBuffer);
877
- var codeTable = [];
878
- var i, j, k, len;
879
- for (i = i0; i < i1; i++) {
880
- j = i - (i < size ? 0 : size);
881
- codeTable[j] = { first: blockDataBuffer[i - i0], second: null };
882
- }
883
- var dataBytes = input.byteLength - data.ptr;
884
- var dataWords = Math.ceil(dataBytes / 4);
885
- var arrayBuf = new ArrayBuffer(dataWords * 4);
886
- var store8 = new Uint8Array(arrayBuf);
887
- store8.set(new Uint8Array(input, data.ptr, dataBytes));
888
- var stuffedData = new Uint32Array(arrayBuf);
889
- var bitPos = 0, word, srcPtr = 0;
890
- word = stuffedData[0];
891
- for (i = i0; i < i1; i++) {
892
- j = i - (i < size ? 0 : size);
893
- len = codeTable[j].first;
894
- if (len > 0) {
895
- codeTable[j].second = word << bitPos >>> 32 - len;
896
- if (32 - bitPos >= len) {
897
- bitPos += len;
898
- if (bitPos === 32) {
899
- bitPos = 0;
900
- srcPtr++;
901
- word = stuffedData[srcPtr];
902
- }
903
- } else {
904
- bitPos += len - 32;
905
- srcPtr++;
906
- word = stuffedData[srcPtr];
907
- codeTable[j].second |= word >>> 32 - bitPos;
908
- }
909
- }
910
- }
911
- var numBitsLUT = 0, numBitsLUTQick = 0;
912
- var tree = new TreeNode();
913
- for (i = 0; i < codeTable.length; i++) {
914
- if (codeTable[i] !== void 0) {
915
- numBitsLUT = Math.max(numBitsLUT, codeTable[i].first);
916
- }
917
- }
918
- if (numBitsLUT >= BITS_MAX) {
919
- numBitsLUTQick = BITS_MAX;
920
- } else {
921
- numBitsLUTQick = numBitsLUT;
922
- }
923
- if (numBitsLUT >= 30) {
924
- console.log("WARning, large NUM LUT BITS IS " + numBitsLUT);
925
- }
926
- var decodeLut = [], entry, code, numEntries, jj, currentBit, node;
927
- for (i = i0; i < i1; i++) {
928
- j = i - (i < size ? 0 : size);
929
- len = codeTable[j].first;
930
- if (len > 0) {
931
- entry = [len, j];
932
- if (len <= numBitsLUTQick) {
933
- code = codeTable[j].second << numBitsLUTQick - len;
934
- numEntries = 1 << numBitsLUTQick - len;
935
- for (k = 0; k < numEntries; k++) {
936
- decodeLut[code | k] = entry;
937
- }
938
- } else {
939
- code = codeTable[j].second;
940
- node = tree;
941
- for (jj = len - 1; jj >= 0; jj--) {
942
- currentBit = code >>> jj & 1;
943
- if (currentBit) {
944
- if (!node.right) {
945
- node.right = new TreeNode();
946
- }
947
- node = node.right;
948
- } else {
949
- if (!node.left) {
950
- node.left = new TreeNode();
951
- }
952
- node = node.left;
953
- }
954
- if (jj === 0 && !node.val) {
955
- node.val = entry[1];
956
- }
957
- }
958
- }
959
- }
960
- }
961
- return {
962
- decodeLut,
963
- numBitsLUTQick,
964
- numBitsLUT,
965
- tree,
966
- stuffedData,
967
- srcPtr,
968
- bitPos
969
- };
970
- },
971
- readHuffman: function(input, data, OutPixelTypeArray) {
972
- var headerInfo = data.headerInfo;
973
- var numDims = headerInfo.numDims;
974
- var height = data.headerInfo.height;
975
- var width = data.headerInfo.width;
976
- var numPixels = width * height;
977
- var huffmanInfo = this.readHuffmanTree(input, data);
978
- var decodeLut = huffmanInfo.decodeLut;
979
- var tree = huffmanInfo.tree;
980
- var stuffedData = huffmanInfo.stuffedData;
981
- var srcPtr = huffmanInfo.srcPtr;
982
- var bitPos = huffmanInfo.bitPos;
983
- var numBitsLUTQick = huffmanInfo.numBitsLUTQick;
984
- var numBitsLUT = huffmanInfo.numBitsLUT;
985
- var offset = data.headerInfo.imageType === 0 ? 128 : 0;
986
- var node, val, delta, mask = data.pixels.resultMask, valTmp, valTmpQuick, currentBit;
987
- var i, j, k, ii;
988
- var prevVal = 0;
989
- if (bitPos > 0) {
990
- srcPtr++;
991
- bitPos = 0;
992
- }
993
- var word = stuffedData[srcPtr];
994
- var deltaEncode = data.encodeMode === 1;
995
- var resultPixelsAllDim = new OutPixelTypeArray(numPixels * numDims);
996
- var resultPixels = resultPixelsAllDim;
997
- var iDim;
998
- for (iDim = 0; iDim < headerInfo.numDims; iDim++) {
999
- if (numDims > 1) {
1000
- resultPixels = new OutPixelTypeArray(resultPixelsAllDim.buffer, numPixels * iDim, numPixels);
1001
- prevVal = 0;
1002
- }
1003
- if (data.headerInfo.numValidPixel === width * height) {
1004
- for (k = 0, i = 0; i < height; i++) {
1005
- for (j = 0; j < width; j++, k++) {
1006
- val = 0;
1007
- valTmp = word << bitPos >>> 32 - numBitsLUTQick;
1008
- valTmpQuick = valTmp;
1009
- if (32 - bitPos < numBitsLUTQick) {
1010
- valTmp |= stuffedData[srcPtr + 1] >>> 64 - bitPos - numBitsLUTQick;
1011
- valTmpQuick = valTmp;
1012
- }
1013
- if (decodeLut[valTmpQuick]) {
1014
- val = decodeLut[valTmpQuick][1];
1015
- bitPos += decodeLut[valTmpQuick][0];
1016
- } else {
1017
- valTmp = word << bitPos >>> 32 - numBitsLUT;
1018
- valTmpQuick = valTmp;
1019
- if (32 - bitPos < numBitsLUT) {
1020
- valTmp |= stuffedData[srcPtr + 1] >>> 64 - bitPos - numBitsLUT;
1021
- valTmpQuick = valTmp;
1022
- }
1023
- node = tree;
1024
- for (ii = 0; ii < numBitsLUT; ii++) {
1025
- currentBit = valTmp >>> numBitsLUT - ii - 1 & 1;
1026
- node = currentBit ? node.right : node.left;
1027
- if (!(node.left || node.right)) {
1028
- val = node.val;
1029
- bitPos = bitPos + ii + 1;
1030
- break;
1031
- }
1032
- }
1033
- }
1034
- if (bitPos >= 32) {
1035
- bitPos -= 32;
1036
- srcPtr++;
1037
- word = stuffedData[srcPtr];
1038
- }
1039
- delta = val - offset;
1040
- if (deltaEncode) {
1041
- if (j > 0) {
1042
- delta += prevVal;
1043
- } else if (i > 0) {
1044
- delta += resultPixels[k - width];
1045
- } else {
1046
- delta += prevVal;
1047
- }
1048
- delta &= 255;
1049
- resultPixels[k] = delta;
1050
- prevVal = delta;
1051
- } else {
1052
- resultPixels[k] = delta;
1053
- }
1054
- }
1055
- }
1056
- } else {
1057
- for (k = 0, i = 0; i < height; i++) {
1058
- for (j = 0; j < width; j++, k++) {
1059
- if (mask[k]) {
1060
- val = 0;
1061
- valTmp = word << bitPos >>> 32 - numBitsLUTQick;
1062
- valTmpQuick = valTmp;
1063
- if (32 - bitPos < numBitsLUTQick) {
1064
- valTmp |= stuffedData[srcPtr + 1] >>> 64 - bitPos - numBitsLUTQick;
1065
- valTmpQuick = valTmp;
1066
- }
1067
- if (decodeLut[valTmpQuick]) {
1068
- val = decodeLut[valTmpQuick][1];
1069
- bitPos += decodeLut[valTmpQuick][0];
1070
- } else {
1071
- valTmp = word << bitPos >>> 32 - numBitsLUT;
1072
- valTmpQuick = valTmp;
1073
- if (32 - bitPos < numBitsLUT) {
1074
- valTmp |= stuffedData[srcPtr + 1] >>> 64 - bitPos - numBitsLUT;
1075
- valTmpQuick = valTmp;
1076
- }
1077
- node = tree;
1078
- for (ii = 0; ii < numBitsLUT; ii++) {
1079
- currentBit = valTmp >>> numBitsLUT - ii - 1 & 1;
1080
- node = currentBit ? node.right : node.left;
1081
- if (!(node.left || node.right)) {
1082
- val = node.val;
1083
- bitPos = bitPos + ii + 1;
1084
- break;
1085
- }
1086
- }
1087
- }
1088
- if (bitPos >= 32) {
1089
- bitPos -= 32;
1090
- srcPtr++;
1091
- word = stuffedData[srcPtr];
1092
- }
1093
- delta = val - offset;
1094
- if (deltaEncode) {
1095
- if (j > 0 && mask[k - 1]) {
1096
- delta += prevVal;
1097
- } else if (i > 0 && mask[k - width]) {
1098
- delta += resultPixels[k - width];
1099
- } else {
1100
- delta += prevVal;
1101
- }
1102
- delta &= 255;
1103
- resultPixels[k] = delta;
1104
- prevVal = delta;
1105
- } else {
1106
- resultPixels[k] = delta;
1107
- }
1108
- }
1109
- }
1110
- }
1111
- }
1112
- data.ptr = data.ptr + (srcPtr + 1) * 4 + (bitPos > 0 ? 4 : 0);
1113
- }
1114
- data.pixels.resultPixels = resultPixelsAllDim;
1115
- },
1116
- decodeBits: function(input, data, blockDataBuffer, offset, iDim) {
1117
- {
1118
- var headerInfo = data.headerInfo;
1119
- var fileVersion = headerInfo.fileVersion;
1120
- var blockPtr = 0;
1121
- var view = new DataView(input, data.ptr, 5);
1122
- var headerByte = view.getUint8(0);
1123
- blockPtr++;
1124
- var bits67 = headerByte >> 6;
1125
- var n = bits67 === 0 ? 4 : 3 - bits67;
1126
- var doLut = (headerByte & 32) > 0 ? true : false;
1127
- var numBits = headerByte & 31;
1128
- var numElements = 0;
1129
- if (n === 1) {
1130
- numElements = view.getUint8(blockPtr);
1131
- blockPtr++;
1132
- } else if (n === 2) {
1133
- numElements = view.getUint16(blockPtr, true);
1134
- blockPtr += 2;
1135
- } else if (n === 4) {
1136
- numElements = view.getUint32(blockPtr, true);
1137
- blockPtr += 4;
1138
- } else {
1139
- throw "Invalid valid pixel count type";
1140
- }
1141
- var scale = 2 * headerInfo.maxZError;
1142
- var stuffedData, arrayBuf, store8, dataBytes, dataWords;
1143
- var lutArr, lutData, lutBytes, lutBitsPerElement, bitsPerPixel;
1144
- var zMax = headerInfo.numDims > 1 ? headerInfo.maxValues[iDim] : headerInfo.zMax;
1145
- if (doLut) {
1146
- data.counter.lut++;
1147
- lutBytes = view.getUint8(blockPtr);
1148
- lutBitsPerElement = numBits;
1149
- blockPtr++;
1150
- dataBytes = Math.ceil((lutBytes - 1) * numBits / 8);
1151
- dataWords = Math.ceil(dataBytes / 4);
1152
- arrayBuf = new ArrayBuffer(dataWords * 4);
1153
- store8 = new Uint8Array(arrayBuf);
1154
- data.ptr += blockPtr;
1155
- store8.set(new Uint8Array(input, data.ptr, dataBytes));
1156
- lutData = new Uint32Array(arrayBuf);
1157
- data.ptr += dataBytes;
1158
- bitsPerPixel = 0;
1159
- while (lutBytes - 1 >>> bitsPerPixel) {
1160
- bitsPerPixel++;
1161
- }
1162
- dataBytes = Math.ceil(numElements * bitsPerPixel / 8);
1163
- dataWords = Math.ceil(dataBytes / 4);
1164
- arrayBuf = new ArrayBuffer(dataWords * 4);
1165
- store8 = new Uint8Array(arrayBuf);
1166
- store8.set(new Uint8Array(input, data.ptr, dataBytes));
1167
- stuffedData = new Uint32Array(arrayBuf);
1168
- data.ptr += dataBytes;
1169
- if (fileVersion >= 3) {
1170
- lutArr = BitStuffer.unstuffLUT2(lutData, numBits, lutBytes - 1, offset, scale, zMax);
1171
- } else {
1172
- lutArr = BitStuffer.unstuffLUT(lutData, numBits, lutBytes - 1, offset, scale, zMax);
1173
- }
1174
- if (fileVersion >= 3) {
1175
- BitStuffer.unstuff2(stuffedData, blockDataBuffer, bitsPerPixel, numElements, lutArr);
1176
- } else {
1177
- BitStuffer.unstuff(stuffedData, blockDataBuffer, bitsPerPixel, numElements, lutArr);
1178
- }
1179
- } else {
1180
- data.counter.bitstuffer++;
1181
- bitsPerPixel = numBits;
1182
- data.ptr += blockPtr;
1183
- if (bitsPerPixel > 0) {
1184
- dataBytes = Math.ceil(numElements * bitsPerPixel / 8);
1185
- dataWords = Math.ceil(dataBytes / 4);
1186
- arrayBuf = new ArrayBuffer(dataWords * 4);
1187
- store8 = new Uint8Array(arrayBuf);
1188
- store8.set(new Uint8Array(input, data.ptr, dataBytes));
1189
- stuffedData = new Uint32Array(arrayBuf);
1190
- data.ptr += dataBytes;
1191
- if (fileVersion >= 3) {
1192
- if (offset == null) {
1193
- BitStuffer.originalUnstuff2(stuffedData, blockDataBuffer, bitsPerPixel, numElements);
1194
- } else {
1195
- BitStuffer.unstuff2(stuffedData, blockDataBuffer, bitsPerPixel, numElements, false, offset, scale, zMax);
1196
- }
1197
- } else {
1198
- if (offset == null) {
1199
- BitStuffer.originalUnstuff(stuffedData, blockDataBuffer, bitsPerPixel, numElements);
1200
- } else {
1201
- BitStuffer.unstuff(stuffedData, blockDataBuffer, bitsPerPixel, numElements, false, offset, scale, zMax);
1202
- }
1203
- }
1204
- }
1205
- }
1206
- }
1207
- },
1208
- readTiles: function(input, data, OutPixelTypeArray) {
1209
- var headerInfo = data.headerInfo;
1210
- var width = headerInfo.width;
1211
- var height = headerInfo.height;
1212
- var microBlockSize = headerInfo.microBlockSize;
1213
- var imageType = headerInfo.imageType;
1214
- var dataTypeSize = Lerc2Helpers.getDataTypeSize(imageType);
1215
- var numBlocksX = Math.ceil(width / microBlockSize);
1216
- var numBlocksY = Math.ceil(height / microBlockSize);
1217
- data.pixels.numBlocksY = numBlocksY;
1218
- data.pixels.numBlocksX = numBlocksX;
1219
- data.pixels.ptr = 0;
1220
- 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;
1221
- var view, block, arrayBuf, store8, rawData;
1222
- var blockEncoding;
1223
- var blockDataBuffer = new OutPixelTypeArray(microBlockSize * microBlockSize);
1224
- var lastBlockHeight = height % microBlockSize || microBlockSize;
1225
- var lastBlockWidth = width % microBlockSize || microBlockSize;
1226
- var offsetType, offset;
1227
- var numDims = headerInfo.numDims, iDim;
1228
- var mask = data.pixels.resultMask;
1229
- var resultPixels = data.pixels.resultPixels;
1230
- for (blockY = 0; blockY < numBlocksY; blockY++) {
1231
- thisBlockHeight = blockY !== numBlocksY - 1 ? microBlockSize : lastBlockHeight;
1232
- for (blockX = 0; blockX < numBlocksX; blockX++) {
1233
- thisBlockWidth = blockX !== numBlocksX - 1 ? microBlockSize : lastBlockWidth;
1234
- outPtr = blockY * width * microBlockSize + blockX * microBlockSize;
1235
- outStride = width - thisBlockWidth;
1236
- for (iDim = 0; iDim < numDims; iDim++) {
1237
- if (numDims > 1) {
1238
- resultPixels = new OutPixelTypeArray(data.pixels.resultPixels.buffer, width * height * iDim * dataTypeSize, width * height);
1239
- }
1240
- bytesLeft = input.byteLength - data.ptr;
1241
- view = new DataView(input, data.ptr, Math.min(10, bytesLeft));
1242
- block = {};
1243
- blockPtr = 0;
1244
- headerByte = view.getUint8(0);
1245
- blockPtr++;
1246
- bits67 = headerByte >> 6 & 255;
1247
- testCode = headerByte >> 2 & 15;
1248
- if (testCode !== (blockX * microBlockSize >> 3 & 15)) {
1249
- throw "integrity issue";
1250
- }
1251
- blockEncoding = headerByte & 3;
1252
- if (blockEncoding > 3) {
1253
- data.ptr += blockPtr;
1254
- throw "Invalid block encoding (" + blockEncoding + ")";
1255
- } else if (blockEncoding === 2) {
1256
- data.counter.constant++;
1257
- data.ptr += blockPtr;
1258
- continue;
1259
- } else if (blockEncoding === 0) {
1260
- data.counter.uncompressed++;
1261
- data.ptr += blockPtr;
1262
- numBytes = thisBlockHeight * thisBlockWidth * dataTypeSize;
1263
- bytesleft = input.byteLength - data.ptr;
1264
- numBytes = numBytes < bytesleft ? numBytes : bytesleft;
1265
- arrayBuf = new ArrayBuffer(numBytes % dataTypeSize === 0 ? numBytes : numBytes + dataTypeSize - numBytes % dataTypeSize);
1266
- store8 = new Uint8Array(arrayBuf);
1267
- store8.set(new Uint8Array(input, data.ptr, numBytes));
1268
- rawData = new OutPixelTypeArray(arrayBuf);
1269
- z = 0;
1270
- if (mask) {
1271
- for (row = 0; row < thisBlockHeight; row++) {
1272
- for (col = 0; col < thisBlockWidth; col++) {
1273
- if (mask[outPtr]) {
1274
- resultPixels[outPtr] = rawData[z++];
1275
- }
1276
- outPtr++;
1277
- }
1278
- outPtr += outStride;
1279
- }
1280
- } else {
1281
- for (row = 0; row < thisBlockHeight; row++) {
1282
- for (col = 0; col < thisBlockWidth; col++) {
1283
- resultPixels[outPtr++] = rawData[z++];
1284
- }
1285
- outPtr += outStride;
1286
- }
1287
- }
1288
- data.ptr += z * dataTypeSize;
1289
- } else {
1290
- offsetType = Lerc2Helpers.getDataTypeUsed(imageType, bits67);
1291
- offset = Lerc2Helpers.getOnePixel(block, blockPtr, offsetType, view);
1292
- blockPtr += Lerc2Helpers.getDataTypeSize(offsetType);
1293
- if (blockEncoding === 3) {
1294
- data.ptr += blockPtr;
1295
- data.counter.constantoffset++;
1296
- if (mask) {
1297
- for (row = 0; row < thisBlockHeight; row++) {
1298
- for (col = 0; col < thisBlockWidth; col++) {
1299
- if (mask[outPtr]) {
1300
- resultPixels[outPtr] = offset;
1301
- }
1302
- outPtr++;
1303
- }
1304
- outPtr += outStride;
1305
- }
1306
- } else {
1307
- for (row = 0; row < thisBlockHeight; row++) {
1308
- for (col = 0; col < thisBlockWidth; col++) {
1309
- resultPixels[outPtr++] = offset;
1310
- }
1311
- outPtr += outStride;
1312
- }
1313
- }
1314
- } else {
1315
- data.ptr += blockPtr;
1316
- Lerc2Helpers.decodeBits(input, data, blockDataBuffer, offset, iDim);
1317
- blockPtr = 0;
1318
- if (mask) {
1319
- for (row = 0; row < thisBlockHeight; row++) {
1320
- for (col = 0; col < thisBlockWidth; col++) {
1321
- if (mask[outPtr]) {
1322
- resultPixels[outPtr] = blockDataBuffer[blockPtr++];
1323
- }
1324
- outPtr++;
1325
- }
1326
- outPtr += outStride;
1327
- }
1328
- } else {
1329
- for (row = 0; row < thisBlockHeight; row++) {
1330
- for (col = 0; col < thisBlockWidth; col++) {
1331
- resultPixels[outPtr++] = blockDataBuffer[blockPtr++];
1332
- }
1333
- outPtr += outStride;
1334
- }
1335
- }
1336
- }
1337
- }
1338
- }
1339
- }
1340
- }
1341
- },
1342
- /*****************
1343
- * private methods (helper methods)
1344
- *****************/
1345
- formatFileInfo: function(data) {
1346
- return {
1347
- "fileIdentifierString": data.headerInfo.fileIdentifierString,
1348
- "fileVersion": data.headerInfo.fileVersion,
1349
- "imageType": data.headerInfo.imageType,
1350
- "height": data.headerInfo.height,
1351
- "width": data.headerInfo.width,
1352
- "numValidPixel": data.headerInfo.numValidPixel,
1353
- "microBlockSize": data.headerInfo.microBlockSize,
1354
- "blobSize": data.headerInfo.blobSize,
1355
- "maxZError": data.headerInfo.maxZError,
1356
- "pixelType": Lerc2Helpers.getPixelType(data.headerInfo.imageType),
1357
- "eofOffset": data.eofOffset,
1358
- "mask": data.mask ? {
1359
- "numBytes": data.mask.numBytes
1360
- } : null,
1361
- "pixels": {
1362
- "numBlocksX": data.pixels.numBlocksX,
1363
- "numBlocksY": data.pixels.numBlocksY,
1364
- //"numBytes": data.pixels.numBytes,
1365
- "maxValue": data.headerInfo.zMax,
1366
- "minValue": data.headerInfo.zMin,
1367
- "noDataValue": data.noDataValue
1368
- }
1369
- };
1370
- },
1371
- constructConstantSurface: function(data) {
1372
- var val = data.headerInfo.zMax;
1373
- var numDims = data.headerInfo.numDims;
1374
- var numPixels = data.headerInfo.height * data.headerInfo.width;
1375
- var numPixelAllDims = numPixels * numDims;
1376
- var i = 0, k = 0, nStart = 0;
1377
- var mask = data.pixels.resultMask;
1378
- if (mask) {
1379
- if (numDims > 1) {
1380
- for (i = 0; i < numDims; i++) {
1381
- nStart = i * numPixels;
1382
- for (k = 0; k < numPixels; k++) {
1383
- if (mask[k]) {
1384
- data.pixels.resultPixels[nStart + k] = val;
1385
- }
1386
- }
1387
- }
1388
- } else {
1389
- for (k = 0; k < numPixels; k++) {
1390
- if (mask[k]) {
1391
- data.pixels.resultPixels[k] = val;
1392
- }
1393
- }
1394
- }
1395
- } else {
1396
- if (data.pixels.resultPixels.fill) {
1397
- data.pixels.resultPixels.fill(val);
1398
- } else {
1399
- for (k = 0; k < numPixelAllDims; k++) {
1400
- data.pixels.resultPixels[k] = val;
1401
- }
1402
- }
1403
- }
1404
- return;
1405
- },
1406
- getDataTypeArray: function(t) {
1407
- var tp;
1408
- switch (t) {
1409
- case 0:
1410
- tp = Int8Array;
1411
- break;
1412
- case 1:
1413
- tp = Uint8Array;
1414
- break;
1415
- case 2:
1416
- tp = Int16Array;
1417
- break;
1418
- case 3:
1419
- tp = Uint16Array;
1420
- break;
1421
- case 4:
1422
- tp = Int32Array;
1423
- break;
1424
- case 5:
1425
- tp = Uint32Array;
1426
- break;
1427
- case 6:
1428
- tp = Float32Array;
1429
- break;
1430
- case 7:
1431
- tp = Float64Array;
1432
- break;
1433
- default:
1434
- tp = Float32Array;
1435
- }
1436
- return tp;
1437
- },
1438
- getPixelType: function(t) {
1439
- var tp;
1440
- switch (t) {
1441
- case 0:
1442
- tp = "S8";
1443
- break;
1444
- case 1:
1445
- tp = "U8";
1446
- break;
1447
- case 2:
1448
- tp = "S16";
1449
- break;
1450
- case 3:
1451
- tp = "U16";
1452
- break;
1453
- case 4:
1454
- tp = "S32";
1455
- break;
1456
- case 5:
1457
- tp = "U32";
1458
- break;
1459
- case 6:
1460
- tp = "F32";
1461
- break;
1462
- case 7:
1463
- tp = "F64";
1464
- break;
1465
- default:
1466
- tp = "F32";
1467
- }
1468
- return tp;
1469
- },
1470
- isValidPixelValue: function(t, val) {
1471
- if (val == null) {
1472
- return false;
1473
- }
1474
- var isValid;
1475
- switch (t) {
1476
- case 0:
1477
- isValid = val >= -128 && val <= 127;
1478
- break;
1479
- case 1:
1480
- isValid = val >= 0 && val <= 255;
1481
- break;
1482
- case 2:
1483
- isValid = val >= -32768 && val <= 32767;
1484
- break;
1485
- case 3:
1486
- isValid = val >= 0 && val <= 65536;
1487
- break;
1488
- case 4:
1489
- isValid = val >= -2147483648 && val <= 2147483647;
1490
- break;
1491
- case 5:
1492
- isValid = val >= 0 && val <= 4294967296;
1493
- break;
1494
- case 6:
1495
- isValid = val >= -34027999387901484e22 && val <= 34027999387901484e22;
1496
- break;
1497
- case 7:
1498
- isValid = val >= 5e-324 && val <= 17976931348623157e292;
1499
- break;
1500
- default:
1501
- isValid = false;
1502
- }
1503
- return isValid;
1504
- },
1505
- getDataTypeSize: function(t) {
1506
- var s = 0;
1507
- switch (t) {
1508
- case 0:
1509
- //ubyte
1510
- case 1:
1511
- s = 1;
1512
- break;
1513
- case 2:
1514
- //short
1515
- case 3:
1516
- s = 2;
1517
- break;
1518
- case 4:
1519
- case 5:
1520
- case 6:
1521
- s = 4;
1522
- break;
1523
- case 7:
1524
- s = 8;
1525
- break;
1526
- default:
1527
- s = t;
1528
- }
1529
- return s;
1530
- },
1531
- getDataTypeUsed: function(dt, tc) {
1532
- var t = dt;
1533
- switch (dt) {
1534
- case 2:
1535
- //short
1536
- case 4:
1537
- t = dt - tc;
1538
- break;
1539
- case 3:
1540
- //ushort
1541
- case 5:
1542
- t = dt - 2 * tc;
1543
- break;
1544
- case 6:
1545
- if (0 === tc) {
1546
- t = dt;
1547
- } else if (1 === tc) {
1548
- t = 2;
1549
- } else {
1550
- t = 1;
1551
- }
1552
- break;
1553
- case 7:
1554
- if (0 === tc) {
1555
- t = dt;
1556
- } else {
1557
- t = dt - 2 * tc + 1;
1558
- }
1559
- break;
1560
- default:
1561
- t = dt;
1562
- break;
1563
- }
1564
- return t;
1565
- },
1566
- getOnePixel: function(block, blockPtr, offsetType, view) {
1567
- var temp = 0;
1568
- switch (offsetType) {
1569
- case 0:
1570
- temp = view.getInt8(blockPtr);
1571
- break;
1572
- case 1:
1573
- temp = view.getUint8(blockPtr);
1574
- break;
1575
- case 2:
1576
- temp = view.getInt16(blockPtr, true);
1577
- break;
1578
- case 3:
1579
- temp = view.getUint16(blockPtr, true);
1580
- break;
1581
- case 4:
1582
- temp = view.getInt32(blockPtr, true);
1583
- break;
1584
- case 5:
1585
- temp = view.getUInt32(blockPtr, true);
1586
- break;
1587
- case 6:
1588
- temp = view.getFloat32(blockPtr, true);
1589
- break;
1590
- case 7:
1591
- temp = view.getFloat64(blockPtr, true);
1592
- break;
1593
- default:
1594
- throw "the decoder does not understand this pixel type";
1595
- }
1596
- return temp;
1597
- }
1598
- };
1599
- var TreeNode = function(val, left, right) {
1600
- this.val = val;
1601
- this.left = left;
1602
- this.right = right;
1603
- };
1604
- var Lerc2Decode2 = {
1605
- /*
1606
- * ********removed options compared to LERC1. We can bring some of them back if needed.
1607
- * removed pixel type. LERC2 is typed and doesn't require user to give pixel type
1608
- * changed encodedMaskData to maskData. LERC2 's js version make it faster to use maskData directly.
1609
- * removed returnMask. mask is used by LERC2 internally and is cost free. In case of user input mask, it's returned as well and has neglible cost.
1610
- * removed nodatavalue. Because LERC2 pixels are typed, nodatavalue will sacrify a useful value for many types (8bit, 16bit) etc,
1611
- * user has to be knowledgable enough about raster and their data to avoid usability issues. so nodata value is simply removed now.
1612
- * We can add it back later if their's a clear requirement.
1613
- * removed encodedMask. This option was not implemented in LercDecode. It can be done after decoding (less efficient)
1614
- * removed computeUsedBitDepths.
1615
- *
1616
- *
1617
- * response changes compared to LERC1
1618
- * 1. encodedMaskData is not available
1619
- * 2. noDataValue is optional (returns only if user's noDataValue is with in the valid data type range)
1620
- * 3. maskData is always available
1621
- */
1622
- /*****************
1623
- * public properties
1624
- ******************/
1625
- //HUFFMAN_LUT_BITS_MAX: 12, //use 2^12 lut, not configurable
1626
- /*****************
1627
- * public methods
1628
- *****************/
1629
- /**
1630
- * Decode a LERC2 byte stream and return an object containing the pixel data and optional metadata.
1631
- *
1632
- * @param {ArrayBuffer} input The LERC input byte stream
1633
- * @param {object} [options] options Decoding options
1634
- * @param {number} [options.inputOffset] The number of bytes to skip in the input byte stream. A valid LERC file is expected at that position
1635
- * @param {boolean} [options.returnFileInfo] If true, the return value will have a fileInfo property that contains metadata obtained from the LERC headers and the decoding process
1636
- */
1637
- decode: function(input, options) {
1638
- options = options || {};
1639
- var noDataValue = options.noDataValue;
1640
- var i = 0, data = {};
1641
- data.ptr = options.inputOffset || 0;
1642
- data.pixels = {};
1643
- if (!Lerc2Helpers.readHeaderInfo(input, data)) {
1644
- return;
1645
- }
1646
- var headerInfo = data.headerInfo;
1647
- var fileVersion = headerInfo.fileVersion;
1648
- var OutPixelTypeArray = Lerc2Helpers.getDataTypeArray(headerInfo.imageType);
1649
- Lerc2Helpers.readMask(input, data);
1650
- if (headerInfo.numValidPixel !== headerInfo.width * headerInfo.height && !data.pixels.resultMask) {
1651
- data.pixels.resultMask = options.maskData;
1652
- }
1653
- var numPixels = headerInfo.width * headerInfo.height;
1654
- data.pixels.resultPixels = new OutPixelTypeArray(numPixels * headerInfo.numDims);
1655
- data.counter = {
1656
- onesweep: 0,
1657
- uncompressed: 0,
1658
- lut: 0,
1659
- bitstuffer: 0,
1660
- constant: 0,
1661
- constantoffset: 0
1662
- };
1663
- if (headerInfo.numValidPixel !== 0) {
1664
- if (headerInfo.zMax === headerInfo.zMin) {
1665
- Lerc2Helpers.constructConstantSurface(data);
1666
- } else if (fileVersion >= 4 && Lerc2Helpers.checkMinMaxRanges(input, data)) {
1667
- Lerc2Helpers.constructConstantSurface(data);
1668
- } else {
1669
- var view = new DataView(input, data.ptr, 2);
1670
- var bReadDataOneSweep = view.getUint8(0);
1671
- data.ptr++;
1672
- if (bReadDataOneSweep) {
1673
- Lerc2Helpers.readDataOneSweep(input, data, OutPixelTypeArray);
1674
- } else {
1675
- if (fileVersion > 1 && headerInfo.imageType <= 1 && Math.abs(headerInfo.maxZError - 0.5) < 1e-5) {
1676
- var flagHuffman = view.getUint8(1);
1677
- data.ptr++;
1678
- data.encodeMode = flagHuffman;
1679
- if (flagHuffman > 2 || fileVersion < 4 && flagHuffman > 1) {
1680
- throw "Invalid Huffman flag " + flagHuffman;
1681
- }
1682
- if (flagHuffman) {
1683
- Lerc2Helpers.readHuffman(input, data, OutPixelTypeArray);
1684
- } else {
1685
- Lerc2Helpers.readTiles(input, data, OutPixelTypeArray);
1686
- }
1687
- } else {
1688
- Lerc2Helpers.readTiles(input, data, OutPixelTypeArray);
1689
- }
1690
- }
1691
- }
1692
- }
1693
- data.eofOffset = data.ptr;
1694
- var diff;
1695
- if (options.inputOffset) {
1696
- diff = data.headerInfo.blobSize + options.inputOffset - data.ptr;
1697
- if (Math.abs(diff) >= 1) {
1698
- data.eofOffset = options.inputOffset + data.headerInfo.blobSize;
1699
- }
1700
- } else {
1701
- diff = data.headerInfo.blobSize - data.ptr;
1702
- if (Math.abs(diff) >= 1) {
1703
- data.eofOffset = data.headerInfo.blobSize;
1704
- }
1705
- }
1706
- var result = {
1707
- width: headerInfo.width,
1708
- height: headerInfo.height,
1709
- pixelData: data.pixels.resultPixels,
1710
- minValue: headerInfo.zMin,
1711
- maxValue: headerInfo.zMax,
1712
- validPixelCount: headerInfo.numValidPixel,
1713
- dimCount: headerInfo.numDims,
1714
- dimStats: {
1715
- minValues: headerInfo.minValues,
1716
- maxValues: headerInfo.maxValues
1717
- },
1718
- maskData: data.pixels.resultMask
1719
- //noDataValue: noDataValue
1720
- };
1721
- if (data.pixels.resultMask && Lerc2Helpers.isValidPixelValue(headerInfo.imageType, noDataValue)) {
1722
- var mask = data.pixels.resultMask;
1723
- for (i = 0; i < numPixels; i++) {
1724
- if (!mask[i]) {
1725
- result.pixelData[i] = noDataValue;
1726
- }
1727
- }
1728
- result.noDataValue = noDataValue;
1729
- }
1730
- data.noDataValue = noDataValue;
1731
- if (options.returnFileInfo) {
1732
- result.fileInfo = Lerc2Helpers.formatFileInfo(data);
1733
- }
1734
- return result;
1735
- },
1736
- getBandCount: function(input) {
1737
- var count = 0;
1738
- var i = 0;
1739
- var temp = {};
1740
- temp.ptr = 0;
1741
- temp.pixels = {};
1742
- while (i < input.byteLength - 58) {
1743
- Lerc2Helpers.readHeaderInfo(input, temp);
1744
- i += temp.headerInfo.blobSize;
1745
- count++;
1746
- temp.ptr = i;
1747
- }
1748
- return count;
1749
- }
1750
- };
1751
- return Lerc2Decode2;
1752
- }();
1753
- var isPlatformLittleEndian = function() {
1754
- var a = new ArrayBuffer(4);
1755
- var b = new Uint8Array(a);
1756
- var c = new Uint32Array(a);
1757
- c[0] = 1;
1758
- return b[0] === 1;
1759
- }();
1760
- var Lerc2 = {
1761
- /************wrapper**********************************************/
1762
- /**
1763
- * A wrapper for decoding both LERC1 and LERC2 byte streams capable of handling multiband pixel blocks for various pixel types.
1764
- *
1765
- * @alias module:Lerc
1766
- * @param {ArrayBuffer} input The LERC input byte stream
1767
- * @param {object} [options] The decoding options below are optional.
1768
- * @param {number} [options.inputOffset] The number of bytes to skip in the input byte stream. A valid Lerc file is expected at that position.
1769
- * @param {string} [options.pixelType] (LERC1 only) Default value is F32. Valid pixel types for input are U8/S8/S16/U16/S32/U32/F32.
1770
- * @param {number} [options.noDataValue] (LERC1 only). It is recommended to use the returned mask instead of setting this value.
1771
- * @returns {{width, height, pixels, pixelType, mask, statistics}}
1772
- * @property {number} width Width of decoded image.
1773
- * @property {number} height Height of decoded image.
1774
- * @property {array} pixels [band1, band2, …] Each band is a typed array of width*height.
1775
- * @property {string} pixelType The type of pixels represented in the output.
1776
- * @property {mask} mask Typed array with a size of width*height, or null if all pixels are valid.
1777
- * @property {array} statistics [statistics_band1, statistics_band2, …] Each element is a statistics object representing min and max values
1778
- **/
1779
- decode: function(encodedData, options) {
1780
- if (!isPlatformLittleEndian) {
1781
- throw "Big endian system is not supported.";
1782
- }
1783
- options = options || {};
1784
- var inputOffset = options.inputOffset || 0;
1785
- var fileIdView = new Uint8Array(encodedData, inputOffset, 10);
1786
- var fileIdentifierString = String.fromCharCode.apply(null, fileIdView);
1787
- var lerc, majorVersion;
1788
- if (fileIdentifierString.trim() === "CntZImage") {
1789
- lerc = LercDecode;
1790
- majorVersion = 1;
1791
- } else if (fileIdentifierString.substring(0, 5) === "Lerc2") {
1792
- lerc = Lerc2Decode;
1793
- majorVersion = 2;
1794
- } else {
1795
- throw "Unexpected file identifier string: " + fileIdentifierString;
1796
- }
1797
- var iPlane = 0, eof = encodedData.byteLength - 10, encodedMaskData, bandMasks = [], bandMask, maskData;
1798
- var decodedPixelBlock = {
1799
- width: 0,
1800
- height: 0,
1801
- pixels: [],
1802
- pixelType: options.pixelType,
1803
- mask: null,
1804
- statistics: []
1805
- };
1806
- while (inputOffset < eof) {
1807
- var result = lerc.decode(encodedData, {
1808
- inputOffset,
1809
- //for both lerc1 and lerc2
1810
- encodedMaskData,
1811
- //lerc1 only
1812
- maskData,
1813
- //lerc2 only
1814
- returnMask: iPlane === 0 ? true : false,
1815
- //lerc1 only
1816
- returnEncodedMask: iPlane === 0 ? true : false,
1817
- //lerc1 only
1818
- returnFileInfo: true,
1819
- //for both lerc1 and lerc2
1820
- pixelType: options.pixelType || null,
1821
- //lerc1 only
1822
- noDataValue: options.noDataValue || null
1823
- //lerc1 only
1824
- });
1825
- inputOffset = result.fileInfo.eofOffset;
1826
- if (iPlane === 0) {
1827
- encodedMaskData = result.encodedMaskData;
1828
- maskData = result.maskData;
1829
- decodedPixelBlock.width = result.width;
1830
- decodedPixelBlock.height = result.height;
1831
- decodedPixelBlock.dimCount = result.dimCount || 1;
1832
- decodedPixelBlock.pixelType = result.pixelType || result.fileInfo.pixelType;
1833
- decodedPixelBlock.mask = result.maskData;
1834
- }
1835
- if (majorVersion > 1 && result.fileInfo.mask && result.fileInfo.mask.numBytes > 0) {
1836
- bandMasks.push(result.maskData);
1837
- }
1838
- iPlane++;
1839
- decodedPixelBlock.pixels.push(result.pixelData);
1840
- decodedPixelBlock.statistics.push({
1841
- minValue: result.minValue,
1842
- maxValue: result.maxValue,
1843
- noDataValue: result.noDataValue,
1844
- dimStats: result.dimStats
1845
- });
1846
- }
1847
- var i, j, numPixels;
1848
- if (majorVersion > 1 && bandMasks.length > 1) {
1849
- numPixels = decodedPixelBlock.width * decodedPixelBlock.height;
1850
- decodedPixelBlock.bandMasks = bandMasks;
1851
- maskData = new Uint8Array(numPixels);
1852
- maskData.set(bandMasks[0]);
1853
- for (i = 1; i < bandMasks.length; i++) {
1854
- bandMask = bandMasks[i];
1855
- for (j = 0; j < numPixels; j++) {
1856
- maskData[j] = maskData[j] & bandMask[j];
1857
- }
1858
- }
1859
- decodedPixelBlock.maskData = maskData;
1860
- }
1861
- return decodedPixelBlock;
1862
- }
1863
- };
1864
- if (typeof define === "function" && define.amd) {
1865
- define([], function() {
1866
- return Lerc2;
1867
- });
1868
- } else if (typeof module !== "undefined" && module.exports) {
1869
- module.exports = Lerc2;
1870
- } else {
1871
- this.Lerc = Lerc2;
1872
- }
1873
- })();
1874
- }
1875
- });
1876
-
1877
- // packages/engine/Source/Core/HeightmapEncoding.js
1878
- var HeightmapEncoding = {
1879
- /**
1880
- * No encoding
1881
- *
1882
- * @type {number}
1883
- * @constant
1884
- */
1885
- NONE: 0,
1886
- /**
1887
- * LERC encoding
1888
- *
1889
- * @type {number}
1890
- * @constant
1891
- *
1892
- * @see {@link https://github.com/Esri/lerc|The LERC specification}
1893
- */
1894
- LERC: 1
1895
- };
1896
- var HeightmapEncoding_default = Object.freeze(HeightmapEncoding);
1897
-
1898
- // packages/engine/Source/Core/HeightmapTessellator.js
1899
- var HeightmapTessellator = {};
1900
- HeightmapTessellator.DEFAULT_STRUCTURE = Object.freeze({
1901
- heightScale: 1,
1902
- heightOffset: 0,
1903
- elementsPerHeight: 1,
1904
- stride: 1,
1905
- elementMultiplier: 256,
1906
- isBigEndian: false
1907
- });
1908
- var cartesian3Scratch = new Cartesian3_default();
1909
- var matrix4Scratch = new Matrix4_default();
1910
- var minimumScratch = new Cartesian3_default();
1911
- var maximumScratch = new Cartesian3_default();
1912
- HeightmapTessellator.computeVertices = function(options) {
1913
- if (!defined_default(options) || !defined_default(options.heightmap)) {
1914
- throw new DeveloperError_default("options.heightmap is required.");
1915
- }
1916
- if (!defined_default(options.width) || !defined_default(options.height)) {
1917
- throw new DeveloperError_default("options.width and options.height are required.");
1918
- }
1919
- if (!defined_default(options.nativeRectangle)) {
1920
- throw new DeveloperError_default("options.nativeRectangle is required.");
1921
- }
1922
- if (!defined_default(options.skirtHeight)) {
1923
- throw new DeveloperError_default("options.skirtHeight is required.");
1924
- }
1925
- const cos = Math.cos;
1926
- const sin = Math.sin;
1927
- const sqrt = Math.sqrt;
1928
- const atan = Math.atan;
1929
- const exp = Math.exp;
1930
- const piOverTwo = Math_default.PI_OVER_TWO;
1931
- const toRadians = Math_default.toRadians;
1932
- const heightmap = options.heightmap;
1933
- const width = options.width;
1934
- const height = options.height;
1935
- const skirtHeight = options.skirtHeight;
1936
- const hasSkirts = skirtHeight > 0;
1937
- const isGeographic = defaultValue_default(options.isGeographic, true);
1938
- const ellipsoid = defaultValue_default(options.ellipsoid, Ellipsoid_default.default);
1939
- const oneOverGlobeSemimajorAxis = 1 / ellipsoid.maximumRadius;
1940
- const nativeRectangle = Rectangle_default.clone(options.nativeRectangle);
1941
- const rectangle = Rectangle_default.clone(options.rectangle);
1942
- let geographicWest;
1943
- let geographicSouth;
1944
- let geographicEast;
1945
- let geographicNorth;
1946
- if (!defined_default(rectangle)) {
1947
- if (isGeographic) {
1948
- geographicWest = toRadians(nativeRectangle.west);
1949
- geographicSouth = toRadians(nativeRectangle.south);
1950
- geographicEast = toRadians(nativeRectangle.east);
1951
- geographicNorth = toRadians(nativeRectangle.north);
1952
- } else {
1953
- geographicWest = nativeRectangle.west * oneOverGlobeSemimajorAxis;
1954
- geographicSouth = piOverTwo - 2 * atan(exp(-nativeRectangle.south * oneOverGlobeSemimajorAxis));
1955
- geographicEast = nativeRectangle.east * oneOverGlobeSemimajorAxis;
1956
- geographicNorth = piOverTwo - 2 * atan(exp(-nativeRectangle.north * oneOverGlobeSemimajorAxis));
1957
- }
1958
- } else {
1959
- geographicWest = rectangle.west;
1960
- geographicSouth = rectangle.south;
1961
- geographicEast = rectangle.east;
1962
- geographicNorth = rectangle.north;
1963
- }
1964
- let relativeToCenter = options.relativeToCenter;
1965
- const hasRelativeToCenter = defined_default(relativeToCenter);
1966
- relativeToCenter = hasRelativeToCenter ? relativeToCenter : Cartesian3_default.ZERO;
1967
- const includeWebMercatorT = defaultValue_default(options.includeWebMercatorT, false);
1968
- const exaggeration = defaultValue_default(options.exaggeration, 1);
1969
- const exaggerationRelativeHeight = defaultValue_default(
1970
- options.exaggerationRelativeHeight,
1971
- 0
1972
- );
1973
- const hasExaggeration = exaggeration !== 1;
1974
- const includeGeodeticSurfaceNormals = hasExaggeration;
1975
- const structure = defaultValue_default(
1976
- options.structure,
1977
- HeightmapTessellator.DEFAULT_STRUCTURE
1978
- );
1979
- const heightScale = defaultValue_default(
1980
- structure.heightScale,
1981
- HeightmapTessellator.DEFAULT_STRUCTURE.heightScale
1982
- );
1983
- const heightOffset = defaultValue_default(
1984
- structure.heightOffset,
1985
- HeightmapTessellator.DEFAULT_STRUCTURE.heightOffset
1986
- );
1987
- const elementsPerHeight = defaultValue_default(
1988
- structure.elementsPerHeight,
1989
- HeightmapTessellator.DEFAULT_STRUCTURE.elementsPerHeight
1990
- );
1991
- const stride = defaultValue_default(
1992
- structure.stride,
1993
- HeightmapTessellator.DEFAULT_STRUCTURE.stride
1994
- );
1995
- const elementMultiplier = defaultValue_default(
1996
- structure.elementMultiplier,
1997
- HeightmapTessellator.DEFAULT_STRUCTURE.elementMultiplier
1998
- );
1999
- const isBigEndian = defaultValue_default(
2000
- structure.isBigEndian,
2001
- HeightmapTessellator.DEFAULT_STRUCTURE.isBigEndian
2002
- );
2003
- let rectangleWidth = Rectangle_default.computeWidth(nativeRectangle);
2004
- let rectangleHeight = Rectangle_default.computeHeight(nativeRectangle);
2005
- const granularityX = rectangleWidth / (width - 1);
2006
- const granularityY = rectangleHeight / (height - 1);
2007
- if (!isGeographic) {
2008
- rectangleWidth *= oneOverGlobeSemimajorAxis;
2009
- rectangleHeight *= oneOverGlobeSemimajorAxis;
2010
- }
2011
- const radiiSquared = ellipsoid.radiiSquared;
2012
- const radiiSquaredX = radiiSquared.x;
2013
- const radiiSquaredY = radiiSquared.y;
2014
- const radiiSquaredZ = radiiSquared.z;
2015
- let minimumHeight = 65536;
2016
- let maximumHeight = -65536;
2017
- const fromENU = Transforms_default.eastNorthUpToFixedFrame(
2018
- relativeToCenter,
2019
- ellipsoid
2020
- );
2021
- const toENU = Matrix4_default.inverseTransformation(fromENU, matrix4Scratch);
2022
- let southMercatorY;
2023
- let oneOverMercatorHeight;
2024
- if (includeWebMercatorT) {
2025
- southMercatorY = WebMercatorProjection_default.geodeticLatitudeToMercatorAngle(geographicSouth);
2026
- oneOverMercatorHeight = 1 / (WebMercatorProjection_default.geodeticLatitudeToMercatorAngle(geographicNorth) - southMercatorY);
2027
- }
2028
- const minimum = minimumScratch;
2029
- minimum.x = Number.POSITIVE_INFINITY;
2030
- minimum.y = Number.POSITIVE_INFINITY;
2031
- minimum.z = Number.POSITIVE_INFINITY;
2032
- const maximum = maximumScratch;
2033
- maximum.x = Number.NEGATIVE_INFINITY;
2034
- maximum.y = Number.NEGATIVE_INFINITY;
2035
- maximum.z = Number.NEGATIVE_INFINITY;
2036
- let hMin = Number.POSITIVE_INFINITY;
2037
- const gridVertexCount = width * height;
2038
- const edgeVertexCount = skirtHeight > 0 ? width * 2 + height * 2 : 0;
2039
- const vertexCount = gridVertexCount + edgeVertexCount;
2040
- const positions = new Array(vertexCount);
2041
- const heights = new Array(vertexCount);
2042
- const uvs = new Array(vertexCount);
2043
- const webMercatorTs = includeWebMercatorT ? new Array(vertexCount) : [];
2044
- const geodeticSurfaceNormals = includeGeodeticSurfaceNormals ? new Array(vertexCount) : [];
2045
- let startRow = 0;
2046
- let endRow = height;
2047
- let startCol = 0;
2048
- let endCol = width;
2049
- if (hasSkirts) {
2050
- --startRow;
2051
- ++endRow;
2052
- --startCol;
2053
- ++endCol;
2054
- }
2055
- const skirtOffsetPercentage = 1e-5;
2056
- for (let rowIndex = startRow; rowIndex < endRow; ++rowIndex) {
2057
- let row = rowIndex;
2058
- if (row < 0) {
2059
- row = 0;
2060
- }
2061
- if (row >= height) {
2062
- row = height - 1;
2063
- }
2064
- let latitude = nativeRectangle.north - granularityY * row;
2065
- if (!isGeographic) {
2066
- latitude = piOverTwo - 2 * atan(exp(-latitude * oneOverGlobeSemimajorAxis));
2067
- } else {
2068
- latitude = toRadians(latitude);
2069
- }
2070
- let v = (latitude - geographicSouth) / (geographicNorth - geographicSouth);
2071
- v = Math_default.clamp(v, 0, 1);
2072
- const isNorthEdge = rowIndex === startRow;
2073
- const isSouthEdge = rowIndex === endRow - 1;
2074
- if (skirtHeight > 0) {
2075
- if (isNorthEdge) {
2076
- latitude += skirtOffsetPercentage * rectangleHeight;
2077
- } else if (isSouthEdge) {
2078
- latitude -= skirtOffsetPercentage * rectangleHeight;
2079
- }
2080
- }
2081
- const cosLatitude = cos(latitude);
2082
- const nZ = sin(latitude);
2083
- const kZ = radiiSquaredZ * nZ;
2084
- let webMercatorT;
2085
- if (includeWebMercatorT) {
2086
- webMercatorT = (WebMercatorProjection_default.geodeticLatitudeToMercatorAngle(latitude) - southMercatorY) * oneOverMercatorHeight;
2087
- }
2088
- for (let colIndex = startCol; colIndex < endCol; ++colIndex) {
2089
- let col = colIndex;
2090
- if (col < 0) {
2091
- col = 0;
2092
- }
2093
- if (col >= width) {
2094
- col = width - 1;
2095
- }
2096
- const terrainOffset = row * (width * stride) + col * stride;
2097
- let heightSample;
2098
- if (elementsPerHeight === 1) {
2099
- heightSample = heightmap[terrainOffset];
2100
- } else {
2101
- heightSample = 0;
2102
- let elementOffset;
2103
- if (isBigEndian) {
2104
- for (elementOffset = 0; elementOffset < elementsPerHeight; ++elementOffset) {
2105
- heightSample = heightSample * elementMultiplier + heightmap[terrainOffset + elementOffset];
2106
- }
2107
- } else {
2108
- for (elementOffset = elementsPerHeight - 1; elementOffset >= 0; --elementOffset) {
2109
- heightSample = heightSample * elementMultiplier + heightmap[terrainOffset + elementOffset];
2110
- }
2111
- }
2112
- }
2113
- heightSample = heightSample * heightScale + heightOffset;
2114
- maximumHeight = Math.max(maximumHeight, heightSample);
2115
- minimumHeight = Math.min(minimumHeight, heightSample);
2116
- let longitude = nativeRectangle.west + granularityX * col;
2117
- if (!isGeographic) {
2118
- longitude = longitude * oneOverGlobeSemimajorAxis;
2119
- } else {
2120
- longitude = toRadians(longitude);
2121
- }
2122
- let u = (longitude - geographicWest) / (geographicEast - geographicWest);
2123
- u = Math_default.clamp(u, 0, 1);
2124
- let index = row * width + col;
2125
- if (skirtHeight > 0) {
2126
- const isWestEdge = colIndex === startCol;
2127
- const isEastEdge = colIndex === endCol - 1;
2128
- const isEdge = isNorthEdge || isSouthEdge || isWestEdge || isEastEdge;
2129
- const isCorner = (isNorthEdge || isSouthEdge) && (isWestEdge || isEastEdge);
2130
- if (isCorner) {
2131
- continue;
2132
- } else if (isEdge) {
2133
- heightSample -= skirtHeight;
2134
- if (isWestEdge) {
2135
- index = gridVertexCount + (height - row - 1);
2136
- longitude -= skirtOffsetPercentage * rectangleWidth;
2137
- } else if (isSouthEdge) {
2138
- index = gridVertexCount + height + (width - col - 1);
2139
- } else if (isEastEdge) {
2140
- index = gridVertexCount + height + width + row;
2141
- longitude += skirtOffsetPercentage * rectangleWidth;
2142
- } else if (isNorthEdge) {
2143
- index = gridVertexCount + height + width + height + col;
2144
- }
2145
- }
2146
- }
2147
- const nX = cosLatitude * cos(longitude);
2148
- const nY = cosLatitude * sin(longitude);
2149
- const kX = radiiSquaredX * nX;
2150
- const kY = radiiSquaredY * nY;
2151
- const gamma = sqrt(kX * nX + kY * nY + kZ * nZ);
2152
- const oneOverGamma = 1 / gamma;
2153
- const rSurfaceX = kX * oneOverGamma;
2154
- const rSurfaceY = kY * oneOverGamma;
2155
- const rSurfaceZ = kZ * oneOverGamma;
2156
- const position = new Cartesian3_default();
2157
- position.x = rSurfaceX + nX * heightSample;
2158
- position.y = rSurfaceY + nY * heightSample;
2159
- position.z = rSurfaceZ + nZ * heightSample;
2160
- Matrix4_default.multiplyByPoint(toENU, position, cartesian3Scratch);
2161
- Cartesian3_default.minimumByComponent(cartesian3Scratch, minimum, minimum);
2162
- Cartesian3_default.maximumByComponent(cartesian3Scratch, maximum, maximum);
2163
- hMin = Math.min(hMin, heightSample);
2164
- positions[index] = position;
2165
- uvs[index] = new Cartesian2_default(u, v);
2166
- heights[index] = heightSample;
2167
- if (includeWebMercatorT) {
2168
- webMercatorTs[index] = webMercatorT;
2169
- }
2170
- if (includeGeodeticSurfaceNormals) {
2171
- geodeticSurfaceNormals[index] = ellipsoid.geodeticSurfaceNormal(position);
2172
- }
2173
- }
2174
- }
2175
- const boundingSphere3D = BoundingSphere_default.fromPoints(positions);
2176
- let orientedBoundingBox;
2177
- if (defined_default(rectangle)) {
2178
- orientedBoundingBox = OrientedBoundingBox_default.fromRectangle(
2179
- rectangle,
2180
- minimumHeight,
2181
- maximumHeight,
2182
- ellipsoid
2183
- );
2184
- }
2185
- let occludeePointInScaledSpace;
2186
- if (hasRelativeToCenter) {
2187
- const occluder = new EllipsoidalOccluder_default(ellipsoid);
2188
- occludeePointInScaledSpace = occluder.computeHorizonCullingPointPossiblyUnderEllipsoid(
2189
- relativeToCenter,
2190
- positions,
2191
- minimumHeight
2192
- );
2193
- }
2194
- const aaBox = new AxisAlignedBoundingBox_default(minimum, maximum, relativeToCenter);
2195
- const encoding = new TerrainEncoding_default(
2196
- relativeToCenter,
2197
- aaBox,
2198
- hMin,
2199
- maximumHeight,
2200
- fromENU,
2201
- false,
2202
- includeWebMercatorT,
2203
- includeGeodeticSurfaceNormals,
2204
- exaggeration,
2205
- exaggerationRelativeHeight
2206
- );
2207
- const vertices = new Float32Array(vertexCount * encoding.stride);
2208
- let bufferIndex = 0;
2209
- for (let j = 0; j < vertexCount; ++j) {
2210
- bufferIndex = encoding.encode(
2211
- vertices,
2212
- bufferIndex,
2213
- positions[j],
2214
- uvs[j],
2215
- heights[j],
2216
- void 0,
2217
- webMercatorTs[j],
2218
- geodeticSurfaceNormals[j]
2219
- );
2220
- }
2221
- return {
2222
- vertices,
2223
- maximumHeight,
2224
- minimumHeight,
2225
- encoding,
2226
- boundingSphere3D,
2227
- orientedBoundingBox,
2228
- occludeePointInScaledSpace
2229
- };
2230
- };
2231
- var HeightmapTessellator_default = HeightmapTessellator;
2232
-
2233
- // packages/engine/Source/Workers/createVerticesFromHeightmap.js
2234
- var import_lerc = __toESM(require_LercDecode(), 1);
2235
- function createVerticesFromHeightmap(parameters, transferableObjects) {
2236
- if (parameters.encoding === HeightmapEncoding_default.LERC) {
2237
- let result;
2238
- try {
2239
- result = import_lerc.default.decode(parameters.heightmap);
2240
- } catch (error) {
2241
- throw new RuntimeError_default(error);
2242
- }
2243
- const lercStatistics = result.statistics[0];
2244
- if (lercStatistics.minValue === Number.MAX_VALUE) {
2245
- throw new RuntimeError_default("Invalid tile data");
2246
- }
2247
- parameters.heightmap = result.pixels[0];
2248
- parameters.width = result.width;
2249
- parameters.height = result.height;
2250
- }
2251
- parameters.ellipsoid = Ellipsoid_default.clone(parameters.ellipsoid);
2252
- parameters.rectangle = Rectangle_default.clone(parameters.rectangle);
2253
- const statistics = HeightmapTessellator_default.computeVertices(parameters);
2254
- const vertices = statistics.vertices;
2255
- transferableObjects.push(vertices.buffer);
2256
- return {
2257
- vertices: vertices.buffer,
2258
- numberOfAttributes: statistics.encoding.stride,
2259
- minimumHeight: statistics.minimumHeight,
2260
- maximumHeight: statistics.maximumHeight,
2261
- gridWidth: parameters.width,
2262
- gridHeight: parameters.height,
2263
- boundingSphere3D: statistics.boundingSphere3D,
2264
- orientedBoundingBox: statistics.orientedBoundingBox,
2265
- occludeePointInScaledSpace: statistics.occludeePointInScaledSpace,
2266
- encoding: statistics.encoding,
2267
- westIndicesSouthToNorth: statistics.westIndicesSouthToNorth,
2268
- southIndicesEastToWest: statistics.southIndicesEastToWest,
2269
- eastIndicesNorthToSouth: statistics.eastIndicesNorthToSouth,
2270
- northIndicesWestToEast: statistics.northIndicesWestToEast
2271
- };
2272
- }
2273
- var createVerticesFromHeightmap_default = createTaskProcessorWorker_default(createVerticesFromHeightmap);
2274
- export {
2275
- createVerticesFromHeightmap_default as default
2276
- };
26
+ import{a as ar,b as sr}from"./chunk-7HTKERZY.js";import{a as ir}from"./chunk-WZDE3RYP.js";import{a as xe}from"./chunk-DQQ63PYM.js";import{a as nr}from"./chunk-CNCV5UL7.js";import"./chunk-DEPHB2WM.js";import"./chunk-TCGIRNHN.js";import{a as tr}from"./chunk-N4VJKXZS.js";import"./chunk-DMEY62ID.js";import"./chunk-HTFSEEMT.js";import{d as rr}from"./chunk-4IW2T6GF.js";import{b as Ie,g as er,h as ne}from"./chunk-PSPPBZWI.js";import"./chunk-AU7IKHOH.js";import{a as re,c as Pe,d as pe}from"./chunk-64RSHJUE.js";import{a as he}from"./chunk-3SSKC3VN.js";import"./chunk-OSW76XDF.js";import{a as Re}from"./chunk-ED5JPB3S.js";import{a as me}from"./chunk-LEYMRMBK.js";import{c as pr,d as Ir,e as W}from"./chunk-VTAIKJXX.js";var lr=pr((Zr,Ue)=>{/* Copyright 2015-2018 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 */(function(){var D=function(){var A={};A.defaultNoDataValue=-34027999387901484e22,A.decode=function(r,a){a=a||{};var t=a.encodedMaskData||a.encodedMaskData===null,i=n(r,a.inputOffset||0,t),o=a.noDataValue!==null?a.noDataValue:A.defaultNoDataValue,s=V(i,a.pixelType||Float32Array,a.encodedMaskData,o,a.returnMask),u={width:i.width,height:i.height,pixelData:s.resultPixels,minValue:s.minValue,maxValue:i.pixels.maxValue,noDataValue:o};return s.resultMask&&(u.maskData=s.resultMask),a.returnEncodedMask&&i.mask&&(u.encodedMaskData=i.mask.bitset?i.mask.bitset:null),a.returnFileInfo&&(u.fileInfo=b(i),a.computeUsedBitDepths&&(u.fileInfo.bitDepths=Y(i))),u};var V=function(r,a,t,i,o){var s=0,u=r.pixels.numBlocksX,m=r.pixels.numBlocksY,l=Math.floor(r.width/u),f=Math.floor(r.height/m),h=2*r.maxZError,c=Number.MAX_VALUE,g;t=t||(r.mask?r.mask.bitset:null);var v,U;v=new a(r.width*r.height),o&&t&&(U=new Uint8Array(r.width*r.height));for(var M=new Float32Array(l*f),S,I,k=0;k<=m;k++){var w=k!==m?f:r.height%m;if(w!==0)for(var d=0;d<=u;d++){var x=d!==u?l:r.width%u;if(x!==0){var T=k*r.width*f+d*l,y=r.width-x,p=r.pixels.blocks[s],L,B,E;p.encoding<2?(p.encoding===0?L=p.rawData:(e(p.stuffedData,p.bitsPerPixel,p.numValidPixels,p.offset,h,M,r.pixels.maxValue),L=M),B=0):p.encoding===2?E=0:E=p.offset;var O;if(t)for(I=0;I<w;I++){for(T&7&&(O=t[T>>3],O<<=T&7),S=0;S<x;S++)T&7||(O=t[T>>3]),O&128?(U&&(U[T]=1),g=p.encoding<2?L[B++]:E,c=c>g?g:c,v[T++]=g):(U&&(U[T]=0),v[T++]=i),O<<=1;T+=y}else if(p.encoding<2)for(I=0;I<w;I++){for(S=0;S<x;S++)g=L[B++],c=c>g?g:c,v[T++]=g;T+=y}else for(c=c>E?E:c,I=0;I<w;I++){for(S=0;S<x;S++)v[T++]=E;T+=y}if(p.encoding===1&&B!==p.numValidPixels)throw"Block and Mask do not match";s++}}}return{resultPixels:v,resultMask:U,minValue:c}},b=function(r){return{fileIdentifierString:r.fileIdentifierString,fileVersion:r.fileVersion,imageType:r.imageType,height:r.height,width:r.width,maxZError:r.maxZError,eofOffset:r.eofOffset,mask:r.mask?{numBlocksX:r.mask.numBlocksX,numBlocksY:r.mask.numBlocksY,numBytes:r.mask.numBytes,maxValue:r.mask.maxValue}:null,pixels:{numBlocksX:r.pixels.numBlocksX,numBlocksY:r.pixels.numBlocksY,numBytes:r.pixels.numBytes,maxValue:r.pixels.maxValue,noDataValue:r.noDataValue}}},Y=function(r){for(var a=r.pixels.numBlocksX*r.pixels.numBlocksY,t={},i=0;i<a;i++){var o=r.pixels.blocks[i];o.encoding===0?t.float32=!0:o.encoding===1?t[o.bitsPerPixel]=!0:t[0]=!0}return Object.keys(t)},n=function(r,a,t){var i={},o=new Uint8Array(r,a,10);if(i.fileIdentifierString=String.fromCharCode.apply(null,o),i.fileIdentifierString.trim()!=="CntZImage")throw"Unexpected file identifier string: "+i.fileIdentifierString;a+=10;var s=new DataView(r,a,24);if(i.fileVersion=s.getInt32(0,!0),i.imageType=s.getInt32(4,!0),i.height=s.getUint32(8,!0),i.width=s.getUint32(12,!0),i.maxZError=s.getFloat64(16,!0),a+=24,!t)if(s=new DataView(r,a,16),i.mask={},i.mask.numBlocksY=s.getUint32(0,!0),i.mask.numBlocksX=s.getUint32(4,!0),i.mask.numBytes=s.getUint32(8,!0),i.mask.maxValue=s.getFloat32(12,!0),a+=16,i.mask.numBytes>0){var u=new Uint8Array(Math.ceil(i.width*i.height/8));s=new DataView(r,a,i.mask.numBytes);var m=s.getInt16(0,!0),l=2,f=0;do{if(m>0)for(;m--;)u[f++]=s.getUint8(l++);else{var h=s.getUint8(l++);for(m=-m;m--;)u[f++]=h}m=s.getInt16(l,!0),l+=2}while(l<i.mask.numBytes);if(m!==-32768||f<u.length)throw"Unexpected end of mask RLE encoding";i.mask.bitset=u,a+=i.mask.numBytes}else(i.mask.numBytes|i.mask.numBlocksY|i.mask.maxValue)===0&&(i.mask.bitset=new Uint8Array(Math.ceil(i.width*i.height/8)));s=new DataView(r,a,16),i.pixels={},i.pixels.numBlocksY=s.getUint32(0,!0),i.pixels.numBlocksX=s.getUint32(4,!0),i.pixels.numBytes=s.getUint32(8,!0),i.pixels.maxValue=s.getFloat32(12,!0),a+=16;var c=i.pixels.numBlocksX,g=i.pixels.numBlocksY,v=c+(i.width%c>0?1:0),U=g+(i.height%g>0?1:0);i.pixels.blocks=new Array(v*U);for(var M=0,S=0;S<U;S++)for(var I=0;I<v;I++){var k=0,w=r.byteLength-a;s=new DataView(r,a,Math.min(10,w));var d={};i.pixels.blocks[M++]=d;var x=s.getUint8(0);if(k++,d.encoding=x&63,d.encoding>3)throw"Invalid block encoding ("+d.encoding+")";if(d.encoding===2){a++;continue}if(x!==0&&x!==2){if(x>>=6,d.offsetType=x,x===2)d.offset=s.getInt8(1),k++;else if(x===1)d.offset=s.getInt16(1,!0),k+=2;else if(x===0)d.offset=s.getFloat32(1,!0),k+=4;else throw"Invalid block offset type";if(d.encoding===1)if(x=s.getUint8(k),k++,d.bitsPerPixel=x&63,x>>=6,d.numValidPixelsType=x,x===2)d.numValidPixels=s.getUint8(k),k++;else if(x===1)d.numValidPixels=s.getUint16(k,!0),k+=2;else if(x===0)d.numValidPixels=s.getUint32(k,!0),k+=4;else throw"Invalid valid pixel count type"}if(a+=k,d.encoding!==3){var T,y;if(d.encoding===0){var p=(i.pixels.numBytes-1)/4;if(p!==Math.floor(p))throw"uncompressed block has invalid length";T=new ArrayBuffer(p*4),y=new Uint8Array(T),y.set(new Uint8Array(r,a,p*4));var L=new Float32Array(T);d.rawData=L,a+=p*4}else if(d.encoding===1){var B=Math.ceil(d.numValidPixels*d.bitsPerPixel/8),E=Math.ceil(B/4);T=new ArrayBuffer(E*4),y=new Uint8Array(T),y.set(new Uint8Array(r,a,B)),d.stuffedData=new Uint32Array(T),a+=B}}}return i.eofOffset=a,i},e=function(r,a,t,i,o,s,u){var m=(1<<a)-1,l=0,f,h=0,c,g,v=Math.ceil((u-i)/o),U=r.length*4-Math.ceil(a*t/8);for(r[r.length-1]<<=8*U,f=0;f<t;f++){if(h===0&&(g=r[l++],h=32),h>=a)c=g>>>h-a&m,h-=a;else{var M=a-h;c=(g&m)<<M&m,g=r[l++],h=32-M,c+=g>>>h}s[f]=c<v?i+c*o:u}return s};return A}(),ae=function(){"use strict";var A={unstuff:function(n,e,r,a,t,i,o,s){var u=(1<<r)-1,m=0,l,f=0,h,c,g,v,U=n.length*4-Math.ceil(r*a/8);if(n[n.length-1]<<=8*U,t)for(l=0;l<a;l++)f===0&&(c=n[m++],f=32),f>=r?(h=c>>>f-r&u,f-=r):(g=r-f,h=(c&u)<<g&u,c=n[m++],f=32-g,h+=c>>>f),e[l]=t[h];else for(v=Math.ceil((s-i)/o),l=0;l<a;l++)f===0&&(c=n[m++],f=32),f>=r?(h=c>>>f-r&u,f-=r):(g=r-f,h=(c&u)<<g&u,c=n[m++],f=32-g,h+=c>>>f),e[l]=h<v?i+h*o:s},unstuffLUT:function(n,e,r,a,t,i){var o=(1<<e)-1,s=0,u=0,m=0,l=0,f=0,h,c=[],g=n.length*4-Math.ceil(e*r/8);n[n.length-1]<<=8*g;var v=Math.ceil((i-a)/t);for(u=0;u<r;u++)l===0&&(h=n[s++],l=32),l>=e?(f=h>>>l-e&o,l-=e):(m=e-l,f=(h&o)<<m&o,h=n[s++],l=32-m,f+=h>>>l),c[u]=f<v?a+f*t:i;return c.unshift(a),c},unstuff2:function(n,e,r,a,t,i,o,s){var u=(1<<r)-1,m=0,l,f=0,h=0,c,g,v;if(t)for(l=0;l<a;l++)f===0&&(g=n[m++],f=32,h=0),f>=r?(c=g>>>h&u,f-=r,h+=r):(v=r-f,c=g>>>h&u,g=n[m++],f=32-v,c|=(g&(1<<v)-1)<<r-v,h=v),e[l]=t[c];else{var U=Math.ceil((s-i)/o);for(l=0;l<a;l++)f===0&&(g=n[m++],f=32,h=0),f>=r?(c=g>>>h&u,f-=r,h+=r):(v=r-f,c=g>>>h&u,g=n[m++],f=32-v,c|=(g&(1<<v)-1)<<r-v,h=v),e[l]=c<U?i+c*o:s}return e},unstuffLUT2:function(n,e,r,a,t,i){var o=(1<<e)-1,s=0,u=0,m=0,l=0,f=0,h=0,c,g=[],v=Math.ceil((i-a)/t);for(u=0;u<r;u++)l===0&&(c=n[s++],l=32,h=0),l>=e?(f=c>>>h&o,l-=e,h+=e):(m=e-l,f=c>>>h&o,c=n[s++],l=32-m,f|=(c&(1<<m)-1)<<e-m,h=m),g[u]=f<v?a+f*t:i;return g.unshift(a),g},originalUnstuff:function(n,e,r,a){var t=(1<<r)-1,i=0,o,s=0,u,m,l,f=n.length*4-Math.ceil(r*a/8);for(n[n.length-1]<<=8*f,o=0;o<a;o++)s===0&&(m=n[i++],s=32),s>=r?(u=m>>>s-r&t,s-=r):(l=r-s,u=(m&t)<<l&t,m=n[i++],s=32-l,u+=m>>>s),e[o]=u;return e},originalUnstuff2:function(n,e,r,a){var t=(1<<r)-1,i=0,o,s=0,u=0,m,l,f;for(o=0;o<a;o++)s===0&&(l=n[i++],s=32,u=0),s>=r?(m=l>>>u&t,s-=r,u+=r):(f=r-s,m=l>>>u&t,l=n[i++],s=32-f,m|=(l&(1<<f)-1)<<r-f,u=f),e[o]=m;return e}},V={HUFFMAN_LUT_BITS_MAX:12,computeChecksumFletcher32:function(n){for(var e=65535,r=65535,a=n.length,t=Math.floor(a/2),i=0;t;){var o=t>=359?359:t;t-=o;do e+=n[i++]<<8,r+=e+=n[i++];while(--o);e=(e&65535)+(e>>>16),r=(r&65535)+(r>>>16)}return a&1&&(r+=e+=n[i]<<8),e=(e&65535)+(e>>>16),r=(r&65535)+(r>>>16),(r<<16|e)>>>0},readHeaderInfo:function(n,e){var r=e.ptr,a=new Uint8Array(n,r,6),t={};if(t.fileIdentifierString=String.fromCharCode.apply(null,a),t.fileIdentifierString.lastIndexOf("Lerc2",0)!==0)throw"Unexpected file identifier string (expect Lerc2 ): "+t.fileIdentifierString;r+=6;var i=new DataView(n,r,8),o=i.getInt32(0,!0);t.fileVersion=o,r+=4,o>=3&&(t.checksum=i.getUint32(4,!0),r+=4),i=new DataView(n,r,12),t.height=i.getUint32(0,!0),t.width=i.getUint32(4,!0),r+=8,o>=4?(t.numDims=i.getUint32(8,!0),r+=4):t.numDims=1,i=new DataView(n,r,40),t.numValidPixel=i.getUint32(0,!0),t.microBlockSize=i.getInt32(4,!0),t.blobSize=i.getInt32(8,!0),t.imageType=i.getInt32(12,!0),t.maxZError=i.getFloat64(16,!0),t.zMin=i.getFloat64(24,!0),t.zMax=i.getFloat64(32,!0),r+=40,e.headerInfo=t,e.ptr=r;var s,u;if(o>=3&&(u=o>=4?52:48,s=this.computeChecksumFletcher32(new Uint8Array(n,r-u,t.blobSize-14)),s!==t.checksum))throw"Checksum failed.";return!0},checkMinMaxRanges:function(n,e){var r=e.headerInfo,a=this.getDataTypeArray(r.imageType),t=r.numDims*this.getDataTypeSize(r.imageType),i=this.readSubArray(n,e.ptr,a,t),o=this.readSubArray(n,e.ptr+t,a,t);e.ptr+=2*t;var s,u=!0;for(s=0;s<r.numDims;s++)if(i[s]!==o[s]){u=!1;break}return r.minValues=i,r.maxValues=o,u},readSubArray:function(n,e,r,a){var t;if(r===Uint8Array)t=new Uint8Array(n,e,a);else{var i=new ArrayBuffer(a),o=new Uint8Array(i);o.set(new Uint8Array(n,e,a)),t=new r(i)}return t},readMask:function(n,e){var r=e.ptr,a=e.headerInfo,t=a.width*a.height,i=a.numValidPixel,o=new DataView(n,r,4),s={};if(s.numBytes=o.getUint32(0,!0),r+=4,(i===0||t===i)&&s.numBytes!==0)throw"invalid mask";var u,m;if(i===0)u=new Uint8Array(Math.ceil(t/8)),s.bitset=u,m=new Uint8Array(t),e.pixels.resultMask=m,r+=s.numBytes;else if(s.numBytes>0){u=new Uint8Array(Math.ceil(t/8)),o=new DataView(n,r,s.numBytes);var l=o.getInt16(0,!0),f=2,h=0,c=0;do{if(l>0)for(;l--;)u[h++]=o.getUint8(f++);else for(c=o.getUint8(f++),l=-l;l--;)u[h++]=c;l=o.getInt16(f,!0),f+=2}while(f<s.numBytes);if(l!==-32768||h<u.length)throw"Unexpected end of mask RLE encoding";m=new Uint8Array(t);var g=0,v=0;for(v=0;v<t;v++)v&7?(g=u[v>>3],g<<=v&7):g=u[v>>3],g&128&&(m[v]=1);e.pixels.resultMask=m,s.bitset=u,r+=s.numBytes}return e.ptr=r,e.mask=s,!0},readDataOneSweep:function(n,e,r){var a=e.ptr,t=e.headerInfo,i=t.numDims,o=t.width*t.height,s=t.imageType,u=t.numValidPixel*V.getDataTypeSize(s)*i,m,l=e.pixels.resultMask;if(r===Uint8Array)m=new Uint8Array(n,a,u);else{var f=new ArrayBuffer(u),h=new Uint8Array(f);h.set(new Uint8Array(n,a,u)),m=new r(f)}if(m.length===o*i)e.pixels.resultPixels=m;else{e.pixels.resultPixels=new r(o*i);var c=0,g=0,v=0,U=0;if(i>1)for(v=0;v<i;v++)for(U=v*o,g=0;g<o;g++)l[g]&&(e.pixels.resultPixels[U+g]=m[c++]);else for(g=0;g<o;g++)l[g]&&(e.pixels.resultPixels[g]=m[c++])}return a+=u,e.ptr=a,!0},readHuffmanTree:function(n,e){var r=this.HUFFMAN_LUT_BITS_MAX,a=new DataView(n,e.ptr,16);e.ptr+=16;var t=a.getInt32(0,!0);if(t<2)throw"unsupported Huffman version";var i=a.getInt32(4,!0),o=a.getInt32(8,!0),s=a.getInt32(12,!0);if(o>=s)return!1;var u=new Uint32Array(s-o);V.decodeBits(n,e,u);var m=[],l,f,h,c;for(l=o;l<s;l++)f=l-(l<i?0:i),m[f]={first:u[l-o],second:null};var g=n.byteLength-e.ptr,v=Math.ceil(g/4),U=new ArrayBuffer(v*4),M=new Uint8Array(U);M.set(new Uint8Array(n,e.ptr,g));var S=new Uint32Array(U),I=0,k,w=0;for(k=S[0],l=o;l<s;l++)f=l-(l<i?0:i),c=m[f].first,c>0&&(m[f].second=k<<I>>>32-c,32-I>=c?(I+=c,I===32&&(I=0,w++,k=S[w])):(I+=c-32,w++,k=S[w],m[f].second|=k>>>32-I));var d=0,x=0,T=new b;for(l=0;l<m.length;l++)m[l]!==void 0&&(d=Math.max(d,m[l].first));d>=r?x=r:x=d,d>=30&&console.log("WARning, large NUM LUT BITS IS "+d);var y=[],p,L,B,E,O,F;for(l=o;l<s;l++)if(f=l-(l<i?0:i),c=m[f].first,c>0)if(p=[c,f],c<=x)for(L=m[f].second<<x-c,B=1<<x-c,h=0;h<B;h++)y[L|h]=p;else for(L=m[f].second,F=T,E=c-1;E>=0;E--)O=L>>>E&1,O?(F.right||(F.right=new b),F=F.right):(F.left||(F.left=new b),F=F.left),E===0&&!F.val&&(F.val=p[1]);return{decodeLut:y,numBitsLUTQick:x,numBitsLUT:d,tree:T,stuffedData:S,srcPtr:w,bitPos:I}},readHuffman:function(n,e,r){var a=e.headerInfo,t=a.numDims,i=e.headerInfo.height,o=e.headerInfo.width,s=o*i,u=this.readHuffmanTree(n,e),m=u.decodeLut,l=u.tree,f=u.stuffedData,h=u.srcPtr,c=u.bitPos,g=u.numBitsLUTQick,v=u.numBitsLUT,U=e.headerInfo.imageType===0?128:0,M,S,I,k=e.pixels.resultMask,w,d,x,T,y,p,L,B=0;c>0&&(h++,c=0);var E=f[h],O=e.encodeMode===1,F=new r(s*t),N=F,_;for(_=0;_<a.numDims;_++){if(t>1&&(N=new r(F.buffer,s*_,s),B=0),e.headerInfo.numValidPixel===o*i)for(p=0,T=0;T<i;T++)for(y=0;y<o;y++,p++){if(S=0,w=E<<c>>>32-g,d=w,32-c<g&&(w|=f[h+1]>>>64-c-g,d=w),m[d])S=m[d][1],c+=m[d][0];else for(w=E<<c>>>32-v,d=w,32-c<v&&(w|=f[h+1]>>>64-c-v,d=w),M=l,L=0;L<v;L++)if(x=w>>>v-L-1&1,M=x?M.right:M.left,!(M.left||M.right)){S=M.val,c=c+L+1;break}c>=32&&(c-=32,h++,E=f[h]),I=S-U,O?(y>0?I+=B:T>0?I+=N[p-o]:I+=B,I&=255,N[p]=I,B=I):N[p]=I}else for(p=0,T=0;T<i;T++)for(y=0;y<o;y++,p++)if(k[p]){if(S=0,w=E<<c>>>32-g,d=w,32-c<g&&(w|=f[h+1]>>>64-c-g,d=w),m[d])S=m[d][1],c+=m[d][0];else for(w=E<<c>>>32-v,d=w,32-c<v&&(w|=f[h+1]>>>64-c-v,d=w),M=l,L=0;L<v;L++)if(x=w>>>v-L-1&1,M=x?M.right:M.left,!(M.left||M.right)){S=M.val,c=c+L+1;break}c>=32&&(c-=32,h++,E=f[h]),I=S-U,O?(y>0&&k[p-1]?I+=B:T>0&&k[p-o]?I+=N[p-o]:I+=B,I&=255,N[p]=I,B=I):N[p]=I}e.ptr=e.ptr+(h+1)*4+(c>0?4:0)}e.pixels.resultPixels=F},decodeBits:function(n,e,r,a,t){{var i=e.headerInfo,o=i.fileVersion,s=0,u=new DataView(n,e.ptr,5),m=u.getUint8(0);s++;var l=m>>6,f=l===0?4:3-l,h=(m&32)>0,c=m&31,g=0;if(f===1)g=u.getUint8(s),s++;else if(f===2)g=u.getUint16(s,!0),s+=2;else if(f===4)g=u.getUint32(s,!0),s+=4;else throw"Invalid valid pixel count type";var v=2*i.maxZError,U,M,S,I,k,w,d,x,T,y,p=i.numDims>1?i.maxValues[t]:i.zMax;if(h){for(e.counter.lut++,x=u.getUint8(s),T=c,s++,I=Math.ceil((x-1)*c/8),k=Math.ceil(I/4),M=new ArrayBuffer(k*4),S=new Uint8Array(M),e.ptr+=s,S.set(new Uint8Array(n,e.ptr,I)),d=new Uint32Array(M),e.ptr+=I,y=0;x-1>>>y;)y++;I=Math.ceil(g*y/8),k=Math.ceil(I/4),M=new ArrayBuffer(k*4),S=new Uint8Array(M),S.set(new Uint8Array(n,e.ptr,I)),U=new Uint32Array(M),e.ptr+=I,o>=3?w=A.unstuffLUT2(d,c,x-1,a,v,p):w=A.unstuffLUT(d,c,x-1,a,v,p),o>=3?A.unstuff2(U,r,y,g,w):A.unstuff(U,r,y,g,w)}else e.counter.bitstuffer++,y=c,e.ptr+=s,y>0&&(I=Math.ceil(g*y/8),k=Math.ceil(I/4),M=new ArrayBuffer(k*4),S=new Uint8Array(M),S.set(new Uint8Array(n,e.ptr,I)),U=new Uint32Array(M),e.ptr+=I,o>=3?a==null?A.originalUnstuff2(U,r,y,g):A.unstuff2(U,r,y,g,!1,a,v,p):a==null?A.originalUnstuff(U,r,y,g):A.unstuff(U,r,y,g,!1,a,v,p))}},readTiles:function(n,e,r){var a=e.headerInfo,t=a.width,i=a.height,o=a.microBlockSize,s=a.imageType,u=V.getDataTypeSize(s),m=Math.ceil(t/o),l=Math.ceil(i/o);e.pixels.numBlocksY=l,e.pixels.numBlocksX=m,e.pixels.ptr=0;var f=0,h=0,c=0,g=0,v=0,U=0,M=0,S=0,I=0,k=0,w=0,d=0,x=0,T=0,y=0,p=0,L,B,E,O,F,N,_=new r(o*o),Te=i%o||o,ke=t%o||o,Q,z,le=a.numDims,ie,Z=e.pixels.resultMask,j=e.pixels.resultPixels;for(c=0;c<l;c++)for(v=c!==l-1?o:Te,g=0;g<m;g++)for(U=g!==m-1?o:ke,w=c*t*o+g*o,d=t-U,ie=0;ie<le;ie++){if(le>1&&(j=new r(e.pixels.resultPixels.buffer,t*i*ie*u,t*i)),M=n.byteLength-e.ptr,L=new DataView(n,e.ptr,Math.min(10,M)),B={},p=0,S=L.getUint8(0),p++,I=S>>6&255,k=S>>2&15,k!==(g*o>>3&15))throw"integrity issue";if(N=S&3,N>3)throw e.ptr+=p,"Invalid block encoding ("+N+")";if(N===2){e.counter.constant++,e.ptr+=p;continue}else if(N===0){if(e.counter.uncompressed++,e.ptr+=p,x=v*U*u,T=n.byteLength-e.ptr,x=x<T?x:T,E=new ArrayBuffer(x%u===0?x:x+u-x%u),O=new Uint8Array(E),O.set(new Uint8Array(n,e.ptr,x)),F=new r(E),y=0,Z)for(f=0;f<v;f++){for(h=0;h<U;h++)Z[w]&&(j[w]=F[y++]),w++;w+=d}else for(f=0;f<v;f++){for(h=0;h<U;h++)j[w++]=F[y++];w+=d}e.ptr+=y*u}else if(Q=V.getDataTypeUsed(s,I),z=V.getOnePixel(B,p,Q,L),p+=V.getDataTypeSize(Q),N===3)if(e.ptr+=p,e.counter.constantoffset++,Z)for(f=0;f<v;f++){for(h=0;h<U;h++)Z[w]&&(j[w]=z),w++;w+=d}else for(f=0;f<v;f++){for(h=0;h<U;h++)j[w++]=z;w+=d}else if(e.ptr+=p,V.decodeBits(n,e,_,z,ie),p=0,Z)for(f=0;f<v;f++){for(h=0;h<U;h++)Z[w]&&(j[w]=_[p++]),w++;w+=d}else for(f=0;f<v;f++){for(h=0;h<U;h++)j[w++]=_[p++];w+=d}}},formatFileInfo:function(n){return{fileIdentifierString:n.headerInfo.fileIdentifierString,fileVersion:n.headerInfo.fileVersion,imageType:n.headerInfo.imageType,height:n.headerInfo.height,width:n.headerInfo.width,numValidPixel:n.headerInfo.numValidPixel,microBlockSize:n.headerInfo.microBlockSize,blobSize:n.headerInfo.blobSize,maxZError:n.headerInfo.maxZError,pixelType:V.getPixelType(n.headerInfo.imageType),eofOffset:n.eofOffset,mask:n.mask?{numBytes:n.mask.numBytes}:null,pixels:{numBlocksX:n.pixels.numBlocksX,numBlocksY:n.pixels.numBlocksY,maxValue:n.headerInfo.zMax,minValue:n.headerInfo.zMin,noDataValue:n.noDataValue}}},constructConstantSurface:function(n){var e=n.headerInfo.zMax,r=n.headerInfo.numDims,a=n.headerInfo.height*n.headerInfo.width,t=a*r,i=0,o=0,s=0,u=n.pixels.resultMask;if(u)if(r>1)for(i=0;i<r;i++)for(s=i*a,o=0;o<a;o++)u[o]&&(n.pixels.resultPixels[s+o]=e);else for(o=0;o<a;o++)u[o]&&(n.pixels.resultPixels[o]=e);else if(n.pixels.resultPixels.fill)n.pixels.resultPixels.fill(e);else for(o=0;o<t;o++)n.pixels.resultPixels[o]=e},getDataTypeArray:function(n){var e;switch(n){case 0:e=Int8Array;break;case 1:e=Uint8Array;break;case 2:e=Int16Array;break;case 3:e=Uint16Array;break;case 4:e=Int32Array;break;case 5:e=Uint32Array;break;case 6:e=Float32Array;break;case 7:e=Float64Array;break;default:e=Float32Array}return e},getPixelType:function(n){var e;switch(n){case 0:e="S8";break;case 1:e="U8";break;case 2:e="S16";break;case 3:e="U16";break;case 4:e="S32";break;case 5:e="U32";break;case 6:e="F32";break;case 7:e="F64";break;default:e="F32"}return e},isValidPixelValue:function(n,e){if(e==null)return!1;var r;switch(n){case 0:r=e>=-128&&e<=127;break;case 1:r=e>=0&&e<=255;break;case 2:r=e>=-32768&&e<=32767;break;case 3:r=e>=0&&e<=65536;break;case 4:r=e>=-2147483648&&e<=2147483647;break;case 5:r=e>=0&&e<=4294967296;break;case 6:r=e>=-34027999387901484e22&&e<=34027999387901484e22;break;case 7:r=e>=5e-324&&e<=17976931348623157e292;break;default:r=!1}return r},getDataTypeSize:function(n){var e=0;switch(n){case 0:case 1:e=1;break;case 2:case 3:e=2;break;case 4:case 5:case 6:e=4;break;case 7:e=8;break;default:e=n}return e},getDataTypeUsed:function(n,e){var r=n;switch(n){case 2:case 4:r=n-e;break;case 3:case 5:r=n-2*e;break;case 6:e===0?r=n:e===1?r=2:r=1;break;case 7:e===0?r=n:r=n-2*e+1;break;default:r=n;break}return r},getOnePixel:function(n,e,r,a){var t=0;switch(r){case 0:t=a.getInt8(e);break;case 1:t=a.getUint8(e);break;case 2:t=a.getInt16(e,!0);break;case 3:t=a.getUint16(e,!0);break;case 4:t=a.getInt32(e,!0);break;case 5:t=a.getUInt32(e,!0);break;case 6:t=a.getFloat32(e,!0);break;case 7:t=a.getFloat64(e,!0);break;default:throw"the decoder does not understand this pixel type"}return t}},b=function(n,e,r){this.val=n,this.left=e,this.right=r},Y={decode:function(n,e){e=e||{};var r=e.noDataValue,a=0,t={};if(t.ptr=e.inputOffset||0,t.pixels={},!!V.readHeaderInfo(n,t)){var i=t.headerInfo,o=i.fileVersion,s=V.getDataTypeArray(i.imageType);V.readMask(n,t),i.numValidPixel!==i.width*i.height&&!t.pixels.resultMask&&(t.pixels.resultMask=e.maskData);var u=i.width*i.height;if(t.pixels.resultPixels=new s(u*i.numDims),t.counter={onesweep:0,uncompressed:0,lut:0,bitstuffer:0,constant:0,constantoffset:0},i.numValidPixel!==0)if(i.zMax===i.zMin)V.constructConstantSurface(t);else if(o>=4&&V.checkMinMaxRanges(n,t))V.constructConstantSurface(t);else{var m=new DataView(n,t.ptr,2),l=m.getUint8(0);if(t.ptr++,l)V.readDataOneSweep(n,t,s);else if(o>1&&i.imageType<=1&&Math.abs(i.maxZError-.5)<1e-5){var f=m.getUint8(1);if(t.ptr++,t.encodeMode=f,f>2||o<4&&f>1)throw"Invalid Huffman flag "+f;f?V.readHuffman(n,t,s):V.readTiles(n,t,s)}else V.readTiles(n,t,s)}t.eofOffset=t.ptr;var h;e.inputOffset?(h=t.headerInfo.blobSize+e.inputOffset-t.ptr,Math.abs(h)>=1&&(t.eofOffset=e.inputOffset+t.headerInfo.blobSize)):(h=t.headerInfo.blobSize-t.ptr,Math.abs(h)>=1&&(t.eofOffset=t.headerInfo.blobSize));var c={width:i.width,height:i.height,pixelData:t.pixels.resultPixels,minValue:i.zMin,maxValue:i.zMax,validPixelCount:i.numValidPixel,dimCount:i.numDims,dimStats:{minValues:i.minValues,maxValues:i.maxValues},maskData:t.pixels.resultMask};if(t.pixels.resultMask&&V.isValidPixelValue(i.imageType,r)){var g=t.pixels.resultMask;for(a=0;a<u;a++)g[a]||(c.pixelData[a]=r);c.noDataValue=r}return t.noDataValue=r,e.returnFileInfo&&(c.fileInfo=V.formatFileInfo(t)),c}},getBandCount:function(n){var e=0,r=0,a={};for(a.ptr=0,a.pixels={};r<n.byteLength-58;)V.readHeaderInfo(n,a),r+=a.headerInfo.blobSize,e++,a.ptr=r;return e}};return Y}(),C=function(){var A=new ArrayBuffer(4),V=new Uint8Array(A),b=new Uint32Array(A);return b[0]=1,V[0]===1}(),ee={decode:function(A,V){if(!C)throw"Big endian system is not supported.";V=V||{};var b=V.inputOffset||0,Y=new Uint8Array(A,b,10),n=String.fromCharCode.apply(null,Y),e,r;if(n.trim()==="CntZImage")e=D,r=1;else if(n.substring(0,5)==="Lerc2")e=ae,r=2;else throw"Unexpected file identifier string: "+n;for(var a=0,t=A.byteLength-10,i,o=[],s,u,m={width:0,height:0,pixels:[],pixelType:V.pixelType,mask:null,statistics:[]};b<t;){var l=e.decode(A,{inputOffset:b,encodedMaskData:i,maskData:u,returnMask:a===0,returnEncodedMask:a===0,returnFileInfo:!0,pixelType:V.pixelType||null,noDataValue:V.noDataValue||null});b=l.fileInfo.eofOffset,a===0&&(i=l.encodedMaskData,u=l.maskData,m.width=l.width,m.height=l.height,m.dimCount=l.dimCount||1,m.pixelType=l.pixelType||l.fileInfo.pixelType,m.mask=l.maskData),r>1&&l.fileInfo.mask&&l.fileInfo.mask.numBytes>0&&o.push(l.maskData),a++,m.pixels.push(l.pixelData),m.statistics.push({minValue:l.minValue,maxValue:l.maxValue,noDataValue:l.noDataValue,dimStats:l.dimStats})}var f,h,c;if(r>1&&o.length>1){for(c=m.width*m.height,m.bandMasks=o,u=new Uint8Array(c),u.set(o[0]),f=1;f<o.length;f++)for(s=o[f],h=0;h<c;h++)u[h]=u[h]&s[h];m.maskData=u}return m}};typeof define=="function"&&define.amd?define([],function(){return ee}):typeof Ue<"u"&&Ue.exports?Ue.exports=ee:this.Lerc=ee})()});var xr={NONE:0,LERC:1},fr=Object.freeze(xr);var G={};G.DEFAULT_STRUCTURE=Object.freeze({heightScale:1,heightOffset:0,elementsPerHeight:1,stride:1,elementMultiplier:256,isBigEndian:!1});var He=new re,Ur=new Ie,Tr=new re,kr=new re;G.computeVertices=function(D){if(!W(D)||!W(D.heightmap))throw new me("options.heightmap is required.");if(!W(D.width)||!W(D.height))throw new me("options.width and options.height are required.");if(!W(D.nativeRectangle))throw new me("options.nativeRectangle is required.");if(!W(D.skirtHeight))throw new me("options.skirtHeight is required.");let ae=Math.cos,C=Math.sin,ee=Math.sqrt,A=Math.atan,V=Math.exp,b=he.PI_OVER_TWO,Y=he.toRadians,n=D.heightmap,e=D.width,r=D.height,a=D.skirtHeight,t=a>0,i=D.isGeographic??!0,o=D.ellipsoid??pe.default,s=1/o.maximumRadius,u=ne.clone(D.nativeRectangle),m=ne.clone(D.rectangle),l,f,h,c;W(m)?(l=m.west,f=m.south,h=m.east,c=m.north):i?(l=Y(u.west),f=Y(u.south),h=Y(u.east),c=Y(u.north)):(l=u.west*s,f=b-2*A(V(-u.south*s)),h=u.east*s,c=b-2*A(V(-u.north*s)));let g=D.relativeToCenter,v=W(g);g=v?g:re.ZERO;let U=D.includeWebMercatorT??!1,M=D.exaggeration??1,S=D.exaggerationRelativeHeight??0,k=M!==1,w=D.structure??G.DEFAULT_STRUCTURE,d=w.heightScale??G.DEFAULT_STRUCTURE.heightScale,x=w.heightOffset??G.DEFAULT_STRUCTURE.heightOffset,T=w.elementsPerHeight??G.DEFAULT_STRUCTURE.elementsPerHeight,y=w.stride??G.DEFAULT_STRUCTURE.stride,p=w.elementMultiplier??G.DEFAULT_STRUCTURE.elementMultiplier,L=w.isBigEndian??G.DEFAULT_STRUCTURE.isBigEndian,B=ne.computeWidth(u),E=ne.computeHeight(u),O=B/(e-1),F=E/(r-1);i||(B*=s,E*=s);let N=o.radiiSquared,_=N.x,Te=N.y,ke=N.z,Q=65536,z=-65536,le=er.eastNorthUpToFixedFrame(g,o),ie=Ie.inverseTransformation(le,Ur),Z,j;U&&(Z=xe.geodeticLatitudeToMercatorAngle(f),j=1/(xe.geodeticLatitudeToMercatorAngle(c)-Z));let se=Tr;se.x=Number.POSITIVE_INFINITY,se.y=Number.POSITIVE_INFINITY,se.z=Number.POSITIVE_INFINITY;let fe=kr;fe.x=Number.NEGATIVE_INFINITY,fe.y=Number.NEGATIVE_INFINITY,fe.z=Number.NEGATIVE_INFINITY;let ye=Number.POSITIVE_INFINITY,ue=e*r,cr=a>0?e*2+r*2:0,te=ue+cr,ge=new Array(te),Ye=new Array(te),Xe=new Array(te),_e=U?new Array(te):[],ze=k?new Array(te):[],Me=0,Se=r,Ve=0,De=e;t&&(--Me,++Se,--Ve,++De);let ve=1e-5;for(let H=Me;H<Se;++H){let J=H;J<0&&(J=0),J>=r&&(J=r-1);let q=u.north-F*J;i?q=Y(q):q=b-2*A(V(-q*s));let Ee=(q-f)/(c-f);Ee=he.clamp(Ee,0,1);let de=H===Me,we=H===Se-1;a>0&&(de?q+=ve*E:we&&(q-=ve*E));let Ge=ae(q),Le=C(q),Qe=ke*Le,Je;U&&(Je=(xe.geodeticLatitudeToMercatorAngle(q)-Z)*j);for(let ce=Ve;ce<De;++ce){let K=ce;K<0&&(K=0),K>=e&&(K=e-1);let Be=J*(e*y)+K*y,R;if(T===1)R=n[Be];else{R=0;let X;if(L)for(X=0;X<T;++X)R=R*p+n[Be+X];else for(X=T-1;X>=0;--X)R=R*p+n[Be+X]}R=R*d+x,z=Math.max(z,R),Q=Math.min(Q,R);let $=u.west+O*K;i?$=Y($):$=$*s;let Fe=($-l)/(h-l);Fe=he.clamp(Fe,0,1);let P=J*e+K;if(a>0){let X=ce===Ve,Oe=ce===De-1,wr=de||we||X||Oe;if((de||we)&&(X||Oe))continue;wr&&(R-=a,X?(P=ue+(r-J-1),$-=ve*B):we?P=ue+r+(e-K-1):Oe?(P=ue+r+e+J,$+=ve*B):de&&(P=ue+r+e+r+K))}let be=Ge*ae($),Ne=Ge*C($),Ke=_*be,$e=Te*Ne,Ce=1/ee(Ke*be+$e*Ne+Qe*Le),gr=Ke*Ce,vr=$e*Ce,dr=Qe*Ce,oe=new re;oe.x=gr+be*R,oe.y=vr+Ne*R,oe.z=dr+Le*R,Ie.multiplyByPoint(ie,oe,He),re.minimumByComponent(He,se,se),re.maximumByComponent(He,fe,fe),ye=Math.min(ye,R),ge[P]=oe,Xe[P]=new Pe(Fe,Ee),Ye[P]=R,U&&(_e[P]=Je),k&&(ze[P]=o.geodeticSurfaceNormal(oe))}}let mr=rr.fromPoints(ge),Ze;W(m)&&(Ze=nr.fromRectangle(m,Q,z,o));let je;v&&(je=new ar(o).computeHorizonCullingPointPossiblyUnderEllipsoid(g,ge,Q));let hr=new tr(se,fe,g),Ae=new sr(g,hr,ye,z,le,!1,U,k,M,S),qe=new Float32Array(te*Ae.stride),We=0;for(let H=0;H<te;++H)We=Ae.encode(qe,We,ge[H],Xe[H],Ye[H],void 0,_e[H],ze[H]);return{vertices:qe,maximumHeight:z,minimumHeight:Q,encoding:Ae,boundingSphere3D:mr,orientedBoundingBox:Ze,occludeePointInScaledSpace:je}};var or=G;var ur=Ir(lr(),1);function yr(D,ae){if(D.encoding===fr.LERC){let A;try{A=ur.default.decode(D.heightmap)}catch(b){throw new Re(b)}if(A.statistics[0].minValue===Number.MAX_VALUE)throw new Re("Invalid tile data");D.heightmap=A.pixels[0],D.width=A.width,D.height=A.height}D.ellipsoid=pe.clone(D.ellipsoid),D.rectangle=ne.clone(D.rectangle);let C=or.computeVertices(D),ee=C.vertices;return ae.push(ee.buffer),{vertices:ee.buffer,numberOfAttributes:C.encoding.stride,minimumHeight:C.minimumHeight,maximumHeight:C.maximumHeight,gridWidth:D.width,gridHeight:D.height,boundingSphere3D:C.boundingSphere3D,orientedBoundingBox:C.orientedBoundingBox,occludeePointInScaledSpace:C.occludeePointInScaledSpace,encoding:C.encoding,westIndicesSouthToNorth:C.westIndicesSouthToNorth,southIndicesEastToWest:C.southIndicesEastToWest,eastIndicesNorthToSouth:C.eastIndicesNorthToSouth,northIndicesWestToEast:C.northIndicesWestToEast}}var Kr=ir(yr);export{Kr as default};