@mapwhit/tilerenderer 0.47.1

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 (356) hide show
  1. package/LICENSE.txt +87 -0
  2. package/README.md +25 -0
  3. package/build/min/.dir +0 -0
  4. package/build/min/package.json +3 -0
  5. package/build/min/src/shaders/_prelude.fragment.glsl.txt +13 -0
  6. package/build/min/src/shaders/_prelude.vertex.glsl.txt +14 -0
  7. package/build/min/src/shaders/background.fragment.glsl.txt +5 -0
  8. package/build/min/src/shaders/background.vertex.glsl.txt +1 -0
  9. package/build/min/src/shaders/background_pattern.fragment.glsl.txt +5 -0
  10. package/build/min/src/shaders/background_pattern.vertex.glsl.txt +1 -0
  11. package/build/min/src/shaders/circle.fragment.glsl.txt +20 -0
  12. package/build/min/src/shaders/circle.vertex.glsl.txt +17 -0
  13. package/build/min/src/shaders/clipping_mask.fragment.glsl.txt +1 -0
  14. package/build/min/src/shaders/clipping_mask.vertex.glsl.txt +1 -0
  15. package/build/min/src/shaders/collision_box.fragment.glsl.txt +1 -0
  16. package/build/min/src/shaders/collision_box.vertex.glsl.txt +1 -0
  17. package/build/min/src/shaders/collision_circle.fragment.glsl.txt +1 -0
  18. package/build/min/src/shaders/collision_circle.vertex.glsl.txt +1 -0
  19. package/build/min/src/shaders/debug.fragment.glsl.txt +1 -0
  20. package/build/min/src/shaders/debug.vertex.glsl.txt +1 -0
  21. package/build/min/src/shaders/fill.fragment.glsl.txt +10 -0
  22. package/build/min/src/shaders/fill.vertex.glsl.txt +7 -0
  23. package/build/min/src/shaders/fill_extrusion.fragment.glsl.txt +13 -0
  24. package/build/min/src/shaders/fill_extrusion.vertex.glsl.txt +9 -0
  25. package/build/min/src/shaders/fill_extrusion_pattern.fragment.glsl.txt +15 -0
  26. package/build/min/src/shaders/fill_extrusion_pattern.vertex.glsl.txt +11 -0
  27. package/build/min/src/shaders/fill_outline.fragment.glsl.txt +10 -0
  28. package/build/min/src/shaders/fill_outline.vertex.glsl.txt +7 -0
  29. package/build/min/src/shaders/fill_outline_pattern.fragment.glsl.txt +13 -0
  30. package/build/min/src/shaders/fill_outline_pattern.vertex.glsl.txt +9 -0
  31. package/build/min/src/shaders/fill_pattern.fragment.glsl.txt +13 -0
  32. package/build/min/src/shaders/fill_pattern.vertex.glsl.txt +9 -0
  33. package/build/min/src/shaders/heatmap.fragment.glsl.txt +10 -0
  34. package/build/min/src/shaders/heatmap.vertex.glsl.txt +8 -0
  35. package/build/min/src/shaders/heatmap_texture.fragment.glsl.txt +5 -0
  36. package/build/min/src/shaders/heatmap_texture.vertex.glsl.txt +1 -0
  37. package/build/min/src/shaders/hillshade.fragment.glsl.txt +7 -0
  38. package/build/min/src/shaders/hillshade.vertex.glsl.txt +1 -0
  39. package/build/min/src/shaders/hillshade_prepare.fragment.glsl.txt +8 -0
  40. package/build/min/src/shaders/hillshade_prepare.vertex.glsl.txt +1 -0
  41. package/build/min/src/shaders/line.fragment.glsl.txt +12 -0
  42. package/build/min/src/shaders/line.vertex.glsl.txt +17 -0
  43. package/build/min/src/shaders/line_gradient.fragment.glsl.txt +10 -0
  44. package/build/min/src/shaders/line_gradient.vertex.glsl.txt +16 -0
  45. package/build/min/src/shaders/line_pattern.fragment.glsl.txt +15 -0
  46. package/build/min/src/shaders/line_pattern.vertex.glsl.txt +20 -0
  47. package/build/min/src/shaders/line_sdf.fragment.glsl.txt +17 -0
  48. package/build/min/src/shaders/line_sdf.vertex.glsl.txt +20 -0
  49. package/build/min/src/shaders/raster.fragment.glsl.txt +5 -0
  50. package/build/min/src/shaders/raster.vertex.glsl.txt +1 -0
  51. package/build/min/src/shaders/symbol_icon.fragment.glsl.txt +9 -0
  52. package/build/min/src/shaders/symbol_icon.vertex.glsl.txt +5 -0
  53. package/build/min/src/shaders/symbol_sdf.fragment.glsl.txt +19 -0
  54. package/build/min/src/shaders/symbol_sdf.vertex.glsl.txt +13 -0
  55. package/package.json +44 -0
  56. package/src/css/mapbox-gl.css +506 -0
  57. package/src/css/svg/mapboxgl-ctrl-attrib.svg +3 -0
  58. package/src/css/svg/mapboxgl-ctrl-compass.svg +4 -0
  59. package/src/css/svg/mapboxgl-ctrl-fullscreen.svg +3 -0
  60. package/src/css/svg/mapboxgl-ctrl-geolocate-background.svg +3 -0
  61. package/src/css/svg/mapboxgl-ctrl-geolocate.svg +3 -0
  62. package/src/css/svg/mapboxgl-ctrl-logo-compact.svg +2 -0
  63. package/src/css/svg/mapboxgl-ctrl-logo.svg +1 -0
  64. package/src/css/svg/mapboxgl-ctrl-shrink.svg +3 -0
  65. package/src/css/svg/mapboxgl-ctrl-zoom-in.svg +3 -0
  66. package/src/css/svg/mapboxgl-ctrl-zoom-out.svg +3 -0
  67. package/src/data/array_types.js +1138 -0
  68. package/src/data/bucket/circle_attributes.js +5 -0
  69. package/src/data/bucket/circle_bucket.js +118 -0
  70. package/src/data/bucket/fill_attributes.js +5 -0
  71. package/src/data/bucket/fill_bucket.js +166 -0
  72. package/src/data/bucket/fill_extrusion_attributes.js +11 -0
  73. package/src/data/bucket/fill_extrusion_bucket.js +247 -0
  74. package/src/data/bucket/heatmap_bucket.js +12 -0
  75. package/src/data/bucket/line_attributes.js +11 -0
  76. package/src/data/bucket/line_bucket.js +625 -0
  77. package/src/data/bucket/pattern_attributes.js +9 -0
  78. package/src/data/bucket/pattern_bucket_features.js +44 -0
  79. package/src/data/bucket/symbol_attributes.js +95 -0
  80. package/src/data/bucket/symbol_bucket.js +697 -0
  81. package/src/data/bucket.js +53 -0
  82. package/src/data/dem_data.js +126 -0
  83. package/src/data/extent.js +17 -0
  84. package/src/data/feature_index.js +254 -0
  85. package/src/data/index_array_type.js +14 -0
  86. package/src/data/load_geometry.js +42 -0
  87. package/src/data/pos_attributes.js +3 -0
  88. package/src/data/program_configuration.js +782 -0
  89. package/src/data/raster_bounds_attributes.js +6 -0
  90. package/src/data/segment.js +63 -0
  91. package/src/geo/coordinate.js +78 -0
  92. package/src/geo/lng_lat.js +129 -0
  93. package/src/geo/lng_lat_bounds.js +253 -0
  94. package/src/geo/transform.js +605 -0
  95. package/src/gl/color_mode.js +21 -0
  96. package/src/gl/context.js +193 -0
  97. package/src/gl/cull_face_mode.js +22 -0
  98. package/src/gl/depth_mode.js +18 -0
  99. package/src/gl/framebuffer.js +28 -0
  100. package/src/gl/index_buffer.js +52 -0
  101. package/src/gl/stencil_mode.js +17 -0
  102. package/src/gl/types.js +0 -0
  103. package/src/gl/value.js +676 -0
  104. package/src/gl/vertex_buffer.js +101 -0
  105. package/src/index.js +50 -0
  106. package/src/render/draw_background.js +60 -0
  107. package/src/render/draw_circle.js +55 -0
  108. package/src/render/draw_collision_debug.js +45 -0
  109. package/src/render/draw_debug.js +429 -0
  110. package/src/render/draw_fill.js +143 -0
  111. package/src/render/draw_fill_extrusion.js +101 -0
  112. package/src/render/draw_heatmap.js +159 -0
  113. package/src/render/draw_hillshade.js +144 -0
  114. package/src/render/draw_line.js +99 -0
  115. package/src/render/draw_raster.js +151 -0
  116. package/src/render/draw_symbol.js +231 -0
  117. package/src/render/glyph_atlas.js +55 -0
  118. package/src/render/glyph_manager.js +145 -0
  119. package/src/render/image_atlas.js +97 -0
  120. package/src/render/image_manager.js +183 -0
  121. package/src/render/line_atlas.js +139 -0
  122. package/src/render/painter.js +483 -0
  123. package/src/render/program/background_program.js +46 -0
  124. package/src/render/program/circle_program.js +40 -0
  125. package/src/render/program/clipping_mask_program.js +11 -0
  126. package/src/render/program/collision_program.js +28 -0
  127. package/src/render/program/debug_program.js +13 -0
  128. package/src/render/program/fill_extrusion_program.js +76 -0
  129. package/src/render/program/fill_program.js +60 -0
  130. package/src/render/program/heatmap_program.js +46 -0
  131. package/src/render/program/hillshade_program.js +77 -0
  132. package/src/render/program/line_program.js +119 -0
  133. package/src/render/program/pattern.js +57 -0
  134. package/src/render/program/program_uniforms.js +46 -0
  135. package/src/render/program/raster_program.js +50 -0
  136. package/src/render/program/symbol_program.js +112 -0
  137. package/src/render/program.js +133 -0
  138. package/src/render/texture.js +88 -0
  139. package/src/render/tile_mask.js +108 -0
  140. package/src/render/uniform_binding.js +129 -0
  141. package/src/render/vertex_array_object.js +155 -0
  142. package/src/shaders/README.md +42 -0
  143. package/src/shaders/_prelude.fragment.glsl +17 -0
  144. package/src/shaders/_prelude.vertex.glsl +73 -0
  145. package/src/shaders/background.fragment.glsl +10 -0
  146. package/src/shaders/background.vertex.glsl +7 -0
  147. package/src/shaders/background_pattern.fragment.glsl +28 -0
  148. package/src/shaders/background_pattern.vertex.glsl +20 -0
  149. package/src/shaders/circle.fragment.glsl +39 -0
  150. package/src/shaders/circle.vertex.glsl +63 -0
  151. package/src/shaders/clipping_mask.fragment.glsl +3 -0
  152. package/src/shaders/clipping_mask.vertex.glsl +7 -0
  153. package/src/shaders/collision_box.fragment.glsl +21 -0
  154. package/src/shaders/collision_box.vertex.glsl +26 -0
  155. package/src/shaders/collision_circle.fragment.glsl +34 -0
  156. package/src/shaders/collision_circle.vertex.glsl +36 -0
  157. package/src/shaders/debug.fragment.glsl +5 -0
  158. package/src/shaders/debug.vertex.glsl +7 -0
  159. package/src/shaders/encode_attribute.js +19 -0
  160. package/src/shaders/fill.fragment.glsl +13 -0
  161. package/src/shaders/fill.vertex.glsl +13 -0
  162. package/src/shaders/fill_extrusion.fragment.glsl +16 -0
  163. package/src/shaders/fill_extrusion.vertex.glsl +66 -0
  164. package/src/shaders/fill_extrusion_pattern.fragment.glsl +41 -0
  165. package/src/shaders/fill_extrusion_pattern.vertex.glsl +76 -0
  166. package/src/shaders/fill_outline.fragment.glsl +17 -0
  167. package/src/shaders/fill_outline.vertex.glsl +17 -0
  168. package/src/shaders/fill_outline_pattern.fragment.glsl +43 -0
  169. package/src/shaders/fill_outline_pattern.vertex.glsl +41 -0
  170. package/src/shaders/fill_pattern.fragment.glsl +36 -0
  171. package/src/shaders/fill_pattern.vertex.glsl +36 -0
  172. package/src/shaders/heatmap.fragment.glsl +21 -0
  173. package/src/shaders/heatmap.vertex.glsl +53 -0
  174. package/src/shaders/heatmap_texture.fragment.glsl +14 -0
  175. package/src/shaders/heatmap_texture.vertex.glsl +11 -0
  176. package/src/shaders/hillshade.fragment.glsl +52 -0
  177. package/src/shaders/hillshade.vertex.glsl +11 -0
  178. package/src/shaders/hillshade_prepare.fragment.glsl +72 -0
  179. package/src/shaders/hillshade_prepare.vertex.glsl +15 -0
  180. package/src/shaders/index.js +194 -0
  181. package/src/shaders/line.fragment.glsl +28 -0
  182. package/src/shaders/line.vertex.glsl +84 -0
  183. package/src/shaders/line_gradient.fragment.glsl +34 -0
  184. package/src/shaders/line_gradient.vertex.glsl +84 -0
  185. package/src/shaders/line_pattern.fragment.glsl +69 -0
  186. package/src/shaders/line_pattern.vertex.glsl +88 -0
  187. package/src/shaders/line_sdf.fragment.glsl +44 -0
  188. package/src/shaders/line_sdf.vertex.glsl +95 -0
  189. package/src/shaders/raster.fragment.glsl +52 -0
  190. package/src/shaders/raster.vertex.glsl +21 -0
  191. package/src/shaders/symbol_icon.fragment.glsl +17 -0
  192. package/src/shaders/symbol_icon.vertex.glsl +91 -0
  193. package/src/shaders/symbol_sdf.fragment.glsl +50 -0
  194. package/src/shaders/symbol_sdf.vertex.glsl +117 -0
  195. package/src/source/geojson_source.js +267 -0
  196. package/src/source/geojson_worker_source.js +210 -0
  197. package/src/source/geojson_wrapper.js +67 -0
  198. package/src/source/image_source.js +213 -0
  199. package/src/source/load_tilejson.js +40 -0
  200. package/src/source/pixels_to_tile_units.js +17 -0
  201. package/src/source/query_features.js +198 -0
  202. package/src/source/raster_dem_tile_source.js +140 -0
  203. package/src/source/raster_dem_tile_worker_source.js +26 -0
  204. package/src/source/raster_tile_source.js +126 -0
  205. package/src/source/rtl_text_plugin.js +63 -0
  206. package/src/source/source.js +75 -0
  207. package/src/source/source_cache.js +794 -0
  208. package/src/source/source_state.js +55 -0
  209. package/src/source/tile.js +332 -0
  210. package/src/source/tile_bounds.js +40 -0
  211. package/src/source/tile_cache.js +122 -0
  212. package/src/source/tile_id.js +150 -0
  213. package/src/source/vector_tile_source.js +144 -0
  214. package/src/source/vector_tile_worker_source.js +126 -0
  215. package/src/source/worker.js +175 -0
  216. package/src/source/worker_source.js +14 -0
  217. package/src/source/worker_tile.js +199 -0
  218. package/src/style/create_style_layer.js +25 -0
  219. package/src/style/evaluation_parameters.js +45 -0
  220. package/src/style/light.js +112 -0
  221. package/src/style/load_glyph_range.js +17 -0
  222. package/src/style/load_sprite.js +26 -0
  223. package/src/style/parse_glyph_pbf.js +45 -0
  224. package/src/style/pauseable_placement.js +88 -0
  225. package/src/style/properties.js +691 -0
  226. package/src/style/query_utils.js +39 -0
  227. package/src/style/style.js +955 -0
  228. package/src/style/style_layer/background_style_layer.js +11 -0
  229. package/src/style/style_layer/background_style_layer_properties.js +25 -0
  230. package/src/style/style_layer/circle_style_layer.js +93 -0
  231. package/src/style/style_layer/circle_style_layer_properties.js +76 -0
  232. package/src/style/style_layer/fill_extrusion_style_layer.js +194 -0
  233. package/src/style/style_layer/fill_extrusion_style_layer_properties.js +56 -0
  234. package/src/style/style_layer/fill_style_layer.js +46 -0
  235. package/src/style/style_layer/fill_style_layer_properties.js +45 -0
  236. package/src/style/style_layer/heatmap_style_layer.js +51 -0
  237. package/src/style/style_layer/heatmap_style_layer_properties.js +52 -0
  238. package/src/style/style_layer/hillshade_style_layer.js +15 -0
  239. package/src/style/style_layer/hillshade_style_layer_properties.js +43 -0
  240. package/src/style/style_layer/line_style_layer.js +129 -0
  241. package/src/style/style_layer/line_style_layer_properties.js +104 -0
  242. package/src/style/style_layer/raster_style_layer.js +11 -0
  243. package/src/style/style_layer/raster_style_layer_properties.js +55 -0
  244. package/src/style/style_layer/symbol_style_layer.js +66 -0
  245. package/src/style/style_layer/symbol_style_layer_properties.js +288 -0
  246. package/src/style/style_layer.js +183 -0
  247. package/src/style/style_layer_index.js +61 -0
  248. package/src/style/zoom_history.js +36 -0
  249. package/src/style-spec/deref.js +51 -0
  250. package/src/style-spec/error/parsing_error.js +8 -0
  251. package/src/style-spec/error/validation_error.js +10 -0
  252. package/src/style-spec/expression/compound_expression.js +118 -0
  253. package/src/style-spec/expression/definitions/array.js +82 -0
  254. package/src/style-spec/expression/definitions/assertion.js +69 -0
  255. package/src/style-spec/expression/definitions/at.js +57 -0
  256. package/src/style-spec/expression/definitions/case.js +73 -0
  257. package/src/style-spec/expression/definitions/coalesce.js +68 -0
  258. package/src/style-spec/expression/definitions/coercion.js +96 -0
  259. package/src/style-spec/expression/definitions/collator.js +102 -0
  260. package/src/style-spec/expression/definitions/equals.js +93 -0
  261. package/src/style-spec/expression/definitions/index.js +407 -0
  262. package/src/style-spec/expression/definitions/interpolate.js +235 -0
  263. package/src/style-spec/expression/definitions/length.js +54 -0
  264. package/src/style-spec/expression/definitions/let.js +60 -0
  265. package/src/style-spec/expression/definitions/literal.js +64 -0
  266. package/src/style-spec/expression/definitions/match.js +142 -0
  267. package/src/style-spec/expression/definitions/step.js +116 -0
  268. package/src/style-spec/expression/definitions/var.js +38 -0
  269. package/src/style-spec/expression/evaluation_context.js +35 -0
  270. package/src/style-spec/expression/index.js +329 -0
  271. package/src/style-spec/expression/is_constant.js +63 -0
  272. package/src/style-spec/expression/parsing_context.js +213 -0
  273. package/src/style-spec/expression/parsing_error.js +9 -0
  274. package/src/style-spec/expression/runtime_error.js +12 -0
  275. package/src/style-spec/expression/scope.js +34 -0
  276. package/src/style-spec/expression/stops.js +37 -0
  277. package/src/style-spec/expression/types.js +77 -0
  278. package/src/style-spec/expression/values.js +126 -0
  279. package/src/style-spec/feature_filter/README.md +55 -0
  280. package/src/style-spec/feature_filter/index.js +158 -0
  281. package/src/style-spec/function/convert.js +256 -0
  282. package/src/style-spec/function/index.js +299 -0
  283. package/src/style-spec/group_by_layout.js +68 -0
  284. package/src/style-spec/reference/v8.json +5356 -0
  285. package/src/style-spec/util/color.js +73 -0
  286. package/src/style-spec/util/color_spaces.js +128 -0
  287. package/src/style-spec/util/eval_support.js +8 -0
  288. package/src/style-spec/util/get_type.js +18 -0
  289. package/src/style-spec/util/interpolate.js +21 -0
  290. package/src/style-spec/util/properties.js +17 -0
  291. package/src/style-spec/util/ref_properties.js +1 -0
  292. package/src/style-spec/util/result.js +19 -0
  293. package/src/symbol/anchor.js +21 -0
  294. package/src/symbol/check_max_angle.js +75 -0
  295. package/src/symbol/clip_line.js +73 -0
  296. package/src/symbol/collision_feature.js +230 -0
  297. package/src/symbol/collision_index.js +379 -0
  298. package/src/symbol/cross_tile_symbol_index.js +270 -0
  299. package/src/symbol/get_anchors.js +177 -0
  300. package/src/symbol/grid_index.js +318 -0
  301. package/src/symbol/mergelines.js +75 -0
  302. package/src/symbol/opacity_state.js +21 -0
  303. package/src/symbol/placement.js +563 -0
  304. package/src/symbol/projection.js +601 -0
  305. package/src/symbol/quads.js +173 -0
  306. package/src/symbol/shaping.js +347 -0
  307. package/src/symbol/symbol_layout.js +519 -0
  308. package/src/symbol/symbol_size.js +110 -0
  309. package/src/symbol/transform_text.js +16 -0
  310. package/src/ui/anchor.js +24 -0
  311. package/src/ui/bind_handlers.js +199 -0
  312. package/src/ui/camera.js +954 -0
  313. package/src/ui/events.js +210 -0
  314. package/src/ui/handler/box_zoom.js +151 -0
  315. package/src/ui/handler/dblclick_zoom.js +91 -0
  316. package/src/ui/handler/drag_pan.js +285 -0
  317. package/src/ui/handler/drag_rotate.js +290 -0
  318. package/src/ui/handler/frame.js +28 -0
  319. package/src/ui/handler/inertia.js +45 -0
  320. package/src/ui/handler/keyboard.js +148 -0
  321. package/src/ui/handler/scroll_zoom.js +284 -0
  322. package/src/ui/handler/touch_zoom_rotate.js +263 -0
  323. package/src/ui/map.js +1645 -0
  324. package/src/util/actor.js +104 -0
  325. package/src/util/async.js +23 -0
  326. package/src/util/browser.js +61 -0
  327. package/src/util/callback.js +26 -0
  328. package/src/util/classify_rings.js +43 -0
  329. package/src/util/color_ramp.js +24 -0
  330. package/src/util/config.js +24 -0
  331. package/src/util/dictionary_coder.js +25 -0
  332. package/src/util/dispatcher.js +68 -0
  333. package/src/util/dom.js +102 -0
  334. package/src/util/evented.js +182 -0
  335. package/src/util/find_pole_of_inaccessibility.js +129 -0
  336. package/src/util/global_worker_pool.js +15 -0
  337. package/src/util/image.js +124 -0
  338. package/src/util/interpolate.js +5 -0
  339. package/src/util/intersection_tests.js +207 -0
  340. package/src/util/is_char_in_unicode_block.js +287 -0
  341. package/src/util/loader/image.js +32 -0
  342. package/src/util/object.js +178 -0
  343. package/src/util/script_detection.js +337 -0
  344. package/src/util/struct_array.js +197 -0
  345. package/src/util/task_queue.js +57 -0
  346. package/src/util/throttle.js +26 -0
  347. package/src/util/tile_cover.js +114 -0
  348. package/src/util/token.js +13 -0
  349. package/src/util/unique_id.js +12 -0
  350. package/src/util/util.js +192 -0
  351. package/src/util/vectortile_to_geojson.js +44 -0
  352. package/src/util/verticalize_punctuation.js +112 -0
  353. package/src/util/warn.js +21 -0
  354. package/src/util/web_worker.js +5 -0
  355. package/src/util/web_worker_transfer.js +228 -0
  356. package/src/util/worker_pool.js +41 -0
@@ -0,0 +1,129 @@
1
+ const Queue = require('tinyqueue');
2
+
3
+ const Point = require('@mapbox/point-geometry');
4
+ const { distToSegmentSquared } = require('./intersection_tests');
5
+
6
+ /**
7
+ * Finds an approximation of a polygon's Pole Of Inaccessibiliy https://en.wikipedia.org/wiki/Pole_of_inaccessibility
8
+ * This is a copy of http://github.com/mapbox/polylabel adapted to use Points
9
+ *
10
+ * @param polygonRings first item in array is the outer ring followed optionally by the list of holes, should be an element of the result of util/classify_rings
11
+ * @param precision Specified in input coordinate units. If 0 returns after first run, if > 0 repeatedly narrows the search space until the radius of the area searched for the best pole is less than precision
12
+ * @param debug Print some statistics to the console during execution
13
+ * @returns Pole of Inaccessibiliy.
14
+ * @private
15
+ */
16
+ module.exports = function (polygonRings, precision = 1, debug = false) {
17
+ // find the bounding box of the outer ring
18
+ let minX = Number.POSITIVE_INFINITY;
19
+ let minY = Number.POSITIVE_INFINITY;
20
+ let maxX = Number.NEGATIVE_INFINITY;
21
+ let maxY = Number.NEGATIVE_INFINITY;
22
+ const outerRing = polygonRings[0];
23
+ for (let i = 0; i < outerRing.length; i++) {
24
+ const p = outerRing[i];
25
+ if (!i || p.x < minX) minX = p.x;
26
+ if (!i || p.y < minY) minY = p.y;
27
+ if (!i || p.x > maxX) maxX = p.x;
28
+ if (!i || p.y > maxY) maxY = p.y;
29
+ }
30
+
31
+ const width = maxX - minX;
32
+ const height = maxY - minY;
33
+ const cellSize = Math.min(width, height);
34
+ let h = cellSize / 2;
35
+
36
+ // a priority queue of cells in order of their "potential" (max distance to polygon)
37
+ const cellQueue = new Queue(null, compareMax);
38
+
39
+ if (cellSize === 0) return new Point(minX, minY);
40
+
41
+ // cover polygon with initial cells
42
+ for (let x = minX; x < maxX; x += cellSize) {
43
+ for (let y = minY; y < maxY; y += cellSize) {
44
+ cellQueue.push(new Cell(x + h, y + h, h, polygonRings));
45
+ }
46
+ }
47
+
48
+ // take centroid as the first best guess
49
+ let bestCell = getCentroidCell(polygonRings);
50
+ let numProbes = cellQueue.length;
51
+
52
+ while (cellQueue.length) {
53
+ // pick the most promising cell from the queue
54
+ const cell = cellQueue.pop();
55
+
56
+ // update the best cell if we found a better one
57
+ if (cell.d > bestCell.d || !bestCell.d) {
58
+ bestCell = cell;
59
+ if (debug) console.log('found best %d after %d probes', Math.round(1e4 * cell.d) / 1e4, numProbes);
60
+ }
61
+
62
+ // do not drill down further if there's no chance of a better solution
63
+ if (cell.max - bestCell.d <= precision) continue;
64
+
65
+ // split the cell into four cells
66
+ h = cell.h / 2;
67
+ cellQueue.push(new Cell(cell.p.x - h, cell.p.y - h, h, polygonRings));
68
+ cellQueue.push(new Cell(cell.p.x + h, cell.p.y - h, h, polygonRings));
69
+ cellQueue.push(new Cell(cell.p.x - h, cell.p.y + h, h, polygonRings));
70
+ cellQueue.push(new Cell(cell.p.x + h, cell.p.y + h, h, polygonRings));
71
+ numProbes += 4;
72
+ }
73
+
74
+ if (debug) {
75
+ console.log(`num probes: ${numProbes}`);
76
+ console.log(`best distance: ${bestCell.d}`);
77
+ }
78
+
79
+ return bestCell.p;
80
+ };
81
+
82
+ function compareMax(a, b) {
83
+ return b.max - a.max;
84
+ }
85
+
86
+ function Cell(x, y, h, polygon) {
87
+ this.p = new Point(x, y);
88
+ this.h = h; // half the cell size
89
+ this.d = pointToPolygonDist(this.p, polygon); // distance from cell center to polygon
90
+ this.max = this.d + this.h * Math.SQRT2; // max distance to polygon within a cell
91
+ }
92
+
93
+ // signed distance from point to polygon outline (negative if point is outside)
94
+ function pointToPolygonDist(p, polygon) {
95
+ let inside = false;
96
+ let minDistSq = Number.POSITIVE_INFINITY;
97
+
98
+ for (let k = 0; k < polygon.length; k++) {
99
+ const ring = polygon[k];
100
+
101
+ for (let i = 0, len = ring.length, j = len - 1; i < len; j = i++) {
102
+ const a = ring[i];
103
+ const b = ring[j];
104
+
105
+ if (a.y > p.y !== b.y > p.y && p.x < ((b.x - a.x) * (p.y - a.y)) / (b.y - a.y) + a.x) inside = !inside;
106
+
107
+ minDistSq = Math.min(minDistSq, distToSegmentSquared(p, a, b));
108
+ }
109
+ }
110
+
111
+ return (inside ? 1 : -1) * Math.sqrt(minDistSq);
112
+ }
113
+
114
+ // get polygon centroid
115
+ function getCentroidCell(polygon) {
116
+ let area = 0;
117
+ let x = 0;
118
+ let y = 0;
119
+ const points = polygon[0];
120
+ for (let i = 0, len = points.length, j = len - 1; i < len; j = i++) {
121
+ const a = points[i];
122
+ const b = points[j];
123
+ const f = a.x * b.y - b.x * a.y;
124
+ x += (a.x + b.x) * f;
125
+ y += (a.y + b.y) * f;
126
+ area += f * 3;
127
+ }
128
+ return new Cell(x / area, y / area, 0, polygon);
129
+ }
@@ -0,0 +1,15 @@
1
+ const workerPool = require('./worker_pool');
2
+
3
+ let globalWorkerPool;
4
+
5
+ /**
6
+ * Creates (if necessary) and returns the single, global WorkerPool instance
7
+ * to be shared across each Map
8
+ * @private
9
+ */
10
+ module.exports = function getGlobalWorkerPool() {
11
+ if (!globalWorkerPool) {
12
+ globalWorkerPool = workerPool();
13
+ }
14
+ return globalWorkerPool;
15
+ };
@@ -0,0 +1,124 @@
1
+ const assert = require('assert');
2
+
3
+ const { register } = require('./web_worker_transfer');
4
+
5
+ function createImage(image, { width, height }, channels, data) {
6
+ if (!data) {
7
+ data = new Uint8Array(width * height * channels);
8
+ } else if (data.length !== width * height * channels) {
9
+ throw new RangeError('mismatched image size');
10
+ }
11
+ image.width = width;
12
+ image.height = height;
13
+ image.data = data;
14
+ return image;
15
+ }
16
+
17
+ function resizeImage(image, { width, height }, channels) {
18
+ if (width === image.width && height === image.height) {
19
+ return;
20
+ }
21
+
22
+ const newImage = createImage({}, { width, height }, channels);
23
+
24
+ copyImage(
25
+ image,
26
+ newImage,
27
+ { x: 0, y: 0 },
28
+ { x: 0, y: 0 },
29
+ {
30
+ width: Math.min(image.width, width),
31
+ height: Math.min(image.height, height)
32
+ },
33
+ channels
34
+ );
35
+
36
+ image.width = width;
37
+ image.height = height;
38
+ image.data = newImage.data;
39
+ }
40
+
41
+ function copyImage(srcImg, dstImg, srcPt, dstPt, size, channels) {
42
+ if (size.width === 0 || size.height === 0) {
43
+ return dstImg;
44
+ }
45
+
46
+ if (
47
+ size.width > srcImg.width ||
48
+ size.height > srcImg.height ||
49
+ srcPt.x > srcImg.width - size.width ||
50
+ srcPt.y > srcImg.height - size.height
51
+ ) {
52
+ throw new RangeError('out of range source coordinates for image copy');
53
+ }
54
+
55
+ if (
56
+ size.width > dstImg.width ||
57
+ size.height > dstImg.height ||
58
+ dstPt.x > dstImg.width - size.width ||
59
+ dstPt.y > dstImg.height - size.height
60
+ ) {
61
+ throw new RangeError('out of range destination coordinates for image copy');
62
+ }
63
+
64
+ const srcData = srcImg.data;
65
+ const dstData = dstImg.data;
66
+
67
+ assert(srcData !== dstData);
68
+
69
+ for (let y = 0; y < size.height; y++) {
70
+ const srcOffset = ((srcPt.y + y) * srcImg.width + srcPt.x) * channels;
71
+ const dstOffset = ((dstPt.y + y) * dstImg.width + dstPt.x) * channels;
72
+ for (let i = 0; i < size.width * channels; i++) {
73
+ dstData[dstOffset + i] = srcData[srcOffset + i];
74
+ }
75
+ }
76
+
77
+ return dstImg;
78
+ }
79
+
80
+ class AlphaImage {
81
+ constructor(size, data) {
82
+ createImage(this, size, 1, data);
83
+ }
84
+
85
+ resize(size) {
86
+ resizeImage(this, size, 1);
87
+ }
88
+
89
+ clone() {
90
+ return new AlphaImage({ width: this.width, height: this.height }, new Uint8Array(this.data));
91
+ }
92
+
93
+ static copy(srcImg, dstImg, srcPt, dstPt, size) {
94
+ copyImage(srcImg, dstImg, srcPt, dstPt, size, 1);
95
+ }
96
+ }
97
+
98
+ // Not premultiplied, because ImageData is not premultiplied.
99
+ // UNPACK_PREMULTIPLY_ALPHA_WEBGL must be used when uploading to a texture.
100
+ class RGBAImage {
101
+ constructor(size, data) {
102
+ createImage(this, size, 4, data);
103
+ }
104
+
105
+ resize(size) {
106
+ resizeImage(this, size, 4);
107
+ }
108
+
109
+ clone() {
110
+ return new RGBAImage({ width: this.width, height: this.height }, new Uint8Array(this.data));
111
+ }
112
+
113
+ static copy(srcImg, dstImg, srcPt, dstPt, size) {
114
+ copyImage(srcImg, dstImg, srcPt, dstPt, size, 4);
115
+ }
116
+ }
117
+
118
+ register('AlphaImage', AlphaImage);
119
+ register('RGBAImage', RGBAImage);
120
+
121
+ module.exports = {
122
+ AlphaImage,
123
+ RGBAImage
124
+ };
@@ -0,0 +1,5 @@
1
+ module.exports = interpolate;
2
+
3
+ function interpolate(a, b, t) {
4
+ return a * (1 - t) + b * t;
5
+ }
@@ -0,0 +1,207 @@
1
+ const { isCounterClockwise } = require('./util');
2
+ const Point = require('@mapbox/point-geometry');
3
+
4
+ module.exports = {
5
+ polygonIntersectsBufferedPoint,
6
+ polygonIntersectsMultiPolygon,
7
+ polygonIntersectsBufferedMultiLine,
8
+ polygonIntersectsPolygon,
9
+ distToSegmentSquared,
10
+ polygonIntersectsBox
11
+ };
12
+
13
+ function polygonIntersectsPolygon(polygonA, polygonB) {
14
+ for (let i = 0; i < polygonA.length; i++) {
15
+ if (polygonContainsPoint(polygonB, polygonA[i])) return true;
16
+ }
17
+
18
+ for (let i = 0; i < polygonB.length; i++) {
19
+ if (polygonContainsPoint(polygonA, polygonB[i])) return true;
20
+ }
21
+
22
+ if (lineIntersectsLine(polygonA, polygonB)) return true;
23
+
24
+ return false;
25
+ }
26
+
27
+ function polygonIntersectsBufferedPoint(polygon, point, radius) {
28
+ if (polygonContainsPoint(polygon, point)) return true;
29
+ if (pointIntersectsBufferedLine(point, polygon, radius)) return true;
30
+ return false;
31
+ }
32
+
33
+ function polygonIntersectsMultiPolygon(polygon, multiPolygon) {
34
+ if (polygon.length === 1) {
35
+ return multiPolygonContainsPoint(multiPolygon, polygon[0]);
36
+ }
37
+
38
+ for (let m = 0; m < multiPolygon.length; m++) {
39
+ const ring = multiPolygon[m];
40
+ for (let n = 0; n < ring.length; n++) {
41
+ if (polygonContainsPoint(polygon, ring[n])) return true;
42
+ }
43
+ }
44
+
45
+ for (let i = 0; i < polygon.length; i++) {
46
+ if (multiPolygonContainsPoint(multiPolygon, polygon[i])) return true;
47
+ }
48
+
49
+ for (let k = 0; k < multiPolygon.length; k++) {
50
+ if (lineIntersectsLine(polygon, multiPolygon[k])) return true;
51
+ }
52
+
53
+ return false;
54
+ }
55
+
56
+ function polygonIntersectsBufferedMultiLine(polygon, multiLine, radius) {
57
+ for (let i = 0; i < multiLine.length; i++) {
58
+ const line = multiLine[i];
59
+
60
+ if (polygon.length >= 3) {
61
+ for (let k = 0; k < line.length; k++) {
62
+ if (polygonContainsPoint(polygon, line[k])) return true;
63
+ }
64
+ }
65
+
66
+ if (lineIntersectsBufferedLine(polygon, line, radius)) return true;
67
+ }
68
+ return false;
69
+ }
70
+
71
+ function lineIntersectsBufferedLine(lineA, lineB, radius) {
72
+ if (lineA.length > 1) {
73
+ if (lineIntersectsLine(lineA, lineB)) return true;
74
+
75
+ // Check whether any point in either line is within radius of the other line
76
+ for (let j = 0; j < lineB.length; j++) {
77
+ if (pointIntersectsBufferedLine(lineB[j], lineA, radius)) return true;
78
+ }
79
+ }
80
+
81
+ for (let k = 0; k < lineA.length; k++) {
82
+ if (pointIntersectsBufferedLine(lineA[k], lineB, radius)) return true;
83
+ }
84
+
85
+ return false;
86
+ }
87
+
88
+ function lineIntersectsLine(lineA, lineB) {
89
+ if (lineA.length === 0 || lineB.length === 0) return false;
90
+ for (let i = 0; i < lineA.length - 1; i++) {
91
+ const a0 = lineA[i];
92
+ const a1 = lineA[i + 1];
93
+ for (let j = 0; j < lineB.length - 1; j++) {
94
+ const b0 = lineB[j];
95
+ const b1 = lineB[j + 1];
96
+ if (lineSegmentIntersectsLineSegment(a0, a1, b0, b1)) return true;
97
+ }
98
+ }
99
+ return false;
100
+ }
101
+
102
+ function lineSegmentIntersectsLineSegment(a0, a1, b0, b1) {
103
+ return (
104
+ isCounterClockwise(a0, b0, b1) !== isCounterClockwise(a1, b0, b1) &&
105
+ isCounterClockwise(a0, a1, b0) !== isCounterClockwise(a0, a1, b1)
106
+ );
107
+ }
108
+
109
+ function pointIntersectsBufferedLine(p, line, radius) {
110
+ const radiusSquared = radius * radius;
111
+
112
+ if (line.length === 1) return p.distSqr(line[0]) < radiusSquared;
113
+
114
+ for (let i = 1; i < line.length; i++) {
115
+ // Find line segments that have a distance <= radius^2 to p
116
+ // In that case, we treat the line as "containing point p".
117
+ const v = line[i - 1];
118
+ const w = line[i];
119
+ if (distToSegmentSquared(p, v, w) < radiusSquared) return true;
120
+ }
121
+ return false;
122
+ }
123
+
124
+ // Code from http://stackoverflow.com/a/1501725/331379.
125
+ function distToSegmentSquared(p, v, w) {
126
+ const l2 = v.distSqr(w);
127
+ if (l2 === 0) return p.distSqr(v);
128
+ const t = ((p.x - v.x) * (w.x - v.x) + (p.y - v.y) * (w.y - v.y)) / l2;
129
+ if (t < 0) return p.distSqr(v);
130
+ if (t > 1) return p.distSqr(w);
131
+ return p.distSqr(w.sub(v)._mult(t)._add(v));
132
+ }
133
+
134
+ // point in polygon ray casting algorithm
135
+ function multiPolygonContainsPoint(rings, p) {
136
+ let c = false;
137
+ let ring;
138
+ let p1;
139
+ let p2;
140
+
141
+ for (let k = 0; k < rings.length; k++) {
142
+ ring = rings[k];
143
+ for (let i = 0, j = ring.length - 1; i < ring.length; j = i++) {
144
+ p1 = ring[i];
145
+ p2 = ring[j];
146
+ if (p1.y > p.y !== p2.y > p.y && p.x < ((p2.x - p1.x) * (p.y - p1.y)) / (p2.y - p1.y) + p1.x) {
147
+ c = !c;
148
+ }
149
+ }
150
+ }
151
+ return c;
152
+ }
153
+
154
+ function polygonContainsPoint(ring, p) {
155
+ let c = false;
156
+ for (let i = 0, j = ring.length - 1; i < ring.length; j = i++) {
157
+ const p1 = ring[i];
158
+ const p2 = ring[j];
159
+ if (p1.y > p.y !== p2.y > p.y && p.x < ((p2.x - p1.x) * (p.y - p1.y)) / (p2.y - p1.y) + p1.x) {
160
+ c = !c;
161
+ }
162
+ }
163
+ return c;
164
+ }
165
+
166
+ function polygonIntersectsBox(ring, boxX1, boxY1, boxX2, boxY2) {
167
+ for (const p of ring) {
168
+ if (boxX1 <= p.x && boxY1 <= p.y && boxX2 >= p.x && boxY2 >= p.y) return true;
169
+ }
170
+
171
+ const corners = [new Point(boxX1, boxY1), new Point(boxX1, boxY2), new Point(boxX2, boxY2), new Point(boxX2, boxY1)];
172
+
173
+ if (ring.length > 2) {
174
+ for (const corner of corners) {
175
+ if (polygonContainsPoint(ring, corner)) return true;
176
+ }
177
+ }
178
+
179
+ for (let i = 0; i < ring.length - 1; i++) {
180
+ const p1 = ring[i];
181
+ const p2 = ring[i + 1];
182
+ if (edgeIntersectsBox(p1, p2, corners)) return true;
183
+ }
184
+
185
+ return false;
186
+ }
187
+
188
+ function edgeIntersectsBox(e1, e2, corners) {
189
+ const tl = corners[0];
190
+ const br = corners[2];
191
+ // the edge and box do not intersect in either the x or y dimensions
192
+ if (
193
+ (e1.x < tl.x && e2.x < tl.x) ||
194
+ (e1.x > br.x && e2.x > br.x) ||
195
+ (e1.y < tl.y && e2.y < tl.y) ||
196
+ (e1.y > br.y && e2.y > br.y)
197
+ )
198
+ return false;
199
+
200
+ // check if all corners of the box are on the same side of the edge
201
+ const dir = isCounterClockwise(e1, e2, corners[0]);
202
+ return (
203
+ dir !== isCounterClockwise(e1, e2, corners[1]) ||
204
+ dir !== isCounterClockwise(e1, e2, corners[2]) ||
205
+ dir !== isCounterClockwise(e1, e2, corners[3])
206
+ );
207
+ }