@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,123 @@
1
+ import type {CollisionBoxArray} from './array_types.g';
2
+ import type {Style} from '../style/style';
3
+ import type {TypedStyleLayer} from '../style/style_layer/typed_style_layer';
4
+ import type {FeatureIndex} from './feature_index';
5
+ import type {Context} from '../gl/context';
6
+ import type {FeatureStates} from '../source/source_state';
7
+ import type {ImagePosition} from '../render/image_atlas';
8
+ import type {CanonicalTileID} from '../source/tile_id';
9
+ import type {VectorTileFeature, VectorTileLayer} from '@mapbox/vector-tile';
10
+ import Point from '@mapbox/point-geometry';
11
+
12
+ export type BucketParameters<Layer extends TypedStyleLayer> = {
13
+ index: number;
14
+ layers: Array<Layer>;
15
+ zoom: number;
16
+ pixelRatio: number;
17
+ overscaling: number;
18
+ collisionBoxArray: CollisionBoxArray;
19
+ sourceLayerIndex: number;
20
+ sourceID: string;
21
+ };
22
+
23
+ export type PopulateParameters = {
24
+ featureIndex: FeatureIndex;
25
+ iconDependencies: {};
26
+ patternDependencies: {};
27
+ glyphDependencies: {};
28
+ availableImages: Array<string>;
29
+ };
30
+
31
+ export type IndexedFeature = {
32
+ feature: VectorTileFeature;
33
+ id: number | string;
34
+ index: number;
35
+ sourceLayerIndex: number;
36
+ };
37
+
38
+ export type BucketFeature = {
39
+ index: number;
40
+ sourceLayerIndex: number;
41
+ geometry: Array<Array<Point>>;
42
+ properties: any;
43
+ type: 0 | 1 | 2 | 3;
44
+ id?: any;
45
+ readonly patterns: {
46
+ [_: string]: {
47
+ 'min': string;
48
+ 'mid': string;
49
+ 'max': string;
50
+ };
51
+ };
52
+ sortKey?: number;
53
+ };
54
+
55
+ /**
56
+ * The `Bucket` interface is the single point of knowledge about turning vector
57
+ * tiles into WebGL buffers.
58
+ *
59
+ * `Bucket` is an abstract interface. An implementation exists for each style layer type.
60
+ * Create a bucket via the `StyleLayer#createBucket` method.
61
+ *
62
+ * The concrete bucket types, using layout options from the style layer,
63
+ * transform feature geometries into vertex and index data for use by the
64
+ * vertex shader. They also (via `ProgramConfiguration`) use feature
65
+ * properties and the zoom level to populate the attributes needed for
66
+ * data-driven styling.
67
+ *
68
+ * Buckets are designed to be built on a worker thread and then serialized and
69
+ * transferred back to the main thread for rendering. On the worker side, a
70
+ * bucket's vertex, index, and attribute data is stored in `bucket.arrays: ArrayGroup`.
71
+ * When a bucket's data is serialized and sent back to the main thread,
72
+ * is gets deserialized (using `new Bucket(serializedBucketData)`, with
73
+ * the array data now stored in `bucket.buffers: BufferGroup`. BufferGroups
74
+ * hold the same data as ArrayGroups, but are tuned for consumption by WebGL.
75
+ */
76
+ export interface Bucket {
77
+ layerIds: Array<string>;
78
+ hasPattern: boolean;
79
+ readonly layers: Array<any>;
80
+ readonly stateDependentLayers: Array<any>;
81
+ readonly stateDependentLayerIds: Array<string>;
82
+ populate(features: Array<IndexedFeature>, options: PopulateParameters, canonical: CanonicalTileID): void;
83
+ update(states: FeatureStates, vtLayer: VectorTileLayer, imagePositions: {[_: string]: ImagePosition}): void;
84
+ isEmpty(): boolean;
85
+ upload(context: Context): void;
86
+ uploadPending(): boolean;
87
+ /**
88
+ * Release the WebGL resources associated with the buffers. Note that because
89
+ * buckets are shared between layers having the same layout properties, they
90
+ * must be destroyed in groups (all buckets for a tile, or all symbol buckets).
91
+ */
92
+ destroy(): void;
93
+ }
94
+
95
+ export function deserialize(input: Array<Bucket>, style: Style): {[_: string]: Bucket} {
96
+ const output = {};
97
+
98
+ // Guard against the case where the map's style has been set to null while
99
+ // this bucket has been parsing.
100
+ if (!style) return output;
101
+
102
+ for (const bucket of input) {
103
+ const layers = bucket.layerIds
104
+ .map((id) => style.getLayer(id))
105
+ .filter(Boolean);
106
+
107
+ if (layers.length === 0) {
108
+ continue;
109
+ }
110
+
111
+ // look up StyleLayer objects from layer ids (since we don't
112
+ // want to waste time serializing/copying them from the worker)
113
+ (bucket as any).layers = layers;
114
+ if (bucket.stateDependentLayerIds) {
115
+ (bucket as any).stateDependentLayers = bucket.stateDependentLayerIds.map((lId) => layers.filter((l) => l.id === lId)[0]);
116
+ }
117
+ for (const layer of layers) {
118
+ output[layer.id] = bucket;
119
+ }
120
+ }
121
+
122
+ return output;
123
+ }
@@ -0,0 +1,237 @@
1
+ import {DEMData} from './dem_data';
2
+ import {RGBAImage} from '../util/image';
3
+ import {serialize, deserialize} from '../util/web_worker_transfer';
4
+
5
+ function createMockImage(height, width) {
6
+ // RGBAImage passed to constructor has uniform 1px padding on all sides.
7
+ height += 2;
8
+ width += 2;
9
+ const pixels = new Uint8Array(height * width * 4);
10
+ for (let i = 0; i < pixels.length; i++) {
11
+ pixels[i] = (i + 1) % 4 === 0 ? 1 : Math.floor(Math.random() * 256);
12
+ }
13
+ return new RGBAImage({height, width}, pixels);
14
+ }
15
+
16
+ function createMockClampImage(height, width) {
17
+ const pixels = new Uint8ClampedArray(height * width * 4);
18
+ for (let i = 0; i < pixels.length; i++) {
19
+ pixels[i] = (i + 1) % 4 === 0 ? 1 : Math.floor(Math.random() * 256);
20
+ }
21
+ return new RGBAImage({height, width}, pixels);
22
+ }
23
+
24
+ describe('DEMData', () => {
25
+ describe('constructor', () => {
26
+ test('Uint8Array', () => {
27
+ const imageData0 = createMockImage(4, 4);
28
+ const dem = new DEMData('0', imageData0, 'mapbox');
29
+ expect(dem.uid).toBe('0');
30
+ expect(dem.dim).toBe(4);
31
+ expect(dem.stride).toBe(6);
32
+ });
33
+
34
+ test('Uint8ClampedArray', () => {
35
+ const imageData0 = createMockClampImage(4, 4);
36
+ const dem = new DEMData('0', imageData0, 'mapbox');
37
+ expect(dem).not.toBeNull();
38
+ expect(dem['uid']).toBe('0');
39
+ expect(dem['dim']).toBe(2);
40
+ expect(dem['stride']).toBe(4);
41
+ });
42
+
43
+ test('otherEncoding', () => {
44
+ const spyOnWarnConsole = jest.spyOn(console, 'warn').mockImplementation();
45
+
46
+ const imageData0 = createMockImage(4, 4);
47
+ new DEMData('0', imageData0, 'otherEncoding' as any);
48
+
49
+ expect(spyOnWarnConsole).toHaveBeenCalledTimes(1);
50
+ expect(spyOnWarnConsole.mock.calls).toEqual([['\"otherEncoding\" is not a valid encoding type. Valid types include \"mapbox\", \"terrarium\" and \"custom\".']]);
51
+ });
52
+ });
53
+ });
54
+
55
+ function testDEMBorderRegion(dem: DEMData) {
56
+ return () => {
57
+ let nonempty = true;
58
+ for (let x = -1; x < 5; x++) {
59
+ for (let y = -1; y < 5; y++) {
60
+ if (dem.get(x, y) === -65536) {
61
+ nonempty = false;
62
+ break;
63
+ }
64
+ }
65
+ }
66
+ expect(nonempty).toBeTruthy();
67
+
68
+ let verticalBorderMatch = true;
69
+ for (const x of [-1, 4]) {
70
+ for (let y = 0; y < 4; y++) {
71
+ if (dem.get(x, y) !== dem.get(x < 0 ? x + 1 : x - 1, y)) {
72
+ verticalBorderMatch = false;
73
+ break;
74
+ }
75
+ }
76
+ }
77
+ expect(verticalBorderMatch).toBeTruthy();
78
+
79
+ // horizontal borders empty
80
+ let horizontalBorderMatch = true;
81
+ for (const y of [-1, 4]) {
82
+ for (let x = 0; x < 4; x++) {
83
+ if (dem.get(x, y) !== dem.get(x, y < 0 ? y + 1 : y - 1)) {
84
+ horizontalBorderMatch = false;
85
+ break;
86
+ }
87
+ }
88
+ }
89
+ expect(horizontalBorderMatch).toBeTruthy();
90
+
91
+ expect(dem.get(-1, 4) === dem.get(0, 3)).toBeTruthy();
92
+ expect(dem.get(4, 4) === dem.get(3, 3)).toBeTruthy();
93
+ expect(dem.get(-1, -1) === dem.get(0, 0)).toBeTruthy();
94
+ expect(dem.get(4, -1) === dem.get(3, 0)).toBeTruthy();
95
+ };
96
+ }
97
+
98
+ function testDEMBackfill(dem0: DEMData, dem1: DEMData) {
99
+ return () => {
100
+ dem0.backfillBorder(dem1, -1, 0);
101
+ for (let y = 0; y < 4; y++) {
102
+ // dx = -1, dy = 0, so the left edge of dem1 should equal the right edge of dem0
103
+ expect(dem0.get(-1, y) === dem1.get(3, y)).toBeTruthy();
104
+ }
105
+
106
+ dem0.backfillBorder(dem1, 0, -1);
107
+ for (let x = 0; x < 4; x++) {
108
+ expect(dem0.get(x, -1) === dem1.get(x, 3)).toBeTruthy();
109
+ }
110
+
111
+ dem0.backfillBorder(dem1, 1, 0);
112
+ for (let y = 0; y < 4; y++) {
113
+ expect(dem0.get(4, y) === dem1.get(0, y)).toBeTruthy();
114
+ }
115
+
116
+ dem0.backfillBorder(dem1, 0, 1);
117
+ for (let x = 0; x < 4; x++) {
118
+ expect(dem0.get(x, 4) === dem1.get(x, 0)).toBeTruthy();
119
+ }
120
+
121
+ dem0.backfillBorder(dem1, -1, 1);
122
+ expect(dem0.get(-1, 4) === dem1.get(3, 0)).toBeTruthy();
123
+
124
+ dem0.backfillBorder(dem1, 1, 1);
125
+ expect(dem0.get(4, 4) === dem1.get(0, 0)).toBeTruthy();
126
+
127
+ dem0.backfillBorder(dem1, -1, -1);
128
+ expect(dem0.get(-1, -1) === dem1.get(3, 3)).toBeTruthy();
129
+
130
+ dem0.backfillBorder(dem1, 1, -1);
131
+ expect(dem0.get(4, -1) === dem1.get(0, 3)).toBeTruthy();
132
+ };
133
+ }
134
+
135
+ describe('DEMData#backfillBorder with encoding', () => {
136
+ describe('mapbox encoding', () => {
137
+ const dem0 = new DEMData('0', createMockImage(4, 4), 'mapbox');
138
+ const dem1 = new DEMData('1', createMockImage(4, 4), 'mapbox');
139
+
140
+ test('border region is initially populated with neighboring data', testDEMBorderRegion(dem0));
141
+ test('backfillBorder correctly populates borders with neighboring data', testDEMBackfill(dem0, dem1));
142
+ });
143
+
144
+ describe('terrarium encoding', () => {
145
+ const dem0 = new DEMData('0', createMockImage(4, 4), 'terrarium');
146
+ const dem1 = new DEMData('1', createMockImage(4, 4), 'terrarium');
147
+
148
+ test('border region is initially populated with neighboring data', testDEMBorderRegion(dem0));
149
+ test('backfillBorder correctly populates borders with neighboring data', testDEMBackfill(dem0, dem1));
150
+ });
151
+ });
152
+
153
+ function testSerialization(dem0: DEMData, redFactor: number, greenFactor: number, blueFactor: number, baseShift: number) {
154
+ return () => {
155
+ const serialized = serialize(dem0);
156
+
157
+ // calculate min/max values
158
+ let min = Number.MAX_SAFE_INTEGER;
159
+ let max = Number.MIN_SAFE_INTEGER;
160
+ for (let x = 0; x < 4; x++) {
161
+ for (let y = 0; y < 4; y++) {
162
+ const ele = dem0.get(x, y);
163
+ if (ele > max) max = ele;
164
+ if (ele < min) min = ele;
165
+ }
166
+ }
167
+
168
+ expect(serialized).toEqual({
169
+ $name: 'DEMData',
170
+ uid: '0',
171
+ dim: 4,
172
+ stride: 6,
173
+ data: dem0.data,
174
+ redFactor,
175
+ greenFactor,
176
+ blueFactor,
177
+ baseShift,
178
+ max,
179
+ min,
180
+ });
181
+
182
+ const transferrables = [];
183
+ serialize(dem0, transferrables);
184
+ expect(new Uint32Array(transferrables[0])).toEqual(dem0.data);
185
+ };
186
+ }
187
+
188
+ function testDeserialization(dem0: DEMData) {
189
+ return () => {
190
+ const serialized = serialize(dem0);
191
+
192
+ const deserialized = deserialize(serialized);
193
+ expect(deserialized).toEqual(dem0);
194
+ };
195
+ }
196
+
197
+ describe('DEMData is correctly serialized and deserialized', () => {
198
+ const mapboxDEM = new DEMData('0', createMockImage(4, 4), 'mapbox');
199
+ const terrariumDEM = new DEMData('0', createMockImage(4, 4), 'terrarium');
200
+ const customDEM = new DEMData('0', createMockImage(4, 4), 'custom', 1.0, 2.0, 3.0, 4.0);
201
+ test('serialized - mapbox', testSerialization(mapboxDEM, 6553.6, 25.6, 0.1, 10000));
202
+ test('serialized - terrarium', testSerialization(terrariumDEM, 256.0, 1.0, 1.0 / 256.0, 32768.0));
203
+ test('serialized - custom', testSerialization(customDEM, 1.0, 2.0, 3.0, 4.0));
204
+
205
+ test('deserialized - mapbox', testDeserialization(mapboxDEM));
206
+ test('deserialized - terrarium', testDeserialization(terrariumDEM));
207
+ test('deserialized - custom', testDeserialization(customDEM));
208
+ });
209
+
210
+ describe('UnpackVector is correctly returned', () => {
211
+ test('terrarium, mapbox and custom', () => {
212
+ const mapboxDEM = new DEMData('0', createMockImage(4, 4), 'mapbox');
213
+ const terrariumDEM = new DEMData('0', createMockImage(4, 4), 'terrarium');
214
+ const customDEM = new DEMData('0', createMockImage(4, 4), 'custom', 1.0, 2.0, 3.0, 4.0);
215
+
216
+ expect(terrariumDEM.getUnpackVector()).toEqual([256.0, 1.0, 1.0 / 256.0, 32768.0]);
217
+ expect(mapboxDEM.getUnpackVector()).toEqual([6553.6, 25.6, 0.1, 10000.0]);
218
+ expect(customDEM.getUnpackVector()).toEqual([1.0, 2.0, 3.0, 4.0]);
219
+ });
220
+ });
221
+
222
+ function testGetPixels(dem: DEMData, imageData: RGBAImage) {
223
+ return () => {
224
+ expect(dem.getPixels()).toEqual(imageData);
225
+ };
226
+ }
227
+
228
+ describe('DEMData#getImage', () => {
229
+ const imageData = createMockImage(4, 4);
230
+ const mapboxDEM = new DEMData('0', imageData, 'terrarium');
231
+ const terrariumDEM = new DEMData('0', imageData, 'terrarium');
232
+ const customDEM = new DEMData('0', imageData, 'terrarium');
233
+
234
+ test('Image is correctly returned - mapbox', testGetPixels(mapboxDEM, imageData));
235
+ test('Image is correctly returned - terrarium', testGetPixels(terrariumDEM, imageData));
236
+ test('Image is correctly returned - custom', testGetPixels(customDEM, imageData));
237
+ });
@@ -0,0 +1,171 @@
1
+ import {RGBAImage} from '../util/image';
2
+
3
+ import {warnOnce} from '../util/util';
4
+ import {register} from '../util/web_worker_transfer';
5
+
6
+ /**
7
+ * The possible DEM encoding types
8
+ */
9
+ export type DEMEncoding = 'mapbox' | 'terrarium' | 'custom'
10
+
11
+ /**
12
+ * DEMData is a data structure for decoding, backfilling, and storing elevation data for processing in the hillshade shaders
13
+ * data can be populated either from a pngraw image tile or from serialized data sent back from a worker. When data is initially
14
+ * loaded from a image tile, we decode the pixel values using the appropriate decoding formula, but we store the
15
+ * elevation data as an Int32 value. we add 65536 (2^16) to eliminate negative values and enable the use of
16
+ * integer overflow when creating the texture used in the hillshadePrepare step.
17
+ *
18
+ * DEMData also handles the backfilling of data from a tile's neighboring tiles. This is necessary because we use a pixel's 8
19
+ * surrounding pixel values to compute the slope at that pixel, and we cannot accurately calculate the slope at pixels on a
20
+ * tile's edge without backfilling from neighboring tiles.
21
+ */
22
+ export class DEMData {
23
+ uid: string | number;
24
+ data: Uint32Array;
25
+ stride: number;
26
+ dim: number;
27
+ min: number;
28
+ max: number;
29
+ redFactor: number;
30
+ greenFactor: number;
31
+ blueFactor: number;
32
+ baseShift: number;
33
+
34
+ /**
35
+ * Constructs a `DEMData` object
36
+ * @param uid - the tile's unique id
37
+ * @param data - RGBAImage data has uniform 1px padding on all sides: square tile edge size defines stride
38
+ // and dim is calculated as stride - 2.
39
+ * @param encoding - the encoding type of the data
40
+ * @param redFactor - the red channel factor used to unpack the data, used for `custom` encoding only
41
+ * @param greenFactor - the green channel factor used to unpack the data, used for `custom` encoding only
42
+ * @param blueFactor - the blue channel factor used to unpack the data, used for `custom` encoding only
43
+ * @param baseShift - the base shift used to unpack the data, used for `custom` encoding only
44
+ */
45
+ constructor(uid: string | number, data: RGBAImage | ImageData, encoding: DEMEncoding, redFactor = 1.0, greenFactor = 1.0, blueFactor = 1.0, baseShift = 0.0) {
46
+ this.uid = uid;
47
+ if (data.height !== data.width) throw new RangeError('DEM tiles must be square');
48
+ if (encoding && !['mapbox', 'terrarium', 'custom'].includes(encoding)) {
49
+ warnOnce(`"${encoding}" is not a valid encoding type. Valid types include "mapbox", "terrarium" and "custom".`);
50
+ return;
51
+ }
52
+ this.stride = data.height;
53
+ const dim = this.dim = data.height - 2;
54
+ this.data = new Uint32Array(data.data.buffer);
55
+ switch (encoding) {
56
+ case 'terrarium':
57
+ // unpacking formula for mapzen terrarium:
58
+ // https://aws.amazon.com/public-datasets/terrain/
59
+ this.redFactor = 256.0;
60
+ this.greenFactor = 1.0;
61
+ this.blueFactor = 1.0 / 256.0;
62
+ this.baseShift = 32768.0;
63
+ break;
64
+ case 'custom':
65
+ this.redFactor = redFactor;
66
+ this.greenFactor = greenFactor;
67
+ this.blueFactor = blueFactor;
68
+ this.baseShift = baseShift;
69
+ break;
70
+ case 'mapbox':
71
+ default:
72
+ // unpacking formula for mapbox.terrain-rgb:
73
+ // https://www.mapbox.com/help/access-elevation-data/#mapbox-terrain-rgb
74
+ this.redFactor = 6553.6;
75
+ this.greenFactor = 25.6;
76
+ this.blueFactor = 0.1;
77
+ this.baseShift = 10000.0;
78
+ break;
79
+ }
80
+
81
+ // in order to avoid flashing seams between tiles, here we are initially populating a 1px border of pixels around the image
82
+ // with the data of the nearest pixel from the image. this data is eventually replaced when the tile's neighboring
83
+ // tiles are loaded and the accurate data can be backfilled using DEMData#backfillBorder
84
+ for (let x = 0; x < dim; x++) {
85
+ // left vertical border
86
+ this.data[this._idx(-1, x)] = this.data[this._idx(0, x)];
87
+ // right vertical border
88
+ this.data[this._idx(dim, x)] = this.data[this._idx(dim - 1, x)];
89
+ // left horizontal border
90
+ this.data[this._idx(x, -1)] = this.data[this._idx(x, 0)];
91
+ // right horizontal border
92
+ this.data[this._idx(x, dim)] = this.data[this._idx(x, dim - 1)];
93
+ }
94
+ // corners
95
+ this.data[this._idx(-1, -1)] = this.data[this._idx(0, 0)];
96
+ this.data[this._idx(dim, -1)] = this.data[this._idx(dim - 1, 0)];
97
+ this.data[this._idx(-1, dim)] = this.data[this._idx(0, dim - 1)];
98
+ this.data[this._idx(dim, dim)] = this.data[this._idx(dim - 1, dim - 1)];
99
+
100
+ // calculate min/max values
101
+ this.min = Number.MAX_SAFE_INTEGER;
102
+ this.max = Number.MIN_SAFE_INTEGER;
103
+ for (let x = 0; x < dim; x++) {
104
+ for (let y = 0; y < dim; y++) {
105
+ const ele = this.get(x, y);
106
+ if (ele > this.max) this.max = ele;
107
+ if (ele < this.min) this.min = ele;
108
+ }
109
+ }
110
+ }
111
+
112
+ get(x: number, y: number) {
113
+ const pixels = new Uint8Array(this.data.buffer);
114
+ const index = this._idx(x, y) * 4;
115
+ return this.unpack(pixels[index], pixels[index + 1], pixels[index + 2]);
116
+ }
117
+
118
+ getUnpackVector() {
119
+ return [this.redFactor, this.greenFactor, this.blueFactor, this.baseShift];
120
+ }
121
+
122
+ _idx(x: number, y: number) {
123
+ if (x < -1 || x >= this.dim + 1 || y < -1 || y >= this.dim + 1) throw new RangeError('out of range source coordinates for DEM data');
124
+ return (y + 1) * this.stride + (x + 1);
125
+ }
126
+
127
+ unpack(r: number, g: number, b: number) {
128
+ return (r * this.redFactor + g * this.greenFactor + b * this.blueFactor - this.baseShift);
129
+ }
130
+
131
+ getPixels() {
132
+ return new RGBAImage({width: this.stride, height: this.stride}, new Uint8Array(this.data.buffer));
133
+ }
134
+
135
+ backfillBorder(borderTile: DEMData, dx: number, dy: number) {
136
+ if (this.dim !== borderTile.dim) throw new Error('dem dimension mismatch');
137
+
138
+ let xMin = dx * this.dim,
139
+ xMax = dx * this.dim + this.dim,
140
+ yMin = dy * this.dim,
141
+ yMax = dy * this.dim + this.dim;
142
+
143
+ switch (dx) {
144
+ case -1:
145
+ xMin = xMax - 1;
146
+ break;
147
+ case 1:
148
+ xMax = xMin + 1;
149
+ break;
150
+ }
151
+
152
+ switch (dy) {
153
+ case -1:
154
+ yMin = yMax - 1;
155
+ break;
156
+ case 1:
157
+ yMax = yMin + 1;
158
+ break;
159
+ }
160
+
161
+ const ox = -dx * this.dim;
162
+ const oy = -dy * this.dim;
163
+ for (let y = yMin; y < yMax; y++) {
164
+ for (let x = xMin; x < xMax; x++) {
165
+ this.data[this._idx(x, y)] = borderTile.data[this._idx(x + ox, y + oy)];
166
+ }
167
+ }
168
+ }
169
+ }
170
+
171
+ register('DEMData', DEMData);
@@ -0,0 +1,18 @@
1
+ import {loadGeometry} from './load_geometry';
2
+ import type Point from '@mapbox/point-geometry';
3
+ import type {VectorTileFeature} from '@mapbox/vector-tile';
4
+ import type {Feature} from '@maplibre/maplibre-gl-style-spec';
5
+
6
+ type EvaluationFeature = Feature & { geometry: Array<Array<Point>> };
7
+ /**
8
+ * Construct a new feature based on a VectorTileFeature for expression evaluation, the geometry of which
9
+ * will be loaded based on necessity.
10
+ * @param feature - the feature to evaluate
11
+ * @param needGeometry - if set to true this will load the geometry
12
+ */
13
+ export function toEvaluationFeature(feature: VectorTileFeature, needGeometry: boolean): EvaluationFeature {
14
+ return {type: feature.type,
15
+ id: feature.id,
16
+ properties: feature.properties,
17
+ geometry: needGeometry ? loadGeometry(feature) : []};
18
+ }
@@ -0,0 +1,13 @@
1
+ /**
2
+ * The maximum value of a coordinate in the internal tile coordinate system. Coordinates of
3
+ * all source features normalized to this extent upon load.
4
+ *
5
+ * The value is a consequence of the following:
6
+ *
7
+ * * Vertex buffer store positions as signed 16 bit integers.
8
+ * * One bit is lost for signedness to support tile buffers.
9
+ * * One bit is lost because the line vertex buffer used to pack 1 bit of other data into the int.
10
+ * * One bit is lost to support features extending past the extent on the right edge of the tile.
11
+ * * This leaves us with 2^13 = 8192
12
+ */
13
+ export const EXTENT = 8192;