@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,955 @@
1
+ const assert = require('assert');
2
+
3
+ const { Event, ErrorEvent, Evented } = require('../util/evented');
4
+ const createStyleLayer = require('./create_style_layer');
5
+ const loadSprite = require('./load_sprite');
6
+ const ImageManager = require('../render/image_manager');
7
+ const GlyphManager = require('../render/glyph_manager');
8
+ const Light = require('./light');
9
+ const LineAtlas = require('../render/line_atlas');
10
+ const { clone, deepEqual, filterObject, mapObject } = require('../util/object');
11
+ const browser = require('../util/browser');
12
+ const dispatcher = require('../util/dispatcher');
13
+ const { getType: getSourceType, setType: setSourceType } = require('../source/source');
14
+ const { queryRenderedFeatures, queryRenderedSymbols, querySourceFeatures } = require('../source/query_features');
15
+ const SourceCache = require('../source/source_cache');
16
+ const getWorkerPool = require('../util/global_worker_pool');
17
+ const deref = require('../style-spec/deref');
18
+ const { registerForPluginAvailability, evented: rtlTextPluginEvented } = require('../source/rtl_text_plugin');
19
+ const PauseablePlacement = require('./pauseable_placement');
20
+ const ZoomHistory = require('./zoom_history');
21
+ const CrossTileSymbolIndex = require('../symbol/cross_tile_symbol_index');
22
+
23
+ /**
24
+ * @private
25
+ */
26
+ class Style extends Evented {
27
+ // exposed to allow stubbing by unit tests
28
+
29
+ constructor(map, options = {}) {
30
+ super();
31
+
32
+ this.map = map;
33
+ this.dispatcher = dispatcher(getWorkerPool(), this);
34
+ this.imageManager = new ImageManager();
35
+ this.glyphManager = new GlyphManager(options.localIdeographFontFamily);
36
+ this.lineAtlas = new LineAtlas(256, 512);
37
+ this.crossTileSymbolIndex = new CrossTileSymbolIndex();
38
+
39
+ this._layers = {};
40
+ this._order = [];
41
+ this.sourceCaches = {};
42
+ this.zoomHistory = new ZoomHistory();
43
+ this._loaded = false;
44
+
45
+ this._resetUpdates();
46
+
47
+ const self = this;
48
+ this._rtlTextPluginCallback = Style.registerForPluginAvailability(args => {
49
+ self.dispatcher.broadcast('loadRTLTextPlugin', args.pluginURL, args.completionCallback);
50
+ for (const id in self.sourceCaches) {
51
+ self.sourceCaches[id].reload(); // Should be a no-op if the plugin loads before any tiles load
52
+ }
53
+ });
54
+
55
+ this.on('data', event => {
56
+ if (event.dataType !== 'source' || event.sourceDataType !== 'metadata') {
57
+ return;
58
+ }
59
+
60
+ const sourceCache = this.sourceCaches[event.sourceId];
61
+ if (!sourceCache) {
62
+ return;
63
+ }
64
+
65
+ const source = sourceCache.getSource();
66
+ if (!source || !source.vectorLayerIds) {
67
+ return;
68
+ }
69
+
70
+ for (const layerId in this._layers) {
71
+ const layer = this._layers[layerId];
72
+ if (layer.source === source.id) {
73
+ this._validateLayer(layer);
74
+ }
75
+ }
76
+ });
77
+ }
78
+
79
+ loadJSON(json) {
80
+ this.fire(new Event('dataloading', { dataType: 'style' }));
81
+
82
+ browser.frame(() => {
83
+ this._load(json);
84
+ });
85
+ }
86
+
87
+ _load(json) {
88
+ this._loaded = true;
89
+ this.stylesheet = json;
90
+
91
+ for (const id in json.sources) {
92
+ this.addSource(id, json.sources[id]);
93
+ }
94
+
95
+ if (json.sprite) {
96
+ loadSprite(json.sprite, (err, images) => {
97
+ if (err) {
98
+ this.fire(new ErrorEvent(err));
99
+ } else if (images) {
100
+ for (const id in images) {
101
+ this.imageManager.addImage(id, images[id]);
102
+ }
103
+ }
104
+
105
+ this.imageManager.setLoaded(true);
106
+ this.fire(new Event('data', { dataType: 'style' }));
107
+ });
108
+ } else {
109
+ this.imageManager.setLoaded(true);
110
+ }
111
+
112
+ this.glyphManager.setGlyphsLoader(json.glyphs);
113
+
114
+ const layers = deref(this.stylesheet.layers);
115
+
116
+ this._order = layers.map(layer => layer.id);
117
+
118
+ this._layers = {};
119
+ for (let layer of layers) {
120
+ layer = createStyleLayer(layer);
121
+ layer.setEventedParent(this, { layer: { id: layer.id } });
122
+ this._layers[layer.id] = layer;
123
+ }
124
+
125
+ this.dispatcher.broadcast('setLayers', this._serializeLayers(this._order));
126
+
127
+ this.light = new Light(this.stylesheet.light);
128
+
129
+ this.fire(new Event('data', { dataType: 'style' }));
130
+ this.fire(new Event('style.load'));
131
+ }
132
+
133
+ _validateLayer(layer) {
134
+ const sourceCache = this.sourceCaches[layer.source];
135
+ if (!sourceCache) {
136
+ return;
137
+ }
138
+
139
+ const sourceLayer = layer.sourceLayer;
140
+ if (!sourceLayer) {
141
+ return;
142
+ }
143
+
144
+ const source = sourceCache.getSource();
145
+ if (source.type === 'geojson' || (source.vectorLayerIds && source.vectorLayerIds.indexOf(sourceLayer) === -1)) {
146
+ this.fire(
147
+ new ErrorEvent(
148
+ new Error(
149
+ `Source layer "${sourceLayer}" ` +
150
+ `does not exist on source "${source.id}" ` +
151
+ `as specified by style layer "${layer.id}"`
152
+ )
153
+ )
154
+ );
155
+ }
156
+ }
157
+
158
+ loaded() {
159
+ if (!this._loaded) return false;
160
+
161
+ if (Object.keys(this._updatedSources).length) return false;
162
+
163
+ for (const id in this.sourceCaches) if (!this.sourceCaches[id].loaded()) return false;
164
+
165
+ if (!this.imageManager.isLoaded()) return false;
166
+
167
+ return true;
168
+ }
169
+
170
+ _serializeLayers(ids) {
171
+ return ids.map(id => this._layers[id].serialize());
172
+ }
173
+
174
+ hasTransitions() {
175
+ if (this.light?.hasTransition()) {
176
+ return true;
177
+ }
178
+
179
+ for (const id in this.sourceCaches) {
180
+ if (this.sourceCaches[id].hasTransition()) {
181
+ return true;
182
+ }
183
+ }
184
+
185
+ for (const id in this._layers) {
186
+ if (this._layers[id].hasTransition()) {
187
+ return true;
188
+ }
189
+ }
190
+
191
+ return false;
192
+ }
193
+
194
+ _checkLoaded() {
195
+ if (!this._loaded) {
196
+ throw new Error('Style is not done loading');
197
+ }
198
+ }
199
+
200
+ /**
201
+ * Apply queued style updates in a batch and recalculate zoom-dependent paint properties.
202
+ */
203
+ update(parameters) {
204
+ if (!this._loaded) {
205
+ return;
206
+ }
207
+
208
+ if (this._changed) {
209
+ const updatedIds = Object.keys(this._updatedLayers);
210
+ const removedIds = Object.keys(this._removedLayers);
211
+
212
+ if (updatedIds.length || removedIds.length) {
213
+ this._updateWorkerLayers(updatedIds, removedIds);
214
+ }
215
+ for (const id in this._updatedSources) {
216
+ const action = this._updatedSources[id];
217
+ assert(action === 'reload' || action === 'clear');
218
+ if (action === 'reload') {
219
+ this._reloadSource(id);
220
+ } else if (action === 'clear') {
221
+ this._clearSource(id);
222
+ }
223
+ }
224
+
225
+ for (const id in this._updatedPaintProps) {
226
+ this._layers[id].updateTransitions(parameters);
227
+ }
228
+
229
+ this.light.updateTransitions(parameters);
230
+
231
+ this._resetUpdates();
232
+
233
+ this.fire(new Event('data', { dataType: 'style' }));
234
+ }
235
+
236
+ for (const sourceId in this.sourceCaches) {
237
+ this.sourceCaches[sourceId].used = false;
238
+ }
239
+
240
+ for (const layerId of this._order) {
241
+ const layer = this._layers[layerId];
242
+
243
+ layer.recalculate(parameters);
244
+ if (!layer.isHidden(parameters.zoom) && layer.source) {
245
+ this.sourceCaches[layer.source].used = true;
246
+ }
247
+ }
248
+
249
+ this.light.recalculate(parameters);
250
+ this.z = parameters.zoom;
251
+ }
252
+
253
+ _updateWorkerLayers(updatedIds, removedIds) {
254
+ this.dispatcher.broadcast('updateLayers', {
255
+ layers: this._serializeLayers(updatedIds),
256
+ removedIds: removedIds
257
+ });
258
+ }
259
+
260
+ _resetUpdates() {
261
+ this._changed = false;
262
+
263
+ this._updatedLayers = {};
264
+ this._removedLayers = {};
265
+
266
+ this._updatedSources = {};
267
+ this._updatedPaintProps = {};
268
+ }
269
+
270
+ addImage(id, image) {
271
+ if (this.getImage(id)) {
272
+ return this.fire(new ErrorEvent(new Error('An image with this name already exists.')));
273
+ }
274
+ this.imageManager.addImage(id, image);
275
+ this.fire(new Event('data', { dataType: 'style' }));
276
+ }
277
+
278
+ getImage(id) {
279
+ return this.imageManager.getImage(id);
280
+ }
281
+
282
+ removeImage(id) {
283
+ if (!this.getImage(id)) {
284
+ return this.fire(new ErrorEvent(new Error('No image with this name exists.')));
285
+ }
286
+ this.imageManager.removeImage(id);
287
+ this.fire(new Event('data', { dataType: 'style' }));
288
+ }
289
+
290
+ listImages() {
291
+ this._checkLoaded();
292
+
293
+ return this.imageManager.listImages();
294
+ }
295
+
296
+ addSource(id, source) {
297
+ this._checkLoaded();
298
+
299
+ if (this.sourceCaches[id] !== undefined) {
300
+ throw new Error('There is already a source with this ID');
301
+ }
302
+
303
+ if (!source.type) {
304
+ throw new Error(
305
+ `The type property must be defined, but the only the following properties were given: ${Object.keys(source).join(', ')}.`
306
+ );
307
+ }
308
+
309
+ const sourceCache = (this.sourceCaches[id] = new SourceCache(id, source, this.dispatcher));
310
+ sourceCache.style = this;
311
+ sourceCache.setEventedParent(this, () => ({
312
+ isSourceLoaded: this.loaded(),
313
+ source: sourceCache.serialize(),
314
+ sourceId: id
315
+ }));
316
+
317
+ sourceCache.onAdd(this.map);
318
+ this._changed = true;
319
+ }
320
+
321
+ /**
322
+ * Remove a source from this stylesheet, given its id.
323
+ * @param {string} id id of the source to remove
324
+ * @throws {Error} if no source is found with the given ID
325
+ */
326
+ removeSource(id) {
327
+ this._checkLoaded();
328
+
329
+ if (this.sourceCaches[id] === undefined) {
330
+ throw new Error('There is no source with this ID');
331
+ }
332
+ for (const layerId in this._layers) {
333
+ if (this._layers[layerId].source === id) {
334
+ return this.fire(
335
+ new ErrorEvent(new Error(`Source "${id}" cannot be removed while layer "${layerId}" is using it.`))
336
+ );
337
+ }
338
+ }
339
+
340
+ const sourceCache = this.sourceCaches[id];
341
+ delete this.sourceCaches[id];
342
+ delete this._updatedSources[id];
343
+ sourceCache.fire(new Event('data', { sourceDataType: 'metadata', dataType: 'source', sourceId: id }));
344
+ sourceCache.setEventedParent(null);
345
+ sourceCache.clearTiles();
346
+
347
+ if (sourceCache.onRemove) sourceCache.onRemove(this.map);
348
+ this._changed = true;
349
+ }
350
+
351
+ /**
352
+ * Set the data of a GeoJSON source, given its id.
353
+ * @param {string} id id of the source
354
+ * @param {GeoJSON|string} data GeoJSON source
355
+ */
356
+ setGeoJSONSourceData(id, data) {
357
+ this._checkLoaded();
358
+
359
+ assert(this.sourceCaches[id] !== undefined, 'There is no source with this ID');
360
+ const geojsonSource = this.sourceCaches[id].getSource();
361
+ assert(geojsonSource.type === 'geojson');
362
+
363
+ geojsonSource.setData(data);
364
+ this._changed = true;
365
+ }
366
+
367
+ /**
368
+ * Get a source by id.
369
+ * @param {string} id id of the desired source
370
+ * @returns {Object} source
371
+ */
372
+ getSource(id) {
373
+ return this.sourceCaches[id]?.getSource();
374
+ }
375
+
376
+ /**
377
+ * Add a layer to the map style. The layer will be inserted before the layer with
378
+ * ID `before`, or appended if `before` is omitted.
379
+ * @param {string} [before] ID of an existing layer to insert before
380
+ */
381
+ addLayer(layerObject, before) {
382
+ this._checkLoaded();
383
+
384
+ const id = layerObject.id;
385
+
386
+ if (this.getLayer(id)) {
387
+ this.fire(new ErrorEvent(new Error(`Layer with id "${id}" already exists on this map`)));
388
+ return;
389
+ }
390
+
391
+ if (typeof layerObject.source === 'object') {
392
+ this.addSource(id, layerObject.source);
393
+ layerObject = clone(layerObject);
394
+ layerObject = Object.assign(layerObject, { source: id });
395
+ }
396
+
397
+ const layer = createStyleLayer(layerObject);
398
+ this._validateLayer(layer);
399
+
400
+ layer.setEventedParent(this, { layer: { id: id } });
401
+
402
+ const index = before ? this._order.indexOf(before) : this._order.length;
403
+ if (before && index === -1) {
404
+ this.fire(new ErrorEvent(new Error(`Layer with id "${before}" does not exist on this map.`)));
405
+ return;
406
+ }
407
+
408
+ this._order.splice(index, 0, id);
409
+ this._layerOrderChanged = true;
410
+
411
+ this._layers[id] = layer;
412
+
413
+ if (this._removedLayers[id] && layer.source) {
414
+ // If, in the current batch, we have already removed this layer
415
+ // and we are now re-adding it with a different `type`, then we
416
+ // need to clear (rather than just reload) the underyling source's
417
+ // tiles. Otherwise, tiles marked 'reloading' will have buckets /
418
+ // buffers that are set up for the _previous_ version of this
419
+ // layer, causing, e.g.:
420
+ // https://github.com/mapbox/mapbox-gl-js/issues/3633
421
+ const removed = this._removedLayers[id];
422
+ delete this._removedLayers[id];
423
+ if (removed.type !== layer.type) {
424
+ this._updatedSources[layer.source] = 'clear';
425
+ } else {
426
+ this._updatedSources[layer.source] = 'reload';
427
+ this.sourceCaches[layer.source].pause();
428
+ }
429
+ }
430
+ this._updateLayer(layer);
431
+ }
432
+
433
+ /**
434
+ * Moves a layer to a different z-position. The layer will be inserted before the layer with
435
+ * ID `before`, or appended if `before` is omitted.
436
+ * @param {string} id ID of the layer to move
437
+ * @param {string} [before] ID of an existing layer to insert before
438
+ */
439
+ moveLayer(id, before) {
440
+ this._checkLoaded();
441
+ this._changed = true;
442
+
443
+ const layer = this._layers[id];
444
+ if (!layer) {
445
+ this.fire(new ErrorEvent(new Error(`The layer '${id}' does not exist in the map's style and cannot be moved.`)));
446
+ return;
447
+ }
448
+
449
+ if (id === before) {
450
+ return;
451
+ }
452
+
453
+ const index = this._order.indexOf(id);
454
+ this._order.splice(index, 1);
455
+
456
+ const newIndex = before ? this._order.indexOf(before) : this._order.length;
457
+ if (before && newIndex === -1) {
458
+ this.fire(new ErrorEvent(new Error(`Layer with id "${before}" does not exist on this map.`)));
459
+ return;
460
+ }
461
+ this._order.splice(newIndex, 0, id);
462
+
463
+ this._layerOrderChanged = true;
464
+ }
465
+
466
+ /**
467
+ * Remove the layer with the given id from the style.
468
+ *
469
+ * If no such layer exists, an `error` event is fired.
470
+ *
471
+ * @param {string} id id of the layer to remove
472
+ * @fires error
473
+ */
474
+ removeLayer(id) {
475
+ this._checkLoaded();
476
+
477
+ const layer = this._layers[id];
478
+ if (!layer) {
479
+ this.fire(
480
+ new ErrorEvent(new Error(`The layer '${id}' does not exist in the map's style and cannot be removed.`))
481
+ );
482
+ return;
483
+ }
484
+
485
+ layer.setEventedParent(null);
486
+
487
+ const index = this._order.indexOf(id);
488
+ this._order.splice(index, 1);
489
+
490
+ this._layerOrderChanged = true;
491
+ this._changed = true;
492
+ this._removedLayers[id] = layer;
493
+ delete this._layers[id];
494
+ delete this._updatedLayers[id];
495
+ delete this._updatedPaintProps[id];
496
+ }
497
+
498
+ /**
499
+ * Return the style layer object with the given `id`.
500
+ *
501
+ * @param {string} id - id of the desired layer
502
+ * @returns {?Object} a layer, if one with the given `id` exists
503
+ */
504
+ getLayer(id) {
505
+ return this._layers[id];
506
+ }
507
+
508
+ setLayerZoomRange(layerId, minzoom, maxzoom) {
509
+ this._checkLoaded();
510
+
511
+ const layer = this.getLayer(layerId);
512
+ if (!layer) {
513
+ this.fire(
514
+ new ErrorEvent(
515
+ new Error(`The layer '${layerId}' does not exist in the map's style and cannot have zoom extent.`)
516
+ )
517
+ );
518
+ return;
519
+ }
520
+
521
+ if (layer.minzoom === minzoom && layer.maxzoom === maxzoom) return;
522
+
523
+ if (minzoom != null) {
524
+ layer.minzoom = minzoom;
525
+ }
526
+ if (maxzoom != null) {
527
+ layer.maxzoom = maxzoom;
528
+ }
529
+ this._updateLayer(layer);
530
+ }
531
+
532
+ setFilter(layerId, filter) {
533
+ this._checkLoaded();
534
+
535
+ const layer = this.getLayer(layerId);
536
+ if (!layer) {
537
+ this.fire(
538
+ new ErrorEvent(new Error(`The layer '${layerId}' does not exist in the map's style and cannot be filtered.`))
539
+ );
540
+ return;
541
+ }
542
+
543
+ if (deepEqual(layer.filter, filter)) {
544
+ return;
545
+ }
546
+
547
+ if (filter === null || filter === undefined) {
548
+ layer.filter = undefined;
549
+ this._updateLayer(layer);
550
+ return;
551
+ }
552
+
553
+ layer.filter = clone(filter);
554
+ this._updateLayer(layer);
555
+ }
556
+
557
+ /**
558
+ * Get a layer's filter object
559
+ * @param {string} layer the layer to inspect
560
+ * @returns {*} the layer's filter, if any
561
+ */
562
+ getFilter(layer) {
563
+ return clone(this.getLayer(layer).filter);
564
+ }
565
+
566
+ setLayoutProperty(layerId, name, value) {
567
+ this._checkLoaded();
568
+
569
+ const layer = this.getLayer(layerId);
570
+ if (!layer) {
571
+ this.fire(
572
+ new ErrorEvent(new Error(`The layer '${layerId}' does not exist in the map's style and cannot be styled.`))
573
+ );
574
+ return;
575
+ }
576
+
577
+ if (deepEqual(layer.getLayoutProperty(name), value)) return;
578
+
579
+ layer.setLayoutProperty(name, value);
580
+ this._updateLayer(layer);
581
+ }
582
+
583
+ /**
584
+ * Get a layout property's value from a given layer
585
+ * @param {string} layer the layer to inspect
586
+ * @param {string} name the name of the layout property
587
+ * @returns {*} the property value
588
+ */
589
+ getLayoutProperty(layer, name) {
590
+ return this.getLayer(layer).getLayoutProperty(name);
591
+ }
592
+
593
+ setPaintProperty(layerId, name, value) {
594
+ this._checkLoaded();
595
+
596
+ const layer = this.getLayer(layerId);
597
+ if (!layer) {
598
+ this.fire(
599
+ new ErrorEvent(new Error(`The layer '${layerId}' does not exist in the map's style and cannot be styled.`))
600
+ );
601
+ return;
602
+ }
603
+
604
+ if (deepEqual(layer.getPaintProperty(name), value)) return;
605
+
606
+ const requiresRelayout = layer.setPaintProperty(name, value);
607
+ if (requiresRelayout) {
608
+ this._updateLayer(layer);
609
+ }
610
+
611
+ this._changed = true;
612
+ this._updatedPaintProps[layerId] = true;
613
+ }
614
+
615
+ getPaintProperty(layer, name) {
616
+ return this.getLayer(layer).getPaintProperty(name);
617
+ }
618
+
619
+ setFeatureState(feature, state) {
620
+ this._checkLoaded();
621
+ const sourceId = feature.source;
622
+ const sourceLayer = feature.sourceLayer;
623
+ const sourceCache = this.sourceCaches[sourceId];
624
+
625
+ if (sourceCache === undefined) {
626
+ this.fire(new ErrorEvent(new Error(`The source '${sourceId}' does not exist in the map's style.`)));
627
+ return;
628
+ }
629
+ const sourceType = sourceCache.getSource().type;
630
+ if (sourceType === 'vector' && !sourceLayer) {
631
+ this.fire(new ErrorEvent(new Error('The sourceLayer parameter must be provided for vector source types.')));
632
+ return;
633
+ }
634
+
635
+ sourceCache.setFeatureState(sourceLayer, feature.id, state);
636
+ }
637
+
638
+ getFeatureState(feature) {
639
+ this._checkLoaded();
640
+ const sourceId = feature.source;
641
+ const sourceLayer = feature.sourceLayer;
642
+ const sourceCache = this.sourceCaches[sourceId];
643
+
644
+ if (sourceCache === undefined) {
645
+ this.fire(new ErrorEvent(new Error(`The source '${sourceId}' does not exist in the map's style.`)));
646
+ return;
647
+ }
648
+ const sourceType = sourceCache.getSource().type;
649
+ if (sourceType === 'vector' && !sourceLayer) {
650
+ this.fire(new ErrorEvent(new Error('The sourceLayer parameter must be provided for vector source types.')));
651
+ return;
652
+ }
653
+
654
+ return sourceCache.getFeatureState(sourceLayer, feature.id);
655
+ }
656
+
657
+ getTransition() {
658
+ return Object.assign({ duration: 300, delay: 0 }, this.stylesheet?.transition);
659
+ }
660
+
661
+ serialize() {
662
+ return filterObject(
663
+ {
664
+ version: this.stylesheet.version,
665
+ name: this.stylesheet.name,
666
+ metadata: this.stylesheet.metadata,
667
+ light: this.stylesheet.light,
668
+ center: this.stylesheet.center,
669
+ zoom: this.stylesheet.zoom,
670
+ bearing: this.stylesheet.bearing,
671
+ pitch: this.stylesheet.pitch,
672
+ sprite: this.stylesheet.sprite,
673
+ glyphs: this.stylesheet.glyphs,
674
+ transition: this.stylesheet.transition,
675
+ sources: mapObject(this.sourceCaches, source => source.serialize()),
676
+ layers: this._order.map(id => this._layers[id].serialize())
677
+ },
678
+ value => value !== undefined
679
+ );
680
+ }
681
+
682
+ _updateLayer(layer) {
683
+ this._updatedLayers[layer.id] = true;
684
+ if (layer.source && !this._updatedSources[layer.source]) {
685
+ this._updatedSources[layer.source] = 'reload';
686
+ this.sourceCaches[layer.source].pause();
687
+ }
688
+ this._changed = true;
689
+ }
690
+
691
+ _flattenAndSortRenderedFeatures(sourceResults) {
692
+ const features = [];
693
+ const features3D = [];
694
+ for (let l = this._order.length - 1; l >= 0; l--) {
695
+ const layerId = this._order[l];
696
+ for (const sourceResult of sourceResults) {
697
+ const layerFeatures = sourceResult[layerId];
698
+ if (layerFeatures) {
699
+ if (this._layers[layerId].type === 'fill-extrusion') {
700
+ for (const featureWrapper of layerFeatures) {
701
+ features3D.push(featureWrapper);
702
+ }
703
+ } else {
704
+ for (const featureWrapper of layerFeatures) {
705
+ features.push(featureWrapper.feature);
706
+ }
707
+ }
708
+ }
709
+ }
710
+ }
711
+
712
+ features3D.sort((a, b) => {
713
+ return a.intersectionZ - b.intersectionZ;
714
+ });
715
+
716
+ for (const featureWrapper of features3D) {
717
+ features.push(featureWrapper.feature);
718
+ }
719
+
720
+ return features;
721
+ }
722
+
723
+ queryRenderedFeatures(queryGeometry, params, transform) {
724
+ const includedSources = {};
725
+ if (params?.layers) {
726
+ if (!Array.isArray(params.layers)) {
727
+ this.fire(new ErrorEvent(new Error('parameters.layers must be an Array.')));
728
+ return [];
729
+ }
730
+ for (const layerId of params.layers) {
731
+ const layer = this._layers[layerId];
732
+ if (layer) {
733
+ includedSources[layer.source] = true;
734
+ }
735
+ }
736
+ }
737
+
738
+ const sourceResults = [];
739
+ for (const id in this.sourceCaches) {
740
+ if (params.layers && !includedSources[id]) continue;
741
+ sourceResults.push(
742
+ queryRenderedFeatures(this.sourceCaches[id], this._layers, queryGeometry.viewport, params, transform)
743
+ );
744
+ }
745
+
746
+ if (this.placement) {
747
+ // If a placement has run, query against its CollisionIndex
748
+ // for symbol results, and treat it as an extra source to merge
749
+ sourceResults.push(
750
+ queryRenderedSymbols(
751
+ this._layers,
752
+ this.sourceCaches,
753
+ queryGeometry.viewport,
754
+ params,
755
+ this.placement.collisionIndex,
756
+ this.placement.retainedQueryData
757
+ )
758
+ );
759
+ }
760
+ return this._flattenAndSortRenderedFeatures(sourceResults);
761
+ }
762
+
763
+ querySourceFeatures(sourceID, params) {
764
+ const sourceCache = this.sourceCaches[sourceID];
765
+ return sourceCache ? querySourceFeatures(sourceCache, params) : [];
766
+ }
767
+
768
+ addSourceType(name, SourceType, callback) {
769
+ if (Style.getSourceType(name)) {
770
+ return callback(new Error(`A source type called "${name}" already exists.`));
771
+ }
772
+
773
+ Style.setSourceType(name, SourceType);
774
+
775
+ if (!SourceType.workerSourceURL) {
776
+ return callback(null, null);
777
+ }
778
+
779
+ this.dispatcher.broadcast(
780
+ 'loadWorkerSource',
781
+ {
782
+ name: name,
783
+ url: SourceType.workerSourceURL
784
+ },
785
+ callback
786
+ );
787
+ }
788
+
789
+ getLight() {
790
+ return this.light.getLight();
791
+ }
792
+
793
+ setLight(lightOptions) {
794
+ this._checkLoaded();
795
+
796
+ const light = this.light.getLight();
797
+ let _update = false;
798
+ for (const key in lightOptions) {
799
+ if (!deepEqual(lightOptions[key], light[key])) {
800
+ _update = true;
801
+ break;
802
+ }
803
+ }
804
+ if (!_update) return;
805
+
806
+ const parameters = {
807
+ now: browser.now(),
808
+ transition: Object.assign(
809
+ {
810
+ duration: 300,
811
+ delay: 0
812
+ },
813
+ this.stylesheet.transition
814
+ )
815
+ };
816
+
817
+ this.light.setLight(lightOptions);
818
+ this.light.updateTransitions(parameters);
819
+ }
820
+
821
+ _remove() {
822
+ rtlTextPluginEvented.off('pluginAvailable', this._rtlTextPluginCallback);
823
+ for (const id in this.sourceCaches) {
824
+ this.sourceCaches[id].clearTiles();
825
+ }
826
+ this.dispatcher.remove();
827
+ }
828
+
829
+ _clearSource(id) {
830
+ this.sourceCaches[id].clearTiles();
831
+ }
832
+
833
+ _reloadSource(id) {
834
+ this.sourceCaches[id].resume();
835
+ this.sourceCaches[id].reload();
836
+ }
837
+
838
+ _updateSources(transform) {
839
+ for (const id in this.sourceCaches) {
840
+ this.sourceCaches[id].update(transform);
841
+ }
842
+ }
843
+
844
+ _generateCollisionBoxes() {
845
+ for (const id in this.sourceCaches) {
846
+ this._reloadSource(id);
847
+ }
848
+ }
849
+
850
+ _updatePlacement(transform, showCollisionBoxes, fadeDuration, crossSourceCollisions) {
851
+ let symbolBucketsChanged = false;
852
+ let placementCommitted = false;
853
+
854
+ const layerTiles = {};
855
+
856
+ for (const layerID of this._order) {
857
+ const styleLayer = this._layers[layerID];
858
+ if (styleLayer.type !== 'symbol') continue;
859
+
860
+ if (!layerTiles[styleLayer.source]) {
861
+ const sourceCache = this.sourceCaches[styleLayer.source];
862
+ layerTiles[styleLayer.source] = sourceCache
863
+ .getRenderableIds(true)
864
+ .map(id => sourceCache.getTileByID(id))
865
+ .sort((a, b) => b.tileID.overscaledZ - a.tileID.overscaledZ || (a.tileID.isLessThan(b.tileID) ? -1 : 1));
866
+ }
867
+
868
+ const layerBucketsChanged = this.crossTileSymbolIndex.addLayer(
869
+ styleLayer,
870
+ layerTiles[styleLayer.source],
871
+ transform.center.lng
872
+ );
873
+ symbolBucketsChanged = symbolBucketsChanged || layerBucketsChanged;
874
+ }
875
+ this.crossTileSymbolIndex.pruneUnusedLayers(this._order);
876
+
877
+ // Anything that changes our "in progress" layer and tile indices requires us
878
+ // to start over. When we start over, we do a full placement instead of incremental
879
+ // to prevent starvation.
880
+ // We need to restart placement to keep layer indices in sync.
881
+ const forceFullPlacement = this._layerOrderChanged;
882
+
883
+ if (
884
+ forceFullPlacement ||
885
+ !this.pauseablePlacement ||
886
+ (this.pauseablePlacement.isDone() && !this.placement.stillRecent(browser.now()))
887
+ ) {
888
+ this.pauseablePlacement = new PauseablePlacement(
889
+ transform,
890
+ this._order,
891
+ forceFullPlacement,
892
+ showCollisionBoxes,
893
+ fadeDuration,
894
+ crossSourceCollisions
895
+ );
896
+ this._layerOrderChanged = false;
897
+ }
898
+
899
+ if (this.pauseablePlacement.isDone()) {
900
+ // the last placement finished running, but the next one hasn’t
901
+ // started yet because of the `stillRecent` check immediately
902
+ // above, so mark it stale to ensure that we request another
903
+ // render frame
904
+ this.placement.setStale();
905
+ } else {
906
+ this.pauseablePlacement.continuePlacement(this._order, this._layers, layerTiles);
907
+
908
+ if (this.pauseablePlacement.isDone()) {
909
+ this.placement = this.pauseablePlacement.commit(this.placement, browser.now());
910
+ placementCommitted = true;
911
+ }
912
+
913
+ if (symbolBucketsChanged) {
914
+ // since the placement gets split over multiple frames it is possible
915
+ // these buckets were processed before they were changed and so the
916
+ // placement is already stale while it is in progress
917
+ this.pauseablePlacement.placement.setStale();
918
+ }
919
+ }
920
+
921
+ if (placementCommitted || symbolBucketsChanged) {
922
+ for (const layerID of this._order) {
923
+ const styleLayer = this._layers[layerID];
924
+ if (styleLayer.type !== 'symbol') continue;
925
+ this.placement.updateLayerOpacities(styleLayer, layerTiles[styleLayer.source]);
926
+ }
927
+ }
928
+
929
+ // needsRender is false when we have just finished a placement that didn't change the visibility of any symbols
930
+ const needsRerender = !this.pauseablePlacement.isDone() || this.placement.hasTransitions(browser.now());
931
+ return needsRerender;
932
+ }
933
+
934
+ _releaseSymbolFadeTiles() {
935
+ for (const id in this.sourceCaches) {
936
+ this.sourceCaches[id].releaseSymbolFadeTiles();
937
+ }
938
+ }
939
+
940
+ // Callbacks from web workers
941
+
942
+ getImages(mapId, params, callback) {
943
+ this.imageManager.getImages(params.icons, callback);
944
+ }
945
+
946
+ getGlyphs(mapId, params, callback) {
947
+ return this.glyphManager.getGlyphs(params.stacks, callback);
948
+ }
949
+ }
950
+
951
+ Style.getSourceType = getSourceType;
952
+ Style.setSourceType = setSourceType;
953
+ Style.registerForPluginAvailability = registerForPluginAvailability;
954
+
955
+ module.exports = Style;