mapbox-gl 1.13.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 (460) hide show
  1. package/.flowconfig +61 -0
  2. package/CHANGELOG.md +2485 -0
  3. package/LICENSE.txt +84 -0
  4. package/README.md +34 -0
  5. package/build/banner.js +4 -0
  6. package/build/check-bundle-size.js +140 -0
  7. package/build/diff-tarball.js +18 -0
  8. package/build/generate-access-token-script.js +11 -0
  9. package/build/generate-flow-typed-style-spec.js +188 -0
  10. package/build/generate-release-list.js +21 -0
  11. package/build/generate-struct-arrays.js +243 -0
  12. package/build/generate-style-code.js +159 -0
  13. package/build/mapbox-gl.js.flow +3 -0
  14. package/build/print-release-url.js +6 -0
  15. package/build/rollup_plugin_minify_style_spec.js +24 -0
  16. package/build/rollup_plugins.js +80 -0
  17. package/build/run-node +3 -0
  18. package/build/run-tap +8 -0
  19. package/build/test/build-tape.js +19 -0
  20. package/dist/mapbox-gl-csp-worker.js +2 -0
  21. package/dist/mapbox-gl-csp-worker.js.map +1 -0
  22. package/dist/mapbox-gl-csp.js +2 -0
  23. package/dist/mapbox-gl-csp.js.map +1 -0
  24. package/dist/mapbox-gl-dev.js +65889 -0
  25. package/dist/mapbox-gl-dev.js.flow +3 -0
  26. package/dist/mapbox-gl-unminified.js +42889 -0
  27. package/dist/mapbox-gl-unminified.js.map +1 -0
  28. package/dist/mapbox-gl.css +1 -0
  29. package/dist/mapbox-gl.js +42 -0
  30. package/dist/mapbox-gl.js.flow +3 -0
  31. package/dist/mapbox-gl.js.map +1 -0
  32. package/dist/style-spec/index.es.js +15032 -0
  33. package/dist/style-spec/index.es.js.map +1 -0
  34. package/dist/style-spec/index.js +15058 -0
  35. package/dist/style-spec/index.js.map +1 -0
  36. package/flow-typed/gl.js +5 -0
  37. package/flow-typed/jsdom.js +18 -0
  38. package/flow-typed/mapbox-gl-supported.js +9 -0
  39. package/flow-typed/mapbox-unitbezier.js +14 -0
  40. package/flow-typed/offscreen-canvas.js +9 -0
  41. package/flow-typed/pbf.js +25 -0
  42. package/flow-typed/point-geometry.js +44 -0
  43. package/flow-typed/potpack.js +12 -0
  44. package/flow-typed/sinon.js +28 -0
  45. package/flow-typed/vector-tile.js +41 -0
  46. package/package.json +173 -0
  47. package/src/css/mapbox-gl.css +812 -0
  48. package/src/css/svg/mapboxgl-ctrl-attrib.svg +3 -0
  49. package/src/css/svg/mapboxgl-ctrl-compass.svg +4 -0
  50. package/src/css/svg/mapboxgl-ctrl-fullscreen.svg +3 -0
  51. package/src/css/svg/mapboxgl-ctrl-geolocate.svg +5 -0
  52. package/src/css/svg/mapboxgl-ctrl-logo.svg +20 -0
  53. package/src/css/svg/mapboxgl-ctrl-shrink.svg +3 -0
  54. package/src/css/svg/mapboxgl-ctrl-zoom-in.svg +3 -0
  55. package/src/css/svg/mapboxgl-ctrl-zoom-out.svg +3 -0
  56. package/src/data/array_types.js +1135 -0
  57. package/src/data/bucket/circle_attributes.js +9 -0
  58. package/src/data/bucket/circle_bucket.js +201 -0
  59. package/src/data/bucket/fill_attributes.js +9 -0
  60. package/src/data/bucket/fill_bucket.js +229 -0
  61. package/src/data/bucket/fill_extrusion_attributes.js +10 -0
  62. package/src/data/bucket/fill_extrusion_bucket.js +283 -0
  63. package/src/data/bucket/heatmap_bucket.js +17 -0
  64. package/src/data/bucket/line_attributes.js +10 -0
  65. package/src/data/bucket/line_attributes_ext.js +10 -0
  66. package/src/data/bucket/line_bucket.js +594 -0
  67. package/src/data/bucket/pattern_attributes.js +12 -0
  68. package/src/data/bucket/pattern_bucket_features.js +60 -0
  69. package/src/data/bucket/symbol_attributes.js +117 -0
  70. package/src/data/bucket/symbol_bucket.js +937 -0
  71. package/src/data/bucket.js +123 -0
  72. package/src/data/dem_data.js +125 -0
  73. package/src/data/evaluation_feature.js +25 -0
  74. package/src/data/extent.js +18 -0
  75. package/src/data/feature_index.js +322 -0
  76. package/src/data/feature_position_map.js +131 -0
  77. package/src/data/index_array_type.js +16 -0
  78. package/src/data/load_geometry.js +46 -0
  79. package/src/data/pos_attributes.js +6 -0
  80. package/src/data/program_configuration.js +708 -0
  81. package/src/data/raster_bounds_attributes.js +7 -0
  82. package/src/data/segment.js +76 -0
  83. package/src/geo/edge_insets.js +102 -0
  84. package/src/geo/lng_lat.js +168 -0
  85. package/src/geo/lng_lat_bounds.js +276 -0
  86. package/src/geo/mercator_coordinate.js +150 -0
  87. package/src/geo/transform.js +834 -0
  88. package/src/gl/color_mode.js +34 -0
  89. package/src/gl/context.js +302 -0
  90. package/src/gl/cull_face_mode.js +26 -0
  91. package/src/gl/depth_mode.js +29 -0
  92. package/src/gl/framebuffer.js +44 -0
  93. package/src/gl/index_buffer.js +55 -0
  94. package/src/gl/stencil_mode.js +30 -0
  95. package/src/gl/types.js +84 -0
  96. package/src/gl/value.js +520 -0
  97. package/src/gl/vertex_buffer.js +119 -0
  98. package/src/index.js +230 -0
  99. package/src/render/draw_background.js +57 -0
  100. package/src/render/draw_circle.js +113 -0
  101. package/src/render/draw_collision_debug.js +172 -0
  102. package/src/render/draw_custom.js +49 -0
  103. package/src/render/draw_debug.js +127 -0
  104. package/src/render/draw_fill.js +124 -0
  105. package/src/render/draw_fill_extrusion.js +95 -0
  106. package/src/render/draw_heatmap.js +133 -0
  107. package/src/render/draw_hillshade.js +107 -0
  108. package/src/render/draw_line.js +125 -0
  109. package/src/render/draw_raster.js +125 -0
  110. package/src/render/draw_symbol.js +392 -0
  111. package/src/render/glyph_atlas.js +71 -0
  112. package/src/render/glyph_manager.js +182 -0
  113. package/src/render/image_atlas.js +149 -0
  114. package/src/render/image_manager.js +306 -0
  115. package/src/render/line_atlas.js +210 -0
  116. package/src/render/painter.js +654 -0
  117. package/src/render/program/background_program.js +103 -0
  118. package/src/render/program/circle_program.js +69 -0
  119. package/src/render/program/clipping_mask_program.js +20 -0
  120. package/src/render/program/collision_program.js +76 -0
  121. package/src/render/program/debug_program.js +35 -0
  122. package/src/render/program/fill_extrusion_program.js +122 -0
  123. package/src/render/program/fill_program.js +126 -0
  124. package/src/render/program/heatmap_program.js +83 -0
  125. package/src/render/program/hillshade_program.js +119 -0
  126. package/src/render/program/line_program.js +211 -0
  127. package/src/render/program/pattern.js +102 -0
  128. package/src/render/program/program_uniforms.js +42 -0
  129. package/src/render/program/raster_program.js +92 -0
  130. package/src/render/program/symbol_program.js +224 -0
  131. package/src/render/program.js +188 -0
  132. package/src/render/texture.js +122 -0
  133. package/src/render/uniform_binding.js +147 -0
  134. package/src/render/vertex_array_object.js +163 -0
  135. package/src/shaders/README.md +42 -0
  136. package/src/shaders/_prelude.fragment.glsl +17 -0
  137. package/src/shaders/_prelude.vertex.glsl +73 -0
  138. package/src/shaders/background.fragment.glsl +10 -0
  139. package/src/shaders/background.vertex.glsl +7 -0
  140. package/src/shaders/background_pattern.fragment.glsl +28 -0
  141. package/src/shaders/background_pattern.vertex.glsl +20 -0
  142. package/src/shaders/circle.fragment.glsl +39 -0
  143. package/src/shaders/circle.vertex.glsl +64 -0
  144. package/src/shaders/clipping_mask.fragment.glsl +3 -0
  145. package/src/shaders/clipping_mask.vertex.glsl +7 -0
  146. package/src/shaders/collision_box.fragment.glsl +21 -0
  147. package/src/shaders/collision_box.vertex.glsl +27 -0
  148. package/src/shaders/collision_circle.fragment.glsl +17 -0
  149. package/src/shaders/collision_circle.vertex.glsl +59 -0
  150. package/src/shaders/debug.fragment.glsl +9 -0
  151. package/src/shaders/debug.vertex.glsl +12 -0
  152. package/src/shaders/encode_attribute.js +17 -0
  153. package/src/shaders/fill.fragment.glsl +13 -0
  154. package/src/shaders/fill.vertex.glsl +13 -0
  155. package/src/shaders/fill_extrusion.fragment.glsl +9 -0
  156. package/src/shaders/fill_extrusion.vertex.glsl +66 -0
  157. package/src/shaders/fill_extrusion_pattern.fragment.glsl +45 -0
  158. package/src/shaders/fill_extrusion_pattern.vertex.glsl +79 -0
  159. package/src/shaders/fill_outline.fragment.glsl +17 -0
  160. package/src/shaders/fill_outline.vertex.glsl +17 -0
  161. package/src/shaders/fill_outline_pattern.fragment.glsl +43 -0
  162. package/src/shaders/fill_outline_pattern.vertex.glsl +44 -0
  163. package/src/shaders/fill_pattern.fragment.glsl +36 -0
  164. package/src/shaders/fill_pattern.vertex.glsl +39 -0
  165. package/src/shaders/heatmap.fragment.glsl +22 -0
  166. package/src/shaders/heatmap.vertex.glsl +54 -0
  167. package/src/shaders/heatmap_texture.fragment.glsl +14 -0
  168. package/src/shaders/heatmap_texture.vertex.glsl +11 -0
  169. package/src/shaders/hillshade.fragment.glsl +52 -0
  170. package/src/shaders/hillshade.vertex.glsl +11 -0
  171. package/src/shaders/hillshade_prepare.fragment.glsl +75 -0
  172. package/src/shaders/hillshade_prepare.vertex.glsl +15 -0
  173. package/src/shaders/index.js +20 -0
  174. package/src/shaders/line.fragment.glsl +30 -0
  175. package/src/shaders/line.vertex.glsl +85 -0
  176. package/src/shaders/line_gradient.fragment.glsl +34 -0
  177. package/src/shaders/line_gradient.vertex.glsl +88 -0
  178. package/src/shaders/line_pattern.fragment.glsl +74 -0
  179. package/src/shaders/line_pattern.vertex.glsl +99 -0
  180. package/src/shaders/line_sdf.fragment.glsl +45 -0
  181. package/src/shaders/line_sdf.vertex.glsl +98 -0
  182. package/src/shaders/raster.fragment.glsl +52 -0
  183. package/src/shaders/raster.vertex.glsl +21 -0
  184. package/src/shaders/shaders.js +185 -0
  185. package/src/shaders/symbol_icon.fragment.glsl +17 -0
  186. package/src/shaders/symbol_icon.vertex.glsl +94 -0
  187. package/src/shaders/symbol_sdf.fragment.glsl +52 -0
  188. package/src/shaders/symbol_sdf.vertex.glsl +115 -0
  189. package/src/shaders/symbol_text_and_icon.fragment.glsl +68 -0
  190. package/src/shaders/symbol_text_and_icon.vertex.glsl +116 -0
  191. package/src/source/canvas_source.js +238 -0
  192. package/src/source/geojson_source.js +370 -0
  193. package/src/source/geojson_worker_source.js +366 -0
  194. package/src/source/geojson_wrapper.js +94 -0
  195. package/src/source/image_source.js +307 -0
  196. package/src/source/load_tilejson.js +39 -0
  197. package/src/source/pixels_to_tile_units.js +21 -0
  198. package/src/source/query_features.js +208 -0
  199. package/src/source/raster_dem_tile_source.js +138 -0
  200. package/src/source/raster_dem_tile_worker_source.js +62 -0
  201. package/src/source/raster_tile_source.js +169 -0
  202. package/src/source/rtl_text_plugin.js +143 -0
  203. package/src/source/source.js +137 -0
  204. package/src/source/source_cache.js +953 -0
  205. package/src/source/source_state.js +159 -0
  206. package/src/source/tile.js +458 -0
  207. package/src/source/tile_bounds.js +38 -0
  208. package/src/source/tile_cache.js +212 -0
  209. package/src/source/tile_id.js +199 -0
  210. package/src/source/vector_tile_source.js +259 -0
  211. package/src/source/vector_tile_worker_source.js +216 -0
  212. package/src/source/video_source.js +203 -0
  213. package/src/source/worker.js +240 -0
  214. package/src/source/worker_source.js +107 -0
  215. package/src/source/worker_tile.js +224 -0
  216. package/src/style/create_style_layer.js +36 -0
  217. package/src/style/evaluation_parameters.js +62 -0
  218. package/src/style/format_section_override.js +56 -0
  219. package/src/style/light.js +130 -0
  220. package/src/style/load_glyph_range.js +38 -0
  221. package/src/style/load_sprite.js +67 -0
  222. package/src/style/parse_glyph_pbf.js +44 -0
  223. package/src/style/pauseable_placement.js +132 -0
  224. package/src/style/properties.js +753 -0
  225. package/src/style/query_utils.js +43 -0
  226. package/src/style/style.js +1374 -0
  227. package/src/style/style_glyph.js +17 -0
  228. package/src/style/style_image.js +137 -0
  229. package/src/style/style_layer/background_style_layer.js +21 -0
  230. package/src/style/style_layer/background_style_layer_properties.js +40 -0
  231. package/src/style/style_layer/circle_style_layer.js +98 -0
  232. package/src/style/style_layer/circle_style_layer_properties.js +63 -0
  233. package/src/style/style_layer/custom_style_layer.js +223 -0
  234. package/src/style/style_layer/fill_extrusion_style_layer.js +224 -0
  235. package/src/style/style_layer/fill_extrusion_style_layer_properties.js +50 -0
  236. package/src/style/style_layer/fill_style_layer.js +67 -0
  237. package/src/style/style_layer/fill_style_layer_properties.js +55 -0
  238. package/src/style/style_layer/heatmap_style_layer.js +73 -0
  239. package/src/style/style_layer/heatmap_style_layer_properties.js +44 -0
  240. package/src/style/style_layer/hillshade_style_layer.js +25 -0
  241. package/src/style/style_layer/hillshade_style_layer_properties.js +46 -0
  242. package/src/style/style_layer/layer_properties.js.ejs +69 -0
  243. package/src/style/style_layer/line_style_layer.js +150 -0
  244. package/src/style/style_layer/line_style_layer_properties.js +71 -0
  245. package/src/style/style_layer/raster_style_layer.js +21 -0
  246. package/src/style/style_layer/raster_style_layer_properties.js +50 -0
  247. package/src/style/style_layer/symbol_style_layer.js +190 -0
  248. package/src/style/style_layer/symbol_style_layer_properties.js +153 -0
  249. package/src/style/style_layer/typed_style_layer.js +17 -0
  250. package/src/style/style_layer.js +283 -0
  251. package/src/style/style_layer_index.js +80 -0
  252. package/src/style/validate_style.js +42 -0
  253. package/src/style/zoom_history.js +44 -0
  254. package/src/style-spec/.eslintrc +5 -0
  255. package/src/style-spec/CHANGELOG.md +468 -0
  256. package/src/style-spec/README.md +59 -0
  257. package/src/style-spec/bin/gl-style-composite +9 -0
  258. package/src/style-spec/bin/gl-style-format +22 -0
  259. package/src/style-spec/bin/gl-style-migrate +9 -0
  260. package/src/style-spec/bin/gl-style-validate +50 -0
  261. package/src/style-spec/composite.js +50 -0
  262. package/src/style-spec/declass.js +42 -0
  263. package/src/style-spec/deref.js +52 -0
  264. package/src/style-spec/diff.js +393 -0
  265. package/src/style-spec/dist/.gitkeep +0 -0
  266. package/src/style-spec/dist/index.es.js +15032 -0
  267. package/src/style-spec/dist/index.es.js.map +1 -0
  268. package/src/style-spec/dist/index.js +15058 -0
  269. package/src/style-spec/dist/index.js.map +1 -0
  270. package/src/style-spec/empty.js +29 -0
  271. package/src/style-spec/error/parsing_error.js +16 -0
  272. package/src/style-spec/error/validation_error.js +18 -0
  273. package/src/style-spec/expression/compound_expression.js +162 -0
  274. package/src/style-spec/expression/definitions/assertion.js +130 -0
  275. package/src/style-spec/expression/definitions/at.js +70 -0
  276. package/src/style-spec/expression/definitions/case.js +85 -0
  277. package/src/style-spec/expression/definitions/coalesce.js +93 -0
  278. package/src/style-spec/expression/definitions/coercion.js +133 -0
  279. package/src/style-spec/expression/definitions/collator.js +78 -0
  280. package/src/style-spec/expression/definitions/comparison.js +184 -0
  281. package/src/style-spec/expression/definitions/format.js +144 -0
  282. package/src/style-spec/expression/definitions/image.js +52 -0
  283. package/src/style-spec/expression/definitions/in.js +72 -0
  284. package/src/style-spec/expression/definitions/index.js +565 -0
  285. package/src/style-spec/expression/definitions/index_of.js +89 -0
  286. package/src/style-spec/expression/definitions/interpolate.js +267 -0
  287. package/src/style-spec/expression/definitions/length.js +61 -0
  288. package/src/style-spec/expression/definitions/let.js +72 -0
  289. package/src/style-spec/expression/definitions/literal.js +77 -0
  290. package/src/style-spec/expression/definitions/match.js +158 -0
  291. package/src/style-spec/expression/definitions/number_format.js +142 -0
  292. package/src/style-spec/expression/definitions/slice.js +86 -0
  293. package/src/style-spec/expression/definitions/step.js +120 -0
  294. package/src/style-spec/expression/definitions/var.js +46 -0
  295. package/src/style-spec/expression/definitions/within.js +342 -0
  296. package/src/style-spec/expression/evaluation_context.js +59 -0
  297. package/src/style-spec/expression/expression.js +27 -0
  298. package/src/style-spec/expression/index.js +392 -0
  299. package/src/style-spec/expression/is_constant.js +59 -0
  300. package/src/style-spec/expression/parsing_context.js +233 -0
  301. package/src/style-spec/expression/parsing_error.js +13 -0
  302. package/src/style-spec/expression/runtime_error.js +17 -0
  303. package/src/style-spec/expression/scope.js +36 -0
  304. package/src/style-spec/expression/stops.js +39 -0
  305. package/src/style-spec/expression/types/collator.js +61 -0
  306. package/src/style-spec/expression/types/formatted.js +73 -0
  307. package/src/style-spec/expression/types/resolved_image.js +29 -0
  308. package/src/style-spec/expression/types.js +126 -0
  309. package/src/style-spec/expression/values.js +123 -0
  310. package/src/style-spec/feature_filter/README.md +55 -0
  311. package/src/style-spec/feature_filter/convert.js +208 -0
  312. package/src/style-spec/feature_filter/index.js +175 -0
  313. package/src/style-spec/format.js +51 -0
  314. package/src/style-spec/function/convert.js +270 -0
  315. package/src/style-spec/function/index.js +262 -0
  316. package/src/style-spec/group_by_layout.js +75 -0
  317. package/src/style-spec/migrate/expressions.js +39 -0
  318. package/src/style-spec/migrate/v8.js +203 -0
  319. package/src/style-spec/migrate/v9.js +26 -0
  320. package/src/style-spec/migrate.js +36 -0
  321. package/src/style-spec/package.json +41 -0
  322. package/src/style-spec/read_style.js +14 -0
  323. package/src/style-spec/reference/latest.js +3 -0
  324. package/src/style-spec/reference/v8.json +5914 -0
  325. package/src/style-spec/rollup.config.js +65 -0
  326. package/src/style-spec/style-spec.js +124 -0
  327. package/src/style-spec/types.js +432 -0
  328. package/src/style-spec/util/color.js +95 -0
  329. package/src/style-spec/util/color_spaces.js +139 -0
  330. package/src/style-spec/util/deep_equal.js +28 -0
  331. package/src/style-spec/util/extend.js +10 -0
  332. package/src/style-spec/util/get_type.js +17 -0
  333. package/src/style-spec/util/interpolate.js +22 -0
  334. package/src/style-spec/util/properties.js +15 -0
  335. package/src/style-spec/util/ref_properties.js +2 -0
  336. package/src/style-spec/util/result.js +19 -0
  337. package/src/style-spec/util/unbundle_jsonlint.js +24 -0
  338. package/src/style-spec/validate/latest.js +11 -0
  339. package/src/style-spec/validate/validate.js +75 -0
  340. package/src/style-spec/validate/validate_array.js +52 -0
  341. package/src/style-spec/validate/validate_boolean.js +15 -0
  342. package/src/style-spec/validate/validate_color.js +20 -0
  343. package/src/style-spec/validate/validate_constants.js +13 -0
  344. package/src/style-spec/validate/validate_enum.js +21 -0
  345. package/src/style-spec/validate/validate_expression.js +43 -0
  346. package/src/style-spec/validate/validate_filter.js +117 -0
  347. package/src/style-spec/validate/validate_formatted.js +11 -0
  348. package/src/style-spec/validate/validate_function.js +207 -0
  349. package/src/style-spec/validate/validate_glyphs_url.js +21 -0
  350. package/src/style-spec/validate/validate_image.js +11 -0
  351. package/src/style-spec/validate/validate_layer.js +134 -0
  352. package/src/style-spec/validate/validate_layout_property.js +6 -0
  353. package/src/style-spec/validate/validate_light.js +47 -0
  354. package/src/style-spec/validate/validate_number.js +29 -0
  355. package/src/style-spec/validate/validate_object.js +61 -0
  356. package/src/style-spec/validate/validate_paint_property.js +6 -0
  357. package/src/style-spec/validate/validate_property.js +64 -0
  358. package/src/style-spec/validate/validate_source.js +111 -0
  359. package/src/style-spec/validate/validate_string.js +15 -0
  360. package/src/style-spec/validate_mapbox_api_supported.js +171 -0
  361. package/src/style-spec/validate_style.js +39 -0
  362. package/src/style-spec/validate_style.min.js +78 -0
  363. package/src/style-spec/visit.js +77 -0
  364. package/src/symbol/anchor.js +26 -0
  365. package/src/symbol/check_max_angle.js +81 -0
  366. package/src/symbol/clip_line.js +71 -0
  367. package/src/symbol/collision_feature.js +109 -0
  368. package/src/symbol/collision_index.js +373 -0
  369. package/src/symbol/cross_tile_symbol_index.js +301 -0
  370. package/src/symbol/get_anchors.js +167 -0
  371. package/src/symbol/grid_index.js +335 -0
  372. package/src/symbol/mergelines.js +82 -0
  373. package/src/symbol/one_em.js +4 -0
  374. package/src/symbol/opacity_state.js +27 -0
  375. package/src/symbol/path_interpolator.js +61 -0
  376. package/src/symbol/placement.js +1124 -0
  377. package/src/symbol/projection.js +451 -0
  378. package/src/symbol/quads.js +334 -0
  379. package/src/symbol/shaping.js +816 -0
  380. package/src/symbol/symbol_layout.js +796 -0
  381. package/src/symbol/symbol_size.js +113 -0
  382. package/src/symbol/transform_text.js +29 -0
  383. package/src/types/callback.js +17 -0
  384. package/src/types/cancelable.js +3 -0
  385. package/src/types/tilejson.js +17 -0
  386. package/src/types/transferable.js +3 -0
  387. package/src/types/window.js +172 -0
  388. package/src/ui/anchor.js +32 -0
  389. package/src/ui/camera.js +1277 -0
  390. package/src/ui/control/attribution_control.js +212 -0
  391. package/src/ui/control/fullscreen_control.js +147 -0
  392. package/src/ui/control/geolocate_control.js +707 -0
  393. package/src/ui/control/logo_control.js +92 -0
  394. package/src/ui/control/navigation_control.js +257 -0
  395. package/src/ui/control/scale_control.js +142 -0
  396. package/src/ui/default_locale.js +22 -0
  397. package/src/ui/events.js +1301 -0
  398. package/src/ui/handler/box_zoom.js +170 -0
  399. package/src/ui/handler/click_zoom.js +52 -0
  400. package/src/ui/handler/handler_util.js +12 -0
  401. package/src/ui/handler/keyboard.js +208 -0
  402. package/src/ui/handler/map_event.js +156 -0
  403. package/src/ui/handler/mouse.js +171 -0
  404. package/src/ui/handler/scroll_zoom.js +350 -0
  405. package/src/ui/handler/shim/dblclick_zoom.js +62 -0
  406. package/src/ui/handler/shim/drag_pan.js +88 -0
  407. package/src/ui/handler/shim/drag_rotate.js +67 -0
  408. package/src/ui/handler/shim/touch_zoom_rotate.js +108 -0
  409. package/src/ui/handler/tap_drag_zoom.js +103 -0
  410. package/src/ui/handler/tap_recognizer.js +133 -0
  411. package/src/ui/handler/tap_zoom.js +93 -0
  412. package/src/ui/handler/touch_pan.js +101 -0
  413. package/src/ui/handler/touch_zoom_rotate.js +305 -0
  414. package/src/ui/handler_inertia.js +158 -0
  415. package/src/ui/handler_manager.js +531 -0
  416. package/src/ui/hash.js +148 -0
  417. package/src/ui/map.js +2874 -0
  418. package/src/ui/marker.js +672 -0
  419. package/src/ui/popup.js +640 -0
  420. package/src/util/actor.js +212 -0
  421. package/src/util/ajax.js +388 -0
  422. package/src/util/browser/web_worker.js +10 -0
  423. package/src/util/browser/window.js +6 -0
  424. package/src/util/browser.js +70 -0
  425. package/src/util/classify_rings.js +52 -0
  426. package/src/util/color_ramp.js +61 -0
  427. package/src/util/config.js +30 -0
  428. package/src/util/debug.js +28 -0
  429. package/src/util/dictionary_coder.js +30 -0
  430. package/src/util/dispatcher.js +70 -0
  431. package/src/util/dom.js +142 -0
  432. package/src/util/evented.js +174 -0
  433. package/src/util/find_pole_of_inaccessibility.js +129 -0
  434. package/src/util/global_worker_pool.js +35 -0
  435. package/src/util/image.js +142 -0
  436. package/src/util/intersection_tests.js +208 -0
  437. package/src/util/is_char_in_unicode_block.js +311 -0
  438. package/src/util/mapbox.js +491 -0
  439. package/src/util/offscreen_canvas_supported.js +14 -0
  440. package/src/util/performance.js +112 -0
  441. package/src/util/primitives.js +145 -0
  442. package/src/util/resolve_tokens.js +16 -0
  443. package/src/util/script_detection.js +328 -0
  444. package/src/util/sku_token.js +42 -0
  445. package/src/util/smart_wrap.js +55 -0
  446. package/src/util/struct_array.js +243 -0
  447. package/src/util/struct_array.js.ejs +112 -0
  448. package/src/util/struct_array_layout.js.ejs +98 -0
  449. package/src/util/task_queue.js +68 -0
  450. package/src/util/throttle.js +27 -0
  451. package/src/util/throttled_invoker.js +46 -0
  452. package/src/util/tile_request_cache.js +172 -0
  453. package/src/util/util.js +524 -0
  454. package/src/util/vectortile_to_geojson.js +50 -0
  455. package/src/util/verticalize_punctuation.js +114 -0
  456. package/src/util/web_worker.js +91 -0
  457. package/src/util/web_worker_transfer.js +266 -0
  458. package/src/util/webp_supported.js +69 -0
  459. package/src/util/window.js +102 -0
  460. package/src/util/worker_pool.js +57 -0
@@ -0,0 +1,594 @@
1
+ // @flow
2
+
3
+ import {LineLayoutArray, LineExtLayoutArray} from '../array_types';
4
+
5
+ import {members as layoutAttributes} from './line_attributes';
6
+ import {members as layoutAttributesExt} from './line_attributes_ext';
7
+ import SegmentVector from '../segment';
8
+ import {ProgramConfigurationSet} from '../program_configuration';
9
+ import {TriangleIndexArray} from '../index_array_type';
10
+ import EXTENT from '../extent';
11
+ import mvt from '@mapbox/vector-tile';
12
+ const vectorTileFeatureTypes = mvt.VectorTileFeature.types;
13
+ import {register} from '../../util/web_worker_transfer';
14
+ import {hasPattern, addPatternDependencies} from './pattern_bucket_features';
15
+ import loadGeometry from '../load_geometry';
16
+ import toEvaluationFeature from '../evaluation_feature';
17
+ import EvaluationParameters from '../../style/evaluation_parameters';
18
+
19
+ import type {CanonicalTileID} from '../../source/tile_id';
20
+ import type {
21
+ Bucket,
22
+ BucketParameters,
23
+ BucketFeature,
24
+ IndexedFeature,
25
+ PopulateParameters
26
+ } from '../bucket';
27
+ import type LineStyleLayer from '../../style/style_layer/line_style_layer';
28
+ import type Point from '@mapbox/point-geometry';
29
+ import type {Segment} from '../segment';
30
+ import {RGBAImage} from '../../util/image';
31
+ import type Context from '../../gl/context';
32
+ import type Texture from '../../render/texture';
33
+ import type IndexBuffer from '../../gl/index_buffer';
34
+ import type VertexBuffer from '../../gl/vertex_buffer';
35
+ import type {FeatureStates} from '../../source/source_state';
36
+ import type {ImagePosition} from '../../render/image_atlas';
37
+
38
+ // NOTE ON EXTRUDE SCALE:
39
+ // scale the extrusion vector so that the normal length is this value.
40
+ // contains the "texture" normals (-1..1). this is distinct from the extrude
41
+ // normals for line joins, because the x-value remains 0 for the texture
42
+ // normal array, while the extrude normal actually moves the vertex to create
43
+ // the acute/bevelled line join.
44
+ const EXTRUDE_SCALE = 63;
45
+
46
+ /*
47
+ * Sharp corners cause dashed lines to tilt because the distance along the line
48
+ * is the same at both the inner and outer corners. To improve the appearance of
49
+ * dashed lines we add extra points near sharp corners so that a smaller part
50
+ * of the line is tilted.
51
+ *
52
+ * COS_HALF_SHARP_CORNER controls how sharp a corner has to be for us to add an
53
+ * extra vertex. The default is 75 degrees.
54
+ *
55
+ * The newly created vertices are placed SHARP_CORNER_OFFSET pixels from the corner.
56
+ */
57
+ const COS_HALF_SHARP_CORNER = Math.cos(75 / 2 * (Math.PI / 180));
58
+ const SHARP_CORNER_OFFSET = 15;
59
+
60
+ // Angle per triangle for approximating round line joins.
61
+ const DEG_PER_TRIANGLE = 20;
62
+
63
+ // The number of bits that is used to store the line distance in the buffer.
64
+ const LINE_DISTANCE_BUFFER_BITS = 15;
65
+
66
+ // We don't have enough bits for the line distance as we'd like to have, so
67
+ // use this value to scale the line distance (in tile units) down to a smaller
68
+ // value. This lets us store longer distances while sacrificing precision.
69
+ const LINE_DISTANCE_SCALE = 1 / 2;
70
+
71
+ // The maximum line distance, in tile units, that fits in the buffer.
72
+ const MAX_LINE_DISTANCE = Math.pow(2, LINE_DISTANCE_BUFFER_BITS - 1) / LINE_DISTANCE_SCALE;
73
+
74
+ type LineClips = {
75
+ start: number;
76
+ end: number;
77
+ }
78
+
79
+ type GradientTexture = {
80
+ texture: Texture;
81
+ gradient: ?RGBAImage;
82
+ version: number;
83
+ }
84
+
85
+ /**
86
+ * @private
87
+ */
88
+ class LineBucket implements Bucket {
89
+ distance: number;
90
+ totalDistance: number;
91
+ maxLineLength: number;
92
+ scaledDistance: number;
93
+ lineClips: ?LineClips;
94
+
95
+ e1: number;
96
+ e2: number;
97
+
98
+ index: number;
99
+ zoom: number;
100
+ overscaling: number;
101
+ layers: Array<LineStyleLayer>;
102
+ layerIds: Array<string>;
103
+ gradients: {[string]: GradientTexture};
104
+ stateDependentLayers: Array<any>;
105
+ stateDependentLayerIds: Array<string>;
106
+ patternFeatures: Array<BucketFeature>;
107
+ lineClipsArray: Array<LineClips>;
108
+
109
+ layoutVertexArray: LineLayoutArray;
110
+ layoutVertexBuffer: VertexBuffer;
111
+ layoutVertexArray2: LineExtLayoutArray;
112
+ layoutVertexBuffer2: VertexBuffer;
113
+
114
+ indexArray: TriangleIndexArray;
115
+ indexBuffer: IndexBuffer;
116
+
117
+ hasPattern: boolean;
118
+ programConfigurations: ProgramConfigurationSet<LineStyleLayer>;
119
+ segments: SegmentVector;
120
+ uploaded: boolean;
121
+
122
+ constructor(options: BucketParameters<LineStyleLayer>) {
123
+ this.zoom = options.zoom;
124
+ this.overscaling = options.overscaling;
125
+ this.layers = options.layers;
126
+ this.layerIds = this.layers.map(layer => layer.id);
127
+ this.index = options.index;
128
+ this.hasPattern = false;
129
+ this.patternFeatures = [];
130
+ this.lineClipsArray = [];
131
+ this.gradients = {};
132
+ this.layers.forEach(layer => {
133
+ this.gradients[layer.id] = {};
134
+ });
135
+
136
+ this.layoutVertexArray = new LineLayoutArray();
137
+ this.layoutVertexArray2 = new LineExtLayoutArray();
138
+ this.indexArray = new TriangleIndexArray();
139
+ this.programConfigurations = new ProgramConfigurationSet(options.layers, options.zoom);
140
+ this.segments = new SegmentVector();
141
+ this.maxLineLength = 0;
142
+
143
+ this.stateDependentLayerIds = this.layers.filter((l) => l.isStateDependent()).map((l) => l.id);
144
+ }
145
+
146
+ populate(features: Array<IndexedFeature>, options: PopulateParameters, canonical: CanonicalTileID) {
147
+ this.hasPattern = hasPattern('line', this.layers, options);
148
+ const lineSortKey = this.layers[0].layout.get('line-sort-key');
149
+ const bucketFeatures = [];
150
+
151
+ for (const {feature, id, index, sourceLayerIndex} of features) {
152
+ const needGeometry = this.layers[0]._featureFilter.needGeometry;
153
+ const evaluationFeature = toEvaluationFeature(feature, needGeometry);
154
+
155
+ if (!this.layers[0]._featureFilter.filter(new EvaluationParameters(this.zoom), evaluationFeature, canonical)) continue;
156
+
157
+ const sortKey = lineSortKey ?
158
+ lineSortKey.evaluate(evaluationFeature, {}, canonical) :
159
+ undefined;
160
+
161
+ const bucketFeature: BucketFeature = {
162
+ id,
163
+ properties: feature.properties,
164
+ type: feature.type,
165
+ sourceLayerIndex,
166
+ index,
167
+ geometry: needGeometry ? evaluationFeature.geometry : loadGeometry(feature),
168
+ patterns: {},
169
+ sortKey
170
+ };
171
+
172
+ bucketFeatures.push(bucketFeature);
173
+ }
174
+
175
+ if (lineSortKey) {
176
+ bucketFeatures.sort((a, b) => {
177
+ // a.sortKey is always a number when in use
178
+ return ((a.sortKey: any): number) - ((b.sortKey: any): number);
179
+ });
180
+ }
181
+
182
+ for (const bucketFeature of bucketFeatures) {
183
+ const {geometry, index, sourceLayerIndex} = bucketFeature;
184
+
185
+ if (this.hasPattern) {
186
+ const patternBucketFeature = addPatternDependencies('line', this.layers, bucketFeature, this.zoom, options);
187
+ // pattern features are added only once the pattern is loaded into the image atlas
188
+ // so are stored during populate until later updated with positions by tile worker in addFeatures
189
+ this.patternFeatures.push(patternBucketFeature);
190
+ } else {
191
+ this.addFeature(bucketFeature, geometry, index, canonical, {});
192
+ }
193
+
194
+ const feature = features[index].feature;
195
+ options.featureIndex.insert(feature, geometry, index, sourceLayerIndex, this.index);
196
+ }
197
+ }
198
+
199
+ update(states: FeatureStates, vtLayer: VectorTileLayer, imagePositions: {[_: string]: ImagePosition}) {
200
+ if (!this.stateDependentLayers.length) return;
201
+ this.programConfigurations.updatePaintArrays(states, vtLayer, this.stateDependentLayers, imagePositions);
202
+ }
203
+
204
+ addFeatures(options: PopulateParameters, canonical: CanonicalTileID, imagePositions: {[_: string]: ImagePosition}) {
205
+ for (const feature of this.patternFeatures) {
206
+ this.addFeature(feature, feature.geometry, feature.index, canonical, imagePositions);
207
+ }
208
+ }
209
+
210
+ isEmpty() {
211
+ return this.layoutVertexArray.length === 0;
212
+ }
213
+
214
+ uploadPending() {
215
+ return !this.uploaded || this.programConfigurations.needsUpload;
216
+ }
217
+
218
+ upload(context: Context) {
219
+ if (!this.uploaded) {
220
+ if (this.layoutVertexArray2.length !== 0) {
221
+ this.layoutVertexBuffer2 = context.createVertexBuffer(this.layoutVertexArray2, layoutAttributesExt);
222
+ }
223
+ this.layoutVertexBuffer = context.createVertexBuffer(this.layoutVertexArray, layoutAttributes);
224
+ this.indexBuffer = context.createIndexBuffer(this.indexArray);
225
+ }
226
+ this.programConfigurations.upload(context);
227
+ this.uploaded = true;
228
+ }
229
+
230
+ destroy() {
231
+ if (!this.layoutVertexBuffer) return;
232
+ this.layoutVertexBuffer.destroy();
233
+ this.indexBuffer.destroy();
234
+ this.programConfigurations.destroy();
235
+ this.segments.destroy();
236
+ }
237
+
238
+ lineFeatureClips(feature: BucketFeature): ?LineClips {
239
+ if (!!feature.properties && feature.properties.hasOwnProperty('mapbox_clip_start') && feature.properties.hasOwnProperty('mapbox_clip_end')) {
240
+ const start = +feature.properties['mapbox_clip_start'];
241
+ const end = +feature.properties['mapbox_clip_end'];
242
+ return {start, end};
243
+ }
244
+ }
245
+
246
+ addFeature(feature: BucketFeature, geometry: Array<Array<Point>>, index: number, canonical: CanonicalTileID, imagePositions: {[_: string]: ImagePosition}) {
247
+ const layout = this.layers[0].layout;
248
+ const join = layout.get('line-join').evaluate(feature, {});
249
+ const cap = layout.get('line-cap');
250
+ const miterLimit = layout.get('line-miter-limit');
251
+ const roundLimit = layout.get('line-round-limit');
252
+ this.lineClips = this.lineFeatureClips(feature);
253
+
254
+ for (const line of geometry) {
255
+ this.addLine(line, feature, join, cap, miterLimit, roundLimit);
256
+ }
257
+
258
+ this.programConfigurations.populatePaintArrays(this.layoutVertexArray.length, feature, index, imagePositions, canonical);
259
+ }
260
+
261
+ addLine(vertices: Array<Point>, feature: BucketFeature, join: string, cap: string, miterLimit: number, roundLimit: number) {
262
+ this.distance = 0;
263
+ this.scaledDistance = 0;
264
+ this.totalDistance = 0;
265
+
266
+ if (this.lineClips) {
267
+ this.lineClipsArray.push(this.lineClips);
268
+ // Calculate the total distance, in tile units, of this tiled line feature
269
+ for (let i = 0; i < vertices.length - 1; i++) {
270
+ this.totalDistance += vertices[i].dist(vertices[i + 1]);
271
+ }
272
+ this.updateScaledDistance();
273
+ this.maxLineLength = Math.max(this.maxLineLength, this.totalDistance);
274
+ }
275
+
276
+ const isPolygon = vectorTileFeatureTypes[feature.type] === 'Polygon';
277
+
278
+ // If the line has duplicate vertices at the ends, adjust start/length to remove them.
279
+ let len = vertices.length;
280
+ while (len >= 2 && vertices[len - 1].equals(vertices[len - 2])) {
281
+ len--;
282
+ }
283
+ let first = 0;
284
+ while (first < len - 1 && vertices[first].equals(vertices[first + 1])) {
285
+ first++;
286
+ }
287
+
288
+ // Ignore invalid geometry.
289
+ if (len < (isPolygon ? 3 : 2)) return;
290
+
291
+ if (join === 'bevel') miterLimit = 1.05;
292
+
293
+ const sharpCornerOffset = this.overscaling <= 16 ?
294
+ SHARP_CORNER_OFFSET * EXTENT / (512 * this.overscaling) :
295
+ 0;
296
+
297
+ // we could be more precise, but it would only save a negligible amount of space
298
+ const segment = this.segments.prepareSegment(len * 10, this.layoutVertexArray, this.indexArray);
299
+
300
+ let currentVertex;
301
+ let prevVertex = ((undefined: any): Point);
302
+ let nextVertex = ((undefined: any): Point);
303
+ let prevNormal = ((undefined: any): Point);
304
+ let nextNormal = ((undefined: any): Point);
305
+
306
+ // the last two vertices added
307
+ this.e1 = this.e2 = -1;
308
+
309
+ if (isPolygon) {
310
+ currentVertex = vertices[len - 2];
311
+ nextNormal = vertices[first].sub(currentVertex)._unit()._perp();
312
+ }
313
+
314
+ for (let i = first; i < len; i++) {
315
+
316
+ nextVertex = i === len - 1 ?
317
+ (isPolygon ? vertices[first + 1] : (undefined: any)) : // if it's a polygon, treat the last vertex like the first
318
+ vertices[i + 1]; // just the next vertex
319
+
320
+ // if two consecutive vertices exist, skip the current one
321
+ if (nextVertex && vertices[i].equals(nextVertex)) continue;
322
+
323
+ if (nextNormal) prevNormal = nextNormal;
324
+ if (currentVertex) prevVertex = currentVertex;
325
+
326
+ currentVertex = vertices[i];
327
+
328
+ // Calculate the normal towards the next vertex in this line. In case
329
+ // there is no next vertex, pretend that the line is continuing straight,
330
+ // meaning that we are just using the previous normal.
331
+ nextNormal = nextVertex ? nextVertex.sub(currentVertex)._unit()._perp() : prevNormal;
332
+
333
+ // If we still don't have a previous normal, this is the beginning of a
334
+ // non-closed line, so we're doing a straight "join".
335
+ prevNormal = prevNormal || nextNormal;
336
+
337
+ // Determine the normal of the join extrusion. It is the angle bisector
338
+ // of the segments between the previous line and the next line.
339
+ // In the case of 180° angles, the prev and next normals cancel each other out:
340
+ // prevNormal + nextNormal = (0, 0), its magnitude is 0, so the unit vector would be
341
+ // undefined. In that case, we're keeping the joinNormal at (0, 0), so that the cosHalfAngle
342
+ // below will also become 0 and miterLength will become Infinity.
343
+ let joinNormal = prevNormal.add(nextNormal);
344
+ if (joinNormal.x !== 0 || joinNormal.y !== 0) {
345
+ joinNormal._unit();
346
+ }
347
+ /* joinNormal prevNormal
348
+ * ↖ ↑
349
+ * .________. prevVertex
350
+ * |
351
+ * nextNormal ← | currentVertex
352
+ * |
353
+ * nextVertex !
354
+ *
355
+ */
356
+
357
+ // calculate cosines of the angle (and its half) using dot product
358
+ const cosAngle = prevNormal.x * nextNormal.x + prevNormal.y * nextNormal.y;
359
+ const cosHalfAngle = joinNormal.x * nextNormal.x + joinNormal.y * nextNormal.y;
360
+
361
+ // Calculate the length of the miter (the ratio of the miter to the width)
362
+ // as the inverse of cosine of the angle between next and join normals
363
+ const miterLength = cosHalfAngle !== 0 ? 1 / cosHalfAngle : Infinity;
364
+
365
+ // approximate angle from cosine
366
+ const approxAngle = 2 * Math.sqrt(2 - 2 * cosHalfAngle);
367
+
368
+ const isSharpCorner = cosHalfAngle < COS_HALF_SHARP_CORNER && prevVertex && nextVertex;
369
+ const lineTurnsLeft = prevNormal.x * nextNormal.y - prevNormal.y * nextNormal.x > 0;
370
+
371
+ if (isSharpCorner && i > first) {
372
+ const prevSegmentLength = currentVertex.dist(prevVertex);
373
+ if (prevSegmentLength > 2 * sharpCornerOffset) {
374
+ const newPrevVertex = currentVertex.sub(currentVertex.sub(prevVertex)._mult(sharpCornerOffset / prevSegmentLength)._round());
375
+ this.updateDistance(prevVertex, newPrevVertex);
376
+ this.addCurrentVertex(newPrevVertex, prevNormal, 0, 0, segment);
377
+ prevVertex = newPrevVertex;
378
+ }
379
+ }
380
+
381
+ // The join if a middle vertex, otherwise the cap.
382
+ const middleVertex = prevVertex && nextVertex;
383
+ let currentJoin = middleVertex ? join : isPolygon ? 'butt' : cap;
384
+
385
+ if (middleVertex && currentJoin === 'round') {
386
+ if (miterLength < roundLimit) {
387
+ currentJoin = 'miter';
388
+ } else if (miterLength <= 2) {
389
+ currentJoin = 'fakeround';
390
+ }
391
+ }
392
+
393
+ if (currentJoin === 'miter' && miterLength > miterLimit) {
394
+ currentJoin = 'bevel';
395
+ }
396
+
397
+ if (currentJoin === 'bevel') {
398
+ // The maximum extrude length is 128 / 63 = 2 times the width of the line
399
+ // so if miterLength >= 2 we need to draw a different type of bevel here.
400
+ if (miterLength > 2) currentJoin = 'flipbevel';
401
+
402
+ // If the miterLength is really small and the line bevel wouldn't be visible,
403
+ // just draw a miter join to save a triangle.
404
+ if (miterLength < miterLimit) currentJoin = 'miter';
405
+ }
406
+
407
+ // Calculate how far along the line the currentVertex is
408
+ if (prevVertex) this.updateDistance(prevVertex, currentVertex);
409
+
410
+ if (currentJoin === 'miter') {
411
+
412
+ joinNormal._mult(miterLength);
413
+ this.addCurrentVertex(currentVertex, joinNormal, 0, 0, segment);
414
+
415
+ } else if (currentJoin === 'flipbevel') {
416
+ // miter is too big, flip the direction to make a beveled join
417
+
418
+ if (miterLength > 100) {
419
+ // Almost parallel lines
420
+ joinNormal = nextNormal.mult(-1);
421
+
422
+ } else {
423
+ const bevelLength = miterLength * prevNormal.add(nextNormal).mag() / prevNormal.sub(nextNormal).mag();
424
+ joinNormal._perp()._mult(bevelLength * (lineTurnsLeft ? -1 : 1));
425
+ }
426
+ this.addCurrentVertex(currentVertex, joinNormal, 0, 0, segment);
427
+ this.addCurrentVertex(currentVertex, joinNormal.mult(-1), 0, 0, segment);
428
+
429
+ } else if (currentJoin === 'bevel' || currentJoin === 'fakeround') {
430
+ const offset = -Math.sqrt(miterLength * miterLength - 1);
431
+ const offsetA = lineTurnsLeft ? offset : 0;
432
+ const offsetB = lineTurnsLeft ? 0 : offset;
433
+
434
+ // Close previous segment with a bevel
435
+ if (prevVertex) {
436
+ this.addCurrentVertex(currentVertex, prevNormal, offsetA, offsetB, segment);
437
+ }
438
+
439
+ if (currentJoin === 'fakeround') {
440
+ // The join angle is sharp enough that a round join would be visible.
441
+ // Bevel joins fill the gap between segments with a single pie slice triangle.
442
+ // Create a round join by adding multiple pie slices. The join isn't actually round, but
443
+ // it looks like it is at the sizes we render lines at.
444
+
445
+ // pick the number of triangles for approximating round join by based on the angle between normals
446
+ const n = Math.round((approxAngle * 180 / Math.PI) / DEG_PER_TRIANGLE);
447
+
448
+ for (let m = 1; m < n; m++) {
449
+ let t = m / n;
450
+ if (t !== 0.5) {
451
+ // approximate spherical interpolation https://observablehq.com/@mourner/approximating-geometric-slerp
452
+ const t2 = t - 0.5;
453
+ const A = 1.0904 + cosAngle * (-3.2452 + cosAngle * (3.55645 - cosAngle * 1.43519));
454
+ const B = 0.848013 + cosAngle * (-1.06021 + cosAngle * 0.215638);
455
+ t = t + t * t2 * (t - 1) * (A * t2 * t2 + B);
456
+ }
457
+ const extrude = nextNormal.sub(prevNormal)._mult(t)._add(prevNormal)._unit()._mult(lineTurnsLeft ? -1 : 1);
458
+ this.addHalfVertex(currentVertex, extrude.x, extrude.y, false, lineTurnsLeft, 0, segment);
459
+ }
460
+ }
461
+
462
+ if (nextVertex) {
463
+ // Start next segment
464
+ this.addCurrentVertex(currentVertex, nextNormal, -offsetA, -offsetB, segment);
465
+ }
466
+
467
+ } else if (currentJoin === 'butt') {
468
+ this.addCurrentVertex(currentVertex, joinNormal, 0, 0, segment); // butt cap
469
+
470
+ } else if (currentJoin === 'square') {
471
+ const offset = prevVertex ? 1 : -1; // closing or starting square cap
472
+ this.addCurrentVertex(currentVertex, joinNormal, offset, offset, segment);
473
+
474
+ } else if (currentJoin === 'round') {
475
+
476
+ if (prevVertex) {
477
+ // Close previous segment with butt
478
+ this.addCurrentVertex(currentVertex, prevNormal, 0, 0, segment);
479
+
480
+ // Add round cap or linejoin at end of segment
481
+ this.addCurrentVertex(currentVertex, prevNormal, 1, 1, segment, true);
482
+ }
483
+ if (nextVertex) {
484
+ // Add round cap before first segment
485
+ this.addCurrentVertex(currentVertex, nextNormal, -1, -1, segment, true);
486
+
487
+ // Start next segment with a butt
488
+ this.addCurrentVertex(currentVertex, nextNormal, 0, 0, segment);
489
+ }
490
+ }
491
+
492
+ if (isSharpCorner && i < len - 1) {
493
+ const nextSegmentLength = currentVertex.dist(nextVertex);
494
+ if (nextSegmentLength > 2 * sharpCornerOffset) {
495
+ const newCurrentVertex = currentVertex.add(nextVertex.sub(currentVertex)._mult(sharpCornerOffset / nextSegmentLength)._round());
496
+ this.updateDistance(currentVertex, newCurrentVertex);
497
+ this.addCurrentVertex(newCurrentVertex, nextNormal, 0, 0, segment);
498
+ currentVertex = newCurrentVertex;
499
+ }
500
+ }
501
+ }
502
+ }
503
+
504
+ /**
505
+ * Add two vertices to the buffers.
506
+ *
507
+ * @param p the line vertex to add buffer vertices for
508
+ * @param normal vertex normal
509
+ * @param endLeft extrude to shift the left vertex along the line
510
+ * @param endRight extrude to shift the left vertex along the line
511
+ * @param segment the segment object to add the vertex to
512
+ * @param round whether this is a round cap
513
+ * @private
514
+ */
515
+ addCurrentVertex(p: Point, normal: Point, endLeft: number, endRight: number, segment: Segment, round: boolean = false) {
516
+ // left and right extrude vectors, perpendicularly shifted by endLeft/endRight
517
+ const leftX = normal.x + normal.y * endLeft;
518
+ const leftY = normal.y - normal.x * endLeft;
519
+ const rightX = -normal.x + normal.y * endRight;
520
+ const rightY = -normal.y - normal.x * endRight;
521
+
522
+ this.addHalfVertex(p, leftX, leftY, round, false, endLeft, segment);
523
+ this.addHalfVertex(p, rightX, rightY, round, true, -endRight, segment);
524
+
525
+ // There is a maximum "distance along the line" that we can store in the buffers.
526
+ // When we get close to the distance, reset it to zero and add the vertex again with
527
+ // a distance of zero. The max distance is determined by the number of bits we allocate
528
+ // to `linesofar`.
529
+ if (this.distance > MAX_LINE_DISTANCE / 2 && this.totalDistance === 0) {
530
+ this.distance = 0;
531
+ this.addCurrentVertex(p, normal, endLeft, endRight, segment, round);
532
+ }
533
+ }
534
+
535
+ addHalfVertex({x, y}: Point, extrudeX: number, extrudeY: number, round: boolean, up: boolean, dir: number, segment: Segment) {
536
+ const totalDistance = this.lineClips ? this.scaledDistance * (MAX_LINE_DISTANCE - 1) : this.scaledDistance;
537
+ // scale down so that we can store longer distances while sacrificing precision.
538
+ const linesofarScaled = totalDistance * LINE_DISTANCE_SCALE;
539
+
540
+ this.layoutVertexArray.emplaceBack(
541
+ // a_pos_normal
542
+ // Encode round/up the least significant bits
543
+ (x << 1) + (round ? 1 : 0),
544
+ (y << 1) + (up ? 1 : 0),
545
+ // a_data
546
+ // add 128 to store a byte in an unsigned byte
547
+ Math.round(EXTRUDE_SCALE * extrudeX) + 128,
548
+ Math.round(EXTRUDE_SCALE * extrudeY) + 128,
549
+ // Encode the -1/0/1 direction value into the first two bits of .z of a_data.
550
+ // Combine it with the lower 6 bits of `linesofarScaled` (shifted by 2 bits to make
551
+ // room for the direction value). The upper 8 bits of `linesofarScaled` are placed in
552
+ // the `w` component.
553
+ ((dir === 0 ? 0 : (dir < 0 ? -1 : 1)) + 1) | ((linesofarScaled & 0x3F) << 2),
554
+ linesofarScaled >> 6);
555
+
556
+ // Constructs a second vertex buffer with higher precision line progress
557
+ if (this.lineClips) {
558
+ const progressRealigned = this.scaledDistance - this.lineClips.start;
559
+ const endClipRealigned = this.lineClips.end - this.lineClips.start;
560
+ const uvX = progressRealigned / endClipRealigned;
561
+ this.layoutVertexArray2.emplaceBack(uvX, this.lineClipsArray.length);
562
+ }
563
+
564
+ const e = segment.vertexLength++;
565
+ if (this.e1 >= 0 && this.e2 >= 0) {
566
+ this.indexArray.emplaceBack(this.e1, this.e2, e);
567
+ segment.primitiveLength++;
568
+ }
569
+ if (up) {
570
+ this.e2 = e;
571
+ } else {
572
+ this.e1 = e;
573
+ }
574
+ }
575
+
576
+ updateScaledDistance() {
577
+ // Knowing the ratio of the full linestring covered by this tiled feature, as well
578
+ // as the total distance (in tile units) of this tiled feature, and the distance
579
+ // (in tile units) of the current vertex, we can determine the relative distance
580
+ // of this vertex along the full linestring feature and scale it to [0, 2^15)
581
+ this.scaledDistance = this.lineClips ?
582
+ this.lineClips.start + (this.lineClips.end - this.lineClips.start) * this.distance / this.totalDistance :
583
+ this.distance;
584
+ }
585
+
586
+ updateDistance(prev: Point, next: Point) {
587
+ this.distance += prev.dist(next);
588
+ this.updateScaledDistance();
589
+ }
590
+ }
591
+
592
+ register('LineBucket', LineBucket, {omit: ['layers', 'patternFeatures']});
593
+
594
+ export default LineBucket;
@@ -0,0 +1,12 @@
1
+ // @flow
2
+ import {createLayout} from '../../util/struct_array';
3
+
4
+ const patternAttributes = createLayout([
5
+ // [tl.x, tl.y, br.x, br.y]
6
+ {name: 'a_pattern_from', components: 4, type: 'Uint16'},
7
+ {name: 'a_pattern_to', components: 4, type: 'Uint16'},
8
+ {name: 'a_pixel_ratio_from', components: 1, type: 'Uint16'},
9
+ {name: 'a_pixel_ratio_to', components: 1, type: 'Uint16'},
10
+ ]);
11
+
12
+ export default patternAttributes;
@@ -0,0 +1,60 @@
1
+ // @flow
2
+ import type FillStyleLayer from '../../style/style_layer/fill_style_layer';
3
+ import type FillExtrusionStyleLayer from '../../style/style_layer/fill_extrusion_style_layer';
4
+ import type LineStyleLayer from '../../style/style_layer/line_style_layer';
5
+
6
+ import type {
7
+ BucketFeature,
8
+ PopulateParameters
9
+ } from '../bucket';
10
+
11
+ type PatternStyleLayers =
12
+ Array<LineStyleLayer> |
13
+ Array<FillStyleLayer> |
14
+ Array<FillExtrusionStyleLayer>;
15
+
16
+ export function hasPattern(type: string, layers: PatternStyleLayers, options: PopulateParameters) {
17
+ const patterns = options.patternDependencies;
18
+ let hasPattern = false;
19
+
20
+ for (const layer of layers) {
21
+ const patternProperty = layer.paint.get(`${type}-pattern`);
22
+ if (!patternProperty.isConstant()) {
23
+ hasPattern = true;
24
+ }
25
+
26
+ const constantPattern = patternProperty.constantOr(null);
27
+ if (constantPattern) {
28
+ hasPattern = true;
29
+ patterns[constantPattern.to] = true;
30
+ patterns[constantPattern.from] = true;
31
+ }
32
+ }
33
+
34
+ return hasPattern;
35
+ }
36
+
37
+ export function addPatternDependencies(type: string, layers: PatternStyleLayers, patternFeature: BucketFeature, zoom: number, options: PopulateParameters) {
38
+ const patterns = options.patternDependencies;
39
+ for (const layer of layers) {
40
+ const patternProperty = layer.paint.get(`${type}-pattern`);
41
+
42
+ const patternPropertyValue = patternProperty.value;
43
+ if (patternPropertyValue.kind !== "constant") {
44
+ let min = patternPropertyValue.evaluate({zoom: zoom - 1}, patternFeature, {}, options.availableImages);
45
+ let mid = patternPropertyValue.evaluate({zoom}, patternFeature, {}, options.availableImages);
46
+ let max = patternPropertyValue.evaluate({zoom: zoom + 1}, patternFeature, {}, options.availableImages);
47
+ min = min && min.name ? min.name : min;
48
+ mid = mid && mid.name ? mid.name : mid;
49
+ max = max && max.name ? max.name : max;
50
+ // add to patternDependencies
51
+ patterns[min] = true;
52
+ patterns[mid] = true;
53
+ patterns[max] = true;
54
+
55
+ // save for layout
56
+ patternFeature.patterns[layer.id] = {min, mid, max};
57
+ }
58
+ }
59
+ return patternFeature;
60
+ }