@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,144 @@
1
+ const config = require('../util/config');
2
+ const { Event, ErrorEvent, Evented } = require('../util/evented');
3
+ const { pick } = require('../util/object');
4
+ const loadTileJSON = require('./load_tilejson');
5
+ const TileBounds = require('./tile_bounds');
6
+ const browser = require('../util/browser');
7
+
8
+ // register feature index for worker transfer
9
+ require('../data/feature_index');
10
+
11
+ class VectorTileSource extends Evented {
12
+ constructor(id, options, dispatcher, eventedParent) {
13
+ super();
14
+ this.id = id;
15
+ this.dispatcher = dispatcher;
16
+
17
+ this.type = 'vector';
18
+ this.minzoom = 0;
19
+ this.maxzoom = 22;
20
+ this.scheme = 'xyz';
21
+ this.tileSize = 512;
22
+ this.reparseOverscaled = true;
23
+ this.isTileClipped = true;
24
+
25
+ Object.assign(this, pick(options, ['url', 'scheme', 'tileSize']));
26
+ this._options = Object.assign({ type: 'vector' }, options);
27
+
28
+ if (this.tileSize !== 512) {
29
+ throw new Error('vector tile sources must have a tileSize of 512');
30
+ }
31
+
32
+ this.updateWorkerConfig(config);
33
+ config.on('change', c => this.updateWorkerConfig(c));
34
+
35
+ this.setEventedParent(eventedParent);
36
+ }
37
+
38
+ load() {
39
+ this.fire(new Event('dataloading', { dataType: 'source' }));
40
+
41
+ loadTileJSON(this._options, (err, tileJSON) => {
42
+ if (err) {
43
+ this.fire(new ErrorEvent(err));
44
+ } else if (tileJSON) {
45
+ Object.assign(this, tileJSON);
46
+ if (tileJSON.bounds) this.tileBounds = new TileBounds(tileJSON.bounds, this.minzoom, this.maxzoom);
47
+
48
+ // `content` is included here to prevent a race condition where `Style#_updateSources` is called
49
+ // before the TileJSON arrives. this makes sure the tiles needed are loaded once TileJSON arrives
50
+ // ref: https://github.com/mapbox/mapbox-gl-js/pull/4347#discussion_r104418088
51
+ this.fire(new Event('data', { dataType: 'source', sourceDataType: 'metadata' }));
52
+ this.fire(new Event('data', { dataType: 'source', sourceDataType: 'content' }));
53
+ }
54
+ });
55
+ }
56
+
57
+ hasTile(tileID) {
58
+ return !this.tileBounds || this.tileBounds.contains(tileID.canonical);
59
+ }
60
+
61
+ onAdd(map) {
62
+ this.map = map;
63
+ this.load();
64
+ }
65
+
66
+ serialize() {
67
+ return Object.assign({}, this._options);
68
+ }
69
+
70
+ loadTile(tile, callback) {
71
+ tile.abortController = new window.AbortController();
72
+ this.tiles(tile.tileID.canonical, tile.abortController)
73
+ .catch(() => {})
74
+ .then(data => {
75
+ if (!data) {
76
+ const err = new Error('Tile could not be loaded');
77
+ err.status = 404; // will try to use the parent/child tile
78
+ return done(err);
79
+ }
80
+ const params = {
81
+ response: { data },
82
+ uid: tile.uid,
83
+ tileID: tile.tileID,
84
+ zoom: tile.tileID.overscaledZ,
85
+ tileSize: this.tileSize * tile.tileID.overscaleFactor(),
86
+ type: this.type,
87
+ source: this.id,
88
+ pixelRatio: browser.devicePixelRatio,
89
+ showCollisionBoxes: this.map.showCollisionBoxes
90
+ };
91
+
92
+ if (tile.workerID === undefined || tile.state === 'expired') {
93
+ tile.workerID = this.dispatcher.send('loadTile', params, done.bind(this));
94
+ } else if (tile.state === 'loading') {
95
+ // schedule tile reloading after it has been loaded
96
+ tile.reloadCallback = callback;
97
+ } else {
98
+ this.dispatcher.send('reloadTile', params, done.bind(this), tile.workerID);
99
+ }
100
+ });
101
+
102
+ function done(err, data) {
103
+ if (tile.aborted) return callback(null);
104
+
105
+ if (err) {
106
+ return callback(err);
107
+ }
108
+
109
+ if (data?.resourceTiming) tile.resourceTiming = data.resourceTiming;
110
+
111
+ tile.loadVectorData(data, this.map.painter);
112
+
113
+ callback(null);
114
+
115
+ if (tile.reloadCallback) {
116
+ this.loadTile(tile, tile.reloadCallback);
117
+ tile.reloadCallback = null;
118
+ }
119
+ }
120
+ }
121
+
122
+ abortTile(tile) {
123
+ tile.aborted = true;
124
+ tile.abortController.abort();
125
+ this.dispatcher.send('abortTile', { uid: tile.uid, type: this.type, source: this.id }, undefined, tile.workerID);
126
+ }
127
+
128
+ unloadTile(tile) {
129
+ tile.unloadVectorData();
130
+ this.dispatcher.send('removeTile', { uid: tile.uid, type: this.type, source: this.id }, undefined, tile.workerID);
131
+ }
132
+
133
+ hasTransition() {
134
+ return false;
135
+ }
136
+
137
+ updateWorkerConfig() {
138
+ this.dispatcher.broadcast('vector.updateConfig', {
139
+ source: this.id
140
+ });
141
+ }
142
+ }
143
+
144
+ module.exports = VectorTileSource;
@@ -0,0 +1,126 @@
1
+ const vt = require('@mapbox/vector-tile');
2
+ const Protobuf = require('@mapwhit/pbf');
3
+ const WorkerTile = require('./worker_tile');
4
+
5
+ function loadVectorTile(params, callback) {
6
+ if (!params.response) {
7
+ return callback(new Error('no tile data'));
8
+ }
9
+ const { data } = params.response;
10
+ if (!data) {
11
+ return callback();
12
+ }
13
+ callback(null, {
14
+ vectorTile: new vt.VectorTile(new Protobuf(data)),
15
+ rawData: data
16
+ });
17
+ }
18
+
19
+ /**
20
+ * The {@link WorkerSource} implementation that supports {@link VectorTileSource}.
21
+ * This class is designed to be easily reused to support custom source types
22
+ * for data formats that can be parsed/converted into an in-memory VectorTile
23
+ * representation. To do so, create it with
24
+ * `new VectorTileWorkerSource(actor, styleLayers, customLoadVectorDataFunction)`.
25
+ *
26
+ * @private
27
+ */
28
+ class VectorTileWorkerSource {
29
+ /**
30
+ * @param [loadVectorData] Optional method for custom loading of a VectorTile
31
+ * object based on parameters passed from the main-thread Source. See
32
+ * {@link VectorTileWorkerSource#loadTile}. The default implementation simply
33
+ * loads the pbf at `params.url`.
34
+ */
35
+ constructor(actor, layerIndex, loadVectorData) {
36
+ this.actor = actor;
37
+ this.layerIndex = layerIndex;
38
+ this.loadVectorData = loadVectorData || loadVectorTile.bind(this);
39
+ this.loaded = {};
40
+ }
41
+
42
+ /**
43
+ * Implements {@link WorkerSource#loadTile}. Delegates to
44
+ * {@link VectorTileWorkerSource#loadVectorData} (which by default expects
45
+ * a `params.url` property) for fetching and producing a VectorTile object.
46
+ */
47
+ loadTile(params, callback) {
48
+ const uid = params.uid;
49
+
50
+ const workerTile = new WorkerTile(params);
51
+ this.loadVectorData(params, (err, response) => {
52
+ if (err || !response) {
53
+ return callback(err);
54
+ }
55
+
56
+ const rawTileData = response.rawData;
57
+ workerTile.vectorTile = response.vectorTile;
58
+ workerTile.parse(response.vectorTile, this.layerIndex, this.actor, (err, result) => {
59
+ if (err || !result) return callback(err);
60
+
61
+ // Transferring a copy of rawTileData because the worker needs to retain its copy.
62
+ callback(null, Object.assign({ rawTileData: rawTileData.slice(0) }, result));
63
+ });
64
+
65
+ this.loaded = this.loaded || {};
66
+ this.loaded[uid] = workerTile;
67
+ });
68
+ }
69
+
70
+ /**
71
+ * Implements {@link WorkerSource#reloadTile}.
72
+ */
73
+ reloadTile(params, callback) {
74
+ const loaded = this.loaded;
75
+ const uid = params.uid;
76
+ const vtSource = this;
77
+ if (loaded?.[uid]) {
78
+ const workerTile = loaded[uid];
79
+ workerTile.showCollisionBoxes = params.showCollisionBoxes;
80
+
81
+ const done = (err, data) => {
82
+ const reloadCallback = workerTile.reloadCallback;
83
+ if (reloadCallback) {
84
+ delete workerTile.reloadCallback;
85
+ workerTile.parse(workerTile.vectorTile, vtSource.layerIndex, vtSource.actor, reloadCallback);
86
+ }
87
+ callback(err, data);
88
+ };
89
+
90
+ if (workerTile.status === 'parsing') {
91
+ workerTile.reloadCallback = done;
92
+ } else if (workerTile.status === 'done') {
93
+ workerTile.parse(workerTile.vectorTile, this.layerIndex, this.actor, done);
94
+ }
95
+ }
96
+ }
97
+
98
+ /**
99
+ * Implements {@link WorkerSource#abortTile}.
100
+ *
101
+ * @param params
102
+ * @param params.uid The UID for this tile.
103
+ */
104
+ abortTile(params, callback) {
105
+ callback();
106
+ }
107
+
108
+ /**
109
+ * Implements {@link WorkerSource#removeTile}.
110
+ *
111
+ * @param params
112
+ * @param params.uid The UID for this tile.
113
+ */
114
+ removeTile(params, callback) {
115
+ const loaded = this.loaded;
116
+ const uid = params.uid;
117
+ if (loaded?.[uid]) {
118
+ delete loaded[uid];
119
+ }
120
+ callback();
121
+ }
122
+
123
+ updateConfig() {}
124
+ }
125
+
126
+ module.exports = VectorTileWorkerSource;
@@ -0,0 +1,175 @@
1
+ const Actor = require('../util/actor');
2
+
3
+ const StyleLayerIndex = require('../style/style_layer_index');
4
+ const VectorTileWorkerSource = require('./vector_tile_worker_source');
5
+ const RasterDEMTileWorkerSource = require('./raster_dem_tile_worker_source');
6
+ const GeoJSONWorkerSource = require('./geojson_worker_source');
7
+ const assert = require('assert');
8
+ const { plugin: globalRTLTextPlugin } = require('./rtl_text_plugin');
9
+
10
+ /**
11
+ * @private
12
+ */
13
+ class Worker {
14
+ constructor(self) {
15
+ this.self = self;
16
+ this.actor = new Actor(self, this);
17
+
18
+ this.layerIndexes = {};
19
+
20
+ this.workerSourceTypes = {
21
+ vector: VectorTileWorkerSource,
22
+ geojson: GeoJSONWorkerSource
23
+ };
24
+
25
+ // [mapId][sourceType][sourceName] => worker source instance
26
+ this.workerSources = {};
27
+ this.demWorkerSources = {};
28
+
29
+ this.self.registerWorkerSource = (name, WorkerSource) => {
30
+ if (this.workerSourceTypes[name]) {
31
+ throw new Error(`Worker source with name "${name}" already registered.`);
32
+ }
33
+ this.workerSourceTypes[name] = WorkerSource;
34
+ };
35
+
36
+ this.self.registerRTLTextPlugin = rtlTextPlugin => {
37
+ if (globalRTLTextPlugin.isLoaded()) {
38
+ throw new Error('RTL text plugin already registered.');
39
+ }
40
+ globalRTLTextPlugin['applyArabicShaping'] = rtlTextPlugin.applyArabicShaping;
41
+ globalRTLTextPlugin['processBidirectionalText'] = rtlTextPlugin.processBidirectionalText;
42
+ };
43
+ }
44
+
45
+ setLayers(mapId, layers, callback) {
46
+ this.getLayerIndex(mapId).replace(layers);
47
+ callback();
48
+ }
49
+
50
+ updateLayers(mapId, params, callback) {
51
+ this.getLayerIndex(mapId).update(params.layers, params.removedIds);
52
+ callback();
53
+ }
54
+
55
+ loadTile(mapId, params, callback) {
56
+ assert(params.type);
57
+ this.getWorkerSource(mapId, params.type, params.source).loadTile(params, callback);
58
+ }
59
+
60
+ loadDEMTile(mapId, params, callback) {
61
+ this.getDEMWorkerSource(mapId, params.source).loadTile(params, callback);
62
+ }
63
+
64
+ reloadTile(mapId, params, callback) {
65
+ assert(params.type);
66
+ this.getWorkerSource(mapId, params.type, params.source).reloadTile(params, callback);
67
+ }
68
+
69
+ abortTile(mapId, params, callback) {
70
+ assert(params.type);
71
+ this.getWorkerSource(mapId, params.type, params.source).abortTile(params, callback);
72
+ }
73
+
74
+ removeTile(mapId, params, callback) {
75
+ assert(params.type);
76
+ this.getWorkerSource(mapId, params.type, params.source).removeTile(params, callback);
77
+ }
78
+
79
+ removeDEMTile(mapId, params) {
80
+ this.getDEMWorkerSource(mapId, params.source).removeTile(params);
81
+ }
82
+
83
+ removeSource(mapId, params, callback) {
84
+ assert(params.type);
85
+ assert(params.source);
86
+
87
+ if (
88
+ !this.workerSources[mapId] ||
89
+ !this.workerSources[mapId][params.type] ||
90
+ !this.workerSources[mapId][params.type][params.source]
91
+ ) {
92
+ return;
93
+ }
94
+
95
+ const worker = this.workerSources[mapId][params.type][params.source];
96
+ delete this.workerSources[mapId][params.type][params.source];
97
+
98
+ if (worker.removeSource !== undefined) {
99
+ worker.removeSource(params, callback);
100
+ } else {
101
+ callback();
102
+ }
103
+ }
104
+
105
+ /**
106
+ * Load a {@link WorkerSource} script at params.url. The script is run
107
+ * (using importScripts) with `registerWorkerSource` in scope, which is a
108
+ * function taking `(name, workerSourceObject)`.
109
+ * @private
110
+ */
111
+ loadWorkerSource(map, params, callback) {
112
+ try {
113
+ this.self.importScripts(params.url);
114
+ callback();
115
+ } catch (e) {
116
+ callback(e.toString());
117
+ }
118
+ }
119
+
120
+ loadRTLTextPlugin(map, pluginURL, callback) {
121
+ try {
122
+ if (!globalRTLTextPlugin.isLoaded()) {
123
+ this.self.importScripts(pluginURL);
124
+ callback(
125
+ globalRTLTextPlugin.isLoaded()
126
+ ? null
127
+ : new Error(`RTL Text Plugin failed to import scripts from ${pluginURL}`)
128
+ );
129
+ }
130
+ } catch (e) {
131
+ callback(e.toString());
132
+ }
133
+ }
134
+
135
+ getLayerIndex(mapId) {
136
+ let layerIndexes = this.layerIndexes[mapId];
137
+ if (!layerIndexes) {
138
+ layerIndexes = this.layerIndexes[mapId] = new StyleLayerIndex();
139
+ }
140
+ return layerIndexes;
141
+ }
142
+
143
+ getWorkerSource(mapId, type, source) {
144
+ if (!this.workerSources[mapId]) this.workerSources[mapId] = {};
145
+ if (!this.workerSources[mapId][type]) this.workerSources[mapId][type] = {};
146
+
147
+ if (!this.workerSources[mapId][type][source]) {
148
+ // use a wrapped actor so that we can attach a target mapId param
149
+ // to any messages invoked by the WorkerSource
150
+ const actor = {
151
+ send: (type, data, callback) => {
152
+ this.actor.send(type, data, callback, mapId);
153
+ }
154
+ };
155
+
156
+ this.workerSources[mapId][type][source] = new this.workerSourceTypes[type](actor, this.getLayerIndex(mapId));
157
+ }
158
+
159
+ return this.workerSources[mapId][type][source];
160
+ }
161
+
162
+ getDEMWorkerSource(mapId, source) {
163
+ if (!this.demWorkerSources[mapId]) this.demWorkerSources[mapId] = {};
164
+
165
+ if (!this.demWorkerSources[mapId][source]) {
166
+ this.demWorkerSources[mapId][source] = new RasterDEMTileWorkerSource();
167
+ }
168
+
169
+ return this.demWorkerSources[mapId][source];
170
+ }
171
+ }
172
+
173
+ module.exports = function createWorker(self) {
174
+ return new Worker(self);
175
+ };
@@ -0,0 +1,14 @@
1
+ /**
2
+ * May be implemented by custom source types to provide code that can be run on
3
+ * the WebWorkers. In addition to providing a custom
4
+ * {@link WorkerSource#loadTile}, any other methods attached to a `WorkerSource`
5
+ * implementation may also be targeted by the {@link Source} via
6
+ * `dispatcher.send('source-type.methodname', params, callback)`.
7
+ *
8
+ * @see {@link Map#addSourceType}
9
+ * @private
10
+ *
11
+ * @class WorkerSource
12
+ * @param actor
13
+ * @param layerIndex
14
+ */
@@ -0,0 +1,199 @@
1
+ const FeatureIndex = require('../data/feature_index');
2
+
3
+ const { performSymbolLayout } = require('../symbol/symbol_layout');
4
+ const { CollisionBoxArray } = require('../data/array_types');
5
+ const DictionaryCoder = require('../util/dictionary_coder');
6
+ const SymbolBucket = require('../data/bucket/symbol_bucket');
7
+ const LineBucket = require('../data/bucket/line_bucket');
8
+ const FillBucket = require('../data/bucket/fill_bucket');
9
+ const FillExtrusionBucket = require('../data/bucket/fill_extrusion_bucket');
10
+ const { mapObject, values } = require('../util/object');
11
+ const warn = require('../util/warn');
12
+ const assert = require('assert');
13
+ const ImageAtlas = require('../render/image_atlas');
14
+ const GlyphAtlas = require('../render/glyph_atlas');
15
+ const EvaluationParameters = require('../style/evaluation_parameters');
16
+ const { OverscaledTileID } = require('./tile_id');
17
+
18
+ class WorkerTile {
19
+ constructor(params) {
20
+ this.tileID = new OverscaledTileID(
21
+ params.tileID.overscaledZ,
22
+ params.tileID.wrap,
23
+ params.tileID.canonical.z,
24
+ params.tileID.canonical.x,
25
+ params.tileID.canonical.y
26
+ );
27
+ this.uid = params.uid;
28
+ this.zoom = params.zoom;
29
+ this.pixelRatio = params.pixelRatio;
30
+ this.tileSize = params.tileSize;
31
+ this.source = params.source;
32
+ this.overscaling = this.tileID.overscaleFactor();
33
+ this.showCollisionBoxes = params.showCollisionBoxes;
34
+ }
35
+
36
+ parse(data, layerIndex, actor, callback) {
37
+ this.status = 'parsing';
38
+ this.data = data;
39
+
40
+ this.collisionBoxArray = new CollisionBoxArray();
41
+ const sourceLayerCoder = new DictionaryCoder(Object.keys(data.layers).sort());
42
+
43
+ const featureIndex = new FeatureIndex(this.tileID);
44
+ featureIndex.bucketLayerIDs = [];
45
+
46
+ const buckets = {};
47
+
48
+ const options = {
49
+ featureIndex,
50
+ iconDependencies: {},
51
+ patternDependencies: {},
52
+ glyphDependencies: {}
53
+ };
54
+
55
+ const layerFamilies = layerIndex.familiesBySource[this.source];
56
+ for (const sourceLayerId in layerFamilies) {
57
+ const sourceLayer = data.layers[sourceLayerId];
58
+ if (!sourceLayer) {
59
+ continue;
60
+ }
61
+
62
+ if (sourceLayer.version === 1) {
63
+ warn.once(
64
+ `Vector tile source "${this.source}" layer "${sourceLayerId}" ` +
65
+ 'does not use vector tile spec v2 and therefore may have some rendering errors.'
66
+ );
67
+ }
68
+
69
+ const sourceLayerIndex = sourceLayerCoder.encode(sourceLayerId);
70
+ const features = [];
71
+ for (let index = 0; index < sourceLayer.length; index++) {
72
+ const feature = sourceLayer.feature(index);
73
+ features.push({ feature, index, sourceLayerIndex });
74
+ }
75
+
76
+ for (const family of layerFamilies[sourceLayerId]) {
77
+ const layer = family[0];
78
+
79
+ assert(layer.source === this.source);
80
+ if (layer.minzoom && this.zoom < Math.floor(layer.minzoom)) continue;
81
+ if (layer.maxzoom && this.zoom >= layer.maxzoom) continue;
82
+ if (layer.visibility === 'none') continue;
83
+
84
+ recalculateLayers(family, this.zoom);
85
+
86
+ const bucket = (buckets[layer.id] = layer.createBucket({
87
+ index: featureIndex.bucketLayerIDs.length,
88
+ layers: family,
89
+ zoom: this.zoom,
90
+ pixelRatio: this.pixelRatio,
91
+ overscaling: this.overscaling,
92
+ collisionBoxArray: this.collisionBoxArray,
93
+ sourceLayerIndex: sourceLayerIndex,
94
+ sourceID: this.source
95
+ }));
96
+
97
+ bucket.populate(features, options);
98
+ featureIndex.bucketLayerIDs.push(family.map(l => l.id));
99
+ }
100
+ }
101
+
102
+ let error;
103
+ let glyphMap;
104
+ let iconMap;
105
+ let patternMap;
106
+
107
+ const stacks = mapObject(options.glyphDependencies, glyphs => Object.keys(glyphs).map(Number));
108
+ if (Object.keys(stacks).length) {
109
+ actor.send('getGlyphs', { uid: this.uid, stacks }, (err, result) => {
110
+ if (!error) {
111
+ error = err;
112
+ glyphMap = result;
113
+ maybePrepare.call(this);
114
+ }
115
+ });
116
+ } else {
117
+ glyphMap = {};
118
+ }
119
+
120
+ const icons = Object.keys(options.iconDependencies);
121
+ if (icons.length) {
122
+ actor.send('getImages', { icons }, (err, result) => {
123
+ if (!error) {
124
+ error = err;
125
+ iconMap = result;
126
+ maybePrepare.call(this);
127
+ }
128
+ });
129
+ } else {
130
+ iconMap = {};
131
+ }
132
+
133
+ const patterns = Object.keys(options.patternDependencies);
134
+ if (patterns.length) {
135
+ actor.send('getImages', { icons: patterns }, (err, result) => {
136
+ if (!error) {
137
+ error = err;
138
+ patternMap = result;
139
+ maybePrepare.call(this);
140
+ }
141
+ });
142
+ } else {
143
+ patternMap = {};
144
+ }
145
+
146
+ maybePrepare.call(this);
147
+
148
+ function maybePrepare() {
149
+ if (error) {
150
+ return callback(error);
151
+ }
152
+ if (glyphMap && iconMap && patternMap) {
153
+ const glyphAtlas = new GlyphAtlas(glyphMap);
154
+ const imageAtlas = new ImageAtlas(iconMap, patternMap);
155
+
156
+ for (const key in buckets) {
157
+ const bucket = buckets[key];
158
+ if (bucket instanceof SymbolBucket) {
159
+ recalculateLayers(bucket.layers, this.zoom);
160
+ performSymbolLayout(
161
+ bucket,
162
+ glyphMap,
163
+ glyphAtlas.positions,
164
+ iconMap,
165
+ imageAtlas.iconPositions,
166
+ this.showCollisionBoxes
167
+ );
168
+ } else if (
169
+ bucket.hasPattern &&
170
+ (bucket instanceof LineBucket || bucket instanceof FillBucket || bucket instanceof FillExtrusionBucket)
171
+ ) {
172
+ recalculateLayers(bucket.layers, this.zoom);
173
+ bucket.addFeatures(options, imageAtlas.patternPositions);
174
+ }
175
+ }
176
+
177
+ this.status = 'done';
178
+
179
+ callback(null, {
180
+ buckets: values(buckets).filter(b => !b.isEmpty()),
181
+ featureIndex,
182
+ collisionBoxArray: this.collisionBoxArray,
183
+ glyphAtlasImage: glyphAtlas.image,
184
+ imageAtlas
185
+ });
186
+ }
187
+ }
188
+ }
189
+ }
190
+
191
+ function recalculateLayers(layers, zoom) {
192
+ // Layers are shared and may have been used by a WorkerTile with a different zoom.
193
+ const parameters = new EvaluationParameters(zoom);
194
+ for (const layer of layers) {
195
+ layer.recalculate(parameters);
196
+ }
197
+ }
198
+
199
+ module.exports = WorkerTile;
@@ -0,0 +1,25 @@
1
+ const circle = require('./style_layer/circle_style_layer');
2
+ const heatmap = require('./style_layer/heatmap_style_layer');
3
+ const hillshade = require('./style_layer/hillshade_style_layer');
4
+ const fill = require('./style_layer/fill_style_layer');
5
+ const fillExtrusion = require('./style_layer/fill_extrusion_style_layer');
6
+ const line = require('./style_layer/line_style_layer');
7
+ const symbol = require('./style_layer/symbol_style_layer');
8
+ const background = require('./style_layer/background_style_layer');
9
+ const raster = require('./style_layer/raster_style_layer');
10
+
11
+ const subclasses = {
12
+ circle,
13
+ heatmap,
14
+ hillshade,
15
+ fill,
16
+ 'fill-extrusion': fillExtrusion,
17
+ line,
18
+ symbol,
19
+ background,
20
+ raster
21
+ };
22
+
23
+ module.exports = function createStyleLayer(layer) {
24
+ return new subclasses[layer.type](layer);
25
+ };