@mapwhit/tilerenderer 0.47.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (356) hide show
  1. package/LICENSE.txt +87 -0
  2. package/README.md +25 -0
  3. package/build/min/.dir +0 -0
  4. package/build/min/package.json +3 -0
  5. package/build/min/src/shaders/_prelude.fragment.glsl.txt +13 -0
  6. package/build/min/src/shaders/_prelude.vertex.glsl.txt +14 -0
  7. package/build/min/src/shaders/background.fragment.glsl.txt +5 -0
  8. package/build/min/src/shaders/background.vertex.glsl.txt +1 -0
  9. package/build/min/src/shaders/background_pattern.fragment.glsl.txt +5 -0
  10. package/build/min/src/shaders/background_pattern.vertex.glsl.txt +1 -0
  11. package/build/min/src/shaders/circle.fragment.glsl.txt +20 -0
  12. package/build/min/src/shaders/circle.vertex.glsl.txt +17 -0
  13. package/build/min/src/shaders/clipping_mask.fragment.glsl.txt +1 -0
  14. package/build/min/src/shaders/clipping_mask.vertex.glsl.txt +1 -0
  15. package/build/min/src/shaders/collision_box.fragment.glsl.txt +1 -0
  16. package/build/min/src/shaders/collision_box.vertex.glsl.txt +1 -0
  17. package/build/min/src/shaders/collision_circle.fragment.glsl.txt +1 -0
  18. package/build/min/src/shaders/collision_circle.vertex.glsl.txt +1 -0
  19. package/build/min/src/shaders/debug.fragment.glsl.txt +1 -0
  20. package/build/min/src/shaders/debug.vertex.glsl.txt +1 -0
  21. package/build/min/src/shaders/fill.fragment.glsl.txt +10 -0
  22. package/build/min/src/shaders/fill.vertex.glsl.txt +7 -0
  23. package/build/min/src/shaders/fill_extrusion.fragment.glsl.txt +13 -0
  24. package/build/min/src/shaders/fill_extrusion.vertex.glsl.txt +9 -0
  25. package/build/min/src/shaders/fill_extrusion_pattern.fragment.glsl.txt +15 -0
  26. package/build/min/src/shaders/fill_extrusion_pattern.vertex.glsl.txt +11 -0
  27. package/build/min/src/shaders/fill_outline.fragment.glsl.txt +10 -0
  28. package/build/min/src/shaders/fill_outline.vertex.glsl.txt +7 -0
  29. package/build/min/src/shaders/fill_outline_pattern.fragment.glsl.txt +13 -0
  30. package/build/min/src/shaders/fill_outline_pattern.vertex.glsl.txt +9 -0
  31. package/build/min/src/shaders/fill_pattern.fragment.glsl.txt +13 -0
  32. package/build/min/src/shaders/fill_pattern.vertex.glsl.txt +9 -0
  33. package/build/min/src/shaders/heatmap.fragment.glsl.txt +10 -0
  34. package/build/min/src/shaders/heatmap.vertex.glsl.txt +8 -0
  35. package/build/min/src/shaders/heatmap_texture.fragment.glsl.txt +5 -0
  36. package/build/min/src/shaders/heatmap_texture.vertex.glsl.txt +1 -0
  37. package/build/min/src/shaders/hillshade.fragment.glsl.txt +7 -0
  38. package/build/min/src/shaders/hillshade.vertex.glsl.txt +1 -0
  39. package/build/min/src/shaders/hillshade_prepare.fragment.glsl.txt +8 -0
  40. package/build/min/src/shaders/hillshade_prepare.vertex.glsl.txt +1 -0
  41. package/build/min/src/shaders/line.fragment.glsl.txt +12 -0
  42. package/build/min/src/shaders/line.vertex.glsl.txt +17 -0
  43. package/build/min/src/shaders/line_gradient.fragment.glsl.txt +10 -0
  44. package/build/min/src/shaders/line_gradient.vertex.glsl.txt +16 -0
  45. package/build/min/src/shaders/line_pattern.fragment.glsl.txt +15 -0
  46. package/build/min/src/shaders/line_pattern.vertex.glsl.txt +20 -0
  47. package/build/min/src/shaders/line_sdf.fragment.glsl.txt +17 -0
  48. package/build/min/src/shaders/line_sdf.vertex.glsl.txt +20 -0
  49. package/build/min/src/shaders/raster.fragment.glsl.txt +5 -0
  50. package/build/min/src/shaders/raster.vertex.glsl.txt +1 -0
  51. package/build/min/src/shaders/symbol_icon.fragment.glsl.txt +9 -0
  52. package/build/min/src/shaders/symbol_icon.vertex.glsl.txt +5 -0
  53. package/build/min/src/shaders/symbol_sdf.fragment.glsl.txt +19 -0
  54. package/build/min/src/shaders/symbol_sdf.vertex.glsl.txt +13 -0
  55. package/package.json +44 -0
  56. package/src/css/mapbox-gl.css +506 -0
  57. package/src/css/svg/mapboxgl-ctrl-attrib.svg +3 -0
  58. package/src/css/svg/mapboxgl-ctrl-compass.svg +4 -0
  59. package/src/css/svg/mapboxgl-ctrl-fullscreen.svg +3 -0
  60. package/src/css/svg/mapboxgl-ctrl-geolocate-background.svg +3 -0
  61. package/src/css/svg/mapboxgl-ctrl-geolocate.svg +3 -0
  62. package/src/css/svg/mapboxgl-ctrl-logo-compact.svg +2 -0
  63. package/src/css/svg/mapboxgl-ctrl-logo.svg +1 -0
  64. package/src/css/svg/mapboxgl-ctrl-shrink.svg +3 -0
  65. package/src/css/svg/mapboxgl-ctrl-zoom-in.svg +3 -0
  66. package/src/css/svg/mapboxgl-ctrl-zoom-out.svg +3 -0
  67. package/src/data/array_types.js +1138 -0
  68. package/src/data/bucket/circle_attributes.js +5 -0
  69. package/src/data/bucket/circle_bucket.js +118 -0
  70. package/src/data/bucket/fill_attributes.js +5 -0
  71. package/src/data/bucket/fill_bucket.js +166 -0
  72. package/src/data/bucket/fill_extrusion_attributes.js +11 -0
  73. package/src/data/bucket/fill_extrusion_bucket.js +247 -0
  74. package/src/data/bucket/heatmap_bucket.js +12 -0
  75. package/src/data/bucket/line_attributes.js +11 -0
  76. package/src/data/bucket/line_bucket.js +625 -0
  77. package/src/data/bucket/pattern_attributes.js +9 -0
  78. package/src/data/bucket/pattern_bucket_features.js +44 -0
  79. package/src/data/bucket/symbol_attributes.js +95 -0
  80. package/src/data/bucket/symbol_bucket.js +697 -0
  81. package/src/data/bucket.js +53 -0
  82. package/src/data/dem_data.js +126 -0
  83. package/src/data/extent.js +17 -0
  84. package/src/data/feature_index.js +254 -0
  85. package/src/data/index_array_type.js +14 -0
  86. package/src/data/load_geometry.js +42 -0
  87. package/src/data/pos_attributes.js +3 -0
  88. package/src/data/program_configuration.js +782 -0
  89. package/src/data/raster_bounds_attributes.js +6 -0
  90. package/src/data/segment.js +63 -0
  91. package/src/geo/coordinate.js +78 -0
  92. package/src/geo/lng_lat.js +129 -0
  93. package/src/geo/lng_lat_bounds.js +253 -0
  94. package/src/geo/transform.js +605 -0
  95. package/src/gl/color_mode.js +21 -0
  96. package/src/gl/context.js +193 -0
  97. package/src/gl/cull_face_mode.js +22 -0
  98. package/src/gl/depth_mode.js +18 -0
  99. package/src/gl/framebuffer.js +28 -0
  100. package/src/gl/index_buffer.js +52 -0
  101. package/src/gl/stencil_mode.js +17 -0
  102. package/src/gl/types.js +0 -0
  103. package/src/gl/value.js +676 -0
  104. package/src/gl/vertex_buffer.js +101 -0
  105. package/src/index.js +50 -0
  106. package/src/render/draw_background.js +60 -0
  107. package/src/render/draw_circle.js +55 -0
  108. package/src/render/draw_collision_debug.js +45 -0
  109. package/src/render/draw_debug.js +429 -0
  110. package/src/render/draw_fill.js +143 -0
  111. package/src/render/draw_fill_extrusion.js +101 -0
  112. package/src/render/draw_heatmap.js +159 -0
  113. package/src/render/draw_hillshade.js +144 -0
  114. package/src/render/draw_line.js +99 -0
  115. package/src/render/draw_raster.js +151 -0
  116. package/src/render/draw_symbol.js +231 -0
  117. package/src/render/glyph_atlas.js +55 -0
  118. package/src/render/glyph_manager.js +145 -0
  119. package/src/render/image_atlas.js +97 -0
  120. package/src/render/image_manager.js +183 -0
  121. package/src/render/line_atlas.js +139 -0
  122. package/src/render/painter.js +483 -0
  123. package/src/render/program/background_program.js +46 -0
  124. package/src/render/program/circle_program.js +40 -0
  125. package/src/render/program/clipping_mask_program.js +11 -0
  126. package/src/render/program/collision_program.js +28 -0
  127. package/src/render/program/debug_program.js +13 -0
  128. package/src/render/program/fill_extrusion_program.js +76 -0
  129. package/src/render/program/fill_program.js +60 -0
  130. package/src/render/program/heatmap_program.js +46 -0
  131. package/src/render/program/hillshade_program.js +77 -0
  132. package/src/render/program/line_program.js +119 -0
  133. package/src/render/program/pattern.js +57 -0
  134. package/src/render/program/program_uniforms.js +46 -0
  135. package/src/render/program/raster_program.js +50 -0
  136. package/src/render/program/symbol_program.js +112 -0
  137. package/src/render/program.js +133 -0
  138. package/src/render/texture.js +88 -0
  139. package/src/render/tile_mask.js +108 -0
  140. package/src/render/uniform_binding.js +129 -0
  141. package/src/render/vertex_array_object.js +155 -0
  142. package/src/shaders/README.md +42 -0
  143. package/src/shaders/_prelude.fragment.glsl +17 -0
  144. package/src/shaders/_prelude.vertex.glsl +73 -0
  145. package/src/shaders/background.fragment.glsl +10 -0
  146. package/src/shaders/background.vertex.glsl +7 -0
  147. package/src/shaders/background_pattern.fragment.glsl +28 -0
  148. package/src/shaders/background_pattern.vertex.glsl +20 -0
  149. package/src/shaders/circle.fragment.glsl +39 -0
  150. package/src/shaders/circle.vertex.glsl +63 -0
  151. package/src/shaders/clipping_mask.fragment.glsl +3 -0
  152. package/src/shaders/clipping_mask.vertex.glsl +7 -0
  153. package/src/shaders/collision_box.fragment.glsl +21 -0
  154. package/src/shaders/collision_box.vertex.glsl +26 -0
  155. package/src/shaders/collision_circle.fragment.glsl +34 -0
  156. package/src/shaders/collision_circle.vertex.glsl +36 -0
  157. package/src/shaders/debug.fragment.glsl +5 -0
  158. package/src/shaders/debug.vertex.glsl +7 -0
  159. package/src/shaders/encode_attribute.js +19 -0
  160. package/src/shaders/fill.fragment.glsl +13 -0
  161. package/src/shaders/fill.vertex.glsl +13 -0
  162. package/src/shaders/fill_extrusion.fragment.glsl +16 -0
  163. package/src/shaders/fill_extrusion.vertex.glsl +66 -0
  164. package/src/shaders/fill_extrusion_pattern.fragment.glsl +41 -0
  165. package/src/shaders/fill_extrusion_pattern.vertex.glsl +76 -0
  166. package/src/shaders/fill_outline.fragment.glsl +17 -0
  167. package/src/shaders/fill_outline.vertex.glsl +17 -0
  168. package/src/shaders/fill_outline_pattern.fragment.glsl +43 -0
  169. package/src/shaders/fill_outline_pattern.vertex.glsl +41 -0
  170. package/src/shaders/fill_pattern.fragment.glsl +36 -0
  171. package/src/shaders/fill_pattern.vertex.glsl +36 -0
  172. package/src/shaders/heatmap.fragment.glsl +21 -0
  173. package/src/shaders/heatmap.vertex.glsl +53 -0
  174. package/src/shaders/heatmap_texture.fragment.glsl +14 -0
  175. package/src/shaders/heatmap_texture.vertex.glsl +11 -0
  176. package/src/shaders/hillshade.fragment.glsl +52 -0
  177. package/src/shaders/hillshade.vertex.glsl +11 -0
  178. package/src/shaders/hillshade_prepare.fragment.glsl +72 -0
  179. package/src/shaders/hillshade_prepare.vertex.glsl +15 -0
  180. package/src/shaders/index.js +194 -0
  181. package/src/shaders/line.fragment.glsl +28 -0
  182. package/src/shaders/line.vertex.glsl +84 -0
  183. package/src/shaders/line_gradient.fragment.glsl +34 -0
  184. package/src/shaders/line_gradient.vertex.glsl +84 -0
  185. package/src/shaders/line_pattern.fragment.glsl +69 -0
  186. package/src/shaders/line_pattern.vertex.glsl +88 -0
  187. package/src/shaders/line_sdf.fragment.glsl +44 -0
  188. package/src/shaders/line_sdf.vertex.glsl +95 -0
  189. package/src/shaders/raster.fragment.glsl +52 -0
  190. package/src/shaders/raster.vertex.glsl +21 -0
  191. package/src/shaders/symbol_icon.fragment.glsl +17 -0
  192. package/src/shaders/symbol_icon.vertex.glsl +91 -0
  193. package/src/shaders/symbol_sdf.fragment.glsl +50 -0
  194. package/src/shaders/symbol_sdf.vertex.glsl +117 -0
  195. package/src/source/geojson_source.js +267 -0
  196. package/src/source/geojson_worker_source.js +210 -0
  197. package/src/source/geojson_wrapper.js +67 -0
  198. package/src/source/image_source.js +213 -0
  199. package/src/source/load_tilejson.js +40 -0
  200. package/src/source/pixels_to_tile_units.js +17 -0
  201. package/src/source/query_features.js +198 -0
  202. package/src/source/raster_dem_tile_source.js +140 -0
  203. package/src/source/raster_dem_tile_worker_source.js +26 -0
  204. package/src/source/raster_tile_source.js +126 -0
  205. package/src/source/rtl_text_plugin.js +63 -0
  206. package/src/source/source.js +75 -0
  207. package/src/source/source_cache.js +794 -0
  208. package/src/source/source_state.js +55 -0
  209. package/src/source/tile.js +332 -0
  210. package/src/source/tile_bounds.js +40 -0
  211. package/src/source/tile_cache.js +122 -0
  212. package/src/source/tile_id.js +150 -0
  213. package/src/source/vector_tile_source.js +144 -0
  214. package/src/source/vector_tile_worker_source.js +126 -0
  215. package/src/source/worker.js +175 -0
  216. package/src/source/worker_source.js +14 -0
  217. package/src/source/worker_tile.js +199 -0
  218. package/src/style/create_style_layer.js +25 -0
  219. package/src/style/evaluation_parameters.js +45 -0
  220. package/src/style/light.js +112 -0
  221. package/src/style/load_glyph_range.js +17 -0
  222. package/src/style/load_sprite.js +26 -0
  223. package/src/style/parse_glyph_pbf.js +45 -0
  224. package/src/style/pauseable_placement.js +88 -0
  225. package/src/style/properties.js +691 -0
  226. package/src/style/query_utils.js +39 -0
  227. package/src/style/style.js +955 -0
  228. package/src/style/style_layer/background_style_layer.js +11 -0
  229. package/src/style/style_layer/background_style_layer_properties.js +25 -0
  230. package/src/style/style_layer/circle_style_layer.js +93 -0
  231. package/src/style/style_layer/circle_style_layer_properties.js +76 -0
  232. package/src/style/style_layer/fill_extrusion_style_layer.js +194 -0
  233. package/src/style/style_layer/fill_extrusion_style_layer_properties.js +56 -0
  234. package/src/style/style_layer/fill_style_layer.js +46 -0
  235. package/src/style/style_layer/fill_style_layer_properties.js +45 -0
  236. package/src/style/style_layer/heatmap_style_layer.js +51 -0
  237. package/src/style/style_layer/heatmap_style_layer_properties.js +52 -0
  238. package/src/style/style_layer/hillshade_style_layer.js +15 -0
  239. package/src/style/style_layer/hillshade_style_layer_properties.js +43 -0
  240. package/src/style/style_layer/line_style_layer.js +129 -0
  241. package/src/style/style_layer/line_style_layer_properties.js +104 -0
  242. package/src/style/style_layer/raster_style_layer.js +11 -0
  243. package/src/style/style_layer/raster_style_layer_properties.js +55 -0
  244. package/src/style/style_layer/symbol_style_layer.js +66 -0
  245. package/src/style/style_layer/symbol_style_layer_properties.js +288 -0
  246. package/src/style/style_layer.js +183 -0
  247. package/src/style/style_layer_index.js +61 -0
  248. package/src/style/zoom_history.js +36 -0
  249. package/src/style-spec/deref.js +51 -0
  250. package/src/style-spec/error/parsing_error.js +8 -0
  251. package/src/style-spec/error/validation_error.js +10 -0
  252. package/src/style-spec/expression/compound_expression.js +118 -0
  253. package/src/style-spec/expression/definitions/array.js +82 -0
  254. package/src/style-spec/expression/definitions/assertion.js +69 -0
  255. package/src/style-spec/expression/definitions/at.js +57 -0
  256. package/src/style-spec/expression/definitions/case.js +73 -0
  257. package/src/style-spec/expression/definitions/coalesce.js +68 -0
  258. package/src/style-spec/expression/definitions/coercion.js +96 -0
  259. package/src/style-spec/expression/definitions/collator.js +102 -0
  260. package/src/style-spec/expression/definitions/equals.js +93 -0
  261. package/src/style-spec/expression/definitions/index.js +407 -0
  262. package/src/style-spec/expression/definitions/interpolate.js +235 -0
  263. package/src/style-spec/expression/definitions/length.js +54 -0
  264. package/src/style-spec/expression/definitions/let.js +60 -0
  265. package/src/style-spec/expression/definitions/literal.js +64 -0
  266. package/src/style-spec/expression/definitions/match.js +142 -0
  267. package/src/style-spec/expression/definitions/step.js +116 -0
  268. package/src/style-spec/expression/definitions/var.js +38 -0
  269. package/src/style-spec/expression/evaluation_context.js +35 -0
  270. package/src/style-spec/expression/index.js +329 -0
  271. package/src/style-spec/expression/is_constant.js +63 -0
  272. package/src/style-spec/expression/parsing_context.js +213 -0
  273. package/src/style-spec/expression/parsing_error.js +9 -0
  274. package/src/style-spec/expression/runtime_error.js +12 -0
  275. package/src/style-spec/expression/scope.js +34 -0
  276. package/src/style-spec/expression/stops.js +37 -0
  277. package/src/style-spec/expression/types.js +77 -0
  278. package/src/style-spec/expression/values.js +126 -0
  279. package/src/style-spec/feature_filter/README.md +55 -0
  280. package/src/style-spec/feature_filter/index.js +158 -0
  281. package/src/style-spec/function/convert.js +256 -0
  282. package/src/style-spec/function/index.js +299 -0
  283. package/src/style-spec/group_by_layout.js +68 -0
  284. package/src/style-spec/reference/v8.json +5356 -0
  285. package/src/style-spec/util/color.js +73 -0
  286. package/src/style-spec/util/color_spaces.js +128 -0
  287. package/src/style-spec/util/eval_support.js +8 -0
  288. package/src/style-spec/util/get_type.js +18 -0
  289. package/src/style-spec/util/interpolate.js +21 -0
  290. package/src/style-spec/util/properties.js +17 -0
  291. package/src/style-spec/util/ref_properties.js +1 -0
  292. package/src/style-spec/util/result.js +19 -0
  293. package/src/symbol/anchor.js +21 -0
  294. package/src/symbol/check_max_angle.js +75 -0
  295. package/src/symbol/clip_line.js +73 -0
  296. package/src/symbol/collision_feature.js +230 -0
  297. package/src/symbol/collision_index.js +379 -0
  298. package/src/symbol/cross_tile_symbol_index.js +270 -0
  299. package/src/symbol/get_anchors.js +177 -0
  300. package/src/symbol/grid_index.js +318 -0
  301. package/src/symbol/mergelines.js +75 -0
  302. package/src/symbol/opacity_state.js +21 -0
  303. package/src/symbol/placement.js +563 -0
  304. package/src/symbol/projection.js +601 -0
  305. package/src/symbol/quads.js +173 -0
  306. package/src/symbol/shaping.js +347 -0
  307. package/src/symbol/symbol_layout.js +519 -0
  308. package/src/symbol/symbol_size.js +110 -0
  309. package/src/symbol/transform_text.js +16 -0
  310. package/src/ui/anchor.js +24 -0
  311. package/src/ui/bind_handlers.js +199 -0
  312. package/src/ui/camera.js +954 -0
  313. package/src/ui/events.js +210 -0
  314. package/src/ui/handler/box_zoom.js +151 -0
  315. package/src/ui/handler/dblclick_zoom.js +91 -0
  316. package/src/ui/handler/drag_pan.js +285 -0
  317. package/src/ui/handler/drag_rotate.js +290 -0
  318. package/src/ui/handler/frame.js +28 -0
  319. package/src/ui/handler/inertia.js +45 -0
  320. package/src/ui/handler/keyboard.js +148 -0
  321. package/src/ui/handler/scroll_zoom.js +284 -0
  322. package/src/ui/handler/touch_zoom_rotate.js +263 -0
  323. package/src/ui/map.js +1645 -0
  324. package/src/util/actor.js +104 -0
  325. package/src/util/async.js +23 -0
  326. package/src/util/browser.js +61 -0
  327. package/src/util/callback.js +26 -0
  328. package/src/util/classify_rings.js +43 -0
  329. package/src/util/color_ramp.js +24 -0
  330. package/src/util/config.js +24 -0
  331. package/src/util/dictionary_coder.js +25 -0
  332. package/src/util/dispatcher.js +68 -0
  333. package/src/util/dom.js +102 -0
  334. package/src/util/evented.js +182 -0
  335. package/src/util/find_pole_of_inaccessibility.js +129 -0
  336. package/src/util/global_worker_pool.js +15 -0
  337. package/src/util/image.js +124 -0
  338. package/src/util/interpolate.js +5 -0
  339. package/src/util/intersection_tests.js +207 -0
  340. package/src/util/is_char_in_unicode_block.js +287 -0
  341. package/src/util/loader/image.js +32 -0
  342. package/src/util/object.js +178 -0
  343. package/src/util/script_detection.js +337 -0
  344. package/src/util/struct_array.js +197 -0
  345. package/src/util/task_queue.js +57 -0
  346. package/src/util/throttle.js +26 -0
  347. package/src/util/tile_cover.js +114 -0
  348. package/src/util/token.js +13 -0
  349. package/src/util/unique_id.js +12 -0
  350. package/src/util/util.js +192 -0
  351. package/src/util/vectortile_to_geojson.js +44 -0
  352. package/src/util/verticalize_punctuation.js +112 -0
  353. package/src/util/warn.js +21 -0
  354. package/src/util/web_worker.js +5 -0
  355. package/src/util/web_worker_transfer.js +228 -0
  356. package/src/util/worker_pool.js +41 -0
@@ -0,0 +1,55 @@
1
+ /**
2
+ * SourceFeatureState manages the state and state changes
3
+ * to features in a source, separated by source layer.
4
+ *
5
+ * @private
6
+ */
7
+ class SourceFeatureState {
8
+ constructor() {
9
+ this.state = {};
10
+ this.stateChanges = {};
11
+ }
12
+
13
+ updateState(sourceLayer, feature, state) {
14
+ feature = String(feature);
15
+ this.stateChanges[sourceLayer] = this.stateChanges[sourceLayer] || {};
16
+ this.stateChanges[sourceLayer][feature] = this.stateChanges[sourceLayer][feature] || {};
17
+ Object.assign(this.stateChanges[sourceLayer][feature], state);
18
+ }
19
+
20
+ getState(sourceLayer, feature) {
21
+ feature = String(feature);
22
+ const base = this.state[sourceLayer] || {};
23
+ const changes = this.stateChanges[sourceLayer] || {};
24
+ return Object.assign({}, base[feature], changes[feature]);
25
+ }
26
+
27
+ initializeTileState(tile, painter) {
28
+ tile.setFeatureState(this.state, painter);
29
+ }
30
+
31
+ coalesceChanges(tiles, painter) {
32
+ const changes = {};
33
+ for (const sourceLayer in this.stateChanges) {
34
+ this.state[sourceLayer] = this.state[sourceLayer] || {};
35
+ const layerStates = {};
36
+ for (const id in this.stateChanges[sourceLayer]) {
37
+ if (!this.state[sourceLayer][id]) {
38
+ this.state[sourceLayer][id] = {};
39
+ }
40
+ Object.assign(this.state[sourceLayer][id], this.stateChanges[sourceLayer][id]);
41
+ layerStates[id] = this.state[sourceLayer][id];
42
+ }
43
+ changes[sourceLayer] = layerStates;
44
+ }
45
+ this.stateChanges = {};
46
+ if (Object.keys(changes).length === 0) return;
47
+
48
+ for (const id in tiles) {
49
+ const tile = tiles[id];
50
+ tile.setFeatureState(changes, painter);
51
+ }
52
+ }
53
+ }
54
+
55
+ module.exports = SourceFeatureState;
@@ -0,0 +1,332 @@
1
+ const { deepEqual } = require('../util/object');
2
+ const uniqueId = require('../util/unique_id');
3
+ const { deserialize: deserializeBucket } = require('../data/bucket');
4
+ const GeoJSONFeature = require('../util/vectortile_to_geojson');
5
+ const featureFilter = require('../style-spec/feature_filter');
6
+ const SymbolBucket = require('../data/bucket/symbol_bucket');
7
+ const { RasterBoundsArray, CollisionBoxArray } = require('../data/array_types');
8
+ const rasterBoundsAttributes = require('../data/raster_bounds_attributes');
9
+ const EXTENT = require('../data/extent');
10
+ const Point = require('@mapbox/point-geometry');
11
+ const Texture = require('../render/texture');
12
+ const SegmentVector = require('../data/segment');
13
+ const { TriangleIndexArray } = require('../data/index_array_type');
14
+ const browser = require('../util/browser');
15
+ const EvaluationParameters = require('../style/evaluation_parameters');
16
+
17
+ /**
18
+ * A tile object is the combination of a Coordinate, which defines
19
+ * its place, as well as a unique ID and data tracking for its content
20
+ *
21
+ * @private
22
+ */
23
+ class Tile {
24
+ /**
25
+ * @param {OverscaledTileID} tileID
26
+ * @param size
27
+ */
28
+ constructor(tileID, size) {
29
+ this.tileID = tileID;
30
+ this.uid = uniqueId();
31
+ this.uses = 0;
32
+ this.tileSize = size;
33
+ this.buckets = {};
34
+ this.queryPadding = 0;
35
+ this.hasSymbolBuckets = false;
36
+
37
+ this.state = 'loading';
38
+ }
39
+
40
+ registerFadeDuration(duration) {
41
+ const fadeEndTime = duration + this.timeAdded;
42
+ if (fadeEndTime < browser.now()) return;
43
+ if (this.fadeEndTime && fadeEndTime < this.fadeEndTime) return;
44
+
45
+ this.fadeEndTime = fadeEndTime;
46
+ }
47
+
48
+ wasRequested() {
49
+ return this.state === 'errored' || this.state === 'loaded' || this.state === 'reloading';
50
+ }
51
+
52
+ /**
53
+ * Given a data object with a 'buffers' property, load it into
54
+ * this tile's elementGroups and buffers properties and set loaded
55
+ * to true. If the data is null, like in the case of an empty
56
+ * GeoJSON tile, no-op but still set loaded to true.
57
+ * @param {Object} data
58
+ * @param painter
59
+ * @returns {undefined}
60
+ */
61
+ loadVectorData(data, painter, justReloaded) {
62
+ if (this.hasData()) {
63
+ this.unloadVectorData();
64
+ }
65
+
66
+ this.state = 'loaded';
67
+
68
+ // empty GeoJSON tile
69
+ if (!data) {
70
+ this.collisionBoxArray = new CollisionBoxArray();
71
+ return;
72
+ }
73
+
74
+ if (data.featureIndex) {
75
+ this.latestFeatureIndex = data.featureIndex;
76
+ if (data.rawTileData) {
77
+ // Only vector tiles have rawTileData, and they won't update it for
78
+ // 'reloadTile'
79
+ this.latestRawTileData = data.rawTileData;
80
+ this.latestFeatureIndex.rawTileData = data.rawTileData;
81
+ } else if (this.latestRawTileData) {
82
+ // If rawTileData hasn't updated, hold onto a pointer to the last
83
+ // one we received
84
+ this.latestFeatureIndex.rawTileData = this.latestRawTileData;
85
+ }
86
+ }
87
+ this.collisionBoxArray = data.collisionBoxArray;
88
+ this.buckets = deserializeBucket(data.buckets, painter.style);
89
+
90
+ this.hasSymbolBuckets = false;
91
+ const buckets = Object.values(this.buckets);
92
+ for (const bucket of buckets) {
93
+ if (bucket instanceof SymbolBucket) {
94
+ this.hasSymbolBuckets = true;
95
+ if (justReloaded) {
96
+ bucket.justReloaded = true;
97
+ } else {
98
+ break;
99
+ }
100
+ }
101
+ }
102
+
103
+ this.queryPadding = 0;
104
+ for (const bucket of buckets) {
105
+ this.queryPadding = Math.max(this.queryPadding, painter.style.getLayer(bucket.layerIds[0]).queryRadius(bucket));
106
+ }
107
+
108
+ if (data.imageAtlas) {
109
+ this.imageAtlas = data.imageAtlas;
110
+ }
111
+ if (data.glyphAtlasImage) {
112
+ this.glyphAtlasImage = data.glyphAtlasImage;
113
+ }
114
+ }
115
+
116
+ /**
117
+ * Release any data or WebGL resources referenced by this tile.
118
+ * @returns {undefined}
119
+ * @private
120
+ */
121
+ unloadVectorData() {
122
+ for (const bucket of Object.values(this.buckets)) {
123
+ bucket.destroy();
124
+ }
125
+ this.buckets = {};
126
+
127
+ this.imageAtlasTexture?.destroy();
128
+ if (this.imageAtlas) {
129
+ this.imageAtlas = null;
130
+ }
131
+ this.glyphAtlasTexture?.destroy();
132
+ this.latestFeatureIndex = null;
133
+ this.state = 'unloaded';
134
+ }
135
+
136
+ unloadDEMData() {
137
+ this.dem = null;
138
+ this.neighboringTiles = null;
139
+ this.state = 'unloaded';
140
+ }
141
+
142
+ getBucket(layer) {
143
+ return this.buckets[layer.id];
144
+ }
145
+
146
+ upload(context) {
147
+ for (const id in this.buckets) {
148
+ const bucket = this.buckets[id];
149
+ if (bucket.uploadPending()) {
150
+ bucket.upload(context);
151
+ }
152
+ }
153
+
154
+ const gl = context.gl;
155
+
156
+ if (this.imageAtlas && !this.imageAtlas.uploaded) {
157
+ this.imageAtlasTexture = new Texture(context, this.imageAtlas.image, gl.RGBA);
158
+ this.imageAtlas.uploaded = true;
159
+ }
160
+
161
+ if (this.glyphAtlasImage) {
162
+ this.glyphAtlasTexture = new Texture(context, this.glyphAtlasImage, gl.ALPHA);
163
+ this.glyphAtlasImage = null;
164
+ }
165
+ }
166
+
167
+ // Queries non-symbol features rendered for this tile.
168
+ // Symbol features are queried globally
169
+ queryRenderedFeatures(
170
+ layers,
171
+ sourceFeatureState,
172
+ queryGeometry,
173
+ cameraQueryGeometry,
174
+ scale,
175
+ params,
176
+ transform,
177
+ maxPitchScaleFactor,
178
+ pixelPosMatrix
179
+ ) {
180
+ if (!this.latestFeatureIndex?.rawTileData) return {};
181
+
182
+ return this.latestFeatureIndex.query(
183
+ {
184
+ queryGeometry,
185
+ cameraQueryGeometry,
186
+ scale,
187
+ tileSize: this.tileSize,
188
+ pixelPosMatrix,
189
+ transform,
190
+ params,
191
+ queryPadding: this.queryPadding * maxPitchScaleFactor
192
+ },
193
+ layers,
194
+ sourceFeatureState
195
+ );
196
+ }
197
+
198
+ querySourceFeatures(result, params) {
199
+ if (!this.latestFeatureIndex?.rawTileData) return;
200
+
201
+ const vtLayers = this.latestFeatureIndex.loadVTLayers();
202
+
203
+ const sourceLayer = params ? params.sourceLayer : '';
204
+ const layer = vtLayers._geojsonTileLayer || vtLayers[sourceLayer];
205
+
206
+ if (!layer) return;
207
+
208
+ const filter = featureFilter(params?.filter);
209
+ const { z, x, y } = this.tileID.canonical;
210
+ const coord = { z, x, y };
211
+
212
+ for (let i = 0; i < layer.length; i++) {
213
+ const feature = layer.feature(i);
214
+ if (filter(new EvaluationParameters(this.tileID.overscaledZ), feature)) {
215
+ const geojsonFeature = new GeoJSONFeature(feature, z, x, y);
216
+ geojsonFeature.tile = coord;
217
+ result.push(geojsonFeature);
218
+ }
219
+ }
220
+ }
221
+
222
+ clearMask() {
223
+ if (this.segments) {
224
+ this.segments.destroy();
225
+ delete this.segments;
226
+ }
227
+ if (this.maskedBoundsBuffer) {
228
+ this.maskedBoundsBuffer.destroy();
229
+ delete this.maskedBoundsBuffer;
230
+ }
231
+ if (this.maskedIndexBuffer) {
232
+ this.maskedIndexBuffer.destroy();
233
+ delete this.maskedIndexBuffer;
234
+ }
235
+ }
236
+
237
+ setMask(mask, context) {
238
+ // don't redo buffer work if the mask is the same;
239
+ if (deepEqual(this.mask, mask)) return;
240
+
241
+ this.mask = mask;
242
+ this.clearMask();
243
+
244
+ // We want to render the full tile, and keeping the segments/vertices/indices empty means
245
+ // using the global shared buffers for covering the entire tile.
246
+ if (deepEqual(mask, { 0: true })) return;
247
+
248
+ const maskedBoundsArray = new RasterBoundsArray();
249
+ const indexArray = new TriangleIndexArray();
250
+
251
+ this.segments = new SegmentVector();
252
+ // Create a new segment so that we will upload (empty) buffers even when there is nothing to
253
+ // draw for this tile.
254
+ this.segments.prepareSegment(0, maskedBoundsArray, indexArray);
255
+
256
+ const maskArray = Object.keys(mask);
257
+ for (let i = 0; i < maskArray.length; i++) {
258
+ const maskCoord = mask[maskArray[i]];
259
+ const vertexExtent = EXTENT >> maskCoord.z;
260
+ const tlVertex = new Point(maskCoord.x * vertexExtent, maskCoord.y * vertexExtent);
261
+ const brVertex = new Point(tlVertex.x + vertexExtent, tlVertex.y + vertexExtent);
262
+
263
+ // not sure why flow is complaining here because it doesn't complain at L401
264
+ const segment = this.segments.prepareSegment(4, maskedBoundsArray, indexArray);
265
+
266
+ maskedBoundsArray.emplaceBack(tlVertex.x, tlVertex.y, tlVertex.x, tlVertex.y);
267
+ maskedBoundsArray.emplaceBack(brVertex.x, tlVertex.y, brVertex.x, tlVertex.y);
268
+ maskedBoundsArray.emplaceBack(tlVertex.x, brVertex.y, tlVertex.x, brVertex.y);
269
+ maskedBoundsArray.emplaceBack(brVertex.x, brVertex.y, brVertex.x, brVertex.y);
270
+
271
+ const offset = segment.vertexLength;
272
+ // 0, 1, 2
273
+ // 1, 2, 3
274
+ indexArray.emplaceBack(offset, offset + 1, offset + 2);
275
+ indexArray.emplaceBack(offset + 1, offset + 2, offset + 3);
276
+
277
+ segment.vertexLength += 4;
278
+ segment.primitiveLength += 2;
279
+ }
280
+
281
+ this.maskedBoundsBuffer = context.createVertexBuffer(maskedBoundsArray, rasterBoundsAttributes.members);
282
+ this.maskedIndexBuffer = context.createIndexBuffer(indexArray);
283
+ }
284
+
285
+ hasData() {
286
+ return this.state === 'loaded' || this.state === 'reloading';
287
+ }
288
+
289
+ patternsLoaded() {
290
+ return this.imageAtlas && !!Object.keys(this.imageAtlas.patternPositions).length;
291
+ }
292
+
293
+ setFeatureState(states, painter) {
294
+ if (!this.latestFeatureIndex?.rawTileData || Object.keys(states).length === 0) {
295
+ return;
296
+ }
297
+
298
+ const vtLayers = this.latestFeatureIndex.loadVTLayers();
299
+
300
+ for (const i in this.buckets) {
301
+ const bucket = this.buckets[i];
302
+ // Buckets are grouped by common source-layer
303
+ const sourceLayerId = bucket.layers[0]['sourceLayer'] || '_geojsonTileLayer';
304
+ const sourceLayer = vtLayers[sourceLayerId];
305
+ const sourceLayerStates = states[sourceLayerId];
306
+ if (!sourceLayer || !sourceLayerStates || Object.keys(sourceLayerStates).length === 0) continue;
307
+
308
+ bucket.update(sourceLayerStates, sourceLayer, this.imageAtlas?.patternPositions || {});
309
+ if (painter?.style) {
310
+ this.queryPadding = Math.max(this.queryPadding, painter.style.getLayer(bucket.layerIds[0]).queryRadius(bucket));
311
+ }
312
+ }
313
+ }
314
+
315
+ holdingForFade() {
316
+ return this.symbolFadeHoldUntil !== undefined;
317
+ }
318
+
319
+ symbolFadeFinished() {
320
+ return !this.symbolFadeHoldUntil || this.symbolFadeHoldUntil < browser.now();
321
+ }
322
+
323
+ clearFadeHold() {
324
+ this.symbolFadeHoldUntil = undefined;
325
+ }
326
+
327
+ setHoldDuration(duration) {
328
+ this.symbolFadeHoldUntil = browser.now() + duration;
329
+ }
330
+ }
331
+
332
+ module.exports = Tile;
@@ -0,0 +1,40 @@
1
+ const LngLatBounds = require('../geo/lng_lat_bounds');
2
+
3
+ const { clamp } = require('../util/util');
4
+
5
+ class TileBounds {
6
+ constructor(bounds, minzoom, maxzoom) {
7
+ this.bounds = LngLatBounds.convert(this.validateBounds(bounds));
8
+ this.minzoom = minzoom || 0;
9
+ this.maxzoom = maxzoom || 24;
10
+ }
11
+
12
+ validateBounds(bounds) {
13
+ // make sure the bounds property contains valid longitude and latitudes
14
+ if (!Array.isArray(bounds) || bounds.length !== 4) return [-180, -90, 180, 90];
15
+ return [Math.max(-180, bounds[0]), Math.max(-90, bounds[1]), Math.min(180, bounds[2]), Math.min(90, bounds[3])];
16
+ }
17
+
18
+ contains(tileID) {
19
+ const level = {
20
+ minX: Math.floor(this.lngX(this.bounds.getWest(), tileID.z)),
21
+ minY: Math.floor(this.latY(this.bounds.getNorth(), tileID.z)),
22
+ maxX: Math.ceil(this.lngX(this.bounds.getEast(), tileID.z)),
23
+ maxY: Math.ceil(this.latY(this.bounds.getSouth(), tileID.z))
24
+ };
25
+ const hit = tileID.x >= level.minX && tileID.x < level.maxX && tileID.y >= level.minY && tileID.y < level.maxY;
26
+ return hit;
27
+ }
28
+
29
+ lngX(lng, zoom) {
30
+ return (lng + 180) * (2 ** zoom / 360);
31
+ }
32
+
33
+ latY(lat, zoom) {
34
+ const f = clamp(Math.sin((Math.PI / 180) * lat), -0.9999, 0.9999);
35
+ const scale = 2 ** zoom / (2 * Math.PI);
36
+ return 2 ** (zoom - 1) + 0.5 * Math.log((1 + f) / (1 - f)) * -scale;
37
+ }
38
+ }
39
+
40
+ module.exports = TileBounds;
@@ -0,0 +1,122 @@
1
+ const assert = require('assert');
2
+
3
+ /**
4
+ * A [fifo cache](http://en.wikipedia.org/wiki/Cache_algorithms)
5
+ */
6
+ class TileCache {
7
+ #data = new Map();
8
+
9
+ /**
10
+ * @param {number} max number of permitted values
11
+ * @param {Function} onRemove callback called with items when they expire
12
+ */
13
+ constructor(max, onRemove) {
14
+ this.max = max;
15
+ this.onRemove = onRemove;
16
+ }
17
+
18
+ /**
19
+ * Clear the cache
20
+ *
21
+ * @returns {TileCache} this cache
22
+ */
23
+ reset() {
24
+ for (const data of this.#data.values()) {
25
+ this.onRemove(data);
26
+ }
27
+ this.#data.clear();
28
+ return this;
29
+ }
30
+
31
+ /**
32
+ * Add a key, value combination to the cache, trimming its size if this pushes
33
+ * it over max length.
34
+ *
35
+ * @param {OverscaledTileID} tileID lookup key for the item
36
+ * @param {*} data any value
37
+ *
38
+ * @returns {TileCache} this cache
39
+ */
40
+ add(data) {
41
+ const key = data.tileID.cacheKey;
42
+ assert(!this.#data.has(key));
43
+ this.#data.set(key, data);
44
+ if (this.#data.size > this.max) {
45
+ const [[key, tile]] = this.#data;
46
+ this.onRemove(tile);
47
+ this.#data.delete(key);
48
+ }
49
+
50
+ return this;
51
+ }
52
+
53
+ /**
54
+ * Determine whether the value attached to `key` is present
55
+ *
56
+ * @param {OverscaledTileID} tileID the key to be looked-up
57
+ * @returns {boolean} whether the cache has this value
58
+ */
59
+ has(tileID) {
60
+ return this.#data.has(tileID.cacheKey);
61
+ }
62
+
63
+ /**
64
+ * Get the value attached to a specific key and remove data from cache.
65
+ * If the key is not found, returns `null`
66
+ *
67
+ * @param {OverscaledTileID} tileID the key to look up
68
+ * @returns {*} the data, or null if it isn't found
69
+ */
70
+ getAndRemove(tileID) {
71
+ return this.#getAndRemoveByKey(tileID.cacheKey);
72
+ }
73
+
74
+ /*
75
+ * Get and remove the value with the specified key.
76
+ */
77
+ #getAndRemoveByKey(key) {
78
+ const tile = this.#data.get(key);
79
+ if (tile) {
80
+ this.#data.delete(key);
81
+ return tile;
82
+ }
83
+ }
84
+
85
+ /**
86
+ * Get the value attached to a specific key without removing data
87
+ * from the cache. If the key is not found, returns `null`
88
+ *
89
+ * @param {OverscaledTileID} tileID the key to look up
90
+ * @returns {*} the data, or null if it isn't found
91
+ */
92
+ get(tileID) {
93
+ return this.#data.get(tileID.cacheKey);
94
+ }
95
+
96
+ /**
97
+ * Change the max size of the cache.
98
+ *
99
+ * @param {number} max the max size of the cache
100
+ * @returns {TileCache} this cache
101
+ */
102
+ setMaxSize(max) {
103
+ for (let overflow = this.#data.size - max; overflow > 0; overflow--) {
104
+ const [[key, data]] = this.#data;
105
+ this.onRemove(data);
106
+ this.#data.delete(key);
107
+ }
108
+
109
+ this.max = max;
110
+ return this;
111
+ }
112
+
113
+ get keys() {
114
+ return Array.from(this.#data.keys());
115
+ }
116
+
117
+ get size() {
118
+ return this.#data.size;
119
+ }
120
+ }
121
+
122
+ module.exports = TileCache;
@@ -0,0 +1,150 @@
1
+ const { getTileBBox } = require('@mapbox/whoots-js');
2
+
3
+ const assert = require('assert');
4
+ const { register } = require('../util/web_worker_transfer');
5
+ const Coordinate = require('../geo/coordinate');
6
+
7
+ class CanonicalTileID {
8
+ constructor(z, x, y) {
9
+ assert(z >= 0 && z <= 25);
10
+ assert(x >= 0 && x < 2 ** z);
11
+ assert(y >= 0 && y < 2 ** z);
12
+ this.z = z;
13
+ this.x = x;
14
+ this.y = y;
15
+ this.key = calculateKey(0, z, x, y);
16
+ }
17
+
18
+ equals(id) {
19
+ return this.z === id.z && this.x === id.x && this.y === id.y;
20
+ }
21
+
22
+ get cacheKey() {
23
+ return this.key;
24
+ }
25
+ }
26
+
27
+ class UnwrappedTileID {
28
+ constructor(wrap, canonical) {
29
+ this.wrap = wrap;
30
+ this.canonical = canonical;
31
+ this.key = calculateKey(wrap, canonical.z, canonical.x, canonical.y);
32
+ }
33
+ }
34
+
35
+ class OverscaledTileID {
36
+ constructor(overscaledZ, wrap, z, x, y) {
37
+ assert(overscaledZ >= z);
38
+ this.overscaledZ = overscaledZ;
39
+ this.wrap = wrap;
40
+ this.canonical = new CanonicalTileID(z, +x, +y);
41
+ this.key = calculateKey(wrap, overscaledZ, x, y);
42
+ }
43
+
44
+ equals(id) {
45
+ return this.overscaledZ === id.overscaledZ && this.wrap === id.wrap && this.canonical.equals(id.canonical);
46
+ }
47
+
48
+ scaledTo(targetZ) {
49
+ assert(targetZ <= this.overscaledZ);
50
+ const zDifference = this.canonical.z - targetZ;
51
+ if (targetZ > this.canonical.z) {
52
+ return new OverscaledTileID(targetZ, this.wrap, this.canonical.z, this.canonical.x, this.canonical.y);
53
+ }
54
+ return new OverscaledTileID(
55
+ targetZ,
56
+ this.wrap,
57
+ targetZ,
58
+ this.canonical.x >> zDifference,
59
+ this.canonical.y >> zDifference
60
+ );
61
+ }
62
+
63
+ isChildOf(parent) {
64
+ const zDifference = this.canonical.z - parent.canonical.z;
65
+ // We're first testing for z == 0, to avoid a 32 bit shift, which is undefined.
66
+ return (
67
+ parent.overscaledZ === 0 ||
68
+ (parent.overscaledZ < this.overscaledZ &&
69
+ parent.canonical.x === this.canonical.x >> zDifference &&
70
+ parent.canonical.y === this.canonical.y >> zDifference)
71
+ );
72
+ }
73
+
74
+ children(sourceMaxZoom) {
75
+ if (this.overscaledZ >= sourceMaxZoom) {
76
+ // return a single tile coord representing a an overscaled tile
77
+ return [
78
+ new OverscaledTileID(this.overscaledZ + 1, this.wrap, this.canonical.z, this.canonical.x, this.canonical.y)
79
+ ];
80
+ }
81
+
82
+ const z = this.canonical.z + 1;
83
+ const x = this.canonical.x * 2;
84
+ const y = this.canonical.y * 2;
85
+ return [
86
+ new OverscaledTileID(z, this.wrap, z, x, y),
87
+ new OverscaledTileID(z, this.wrap, z, x + 1, y),
88
+ new OverscaledTileID(z, this.wrap, z, x, y + 1),
89
+ new OverscaledTileID(z, this.wrap, z, x + 1, y + 1)
90
+ ];
91
+ }
92
+
93
+ isLessThan(rhs) {
94
+ if (this.wrap < rhs.wrap) return true;
95
+ if (this.wrap > rhs.wrap) return false;
96
+
97
+ if (this.overscaledZ < rhs.overscaledZ) return true;
98
+ if (this.overscaledZ > rhs.overscaledZ) return false;
99
+
100
+ if (this.canonical.x < rhs.canonical.x) return true;
101
+ if (this.canonical.x > rhs.canonical.x) return false;
102
+
103
+ if (this.canonical.y < rhs.canonical.y) return true;
104
+ return false;
105
+ }
106
+
107
+ get cacheKey() {
108
+ return calculateKey(this.wrap, this.overscaledZ, this.canonical.x, this.canonical.y);
109
+ }
110
+
111
+ wrapped() {
112
+ return new OverscaledTileID(this.overscaledZ, 0, this.canonical.z, this.canonical.x, this.canonical.y);
113
+ }
114
+
115
+ unwrapTo(wrap) {
116
+ return new OverscaledTileID(this.overscaledZ, wrap, this.canonical.z, this.canonical.x, this.canonical.y);
117
+ }
118
+
119
+ overscaleFactor() {
120
+ return 2 ** (this.overscaledZ - this.canonical.z);
121
+ }
122
+
123
+ toUnwrapped() {
124
+ return new UnwrappedTileID(this.wrap, this.canonical);
125
+ }
126
+
127
+ toString() {
128
+ return `${this.overscaledZ}/${this.canonical.x}/${this.canonical.y}`;
129
+ }
130
+
131
+ toCoordinate() {
132
+ return new Coordinate(this.canonical.x + 2 ** this.wrap, this.canonical.y, this.canonical.z);
133
+ }
134
+ }
135
+
136
+ function calculateKey(wrap, z, x, y) {
137
+ wrap *= 2;
138
+ if (wrap < 0) wrap = wrap * -1 - 1;
139
+ const dim = 1 << z;
140
+ return (dim * dim * wrap + dim * y + x) * 32 + z;
141
+ }
142
+
143
+ register('CanonicalTileID', CanonicalTileID);
144
+ register('OverscaledTileID', OverscaledTileID, { omit: ['posMatrix'] });
145
+
146
+ module.exports = {
147
+ CanonicalTileID,
148
+ UnwrappedTileID,
149
+ OverscaledTileID
150
+ };