@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,376 @@
1
+ /* eslint-disable new-cap */
2
+
3
+ import {unicodeBlockLookup as isChar} from './is_char_in_unicode_block';
4
+
5
+ export function allowsIdeographicBreaking(chars: string) {
6
+ for (const char of chars) {
7
+ if (!charAllowsIdeographicBreaking(char.charCodeAt(0))) return false;
8
+ }
9
+ return true;
10
+ }
11
+
12
+ export function allowsVerticalWritingMode(chars: string) {
13
+ for (const char of chars) {
14
+ if (charHasUprightVerticalOrientation(char.charCodeAt(0))) return true;
15
+ }
16
+ return false;
17
+ }
18
+
19
+ export function allowsLetterSpacing(chars: string) {
20
+ for (const char of chars) {
21
+ if (!charAllowsLetterSpacing(char.charCodeAt(0))) return false;
22
+ }
23
+ return true;
24
+ }
25
+
26
+ /**
27
+ * Returns a regular expression matching the given script codes, excluding any
28
+ * code that the execution environment lacks support for in regular expressions.
29
+ */
30
+ function sanitizedRegExpFromScriptCodes(scriptCodes: Array<string>): RegExp {
31
+ const supportedPropertyEscapes = scriptCodes.map(code => {
32
+ try {
33
+ return new RegExp(`\\p{sc=${code}}`, 'u').source;
34
+ } catch (e) {
35
+ return null;
36
+ }
37
+ }).filter(pe => pe);
38
+ return new RegExp(supportedPropertyEscapes.join('|'), 'u');
39
+ }
40
+
41
+ /**
42
+ * ISO 15924 script codes of scripts that disallow letter spacing as of Unicode
43
+ * 16.0.0.
44
+ *
45
+ * In general, cursive scripts are incompatible with letter spacing.
46
+ */
47
+ const cursiveScriptCodes = [
48
+ 'Arab', // Arabic
49
+ 'Dupl', // Duployan
50
+ 'Mong', // Mongolian
51
+ 'Ougr', // Old Uyghur
52
+ 'Syrc', // Syriac
53
+ ];
54
+
55
+ const cursiveScriptRegExp = sanitizedRegExpFromScriptCodes(cursiveScriptCodes);
56
+
57
+ export function charAllowsLetterSpacing(char: number) {
58
+ return !cursiveScriptRegExp.test(String.fromCodePoint(char));
59
+ }
60
+
61
+ /**
62
+ * ISO 15924 script codes of scripts that allow ideographic line breaking beyond
63
+ * the CJKV scripts that are considered ideographic in Unicode 16.0.0.
64
+ */
65
+ const ideographicBreakingScriptCodes = [
66
+ 'Bopo', // Bopomofo
67
+ 'Hani', // Han
68
+ 'Hira', // Hiragana
69
+ 'Kana', // Katakana
70
+ 'Kits', // Khitan Small Script
71
+ 'Nshu', // Nushu
72
+ 'Tang', // Tangut
73
+ 'Yiii', // Yi
74
+ ];
75
+
76
+ const ideographicBreakingRegExp = sanitizedRegExpFromScriptCodes(ideographicBreakingScriptCodes);
77
+
78
+ export function charAllowsIdeographicBreaking(char: number) {
79
+ // Return early for characters outside all ideographic ranges.
80
+ if (char < 0x2E80) return false;
81
+
82
+ if (isChar['CJK Compatibility Forms'](char)) return true;
83
+ if (isChar['CJK Compatibility'](char)) return true;
84
+ if (isChar['CJK Strokes'](char)) return true;
85
+ if (isChar['CJK Symbols and Punctuation'](char)) return true;
86
+ if (isChar['Enclosed CJK Letters and Months'](char)) return true;
87
+ if (isChar['Halfwidth and Fullwidth Forms'](char)) return true;
88
+ if (isChar['Ideographic Description Characters'](char)) return true;
89
+ if (isChar['Vertical Forms'](char)) return true;
90
+ return ideographicBreakingRegExp.test(String.fromCodePoint(char));
91
+ }
92
+
93
+ // The following logic comes from
94
+ // <https://www.unicode.org/Public/16.0.0/ucd/VerticalOrientation.txt>.
95
+ // Keep it synchronized with
96
+ // <https://www.unicode.org/Public/UCD/latest/ucd/VerticalOrientation.txt>.
97
+ // The data file denotes with “U” or “Tu” any codepoint that may be drawn
98
+ // upright in vertical text but does not distinguish between upright and
99
+ // “neutral” characters.
100
+
101
+ // Blocks in the Unicode supplementary planes are excluded from this module due
102
+ // to <https://github.com/mapbox/mapbox-gl/issues/29>.
103
+
104
+ /**
105
+ * Returns true if the given Unicode codepoint identifies a character with
106
+ * upright orientation.
107
+ *
108
+ * A character has upright orientation if it is drawn upright (unrotated)
109
+ * whether the line is oriented horizontally or vertically, even if both
110
+ * adjacent characters can be rotated. For example, a Chinese character is
111
+ * always drawn upright. An uprightly oriented character causes an adjacent
112
+ * “neutral” character to be drawn upright as well.
113
+ */
114
+ export function charHasUprightVerticalOrientation(char: number) {
115
+ if (char === 0x02EA /* modifier letter yin departing tone mark */ ||
116
+ char === 0x02EB /* modifier letter yang departing tone mark */) {
117
+ return true;
118
+ }
119
+
120
+ // Return early for characters outside all ranges whose characters remain
121
+ // upright in vertical writing mode.
122
+ if (char < 0x1100) return false;
123
+
124
+ if (isChar['CJK Compatibility Forms'](char)) {
125
+ if (!((char >= 0xFE49 /* dashed overline */ && char <= 0xFE4F) /* wavy low line */)) {
126
+ return true;
127
+ }
128
+ }
129
+ if (isChar['CJK Compatibility'](char)) return true;
130
+ if (isChar['CJK Strokes'](char)) return true;
131
+ if (isChar['CJK Symbols and Punctuation'](char)) {
132
+ if (!((char >= 0x3008 /* left angle bracket */ && char <= 0x3011) /* right black lenticular bracket */) &&
133
+ !((char >= 0x3014 /* left tortoise shell bracket */ && char <= 0x301F) /* low double prime quotation mark */) &&
134
+ char !== 0x3030 /* wavy dash */) {
135
+ return true;
136
+ }
137
+ }
138
+ if (isChar['Enclosed CJK Letters and Months'](char)) return true;
139
+ if (isChar['Ideographic Description Characters'](char)) return true;
140
+ if (isChar['Kanbun'](char)) return true;
141
+ if (isChar['Katakana'](char)) {
142
+ if (char !== 0x30FC /* katakana-hiragana prolonged sound mark */) {
143
+ return true;
144
+ }
145
+ }
146
+ if (isChar['Halfwidth and Fullwidth Forms'](char)) {
147
+ if (char !== 0xFF08 /* fullwidth left parenthesis */ &&
148
+ char !== 0xFF09 /* fullwidth right parenthesis */ &&
149
+ char !== 0xFF0D /* fullwidth hyphen-minus */ &&
150
+ !((char >= 0xFF1A /* fullwidth colon */ && char <= 0xFF1E) /* fullwidth greater-than sign */) &&
151
+ char !== 0xFF3B /* fullwidth left square bracket */ &&
152
+ char !== 0xFF3D /* fullwidth right square bracket */ &&
153
+ char !== 0xFF3F /* fullwidth low line */ &&
154
+ !(char >= 0xFF5B /* fullwidth left curly bracket */ && char <= 0xFFDF) &&
155
+ char !== 0xFFE3 /* fullwidth macron */ &&
156
+ !(char >= 0xFFE8 /* halfwidth forms light vertical */ && char <= 0xFFEF)) {
157
+ return true;
158
+ }
159
+ }
160
+ if (isChar['Small Form Variants'](char)) {
161
+ if (!((char >= 0xFE58 /* small em dash */ && char <= 0xFE5E) /* small right tortoise shell bracket */) &&
162
+ !((char >= 0xFE63 /* small hyphen-minus */ && char <= 0xFE66) /* small equals sign */)) {
163
+ return true;
164
+ }
165
+ }
166
+ if (isChar['Vertical Forms'](char)) return true;
167
+ if (isChar['Yijing Hexagram Symbols'](char)) return true;
168
+
169
+ if (/* Canadian Aboriginal */ /\p{sc=Cans}/u.test(String.fromCodePoint(char))) return true;
170
+ if (/* Hangul */ /\p{sc=Hang}/u.test(String.fromCodePoint(char))) return true;
171
+ if (ideographicBreakingRegExp.test(String.fromCodePoint(char))) return true;
172
+
173
+ return false;
174
+ }
175
+
176
+ /**
177
+ * Returns true if the given Unicode codepoint identifies a character with
178
+ * neutral orientation.
179
+ *
180
+ * A character has neutral orientation if it may be drawn rotated or unrotated
181
+ * when the line is oriented vertically, depending on the orientation of the
182
+ * adjacent characters. For example, along a vertically oriented line, the vulgar
183
+ * fraction ½ is drawn upright among Chinese characters but rotated among Latin
184
+ * letters. A neutrally oriented character does not influence whether an
185
+ * adjacent character is drawn upright or rotated.
186
+ */
187
+ export function charHasNeutralVerticalOrientation(char: number) {
188
+ if (isChar['Latin-1 Supplement'](char)) {
189
+ if (char === 0x00A7 /* section sign */ ||
190
+ char === 0x00A9 /* copyright sign */ ||
191
+ char === 0x00AE /* registered sign */ ||
192
+ char === 0x00B1 /* plus-minus sign */ ||
193
+ char === 0x00BC /* vulgar fraction one quarter */ ||
194
+ char === 0x00BD /* vulgar fraction one half */ ||
195
+ char === 0x00BE /* vulgar fraction three quarters */ ||
196
+ char === 0x00D7 /* multiplication sign */ ||
197
+ char === 0x00F7 /* division sign */) {
198
+ return true;
199
+ }
200
+ }
201
+ if (isChar['General Punctuation'](char)) {
202
+ if (char === 0x2016 /* double vertical line */ ||
203
+ char === 0x2020 /* dagger */ ||
204
+ char === 0x2021 /* double dagger */ ||
205
+ char === 0x2030 /* per mille sign */ ||
206
+ char === 0x2031 /* per ten thousand sign */ ||
207
+ char === 0x203B /* reference mark */ ||
208
+ char === 0x203C /* double exclamation mark */ ||
209
+ char === 0x2042 /* asterism */ ||
210
+ char === 0x2047 /* double question mark */ ||
211
+ char === 0x2048 /* question exclamation mark */ ||
212
+ char === 0x2049 /* exclamation question mark */ ||
213
+ char === 0x2051 /* two asterisks aligned vertically */) {
214
+ return true;
215
+ }
216
+ }
217
+ if (isChar['Letterlike Symbols'](char)) return true;
218
+ if (isChar['Number Forms'](char)) return true;
219
+ if (isChar['Miscellaneous Technical'](char)) {
220
+ if ((char >= 0x2300 /* diameter sign */ && char <= 0x2307 /* wavy line */) ||
221
+ (char >= 0x230C /* bottom right crop */ && char <= 0x231F /* bottom right corner */) ||
222
+ (char >= 0x2324 /* up arrowhead between two horizontal bars */ && char <= 0x2328 /* keyboard */) ||
223
+ char === 0x232B /* erase to the left */ ||
224
+ (char >= 0x237D /* shouldered open box */ && char <= 0x239A /* clear screen symbol */) ||
225
+ (char >= 0x23BE /* dentistry symbol light vertical and top right */ && char <= 0x23CD /* square foot */) ||
226
+ char === 0x23CF /* eject symbol */ ||
227
+ (char >= 0x23D1 /* metrical breve */ && char <= 0x23DB /* fuse */) ||
228
+ (char >= 0x23E2 /* white trapezium */ && char <= 0x23FF)) {
229
+ return true;
230
+ }
231
+ }
232
+ if (isChar['Control Pictures'](char) && char !== 0x2423 /* open box */) return true;
233
+ if (isChar['Optical Character Recognition'](char)) return true;
234
+ if (isChar['Enclosed Alphanumerics'](char)) return true;
235
+ if (isChar['Geometric Shapes'](char)) return true;
236
+ if (isChar['Miscellaneous Symbols'](char)) {
237
+ if (!((char >= 0x261A /* black left pointing index */ && char <= 0x261F) /* white down pointing index */)) {
238
+ return true;
239
+ }
240
+ }
241
+ if (isChar['Miscellaneous Symbols and Arrows'](char)) {
242
+ if ((char >= 0x2B12 /* square with top half black */ && char <= 0x2B2F /* white vertical ellipse */) ||
243
+ (char >= 0x2B50 /* white medium star */ && char <= 0x2B59 /* heavy circled saltire */) ||
244
+ (char >= 0x2BB8 /* upwards white arrow from bar with horizontal bar */ && char <= 0x2BEB)) {
245
+ return true;
246
+ }
247
+ }
248
+ if (isChar['CJK Symbols and Punctuation'](char)) return true;
249
+ if (isChar['Katakana'](char)) return true;
250
+ if (isChar['Private Use Area'](char)) return true;
251
+ if (isChar['CJK Compatibility Forms'](char)) return true;
252
+ if (isChar['Small Form Variants'](char)) return true;
253
+ if (isChar['Halfwidth and Fullwidth Forms'](char)) return true;
254
+
255
+ if (char === 0x221E /* infinity */ ||
256
+ char === 0x2234 /* therefore */ ||
257
+ char === 0x2235 /* because */ ||
258
+ (char >= 0x2700 /* black safety scissors */ && char <= 0x2767 /* rotated floral heart bullet */) ||
259
+ (char >= 0x2776 /* dingbat negative circled digit one */ && char <= 0x2793 /* dingbat negative circled sans-serif number ten */) ||
260
+ char === 0xFFFC /* object replacement character */ ||
261
+ char === 0xFFFD /* replacement character */) {
262
+ return true;
263
+ }
264
+
265
+ return false;
266
+ }
267
+
268
+ /**
269
+ * Returns true if the given Unicode codepoint identifies a character with
270
+ * rotated orientation.
271
+ *
272
+ * A character has rotated orientation if it is drawn rotated when the line is
273
+ * oriented vertically, even if both adjacent characters are upright. For
274
+ * example, a Latin letter is drawn rotated along a vertical line. A rotated
275
+ * character causes an adjacent “neutral” character to be drawn rotated as well.
276
+ */
277
+ export function charHasRotatedVerticalOrientation(char: number) {
278
+ return !(charHasUprightVerticalOrientation(char) ||
279
+ charHasNeutralVerticalOrientation(char));
280
+ }
281
+
282
+ export function charInComplexShapingScript(char: number) {
283
+ return /\p{sc=Arab}/u.test(String.fromCodePoint(char));
284
+ }
285
+
286
+ /**
287
+ * ISO 15924 script codes of scripts that are primarily written horizontally
288
+ * right-to-left according to Unicode 16.0.0.
289
+ */
290
+ const rtlScriptCodes = [
291
+ 'Adlm', // Adlam
292
+ 'Arab', // Arabic
293
+ 'Armi', // Imperial Aramaic
294
+ 'Avst', // Avestan
295
+ 'Chrs', // Chorasmian
296
+ 'Cprt', // Cypriot
297
+ 'Egyp', // Egyptian Hieroglyphs
298
+ 'Elym', // Elymaic
299
+ 'Gara', // Garay
300
+ 'Hatr', // Hatran
301
+ 'Hebr', // Hebrew
302
+ 'Hung', // Old Hungarian
303
+ 'Khar', // Kharoshthi
304
+ 'Lydi', // Lydian
305
+ 'Mand', // Mandaic
306
+ 'Mani', // Manichaean
307
+ 'Mend', // Mende Kikakui
308
+ 'Merc', // Meroitic Cursive
309
+ 'Mero', // Meroitic Hieroglyphs
310
+ 'Narb', // Old North Arabian
311
+ 'Nbat', // Nabataean
312
+ 'Nkoo', // NKo
313
+ 'Orkh', // Old Turkic
314
+ 'Palm', // Palmyrene
315
+ 'Phli', // Inscriptional Pahlavi
316
+ 'Phlp', // Psalter Pahlavi
317
+ 'Phnx', // Phoenician
318
+ 'Prti', // Inscriptional Parthian
319
+ 'Rohg', // Hanifi Rohingya
320
+ 'Samr', // Samaritan
321
+ 'Sarb', // Old South Arabian
322
+ 'Sogo', // Old Sogdian
323
+ 'Syrc', // Syriac
324
+ 'Thaa', // Thaana
325
+ 'Todr', // Todhri
326
+ 'Yezi', // Yezidi
327
+ ];
328
+
329
+ const rtlScriptRegExp = sanitizedRegExpFromScriptCodes(rtlScriptCodes);
330
+
331
+ export function charInRTLScript(char: number) {
332
+ return rtlScriptRegExp.test(String.fromCodePoint(char));
333
+ }
334
+
335
+ export function charInSupportedScript(char: number, canRenderRTL: boolean) {
336
+ // This is a rough heuristic: whether we "can render" a script
337
+ // actually depends on the properties of the font being used
338
+ // and whether differences from the ideal rendering are considered
339
+ // semantically significant.
340
+
341
+ // Even in Latin script, we "can't render" combinations such as the fi
342
+ // ligature, but we don't consider that semantically significant.
343
+ if (!canRenderRTL && charInRTLScript(char)) {
344
+ return false;
345
+ }
346
+ if ((char >= 0x0900 && char <= 0x0DFF) ||
347
+ // Main blocks for Indic scripts and Sinhala
348
+ (char >= 0x0F00 && char <= 0x109F) ||
349
+ // Main blocks for Tibetan and Myanmar
350
+ isChar['Khmer'](char)) {
351
+ // These blocks cover common scripts that require
352
+ // complex text shaping, based on unicode script metadata:
353
+ // https://www.unicode.org/repos/cldr/trunk/common/properties/scriptMetadata.txt
354
+ // where "Web Rank <= 32" "Shaping Required = YES"
355
+ return false;
356
+ }
357
+ return true;
358
+ }
359
+
360
+ export function stringContainsRTLText(chars: string): boolean {
361
+ for (const char of chars) {
362
+ if (charInRTLScript(char.charCodeAt(0))) {
363
+ return true;
364
+ }
365
+ }
366
+ return false;
367
+ }
368
+
369
+ export function isStringInSupportedScript(chars: string, canRenderRTL: boolean) {
370
+ for (const char of chars) {
371
+ if (!charInSupportedScript(char.charCodeAt(0), canRenderRTL)) {
372
+ return false;
373
+ }
374
+ }
375
+ return true;
376
+ }
@@ -0,0 +1,97 @@
1
+ import Point from '@mapbox/point-geometry';
2
+ import {LngLat} from '../geo/lng_lat';
3
+ import {Transform} from '../geo/transform';
4
+ import {smartWrap} from './smart_wrap';
5
+
6
+ const transform = new Transform();
7
+ transform.width = 100;
8
+ transform.height = 100;
9
+ transform.getHorizon = () => 0; // map center
10
+
11
+ describe('smartWrap', () => {
12
+ test('Shifts lng to -360 deg when such point is closer to the priorPos', () => {
13
+ transform.locationPoint = ((ll: LngLat) => {
14
+ if (ll.lng === -360) {
15
+ return new Point(90, 51); // close to priorPos & below horizon
16
+ } else {
17
+ return new Point(120, 51);
18
+ }
19
+ });
20
+
21
+ const result = smartWrap(
22
+ new LngLat(0, 0),
23
+ new Point(100, 51),
24
+ transform);
25
+ expect(result.lng).toBe(-360);
26
+ });
27
+
28
+ test('Shifts lng to +360 deg when such point is closer to the priorPos', () => {
29
+ transform.locationPoint = ((ll: LngLat) => {
30
+ if (ll.lng === 360) {
31
+ return new Point(90, 51); // close to priorPos & below horizon
32
+ } else {
33
+ return new Point(120, 51);
34
+ }
35
+ });
36
+
37
+ const result = smartWrap(
38
+ new LngLat(0, 0),
39
+ new Point(100, 51),
40
+ transform);
41
+ expect(result.lng).toBe(360);
42
+ });
43
+
44
+ test('Does not change lng when there are no closer points at -360 and +360 deg', () => {
45
+ transform.locationPoint = ((ll: LngLat) => {
46
+ if (ll.lng === 15) {
47
+ return new Point(90, 51); // close to priorPos & below horizon
48
+ } else {
49
+ return new Point(12000, 51);
50
+ }
51
+ });
52
+
53
+ const result = smartWrap(
54
+ new LngLat(15, 0),
55
+ new Point(100, 51),
56
+ transform);
57
+ expect(result.lng).toBe(15);
58
+ });
59
+
60
+ test('Does not change lng to -360 deg when such point is above horizon', () => {
61
+ transform.locationPoint = ((ll: LngLat) => {
62
+ if (ll.lng === -360) {
63
+ return new Point(90, 49); // close to priorPos BUT above horizon
64
+ } else {
65
+ return new Point(120, 51);
66
+ }
67
+ });
68
+
69
+ const result = smartWrap(
70
+ new LngLat(0, 0),
71
+ new Point(100, 51),
72
+ transform);
73
+ expect(result.lng).toBe(0);
74
+ });
75
+
76
+ test('Shifts lng to -360 if lng is outside viewport on the right and at least 180° from map center', () => {
77
+ transform.center.lng = 50;
78
+ transform.locationPoint = (() => { return new Point(110, 51); }); // outside viewport
79
+
80
+ const result = smartWrap(
81
+ new LngLat(250, 0), // 200 from map center
82
+ new Point(0, 0), // priorPos doesn't matter in this case
83
+ transform);
84
+ expect(result.lng).toBe(-110);
85
+ });
86
+
87
+ test('Shifts lng to +360 if lng is outside viewport on the left and at least 180° from map center', () => {
88
+ transform.center.lng = 50;
89
+ transform.locationPoint = (() => { return new Point(-10, 51); }); // outside viewport
90
+
91
+ const result = smartWrap(
92
+ new LngLat(-150, 0), // 200 from map center
93
+ new Point(0, 0), // priorPos doesn't matter in this case
94
+ transform);
95
+ expect(result.lng).toBe(210);
96
+ });
97
+ });
@@ -0,0 +1,58 @@
1
+ import {LngLat} from '../geo/lng_lat';
2
+
3
+ import type Point from '@mapbox/point-geometry';
4
+ import type {Transform} from '../geo/transform';
5
+
6
+ /**
7
+ * Given a LngLat, prior projected position, and a transform, return a new LngLat shifted
8
+ * n × 360° east or west for some n ≥ 0 such that:
9
+ *
10
+ * * the projected location of the result is on screen, if possible, and secondarily:
11
+ * * the difference between the projected location of the result and the prior position
12
+ * is minimized.
13
+ *
14
+ * The object is to preserve perceived object constancy for Popups and Markers as much as
15
+ * possible; they should avoid shifting large distances across the screen, even when the
16
+ * map center changes by ±360° due to automatic wrapping, and when about to go off screen,
17
+ * should wrap just enough to avoid doing so.
18
+ */
19
+ export function smartWrap(lngLat: LngLat, priorPos: Point, transform: Transform): LngLat {
20
+ const originalLngLat = new LngLat(lngLat.lng, lngLat.lat);
21
+ lngLat = new LngLat(lngLat.lng, lngLat.lat);
22
+
23
+ // First, try shifting one world in either direction, and see if either is closer to the
24
+ // prior position. This preserves object constancy when the map center is auto-wrapped
25
+ // during animations.
26
+ if (priorPos) {
27
+ const left = new LngLat(lngLat.lng - 360, lngLat.lat);
28
+ const right = new LngLat(lngLat.lng + 360, lngLat.lat);
29
+ const delta = transform.locationPoint(lngLat).distSqr(priorPos);
30
+ if (transform.locationPoint(left).distSqr(priorPos) < delta) {
31
+ lngLat = left;
32
+ } else if (transform.locationPoint(right).distSqr(priorPos) < delta) {
33
+ lngLat = right;
34
+ }
35
+ }
36
+
37
+ // Second, wrap toward the center until the new position is on screen, or we can't get
38
+ // any closer.
39
+ while (Math.abs(lngLat.lng - transform.center.lng) > 180) {
40
+ const pos = transform.locationPoint(lngLat);
41
+ if (pos.x >= 0 && pos.y >= 0 && pos.x <= transform.width && pos.y <= transform.height) {
42
+ break;
43
+ }
44
+ if (lngLat.lng > transform.center.lng) {
45
+ lngLat.lng -= 360;
46
+ } else {
47
+ lngLat.lng += 360;
48
+ }
49
+ }
50
+
51
+ // Apply the change only if new coord is below horizon
52
+ if (lngLat.lng !== originalLngLat.lng &&
53
+ transform.locationPoint(lngLat).y > (transform.height / 2 - transform.getHorizon())) {
54
+ return lngLat;
55
+ }
56
+
57
+ return originalLngLat;
58
+ }
@@ -0,0 +1,101 @@
1
+ import {StructArrayLayout3i6, FeatureIndexArray} from '../data/array_types.g';
2
+
3
+ describe('StructArray', () => {
4
+ class TestArray extends StructArrayLayout3i6 {}
5
+
6
+ test('array constructs itself', () => {
7
+ const array = new TestArray();
8
+ expect(array).toHaveLength(0);
9
+ expect(array.arrayBuffer).toBeTruthy();
10
+ });
11
+
12
+ test('emplaceBack', () => {
13
+ const array = new TestArray();
14
+
15
+ expect(0).toBe(array.emplaceBack(1, 7, 3));
16
+ expect(1).toBe(array.emplaceBack(4, 2, 5));
17
+
18
+ expect(array).toHaveLength(2);
19
+
20
+ expect(array.int16.slice(0, 6)).toEqual(new Int16Array([1, 7, 3, 4, 2, 5]));
21
+ });
22
+
23
+ test('emplaceBack gracefully accepts extra arguments', () => {
24
+ // emplaceBack is typically used in fairly hot code paths, where
25
+ // conditionally varying the number of arguments can be expensive.
26
+ const array = new TestArray();
27
+ expect((array as any).emplaceBack(3, 1, 4, 1, 5, 9)).toBe(0);
28
+ expect(array).toHaveLength(1);
29
+ expect(array.int16.slice(0, 3)).toEqual(new Int16Array([3, 1, 4]));
30
+ });
31
+
32
+ test('reserve', () => {
33
+ const array = new TestArray();
34
+
35
+ array.reserve(100);
36
+ const initialCapacity = array.capacity;
37
+
38
+ for (let i = 0; i < 100; i++) {
39
+ array.emplaceBack(1, 1, 1);
40
+ expect(array.capacity).toBe(initialCapacity);
41
+ }
42
+ });
43
+
44
+ test('automatically resizes', () => {
45
+ const array = new TestArray();
46
+ const initialCapacity = array.capacity;
47
+
48
+ while (initialCapacity > array.length) {
49
+ array.emplaceBack(1, 1, 1);
50
+ }
51
+
52
+ expect(array.capacity).toBe(initialCapacity);
53
+
54
+ array.emplaceBack(1, 1, 1);
55
+ expect(array.capacity > initialCapacity).toBeTruthy();
56
+ });
57
+
58
+ test('trims', () => {
59
+ const array = new TestArray();
60
+ const capacityInitial = array.capacity;
61
+
62
+ array.emplaceBack(1, 1, 1);
63
+ expect(array.capacity).toBe(capacityInitial);
64
+
65
+ array._trim();
66
+ expect(array.capacity).toBe(1);
67
+ expect(array.arrayBuffer.byteLength).toBe(array.bytesPerElement);
68
+ });
69
+ });
70
+
71
+ describe('FeatureIndexArray', () => {
72
+ class TestArray extends FeatureIndexArray {}
73
+
74
+ test('array constructs itself', () => {
75
+ const array = new TestArray();
76
+ expect(array).toHaveLength(0);
77
+ expect(array.arrayBuffer).toBeTruthy();
78
+ });
79
+
80
+ test('emplace and retrieve', () => {
81
+ const array = new TestArray();
82
+ expect(0).toBe(array.emplaceBack(1, 7, 3));
83
+ expect(1).toBe(array.emplaceBack(4, 2, 5));
84
+
85
+ expect(array).toHaveLength(2);
86
+
87
+ const elem0 = array.get(0);
88
+ expect(elem0).toBeTruthy();
89
+
90
+ expect(elem0.featureIndex).toBe(1);
91
+ expect(elem0.sourceLayerIndex).toBe(7);
92
+ expect(elem0.bucketIndex).toBe(3);
93
+
94
+ const elem1 = array.get(1);
95
+ expect(elem1).toBeTruthy();
96
+
97
+ expect(elem1.featureIndex).toBe(4);
98
+ expect(elem1.sourceLayerIndex).toBe(2);
99
+ expect(elem1.bucketIndex).toBe(5);
100
+ });
101
+ });