maplibre-gl 2.0.5 → 2.1.3

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 (318) 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 +1574 -1022
  15. package/dist/maplibre-gl.js +3 -3
  16. package/dist/maplibre-gl.js.map +1 -1
  17. package/package.json +94 -131
  18. package/src/css/maplibre-gl.css +49 -49
  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 +2 -2
  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 +18 -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 +136 -106
  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 +29 -21
  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/tile_request_cache.ts +3 -3
  303. package/src/util/transferable_grid_index.ts +4 -4
  304. package/src/util/util.ts +8 -8
  305. package/src/util/web_worker.ts +4 -68
  306. package/src/util/web_worker_transfer.test.ts +3 -0
  307. package/src/util/web_worker_transfer.ts +21 -17
  308. package/src/util/worker_pool.ts +1 -1
  309. package/build/.eslintrc +0 -21
  310. package/build/glsl_to_js.js +0 -12
  311. package/build/post-ts-build.js +0 -43
  312. package/build/release-notes.md.ejs +0 -8
  313. package/build/test/build-tape.js +0 -17
  314. package/build/web_worker_replacement.js +0 -5
  315. package/dist/package.json +0 -1
  316. package/src/style-spec/validate_spec.test.ts +0 -29
  317. package/src/symbol/shaping.test.ts +0 -392
  318. package/src/types/glsl.d.ts +0 -4
@@ -1,5 +1,8 @@
1
+ import type {OverlapMode} from '../style/style_layer/symbol_style_layer';
2
+
1
3
  type QueryArgs = {
2
4
  hitTest: boolean;
5
+ overlapMode?: OverlapMode;
3
6
  circle?: {
4
7
  x: number;
5
8
  y: number;
@@ -23,6 +26,24 @@ type QueryResult<T> = {
23
26
  y2: number;
24
27
  };
25
28
 
29
+ export type GridKey = {
30
+ overlapMode?: OverlapMode;
31
+ }
32
+
33
+ function overlapAllowed(overlapA: OverlapMode, overlapB: OverlapMode): boolean {
34
+ let allowed = true;
35
+
36
+ if (overlapA === 'always') {
37
+ // symbol A using 'always' overlap - allowed to overlap anything.
38
+ } else if (overlapA === 'never' || overlapB === 'never') {
39
+ // symbol A using 'never' overlap - can't overlap anything
40
+ // symbol A using 'cooperative' overlap - can overlap 'always' or 'cooperative' symbol; can't overlap 'never'
41
+ allowed = false;
42
+ }
43
+
44
+ return allowed;
45
+ }
46
+
26
47
  /**
27
48
  * GridIndex is a data structure for testing the intersection of
28
49
  * circles and rectangles in a 2d plane.
@@ -36,7 +57,7 @@ type QueryResult<T> = {
36
57
  *
37
58
  * @private
38
59
  */
39
- class GridIndex<T> {
60
+ class GridIndex<T extends GridKey> {
40
61
  circleKeys: Array<T>;
41
62
  boxKeys: Array<T>;
42
63
  boxCells: Array<Array<number>>;
@@ -110,7 +131,7 @@ class GridIndex<T> {
110
131
  this.circleCells[cellIndex].push(uid);
111
132
  }
112
133
 
113
- private _query(x1: number, y1: number, x2: number, y2: number, hitTest: boolean, predicate?: (key: T) => boolean): Array<QueryResult<T>> {
134
+ private _query(x1: number, y1: number, x2: number, y2: number, hitTest: boolean, overlapMode: OverlapMode, predicate?: (key: T) => boolean): Array<QueryResult<T>> {
114
135
  if (x2 < 0 || x1 > this.width || y2 < 0 || y1 > this.height) {
115
136
  return [];
116
137
  }
@@ -150,6 +171,7 @@ class GridIndex<T> {
150
171
  } else {
151
172
  const queryArgs: QueryArgs = {
152
173
  hitTest,
174
+ overlapMode,
153
175
  seenUids: {box: {}, circle: {}}
154
176
  };
155
177
  this._forEachCell(x1, y1, x2, y2, this._queryCell, result, queryArgs, predicate);
@@ -162,11 +184,11 @@ class GridIndex<T> {
162
184
  return this._query(x1, y1, x2, y2, false, null);
163
185
  }
164
186
 
165
- hitTest(x1: number, y1: number, x2: number, y2: number, predicate?: (key: T) => boolean): boolean {
166
- return this._query(x1, y1, x2, y2, true, predicate).length > 0;
187
+ hitTest(x1: number, y1: number, x2: number, y2: number, overlapMode: OverlapMode, predicate?: (key: T) => boolean): boolean {
188
+ return this._query(x1, y1, x2, y2, true, overlapMode, predicate).length > 0;
167
189
  }
168
190
 
169
- hitTestCircle(x: number, y: number, radius: number, predicate?: (key: T) => boolean): boolean {
191
+ hitTestCircle(x: number, y: number, radius: number, overlapMode: OverlapMode, predicate?: (key: T) => boolean): boolean {
170
192
  // Insert circle into grid for all cells in the circumscribing square
171
193
  // It's more than necessary (by a factor of 4/PI), but fast to insert
172
194
  const x1 = x - radius;
@@ -183,6 +205,7 @@ class GridIndex<T> {
183
205
  const result: boolean[] = [];
184
206
  const queryArgs: QueryArgs = {
185
207
  hitTest: true,
208
+ overlapMode,
186
209
  circle: {x, y, radius},
187
210
  seenUids: {box: {}, circle: {}}
188
211
  };
@@ -191,7 +214,7 @@ class GridIndex<T> {
191
214
  }
192
215
 
193
216
  private _queryCell(x1: number, y1: number, x2: number, y2: number, cellIndex: number, result: Array<QueryResult<T>>, queryArgs: QueryArgs, predicate?: (key: T) => boolean): boolean {
194
- const {seenUids, hitTest} = queryArgs;
217
+ const {seenUids, hitTest, overlapMode} = queryArgs;
195
218
  const boxCell = this.boxCells[cellIndex];
196
219
 
197
220
  if (boxCell !== null) {
@@ -207,16 +230,18 @@ class GridIndex<T> {
207
230
  (x2 >= bboxes[offset + 0]) &&
208
231
  (y2 >= bboxes[offset + 1]) &&
209
232
  (!predicate || predicate(key))) {
210
- result.push({
211
- key,
212
- x1: bboxes[offset],
213
- y1: bboxes[offset + 1],
214
- x2: bboxes[offset + 2],
215
- y2: bboxes[offset + 3]
216
- });
217
- if (hitTest) {
218
- // true return value stops the query after first match
219
- return true;
233
+ if (!hitTest || !overlapAllowed(overlapMode, key.overlapMode)) {
234
+ result.push({
235
+ key,
236
+ x1: bboxes[offset],
237
+ y1: bboxes[offset + 1],
238
+ x2: bboxes[offset + 2],
239
+ y2: bboxes[offset + 3]
240
+ });
241
+ if (hitTest) {
242
+ // true return value stops the query after first match
243
+ return true;
244
+ }
220
245
  }
221
246
  }
222
247
  }
@@ -240,19 +265,21 @@ class GridIndex<T> {
240
265
  x2,
241
266
  y2) &&
242
267
  (!predicate || predicate(key))) {
243
- const x = circles[offset];
244
- const y = circles[offset + 1];
245
- const radius = circles[offset + 2];
246
- result.push({
247
- key,
248
- x1: x - radius,
249
- y1: y - radius,
250
- x2: x + radius,
251
- y2: y + radius
252
- });
253
- if (hitTest) {
254
- // true return value stops the query after first match
255
- return true;
268
+ if (!hitTest || !overlapAllowed(overlapMode, key.overlapMode)) {
269
+ const x = circles[offset];
270
+ const y = circles[offset + 1];
271
+ const radius = circles[offset + 2];
272
+ result.push({
273
+ key,
274
+ x1: x - radius,
275
+ y1: y - radius,
276
+ x2: x + radius,
277
+ y2: y + radius
278
+ });
279
+ if (hitTest) {
280
+ // true return value stops the query after first match
281
+ return true;
282
+ }
256
283
  }
257
284
  }
258
285
  }
@@ -263,8 +290,8 @@ class GridIndex<T> {
263
290
  return false;
264
291
  }
265
292
 
266
- private _queryCellCircle(x1: number, y1: number, x2: number, y2: number, cellIndex: number, result: Array<boolean>, queryArgs: QueryArgs, predicate?: (key:T) => boolean): boolean {
267
- const {circle, seenUids} = queryArgs;
293
+ private _queryCellCircle(x1: number, y1: number, x2: number, y2: number, cellIndex: number, result: Array<boolean>, queryArgs: QueryArgs, predicate?: (key: T) => boolean): boolean {
294
+ const {circle, seenUids, overlapMode} = queryArgs;
268
295
  const boxCell = this.boxCells[cellIndex];
269
296
 
270
297
  if (boxCell !== null) {
@@ -282,7 +309,8 @@ class GridIndex<T> {
282
309
  bboxes[offset + 1],
283
310
  bboxes[offset + 2],
284
311
  bboxes[offset + 3]) &&
285
- (!predicate || predicate(key))) {
312
+ (!predicate || predicate(key)) &&
313
+ !overlapAllowed(overlapMode, key.overlapMode)) {
286
314
  result.push(true);
287
315
  return true;
288
316
  }
@@ -305,7 +333,8 @@ class GridIndex<T> {
305
333
  circle.x,
306
334
  circle.y,
307
335
  circle.radius) &&
308
- (!predicate || predicate(key))) {
336
+ (!predicate || predicate(key)) &&
337
+ !overlapAllowed(overlapMode, key.overlapMode)) {
309
338
  result.push(true);
310
339
  return true;
311
340
  }
@@ -352,13 +381,13 @@ class GridIndex<T> {
352
381
  }
353
382
 
354
383
  private _circleAndRectCollide(
355
- circleX: number,
356
- circleY: number,
357
- radius: number,
358
- x1: number,
359
- y1: number,
360
- x2: number,
361
- y2: number
384
+ circleX: number,
385
+ circleY: number,
386
+ radius: number,
387
+ x1: number,
388
+ y1: number,
389
+ x2: number,
390
+ y2: number
362
391
  ): boolean {
363
392
  const halfRectWidth = (x2 - x1) / 2;
364
393
  const distX = Math.abs(circleX - (x1 + halfRectWidth));
@@ -1,4 +1,5 @@
1
1
  import CollisionIndex from './collision_index';
2
+ import type {FeatureKey} from './collision_index';
2
3
  import EXTENT from '../data/extent';
3
4
  import * as symbolSize from './symbol_size';
4
5
  import * as projection from './projection';
@@ -11,12 +12,13 @@ import Point from '@mapbox/point-geometry';
11
12
  import type Transform from '../geo/transform';
12
13
  import type StyleLayer from '../style/style_layer';
13
14
  import {PossiblyEvaluated} from '../style/properties';
14
- import type {SymbolLayoutProps, SymbolLayoutPropsPossiblyEvaluated} from '../style/style_layer/symbol_style_layer_properties';
15
+ import type {SymbolLayoutProps, SymbolLayoutPropsPossiblyEvaluated} from '../style/style_layer/symbol_style_layer_properties.g';
16
+ import {getOverlapMode, OverlapMode} from '../style/style_layer/symbol_style_layer';
15
17
 
16
18
  import type Tile from '../source/tile';
17
19
  import SymbolBucket, {CollisionArrays, SingleCollisionBox} from '../data/bucket/symbol_bucket';
18
20
 
19
- import type {CollisionBoxArray, CollisionVertexArray, SymbolInstance} from '../data/array_types';
21
+ import type {CollisionBoxArray, CollisionVertexArray, SymbolInstance} from '../data/array_types.g';
20
22
  import type FeatureIndex from '../data/feature_index';
21
23
  import type {OverscaledTileID} from '../source/tile_id';
22
24
  import type {TextAnchor} from './symbol_layout';
@@ -85,10 +87,10 @@ export class RetainedQueryData {
85
87
  tileID: OverscaledTileID;
86
88
  featureSortOrder: Array<number>;
87
89
  constructor(bucketInstanceId: number,
88
- featureIndex: FeatureIndex,
89
- sourceLayerIndex: number,
90
- bucketIndex: number,
91
- tileID: OverscaledTileID) {
90
+ featureIndex: FeatureIndex,
91
+ sourceLayerIndex: number,
92
+ bucketIndex: number,
93
+ tileID: OverscaledTileID) {
92
94
  this.bucketInstanceId = bucketInstanceId;
93
95
  this.featureIndex = featureIndex;
94
96
  this.sourceLayerIndex = sourceLayerIndex;
@@ -98,8 +100,8 @@ export class RetainedQueryData {
98
100
  }
99
101
 
100
102
  type CollisionGroup = {
101
- ID: number;
102
- predicate?: any;
103
+ ID: number;
104
+ predicate?: (key: FeatureKey) => boolean;
103
105
  };
104
106
 
105
107
  class CollisionGroups {
@@ -135,11 +137,11 @@ class CollisionGroups {
135
137
  }
136
138
 
137
139
  function calculateVariableLayoutShift(
138
- anchor: TextAnchor,
139
- width: number,
140
- height: number,
141
- textOffset: [number, number],
142
- textBoxScale: number
140
+ anchor: TextAnchor,
141
+ width: number,
142
+ height: number,
143
+ textOffset: [number, number],
144
+ textBoxScale: number
143
145
  ): Point {
144
146
  const {horizontalAlign, verticalAlign} = getAnchorAlignment(anchor);
145
147
  const shiftX = -(horizontalAlign - 0.5) * width;
@@ -152,9 +154,9 @@ function calculateVariableLayoutShift(
152
154
  }
153
155
 
154
156
  function shiftVariableCollisionBox(collisionBox: SingleCollisionBox,
155
- shiftX: number, shiftY: number,
156
- rotateWithMap: boolean, pitchWithMap: boolean,
157
- angle: number) {
157
+ shiftX: number, shiftY: number,
158
+ rotateWithMap: boolean, pitchWithMap: boolean,
159
+ angle: number) {
158
160
  const {x1, x2, y1, y2, anchorPointX, anchorPointY} = collisionBox;
159
161
  const rotatedOffset = new Point(shiftX, shiftY);
160
162
  if (rotateWithMap) {
@@ -210,16 +212,16 @@ export class Placement {
210
212
  transform: Transform;
211
213
  collisionIndex: CollisionIndex;
212
214
  placements: {
213
- [_ in CrossTileID]: JointPlacement;
215
+ [_ in CrossTileID]: JointPlacement;
214
216
  };
215
217
  opacities: {
216
- [_ in CrossTileID]: JointOpacityState;
218
+ [_ in CrossTileID]: JointOpacityState;
217
219
  };
218
220
  variableOffsets: {
219
- [_ in CrossTileID]: VariableOffset;
221
+ [_ in CrossTileID]: VariableOffset;
220
222
  };
221
223
  placedOrientations: {
222
- [_ in CrossTileID]: number;
224
+ [_ in CrossTileID]: number;
223
225
  };
224
226
  commitTime: number;
225
227
  prevZoomAdjustment: number;
@@ -227,13 +229,13 @@ export class Placement {
227
229
  stale: boolean;
228
230
  fadeDuration: number;
229
231
  retainedQueryData: {
230
- [_: number]: RetainedQueryData;
232
+ [_: number]: RetainedQueryData;
231
233
  };
232
234
  collisionGroups: CollisionGroups;
233
235
  prevPlacement: Placement;
234
236
  zoomAtLastRecencyCheck: number;
235
237
  collisionCircleArrays: {
236
- [k in any]: CollisionCircleArray;
238
+ [k in any]: CollisionCircleArray;
237
239
  };
238
240
 
239
241
  constructor(transform: Transform, fadeDuration: number, crossSourceCollisions: boolean, prevPlacement?: Placement) {
@@ -277,10 +279,10 @@ export class Placement {
277
279
  const pixelsToTiles = pixelsToTileUnits(tile, 1, this.transform.zoom);
278
280
 
279
281
  const textLabelPlaneMatrix = projection.getLabelPlaneMatrix(posMatrix,
280
- pitchWithMap,
281
- rotateWithMap,
282
- this.transform,
283
- pixelsToTiles);
282
+ pitchWithMap,
283
+ rotateWithMap,
284
+ this.transform,
285
+ pixelsToTiles);
284
286
 
285
287
  let labelToScreenMatrix = null;
286
288
 
@@ -334,28 +336,28 @@ export class Placement {
334
336
  }
335
337
 
336
338
  attemptAnchorPlacement(
337
- anchor: TextAnchor,
338
- textBox: SingleCollisionBox,
339
- width: number,
340
- height: number,
341
- textBoxScale: number,
342
- rotateWithMap: boolean,
343
- pitchWithMap: boolean,
344
- textPixelRatio: number,
345
- posMatrix: mat4,
346
- collisionGroup: CollisionGroup,
347
- textAllowOverlap: boolean,
348
- symbolInstance: SymbolInstance,
349
- bucket: SymbolBucket,
350
- orientation: number,
351
- iconBox?: SingleCollisionBox | null
339
+ anchor: TextAnchor,
340
+ textBox: SingleCollisionBox,
341
+ width: number,
342
+ height: number,
343
+ textBoxScale: number,
344
+ rotateWithMap: boolean,
345
+ pitchWithMap: boolean,
346
+ textPixelRatio: number,
347
+ posMatrix: mat4,
348
+ collisionGroup: CollisionGroup,
349
+ textOverlapMode: OverlapMode,
350
+ symbolInstance: SymbolInstance,
351
+ bucket: SymbolBucket,
352
+ orientation: number,
353
+ iconBox?: SingleCollisionBox | null
352
354
  ): {
353
- shift: Point;
354
- placedGlyphBoxes: {
355
- box: Array<number>;
356
- offscreen: boolean;
357
- };
358
- } {
355
+ shift: Point;
356
+ placedGlyphBoxes: {
357
+ box: Array<number>;
358
+ offscreen: boolean;
359
+ };
360
+ } {
359
361
 
360
362
  const textOffset = [symbolInstance.textOffset0, symbolInstance.textOffset1] as [number, number];
361
363
  const shift = calculateVariableLayoutShift(anchor, width, height, textOffset, textBoxScale);
@@ -364,14 +366,14 @@ export class Placement {
364
366
  shiftVariableCollisionBox(
365
367
  textBox, shift.x, shift.y,
366
368
  rotateWithMap, pitchWithMap, this.transform.angle),
367
- textAllowOverlap, textPixelRatio, posMatrix, collisionGroup.predicate);
369
+ textOverlapMode, textPixelRatio, posMatrix, collisionGroup.predicate);
368
370
 
369
371
  if (iconBox) {
370
372
  const placedIconBoxes = this.collisionIndex.placeCollisionBox(
371
373
  shiftVariableCollisionBox(
372
374
  iconBox, shift.x, shift.y,
373
375
  rotateWithMap, pitchWithMap, this.transform.angle),
374
- textAllowOverlap, textPixelRatio, posMatrix, collisionGroup.predicate);
376
+ textOverlapMode, textPixelRatio, posMatrix, collisionGroup.predicate);
375
377
  if (placedIconBoxes.box.length === 0) return;
376
378
  }
377
379
 
@@ -406,7 +408,7 @@ export class Placement {
406
408
  }
407
409
 
408
410
  placeLayerBucketPart(bucketPart: BucketPart, seenCrossTileIDs: {
409
- [k in string | number]: boolean;
411
+ [k in string | number]: boolean;
410
412
  }, showCollisionBoxes: boolean) {
411
413
 
412
414
  const {
@@ -424,8 +426,10 @@ export class Placement {
424
426
 
425
427
  const textOptional = layout.get('text-optional');
426
428
  const iconOptional = layout.get('icon-optional');
427
- const textAllowOverlap = layout.get('text-allow-overlap');
428
- const iconAllowOverlap = layout.get('icon-allow-overlap');
429
+ const textOverlapMode = getOverlapMode(layout, 'text-overlap', 'text-allow-overlap');
430
+ const textAlwaysOverlap = textOverlapMode === 'always';
431
+ const iconOverlapMode = getOverlapMode(layout, 'icon-overlap', 'icon-allow-overlap');
432
+ const iconAlwaysOverlap = iconOverlapMode === 'always';
429
433
  const rotateWithMap = layout.get('text-rotation-alignment') === 'map';
430
434
  const pitchWithMap = layout.get('text-pitch-alignment') === 'map';
431
435
  const hasIconTextFit = layout.get('icon-text-fit') !== 'none';
@@ -445,8 +449,8 @@ export class Placement {
445
449
  // This is the reverse of our normal policy of "fade in on pan", but should look like any other
446
450
  // collision and hopefully not be too noticeable.
447
451
  // See https://github.com/mapbox/mapbox-gl-js/issues/7172
448
- const alwaysShowText = textAllowOverlap && (iconAllowOverlap || !bucket.hasIconData() || iconOptional);
449
- const alwaysShowIcon = iconAllowOverlap && (textAllowOverlap || !bucket.hasTextData() || textOptional);
452
+ const alwaysShowText = textAlwaysOverlap && (iconAlwaysOverlap || !bucket.hasIconData() || iconOptional);
453
+ const alwaysShowIcon = iconAlwaysOverlap && (textAlwaysOverlap || !bucket.hasTextData() || textOptional);
450
454
 
451
455
  if (!bucket.collisionArrays && collisionBoxArray) {
452
456
  bucket.deserializeCollisionBoxes(collisionBoxArray);
@@ -519,8 +523,12 @@ export class Placement {
519
523
 
520
524
  if (!layout.get('text-variable-anchor')) {
521
525
  const placeBox = (collisionTextBox, orientation) => {
522
- const placedFeature = this.collisionIndex.placeCollisionBox(collisionTextBox, textAllowOverlap,
523
- textPixelRatio, posMatrix, collisionGroup.predicate);
526
+ const placedFeature = this.collisionIndex.placeCollisionBox(
527
+ collisionTextBox,
528
+ textOverlapMode,
529
+ textPixelRatio,
530
+ posMatrix,
531
+ collisionGroup.predicate);
524
532
  if (placedFeature && placedFeature.box && placedFeature.box.length) {
525
533
  this.markUsedOrientation(bucket, orientation, symbolInstance);
526
534
  this.placedOrientations[symbolInstance.crossTileID] = orientation;
@@ -562,20 +570,20 @@ export class Placement {
562
570
  const height = collisionTextBox.y2 - collisionTextBox.y1;
563
571
  const textBoxScale = symbolInstance.textBoxScale;
564
572
 
565
- const variableIconBox = hasIconTextFit && !iconAllowOverlap ? collisionIconBox : null;
573
+ const variableIconBox = hasIconTextFit && (iconOverlapMode === 'never') ? collisionIconBox : null;
566
574
 
567
575
  let placedBox: {
568
- box: Array<number>;
569
- offscreen: boolean;
576
+ box: Array<number>;
577
+ offscreen: boolean;
570
578
  } = {box: [], offscreen: false};
571
- const placementAttempts = textAllowOverlap ? anchors.length * 2 : anchors.length;
579
+ const placementAttempts = (textOverlapMode !== 'never') ? anchors.length * 2 : anchors.length;
572
580
  for (let i = 0; i < placementAttempts; ++i) {
573
581
  const anchor = anchors[i % anchors.length];
574
- const allowOverlap = (i >= anchors.length);
582
+ const overlapMode = (i >= anchors.length) ? textOverlapMode : 'never';
575
583
  const result = this.attemptAnchorPlacement(
576
584
  anchor, collisionTextBox, width, height,
577
585
  textBoxScale, rotateWithMap, pitchWithMap, textPixelRatio, posMatrix,
578
- collisionGroup, allowOverlap, symbolInstance, bucket, orientation, variableIconBox);
586
+ collisionGroup, overlapMode, symbolInstance, bucket, orientation, variableIconBox);
579
587
 
580
588
  if (result) {
581
589
  placedBox = result.placedGlyphBoxes;
@@ -637,26 +645,27 @@ export class Placement {
637
645
  const textPixelPadding = layout.get('text-padding');
638
646
  const circlePixelDiameter = symbolInstance.collisionCircleDiameter;
639
647
 
640
- placedGlyphCircles = this.collisionIndex.placeCollisionCircles(textAllowOverlap,
641
- placedSymbol,
642
- bucket.lineVertexArray,
643
- bucket.glyphOffsetArray,
644
- fontSize,
645
- posMatrix,
646
- textLabelPlaneMatrix,
647
- labelToScreenMatrix,
648
- showCollisionBoxes,
649
- pitchWithMap,
650
- collisionGroup.predicate,
651
- circlePixelDiameter,
652
- textPixelPadding);
648
+ placedGlyphCircles = this.collisionIndex.placeCollisionCircles(
649
+ textOverlapMode,
650
+ placedSymbol,
651
+ bucket.lineVertexArray,
652
+ bucket.glyphOffsetArray,
653
+ fontSize,
654
+ posMatrix,
655
+ textLabelPlaneMatrix,
656
+ labelToScreenMatrix,
657
+ showCollisionBoxes,
658
+ pitchWithMap,
659
+ collisionGroup.predicate,
660
+ circlePixelDiameter,
661
+ textPixelPadding);
653
662
 
654
663
  assert(!placedGlyphCircles.circles.length || (!placedGlyphCircles.collisionDetected || showCollisionBoxes));
655
- // If text-allow-overlap is set, force "placedCircles" to true
664
+ // If text-overlap is set to 'always', force "placedCircles" to true
656
665
  // In theory there should always be at least one circle placed
657
666
  // in this case, but for now quirks in text-anchor
658
667
  // and text-offset may prevent that from being true.
659
- placeText = textAllowOverlap || (placedGlyphCircles.circles.length > 0 && !placedGlyphCircles.collisionDetected);
668
+ placeText = textAlwaysOverlap || (placedGlyphCircles.circles.length > 0 && !placedGlyphCircles.collisionDetected);
660
669
  offscreen = offscreen && placedGlyphCircles.offscreen;
661
670
  }
662
671
 
@@ -673,7 +682,7 @@ export class Placement {
673
682
  rotateWithMap, pitchWithMap, this.transform.angle) :
674
683
  iconBox;
675
684
  return this.collisionIndex.placeCollisionBox(shiftedIconBox,
676
- iconAllowOverlap, textPixelRatio, posMatrix, collisionGroup.predicate);
685
+ iconOverlapMode, textPixelRatio, posMatrix, collisionGroup.predicate);
677
686
  };
678
687
 
679
688
  if (placedVerticalText && placedVerticalText.box && placedVerticalText.box.length && collisionArrays.verticalIconBox) {
@@ -701,22 +710,42 @@ export class Placement {
701
710
 
702
711
  if (placeText && placedGlyphBoxes && placedGlyphBoxes.box) {
703
712
  if (placedVerticalText && placedVerticalText.box && verticalTextFeatureIndex) {
704
- this.collisionIndex.insertCollisionBox(placedGlyphBoxes.box, layout.get('text-ignore-placement'),
705
- bucket.bucketInstanceId, verticalTextFeatureIndex, collisionGroup.ID);
713
+ this.collisionIndex.insertCollisionBox(
714
+ placedGlyphBoxes.box,
715
+ textOverlapMode,
716
+ layout.get('text-ignore-placement'),
717
+ bucket.bucketInstanceId,
718
+ verticalTextFeatureIndex,
719
+ collisionGroup.ID);
706
720
  } else {
707
- this.collisionIndex.insertCollisionBox(placedGlyphBoxes.box, layout.get('text-ignore-placement'),
708
- bucket.bucketInstanceId, textFeatureIndex, collisionGroup.ID);
721
+ this.collisionIndex.insertCollisionBox(
722
+ placedGlyphBoxes.box,
723
+ textOverlapMode,
724
+ layout.get('text-ignore-placement'),
725
+ bucket.bucketInstanceId,
726
+ textFeatureIndex,
727
+ collisionGroup.ID);
709
728
  }
710
729
 
711
730
  }
712
731
  if (placeIcon && placedIconBoxes) {
713
- this.collisionIndex.insertCollisionBox(placedIconBoxes.box, layout.get('icon-ignore-placement'),
714
- bucket.bucketInstanceId, iconFeatureIndex, collisionGroup.ID);
732
+ this.collisionIndex.insertCollisionBox(
733
+ placedIconBoxes.box,
734
+ iconOverlapMode,
735
+ layout.get('icon-ignore-placement'),
736
+ bucket.bucketInstanceId,
737
+ iconFeatureIndex,
738
+ collisionGroup.ID);
715
739
  }
716
740
  if (placedGlyphCircles) {
717
741
  if (placeText) {
718
- this.collisionIndex.insertCollisionCircles(placedGlyphCircles.circles, layout.get('text-ignore-placement'),
719
- bucket.bucketInstanceId, textFeatureIndex, collisionGroup.ID);
742
+ this.collisionIndex.insertCollisionCircles(
743
+ placedGlyphCircles.circles,
744
+ textOverlapMode,
745
+ layout.get('text-ignore-placement'),
746
+ bucket.bucketInstanceId,
747
+ textFeatureIndex,
748
+ collisionGroup.ID);
720
749
  }
721
750
 
722
751
  if (showCollisionBoxes) {
@@ -887,7 +916,7 @@ export class Placement {
887
916
  updateLayerOpacities(styleLayer: StyleLayer, tiles: Array<Tile>) {
888
917
  const seenCrossTileIDs = {};
889
918
  for (const tile of tiles) {
890
- const symbolBucket = (tile.getBucket(styleLayer) as SymbolBucket);
919
+ const symbolBucket = tile.getBucket(styleLayer) as SymbolBucket;
891
920
  if (symbolBucket && tile.latestFeatureIndex && styleLayer.id === symbolBucket.layerIds[0]) {
892
921
  this.updateBucketOpacities(symbolBucket, seenCrossTileIDs, tile.collisionBoxArray);
893
922
  }
@@ -895,7 +924,7 @@ export class Placement {
895
924
  }
896
925
 
897
926
  updateBucketOpacities(bucket: SymbolBucket, seenCrossTileIDs: {
898
- [k in string | number]: boolean;
927
+ [k in string | number]: boolean;
899
928
  }, collisionBoxArray?: CollisionBoxArray | null) {
900
929
  if (bucket.hasTextData()) bucket.text.opacityVertexArray.clear();
901
930
  if (bucket.hasIconData()) bucket.icon.opacityVertexArray.clear();
@@ -915,9 +944,9 @@ export class Placement {
915
944
  // with allow-overlap: false.
916
945
  // See https://github.com/mapbox/mapbox-gl-js/issues/7032
917
946
  const defaultOpacityState = new JointOpacityState(null, 0,
918
- textAllowOverlap && (iconAllowOverlap || !bucket.hasIconData() || layout.get('icon-optional')),
919
- iconAllowOverlap && (textAllowOverlap || !bucket.hasTextData() || layout.get('text-optional')),
920
- true);
947
+ textAllowOverlap && (iconAllowOverlap || !bucket.hasIconData() || layout.get('icon-optional')),
948
+ iconAllowOverlap && (textAllowOverlap || !bucket.hasTextData() || layout.get('text-optional')),
949
+ true);
921
950
 
922
951
  if (!bucket.collisionArrays && collisionBoxArray && ((bucket.hasIconCollisionBoxData() || bucket.hasTextCollisionBoxData()))) {
923
952
  bucket.deserializeCollisionBoxes(collisionBoxArray);
@@ -1031,10 +1060,10 @@ export class Placement {
1031
1060
  // just made the symbol disappear, and the most likely place for the
1032
1061
  // symbol to come back)
1033
1062
  shift = calculateVariableLayoutShift(variableOffset.anchor,
1034
- variableOffset.width,
1035
- variableOffset.height,
1036
- variableOffset.textOffset,
1037
- variableOffset.textBoxScale);
1063
+ variableOffset.width,
1064
+ variableOffset.height,
1065
+ variableOffset.textOffset,
1066
+ variableOffset.textBoxScale);
1038
1067
  if (rotateWithMap) {
1039
1068
  shift._rotate(pitchWithMap ? this.transform.angle : -this.transform.angle);
1040
1069
  }