maplibre-gl 2.0.4 → 2.1.2

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 (319) hide show
  1. package/build/{banner.js → banner.ts} +1 -1
  2. package/build/generate-query-test-fixtures.ts +123 -0
  3. package/build/generate-shaders.ts +35 -0
  4. package/build/generate-struct-arrays.ts +7 -7
  5. package/build/generate-style-code.ts +8 -8
  6. package/build/generate-style-spec.ts +5 -4
  7. package/build/generate-typings.ts +16 -0
  8. package/build/readme.md +8 -18
  9. package/build/release-notes.js +9 -13
  10. package/build/{rollup_plugin_minify_style_spec.js → rollup_plugin_minify_style_spec.ts} +4 -3
  11. package/build/{rollup_plugins.js → rollup_plugins.ts} +12 -26
  12. package/dist/maplibre-gl-dev.js +54885 -0
  13. package/dist/maplibre-gl.css +1 -1
  14. package/dist/maplibre-gl.d.ts +1583 -1023
  15. package/dist/maplibre-gl.js +3 -3
  16. package/dist/maplibre-gl.js.map +1 -1
  17. package/package.json +99 -141
  18. package/src/css/maplibre-gl.css +36 -36
  19. package/src/data/{array_types.ts → array_types.g.ts} +0 -0
  20. package/src/data/bucket/circle_bucket.ts +1 -1
  21. package/src/data/bucket/fill_bucket.test.ts +1 -1
  22. package/src/data/bucket/fill_bucket.ts +4 -4
  23. package/src/data/bucket/fill_extrusion_bucket.ts +1 -1
  24. package/src/data/bucket/line_bucket.test.ts +1 -1
  25. package/src/data/bucket/line_bucket.ts +6 -6
  26. package/src/data/bucket/symbol_bucket.test.ts +16 -16
  27. package/src/data/bucket/symbol_bucket.ts +56 -56
  28. package/src/data/bucket.ts +43 -43
  29. package/src/data/dem_data.ts +12 -12
  30. package/src/data/evaluation_feature.ts +10 -10
  31. package/src/data/feature_index.ts +37 -37
  32. package/src/data/feature_position_map.ts +5 -5
  33. package/src/data/index_array_type.ts +1 -1
  34. package/src/data/load_geometry.test.ts +1 -1
  35. package/src/data/program_configuration.ts +47 -47
  36. package/src/data/segment.ts +14 -14
  37. package/src/geo/edge_insets.ts +2 -2
  38. package/src/geo/lng_lat.ts +4 -4
  39. package/src/geo/lng_lat_bounds.ts +35 -35
  40. package/src/geo/mercator_coordinate.ts +5 -5
  41. package/src/geo/transform.test.ts +1 -1
  42. package/src/geo/transform.ts +14 -14
  43. package/src/gl/context.ts +3 -3
  44. package/src/gl/types.ts +19 -19
  45. package/src/gl/value.ts +6 -6
  46. package/src/gl/vertex_buffer.test.ts +1 -1
  47. package/src/index.ts +24 -9
  48. package/src/render/draw_circle.ts +8 -8
  49. package/src/render/draw_collision_debug.ts +5 -5
  50. package/src/render/draw_debug.ts +1 -1
  51. package/src/render/draw_line.ts +4 -4
  52. package/src/render/draw_symbol.ts +21 -21
  53. package/src/render/glyph_atlas.ts +12 -12
  54. package/src/render/glyph_manager.test.ts +10 -21
  55. package/src/render/glyph_manager.ts +34 -33
  56. package/src/render/image_manager.ts +4 -4
  57. package/src/render/painter.ts +16 -14
  58. package/src/render/program/background_program.ts +29 -29
  59. package/src/render/program/circle_program.ts +11 -11
  60. package/src/render/program/clipping_mask_program.ts +1 -1
  61. package/src/render/program/collision_program.ts +9 -9
  62. package/src/render/program/debug_program.ts +4 -4
  63. package/src/render/program/fill_extrusion_program.ts +31 -31
  64. package/src/render/program/fill_program.ts +29 -29
  65. package/src/render/program/heatmap_program.ts +12 -12
  66. package/src/render/program/hillshade_program.ts +12 -12
  67. package/src/render/program/line_program.ts +41 -41
  68. package/src/render/program/pattern.ts +28 -28
  69. package/src/render/program/raster_program.ts +21 -21
  70. package/src/render/program/symbol_program.ts +97 -97
  71. package/src/render/program.ts +25 -25
  72. package/src/render/texture.ts +9 -9
  73. package/src/render/uniform_binding.ts +1 -1
  74. package/src/render/vertex_array_object.ts +13 -13
  75. package/src/shaders/_prelude.fragment.glsl.g.ts +2 -0
  76. package/src/shaders/_prelude.vertex.glsl.g.ts +2 -0
  77. package/src/shaders/background.fragment.glsl.g.ts +2 -0
  78. package/src/shaders/background.vertex.glsl.g.ts +2 -0
  79. package/src/shaders/background_pattern.fragment.glsl.g.ts +2 -0
  80. package/src/shaders/background_pattern.vertex.glsl.g.ts +2 -0
  81. package/src/shaders/circle.fragment.glsl.g.ts +2 -0
  82. package/src/shaders/circle.vertex.glsl.g.ts +2 -0
  83. package/src/shaders/clipping_mask.fragment.glsl.g.ts +2 -0
  84. package/src/shaders/clipping_mask.vertex.glsl.g.ts +2 -0
  85. package/src/shaders/collision_box.fragment.glsl.g.ts +2 -0
  86. package/src/shaders/collision_box.vertex.glsl.g.ts +2 -0
  87. package/src/shaders/collision_circle.fragment.glsl.g.ts +2 -0
  88. package/src/shaders/collision_circle.vertex.glsl.g.ts +2 -0
  89. package/src/shaders/debug.fragment.glsl.g.ts +2 -0
  90. package/src/shaders/debug.vertex.glsl.g.ts +2 -0
  91. package/src/shaders/fill.fragment.glsl.g.ts +2 -0
  92. package/src/shaders/fill.vertex.glsl.g.ts +2 -0
  93. package/src/shaders/fill_extrusion.fragment.glsl.g.ts +2 -0
  94. package/src/shaders/fill_extrusion.vertex.glsl.g.ts +2 -0
  95. package/src/shaders/fill_extrusion_pattern.fragment.glsl.g.ts +2 -0
  96. package/src/shaders/fill_extrusion_pattern.vertex.glsl.g.ts +2 -0
  97. package/src/shaders/fill_outline.fragment.glsl.g.ts +2 -0
  98. package/src/shaders/fill_outline.vertex.glsl.g.ts +2 -0
  99. package/src/shaders/fill_outline_pattern.fragment.glsl.g.ts +2 -0
  100. package/src/shaders/fill_outline_pattern.vertex.glsl.g.ts +2 -0
  101. package/src/shaders/fill_pattern.fragment.glsl.g.ts +2 -0
  102. package/src/shaders/fill_pattern.vertex.glsl.g.ts +2 -0
  103. package/src/shaders/heatmap.fragment.glsl.g.ts +2 -0
  104. package/src/shaders/heatmap.vertex.glsl.g.ts +2 -0
  105. package/src/shaders/heatmap_texture.fragment.glsl.g.ts +2 -0
  106. package/src/shaders/heatmap_texture.vertex.glsl.g.ts +2 -0
  107. package/src/shaders/hillshade.fragment.glsl.g.ts +2 -0
  108. package/src/shaders/hillshade.vertex.glsl.g.ts +2 -0
  109. package/src/shaders/hillshade_prepare.fragment.glsl.g.ts +2 -0
  110. package/src/shaders/hillshade_prepare.vertex.glsl.g.ts +2 -0
  111. package/src/shaders/line.fragment.glsl.g.ts +2 -0
  112. package/src/shaders/line.vertex.glsl.g.ts +2 -0
  113. package/src/shaders/line_gradient.fragment.glsl.g.ts +2 -0
  114. package/src/shaders/line_gradient.vertex.glsl.g.ts +2 -0
  115. package/src/shaders/line_pattern.fragment.glsl.g.ts +2 -0
  116. package/src/shaders/line_pattern.vertex.glsl.g.ts +2 -0
  117. package/src/shaders/line_sdf.fragment.glsl.g.ts +2 -0
  118. package/src/shaders/line_sdf.vertex.glsl.g.ts +2 -0
  119. package/src/shaders/raster.fragment.glsl.g.ts +2 -0
  120. package/src/shaders/raster.vertex.glsl.g.ts +2 -0
  121. package/src/shaders/shaders.ts +52 -55
  122. package/src/shaders/symbol_icon.fragment.glsl.g.ts +2 -0
  123. package/src/shaders/symbol_icon.vertex.glsl.g.ts +2 -0
  124. package/src/shaders/symbol_sdf.fragment.glsl.g.ts +2 -0
  125. package/src/shaders/symbol_sdf.vertex.glsl.g.ts +2 -0
  126. package/src/shaders/symbol_text_and_icon.fragment.glsl.g.ts +2 -0
  127. package/src/shaders/symbol_text_and_icon.vertex.glsl.g.ts +2 -0
  128. package/src/source/canvas_source.test.ts +11 -12
  129. package/src/source/canvas_source.ts +4 -4
  130. package/src/source/geojson_source.test.ts +2 -1
  131. package/src/source/geojson_source.ts +1 -1
  132. package/src/source/geojson_worker_source.ts +23 -23
  133. package/src/source/geojson_wrapper.ts +8 -8
  134. package/src/source/image_source.test.ts +153 -0
  135. package/src/source/image_source.ts +6 -6
  136. package/src/source/pixels_to_tile_units.ts +6 -6
  137. package/src/source/query_features.ts +20 -20
  138. package/src/source/raster_dem_tile_source.test.ts +4 -3
  139. package/src/source/raster_dem_tile_source.ts +1 -1
  140. package/src/source/raster_tile_source.test.ts +4 -3
  141. package/src/source/raster_tile_source.ts +1 -1
  142. package/src/source/rtl_text_plugin.ts +10 -10
  143. package/src/source/source.ts +29 -29
  144. package/src/source/source_cache.test.ts +33 -1
  145. package/src/source/source_cache.ts +7 -5
  146. package/src/source/source_state.ts +1 -1
  147. package/src/source/tile.test.ts +3 -3
  148. package/src/source/tile.ts +15 -15
  149. package/src/source/tile_cache.test.ts +6 -4
  150. package/src/source/tile_cache.ts +6 -6
  151. package/src/source/tile_id.test.ts +10 -13
  152. package/src/source/tile_id.ts +2 -2
  153. package/src/source/vector_tile_source.test.ts +17 -5
  154. package/src/source/vector_tile_source.ts +4 -5
  155. package/src/source/vector_tile_worker_source.test.ts +4 -4
  156. package/src/source/vector_tile_worker_source.ts +5 -5
  157. package/src/source/worker.test.ts +1 -1
  158. package/src/source/worker.ts +22 -22
  159. package/src/source/worker_source.ts +56 -56
  160. package/src/source/worker_tile.ts +4 -4
  161. package/src/style/evaluation_parameters.ts +3 -3
  162. package/src/style/format_section_override.test.ts +1 -1
  163. package/src/style/light.ts +10 -10
  164. package/src/style/load_glyph_range.test.ts +3 -5
  165. package/src/style/load_glyph_range.ts +6 -6
  166. package/src/style/load_sprite.ts +5 -4
  167. package/src/style/pauseable_placement.ts +1 -1
  168. package/src/style/properties.ts +70 -70
  169. package/src/style/query_utils.ts +7 -7
  170. package/src/style/style.test.ts +26 -15
  171. package/src/style/style.ts +30 -30
  172. package/src/style/style_glyph.ts +8 -8
  173. package/src/style/style_image.ts +58 -58
  174. package/src/style/style_layer/background_style_layer.ts +2 -2
  175. package/src/style/style_layer/{background_style_layer_properties.ts → background_style_layer_properties.g.ts} +0 -0
  176. package/src/style/style_layer/circle_style_layer.ts +10 -10
  177. package/src/style/style_layer/{circle_style_layer_properties.ts → circle_style_layer_properties.g.ts} +0 -0
  178. package/src/style/style_layer/custom_style_layer.ts +19 -19
  179. package/src/style/style_layer/fill_extrusion_style_layer.ts +11 -11
  180. package/src/style/style_layer/{fill_extrusion_style_layer_properties.ts → fill_extrusion_style_layer_properties.g.ts} +0 -0
  181. package/src/style/style_layer/fill_style_layer.ts +9 -9
  182. package/src/style/style_layer/{fill_style_layer_properties.ts → fill_style_layer_properties.g.ts} +0 -0
  183. package/src/style/style_layer/heatmap_style_layer.ts +2 -2
  184. package/src/style/style_layer/{heatmap_style_layer_properties.ts → heatmap_style_layer_properties.g.ts} +0 -0
  185. package/src/style/style_layer/hillshade_style_layer.ts +2 -2
  186. package/src/style/style_layer/{hillshade_style_layer_properties.ts → hillshade_style_layer_properties.g.ts} +0 -0
  187. package/src/style/style_layer/line_style_layer.ts +9 -9
  188. package/src/style/style_layer/{line_style_layer_properties.ts → line_style_layer_properties.g.ts} +0 -0
  189. package/src/style/style_layer/raster_style_layer.ts +2 -2
  190. package/src/style/style_layer/{raster_style_layer_properties.ts → raster_style_layer_properties.g.ts} +0 -0
  191. package/src/style/style_layer/symbol_style_layer.ts +26 -7
  192. package/src/style/style_layer/{symbol_style_layer_properties.ts → symbol_style_layer_properties.g.ts} +6 -0
  193. package/src/style/style_layer.ts +10 -10
  194. package/src/style/style_layer_index.ts +3 -3
  195. package/src/style/validate_style.ts +15 -15
  196. package/src/style-spec/CHANGELOG.md +6 -0
  197. package/src/style-spec/error/validation_error.ts +1 -1
  198. package/src/style-spec/expression/compound_expression.ts +3 -3
  199. package/src/style-spec/expression/definitions/format.ts +11 -11
  200. package/src/style-spec/expression/definitions/interpolate.ts +5 -5
  201. package/src/style-spec/expression/definitions/match.ts +2 -2
  202. package/src/style-spec/expression/definitions/number_format.ts +11 -11
  203. package/src/style-spec/expression/expression.ts +8 -8
  204. package/src/style-spec/expression/index.ts +97 -97
  205. package/src/style-spec/expression/parsing_context.ts +11 -11
  206. package/src/style-spec/expression/types/collator.ts +9 -9
  207. package/src/style-spec/expression/types/resolved_image.ts +2 -2
  208. package/src/style-spec/expression/types.ts +14 -14
  209. package/src/style-spec/expression/values.ts +1 -1
  210. package/src/style-spec/feature_filter/index.ts +66 -66
  211. package/src/style-spec/function/convert.ts +3 -3
  212. package/src/style-spec/package.json +1 -1
  213. package/src/style-spec/reference/v8.json +68 -2
  214. package/src/style-spec/style-spec.ts +44 -44
  215. package/src/style-spec/types.ts +2 -0
  216. package/src/style-spec/util/color_spaces.ts +8 -8
  217. package/src/style-spec/util/result.ts +4 -4
  218. package/src/style-spec/validate/validate_filter.ts +58 -58
  219. package/src/style-spec/validate/validate_source.ts +63 -63
  220. package/src/style-spec/visit.ts +11 -11
  221. package/src/symbol/collision_feature.test.ts +1 -1
  222. package/src/symbol/collision_feature.ts +10 -10
  223. package/src/symbol/collision_index.ts +43 -43
  224. package/src/symbol/cross_tile_symbol_index.ts +17 -17
  225. package/src/symbol/get_anchors.ts +16 -16
  226. package/src/symbol/grid_index.test.ts +42 -19
  227. package/src/symbol/grid_index.ts +69 -40
  228. package/src/symbol/placement.ts +124 -95
  229. package/src/symbol/projection.ts +30 -30
  230. package/src/symbol/quads.ts +30 -30
  231. package/src/symbol/shaping.ts +160 -160
  232. package/src/symbol/symbol_layout.ts +119 -119
  233. package/src/symbol/symbol_size.ts +29 -29
  234. package/src/symbol/symbol_style_layer.test.ts +49 -2
  235. package/src/types/cancelable.ts +1 -1
  236. package/src/types/tilejson.ts +13 -13
  237. package/src/ui/anchor.ts +1 -1
  238. package/src/ui/camera.test.ts +9 -9
  239. package/src/ui/camera.ts +26 -18
  240. package/src/ui/control/attribution_control.test.ts +51 -16
  241. package/src/ui/control/attribution_control.ts +35 -16
  242. package/src/ui/control/control.ts +40 -40
  243. package/src/ui/control/fullscreen_control.ts +1 -1
  244. package/src/ui/control/geolocate_control.test.ts +1 -1
  245. package/src/ui/control/geolocate_control.ts +102 -102
  246. package/src/ui/control/logo_control.test.ts +5 -4
  247. package/src/ui/control/navigation_control.ts +3 -3
  248. package/src/ui/control/scale_control.test.ts +2 -2
  249. package/src/ui/control/scale_control.ts +5 -5
  250. package/src/ui/events.ts +289 -200
  251. package/src/ui/handler/box_zoom.test.ts +1 -1
  252. package/src/ui/handler/box_zoom.ts +1 -1
  253. package/src/ui/handler/dblclick_zoom.test.ts +1 -1
  254. package/src/ui/handler/drag_pan.test.ts +1 -1
  255. package/src/ui/handler/drag_rotate.test.ts +1 -1
  256. package/src/ui/handler/keyboard.test.ts +1 -1
  257. package/src/ui/handler/keyboard.ts +51 -51
  258. package/src/ui/handler/map_event.test.ts +1 -1
  259. package/src/ui/handler/map_event.ts +1 -1
  260. package/src/ui/handler/mouse.ts +1 -1
  261. package/src/ui/handler/mouse_rotate.test.ts +1 -1
  262. package/src/ui/handler/scroll_zoom.test.ts +3 -2
  263. package/src/ui/handler/scroll_zoom.ts +9 -9
  264. package/src/ui/handler/shim/drag_pan.ts +4 -4
  265. package/src/ui/handler/shim/drag_rotate.ts +1 -1
  266. package/src/ui/handler/shim/touch_zoom_rotate.ts +1 -1
  267. package/src/ui/handler/tap_recognizer.ts +4 -4
  268. package/src/ui/handler/touch_pan.ts +2 -2
  269. package/src/ui/handler/touch_zoom_rotate.test.ts +1 -1
  270. package/src/ui/handler/touch_zoom_rotate.ts +1 -1
  271. package/src/ui/handler_inertia.ts +6 -6
  272. package/src/ui/handler_manager.ts +44 -44
  273. package/src/ui/map/isMoving.test.ts +1 -1
  274. package/src/ui/map/isRotating.test.ts +1 -1
  275. package/src/ui/map/isZooming.test.ts +1 -1
  276. package/src/ui/map.test.ts +87 -14
  277. package/src/ui/map.ts +138 -108
  278. package/src/ui/map_events.test.ts +1 -1
  279. package/src/ui/marker.test.ts +12 -12
  280. package/src/ui/marker.ts +37 -37
  281. package/src/ui/popup.test.ts +7 -7
  282. package/src/ui/popup.ts +9 -9
  283. package/src/util/actor.test.ts +41 -10
  284. package/src/util/actor.ts +8 -8
  285. package/src/util/ajax.test.ts +214 -0
  286. package/src/util/ajax.ts +51 -30
  287. package/src/util/browser.ts +1 -1
  288. package/src/util/classify_rings.test.ts +1 -1
  289. package/src/util/color_ramp.ts +5 -5
  290. package/src/util/config.ts +2 -2
  291. package/src/util/dispatcher.ts +1 -1
  292. package/src/util/dom.ts +2 -2
  293. package/src/util/evented.ts +1 -1
  294. package/src/util/find_pole_of_inaccessibility.ts +3 -3
  295. package/src/util/image.ts +5 -5
  296. package/src/util/performance.ts +7 -7
  297. package/src/util/request_manager.ts +4 -4
  298. package/src/util/resolve_tokens.ts +4 -4
  299. package/src/util/struct_array.test.ts +1 -1
  300. package/src/util/struct_array.ts +15 -15
  301. package/src/util/task_queue.ts +3 -3
  302. package/src/util/test/util.ts +14 -0
  303. package/src/util/tile_request_cache.ts +3 -3
  304. package/src/util/transferable_grid_index.ts +4 -4
  305. package/src/util/util.ts +8 -8
  306. package/src/util/web_worker.ts +4 -68
  307. package/src/util/web_worker_transfer.test.ts +3 -0
  308. package/src/util/web_worker_transfer.ts +21 -17
  309. package/src/util/worker_pool.ts +1 -1
  310. package/build/.eslintrc +0 -21
  311. package/build/glsl_to_js.js +0 -12
  312. package/build/post-ts-build.js +0 -43
  313. package/build/release-notes.md.ejs +0 -8
  314. package/build/test/build-tape.js +0 -17
  315. package/build/web_worker_replacement.js +0 -5
  316. package/dist/package.json +0 -1
  317. package/src/style-spec/validate_spec.test.ts +0 -29
  318. package/src/symbol/shaping.test.ts +0 -392
  319. package/src/types/glsl.d.ts +0 -4
@@ -25,76 +25,76 @@ export default function validateSource(options) {
25
25
  let errors;
26
26
 
27
27
  switch (type) {
28
- case 'vector':
29
- case 'raster':
30
- case 'raster-dem':
31
- errors = validateObject({
32
- key,
33
- value,
34
- valueSpec: styleSpec[`source_${type.replace('-', '_')}`],
35
- style: options.style,
36
- styleSpec,
37
- objectElementValidators
38
- });
39
- return errors;
28
+ case 'vector':
29
+ case 'raster':
30
+ case 'raster-dem':
31
+ errors = validateObject({
32
+ key,
33
+ value,
34
+ valueSpec: styleSpec[`source_${type.replace('-', '_')}`],
35
+ style: options.style,
36
+ styleSpec,
37
+ objectElementValidators
38
+ });
39
+ return errors;
40
40
 
41
- case 'geojson':
42
- errors = validateObject({
43
- key,
44
- value,
45
- valueSpec: styleSpec.source_geojson,
46
- style,
47
- styleSpec,
48
- objectElementValidators
49
- });
50
- if (value.cluster) {
51
- for (const prop in value.clusterProperties) {
52
- const [operator, mapExpr] = value.clusterProperties[prop];
53
- const reduceExpr = typeof operator === 'string' ? [operator, ['accumulated'], ['get', prop]] : operator;
41
+ case 'geojson':
42
+ errors = validateObject({
43
+ key,
44
+ value,
45
+ valueSpec: styleSpec.source_geojson,
46
+ style,
47
+ styleSpec,
48
+ objectElementValidators
49
+ });
50
+ if (value.cluster) {
51
+ for (const prop in value.clusterProperties) {
52
+ const [operator, mapExpr] = value.clusterProperties[prop];
53
+ const reduceExpr = typeof operator === 'string' ? [operator, ['accumulated'], ['get', prop]] : operator;
54
54
 
55
- errors.push(...validateExpression({
56
- key: `${key}.${prop}.map`,
57
- value: mapExpr,
58
- expressionContext: 'cluster-map'
59
- }));
60
- errors.push(...validateExpression({
61
- key: `${key}.${prop}.reduce`,
62
- value: reduceExpr,
63
- expressionContext: 'cluster-reduce'
64
- }));
55
+ errors.push(...validateExpression({
56
+ key: `${key}.${prop}.map`,
57
+ value: mapExpr,
58
+ expressionContext: 'cluster-map'
59
+ }));
60
+ errors.push(...validateExpression({
61
+ key: `${key}.${prop}.reduce`,
62
+ value: reduceExpr,
63
+ expressionContext: 'cluster-reduce'
64
+ }));
65
+ }
65
66
  }
66
- }
67
- return errors;
67
+ return errors;
68
68
 
69
- case 'video':
70
- return validateObject({
71
- key,
72
- value,
73
- valueSpec: styleSpec.source_video,
74
- style,
75
- styleSpec
76
- });
69
+ case 'video':
70
+ return validateObject({
71
+ key,
72
+ value,
73
+ valueSpec: styleSpec.source_video,
74
+ style,
75
+ styleSpec
76
+ });
77
77
 
78
- case 'image':
79
- return validateObject({
80
- key,
81
- value,
82
- valueSpec: styleSpec.source_image,
83
- style,
84
- styleSpec
85
- });
78
+ case 'image':
79
+ return validateObject({
80
+ key,
81
+ value,
82
+ valueSpec: styleSpec.source_image,
83
+ style,
84
+ styleSpec
85
+ });
86
86
 
87
- case 'canvas':
88
- return [new ValidationError(key, null, 'Please use runtime APIs to add canvas sources, rather than including them in stylesheets.', 'source.canvas')];
87
+ case 'canvas':
88
+ return [new ValidationError(key, null, 'Please use runtime APIs to add canvas sources, rather than including them in stylesheets.', 'source.canvas')];
89
89
 
90
- default:
91
- return validateEnum({
92
- key: `${key}.type`,
93
- value: value.type,
94
- valueSpec: {values: ['vector', 'raster', 'raster-dem', 'geojson', 'video', 'image']},
95
- style,
96
- styleSpec
97
- });
90
+ default:
91
+ return validateEnum({
92
+ key: `${key}.type`,
93
+ value: value.type,
94
+ valueSpec: {values: ['vector', 'raster', 'raster-dem', 'geojson', 'video', 'image']},
95
+ style,
96
+ styleSpec
97
+ });
98
98
  }
99
99
  }
100
100
 
@@ -36,22 +36,22 @@ export function eachLayer(style: StyleSpecification, callback: (_: LayerSpecific
36
36
  }
37
37
 
38
38
  type PropertyCallback = (
39
- a: {
40
- path: [string, 'paint' | 'layout', string]; // [layerid, paint/layout, property key],
41
- key: string;
42
- value: PropertyValueSpecification<unknown> | DataDrivenPropertyValueSpecification<unknown>;
43
- reference: StylePropertySpecification;
44
- set: (
45
- a: PropertyValueSpecification<unknown> | DataDrivenPropertyValueSpecification<unknown>
46
- ) => void;
47
- }
39
+ a: {
40
+ path: [string, 'paint' | 'layout', string]; // [layerid, paint/layout, property key],
41
+ key: string;
42
+ value: PropertyValueSpecification<unknown> | DataDrivenPropertyValueSpecification<unknown>;
43
+ reference: StylePropertySpecification;
44
+ set: (
45
+ a: PropertyValueSpecification<unknown> | DataDrivenPropertyValueSpecification<unknown>
46
+ ) => void;
47
+ }
48
48
  ) => void;
49
49
 
50
50
  export function eachProperty(
51
51
  style: StyleSpecification,
52
52
  options: {
53
- paint?: boolean;
54
- layout?: boolean;
53
+ paint?: boolean;
54
+ layout?: boolean;
55
55
  },
56
56
  callback: PropertyCallback
57
57
  ) {
@@ -1,7 +1,7 @@
1
1
  import CollisionFeature from './collision_feature';
2
2
  import Anchor from './anchor';
3
3
  import Point from '@mapbox/point-geometry';
4
- import {CollisionBoxArray} from '../data/array_types';
4
+ import {CollisionBoxArray} from '../data/array_types.g';
5
5
 
6
6
  describe('CollisionFeature', () => {
7
7
 
@@ -1,4 +1,4 @@
1
- import type {CollisionBoxArray} from '../data/array_types';
1
+ import type {CollisionBoxArray} from '../data/array_types.g';
2
2
  import Point from '@mapbox/point-geometry';
3
3
  import type Anchor from './anchor';
4
4
 
@@ -27,15 +27,15 @@ class CollisionFeature {
27
27
  * @private
28
28
  */
29
29
  constructor(collisionBoxArray: CollisionBoxArray,
30
- anchor: Anchor,
31
- featureIndex: number,
32
- sourceLayerIndex: number,
33
- bucketIndex: number,
34
- shaped: any,
35
- boxScale: number,
36
- padding: number,
37
- alignLine: boolean,
38
- rotate: number) {
30
+ anchor: Anchor,
31
+ featureIndex: number,
32
+ sourceLayerIndex: number,
33
+ bucketIndex: number,
34
+ shaped: any,
35
+ boxScale: number,
36
+ padding: number,
37
+ alignLine: boolean,
38
+ rotate: number) {
39
39
 
40
40
  this.boxStartIndex = collisionBoxArray.length;
41
41
 
@@ -15,7 +15,8 @@ import type {SingleCollisionBox} from '../data/bucket/symbol_bucket';
15
15
  import type {
16
16
  GlyphOffsetArray,
17
17
  SymbolLineVertexArray
18
- } from '../data/array_types';
18
+ } from '../data/array_types.g';
19
+ import type {OverlapMode} from '../style/style_layer/symbol_style_layer';
19
20
 
20
21
  // When a symbol crosses the edge that causes it to be included in
21
22
  // collision detection, it will cause changes in the symbols around
@@ -29,6 +30,7 @@ export type FeatureKey = {
29
30
  bucketInstanceId: number;
30
31
  featureIndex: number;
31
32
  collisionGroupID: number;
33
+ overlapMode: OverlapMode;
32
34
  };
33
35
 
34
36
  /**
@@ -71,15 +73,15 @@ class CollisionIndex {
71
73
  }
72
74
 
73
75
  placeCollisionBox(
74
- collisionBox: SingleCollisionBox,
75
- allowOverlap: boolean,
76
- textPixelRatio: number,
77
- posMatrix: mat4,
78
- collisionGroupPredicate?: (key: FeatureKey) => boolean
76
+ collisionBox: SingleCollisionBox,
77
+ overlapMode: OverlapMode,
78
+ textPixelRatio: number,
79
+ posMatrix: mat4,
80
+ collisionGroupPredicate?: (key: FeatureKey) => boolean
79
81
  ): {
80
- box: Array<number>;
81
- offscreen: boolean;
82
- } {
82
+ box: Array<number>;
83
+ offscreen: boolean;
84
+ } {
83
85
  const projectedPoint = this.projectAndGetPerspectiveRatio(posMatrix, collisionBox.anchorPointX, collisionBox.anchorPointY);
84
86
  const tileToViewport = textPixelRatio * projectedPoint.perspectiveRatio;
85
87
  const tlX = collisionBox.x1 * tileToViewport + projectedPoint.point.x;
@@ -88,7 +90,7 @@ class CollisionIndex {
88
90
  const brY = collisionBox.y2 * tileToViewport + projectedPoint.point.y;
89
91
 
90
92
  if (!this.isInsideGrid(tlX, tlY, brX, brY) ||
91
- (!allowOverlap && this.grid.hitTest(tlX, tlY, brX, brY, collisionGroupPredicate))) {
93
+ (overlapMode !== 'always' && this.grid.hitTest(tlX, tlY, brX, brY, overlapMode, collisionGroupPredicate))) {
92
94
  return {
93
95
  box: [],
94
96
  offscreen: false
@@ -102,24 +104,24 @@ class CollisionIndex {
102
104
  }
103
105
 
104
106
  placeCollisionCircles(
105
- allowOverlap: boolean,
106
- symbol: any,
107
- lineVertexArray: SymbolLineVertexArray,
108
- glyphOffsetArray: GlyphOffsetArray,
109
- fontSize: number,
110
- posMatrix: mat4,
111
- labelPlaneMatrix: mat4,
112
- labelToScreenMatrix: mat4,
113
- showCollisionCircles: boolean,
114
- pitchWithMap: boolean,
115
- collisionGroupPredicate: (key: FeatureKey) => boolean,
116
- circlePixelDiameter: number,
117
- textPixelPadding: number
107
+ overlapMode: OverlapMode,
108
+ symbol: any,
109
+ lineVertexArray: SymbolLineVertexArray,
110
+ glyphOffsetArray: GlyphOffsetArray,
111
+ fontSize: number,
112
+ posMatrix: mat4,
113
+ labelPlaneMatrix: mat4,
114
+ labelToScreenMatrix: mat4,
115
+ showCollisionCircles: boolean,
116
+ pitchWithMap: boolean,
117
+ collisionGroupPredicate: (key: FeatureKey) => boolean,
118
+ circlePixelDiameter: number,
119
+ textPixelPadding: number
118
120
  ): {
119
- circles: Array<number>;
120
- offscreen: boolean;
121
- collisionDetected: boolean;
122
- } {
121
+ circles: Array<number>;
122
+ offscreen: boolean;
123
+ collisionDetected: boolean;
124
+ } {
123
125
  const placedCollisionCircles = [];
124
126
 
125
127
  const tileUnitAnchorPoint = new Point(symbol.anchorX, symbol.anchorY);
@@ -245,18 +247,16 @@ class CollisionIndex {
245
247
  entirelyOffscreen = entirelyOffscreen && this.isOffscreen(x1, y1, x2, y2);
246
248
  inGrid = inGrid || this.isInsideGrid(x1, y1, x2, y2);
247
249
 
248
- if (!allowOverlap) {
249
- if (this.grid.hitTestCircle(centerX, centerY, radius, collisionGroupPredicate)) {
250
- // Don't early exit if we're showing the debug circles because we still want to calculate
251
- // which circles are in use
252
- collisionDetected = true;
253
- if (!showCollisionCircles) {
254
- return {
255
- circles: [],
256
- offscreen: false,
257
- collisionDetected
258
- };
259
- }
250
+ if (overlapMode !== 'always' && this.grid.hitTestCircle(centerX, centerY, radius, overlapMode, collisionGroupPredicate)) {
251
+ // Don't early exit if we're showing the debug circles because we still want to calculate
252
+ // which circles are in use
253
+ collisionDetected = true;
254
+ if (!showCollisionCircles) {
255
+ return {
256
+ circles: [],
257
+ offscreen: false,
258
+ collisionDetected
259
+ };
260
260
  }
261
261
  }
262
262
  }
@@ -337,17 +337,17 @@ class CollisionIndex {
337
337
  return result;
338
338
  }
339
339
 
340
- insertCollisionBox(collisionBox: Array<number>, ignorePlacement: boolean, bucketInstanceId: number, featureIndex: number, collisionGroupID: number) {
340
+ insertCollisionBox(collisionBox: Array<number>, overlapMode: OverlapMode, ignorePlacement: boolean, bucketInstanceId: number, featureIndex: number, collisionGroupID: number) {
341
341
  const grid = ignorePlacement ? this.ignoredGrid : this.grid;
342
342
 
343
- const key = {bucketInstanceId, featureIndex, collisionGroupID};
343
+ const key = {bucketInstanceId, featureIndex, collisionGroupID, overlapMode};
344
344
  grid.insert(key, collisionBox[0], collisionBox[1], collisionBox[2], collisionBox[3]);
345
345
  }
346
346
 
347
- insertCollisionCircles(collisionCircles: Array<number>, ignorePlacement: boolean, bucketInstanceId: number, featureIndex: number, collisionGroupID: number) {
347
+ insertCollisionCircles(collisionCircles: Array<number>, overlapMode: OverlapMode, ignorePlacement: boolean, bucketInstanceId: number, featureIndex: number, collisionGroupID: number) {
348
348
  const grid = ignorePlacement ? this.ignoredGrid : this.grid;
349
349
 
350
- const key = {bucketInstanceId, featureIndex, collisionGroupID};
350
+ const key = {bucketInstanceId, featureIndex, collisionGroupID, overlapMode};
351
351
  for (let k = 0; k < collisionCircles.length; k += 4) {
352
352
  grid.insertCircle(key, collisionCircles[k], collisionCircles[k + 1], collisionCircles[k + 2]);
353
353
  }
@@ -1,8 +1,8 @@
1
1
  import EXTENT from '../data/extent';
2
2
 
3
- import {SymbolInstanceArray} from '../data/array_types';
3
+ import {SymbolInstanceArray} from '../data/array_types.g';
4
4
 
5
- import type {SymbolInstance} from '../data/array_types';
5
+ import type {SymbolInstance} from '../data/array_types.g';
6
6
  import type {OverscaledTileID} from '../source/tile_id';
7
7
  import type SymbolBucket from '../data/bucket/symbol_bucket';
8
8
  import type StyleLayer from '../style/style_layer';
@@ -28,13 +28,13 @@ const roundingFactor = 512 / EXTENT / 2;
28
28
  class TileLayerIndex {
29
29
  tileID: OverscaledTileID;
30
30
  indexedSymbolInstances: {
31
- [_: number]: Array<{
32
- crossTileID: number;
33
- coord: {
34
- x: number;
35
- y: number;
36
- };
37
- }>;
31
+ [_: number]: Array<{
32
+ crossTileID: number;
33
+ coord: {
34
+ x: number;
35
+ y: number;
36
+ };
37
+ }>;
38
38
  };
39
39
  bucketInstanceId: number;
40
40
 
@@ -74,7 +74,7 @@ class TileLayerIndex {
74
74
  }
75
75
 
76
76
  findMatches(symbolInstances: SymbolInstanceArray, newTileID: OverscaledTileID, zoomCrossTileIDs: {
77
- [crossTileID: number]: boolean;
77
+ [crossTileID: number]: boolean;
78
78
  }) {
79
79
  const tolerance = this.tileID.canonical.z < newTileID.canonical.z ? 1 : Math.pow(2, this.tileID.canonical.z - newTileID.canonical.z);
80
80
 
@@ -123,14 +123,14 @@ class CrossTileIDs {
123
123
 
124
124
  class CrossTileSymbolLayerIndex {
125
125
  indexes: {
126
- [zoom in string | number]: {
127
- [tileId in string | number]: TileLayerIndex;
128
- };
126
+ [zoom in string | number]: {
127
+ [tileId in string | number]: TileLayerIndex;
128
+ };
129
129
  };
130
130
  usedCrossTileIDs: {
131
- [zoom in string | number]: {
132
- [crossTileID: number]: boolean;
133
- };
131
+ [zoom in string | number]: {
132
+ [crossTileID: number]: boolean;
133
+ };
134
134
  };
135
135
  lng: number;
136
136
 
@@ -234,7 +234,7 @@ class CrossTileSymbolLayerIndex {
234
234
  }
235
235
 
236
236
  removeStaleBuckets(currentIDs: {
237
- [k in string | number]: boolean;
237
+ [k in string | number]: boolean;
238
238
  }) {
239
239
  let tilesChanged = false;
240
240
  for (const z in this.indexes) {
@@ -17,9 +17,9 @@ function getLineLength(line: Array<Point>): number {
17
17
  }
18
18
 
19
19
  function getAngleWindowSize(
20
- shapedText: Shaping,
21
- glyphSize: number,
22
- boxScale: number
20
+ shapedText: Shaping,
21
+ glyphSize: number,
22
+ boxScale: number
23
23
  ): number {
24
24
  return shapedText ?
25
25
  3 / 5 * glyphSize * boxScale :
@@ -33,11 +33,11 @@ function getShapedLabelLength(shapedText?: Shaping | null, shapedIcon?: Position
33
33
  }
34
34
 
35
35
  function getCenterAnchor(line: Array<Point>,
36
- maxAngle: number,
37
- shapedText: Shaping,
38
- shapedIcon: PositionedIcon,
39
- glyphSize: number,
40
- boxScale: number) {
36
+ maxAngle: number,
37
+ shapedText: Shaping,
38
+ shapedIcon: PositionedIcon,
39
+ glyphSize: number,
40
+ boxScale: number) {
41
41
  const angleWindowSize = getAngleWindowSize(shapedText, glyphSize, boxScale);
42
42
  const labelLength = getShapedLabelLength(shapedText, shapedIcon) * boxScale;
43
43
 
@@ -71,14 +71,14 @@ function getCenterAnchor(line: Array<Point>,
71
71
  }
72
72
 
73
73
  function getAnchors(line: Array<Point>,
74
- spacing: number,
75
- maxAngle: number,
76
- shapedText: Shaping,
77
- shapedIcon: PositionedIcon,
78
- glyphSize: number,
79
- boxScale: number,
80
- overscaling: number,
81
- tileExtent: number) {
74
+ spacing: number,
75
+ maxAngle: number,
76
+ shapedText: Shaping,
77
+ shapedIcon: PositionedIcon,
78
+ glyphSize: number,
79
+ boxScale: number,
80
+ overscaling: number,
81
+ tileExtent: number) {
82
82
 
83
83
  // Resample a line to get anchor points for labels and check that each
84
84
  // potential label passes text-max-angle check and has enough froom to fit
@@ -1,12 +1,13 @@
1
1
  import GridIndex from './grid_index';
2
+ import type {GridKey} from './grid_index';
2
3
 
3
4
  describe('GridIndex', () => {
4
5
 
5
6
  test('indexes features', () => {
6
- const grid = new GridIndex<number>(100, 100, 10);
7
- grid.insert(0, 4, 10, 6, 30);
8
- grid.insert(1, 4, 10, 30, 12);
9
- grid.insert(2, -10, 30, 5, 35);
7
+ const grid = new GridIndex(100, 100, 10);
8
+ grid.insert(0 as GridKey, 4, 10, 6, 30);
9
+ grid.insert(1 as GridKey, 4, 10, 30, 12);
10
+ grid.insert(2 as GridKey, -10, 30, 5, 35);
10
11
 
11
12
  expect(grid.query(4, 10, 5, 11).map(x => x.key).sort()).toEqual([0, 1]);
12
13
  expect(grid.query(24, 10, 25, 11).map(x => x.key).sort()).toEqual([1]);
@@ -18,8 +19,8 @@ describe('GridIndex', () => {
18
19
  });
19
20
 
20
21
  test('returns multiple copies of a key if multiple boxes were inserted with the same key', () => {
21
- const grid = new GridIndex<number>(100, 100, 10);
22
- const key = 123;
22
+ const grid = new GridIndex(100, 100, 10);
23
+ const key = 123 as GridKey;
23
24
  grid.insert(key, 3, 3, 4, 4);
24
25
  grid.insert(key, 13, 13, 14, 14);
25
26
  grid.insert(key, 23, 23, 24, 24);
@@ -27,26 +28,48 @@ describe('GridIndex', () => {
27
28
  });
28
29
 
29
30
  test('circle-circle intersection', () => {
30
- const grid = new GridIndex<number>(100, 100, 10);
31
- grid.insertCircle(0, 50, 50, 10);
32
- grid.insertCircle(1, 60, 60, 15);
33
- grid.insertCircle(2, -10, 110, 20);
34
-
35
- expect(grid.hitTestCircle(55, 55, 2)).toBeTruthy();
36
- expect(grid.hitTestCircle(10, 10, 10)).toBeFalsy();
37
- expect(grid.hitTestCircle(0, 100, 10)).toBeTruthy();
38
- expect(grid.hitTestCircle(80, 60, 10)).toBeTruthy();
31
+ const grid = new GridIndex(100, 100, 10);
32
+ grid.insertCircle(0 as GridKey, 50, 50, 10);
33
+ grid.insertCircle(1 as GridKey, 60, 60, 15);
34
+ grid.insertCircle(2 as GridKey, -10, 110, 20);
35
+
36
+ expect(grid.hitTestCircle(55, 55, 2, 'never')).toBeTruthy();
37
+ expect(grid.hitTestCircle(10, 10, 10, 'never')).toBeFalsy();
38
+ expect(grid.hitTestCircle(0, 100, 10, 'never')).toBeTruthy();
39
+ expect(grid.hitTestCircle(80, 60, 10, 'never')).toBeTruthy();
39
40
  });
40
41
 
41
42
  test('circle-rectangle intersection', () => {
42
- const grid = new GridIndex<number>(100, 100, 10);
43
- grid.insertCircle(0, 50, 50, 10);
44
- grid.insertCircle(1, 60, 60, 15);
45
- grid.insertCircle(2, -10, 110, 20);
43
+ const grid = new GridIndex(100, 100, 10);
44
+ grid.insertCircle(0 as GridKey, 50, 50, 10);
45
+ grid.insertCircle(1 as GridKey, 60, 60, 15);
46
+ grid.insertCircle(2 as GridKey, -10, 110, 20);
46
47
 
47
48
  expect(grid.query(45, 45, 55, 55).map(x => x.key)).toEqual([0, 1]);
48
49
  expect(grid.query(0, 0, 30, 30).map(x => x.key)).toEqual([]);
49
50
  expect(grid.query(0, 80, 20, 100).map(x => x.key)).toEqual([2]);
50
51
  });
51
52
 
53
+ test('overlap mode', () => {
54
+ const grid = new GridIndex(100, 100, 10);
55
+ grid.insert({overlapMode: 'never'}, 10, 10, 20, 20);
56
+ grid.insert({overlapMode: 'always'}, 30, 10, 40, 20);
57
+ grid.insert({overlapMode: 'cooperative'}, 50, 10, 60, 20);
58
+
59
+ // 'never' can't overlap anything
60
+ expect(grid.hitTest(15, 15, 25, 25, 'never')).toBeTruthy();
61
+ expect(grid.hitTest(35, 15, 45, 25, 'never')).toBeTruthy();
62
+ expect(grid.hitTest(55, 15, 65, 25, 'never')).toBeTruthy();
63
+
64
+ // 'always' can overlap everything
65
+ expect(grid.hitTest(15, 15, 25, 25, 'always')).toBeFalsy();
66
+ expect(grid.hitTest(35, 15, 45, 25, 'always')).toBeFalsy();
67
+ expect(grid.hitTest(55, 15, 65, 25, 'always')).toBeFalsy();
68
+
69
+ // 'cooperative' can overlap 'always' and 'cooperative'
70
+ expect(grid.hitTest(15, 15, 25, 25, 'cooperative')).toBeTruthy();
71
+ expect(grid.hitTest(35, 15, 45, 25, 'cooperative')).toBeFalsy();
72
+ expect(grid.hitTest(55, 15, 65, 25, 'cooperative')).toBeFalsy();
73
+ });
74
+
52
75
  });