@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,299 @@
1
+ const colorSpaces = require('../util/color_spaces');
2
+ const Color = require('../util/color');
3
+ const getType = require('../util/get_type');
4
+ const interpolate = require('../util/interpolate');
5
+ const Interpolate = require('../expression/definitions/interpolate');
6
+ const { supportsInterpolation } = require('../util/properties');
7
+
8
+ module.exports = {
9
+ isFunction,
10
+ createFunction
11
+ };
12
+
13
+ function isFunction(value) {
14
+ return typeof value === 'object' && value !== null && !Array.isArray(value);
15
+ }
16
+
17
+ function identityFunction(x) {
18
+ return x;
19
+ }
20
+
21
+ function createFunction(parameters, propertySpec) {
22
+ const isColor = propertySpec.type === 'color';
23
+ const zoomAndFeatureDependent = parameters.stops && typeof parameters.stops[0][0] === 'object';
24
+ const featureDependent = zoomAndFeatureDependent || parameters.property !== undefined;
25
+ const zoomDependent = zoomAndFeatureDependent || !featureDependent;
26
+ const type = parameters.type || (supportsInterpolation(propertySpec) ? 'exponential' : 'interval');
27
+
28
+ if (isColor) {
29
+ parameters = { ...parameters };
30
+
31
+ if (parameters.stops) {
32
+ parameters.stops = parameters.stops.map(stop => {
33
+ return [stop[0], Color.parse(stop[1])];
34
+ });
35
+ }
36
+
37
+ if (parameters.default) {
38
+ parameters.default = Color.parse(parameters.default);
39
+ } else {
40
+ parameters.default = Color.parse(propertySpec.default);
41
+ }
42
+ }
43
+
44
+ if (parameters.colorSpace && parameters.colorSpace !== 'rgb' && !colorSpaces[parameters.colorSpace]) {
45
+ throw new Error(`Unknown color space: ${parameters.colorSpace}`);
46
+ }
47
+
48
+ let innerFun;
49
+ let hashedStops;
50
+ let categoricalKeyType;
51
+ if (type === 'exponential') {
52
+ innerFun = evaluateExponentialFunction;
53
+ } else if (type === 'interval') {
54
+ innerFun = evaluateIntervalFunction;
55
+ } else if (type === 'categorical') {
56
+ innerFun = evaluateCategoricalFunction;
57
+
58
+ // For categorical functions, generate an Object as a hashmap of the stops for fast searching
59
+ hashedStops = Object.create(null);
60
+ for (const stop of parameters.stops) {
61
+ hashedStops[stop[0]] = stop[1];
62
+ }
63
+
64
+ // Infer key type based on first stop key-- used to encforce strict type checking later
65
+ categoricalKeyType = typeof parameters.stops[0][0];
66
+ } else if (type === 'identity') {
67
+ innerFun = evaluateIdentityFunction;
68
+ } else {
69
+ throw new Error(`Unknown function type "${type}"`);
70
+ }
71
+
72
+ if (zoomAndFeatureDependent) {
73
+ const featureFunctions = {};
74
+ const zoomStops = [];
75
+ for (let s = 0; s < parameters.stops.length; s++) {
76
+ const stop = parameters.stops[s];
77
+ const zoom = stop[0].zoom;
78
+ if (featureFunctions[zoom] === undefined) {
79
+ featureFunctions[zoom] = {
80
+ zoom: zoom,
81
+ type: parameters.type,
82
+ property: parameters.property,
83
+ default: parameters.default,
84
+ stops: []
85
+ };
86
+ zoomStops.push(zoom);
87
+ }
88
+ featureFunctions[zoom].stops.push([stop[0].value, stop[1]]);
89
+ }
90
+
91
+ const featureFunctionStops = [];
92
+ for (const z of zoomStops) {
93
+ featureFunctionStops.push([featureFunctions[z].zoom, createFunction(featureFunctions[z], propertySpec)]);
94
+ }
95
+
96
+ return {
97
+ kind: 'composite',
98
+ interpolationFactor: Interpolate.interpolationFactor.bind(undefined, { name: 'linear' }),
99
+ zoomStops: featureFunctionStops.map(s => s[0]),
100
+ evaluate({ zoom }, properties) {
101
+ return evaluateExponentialFunction(
102
+ {
103
+ stops: featureFunctionStops,
104
+ base: parameters.base
105
+ },
106
+ propertySpec,
107
+ zoom
108
+ ).evaluate(zoom, properties);
109
+ }
110
+ };
111
+ }
112
+ if (zoomDependent) {
113
+ return {
114
+ kind: 'camera',
115
+ interpolationFactor:
116
+ type === 'exponential'
117
+ ? Interpolate.interpolationFactor.bind(undefined, {
118
+ name: 'exponential',
119
+ base: parameters.base !== undefined ? parameters.base : 1
120
+ })
121
+ : () => 0,
122
+ zoomStops: parameters.stops.map(s => s[0]),
123
+ evaluate: ({ zoom }) => innerFun(parameters, propertySpec, zoom, hashedStops, categoricalKeyType)
124
+ };
125
+ }
126
+ return {
127
+ kind: 'source',
128
+ evaluate(_, feature) {
129
+ const value = feature?.properties ? feature.properties[parameters.property] : undefined;
130
+ if (value === undefined) {
131
+ return coalesce(parameters.default, propertySpec.default);
132
+ }
133
+ return innerFun(parameters, propertySpec, value, hashedStops, categoricalKeyType);
134
+ }
135
+ };
136
+ }
137
+
138
+ function coalesce(a, b, c) {
139
+ if (a !== undefined) return a;
140
+ if (b !== undefined) return b;
141
+ if (c !== undefined) return c;
142
+ }
143
+
144
+ function evaluateCategoricalFunction(parameters, propertySpec, input, hashedStops, keyType) {
145
+ const evaluated = typeof input === keyType ? hashedStops[input] : undefined; // Enforce strict typing on input
146
+ return coalesce(evaluated, parameters.default, propertySpec.default);
147
+ }
148
+
149
+ function evaluateIntervalFunction(parameters, propertySpec, input) {
150
+ // Edge cases
151
+ if (getType(input) !== 'number') return coalesce(parameters.default, propertySpec.default);
152
+ const n = parameters.stops.length;
153
+ if (n === 1) return parameters.stops[0][1];
154
+ if (input <= parameters.stops[0][0]) return parameters.stops[0][1];
155
+ if (input >= parameters.stops[n - 1][0]) return parameters.stops[n - 1][1];
156
+
157
+ const index = findStopLessThanOrEqualTo(parameters.stops, input);
158
+
159
+ return parameters.stops[index][1];
160
+ }
161
+
162
+ function evaluateExponentialFunction(parameters, propertySpec, input) {
163
+ const base = parameters.base !== undefined ? parameters.base : 1;
164
+
165
+ // Edge cases
166
+ if (getType(input) !== 'number') return coalesce(parameters.default, propertySpec.default);
167
+ const n = parameters.stops.length;
168
+ if (n === 1) return parameters.stops[0][1];
169
+ if (input <= parameters.stops[0][0]) return parameters.stops[0][1];
170
+ if (input >= parameters.stops[n - 1][0]) return parameters.stops[n - 1][1];
171
+
172
+ const index = findStopLessThanOrEqualTo(parameters.stops, input);
173
+ const t = interpolationFactor(input, base, parameters.stops[index][0], parameters.stops[index + 1][0]);
174
+
175
+ const outputLower = parameters.stops[index][1];
176
+ const outputUpper = parameters.stops[index + 1][1];
177
+ let interp = interpolate[propertySpec.type] || identityFunction;
178
+
179
+ if (parameters.colorSpace && parameters.colorSpace !== 'rgb') {
180
+ const colorspace = colorSpaces[parameters.colorSpace];
181
+ interp = (a, b) => colorspace.reverse(colorspace.interpolate(colorspace.forward(a), colorspace.forward(b), t));
182
+ }
183
+
184
+ if (typeof outputLower.evaluate === 'function') {
185
+ return {
186
+ evaluate(...args) {
187
+ const evaluatedLower = outputLower.evaluate.apply(undefined, args);
188
+ const evaluatedUpper = outputUpper.evaluate.apply(undefined, args);
189
+ // Special case for fill-outline-color, which has no spec default.
190
+ if (evaluatedLower === undefined || evaluatedUpper === undefined) {
191
+ return undefined;
192
+ }
193
+ return interp(evaluatedLower, evaluatedUpper, t);
194
+ }
195
+ };
196
+ }
197
+
198
+ return interp(outputLower, outputUpper, t);
199
+ }
200
+
201
+ function evaluateIdentityFunction(parameters, propertySpec, input) {
202
+ switch (propertySpec.type) {
203
+ case 'color':
204
+ input = Color.parse(input);
205
+ break;
206
+ case 'enum':
207
+ if (!propertySpec.values.includes(input)) {
208
+ input = undefined;
209
+ }
210
+ break;
211
+ default:
212
+ if (getType(input) !== propertySpec.type) {
213
+ input = undefined;
214
+ }
215
+ }
216
+ return coalesce(input, parameters.default, propertySpec.default);
217
+ }
218
+
219
+ /**
220
+ * Returns the index of the last stop <= input, or 0 if it doesn't exist.
221
+ *
222
+ * @private
223
+ */
224
+ function findStopLessThanOrEqualTo(stops, input) {
225
+ const n = stops.length;
226
+ let lowerIndex = 0;
227
+ let upperIndex = n - 1;
228
+ let currentIndex = 0;
229
+ let currentValue;
230
+ let upperValue;
231
+
232
+ while (lowerIndex <= upperIndex) {
233
+ currentIndex = Math.floor((lowerIndex + upperIndex) / 2);
234
+ currentValue = stops[currentIndex][0];
235
+ upperValue = stops[currentIndex + 1][0];
236
+ if (input === currentValue || (input > currentValue && input < upperValue)) {
237
+ // Search complete
238
+ return currentIndex;
239
+ }
240
+ if (currentValue < input) {
241
+ lowerIndex = currentIndex + 1;
242
+ } else if (currentValue > input) {
243
+ upperIndex = currentIndex - 1;
244
+ }
245
+ }
246
+
247
+ return Math.max(currentIndex - 1, 0);
248
+ }
249
+
250
+ /**
251
+ * Returns a ratio that can be used to interpolate between exponential function
252
+ * stops.
253
+ *
254
+ * How it works:
255
+ * Two consecutive stop values define a (scaled and shifted) exponential
256
+ * function `f(x) = a * base^x + b`, where `base` is the user-specified base,
257
+ * and `a` and `b` are constants affording sufficient degrees of freedom to fit
258
+ * the function to the given stops.
259
+ *
260
+ * Here's a bit of algebra that lets us compute `f(x)` directly from the stop
261
+ * values without explicitly solving for `a` and `b`:
262
+ *
263
+ * First stop value: `f(x0) = y0 = a * base^x0 + b`
264
+ * Second stop value: `f(x1) = y1 = a * base^x1 + b`
265
+ * => `y1 - y0 = a(base^x1 - base^x0)`
266
+ * => `a = (y1 - y0)/(base^x1 - base^x0)`
267
+ *
268
+ * Desired value: `f(x) = y = a * base^x + b`
269
+ * => `f(x) = y0 + a * (base^x - base^x0)`
270
+ *
271
+ * From the above, we can replace the `a` in `a * (base^x - base^x0)` and do a
272
+ * little algebra:
273
+ * ```
274
+ * a * (base^x - base^x0) = (y1 - y0)/(base^x1 - base^x0) * (base^x - base^x0)
275
+ * = (y1 - y0) * (base^x - base^x0) / (base^x1 - base^x0)
276
+ * ```
277
+ *
278
+ * If we let `(base^x - base^x0) / (base^x1 base^x0)`, then we have
279
+ * `f(x) = y0 + (y1 - y0) * ratio`. In other words, `ratio` may be treated as
280
+ * an interpolation factor between the two stops' output values.
281
+ *
282
+ * (Note: a slightly different form for `ratio`,
283
+ * `(base^(x-x0) - 1) / (base^(x1-x0) - 1) `, is equivalent, but requires fewer
284
+ * expensive `Math.pow()` operations.)
285
+ *
286
+ * @private
287
+ */
288
+ function interpolationFactor(input, base, lowerValue, upperValue) {
289
+ const difference = upperValue - lowerValue;
290
+ const progress = input - lowerValue;
291
+
292
+ if (difference === 0) {
293
+ return 0;
294
+ }
295
+ if (base === 1) {
296
+ return progress / difference;
297
+ }
298
+ return (base ** progress - 1) / (base ** difference - 1);
299
+ }
@@ -0,0 +1,68 @@
1
+ const refProperties = require('./util/ref_properties');
2
+
3
+ function stringify(obj) {
4
+ const type = typeof obj;
5
+ if (type === 'number' || type === 'boolean' || type === 'string' || obj === undefined || obj === null)
6
+ return JSON.stringify(obj);
7
+
8
+ if (Array.isArray(obj)) {
9
+ let str = '[';
10
+ for (const val of obj) {
11
+ str += `${stringify(val)},`;
12
+ }
13
+ return `${str}]`;
14
+ }
15
+
16
+ const keys = Object.keys(obj).sort();
17
+
18
+ let str = '{';
19
+ for (let i = 0; i < keys.length; i++) {
20
+ str += `${JSON.stringify(keys[i])}:${stringify(obj[keys[i]])},`;
21
+ }
22
+ return `${str}}`;
23
+ }
24
+
25
+ function getKey(layer) {
26
+ let key = '';
27
+ for (const k of refProperties) {
28
+ key += `/${stringify(layer[k])}`;
29
+ }
30
+ return key;
31
+ }
32
+
33
+ module.exports = groupByLayout;
34
+
35
+ /**
36
+ * Given an array of layers, return an array of arrays of layers where all
37
+ * layers in each group have identical layout-affecting properties. These
38
+ * are the properties that were formerly used by explicit `ref` mechanism
39
+ * for layers: 'type', 'source', 'source-layer', 'minzoom', 'maxzoom',
40
+ * 'filter', and 'layout'.
41
+ *
42
+ * The input is not modified. The output layers are references to the
43
+ * input layers.
44
+ *
45
+ * @private
46
+ * @param {Array<Layer>} layers
47
+ * @returns {Array<Array<Layer>>}
48
+ */
49
+ function groupByLayout(layers) {
50
+ const groups = {};
51
+
52
+ for (let i = 0; i < layers.length; i++) {
53
+ const k = getKey(layers[i]);
54
+ let group = groups[k];
55
+ if (!group) {
56
+ group = groups[k] = [];
57
+ }
58
+ group.push(layers[i]);
59
+ }
60
+
61
+ const result = [];
62
+
63
+ for (const k in groups) {
64
+ result.push(groups[k]);
65
+ }
66
+
67
+ return result;
68
+ }