@pggis/pg-sdk 3.3.10 → 4.3.3

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