@scoova/mgl 1.0.0

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 (565) hide show
  1. package/LICENSE.txt +116 -0
  2. package/README.md +174 -0
  3. package/build/banner.ts +12 -0
  4. package/build/bump-version-changelog.js +26 -0
  5. package/build/check-bundle-size.js +77 -0
  6. package/build/generate-dist-package.js +26 -0
  7. package/build/generate-doc-images.ts +78 -0
  8. package/build/generate-docs.ts +190 -0
  9. package/build/generate-shaders.ts +68 -0
  10. package/build/generate-struct-arrays.ts +438 -0
  11. package/build/generate-style-code.ts +283 -0
  12. package/build/readme.md +56 -0
  13. package/build/release-notes.js +45 -0
  14. package/build/rollup/bundle_prelude.js +29 -0
  15. package/build/rollup/maplibregl.js +22 -0
  16. package/build/rollup_plugins.ts +58 -0
  17. package/dist/LICENSE.txt +116 -0
  18. package/dist/maplibre-gl.css +1 -0
  19. package/dist/maplibre-gl.d.ts +13304 -0
  20. package/dist/maplibre-gl.js +59 -0
  21. package/dist/maplibre-gl.js.map +1 -0
  22. package/dist/package.json +1 -0
  23. package/package.json +192 -0
  24. package/src/css/maplibre-gl.css +854 -0
  25. package/src/css/svg/maplibregl-ctrl-attrib.svg +3 -0
  26. package/src/css/svg/maplibregl-ctrl-compass.svg +4 -0
  27. package/src/css/svg/maplibregl-ctrl-fullscreen.svg +3 -0
  28. package/src/css/svg/maplibregl-ctrl-geolocate.svg +5 -0
  29. package/src/css/svg/maplibregl-ctrl-logo.svg +11 -0
  30. package/src/css/svg/maplibregl-ctrl-shrink.svg +3 -0
  31. package/src/css/svg/maplibregl-ctrl-terrain.svg +3 -0
  32. package/src/css/svg/maplibregl-ctrl-zoom-in.svg +3 -0
  33. package/src/css/svg/maplibregl-ctrl-zoom-out.svg +3 -0
  34. package/src/data/array_types.g.ts +1130 -0
  35. package/src/data/bucket/circle_attributes.ts +8 -0
  36. package/src/data/bucket/circle_bucket.ts +197 -0
  37. package/src/data/bucket/fill_attributes.ts +8 -0
  38. package/src/data/bucket/fill_bucket.test.ts +95 -0
  39. package/src/data/bucket/fill_bucket.ts +228 -0
  40. package/src/data/bucket/fill_extrusion_attributes.ts +13 -0
  41. package/src/data/bucket/fill_extrusion_bucket.ts +305 -0
  42. package/src/data/bucket/heatmap_bucket.ts +12 -0
  43. package/src/data/bucket/line_attributes.ts +8 -0
  44. package/src/data/bucket/line_attributes_ext.ts +8 -0
  45. package/src/data/bucket/line_bucket.test.ts +142 -0
  46. package/src/data/bucket/line_bucket.ts +592 -0
  47. package/src/data/bucket/pattern_attributes.ts +9 -0
  48. package/src/data/bucket/pattern_bucket_features.ts +57 -0
  49. package/src/data/bucket/symbol_attributes.ts +122 -0
  50. package/src/data/bucket/symbol_bucket.test.ts +243 -0
  51. package/src/data/bucket/symbol_bucket.ts +975 -0
  52. package/src/data/bucket.ts +123 -0
  53. package/src/data/dem_data.test.ts +237 -0
  54. package/src/data/dem_data.ts +171 -0
  55. package/src/data/evaluation_feature.ts +18 -0
  56. package/src/data/extent.ts +13 -0
  57. package/src/data/feature_index.ts +337 -0
  58. package/src/data/feature_position_map.test.ts +33 -0
  59. package/src/data/feature_position_map.ts +126 -0
  60. package/src/data/index_array_type.ts +9 -0
  61. package/src/data/load_geometry.test.ts +49 -0
  62. package/src/data/load_geometry.ts +44 -0
  63. package/src/data/pos3d_attributes.ts +5 -0
  64. package/src/data/pos_attributes.ts +5 -0
  65. package/src/data/program_configuration.ts +735 -0
  66. package/src/data/raster_bounds_attributes.ts +6 -0
  67. package/src/data/segment.ts +89 -0
  68. package/src/geo/edge_insets.test.ts +83 -0
  69. package/src/geo/edge_insets.ts +146 -0
  70. package/src/geo/lng_lat.test.ts +65 -0
  71. package/src/geo/lng_lat.ts +169 -0
  72. package/src/geo/lng_lat_bounds.test.ts +357 -0
  73. package/src/geo/lng_lat_bounds.ts +356 -0
  74. package/src/geo/mercator_coordinate.test.ts +34 -0
  75. package/src/geo/mercator_coordinate.ts +157 -0
  76. package/src/geo/projection/projection.ts +72 -0
  77. package/src/geo/transform.test.ts +509 -0
  78. package/src/geo/transform.ts +1072 -0
  79. package/src/gl/color_mode.ts +31 -0
  80. package/src/gl/context.ts +321 -0
  81. package/src/gl/cull_face_mode.ts +22 -0
  82. package/src/gl/depth_mode.ts +26 -0
  83. package/src/gl/framebuffer.ts +48 -0
  84. package/src/gl/index_buffer.ts +55 -0
  85. package/src/gl/render_pool.test.ts +69 -0
  86. package/src/gl/render_pool.ts +93 -0
  87. package/src/gl/state.test.ts +125 -0
  88. package/src/gl/stencil_mode.ts +27 -0
  89. package/src/gl/types.ts +59 -0
  90. package/src/gl/value.ts +534 -0
  91. package/src/gl/vertex_buffer.test.ts +57 -0
  92. package/src/gl/vertex_buffer.ts +111 -0
  93. package/src/gl/webgl2.ts +12 -0
  94. package/src/index.test.ts +121 -0
  95. package/src/index.ts +250 -0
  96. package/src/render/draw_background.ts +53 -0
  97. package/src/render/draw_circle.ts +113 -0
  98. package/src/render/draw_collision_debug.ts +168 -0
  99. package/src/render/draw_custom.test.ts +73 -0
  100. package/src/render/draw_custom.ts +45 -0
  101. package/src/render/draw_debug.test.ts +122 -0
  102. package/src/render/draw_debug.ts +148 -0
  103. package/src/render/draw_fill.test.ts +137 -0
  104. package/src/render/draw_fill.ts +128 -0
  105. package/src/render/draw_fill_extrusion.ts +97 -0
  106. package/src/render/draw_heatmap.ts +228 -0
  107. package/src/render/draw_hillshade.ts +119 -0
  108. package/src/render/draw_line.ts +125 -0
  109. package/src/render/draw_raster.ts +133 -0
  110. package/src/render/draw_sky.ts +44 -0
  111. package/src/render/draw_symbol.test.ts +223 -0
  112. package/src/render/draw_symbol.ts +499 -0
  113. package/src/render/draw_terrain.ts +99 -0
  114. package/src/render/glyph_atlas.ts +83 -0
  115. package/src/render/glyph_manager.test.ts +147 -0
  116. package/src/render/glyph_manager.ts +198 -0
  117. package/src/render/image_atlas.ts +159 -0
  118. package/src/render/image_manager.ts +337 -0
  119. package/src/render/line_atlas.test.ts +38 -0
  120. package/src/render/line_atlas.ts +214 -0
  121. package/src/render/mesh.ts +25 -0
  122. package/src/render/painter.test.ts +51 -0
  123. package/src/render/painter.ts +666 -0
  124. package/src/render/program/background_program.ts +100 -0
  125. package/src/render/program/circle_program.ts +61 -0
  126. package/src/render/program/clipping_mask_program.ts +19 -0
  127. package/src/render/program/collision_program.ts +47 -0
  128. package/src/render/program/debug_program.ts +29 -0
  129. package/src/render/program/fill_extrusion_program.ts +120 -0
  130. package/src/render/program/fill_program.ts +121 -0
  131. package/src/render/program/heatmap_program.ts +76 -0
  132. package/src/render/program/hillshade_program.ts +116 -0
  133. package/src/render/program/line_program.ts +207 -0
  134. package/src/render/program/pattern.ts +102 -0
  135. package/src/render/program/program_uniforms.ts +46 -0
  136. package/src/render/program/raster_program.ts +88 -0
  137. package/src/render/program/sky_program.ts +28 -0
  138. package/src/render/program/symbol_program.ts +266 -0
  139. package/src/render/program/terrain_program.ts +116 -0
  140. package/src/render/program.ts +233 -0
  141. package/src/render/render_to_texture.test.ts +151 -0
  142. package/src/render/render_to_texture.ts +197 -0
  143. package/src/render/terrain.test.ts +322 -0
  144. package/src/render/terrain.ts +464 -0
  145. package/src/render/texture.ts +114 -0
  146. package/src/render/uniform_binding.test.ts +122 -0
  147. package/src/render/uniform_binding.ts +157 -0
  148. package/src/render/update_pattern_positions_in_program.test.ts +74 -0
  149. package/src/render/update_pattern_positions_in_program.ts +50 -0
  150. package/src/render/vertex_array_object.ts +163 -0
  151. package/src/shaders/README.md +42 -0
  152. package/src/shaders/_prelude.fragment.glsl +19 -0
  153. package/src/shaders/_prelude.fragment.glsl.g.ts +2 -0
  154. package/src/shaders/_prelude.vertex.glsl +148 -0
  155. package/src/shaders/_prelude.vertex.glsl.g.ts +2 -0
  156. package/src/shaders/background.fragment.glsl +10 -0
  157. package/src/shaders/background.fragment.glsl.g.ts +2 -0
  158. package/src/shaders/background.vertex.glsl +7 -0
  159. package/src/shaders/background.vertex.glsl.g.ts +2 -0
  160. package/src/shaders/background_pattern.fragment.glsl +28 -0
  161. package/src/shaders/background_pattern.fragment.glsl.g.ts +2 -0
  162. package/src/shaders/background_pattern.vertex.glsl +19 -0
  163. package/src/shaders/background_pattern.vertex.glsl.g.ts +2 -0
  164. package/src/shaders/circle.fragment.glsl +34 -0
  165. package/src/shaders/circle.fragment.glsl.g.ts +2 -0
  166. package/src/shaders/circle.vertex.glsl +68 -0
  167. package/src/shaders/circle.vertex.glsl.g.ts +2 -0
  168. package/src/shaders/clipping_mask.fragment.glsl +3 -0
  169. package/src/shaders/clipping_mask.fragment.glsl.g.ts +2 -0
  170. package/src/shaders/clipping_mask.vertex.glsl +7 -0
  171. package/src/shaders/clipping_mask.vertex.glsl.g.ts +2 -0
  172. package/src/shaders/collision_box.fragment.glsl +20 -0
  173. package/src/shaders/collision_box.fragment.glsl.g.ts +2 -0
  174. package/src/shaders/collision_box.vertex.glsl +27 -0
  175. package/src/shaders/collision_box.vertex.glsl.g.ts +2 -0
  176. package/src/shaders/collision_circle.fragment.glsl +17 -0
  177. package/src/shaders/collision_circle.fragment.glsl.g.ts +2 -0
  178. package/src/shaders/collision_circle.vertex.glsl +59 -0
  179. package/src/shaders/collision_circle.vertex.glsl.g.ts +2 -0
  180. package/src/shaders/debug.fragment.glsl +9 -0
  181. package/src/shaders/debug.fragment.glsl.g.ts +2 -0
  182. package/src/shaders/debug.vertex.glsl +12 -0
  183. package/src/shaders/debug.vertex.glsl.g.ts +2 -0
  184. package/src/shaders/encode_attribute.test.ts +11 -0
  185. package/src/shaders/encode_attribute.ts +13 -0
  186. package/src/shaders/fill.fragment.glsl +13 -0
  187. package/src/shaders/fill.fragment.glsl.g.ts +2 -0
  188. package/src/shaders/fill.vertex.glsl +13 -0
  189. package/src/shaders/fill.vertex.glsl.g.ts +2 -0
  190. package/src/shaders/fill_extrusion.fragment.glsl +9 -0
  191. package/src/shaders/fill_extrusion.fragment.glsl.g.ts +2 -0
  192. package/src/shaders/fill_extrusion.vertex.glsl +84 -0
  193. package/src/shaders/fill_extrusion.vertex.glsl.g.ts +2 -0
  194. package/src/shaders/fill_extrusion_pattern.fragment.glsl +47 -0
  195. package/src/shaders/fill_extrusion_pattern.fragment.glsl.g.ts +2 -0
  196. package/src/shaders/fill_extrusion_pattern.vertex.glsl +96 -0
  197. package/src/shaders/fill_extrusion_pattern.vertex.glsl.g.ts +2 -0
  198. package/src/shaders/fill_outline.fragment.glsl +17 -0
  199. package/src/shaders/fill_outline.fragment.glsl.g.ts +2 -0
  200. package/src/shaders/fill_outline.vertex.glsl +17 -0
  201. package/src/shaders/fill_outline.vertex.glsl.g.ts +2 -0
  202. package/src/shaders/fill_outline_pattern.fragment.glsl +43 -0
  203. package/src/shaders/fill_outline_pattern.fragment.glsl.g.ts +2 -0
  204. package/src/shaders/fill_outline_pattern.vertex.glsl +44 -0
  205. package/src/shaders/fill_outline_pattern.vertex.glsl.g.ts +2 -0
  206. package/src/shaders/fill_pattern.fragment.glsl +39 -0
  207. package/src/shaders/fill_pattern.fragment.glsl.g.ts +2 -0
  208. package/src/shaders/fill_pattern.vertex.glsl +39 -0
  209. package/src/shaders/fill_pattern.vertex.glsl.g.ts +2 -0
  210. package/src/shaders/heatmap.fragment.glsl +22 -0
  211. package/src/shaders/heatmap.fragment.glsl.g.ts +2 -0
  212. package/src/shaders/heatmap.vertex.glsl +54 -0
  213. package/src/shaders/heatmap.vertex.glsl.g.ts +2 -0
  214. package/src/shaders/heatmap_texture.fragment.glsl +15 -0
  215. package/src/shaders/heatmap_texture.fragment.glsl.g.ts +2 -0
  216. package/src/shaders/heatmap_texture.vertex.glsl +11 -0
  217. package/src/shaders/heatmap_texture.vertex.glsl.g.ts +2 -0
  218. package/src/shaders/hillshade.fragment.glsl +52 -0
  219. package/src/shaders/hillshade.fragment.glsl.g.ts +2 -0
  220. package/src/shaders/hillshade.vertex.glsl +11 -0
  221. package/src/shaders/hillshade.vertex.glsl.g.ts +2 -0
  222. package/src/shaders/hillshade_prepare.fragment.glsl +77 -0
  223. package/src/shaders/hillshade_prepare.fragment.glsl.g.ts +2 -0
  224. package/src/shaders/hillshade_prepare.vertex.glsl +15 -0
  225. package/src/shaders/hillshade_prepare.vertex.glsl.g.ts +2 -0
  226. package/src/shaders/line.fragment.glsl +30 -0
  227. package/src/shaders/line.fragment.glsl.g.ts +2 -0
  228. package/src/shaders/line.vertex.glsl +89 -0
  229. package/src/shaders/line.vertex.glsl.g.ts +2 -0
  230. package/src/shaders/line_gradient.fragment.glsl +34 -0
  231. package/src/shaders/line_gradient.fragment.glsl.g.ts +2 -0
  232. package/src/shaders/line_gradient.vertex.glsl +92 -0
  233. package/src/shaders/line_gradient.vertex.glsl.g.ts +2 -0
  234. package/src/shaders/line_pattern.fragment.glsl +77 -0
  235. package/src/shaders/line_pattern.fragment.glsl.g.ts +2 -0
  236. package/src/shaders/line_pattern.vertex.glsl +103 -0
  237. package/src/shaders/line_pattern.vertex.glsl.g.ts +2 -0
  238. package/src/shaders/line_sdf.fragment.glsl +45 -0
  239. package/src/shaders/line_sdf.fragment.glsl.g.ts +2 -0
  240. package/src/shaders/line_sdf.vertex.glsl +101 -0
  241. package/src/shaders/line_sdf.vertex.glsl.g.ts +2 -0
  242. package/src/shaders/raster.fragment.glsl +53 -0
  243. package/src/shaders/raster.fragment.glsl.g.ts +2 -0
  244. package/src/shaders/raster.vertex.glsl +21 -0
  245. package/src/shaders/raster.vertex.glsl.g.ts +2 -0
  246. package/src/shaders/shaders.ts +197 -0
  247. package/src/shaders/sky.fragment.glsl +17 -0
  248. package/src/shaders/sky.fragment.glsl.g.ts +2 -0
  249. package/src/shaders/sky.vertex.glsl +5 -0
  250. package/src/shaders/sky.vertex.glsl.g.ts +2 -0
  251. package/src/shaders/symbol_icon.fragment.glsl +17 -0
  252. package/src/shaders/symbol_icon.fragment.glsl.g.ts +2 -0
  253. package/src/shaders/symbol_icon.vertex.glsl +117 -0
  254. package/src/shaders/symbol_icon.vertex.glsl.g.ts +2 -0
  255. package/src/shaders/symbol_sdf.fragment.glsl +58 -0
  256. package/src/shaders/symbol_sdf.fragment.glsl.g.ts +2 -0
  257. package/src/shaders/symbol_sdf.vertex.glsl +142 -0
  258. package/src/shaders/symbol_sdf.vertex.glsl.g.ts +2 -0
  259. package/src/shaders/symbol_text_and_icon.fragment.glsl +68 -0
  260. package/src/shaders/symbol_text_and_icon.fragment.glsl.g.ts +2 -0
  261. package/src/shaders/symbol_text_and_icon.vertex.glsl +140 -0
  262. package/src/shaders/symbol_text_and_icon.vertex.glsl.g.ts +2 -0
  263. package/src/shaders/terrain.fragment.glsl +32 -0
  264. package/src/shaders/terrain.fragment.glsl.g.ts +2 -0
  265. package/src/shaders/terrain.vertex.glsl +17 -0
  266. package/src/shaders/terrain.vertex.glsl.g.ts +2 -0
  267. package/src/shaders/terrain_coords.fragment.glsl +11 -0
  268. package/src/shaders/terrain_coords.fragment.glsl.g.ts +2 -0
  269. package/src/shaders/terrain_coords.vertex.glsl +13 -0
  270. package/src/shaders/terrain_coords.vertex.glsl.g.ts +2 -0
  271. package/src/shaders/terrain_depth.fragment.glsl +15 -0
  272. package/src/shaders/terrain_depth.fragment.glsl.g.ts +2 -0
  273. package/src/shaders/terrain_depth.vertex.glsl +13 -0
  274. package/src/shaders/terrain_depth.vertex.glsl.g.ts +2 -0
  275. package/src/source/canvas_source.test.ts +210 -0
  276. package/src/source/canvas_source.ts +227 -0
  277. package/src/source/geojson_source.test.ts +492 -0
  278. package/src/source/geojson_source.ts +431 -0
  279. package/src/source/geojson_source_diff.test.ts +364 -0
  280. package/src/source/geojson_source_diff.ts +172 -0
  281. package/src/source/geojson_worker_source.test.ts +399 -0
  282. package/src/source/geojson_worker_source.ts +303 -0
  283. package/src/source/geojson_wrapper.test.ts +32 -0
  284. package/src/source/geojson_wrapper.ts +81 -0
  285. package/src/source/image_source.test.ts +235 -0
  286. package/src/source/image_source.ts +338 -0
  287. package/src/source/load_tilejson.ts +47 -0
  288. package/src/source/pixels_to_tile_units.ts +25 -0
  289. package/src/source/protocol_crud.ts +48 -0
  290. package/src/source/query_features.test.ts +31 -0
  291. package/src/source/query_features.ts +252 -0
  292. package/src/source/raster_dem_tile_source.test.ts +158 -0
  293. package/src/source/raster_dem_tile_source.ts +166 -0
  294. package/src/source/raster_dem_tile_worker_source.test.ts +36 -0
  295. package/src/source/raster_dem_tile_worker_source.ts +38 -0
  296. package/src/source/raster_tile_source.test.ts +206 -0
  297. package/src/source/raster_tile_source.ts +227 -0
  298. package/src/source/rtl_text_plugin_main_thread.test.ts +170 -0
  299. package/src/source/rtl_text_plugin_main_thread.ts +89 -0
  300. package/src/source/rtl_text_plugin_status.ts +33 -0
  301. package/src/source/rtl_text_plugin_worker.ts +49 -0
  302. package/src/source/source.test.ts +41 -0
  303. package/src/source/source.ts +186 -0
  304. package/src/source/source_cache.test.ts +2069 -0
  305. package/src/source/source_cache.ts +1102 -0
  306. package/src/source/source_state.ts +157 -0
  307. package/src/source/terrain_source_cache.test.ts +105 -0
  308. package/src/source/terrain_source_cache.ts +204 -0
  309. package/src/source/tile.test.ts +290 -0
  310. package/src/source/tile.ts +478 -0
  311. package/src/source/tile_bounds.ts +34 -0
  312. package/src/source/tile_cache.test.ts +130 -0
  313. package/src/source/tile_cache.ts +208 -0
  314. package/src/source/tile_id.test.ts +112 -0
  315. package/src/source/tile_id.ts +221 -0
  316. package/src/source/vector_tile_source.test.ts +401 -0
  317. package/src/source/vector_tile_source.ts +283 -0
  318. package/src/source/vector_tile_worker_source.test.ts +396 -0
  319. package/src/source/vector_tile_worker_source.ts +199 -0
  320. package/src/source/video_source.test.ts +124 -0
  321. package/src/source/video_source.ts +204 -0
  322. package/src/source/worker.test.ts +233 -0
  323. package/src/source/worker.ts +301 -0
  324. package/src/source/worker_source.ts +117 -0
  325. package/src/source/worker_tile.test.ts +226 -0
  326. package/src/source/worker_tile.ts +208 -0
  327. package/src/style/create_style_layer.ts +39 -0
  328. package/src/style/evaluation_parameters.ts +62 -0
  329. package/src/style/format_section_override.test.ts +62 -0
  330. package/src/style/format_section_override.ts +50 -0
  331. package/src/style/light.test.ts +86 -0
  332. package/src/style/light.ts +135 -0
  333. package/src/style/load_glyph_range.test.ts +40 -0
  334. package/src/style/load_glyph_range.ts +32 -0
  335. package/src/style/load_sprite.test.ts +227 -0
  336. package/src/style/load_sprite.ts +71 -0
  337. package/src/style/parse_glyph_pbf.ts +42 -0
  338. package/src/style/pauseable_placement.ts +138 -0
  339. package/src/style/properties.ts +726 -0
  340. package/src/style/query_utils.test.ts +107 -0
  341. package/src/style/query_utils.ts +70 -0
  342. package/src/style/sky.ts +127 -0
  343. package/src/style/style.test.ts +2654 -0
  344. package/src/style/style.ts +1814 -0
  345. package/src/style/style_glyph.ts +25 -0
  346. package/src/style/style_image.ts +188 -0
  347. package/src/style/style_layer/background_style_layer.ts +17 -0
  348. package/src/style/style_layer/background_style_layer_properties.g.ts +40 -0
  349. package/src/style/style_layer/circle_style_layer.ts +98 -0
  350. package/src/style/style_layer/circle_style_layer_properties.g.ts +76 -0
  351. package/src/style/style_layer/custom_style_layer.ts +233 -0
  352. package/src/style/style_layer/fill_extrusion_style_layer.ts +224 -0
  353. package/src/style/style_layer/fill_extrusion_style_layer_properties.g.ts +55 -0
  354. package/src/style/style_layer/fill_style_layer.test.ts +37 -0
  355. package/src/style/style_layer/fill_style_layer.ts +65 -0
  356. package/src/style/style_layer/fill_style_layer_properties.g.ts +64 -0
  357. package/src/style/style_layer/heatmap_style_layer.ts +74 -0
  358. package/src/style/style_layer/heatmap_style_layer_properties.g.ts +46 -0
  359. package/src/style/style_layer/hillshade_style_layer.ts +21 -0
  360. package/src/style/style_layer/hillshade_style_layer_properties.g.ts +49 -0
  361. package/src/style/style_layer/line_style_layer.test.ts +50 -0
  362. package/src/style/style_layer/line_style_layer.ts +131 -0
  363. package/src/style/style_layer/line_style_layer_properties.g.ts +88 -0
  364. package/src/style/style_layer/overlap_mode.test.ts +57 -0
  365. package/src/style/style_layer/overlap_mode.ts +25 -0
  366. package/src/style/style_layer/raster_style_layer.ts +17 -0
  367. package/src/style/style_layer/raster_style_layer_properties.g.ts +55 -0
  368. package/src/style/style_layer/symbol_style_layer.ts +195 -0
  369. package/src/style/style_layer/symbol_style_layer_properties.g.ts +218 -0
  370. package/src/style/style_layer/typed_style_layer.ts +9 -0
  371. package/src/style/style_layer/variable_text_anchor.test.ts +117 -0
  372. package/src/style/style_layer/variable_text_anchor.ts +163 -0
  373. package/src/style/style_layer.test.ts +372 -0
  374. package/src/style/style_layer.ts +287 -0
  375. package/src/style/style_layer_index.test.ts +99 -0
  376. package/src/style/style_layer_index.ts +78 -0
  377. package/src/style/validate_style.ts +53 -0
  378. package/src/style/zoom_history.ts +40 -0
  379. package/src/symbol/anchor.test.ts +14 -0
  380. package/src/symbol/anchor.ts +22 -0
  381. package/src/symbol/check_max_angle.test.ts +54 -0
  382. package/src/symbol/check_max_angle.ts +76 -0
  383. package/src/symbol/clip_line.test.ts +154 -0
  384. package/src/symbol/clip_line.ts +66 -0
  385. package/src/symbol/collision_feature.test.ts +98 -0
  386. package/src/symbol/collision_feature.ts +114 -0
  387. package/src/symbol/collision_index.test.ts +19 -0
  388. package/src/symbol/collision_index.ts +618 -0
  389. package/src/symbol/cross_tile_symbol_index.test.ts +260 -0
  390. package/src/symbol/cross_tile_symbol_index.ts +367 -0
  391. package/src/symbol/get_anchors.test.ts +113 -0
  392. package/src/symbol/get_anchors.ts +167 -0
  393. package/src/symbol/grid_index.test.ts +75 -0
  394. package/src/symbol/grid_index.ts +414 -0
  395. package/src/symbol/merge_lines.test.ts +30 -0
  396. package/src/symbol/merge_lines.ts +80 -0
  397. package/src/symbol/one_em.ts +3 -0
  398. package/src/symbol/opacity_state.ts +23 -0
  399. package/src/symbol/path_interpolator.test.ts +134 -0
  400. package/src/symbol/path_interpolator.ts +55 -0
  401. package/src/symbol/placement.ts +1371 -0
  402. package/src/symbol/projection.test.ts +171 -0
  403. package/src/symbol/projection.ts +833 -0
  404. package/src/symbol/quads.test.ts +157 -0
  405. package/src/symbol/quads.ts +349 -0
  406. package/src/symbol/shaping.test.ts +360 -0
  407. package/src/symbol/shaping.ts +911 -0
  408. package/src/symbol/symbol_layout.ts +739 -0
  409. package/src/symbol/symbol_size.ts +129 -0
  410. package/src/symbol/symbol_style_layer.test.ts +103 -0
  411. package/src/symbol/transform_text.ts +27 -0
  412. package/src/ui/anchor.ts +27 -0
  413. package/src/ui/camera.test.ts +2301 -0
  414. package/src/ui/camera.ts +1520 -0
  415. package/src/ui/control/attribution_control.test.ts +543 -0
  416. package/src/ui/control/attribution_control.ts +209 -0
  417. package/src/ui/control/control.ts +67 -0
  418. package/src/ui/control/fullscreen_control.test.ts +114 -0
  419. package/src/ui/control/fullscreen_control.ts +189 -0
  420. package/src/ui/control/geolocate_control.test.ts +619 -0
  421. package/src/ui/control/geolocate_control.ts +725 -0
  422. package/src/ui/control/logo_control.test.ts +88 -0
  423. package/src/ui/control/logo_control.ts +86 -0
  424. package/src/ui/control/navigation_control.test.ts +238 -0
  425. package/src/ui/control/navigation_control.ts +294 -0
  426. package/src/ui/control/scale_control.test.ts +52 -0
  427. package/src/ui/control/scale_control.ts +152 -0
  428. package/src/ui/control/terrain_control.test.ts +58 -0
  429. package/src/ui/control/terrain_control.ts +74 -0
  430. package/src/ui/default_locale.ts +25 -0
  431. package/src/ui/events.ts +758 -0
  432. package/src/ui/handler/box_zoom.test.ts +163 -0
  433. package/src/ui/handler/box_zoom.ts +171 -0
  434. package/src/ui/handler/click_zoom.ts +55 -0
  435. package/src/ui/handler/cooperative_gestures.test.ts +338 -0
  436. package/src/ui/handler/cooperative_gestures.ts +111 -0
  437. package/src/ui/handler/dblclick_zoom.test.ts +151 -0
  438. package/src/ui/handler/drag_handler.ts +174 -0
  439. package/src/ui/handler/drag_move_state_manager.ts +115 -0
  440. package/src/ui/handler/drag_pan.test.ts +487 -0
  441. package/src/ui/handler/drag_rotate.test.ts +859 -0
  442. package/src/ui/handler/handler_util.ts +10 -0
  443. package/src/ui/handler/keyboard.test.ts +235 -0
  444. package/src/ui/handler/keyboard.ts +212 -0
  445. package/src/ui/handler/map_event.test.ts +158 -0
  446. package/src/ui/handler/map_event.ts +161 -0
  447. package/src/ui/handler/mouse.ts +92 -0
  448. package/src/ui/handler/mouse_handler_interface.test.ts +111 -0
  449. package/src/ui/handler/mouse_rotate.test.ts +62 -0
  450. package/src/ui/handler/one_finger_touch_drag.ts +45 -0
  451. package/src/ui/handler/one_finger_touch_drag_handler_interface.test.ts +77 -0
  452. package/src/ui/handler/scroll_zoom.test.ts +382 -0
  453. package/src/ui/handler/scroll_zoom.ts +379 -0
  454. package/src/ui/handler/shim/dblclick_zoom.ts +64 -0
  455. package/src/ui/handler/shim/drag_pan.ts +104 -0
  456. package/src/ui/handler/shim/drag_rotate.ts +76 -0
  457. package/src/ui/handler/shim/two_fingers_touch.ts +112 -0
  458. package/src/ui/handler/tap_drag_zoom.test.ts +113 -0
  459. package/src/ui/handler/tap_drag_zoom.ts +112 -0
  460. package/src/ui/handler/tap_recognizer.ts +138 -0
  461. package/src/ui/handler/tap_zoom.ts +98 -0
  462. package/src/ui/handler/touch_pan.ts +115 -0
  463. package/src/ui/handler/transform-provider.ts +44 -0
  464. package/src/ui/handler/two_fingers_touch.test.ts +283 -0
  465. package/src/ui/handler/two_fingers_touch.ts +336 -0
  466. package/src/ui/handler_inertia.ts +157 -0
  467. package/src/ui/handler_manager.ts +637 -0
  468. package/src/ui/hash.test.ts +404 -0
  469. package/src/ui/hash.ts +153 -0
  470. package/src/ui/map.ts +3393 -0
  471. package/src/ui/map_tests/map_animation.test.ts +61 -0
  472. package/src/ui/map_tests/map_basic.test.ts +223 -0
  473. package/src/ui/map_tests/map_bounds.test.ts +123 -0
  474. package/src/ui/map_tests/map_calculate_camera_options.test.ts +113 -0
  475. package/src/ui/map_tests/map_canvas.test.ts +59 -0
  476. package/src/ui/map_tests/map_control.test.ts +61 -0
  477. package/src/ui/map_tests/map_disable_handlers.test.ts +38 -0
  478. package/src/ui/map_tests/map_events.test.ts +1001 -0
  479. package/src/ui/map_tests/map_feature_state.test.ts +421 -0
  480. package/src/ui/map_tests/map_images.test.ts +175 -0
  481. package/src/ui/map_tests/map_is_moving.test.ts +164 -0
  482. package/src/ui/map_tests/map_is_rotating.test.ts +62 -0
  483. package/src/ui/map_tests/map_is_zooming.test.ts +86 -0
  484. package/src/ui/map_tests/map_layer.test.ts +457 -0
  485. package/src/ui/map_tests/map_options.test.ts +64 -0
  486. package/src/ui/map_tests/map_pitch.test.ts +90 -0
  487. package/src/ui/map_tests/map_pixel_ratio.test.ts +75 -0
  488. package/src/ui/map_tests/map_query_rendered_features.test.ts +93 -0
  489. package/src/ui/map_tests/map_render.test.ts +90 -0
  490. package/src/ui/map_tests/map_request_render_frame.test.ts +51 -0
  491. package/src/ui/map_tests/map_resize.test.ts +120 -0
  492. package/src/ui/map_tests/map_style.test.ts +541 -0
  493. package/src/ui/map_tests/map_terrian.test.ts +104 -0
  494. package/src/ui/map_tests/map_webgl.test.ts +72 -0
  495. package/src/ui/map_tests/map_world_copies.test.ts +103 -0
  496. package/src/ui/map_tests/map_zoom.test.ts +95 -0
  497. package/src/ui/marker.test.ts +1149 -0
  498. package/src/ui/marker.ts +880 -0
  499. package/src/ui/popup.test.ts +827 -0
  500. package/src/ui/popup.ts +717 -0
  501. package/src/util/abort_error.ts +21 -0
  502. package/src/util/actor.test.ts +218 -0
  503. package/src/util/actor.ts +241 -0
  504. package/src/util/actor_messages.ts +149 -0
  505. package/src/util/ajax.test.ts +237 -0
  506. package/src/util/ajax.ts +297 -0
  507. package/src/util/browser.test.ts +23 -0
  508. package/src/util/browser.ts +63 -0
  509. package/src/util/color_ramp.test.ts +105 -0
  510. package/src/util/color_ramp.ts +56 -0
  511. package/src/util/config.ts +29 -0
  512. package/src/util/dictionary_coder.ts +23 -0
  513. package/src/util/dispatcher.test.ts +76 -0
  514. package/src/util/dispatcher.ts +78 -0
  515. package/src/util/dom.ts +135 -0
  516. package/src/util/evented.test.ts +231 -0
  517. package/src/util/evented.ts +178 -0
  518. package/src/util/find_pole_of_inaccessibility.test.ts +21 -0
  519. package/src/util/find_pole_of_inaccessibility.ts +130 -0
  520. package/src/util/geolocation_support.test.ts +43 -0
  521. package/src/util/geolocation_support.ts +23 -0
  522. package/src/util/global_worker_pool.ts +65 -0
  523. package/src/util/image.ts +150 -0
  524. package/src/util/image_request.test.ts +408 -0
  525. package/src/util/image_request.ts +246 -0
  526. package/src/util/intersection_tests.ts +206 -0
  527. package/src/util/is_char_in_unicode_block.test.ts +15 -0
  528. package/src/util/is_char_in_unicode_block.ts +345 -0
  529. package/src/util/offscreen_canvas_distorted.test.ts +13 -0
  530. package/src/util/offscreen_canvas_distorted.ts +39 -0
  531. package/src/util/offscreen_canvas_supported.ts +11 -0
  532. package/src/util/performance.ts +117 -0
  533. package/src/util/primitives.test.ts +140 -0
  534. package/src/util/primitives.ts +143 -0
  535. package/src/util/request_manager.ts +42 -0
  536. package/src/util/resolve_tokens.test.ts +45 -0
  537. package/src/util/resolve_tokens.ts +17 -0
  538. package/src/util/script_detection.test.ts +138 -0
  539. package/src/util/script_detection.ts +376 -0
  540. package/src/util/smart_wrap.test.ts +97 -0
  541. package/src/util/smart_wrap.ts +58 -0
  542. package/src/util/struct_array.test.ts +101 -0
  543. package/src/util/struct_array.ts +246 -0
  544. package/src/util/style.test.ts +34 -0
  545. package/src/util/style.ts +28 -0
  546. package/src/util/task_queue.test.ts +114 -0
  547. package/src/util/task_queue.ts +64 -0
  548. package/src/util/test/util.ts +185 -0
  549. package/src/util/throttle.test.ts +42 -0
  550. package/src/util/throttle.ts +28 -0
  551. package/src/util/throttled_invoker.ts +41 -0
  552. package/src/util/transferable_grid_index.test.ts +56 -0
  553. package/src/util/transferable_grid_index.ts +214 -0
  554. package/src/util/util.test.ts +414 -0
  555. package/src/util/util.ts +724 -0
  556. package/src/util/vectortile_to_geojson.ts +72 -0
  557. package/src/util/verticalize_punctuation.ts +110 -0
  558. package/src/util/web_worker.ts +16 -0
  559. package/src/util/web_worker_transfer.test.ts +153 -0
  560. package/src/util/web_worker_transfer.ts +254 -0
  561. package/src/util/webp_supported.ts +63 -0
  562. package/src/util/worker_pool.test.ts +43 -0
  563. package/src/util/worker_pool.ts +58 -0
  564. package/src/util/world_bounds.test.ts +59 -0
  565. package/src/util/world_bounds.ts +46 -0
@@ -0,0 +1,724 @@
1
+ import Point from '@mapbox/point-geometry';
2
+ import UnitBezier from '@mapbox/unitbezier';
3
+ import {isOffscreenCanvasDistorted} from './offscreen_canvas_distorted';
4
+ import type {Size} from './image';
5
+ import type {WorkerGlobalScopeInterface} from './web_worker';
6
+
7
+ /**
8
+ * For a given collection of 2D points, returns their axis-aligned bounding box,
9
+ * in the format [minX, minY, maxX, maxY].
10
+ */
11
+ export function getAABB(points: Array<Point>): [number, number, number, number] {
12
+ let tlX = Infinity;
13
+ let tlY = Infinity;
14
+ let brX = -Infinity;
15
+ let brY = -Infinity;
16
+
17
+ for (const p of points) {
18
+ tlX = Math.min(tlX, p.x);
19
+ tlY = Math.min(tlY, p.y);
20
+ brX = Math.max(brX, p.x);
21
+ brY = Math.max(brY, p.y);
22
+ }
23
+
24
+ return [tlX, tlY, brX, brY];
25
+ }
26
+
27
+ /**
28
+ * Given a value `t` that varies between 0 and 1, return
29
+ * an interpolation function that eases between 0 and 1 in a pleasing
30
+ * cubic in-out fashion.
31
+ */
32
+ export function easeCubicInOut(t: number): number {
33
+ if (t <= 0) return 0;
34
+ if (t >= 1) return 1;
35
+ const t2 = t * t,
36
+ t3 = t2 * t;
37
+ return 4 * (t < 0.5 ? t3 : 3 * (t - t2) + t3 - 0.75);
38
+ }
39
+
40
+ /**
41
+ * Given given (x, y), (x1, y1) control points for a bezier curve,
42
+ * return a function that interpolates along that curve.
43
+ *
44
+ * @param p1x - control point 1 x coordinate
45
+ * @param p1y - control point 1 y coordinate
46
+ * @param p2x - control point 2 x coordinate
47
+ * @param p2y - control point 2 y coordinate
48
+ */
49
+ export function bezier(p1x: number, p1y: number, p2x: number, p2y: number): (t: number) => number {
50
+ const bezier = new UnitBezier(p1x, p1y, p2x, p2y);
51
+ return (t: number) => {
52
+ return bezier.solve(t);
53
+ };
54
+ }
55
+
56
+ /**
57
+ * A default bezier-curve powered easing function with
58
+ * control points (0.25, 0.1) and (0.25, 1)
59
+ */
60
+ export const defaultEasing = bezier(0.25, 0.1, 0.25, 1);
61
+
62
+ /**
63
+ * constrain n to the given range via min + max
64
+ *
65
+ * @param n - value
66
+ * @param min - the minimum value to be returned
67
+ * @param max - the maximum value to be returned
68
+ * @returns the clamped value
69
+ */
70
+ export function clamp(n: number, min: number, max: number): number {
71
+ return Math.min(max, Math.max(min, n));
72
+ }
73
+
74
+ /**
75
+ * constrain n to the given range, excluding the minimum, via modular arithmetic
76
+ *
77
+ * @param n - value
78
+ * @param min - the minimum value to be returned, exclusive
79
+ * @param max - the maximum value to be returned, inclusive
80
+ * @returns constrained number
81
+ */
82
+ export function wrap(n: number, min: number, max: number): number {
83
+ const d = max - min;
84
+ const w = ((n - min) % d + d) % d + min;
85
+ return (w === min) ? max : w;
86
+ }
87
+
88
+ /**
89
+ * Compute the difference between the keys in one object and the keys
90
+ * in another object.
91
+ *
92
+ * @returns keys difference
93
+ */
94
+ export function keysDifference<S, T>(
95
+ obj: {[key: string]: S},
96
+ other: {[key: string]: T}
97
+ ): Array<string> {
98
+ const difference = [];
99
+ for (const i in obj) {
100
+ if (!(i in other)) {
101
+ difference.push(i);
102
+ }
103
+ }
104
+ return difference;
105
+ }
106
+
107
+ /**
108
+ * Given a destination object and optionally many source objects,
109
+ * copy all properties from the source objects into the destination.
110
+ * The last source object given overrides properties from previous
111
+ * source objects.
112
+ *
113
+ * @param dest - destination object
114
+ * @param sources - sources from which properties are pulled
115
+ */
116
+ export function extend<T extends {}, U>(dest: T, source: U): T & U;
117
+ export function extend<T extends {}, U, V>(dest: T, source1: U, source2: V): T & U & V;
118
+ export function extend<T extends {}, U, V, W>(dest: T, source1: U, source2: V, source3: W): T & U & V & W;
119
+ export function extend(dest: object, ...sources: Array<any>): any;
120
+ export function extend(dest: object, ...sources: Array<any>): any {
121
+ for (const src of sources) {
122
+ for (const k in src) {
123
+ dest[k] = src[k];
124
+ }
125
+ }
126
+ return dest;
127
+ }
128
+
129
+ // See https://stackoverflow.com/questions/49401866/all-possible-keys-of-an-union-type
130
+ type KeysOfUnion<T> = T extends T ? keyof T: never;
131
+
132
+ /**
133
+ * Given an object and a number of properties as strings, return version
134
+ * of that object with only those properties.
135
+ *
136
+ * @param src - the object
137
+ * @param properties - an array of property names chosen
138
+ * to appear on the resulting object.
139
+ * @returns object with limited properties.
140
+ * @example
141
+ * ```ts
142
+ * let foo = { name: 'Charlie', age: 10 };
143
+ * let justName = pick(foo, ['name']); // justName = { name: 'Charlie' }
144
+ * ```
145
+ */
146
+ export function pick<T extends object>(src: T, properties: Array<KeysOfUnion<T>>): Partial<T> {
147
+ const result: Partial<T> = {};
148
+ for (let i = 0; i < properties.length; i++) {
149
+ const k = properties[i];
150
+ if (k in src) {
151
+ result[k] = src[k];
152
+ }
153
+ }
154
+ return result;
155
+ }
156
+
157
+ let id = 1;
158
+
159
+ /**
160
+ * Return a unique numeric id, starting at 1 and incrementing with
161
+ * each call.
162
+ *
163
+ * @returns unique numeric id.
164
+ */
165
+ export function uniqueId(): number {
166
+ return id++;
167
+ }
168
+
169
+ /**
170
+ * Return whether a given value is a power of two
171
+ */
172
+ export function isPowerOfTwo(value: number): boolean {
173
+ return (Math.log(value) / Math.LN2) % 1 === 0;
174
+ }
175
+
176
+ /**
177
+ * Return the next power of two, or the input value if already a power of two
178
+ */
179
+ export function nextPowerOfTwo(value: number): number {
180
+ if (value <= 1) return 1;
181
+ return Math.pow(2, Math.ceil(Math.log(value) / Math.LN2));
182
+ }
183
+
184
+ /**
185
+ * Create an object by mapping all the values of an existing object while
186
+ * preserving their keys.
187
+ */
188
+ export function mapObject(input: any, iterator: Function, context?: any): any {
189
+ const output = {};
190
+ for (const key in input) {
191
+ output[key] = iterator.call(context || this, input[key], key, input);
192
+ }
193
+ return output;
194
+ }
195
+
196
+ /**
197
+ * Create an object by filtering out values of an existing object.
198
+ */
199
+ export function filterObject(input: any, iterator: Function, context?: any): any {
200
+ const output = {};
201
+ for (const key in input) {
202
+ if (iterator.call(context || this, input[key], key, input)) {
203
+ output[key] = input[key];
204
+ }
205
+ }
206
+ return output;
207
+ }
208
+
209
+ /**
210
+ * Deeply compares two object literals.
211
+ * @param a - first object literal to be compared
212
+ * @param b - second object literal to be compared
213
+ * @returns true if the two object literals are deeply equal, false otherwise
214
+ */
215
+ export function deepEqual(a?: unknown | null, b?: unknown | null): boolean {
216
+ if (Array.isArray(a)) {
217
+ if (!Array.isArray(b) || a.length !== b.length) return false;
218
+ for (let i = 0; i < a.length; i++) {
219
+ if (!deepEqual(a[i], b[i])) return false;
220
+ }
221
+ return true;
222
+ }
223
+ if (typeof a === 'object' && a !== null && b !== null) {
224
+ if (!(typeof b === 'object')) return false;
225
+ const keys = Object.keys(a);
226
+ if (keys.length !== Object.keys(b).length) return false;
227
+ for (const key in a) {
228
+ if (!deepEqual(a[key], b[key])) return false;
229
+ }
230
+ return true;
231
+ }
232
+ return a === b;
233
+ }
234
+
235
+ /**
236
+ * Deeply clones two objects.
237
+ */
238
+ export function clone<T>(input: T): T {
239
+ if (Array.isArray(input)) {
240
+ return input.map(clone) as any as T;
241
+ } else if (typeof input === 'object' && input) {
242
+ return mapObject(input, clone) as any as T;
243
+ } else {
244
+ return input;
245
+ }
246
+ }
247
+
248
+ /**
249
+ * Check if two arrays have at least one common element.
250
+ */
251
+ export function arraysIntersect<T>(a: Array<T>, b: Array<T>): boolean {
252
+ for (let l = 0; l < a.length; l++) {
253
+ if (b.indexOf(a[l]) >= 0) return true;
254
+ }
255
+ return false;
256
+ }
257
+
258
+ /**
259
+ * Print a warning message to the console and ensure duplicate warning messages
260
+ * are not printed.
261
+ */
262
+ const warnOnceHistory: {[key: string]: boolean} = {};
263
+
264
+ export function warnOnce(message: string): void {
265
+ if (!warnOnceHistory[message]) {
266
+ // console isn't defined in some WebWorkers, see #2558
267
+ if (typeof console !== 'undefined') console.warn(message);
268
+ warnOnceHistory[message] = true;
269
+ }
270
+ }
271
+
272
+ /**
273
+ * Indicates if the provided Points are in a counter clockwise (true) or clockwise (false) order
274
+ *
275
+ * @returns true for a counter clockwise set of points
276
+ */
277
+ // https://bryceboe.com/2006/10/23/line-segment-intersection-algorithm/
278
+ export function isCounterClockwise(a: Point, b: Point, c: Point): boolean {
279
+ return (c.y - a.y) * (b.x - a.x) > (b.y - a.y) * (c.x - a.x);
280
+ }
281
+
282
+ /**
283
+ * For two lines a and b in 2d space, defined by any two points along the lines,
284
+ * find the intersection point, or return null if the lines are parallel
285
+ *
286
+ * @param a1 - First point on line a
287
+ * @param a2 - Second point on line a
288
+ * @param b1 - First point on line b
289
+ * @param b2 - Second point on line b
290
+ *
291
+ * @returns the intersection point of the two lines or null if they are parallel
292
+ */
293
+ export function findLineIntersection(a1: Point, a2: Point, b1: Point, b2: Point): Point | null {
294
+ const aDeltaY = a2.y - a1.y;
295
+ const aDeltaX = a2.x - a1.x;
296
+ const bDeltaY = b2.y - b1.y;
297
+ const bDeltaX = b2.x - b1.x;
298
+
299
+ const denominator = (bDeltaY * aDeltaX) - (bDeltaX * aDeltaY);
300
+
301
+ if (denominator === 0) {
302
+ // Lines are parallel
303
+ return null;
304
+ }
305
+
306
+ const originDeltaY = a1.y - b1.y;
307
+ const originDeltaX = a1.x - b1.x;
308
+ const aInterpolation = (bDeltaX * originDeltaY - bDeltaY * originDeltaX) / denominator;
309
+
310
+ // Find intersection by projecting out from origin of first segment
311
+ return new Point(a1.x + (aInterpolation * aDeltaX), a1.y + (aInterpolation * aDeltaY));
312
+ }
313
+
314
+ /**
315
+ * Converts spherical coordinates to cartesian coordinates.
316
+ *
317
+ * @param spherical - Spherical coordinates, in [radial, azimuthal, polar]
318
+ * @returns cartesian coordinates in [x, y, z]
319
+ */
320
+
321
+ export function sphericalToCartesian([r, azimuthal, polar]: [number, number, number]): {
322
+ x: number;
323
+ y: number;
324
+ z: number;
325
+ } {
326
+ // We abstract "north"/"up" (compass-wise) to be 0° when really this is 90° (π/2):
327
+ // correct for that here
328
+ azimuthal += 90;
329
+
330
+ // Convert azimuthal and polar angles to radians
331
+ azimuthal *= Math.PI / 180;
332
+ polar *= Math.PI / 180;
333
+
334
+ return {
335
+ x: r * Math.cos(azimuthal) * Math.sin(polar),
336
+ y: r * Math.sin(azimuthal) * Math.sin(polar),
337
+ z: r * Math.cos(polar)
338
+ };
339
+ }
340
+
341
+ /**
342
+ * Returns true if the when run in the web-worker context.
343
+ *
344
+ * @returns `true` if the when run in the web-worker context.
345
+ */
346
+ export function isWorker(self: any): self is WorkerGlobalScopeInterface {
347
+ // @ts-ignore
348
+ return typeof WorkerGlobalScope !== 'undefined' && typeof self !== 'undefined' && self instanceof WorkerGlobalScope;
349
+ }
350
+
351
+ /**
352
+ * Parses data from 'Cache-Control' headers.
353
+ *
354
+ * @param cacheControl - Value of 'Cache-Control' header
355
+ * @returns object containing parsed header info.
356
+ */
357
+
358
+ export function parseCacheControl(cacheControl: string): any {
359
+ // Taken from [Wreck](https://github.com/hapijs/wreck)
360
+ const re = /(?:^|(?:\s*\,\s*))([^\x00-\x20\(\)<>@\,;\:\\"\/\[\]\?\=\{\}\x7F]+)(?:\=(?:([^\x00-\x20\(\)<>@\,;\:\\"\/\[\]\?\=\{\}\x7F]+)|(?:\"((?:[^"\\]|\\.)*)\")))?/g;
361
+
362
+ const header = {};
363
+ cacheControl.replace(re, ($0, $1, $2, $3) => {
364
+ const value = $2 || $3;
365
+ header[$1] = value ? value.toLowerCase() : true;
366
+ return '';
367
+ });
368
+
369
+ if (header['max-age']) {
370
+ const maxAge = parseInt(header['max-age'], 10);
371
+ if (isNaN(maxAge)) delete header['max-age'];
372
+ else header['max-age'] = maxAge;
373
+ }
374
+
375
+ return header;
376
+ }
377
+
378
+ let _isSafari = null;
379
+
380
+ /**
381
+ * Returns true when run in WebKit derived browsers.
382
+ * This is used as a workaround for a memory leak in Safari caused by using Transferable objects to
383
+ * transfer data between WebWorkers and the main thread.
384
+ * https://github.com/mapbox/mapbox-gl-js/issues/8771
385
+ *
386
+ * This should be removed once the underlying Safari issue is fixed.
387
+ *
388
+ * @param scope - Since this function is used both on the main thread and WebWorker context,
389
+ * let the calling scope pass in the global scope object.
390
+ * @returns `true` when run in WebKit derived browsers.
391
+ */
392
+ export function isSafari(scope: any): boolean {
393
+ if (_isSafari == null) {
394
+ const userAgent = scope.navigator ? scope.navigator.userAgent : null;
395
+ _isSafari = !!scope.safari ||
396
+ !!(userAgent && (/\b(iPad|iPhone|iPod)\b/.test(userAgent) || (!!userAgent.match('Safari') && !userAgent.match('Chrome'))));
397
+ }
398
+ return _isSafari;
399
+ }
400
+
401
+ export function storageAvailable(type: string): boolean {
402
+ try {
403
+ const storage = window[type];
404
+ storage.setItem('_mapbox_test_', 1);
405
+ storage.removeItem('_mapbox_test_');
406
+ return true;
407
+ } catch (e) {
408
+ return false;
409
+ }
410
+ }
411
+
412
+ // The following methods are from https://developer.mozilla.org/en-US/docs/Web/API/WindowBase64/Base64_encoding_and_decoding#The_Unicode_Problem
413
+ //Unicode compliant base64 encoder for strings
414
+ export function b64EncodeUnicode(str: string) {
415
+ return btoa(
416
+ encodeURIComponent(str).replace(/%([0-9A-F]{2})/g,
417
+ (match, p1) => {
418
+ return String.fromCharCode(Number('0x' + p1)); //eslint-disable-line
419
+ }
420
+ )
421
+ );
422
+ }
423
+
424
+ // Unicode compliant decoder for base64-encoded strings
425
+ export function b64DecodeUnicode(str: string) {
426
+ return decodeURIComponent(atob(str).split('').map((c) => {
427
+ return '%' + ('00' + c.charCodeAt(0).toString(16)).slice(-2); //eslint-disable-line
428
+ }).join(''));
429
+ }
430
+
431
+ export function isImageBitmap(image: any): image is ImageBitmap {
432
+ return typeof ImageBitmap !== 'undefined' && image instanceof ImageBitmap;
433
+ }
434
+
435
+ /**
436
+ * Converts an ArrayBuffer to an ImageBitmap.
437
+ *
438
+ * Used mostly for testing purposes only, because mocking libs don't know how to work with ArrayBuffers, but work
439
+ * perfectly fine with ImageBitmaps. Might also be used for environments (other than testing) not supporting
440
+ * ArrayBuffers.
441
+ *
442
+ * @param data - Data to convert
443
+ * @returns - A promise resolved when the conversion is finished
444
+ */
445
+ export const arrayBufferToImageBitmap = async (data: ArrayBuffer): Promise<ImageBitmap> => {
446
+ if (data.byteLength === 0) {
447
+ return createImageBitmap(new ImageData(1, 1));
448
+ }
449
+ const blob: Blob = new Blob([new Uint8Array(data)], {type: 'image/png'});
450
+ try {
451
+ return createImageBitmap(blob);
452
+ } catch (e) {
453
+ throw new Error(`Could not load image because of ${e.message}. Please make sure to use a supported image type such as PNG or JPEG. Note that SVGs are not supported.`);
454
+ }
455
+ };
456
+
457
+ const transparentPngUrl = 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAAC0lEQVQYV2NgAAIAAAUAAarVyFEAAAAASUVORK5CYII=';
458
+
459
+ /**
460
+ * Converts an ArrayBuffer to an HTMLImageElement.
461
+ *
462
+ * Used mostly for testing purposes only, because mocking libs don't know how to work with ArrayBuffers, but work
463
+ * perfectly fine with ImageBitmaps. Might also be used for environments (other than testing) not supporting
464
+ * ArrayBuffers.
465
+ *
466
+ * @param data - Data to convert
467
+ * @returns - A promise resolved when the conversion is finished
468
+ */
469
+ export const arrayBufferToImage = (data: ArrayBuffer): Promise<HTMLImageElement> => {
470
+ return new Promise((resolve, reject) => {
471
+ const img: HTMLImageElement = new Image();
472
+ img.onload = () => {
473
+ resolve(img);
474
+ URL.revokeObjectURL(img.src);
475
+ // prevent image dataURI memory leak in Safari;
476
+ // but don't free the image immediately because it might be uploaded in the next frame
477
+ // https://github.com/mapbox/mapbox-gl-js/issues/10226
478
+ img.onload = null;
479
+ window.requestAnimationFrame(() => { img.src = transparentPngUrl; });
480
+ };
481
+ img.onerror = () => reject(new Error('Could not load image. Please make sure to use a supported image type such as PNG or JPEG. Note that SVGs are not supported.'));
482
+ const blob: Blob = new Blob([new Uint8Array(data)], {type: 'image/png'});
483
+ img.src = data.byteLength ? URL.createObjectURL(blob) : transparentPngUrl;
484
+ });
485
+ };
486
+
487
+ /**
488
+ * Computes the webcodecs VideoFrame API options to select a rectangle out of
489
+ * an image and write it into the destination rectangle.
490
+ *
491
+ * Rect (x/y/width/height) select the overlapping rectangle from the source image
492
+ * and layout (offset/stride) write that overlapping rectangle to the correct place
493
+ * in the destination image.
494
+ *
495
+ * Offset is the byte offset in the dest image that the first pixel appears at
496
+ * and stride is the number of bytes to the start of the next row:
497
+ * ┌───────────┐
498
+ * │ dest │
499
+ * │ ┌───┼───────┐
500
+ * │offset→│▓▓▓│ source│
501
+ * │ │▓▓▓│ │
502
+ * │ └───┼───────┘
503
+ * │stride ⇠╌╌╌│
504
+ * │╌╌╌╌╌╌→ │
505
+ * └───────────┘
506
+ *
507
+ * @param image - source image containing a width and height attribute
508
+ * @param x - top-left x coordinate to read from the image
509
+ * @param y - top-left y coordinate to read from the image
510
+ * @param width - width of the rectangle to read from the image
511
+ * @param height - height of the rectangle to read from the image
512
+ * @returns the layout and rect options to pass into VideoFrame API
513
+ */
514
+ function computeVideoFrameParameters(image: Size, x: number, y: number, width: number, height: number): VideoFrameCopyToOptions {
515
+ const destRowOffset = Math.max(-x, 0) * 4;
516
+ const firstSourceRow = Math.max(0, y);
517
+ const firstDestRow = firstSourceRow - y;
518
+ const offset = firstDestRow * width * 4 + destRowOffset;
519
+ const stride = width * 4;
520
+
521
+ const sourceLeft = Math.max(0, x);
522
+ const sourceTop = Math.max(0, y);
523
+ const sourceRight = Math.min(image.width, x + width);
524
+ const sourceBottom = Math.min(image.height, y + height);
525
+ return {
526
+ rect: {
527
+ x: sourceLeft,
528
+ y: sourceTop,
529
+ width: sourceRight - sourceLeft,
530
+ height: sourceBottom - sourceTop
531
+ },
532
+ layout: [{offset, stride}]
533
+ };
534
+ }
535
+
536
+ /**
537
+ * Reads pixels from an ImageBitmap/Image/canvas using webcodec VideoFrame API.
538
+ *
539
+ * @param data - image, imagebitmap, or canvas to parse
540
+ * @param x - top-left x coordinate to read from the image
541
+ * @param y - top-left y coordinate to read from the image
542
+ * @param width - width of the rectangle to read from the image
543
+ * @param height - height of the rectangle to read from the image
544
+ * @returns a promise containing the parsed RGBA pixel values of the image, or the error if an error occurred
545
+ */
546
+ export async function readImageUsingVideoFrame(
547
+ image: HTMLImageElement | HTMLCanvasElement | ImageBitmap | OffscreenCanvas,
548
+ x: number, y: number, width: number, height: number
549
+ ): Promise<Uint8ClampedArray> {
550
+ if (typeof VideoFrame === 'undefined') {
551
+ throw new Error('VideoFrame not supported');
552
+ }
553
+ const frame = new VideoFrame(image, {timestamp: 0});
554
+ try {
555
+ const format = frame?.format;
556
+ if (!format || !(format.startsWith('BGR') || format.startsWith('RGB'))) {
557
+ throw new Error(`Unrecognized format ${format}`);
558
+ }
559
+ const swapBR = format.startsWith('BGR');
560
+ const result = new Uint8ClampedArray(width * height * 4);
561
+ await frame.copyTo(result, computeVideoFrameParameters(image, x, y, width, height));
562
+ if (swapBR) {
563
+ for (let i = 0; i < result.length; i += 4) {
564
+ const tmp = result[i];
565
+ result[i] = result[i + 2];
566
+ result[i + 2] = tmp;
567
+ }
568
+ }
569
+ return result;
570
+ } finally {
571
+ frame.close();
572
+ }
573
+ }
574
+
575
+ let offscreenCanvas: OffscreenCanvas;
576
+ let offscreenCanvasContext: OffscreenCanvasRenderingContext2D;
577
+
578
+ /**
579
+ * Reads pixels from an ImageBitmap/Image/canvas using OffscreenCanvas
580
+ *
581
+ * @param data - image, imagebitmap, or canvas to parse
582
+ * @param x - top-left x coordinate to read from the image
583
+ * @param y - top-left y coordinate to read from the image
584
+ * @param width - width of the rectangle to read from the image
585
+ * @param height - height of the rectangle to read from the image
586
+ * @returns a promise containing the parsed RGBA pixel values of the image, or the error if an error occurred
587
+ */
588
+ export function readImageDataUsingOffscreenCanvas(
589
+ imgBitmap: HTMLImageElement | HTMLCanvasElement | ImageBitmap | OffscreenCanvas,
590
+ x: number, y: number, width: number, height: number
591
+ ): Uint8ClampedArray {
592
+ const origWidth = imgBitmap.width;
593
+ const origHeight = imgBitmap.height;
594
+ // Lazily initialize OffscreenCanvas
595
+ if (!offscreenCanvas || !offscreenCanvasContext) {
596
+ // Dem tiles are typically 256x256
597
+ offscreenCanvas = new OffscreenCanvas(origWidth, origHeight);
598
+ offscreenCanvasContext = offscreenCanvas.getContext('2d', {willReadFrequently: true});
599
+ }
600
+
601
+ offscreenCanvas.width = origWidth;
602
+ offscreenCanvas.height = origHeight;
603
+
604
+ offscreenCanvasContext.drawImage(imgBitmap, 0, 0, origWidth, origHeight);
605
+ const imgData = offscreenCanvasContext.getImageData(x, y, width, height);
606
+ offscreenCanvasContext.clearRect(0, 0, origWidth, origHeight);
607
+ return imgData.data;
608
+ }
609
+
610
+ /**
611
+ * Reads RGBA pixels from an preferring OffscreenCanvas, but falling back to VideoFrame if supported and
612
+ * the browser is mangling OffscreenCanvas getImageData results.
613
+ *
614
+ * @param data - image, imagebitmap, or canvas to parse
615
+ * @param x - top-left x coordinate to read from the image
616
+ * @param y - top-left y coordinate to read from the image
617
+ * @param width - width of the rectangle to read from the image
618
+ * @param height - height of the rectangle to read from the image
619
+ * @returns a promise containing the parsed RGBA pixel values of the image
620
+ */
621
+ export async function getImageData(
622
+ image: HTMLImageElement | HTMLCanvasElement | ImageBitmap | OffscreenCanvas,
623
+ x: number, y: number, width: number, height: number
624
+ ): Promise<Uint8ClampedArray> {
625
+ if (isOffscreenCanvasDistorted()) {
626
+ try {
627
+ return await readImageUsingVideoFrame(image, x, y, width, height);
628
+ } catch (e) {
629
+ // fall back to OffscreenCanvas
630
+ }
631
+ }
632
+ return readImageDataUsingOffscreenCanvas(image, x, y, width, height);
633
+ }
634
+
635
+ export interface Subscription {
636
+ unsubscribe(): void;
637
+ }
638
+
639
+ export interface Subscriber {
640
+ addEventListener: typeof window.addEventListener;
641
+ removeEventListener: typeof window.removeEventListener;
642
+ }
643
+
644
+ /**
645
+ * This method is used in order to register an event listener using a lambda function.
646
+ * The return value will allow unsubscribing from the event, without the need to store the method reference.
647
+ * @param target - The target
648
+ * @param message - The message
649
+ * @param listener - The listener
650
+ * @param options - The options
651
+ * @returns a subscription object that can be used to unsubscribe from the event
652
+ */
653
+ export function subscribe(target: Subscriber, message: keyof WindowEventMap, listener: (...args: any) => void, options: boolean | AddEventListenerOptions): Subscription {
654
+ target.addEventListener(message, listener, options);
655
+ return {
656
+ unsubscribe: () => {
657
+ target.removeEventListener(message, listener, options);
658
+ }
659
+ };
660
+ }
661
+
662
+ /**
663
+ * This method converts degrees to radians.
664
+ * The return value is the radian value.
665
+ * @param degrees - The number of degrees
666
+ * @returns radians
667
+ */
668
+ export function degreesToRadians(degrees: number): number {
669
+ return degrees * Math.PI / 180;
670
+ }
671
+
672
+ /**
673
+ * Makes optional keys required and add the the undefined type.
674
+ *
675
+ * ```
676
+ * interface Test {
677
+ * foo: number;
678
+ * bar?: number;
679
+ * baz: number | undefined;
680
+ * }
681
+ *
682
+ * Complete<Test> {
683
+ * foo: number;
684
+ * bar: number | undefined;
685
+ * baz: number | undefined;
686
+ * }
687
+ *
688
+ * ```
689
+ *
690
+ * See https://medium.com/terria/typescript-transforming-optional-properties-to-required-properties-that-may-be-undefined-7482cb4e1585
691
+ */
692
+
693
+ export type Complete<T> = {
694
+ [P in keyof Required<T>]: Pick<T, P> extends Required<Pick<T, P>> ? T[P] : (T[P] | undefined);
695
+ }
696
+
697
+ export type TileJSON = {
698
+ tilejson: '2.2.0' | '2.1.0' | '2.0.1' | '2.0.0' | '1.0.0';
699
+ name?: string;
700
+ description?: string;
701
+ version?: string;
702
+ attribution?: string;
703
+ template?: string;
704
+ tiles: Array<string>;
705
+ grids?: Array<string>;
706
+ data?: Array<string>;
707
+ minzoom?: number;
708
+ maxzoom?: number;
709
+ bounds?: [number, number, number, number];
710
+ center?: [number, number, number];
711
+ vector_layers: [{id: string}]; // this is partial but enough for what we need
712
+ };
713
+
714
+ /**
715
+ * The maximum world tile zoom (Z).
716
+ * In other words, the upper bound supported for tile zoom.
717
+ */
718
+ export const MAX_TILE_ZOOM = 25;
719
+
720
+ /**
721
+ * The minimum world tile zoom (Z).
722
+ * In other words, the lower bound supported for tile zoom.
723
+ */
724
+ export const MIN_TILE_ZOOM = 0;