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,71 @@
1
+ // @flow
2
+
3
+ import {AlphaImage} from '../util/image';
4
+ import {register} from '../util/web_worker_transfer';
5
+ import potpack from 'potpack';
6
+
7
+ import type {GlyphMetrics, StyleGlyph} from '../style/style_glyph';
8
+
9
+ const padding = 1;
10
+
11
+ export type Rect = {
12
+ x: number,
13
+ y: number,
14
+ w: number,
15
+ h: number
16
+ };
17
+
18
+ export type GlyphPosition = {
19
+ rect: Rect,
20
+ metrics: GlyphMetrics
21
+ };
22
+
23
+ export type GlyphPositions = {[_: string]: {[_: number]: GlyphPosition } }
24
+
25
+ export default class GlyphAtlas {
26
+ image: AlphaImage;
27
+ positions: GlyphPositions;
28
+
29
+ constructor(stacks: {[_: string]: {[_: number]: ?StyleGlyph } }) {
30
+ const positions = {};
31
+ const bins = [];
32
+
33
+ for (const stack in stacks) {
34
+ const glyphs = stacks[stack];
35
+ const stackPositions = positions[stack] = {};
36
+
37
+ for (const id in glyphs) {
38
+ const src = glyphs[+id];
39
+ if (!src || src.bitmap.width === 0 || src.bitmap.height === 0) continue;
40
+
41
+ const bin = {
42
+ x: 0,
43
+ y: 0,
44
+ w: src.bitmap.width + 2 * padding,
45
+ h: src.bitmap.height + 2 * padding
46
+ };
47
+ bins.push(bin);
48
+ stackPositions[id] = {rect: bin, metrics: src.metrics};
49
+ }
50
+ }
51
+
52
+ const {w, h} = potpack(bins);
53
+ const image = new AlphaImage({width: w || 1, height: h || 1});
54
+
55
+ for (const stack in stacks) {
56
+ const glyphs = stacks[stack];
57
+
58
+ for (const id in glyphs) {
59
+ const src = glyphs[+id];
60
+ if (!src || src.bitmap.width === 0 || src.bitmap.height === 0) continue;
61
+ const bin = positions[stack][id].rect;
62
+ AlphaImage.copy(src.bitmap, image, {x: 0, y: 0}, {x: bin.x + padding, y: bin.y + padding}, src.bitmap);
63
+ }
64
+ }
65
+
66
+ this.image = image;
67
+ this.positions = positions;
68
+ }
69
+ }
70
+
71
+ register('GlyphAtlas', GlyphAtlas);
@@ -0,0 +1,182 @@
1
+ // @flow
2
+
3
+ import loadGlyphRange from '../style/load_glyph_range';
4
+
5
+ import TinySDF from '@mapbox/tiny-sdf';
6
+ import isChar from '../util/is_char_in_unicode_block';
7
+ import {asyncAll} from '../util/util';
8
+ import {AlphaImage} from '../util/image';
9
+
10
+ import type {StyleGlyph} from '../style/style_glyph';
11
+ import type {RequestManager} from '../util/mapbox';
12
+ import type {Callback} from '../types/callback';
13
+
14
+ type Entry = {
15
+ // null means we've requested the range, but the glyph wasn't included in the result.
16
+ glyphs: {[id: number]: StyleGlyph | null},
17
+ requests: {[range: number]: Array<Callback<{[_: number]: StyleGlyph | null}>>},
18
+ ranges: {[range: number]: boolean | null},
19
+ tinySDF?: TinySDF
20
+ };
21
+
22
+ class GlyphManager {
23
+ requestManager: RequestManager;
24
+ localIdeographFontFamily: ?string;
25
+ entries: {[_: string]: Entry};
26
+ url: ?string;
27
+
28
+ // exposed as statics to enable stubbing in unit tests
29
+ static loadGlyphRange: typeof loadGlyphRange;
30
+ static TinySDF: Class<TinySDF>;
31
+
32
+ constructor(requestManager: RequestManager, localIdeographFontFamily: ?string) {
33
+ this.requestManager = requestManager;
34
+ this.localIdeographFontFamily = localIdeographFontFamily;
35
+ this.entries = {};
36
+ }
37
+
38
+ setURL(url: ?string) {
39
+ this.url = url;
40
+ }
41
+
42
+ getGlyphs(glyphs: {[stack: string]: Array<number>}, callback: Callback<{[stack: string]: {[id: number]: ?StyleGlyph}}>) {
43
+ const all = [];
44
+
45
+ for (const stack in glyphs) {
46
+ for (const id of glyphs[stack]) {
47
+ all.push({stack, id});
48
+ }
49
+ }
50
+
51
+ asyncAll(all, ({stack, id}, callback: Callback<{stack: string, id: number, glyph: ?StyleGlyph}>) => {
52
+ let entry = this.entries[stack];
53
+ if (!entry) {
54
+ entry = this.entries[stack] = {
55
+ glyphs: {},
56
+ requests: {},
57
+ ranges: {}
58
+ };
59
+ }
60
+
61
+ let glyph = entry.glyphs[id];
62
+ if (glyph !== undefined) {
63
+ callback(null, {stack, id, glyph});
64
+ return;
65
+ }
66
+
67
+ glyph = this._tinySDF(entry, stack, id);
68
+ if (glyph) {
69
+ entry.glyphs[id] = glyph;
70
+ callback(null, {stack, id, glyph});
71
+ return;
72
+ }
73
+
74
+ const range = Math.floor(id / 256);
75
+ if (range * 256 > 65535) {
76
+ callback(new Error('glyphs > 65535 not supported'));
77
+ return;
78
+ }
79
+
80
+ if (entry.ranges[range]) {
81
+ callback(null, {stack, id, glyph});
82
+ return;
83
+ }
84
+
85
+ let requests = entry.requests[range];
86
+ if (!requests) {
87
+ requests = entry.requests[range] = [];
88
+ GlyphManager.loadGlyphRange(stack, range, (this.url: any), this.requestManager,
89
+ (err, response: ?{[_: number]: StyleGlyph | null}) => {
90
+ if (response) {
91
+ for (const id in response) {
92
+ if (!this._doesCharSupportLocalGlyph(+id)) {
93
+ entry.glyphs[+id] = response[+id];
94
+ }
95
+ }
96
+ entry.ranges[range] = true;
97
+ }
98
+ for (const cb of requests) {
99
+ cb(err, response);
100
+ }
101
+ delete entry.requests[range];
102
+ });
103
+ }
104
+
105
+ requests.push((err, result: ?{[_: number]: StyleGlyph | null}) => {
106
+ if (err) {
107
+ callback(err);
108
+ } else if (result) {
109
+ callback(null, {stack, id, glyph: result[id] || null});
110
+ }
111
+ });
112
+ }, (err, glyphs: ?Array<{stack: string, id: number, glyph: ?StyleGlyph}>) => {
113
+ if (err) {
114
+ callback(err);
115
+ } else if (glyphs) {
116
+ const result = {};
117
+
118
+ for (const {stack, id, glyph} of glyphs) {
119
+ // Clone the glyph so that our own copy of its ArrayBuffer doesn't get transferred.
120
+ (result[stack] || (result[stack] = {}))[id] = glyph && {
121
+ id: glyph.id,
122
+ bitmap: glyph.bitmap.clone(),
123
+ metrics: glyph.metrics
124
+ };
125
+ }
126
+
127
+ callback(null, result);
128
+ }
129
+ });
130
+ }
131
+
132
+ _doesCharSupportLocalGlyph(id: number): boolean {
133
+ /* eslint-disable new-cap */
134
+ return !!this.localIdeographFontFamily &&
135
+ (isChar['CJK Unified Ideographs'](id) ||
136
+ isChar['Hangul Syllables'](id) ||
137
+ isChar['Hiragana'](id) ||
138
+ isChar['Katakana'](id));
139
+ /* eslint-enable new-cap */
140
+ }
141
+
142
+ _tinySDF(entry: Entry, stack: string, id: number): ?StyleGlyph {
143
+ const family = this.localIdeographFontFamily;
144
+ if (!family) {
145
+ return;
146
+ }
147
+
148
+ if (!this._doesCharSupportLocalGlyph(id)) {
149
+ return;
150
+ }
151
+
152
+ let tinySDF = entry.tinySDF;
153
+ if (!tinySDF) {
154
+ let fontWeight = '400';
155
+ if (/bold/i.test(stack)) {
156
+ fontWeight = '900';
157
+ } else if (/medium/i.test(stack)) {
158
+ fontWeight = '500';
159
+ } else if (/light/i.test(stack)) {
160
+ fontWeight = '200';
161
+ }
162
+ tinySDF = entry.tinySDF = new GlyphManager.TinySDF(24, 3, 8, .25, family, fontWeight);
163
+ }
164
+
165
+ return {
166
+ id,
167
+ bitmap: new AlphaImage({width: 30, height: 30}, tinySDF.draw(String.fromCharCode(id))),
168
+ metrics: {
169
+ width: 24,
170
+ height: 24,
171
+ left: 0,
172
+ top: -8,
173
+ advance: 24
174
+ }
175
+ };
176
+ }
177
+ }
178
+
179
+ GlyphManager.loadGlyphRange = loadGlyphRange;
180
+ GlyphManager.TinySDF = TinySDF;
181
+
182
+ export default GlyphManager;
@@ -0,0 +1,149 @@
1
+ // @flow
2
+
3
+ import {RGBAImage} from '../util/image';
4
+ import {register} from '../util/web_worker_transfer';
5
+ import potpack from 'potpack';
6
+
7
+ import type {StyleImage} from '../style/style_image';
8
+ import type ImageManager from './image_manager';
9
+ import type Texture from './texture';
10
+
11
+ const IMAGE_PADDING: number = 1;
12
+ export {IMAGE_PADDING};
13
+
14
+ type Rect = {
15
+ x: number,
16
+ y: number,
17
+ w: number,
18
+ h: number
19
+ };
20
+
21
+ export class ImagePosition {
22
+ paddedRect: Rect;
23
+ pixelRatio: number;
24
+ version: number;
25
+ stretchY: ?Array<[number, number]>;
26
+ stretchX: ?Array<[number, number]>;
27
+ content: ?[number, number, number, number];
28
+
29
+ constructor(paddedRect: Rect, {pixelRatio, version, stretchX, stretchY, content}: StyleImage) {
30
+ this.paddedRect = paddedRect;
31
+ this.pixelRatio = pixelRatio;
32
+ this.stretchX = stretchX;
33
+ this.stretchY = stretchY;
34
+ this.content = content;
35
+ this.version = version;
36
+ }
37
+
38
+ get tl(): [number, number] {
39
+ return [
40
+ this.paddedRect.x + IMAGE_PADDING,
41
+ this.paddedRect.y + IMAGE_PADDING
42
+ ];
43
+ }
44
+
45
+ get br(): [number, number] {
46
+ return [
47
+ this.paddedRect.x + this.paddedRect.w - IMAGE_PADDING,
48
+ this.paddedRect.y + this.paddedRect.h - IMAGE_PADDING
49
+ ];
50
+ }
51
+
52
+ get tlbr(): Array<number> {
53
+ return this.tl.concat(this.br);
54
+ }
55
+
56
+ get displaySize(): [number, number] {
57
+ return [
58
+ (this.paddedRect.w - IMAGE_PADDING * 2) / this.pixelRatio,
59
+ (this.paddedRect.h - IMAGE_PADDING * 2) / this.pixelRatio
60
+ ];
61
+ }
62
+ }
63
+
64
+ export default class ImageAtlas {
65
+ image: RGBAImage;
66
+ iconPositions: {[_: string]: ImagePosition};
67
+ patternPositions: {[_: string]: ImagePosition};
68
+ haveRenderCallbacks: Array<string>;
69
+ uploaded: ?boolean;
70
+
71
+ constructor(icons: {[_: string]: StyleImage}, patterns: {[_: string]: StyleImage}) {
72
+ const iconPositions = {}, patternPositions = {};
73
+ this.haveRenderCallbacks = [];
74
+
75
+ const bins = [];
76
+
77
+ this.addImages(icons, iconPositions, bins);
78
+ this.addImages(patterns, patternPositions, bins);
79
+
80
+ const {w, h} = potpack(bins);
81
+ const image = new RGBAImage({width: w || 1, height: h || 1});
82
+
83
+ for (const id in icons) {
84
+ const src = icons[id];
85
+ const bin = iconPositions[id].paddedRect;
86
+ RGBAImage.copy(src.data, image, {x: 0, y: 0}, {x: bin.x + IMAGE_PADDING, y: bin.y + IMAGE_PADDING}, src.data);
87
+ }
88
+
89
+ for (const id in patterns) {
90
+ const src = patterns[id];
91
+ const bin = patternPositions[id].paddedRect;
92
+ const x = bin.x + IMAGE_PADDING,
93
+ y = bin.y + IMAGE_PADDING,
94
+ w = src.data.width,
95
+ h = src.data.height;
96
+
97
+ RGBAImage.copy(src.data, image, {x: 0, y: 0}, {x, y}, src.data);
98
+ // Add 1 pixel wrapped padding on each side of the image.
99
+ RGBAImage.copy(src.data, image, {x: 0, y: h - 1}, {x, y: y - 1}, {width: w, height: 1}); // T
100
+ RGBAImage.copy(src.data, image, {x: 0, y: 0}, {x, y: y + h}, {width: w, height: 1}); // B
101
+ RGBAImage.copy(src.data, image, {x: w - 1, y: 0}, {x: x - 1, y}, {width: 1, height: h}); // L
102
+ RGBAImage.copy(src.data, image, {x: 0, y: 0}, {x: x + w, y}, {width: 1, height: h}); // R
103
+ }
104
+
105
+ this.image = image;
106
+ this.iconPositions = iconPositions;
107
+ this.patternPositions = patternPositions;
108
+ }
109
+
110
+ addImages(images: {[_: string]: StyleImage}, positions: {[_: string]: ImagePosition}, bins: Array<Rect>) {
111
+ for (const id in images) {
112
+ const src = images[id];
113
+ const bin = {
114
+ x: 0,
115
+ y: 0,
116
+ w: src.data.width + 2 * IMAGE_PADDING,
117
+ h: src.data.height + 2 * IMAGE_PADDING,
118
+ };
119
+ bins.push(bin);
120
+ positions[id] = new ImagePosition(bin, src);
121
+
122
+ if (src.hasRenderCallback) {
123
+ this.haveRenderCallbacks.push(id);
124
+ }
125
+ }
126
+ }
127
+
128
+ patchUpdatedImages(imageManager: ImageManager, texture: Texture) {
129
+ imageManager.dispatchRenderCallbacks(this.haveRenderCallbacks);
130
+ for (const name in imageManager.updatedImages) {
131
+ this.patchUpdatedImage(this.iconPositions[name], imageManager.getImage(name), texture);
132
+ this.patchUpdatedImage(this.patternPositions[name], imageManager.getImage(name), texture);
133
+ }
134
+ }
135
+
136
+ patchUpdatedImage(position: ?ImagePosition, image: ?StyleImage, texture: Texture) {
137
+ if (!position || !image) return;
138
+
139
+ if (position.version === image.version) return;
140
+
141
+ position.version = image.version;
142
+ const [x, y] = position.tl;
143
+ texture.update(image.data, undefined, {x, y});
144
+ }
145
+
146
+ }
147
+
148
+ register('ImagePosition', ImagePosition);
149
+ register('ImageAtlas', ImageAtlas);
@@ -0,0 +1,306 @@
1
+ // @flow
2
+
3
+ import potpack from 'potpack';
4
+
5
+ import {Event, ErrorEvent, Evented} from '../util/evented';
6
+ import {RGBAImage} from '../util/image';
7
+ import {ImagePosition} from './image_atlas';
8
+ import Texture from './texture';
9
+ import assert from 'assert';
10
+ import {renderStyleImage} from '../style/style_image';
11
+ import {warnOnce} from '../util/util';
12
+
13
+ import type {StyleImage} from '../style/style_image';
14
+ import type Context from '../gl/context';
15
+ import type {Bin} from 'potpack';
16
+ import type {Callback} from '../types/callback';
17
+
18
+ type Pattern = {
19
+ bin: Bin,
20
+ position: ImagePosition
21
+ };
22
+
23
+ // When copied into the atlas texture, image data is padded by one pixel on each side. Icon
24
+ // images are padded with fully transparent pixels, while pattern images are padded with a
25
+ // copy of the image data wrapped from the opposite side. In both cases, this ensures the
26
+ // correct behavior of GL_LINEAR texture sampling mode.
27
+ const padding = 1;
28
+
29
+ /*
30
+ ImageManager does three things:
31
+
32
+ 1. Tracks requests for icon images from tile workers and sends responses when the requests are fulfilled.
33
+ 2. Builds a texture atlas for pattern images.
34
+ 3. Rerenders renderable images once per frame
35
+
36
+ These are disparate responsibilities and should eventually be handled by different classes. When we implement
37
+ data-driven support for `*-pattern`, we'll likely use per-bucket pattern atlases, and that would be a good time
38
+ to refactor this.
39
+ */
40
+ class ImageManager extends Evented {
41
+ images: {[_: string]: StyleImage};
42
+ updatedImages: {[_: string]: boolean};
43
+ callbackDispatchedThisFrame: {[_: string]: boolean};
44
+ loaded: boolean;
45
+ requestors: Array<{ids: Array<string>, callback: Callback<{[_: string]: StyleImage}>}>;
46
+
47
+ patterns: {[_: string]: Pattern};
48
+ atlasImage: RGBAImage;
49
+ atlasTexture: ?Texture;
50
+ dirty: boolean;
51
+
52
+ constructor() {
53
+ super();
54
+ this.images = {};
55
+ this.updatedImages = {};
56
+ this.callbackDispatchedThisFrame = {};
57
+ this.loaded = false;
58
+ this.requestors = [];
59
+
60
+ this.patterns = {};
61
+ this.atlasImage = new RGBAImage({width: 1, height: 1});
62
+ this.dirty = true;
63
+ }
64
+
65
+ isLoaded() {
66
+ return this.loaded;
67
+ }
68
+
69
+ setLoaded(loaded: boolean) {
70
+ if (this.loaded === loaded) {
71
+ return;
72
+ }
73
+
74
+ this.loaded = loaded;
75
+
76
+ if (loaded) {
77
+ for (const {ids, callback} of this.requestors) {
78
+ this._notify(ids, callback);
79
+ }
80
+ this.requestors = [];
81
+ }
82
+ }
83
+
84
+ getImage(id: string): ?StyleImage {
85
+ return this.images[id];
86
+ }
87
+
88
+ addImage(id: string, image: StyleImage) {
89
+ assert(!this.images[id]);
90
+ if (this._validate(id, image)) {
91
+ this.images[id] = image;
92
+ }
93
+ }
94
+
95
+ _validate(id: string, image: StyleImage) {
96
+ let valid = true;
97
+ if (!this._validateStretch(image.stretchX, image.data && image.data.width)) {
98
+ this.fire(new ErrorEvent(new Error(`Image "${id}" has invalid "stretchX" value`)));
99
+ valid = false;
100
+ }
101
+ if (!this._validateStretch(image.stretchY, image.data && image.data.height)) {
102
+ this.fire(new ErrorEvent(new Error(`Image "${id}" has invalid "stretchY" value`)));
103
+ valid = false;
104
+ }
105
+ if (!this._validateContent(image.content, image)) {
106
+ this.fire(new ErrorEvent(new Error(`Image "${id}" has invalid "content" value`)));
107
+ valid = false;
108
+ }
109
+ return valid;
110
+ }
111
+
112
+ _validateStretch(stretch: ?Array<[number, number]> | void, size: number) {
113
+ if (!stretch) return true;
114
+ let last = 0;
115
+ for (const part of stretch) {
116
+ if (part[0] < last || part[1] < part[0] || size < part[1]) return false;
117
+ last = part[1];
118
+ }
119
+ return true;
120
+ }
121
+
122
+ _validateContent(content: ?[number, number, number, number] | void, image: StyleImage) {
123
+ if (!content) return true;
124
+ if (content.length !== 4) return false;
125
+ if (content[0] < 0 || image.data.width < content[0]) return false;
126
+ if (content[1] < 0 || image.data.height < content[1]) return false;
127
+ if (content[2] < 0 || image.data.width < content[2]) return false;
128
+ if (content[3] < 0 || image.data.height < content[3]) return false;
129
+ if (content[2] < content[0]) return false;
130
+ if (content[3] < content[1]) return false;
131
+ return true;
132
+ }
133
+
134
+ updateImage(id: string, image: StyleImage) {
135
+ const oldImage = this.images[id];
136
+ assert(oldImage);
137
+ assert(oldImage.data.width === image.data.width);
138
+ assert(oldImage.data.height === image.data.height);
139
+ image.version = oldImage.version + 1;
140
+ this.images[id] = image;
141
+ this.updatedImages[id] = true;
142
+ }
143
+
144
+ removeImage(id: string) {
145
+ assert(this.images[id]);
146
+ const image = this.images[id];
147
+ delete this.images[id];
148
+ delete this.patterns[id];
149
+
150
+ if (image.userImage && image.userImage.onRemove) {
151
+ image.userImage.onRemove();
152
+ }
153
+ }
154
+
155
+ listImages(): Array<string> {
156
+ return Object.keys(this.images);
157
+ }
158
+
159
+ getImages(ids: Array<string>, callback: Callback<{[_: string]: StyleImage}>) {
160
+ // If the sprite has been loaded, or if all the icon dependencies are already present
161
+ // (i.e. if they've been added via runtime styling), then notify the requestor immediately.
162
+ // Otherwise, delay notification until the sprite is loaded. At that point, if any of the
163
+ // dependencies are still unavailable, we'll just assume they are permanently missing.
164
+ let hasAllDependencies = true;
165
+ if (!this.isLoaded()) {
166
+ for (const id of ids) {
167
+ if (!this.images[id]) {
168
+ hasAllDependencies = false;
169
+ }
170
+ }
171
+ }
172
+ if (this.isLoaded() || hasAllDependencies) {
173
+ this._notify(ids, callback);
174
+ } else {
175
+ this.requestors.push({ids, callback});
176
+ }
177
+ }
178
+
179
+ _notify(ids: Array<string>, callback: Callback<{[_: string]: StyleImage}>) {
180
+ const response = {};
181
+
182
+ for (const id of ids) {
183
+ if (!this.images[id]) {
184
+ this.fire(new Event('styleimagemissing', {id}));
185
+ }
186
+ const image = this.images[id];
187
+ if (image) {
188
+ // Clone the image so that our own copy of its ArrayBuffer doesn't get transferred.
189
+ response[id] = {
190
+ data: image.data.clone(),
191
+ pixelRatio: image.pixelRatio,
192
+ sdf: image.sdf,
193
+ version: image.version,
194
+ stretchX: image.stretchX,
195
+ stretchY: image.stretchY,
196
+ content: image.content,
197
+ hasRenderCallback: Boolean(image.userImage && image.userImage.render)
198
+ };
199
+ } else {
200
+ warnOnce(`Image "${id}" could not be loaded. Please make sure you have added the image with map.addImage() or a "sprite" property in your style. You can provide missing images by listening for the "styleimagemissing" map event.`);
201
+ }
202
+ }
203
+
204
+ callback(null, response);
205
+ }
206
+
207
+ // Pattern stuff
208
+
209
+ getPixelSize() {
210
+ const {width, height} = this.atlasImage;
211
+ return {width, height};
212
+ }
213
+
214
+ getPattern(id: string): ?ImagePosition {
215
+ const pattern = this.patterns[id];
216
+
217
+ const image = this.getImage(id);
218
+ if (!image) {
219
+ return null;
220
+ }
221
+
222
+ if (pattern && pattern.position.version === image.version) {
223
+ return pattern.position;
224
+ }
225
+
226
+ if (!pattern) {
227
+ const w = image.data.width + padding * 2;
228
+ const h = image.data.height + padding * 2;
229
+ const bin = {w, h, x: 0, y: 0};
230
+ const position = new ImagePosition(bin, image);
231
+ this.patterns[id] = {bin, position};
232
+ } else {
233
+ pattern.position.version = image.version;
234
+ }
235
+
236
+ this._updatePatternAtlas();
237
+
238
+ return this.patterns[id].position;
239
+ }
240
+
241
+ bind(context: Context) {
242
+ const gl = context.gl;
243
+ if (!this.atlasTexture) {
244
+ this.atlasTexture = new Texture(context, this.atlasImage, gl.RGBA);
245
+ } else if (this.dirty) {
246
+ this.atlasTexture.update(this.atlasImage);
247
+ this.dirty = false;
248
+ }
249
+
250
+ this.atlasTexture.bind(gl.LINEAR, gl.CLAMP_TO_EDGE);
251
+ }
252
+
253
+ _updatePatternAtlas() {
254
+ const bins = [];
255
+ for (const id in this.patterns) {
256
+ bins.push(this.patterns[id].bin);
257
+ }
258
+
259
+ const {w, h} = potpack(bins);
260
+
261
+ const dst = this.atlasImage;
262
+ dst.resize({width: w || 1, height: h || 1});
263
+
264
+ for (const id in this.patterns) {
265
+ const {bin} = this.patterns[id];
266
+ const x = bin.x + padding;
267
+ const y = bin.y + padding;
268
+ const src = this.images[id].data;
269
+ const w = src.width;
270
+ const h = src.height;
271
+
272
+ RGBAImage.copy(src, dst, {x: 0, y: 0}, {x, y}, {width: w, height: h});
273
+
274
+ // Add 1 pixel wrapped padding on each side of the image.
275
+ RGBAImage.copy(src, dst, {x: 0, y: h - 1}, {x, y: y - 1}, {width: w, height: 1}); // T
276
+ RGBAImage.copy(src, dst, {x: 0, y: 0}, {x, y: y + h}, {width: w, height: 1}); // B
277
+ RGBAImage.copy(src, dst, {x: w - 1, y: 0}, {x: x - 1, y}, {width: 1, height: h}); // L
278
+ RGBAImage.copy(src, dst, {x: 0, y: 0}, {x: x + w, y}, {width: 1, height: h}); // R
279
+ }
280
+
281
+ this.dirty = true;
282
+ }
283
+
284
+ beginFrame() {
285
+ this.callbackDispatchedThisFrame = {};
286
+ }
287
+
288
+ dispatchRenderCallbacks(ids: Array<string>) {
289
+ for (const id of ids) {
290
+
291
+ // the callback for the image was already dispatched for a different frame
292
+ if (this.callbackDispatchedThisFrame[id]) continue;
293
+ this.callbackDispatchedThisFrame[id] = true;
294
+
295
+ const image = this.images[id];
296
+ assert(image);
297
+
298
+ const updated = renderStyleImage(image);
299
+ if (updated) {
300
+ this.updateImage(id, image);
301
+ }
302
+ }
303
+ }
304
+ }
305
+
306
+ export default ImageManager;