isard 1.0.0 → 1.2.0

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 (268) hide show
  1. package/CHANGELOG.md +51 -0
  2. package/dist/{basemaps.d.ts → basemap/basemaps.d.ts} +3 -3
  3. package/dist/{basemaps.js → basemap/basemaps.js} +3 -3
  4. package/dist/basemap/basemaps.js.map +1 -0
  5. package/dist/{grid.d.ts → basemap/grid.d.ts} +6 -6
  6. package/dist/{grid.js → basemap/grid.js} +61 -67
  7. package/dist/basemap/grid.js.map +1 -0
  8. package/dist/{mvt.d.ts → basemap/mvt.d.ts} +1 -1
  9. package/dist/{mvt.js → basemap/mvt.js} +6 -6
  10. package/dist/basemap/mvt.js.map +1 -0
  11. package/dist/{pmtiles.d.ts → basemap/pmtiles.d.ts} +16 -10
  12. package/dist/{pmtiles.js → basemap/pmtiles.js} +41 -33
  13. package/dist/basemap/pmtiles.js.map +1 -0
  14. package/dist/{resample.d.ts → basemap/resample.d.ts} +11 -2
  15. package/dist/{resample.js → basemap/resample.js} +18 -16
  16. package/dist/basemap/resample.js.map +1 -0
  17. package/dist/{terrain.d.ts → basemap/terrain.d.ts} +3 -3
  18. package/dist/{terrain.js → basemap/terrain.js} +7 -7
  19. package/dist/basemap/terrain.js.map +1 -0
  20. package/dist/{vectorstyle.d.ts → basemap/vectorstyle.d.ts} +12 -10
  21. package/dist/{vectorstyle.js → basemap/vectorstyle.js} +129 -111
  22. package/dist/basemap/vectorstyle.js.map +1 -0
  23. package/dist/{vectortiles.d.ts → basemap/vectortiles.d.ts} +18 -18
  24. package/dist/{vectortiles.js → basemap/vectortiles.js} +157 -109
  25. package/dist/basemap/vectortiles.js.map +1 -0
  26. package/dist/{wmts.d.ts → basemap/wmts.d.ts} +3 -3
  27. package/dist/{wmts.js → basemap/wmts.js} +19 -14
  28. package/dist/basemap/wmts.js.map +1 -0
  29. package/dist/basemap.worker.js +2 -2
  30. package/dist/basemap.worker.js.map +14 -13
  31. package/dist/bind/layers.d.ts +46 -0
  32. package/dist/bind/layers.js +154 -0
  33. package/dist/bind/layers.js.map +1 -0
  34. package/dist/{crs.d.ts → data/crs.d.ts} +11 -11
  35. package/dist/{crs.js → data/crs.js} +38 -34
  36. package/dist/data/crs.js.map +1 -0
  37. package/dist/{gpx.d.ts → data/gpx.d.ts} +2 -2
  38. package/dist/{gpx.js → data/gpx.js} +20 -20
  39. package/dist/data/gpx.js.map +1 -0
  40. package/dist/{kml.d.ts → data/kml.d.ts} +2 -2
  41. package/dist/{kml.js → data/kml.js} +42 -39
  42. package/dist/data/kml.js.map +1 -0
  43. package/dist/{topojson.d.ts → data/topojson.d.ts} +2 -2
  44. package/dist/{topojson.js → data/topojson.js} +15 -10
  45. package/dist/data/topojson.js.map +1 -0
  46. package/dist/{xml.d.ts → data/xml.d.ts} +5 -5
  47. package/dist/{xml.js → data/xml.js} +19 -18
  48. package/dist/data/xml.js.map +1 -0
  49. package/dist/decoder.worker.js +4 -4
  50. package/dist/decoder.worker.js.map +7 -7
  51. package/dist/{decoders.d.ts → engine/decoders.d.ts} +3 -3
  52. package/dist/{decoders.js → engine/decoders.js} +28 -25
  53. package/dist/engine/decoders.js.map +1 -0
  54. package/dist/{loader.d.ts → engine/loader.d.ts} +1 -1
  55. package/dist/{loader.js → engine/loader.js} +17 -14
  56. package/dist/engine/loader.js.map +1 -0
  57. package/dist/{protocol.d.ts → engine/protocol.d.ts} +1 -1
  58. package/dist/engine/protocol.js +3 -0
  59. package/dist/engine/protocol.js.map +1 -0
  60. package/dist/{requests.d.ts → engine/requests.d.ts} +1 -1
  61. package/dist/{requests.js → engine/requests.js} +19 -16
  62. package/dist/engine/requests.js.map +1 -0
  63. package/dist/engine-loader.d.ts +13 -9
  64. package/dist/engine-loader.js +30 -30
  65. package/dist/engine-loader.js.map +1 -1
  66. package/dist/formats.d.ts +3 -3
  67. package/dist/formats.js +3 -3
  68. package/dist/formats.js.map +1 -1
  69. package/dist/geoplateforme.d.ts +13 -13
  70. package/dist/geoplateforme.js +23 -21
  71. package/dist/geoplateforme.js.map +1 -1
  72. package/dist/index.d.ts +30 -29
  73. package/dist/index.js +18 -18
  74. package/dist/index.js.map +1 -1
  75. package/dist/isard_bg.wasm +0 -0
  76. package/dist/isard_core_bg.wasm +0 -0
  77. package/dist/isard_points_bg.wasm +0 -0
  78. package/dist/{extrusions.d.ts → layers/extrusions.d.ts} +1 -1
  79. package/dist/{extrusions.js → layers/extrusions.js} +10 -5
  80. package/dist/layers/extrusions.js.map +1 -0
  81. package/dist/{features.d.ts → layers/features.d.ts} +10 -10
  82. package/dist/{features.js → layers/features.js} +44 -45
  83. package/dist/layers/features.js.map +1 -0
  84. package/dist/{glyphs.d.ts → layers/glyphs.d.ts} +6 -6
  85. package/dist/{glyphs.js → layers/glyphs.js} +45 -41
  86. package/dist/layers/glyphs.js.map +1 -0
  87. package/dist/{icons.d.ts → layers/icons.d.ts} +10 -10
  88. package/dist/{icons.js → layers/icons.js} +84 -69
  89. package/dist/layers/icons.js.map +1 -0
  90. package/dist/{layers.d.ts → layers/layers.d.ts} +9 -4
  91. package/dist/{layers.js → layers/layers.js} +35 -31
  92. package/dist/layers/layers.js.map +1 -0
  93. package/dist/{panoramas.d.ts → layers/panoramas.d.ts} +3 -3
  94. package/dist/{panoramas.js → layers/panoramas.js} +54 -43
  95. package/dist/layers/panoramas.js.map +1 -0
  96. package/dist/{pointclouds.d.ts → layers/pointclouds.d.ts} +5 -5
  97. package/dist/{pointclouds.js → layers/pointclouds.js} +26 -34
  98. package/dist/layers/pointclouds.js.map +1 -0
  99. package/dist/{symbols.d.ts → layers/symbols.d.ts} +3 -3
  100. package/dist/{symbols.js → layers/symbols.js} +69 -72
  101. package/dist/layers/symbols.js.map +1 -0
  102. package/dist/map/basemap-layers.d.ts +26 -0
  103. package/dist/map/basemap-layers.js +61 -0
  104. package/dist/map/basemap-layers.js.map +1 -0
  105. package/dist/map/canvas.d.ts +17 -0
  106. package/dist/map/canvas.js +56 -0
  107. package/dist/map/canvas.js.map +1 -0
  108. package/dist/map/checks.d.ts +11 -0
  109. package/dist/map/checks.js +39 -0
  110. package/dist/map/checks.js.map +1 -0
  111. package/dist/map/credits.d.ts +17 -0
  112. package/dist/map/credits.js +34 -0
  113. package/dist/map/credits.js.map +1 -0
  114. package/dist/map/engine-settings.d.ts +15 -0
  115. package/dist/map/engine-settings.js +45 -0
  116. package/dist/map/engine-settings.js.map +1 -0
  117. package/dist/map/engines.d.ts +41 -0
  118. package/dist/map/engines.js +77 -0
  119. package/dist/map/engines.js.map +1 -0
  120. package/dist/map/events.d.ts +14 -0
  121. package/dist/map/events.js +46 -0
  122. package/dist/map/events.js.map +1 -0
  123. package/dist/map/frame-loop.d.ts +61 -0
  124. package/dist/map/frame-loop.js +139 -0
  125. package/dist/map/frame-loop.js.map +1 -0
  126. package/dist/map/hover-pick.d.ts +30 -0
  127. package/dist/map/hover-pick.js +56 -0
  128. package/dist/map/hover-pick.js.map +1 -0
  129. package/dist/map/layer-spec.d.ts +42 -0
  130. package/dist/map/layer-spec.js +34 -0
  131. package/dist/map/layer-spec.js.map +1 -0
  132. package/dist/map/layer-stack.d.ts +36 -0
  133. package/dist/map/layer-stack.js +101 -0
  134. package/dist/map/layer-stack.js.map +1 -0
  135. package/dist/map/overlay-host.d.ts +36 -0
  136. package/dist/map/overlay-host.js +101 -0
  137. package/dist/map/overlay-host.js.map +1 -0
  138. package/dist/map/panorama-host.d.ts +5 -0
  139. package/dist/map/panorama-host.js +32 -0
  140. package/dist/map/panorama-host.js.map +1 -0
  141. package/dist/map/raster-source.d.ts +11 -0
  142. package/dist/map/raster-source.js +26 -0
  143. package/dist/map/raster-source.js.map +1 -0
  144. package/dist/map/symbol-atlases.d.ts +26 -0
  145. package/dist/map/symbol-atlases.js +59 -0
  146. package/dist/map/symbol-atlases.js.map +1 -0
  147. package/dist/map/viewshed.d.ts +5 -0
  148. package/dist/map/viewshed.js +28 -0
  149. package/dist/map/viewshed.js.map +1 -0
  150. package/dist/map/workers.d.ts +46 -0
  151. package/dist/map/workers.js +73 -0
  152. package/dist/map/workers.js.map +1 -0
  153. package/dist/map.d.ts +46 -127
  154. package/dist/map.js +183 -698
  155. package/dist/map.js.map +1 -1
  156. package/dist/projections.d.ts +3 -3
  157. package/dist/projections.js +2 -2
  158. package/dist/projections.js.map +1 -1
  159. package/dist/react/Control.d.ts +11 -0
  160. package/dist/react/Control.js +18 -0
  161. package/dist/react/Control.js.map +1 -0
  162. package/dist/react/CustomLayer.d.ts +11 -0
  163. package/dist/react/CustomLayer.js +30 -0
  164. package/dist/react/CustomLayer.js.map +1 -0
  165. package/dist/react/IsardMap.d.ts +43 -0
  166. package/dist/react/IsardMap.js +146 -0
  167. package/dist/react/IsardMap.js.map +1 -0
  168. package/dist/react/Layer.d.ts +42 -0
  169. package/dist/react/Layer.js +74 -0
  170. package/dist/react/Layer.js.map +1 -0
  171. package/dist/react/Marker.d.ts +24 -0
  172. package/dist/react/Marker.js +53 -0
  173. package/dist/react/Marker.js.map +1 -0
  174. package/dist/react/Panel.d.ts +11 -0
  175. package/dist/react/Panel.js +37 -0
  176. package/dist/react/Panel.js.map +1 -0
  177. package/dist/react/Popup.d.ts +18 -0
  178. package/dist/react/Popup.js +60 -0
  179. package/dist/react/Popup.js.map +1 -0
  180. package/dist/react/Swipe.d.ts +9 -0
  181. package/dist/react/Swipe.js +41 -0
  182. package/dist/react/Swipe.js.map +1 -0
  183. package/dist/react/Viewshed.d.ts +5 -0
  184. package/dist/react/Viewshed.js +28 -0
  185. package/dist/react/Viewshed.js.map +1 -0
  186. package/dist/react/context.d.ts +32 -0
  187. package/dist/react/context.js +20 -0
  188. package/dist/react/context.js.map +1 -0
  189. package/dist/react/index.d.ts +26 -0
  190. package/dist/react/index.js +22 -0
  191. package/dist/react/index.js.map +1 -0
  192. package/dist/settings.d.ts +6 -10
  193. package/dist/settings.js +19 -17
  194. package/dist/settings.js.map +1 -1
  195. package/dist/types.d.ts +8 -8
  196. package/dist/types.js +1 -0
  197. package/dist/types.js.map +1 -1
  198. package/dist/{controls.d.ts → ui/controls.d.ts} +1 -1
  199. package/dist/{controls.js → ui/controls.js} +6 -4
  200. package/dist/ui/controls.js.map +1 -0
  201. package/dist/{interaction.d.ts → ui/interaction.d.ts} +9 -5
  202. package/dist/{interaction.js → ui/interaction.js} +9 -8
  203. package/dist/ui/interaction.js.map +1 -0
  204. package/dist/{overlay.d.ts → ui/overlay.d.ts} +2 -2
  205. package/dist/{overlay.js → ui/overlay.js} +18 -20
  206. package/dist/ui/overlay.js.map +1 -0
  207. package/dist/{style.d.ts → ui/style.d.ts} +1 -1
  208. package/dist/{style.js → ui/style.js} +2 -2
  209. package/dist/ui/style.js.map +1 -0
  210. package/dist/{animation.d.ts → util/animation.d.ts} +9 -5
  211. package/dist/{animation.js → util/animation.js} +6 -6
  212. package/dist/util/animation.js.map +1 -0
  213. package/dist/{color.d.ts → util/color.d.ts} +1 -1
  214. package/dist/{color.js → util/color.js} +14 -16
  215. package/dist/util/color.js.map +1 -0
  216. package/dist/{geo.d.ts → util/geo.d.ts} +6 -6
  217. package/dist/{geo.js → util/geo.js} +12 -12
  218. package/dist/util/geo.js.map +1 -0
  219. package/dist/util/guards.d.ts +7 -0
  220. package/dist/util/guards.js +8 -0
  221. package/dist/util/guards.js.map +1 -0
  222. package/dist/util/lru.js.map +1 -0
  223. package/dist/wasm/isard.d.ts +168 -0
  224. package/dist/wasm/isard.js +146 -0
  225. package/dist/wasm/isard_core.d.ts +144 -0
  226. package/dist/wasm/isard_core.js +122 -0
  227. package/dist/{basemap.worker.d.ts → workers/basemap.worker.d.ts} +17 -7
  228. package/dist/workers/basemap.worker.js +658 -0
  229. package/dist/workers/basemap.worker.js.map +1 -0
  230. package/package.json +24 -1
  231. package/vite.js +1 -1
  232. package/dist/animation.js.map +0 -1
  233. package/dist/basemaps.js.map +0 -1
  234. package/dist/color.js.map +0 -1
  235. package/dist/controls.js.map +0 -1
  236. package/dist/crs.js.map +0 -1
  237. package/dist/decoders.js.map +0 -1
  238. package/dist/extrusions.js.map +0 -1
  239. package/dist/features.js.map +0 -1
  240. package/dist/geo.js.map +0 -1
  241. package/dist/glyphs.js.map +0 -1
  242. package/dist/gpx.js.map +0 -1
  243. package/dist/grid.js.map +0 -1
  244. package/dist/icons.js.map +0 -1
  245. package/dist/interaction.js.map +0 -1
  246. package/dist/kml.js.map +0 -1
  247. package/dist/layers.js.map +0 -1
  248. package/dist/loader.js.map +0 -1
  249. package/dist/lru.js.map +0 -1
  250. package/dist/mvt.js.map +0 -1
  251. package/dist/overlay.js.map +0 -1
  252. package/dist/panoramas.js.map +0 -1
  253. package/dist/pmtiles.js.map +0 -1
  254. package/dist/pointclouds.js.map +0 -1
  255. package/dist/protocol.js +0 -2
  256. package/dist/protocol.js.map +0 -1
  257. package/dist/requests.js.map +0 -1
  258. package/dist/resample.js.map +0 -1
  259. package/dist/style.js.map +0 -1
  260. package/dist/symbols.js.map +0 -1
  261. package/dist/terrain.js.map +0 -1
  262. package/dist/topojson.js.map +0 -1
  263. package/dist/vectorstyle.js.map +0 -1
  264. package/dist/vectortiles.js.map +0 -1
  265. package/dist/wmts.js.map +0 -1
  266. package/dist/xml.js.map +0 -1
  267. /package/dist/{lru.d.ts → util/lru.d.ts} +0 -0
  268. /package/dist/{lru.js → util/lru.js} +0 -0
@@ -1,19 +1,20 @@
1
1
  {
2
2
  "version": 3,
3
- "sources": ["../src/geo.ts", "../src/lru.ts", "../src/mvt.ts", "../src/requests.ts", "../src/pmtiles.ts", "../src/resample.ts", "../src/terrain.ts", "../src/color.ts", "../src/vectorstyle.ts", "../src/basemap.worker.ts"],
3
+ "sources": ["../src/basemap/mvt.ts", "../src/engine/requests.ts", "../src/util/guards.ts", "../src/util/lru.ts", "../src/basemap/pmtiles.ts", "../src/basemap/resample.ts", "../src/basemap/terrain.ts", "../src/util/color.ts", "../src/basemap/vectorstyle.ts", "../src/util/geo.ts", "../src/workers/basemap.worker.ts"],
4
4
  "sourcesContent": [
5
- "/**\n * Web Mercator in [0, 1] across the world (y towards the south), for the page and the workers alike: the positions\n * sent to the engine, the tiles of a view, the flights, the label candidates of the vector tiles.\n */\n\n/** The latitude where Web Mercator is square: the edges of the map */\nconst MAX_LAT = 85.051128779806589;\n\n/** Mercator x of a longitude (degrees) */\nexport function mercatorX(lon: number): number {\n return (lon + 180) / 360;\n}\n\n/** Mercator y of a latitude (degrees), clamped to the edges of the map */\nexport function mercatorY(lat: number): number {\n const phi = (Math.max(-MAX_LAT, Math.min(MAX_LAT, lat)) * Math.PI) / 180;\n return 0.5 - Math.log(Math.tan(Math.PI / 4 + phi / 2)) / (2 * Math.PI);\n}\n\n/** Longitude (degrees) of a Mercator x */\nexport function longitude(x: number): number {\n return x * 360 - 180;\n}\n\n/** Latitude (degrees) of a Mercator y */\nexport function latitude(y: number): number {\n return (Math.atan(Math.sinh(Math.PI * (1 - 2 * y))) * 180) / Math.PI;\n}\n\n/** Mercator x, y of a longitude and latitude */\nexport function toMercator([lon, lat]: readonly [number, number, ...unknown[]]): [x: number, y: number] {\n return [mercatorX(lon), mercatorY(lat)];\n}\n\n/** Longitude and latitude of a Mercator x, y */\nexport function fromMercator([x, y]: readonly [number, number]): [lon: number, lat: number] {\n return [longitude(x), latitude(y)];\n}\n",
6
- "/**\n * A cache keeping its most recently used entries (the decoded tiles and images of the workers, the source tiles of a\n * reprojection, the labels of the vector tiles): a `Map` in order of use, the least recent dropped past `capacity`.\n */\nexport class Lru<K, V> {\n private readonly entries = new Map<K, V>();\n\n /** `evict`: told of each entry dropped for room (not of those deleted) */\n constructor(\n public capacity: number,\n private readonly evict?: (value: V, key: K) => void,\n ) {}\n\n get size(): number {\n return this.entries.size;\n }\n\n /** The value of a key, now the most recently used; undefined if absent */\n get(key: K): V | undefined {\n const value = this.entries.get(key);\n if (value !== undefined) {\n this.entries.delete(key);\n this.entries.set(key, value);\n }\n return value;\n }\n\n /** Whether a key is kept, without using it */\n has(key: K): boolean {\n return this.entries.has(key);\n }\n\n /** Adds or replaces a value, the most recently used; drops the least recent ones past the capacity */\n set(key: K, value: V): void {\n this.entries.delete(key);\n this.entries.set(key, value);\n for (const [oldest, old] of this.entries) {\n if (this.entries.size <= this.capacity) break;\n this.entries.delete(oldest);\n this.evict?.(old, oldest);\n }\n }\n\n delete(key: K): boolean {\n return this.entries.delete(key);\n }\n\n /** The values, least recently used first */\n values(): IterableIterator<V> {\n return this.entries.values();\n }\n\n clear(): void {\n this.entries.clear();\n }\n}\n",
7
- "/**\n * Mapbox Vector Tiles (MVT 2.1) decoding: layers of features with their properties and geometry, in tile units\n * (`extent`, usually 4096 across). Points are lists of points, lines lists of lines, polygons lists of rings (the\n * outer ones clockwise in tile coordinates, y down, holes the other way round, as the specification says).\n */\n\nexport type Value = string | number | boolean;\n\nexport interface TileFeature {\n /** 1 point, 2 line, 3 polygon */\n type: 1 | 2 | 3;\n properties: Record<string, Value>;\n /** Point lists: x0, y0, x1, y1… in tile units */\n geometry: number[][];\n}\n\nexport interface TileLayer {\n extent: number;\n features: TileFeature[];\n}\n\n/** Protobuf reader of a buffer range */\nclass Pbf {\n pos: number;\n constructor(\n private readonly buf: Uint8Array,\n start = 0,\n readonly end = buf.length,\n ) {\n this.pos = start;\n }\n /** An unsigned varint, approximated beyond 2^53; all its bytes are read (up to 10), so the next field is right */\n varint(): number {\n let value = 0;\n for (let shift = 0; shift < 70; shift += 7) {\n const b = this.buf[this.pos++] ?? 0;\n value += (b & 0x7f) * 2 ** shift;\n if (b < 0x80) break;\n }\n return value;\n }\n /** A signed 64-bit varint (two's complement: a negative value takes 10 bytes) */\n int64(): number {\n let lo = 0;\n let hi = 0;\n for (let i = 0; i < 10; i += 1) {\n const b = this.buf[this.pos++] ?? 0;\n const bits = b & 0x7f;\n // Bits 0-27 in the low word, bits 28-31 split, the rest in the high word\n if (i < 4) lo |= bits << (7 * i);\n else if (i === 4) {\n lo |= (bits & 0x0f) << 28;\n hi |= bits >> 4;\n } else hi |= bits << (7 * i - 32);\n if (b < 0x80) break;\n }\n // The high word signed: values from 2^63 up are negative\n return (hi | 0) * 2 ** 32 + (lo >>> 0);\n }\n sint(): number {\n const v = this.varint();\n return v % 2 === 1 ? -(v + 1) / 2 : v / 2;\n }\n /** A length-delimited field as a sub-reader */\n sub(): Pbf {\n const n = this.varint();\n // A length past the end (a truncated tile) stops at the end\n const end = Math.min(this.pos + n, this.end);\n const r = new Pbf(this.buf, this.pos, end);\n this.pos = end;\n return r;\n }\n string(): string {\n const n = this.varint();\n const end = Math.min(this.pos + n, this.end);\n const s = decoder.decode(this.buf.subarray(this.pos, end));\n this.pos = end;\n return s;\n }\n float(): number {\n const v = this.pos + 4 <= this.end ? this.view().getFloat32(this.pos, true) : 0;\n this.pos += 4;\n return v;\n }\n double(): number {\n const v = this.pos + 8 <= this.end ? this.view().getFloat64(this.pos, true) : 0;\n this.pos += 8;\n return v;\n }\n private view(): DataView {\n return new DataView(this.buf.buffer, this.buf.byteOffset, this.buf.byteLength);\n }\n skip(wire: number): void {\n if (wire === 0) this.varint();\n else if (wire === 1) this.pos += 8;\n else if (wire === 2) this.pos += this.varint();\n else if (wire === 5) this.pos += 4;\n }\n get more(): boolean {\n return this.pos < this.end;\n }\n}\n\nconst decoder = new TextDecoder();\n\nfunction value(p: Pbf): Value {\n let v: Value = '';\n while (p.more) {\n const tag = p.varint();\n switch (tag >> 3) {\n case 1:\n v = p.string();\n break;\n case 2:\n v = p.float();\n break;\n case 3:\n v = p.double();\n break;\n case 4:\n v = p.int64();\n break;\n case 5:\n v = p.varint();\n break;\n case 6:\n v = p.sint();\n break;\n case 7:\n v = p.varint() !== 0;\n break;\n default:\n p.skip(tag & 7);\n }\n }\n return v;\n}\n\n/** Point lists of a geometry's commands (MoveTo, LineTo, ClosePath) */\nfunction geometry(p: Pbf): number[][] {\n const out: number[][] = [];\n let current: number[] | undefined;\n let [x, y] = [0, 0];\n while (p.more) {\n const command = p.varint();\n const id = command & 7;\n const count = command >> 3;\n if (id === 7) {\n // ClosePath: back to the first point\n if (current && current.length >= 2) current.push(current[0] ?? 0, current[1] ?? 0);\n continue;\n }\n // A count past the end (a truncated geometry) stops there\n for (let i = 0; i < count && p.more; i += 1) {\n x += p.sint();\n y += p.sint();\n if (id === 1) {\n current = [];\n out.push(current);\n }\n current?.push(x, y);\n }\n }\n return out;\n}\n\n/** Decodes a tile; only the layers in `wanted` (all if undefined) */\nexport function decode(bytes: Uint8Array, wanted?: Set<string>): Map<string, TileLayer> {\n const layers = new Map<string, TileLayer>();\n const tile = new Pbf(bytes);\n while (tile.more) {\n const tag = tile.varint();\n if (tag >> 3 !== 3) {\n tile.skip(tag & 7);\n continue;\n }\n const l = tile.sub();\n let name = '';\n let extent = 4096;\n const keys: string[] = [];\n const values: Value[] = [];\n const raw: Pbf[] = [];\n while (l.more) {\n const t = l.varint();\n switch (t >> 3) {\n case 1:\n name = l.string();\n break;\n case 2:\n raw.push(l.sub());\n break;\n case 3:\n keys.push(l.string());\n break;\n case 4:\n values.push(value(l.sub()));\n break;\n case 5:\n extent = l.varint();\n break;\n default:\n l.skip(t & 7);\n }\n }\n if (wanted && !wanted.has(name)) continue;\n const features: TileFeature[] = [];\n for (const f of raw) {\n let type: 1 | 2 | 3 = 1;\n const properties: Record<string, Value> = {};\n let geom: number[][] = [];\n while (f.more) {\n const t = f.varint();\n switch (t >> 3) {\n case 2: {\n const tags = f.sub();\n while (tags.more) {\n const k = keys[tags.varint()];\n const v = values[tags.varint()];\n if (k !== undefined && v !== undefined) properties[k] = v;\n }\n break;\n }\n case 3:\n type = Math.min(3, Math.max(1, f.varint())) as 1 | 2 | 3;\n break;\n case 4:\n geom = geometry(f.sub());\n break;\n default:\n f.skip(t & 7);\n }\n }\n features.push({ type, properties, geometry: geom });\n }\n layers.set(name, { extent, features });\n }\n return layers;\n}\n",
8
- "/**\n * Headers added to the requests of the page by URL prefix: an access token for private sources (a Géoplateforme\n * private stream, a server behind single sign-on), on every request isard makes, from the page, its workers (vector\n * tiles, 3D Tiles and point clouds) and its engine (raster tiles, tilesets): `setRequestHeaders(prefix, headers)`,\n * again with a new token when it is renewed. The rules of a URL are merged, the longest prefix last (it wins).\n */\n\n/** Rules: a URL prefix and its headers, the shortest prefix first */\nexport type HeaderRules = [prefix: string, headers: Record<string, string>][];\n\nlet rules: HeaderRules = [];\nconst listeners = new Set<(rules: HeaderRules) => void>();\n\n/**\n * Adds `headers` to every request isard makes to a URL starting with `prefix` (in the page and its workers), or with\n * no headers, stops: `setRequestHeaders('https://data.geopf.fr/private/', { Authorization: 'Bearer …' })`. The\n * server must allow these headers (CORS). For the whole page: every map, the ones to come too\n */\nexport function setRequestHeaders(prefix: string, headers?: Record<string, string>): void {\n const kept = rules.filter(([p]) => p !== prefix);\n if (headers && Object.keys(headers).length > 0) kept.push([prefix, { ...headers }]);\n kept.sort(([p], [q]) => p.length - q.length);\n setHeaderRules(kept);\n for (const listener of listeners) listener(rules);\n}\n\n/** @internal The rules now */\nexport function headerRules(): HeaderRules {\n return rules;\n}\n\n/** @internal The rules, from the page (a worker's copy) */\nexport function setHeaderRules(next: HeaderRules): void {\n rules = next;\n}\n\n/** @internal Follows the rules (the workers and engines of a map); returns the function that stops */\nexport function onHeaderRules(listener: (rules: HeaderRules) => void): () => void {\n listeners.add(listener);\n return () => listeners.delete(listener);\n}\n\n/** @internal `init` with the headers of the rules matching `url` (unchanged when none does) */\nexport function withHeaders<T extends RequestInit>(url: string | URL, init?: T): T {\n const href = String(url);\n const matching = rules.filter(([prefix]) => href.startsWith(prefix));\n if (matching.length === 0) return init ?? ({} as T);\n const headers = new Headers(init?.headers);\n for (const [, set] of matching) for (const [name, value] of Object.entries(set)) headers.set(name, value);\n return { ...(init ?? ({} as T)), headers };\n}\n",
9
- "/**\n * PMTiles v3 archives: one file of tiles read by HTTP range requests (or from a `Blob`), as Protomaps publishes them.\n * The header and root directory in one request, the leaf directories as needed (kept in a small cache), each tile in\n * its own range; gzip through `DecompressionStream`. The same reader in the page (raster tiles) and in the basemap\n * workers (vector tiles of a style source `pmtiles://…`, as MapLibre's protocol names them).\n */\nimport { Lru } from './lru.ts';\nimport { withHeaders } from './requests.ts';\n\n/** What a PMTiles archive's tiles are */\nexport type PmtilesTileType = 'unknown' | 'mvt' | 'png' | 'jpeg' | 'webp' | 'avif';\n\n/** The header of a PMTiles archive (v3) */\nexport interface PmtilesHeader {\n rootDirectoryOffset: number;\n rootDirectoryLength: number;\n metadataOffset: number;\n metadataLength: number;\n leafDirectoryOffset: number;\n leafDirectoryLength: number;\n tileDataOffset: number;\n tileDataLength: number;\n /** 1 none, 2 gzip, 3 brotli, 4 zstd (only none and gzip are read) */\n internalCompression: number;\n tileCompression: number;\n tileType: PmtilesTileType;\n minZoom: number;\n maxZoom: number;\n /** `[west, south, east, north]`, degrees */\n bounds: [number, number, number, number];\n center: [lon: number, lat: number, zoom: number];\n}\n\n/** An entry of a directory: a run of tiles (`runLength` > 0) or a leaf directory (0) */\nexport interface PmtilesEntry {\n tileId: number;\n offset: number;\n length: number;\n runLength: number;\n}\n\nconst HEADER = 127;\n/** The header and the root directory lie within the first 16 KB of the file */\nconst FIRST = 16384;\nconst TYPES: PmtilesTileType[] = ['unknown', 'mvt', 'png', 'jpeg', 'webp', 'avif'];\n\n/** Tiles before level z: (4^z - 1) / 3 */\nconst levelStart = (z: number) => (4 ** z - 1) / 3;\n\n/** The tile id of z/x/y: the tiles of the lower levels, then the position along the level's Hilbert curve */\nexport function zxyToTileId(z: number, x: number, y: number): number {\n if (z > 26) throw new Error(`isard: PMTiles level ${z} past 26`);\n const n = 2 ** z;\n if (x < 0 || y < 0 || x >= n || y >= n) throw new Error(`isard: PMTiles tile ${z}/${x}/${y} out of its level`);\n let [px, py] = [x, y];\n let d = 0;\n for (let s = n / 2; s >= 1; s /= 2) {\n const rx = (px & s) > 0 ? 1 : 0;\n const ry = (py & s) > 0 ? 1 : 0;\n d += s * s * ((3 * rx) ^ ry);\n if (ry === 0) {\n if (rx === 1) [px, py] = [s - 1 - px, s - 1 - py];\n [px, py] = [py, px];\n }\n }\n return levelStart(z) + d;\n}\n\n/** The z/x/y of a tile id (the inverse of `zxyToTileId`) */\nexport function tileIdToZxy(id: number): [z: number, x: number, y: number] {\n let z = 0;\n while (levelStart(z + 1) <= id) z += 1;\n const n = 2 ** z;\n let t = id - levelStart(z);\n let [x, y] = [0, 0];\n for (let s = 1; s < n; s *= 2) {\n // Arithmetic, not bitwise: positions pass 32 bits past level 16\n const rx = Math.floor(t / 2) % 2;\n const ry = (t % 2) ^ rx;\n if (ry === 0) {\n if (rx === 1) [x, y] = [s - 1 - x, s - 1 - y];\n [x, y] = [y, x];\n }\n x += s * rx;\n y += s * ry;\n t = Math.floor(t / 4);\n }\n return [z, x, y];\n}\n\n/** A reader of unsigned varints past 32 bits (tile ids reach 2^52) */\nclass Varints {\n pos = 0;\n constructor(private readonly bytes: Uint8Array) {}\n next(): number {\n let value = 0;\n let scale = 1;\n for (;;) {\n const b = this.bytes[this.pos++];\n if (b === undefined) throw new Error('isard: PMTiles directory truncated');\n value += (b & 0x7f) * scale;\n if (b < 0x80) return value;\n scale *= 128;\n if (scale > 2 ** 63) throw new Error('isard: PMTiles varint too long');\n }\n }\n}\n\n/** The entries of a directory (decompressed) */\nexport function parseDirectory(bytes: Uint8Array): PmtilesEntry[] {\n const v = new Varints(bytes);\n const count = v.next();\n if (count > bytes.length) throw new Error('isard: PMTiles directory larger than its bytes');\n const entries: PmtilesEntry[] = [];\n let id = 0;\n for (let i = 0; i < count; i += 1) {\n id += v.next();\n entries.push({ tileId: id, offset: 0, length: 0, runLength: 1 });\n }\n for (const e of entries) e.runLength = v.next();\n for (const e of entries) e.length = v.next();\n entries.forEach((e, i) => {\n const value = v.next();\n const previous = entries[i - 1];\n // 0 after the first: right after the previous entry's bytes\n e.offset = value === 0 && previous ? previous.offset + previous.length : value - 1;\n });\n return entries;\n}\n\n/** The entry holding a tile id: its run of tiles, or the leaf directory it falls in; undefined if none */\nexport function findEntry(entries: readonly PmtilesEntry[], id: number): PmtilesEntry | undefined {\n let [lo, hi] = [0, entries.length - 1];\n while (lo <= hi) {\n const mid = (lo + hi) >> 1;\n const e = entries[mid] as PmtilesEntry;\n if (e.tileId === id) return e;\n if (e.tileId < id) lo = mid + 1;\n else hi = mid - 1;\n }\n const e = entries[hi];\n if (!e) return undefined;\n if (e.runLength === 0 || id - e.tileId < e.runLength) return e;\n return undefined;\n}\n\n/** The header of an archive from its first bytes */\nexport function parseHeader(bytes: Uint8Array): PmtilesHeader {\n if (bytes.length < HEADER || String.fromCharCode(...bytes.subarray(0, 7)) !== 'PMTiles') {\n throw new Error('isard: not a PMTiles archive');\n }\n if (bytes[7] !== 3) throw new Error(`isard: PMTiles version ${bytes[7]} (only 3 is read)`);\n const view = new DataView(bytes.buffer, bytes.byteOffset, bytes.byteLength);\n const u64 = (at: number) => Number(view.getBigUint64(at, true));\n const deg = (at: number) => view.getInt32(at, true) / 1e7;\n return {\n rootDirectoryOffset: u64(8),\n rootDirectoryLength: u64(16),\n metadataOffset: u64(24),\n metadataLength: u64(32),\n leafDirectoryOffset: u64(40),\n leafDirectoryLength: u64(48),\n tileDataOffset: u64(56),\n tileDataLength: u64(64),\n internalCompression: view.getUint8(97),\n tileCompression: view.getUint8(98),\n tileType: TYPES[view.getUint8(99)] ?? 'unknown',\n minZoom: view.getUint8(100),\n maxZoom: view.getUint8(101),\n bounds: [deg(102), deg(106), deg(110), deg(114)],\n center: [deg(119), deg(123), view.getUint8(118)],\n };\n}\n\n/** Bytes as they are stored, decompressed (1: none, 2: gzip; 0, unknown, is read as none) */\nexport async function decompress(bytes: Uint8Array, compression: number): Promise<Uint8Array> {\n if (compression === 0 || compression === 1) return bytes;\n if (compression !== 2) {\n throw new Error(`isard: PMTiles compression ${compression === 3 ? 'brotli' : 'zstd'} is not read (gzip only)`);\n }\n const stream = new Blob([bytes as Uint8Array<ArrayBuffer>]).stream().pipeThrough(new DecompressionStream('gzip'));\n return new Uint8Array(await new Response(stream).arrayBuffer());\n}\n\n/** Past this, a whole file sent for a range request (a server ignoring ranges) is an error rather than kept */\nconst WHOLE_FILE_MAX = 64 * 1024 * 1024;\n\n/** A PMTiles archive at a URL (range requests) or in a `Blob` (a dropped file) */\nexport class PMTiles {\n private head: Promise<{ header: PmtilesHeader; root: PmtilesEntry[] }> | undefined;\n /** The leaf directories read, by offset */\n private readonly leaves = new Lru<number, Promise<PmtilesEntry[]>>(64);\n /** The whole file, when the server answered a range request with it (small files, `blob:` URLs) */\n private whole: Promise<Uint8Array> | undefined;\n\n constructor(readonly source: string | Blob) {}\n\n /** `length` bytes from `offset` */\n private async range(offset: number, length: number, signal?: AbortSignal): Promise<Uint8Array> {\n if (typeof this.source !== 'string') {\n return new Uint8Array(await this.source.slice(offset, offset + length).arrayBuffer());\n }\n if (this.whole) return (await this.whole).subarray(offset, offset + length);\n const response = await fetch(\n this.source,\n withHeaders(this.source, {\n headers: { Range: `bytes=${offset}-${offset + Math.max(length, 1) - 1}` },\n ...(signal ? { signal } : {}),\n }),\n );\n if (!response.ok) throw new Error(`${this.source}: HTTP ${response.status}`);\n if (response.status === 206) return new Uint8Array(await response.arrayBuffer());\n // The whole file: kept, when small enough, for the next ranges\n const size = Number(response.headers.get('Content-Length'));\n if (size > WHOLE_FILE_MAX) {\n await response.body?.cancel();\n throw new Error(`${this.source}: the server ignores range requests (HTTP 206 expected)`);\n }\n const whole = response.arrayBuffer().then((b) => new Uint8Array(b));\n this.whole = whole;\n whole.catch(() => {\n this.whole = undefined;\n });\n return (await whole).subarray(offset, offset + length);\n }\n\n private load() {\n this.head ??= (async () => {\n const first = await this.range(0, FIRST);\n const header = parseHeader(first);\n const { rootDirectoryOffset: o, rootDirectoryLength: n } = header;\n const raw = o + n <= first.length ? first.subarray(o, o + n) : await this.range(o, n);\n const root = parseDirectory(await decompress(raw, header.internalCompression));\n return { header, root };\n })();\n // A failure is not kept: asked again next time\n this.head.catch(() => {\n this.head = undefined;\n });\n return this.head;\n }\n\n /** The archive's header */\n async header(): Promise<PmtilesHeader> {\n return (await this.load()).header;\n }\n\n /** The archive's JSON metadata (`vector_layers`, `attribution`, `name`…); `{}` if it has none */\n async metadata(): Promise<Record<string, unknown>> {\n const { header } = await this.load();\n if (header.metadataLength === 0) return {};\n const raw = await this.range(header.metadataOffset, header.metadataLength);\n const text = new TextDecoder().decode(await decompress(raw, header.internalCompression));\n const value: unknown = JSON.parse(text);\n return value && typeof value === 'object' && !Array.isArray(value) ? (value as Record<string, unknown>) : {};\n }\n\n private leaf(header: PmtilesHeader, entry: PmtilesEntry): Promise<PmtilesEntry[]> {\n const offset = header.leafDirectoryOffset + entry.offset;\n let leaf = this.leaves.get(offset);\n if (!leaf) {\n leaf = this.range(offset, entry.length).then(async (raw) =>\n parseDirectory(await decompress(raw, header.internalCompression)),\n );\n leaf.catch(() => this.leaves.delete(offset));\n this.leaves.set(offset, leaf);\n }\n return leaf;\n }\n\n /** The bytes of tile z/x/y, decompressed (a vector tile ungzipped); undefined where the archive has none */\n async tile(z: number, x: number, y: number, signal?: AbortSignal): Promise<Uint8Array | undefined> {\n const { header, root } = await this.load();\n if (z < header.minZoom || z > header.maxZoom) return undefined;\n const id = zxyToTileId(z, x, y);\n let entries = root;\n // The root, then at most three levels of leaves\n for (let depth = 0; depth < 4; depth += 1) {\n const entry = findEntry(entries, id);\n if (!entry) return undefined;\n if (entry.runLength > 0) {\n const raw = await this.range(header.tileDataOffset + entry.offset, entry.length, signal);\n return decompress(raw, header.tileCompression);\n }\n entries = await this.leaf(header, entry);\n }\n throw new Error('isard: PMTiles directories nested too deep');\n }\n}\n\n/** The archives opened, by URL: one reader (and its directory cache) per archive in a page or worker */\nconst archives = new Lru<string, PMTiles>(16);\n\n/** The reader of an archive URL (without `pmtiles://`), shared */\nexport function pmtiles(url: string): PMTiles {\n let archive = archives.get(url);\n if (!archive) {\n archive = new PMTiles(url);\n archives.set(url, archive);\n }\n return archive;\n}\n\n/** The archive URL of a `pmtiles://` URL, absolute (relative to the page), or undefined for another URL */\nexport function pmtilesUrl(url: string, base?: string): string | undefined {\n if (!url.startsWith('pmtiles://')) return undefined;\n const inner = url.slice('pmtiles://'.length);\n const from = base ?? (globalThis as { location?: { href: string } }).location?.href;\n try {\n return from ? new URL(inner, from).href : inner;\n } catch {\n return inner;\n }\n}\n\n/** A tile URL `pmtiles://<archive>/{z}/{x}/{y}` (with its numbers in) read from its archive: its bytes, undefined\n * where there is none; undefined too (`false`) for a URL that is not one */\nexport function pmtilesTile(url: string, signal?: AbortSignal): Promise<Uint8Array | undefined> | false {\n const match = /^pmtiles:\\/\\/(.+)\\/(\\d+)\\/(\\d+)\\/(\\d+)$/.exec(url);\n if (!match) return false;\n const [, archive = '', z, x, y] = match;\n return pmtiles(archive).tile(Number(z), Number(x), Number(y), signal);\n}\n",
10
- "/**\n * Raster reprojection, the drawing half: a Web Mercator tile drawn from the source images it spans (tiles of another\n * grid, or one image of a WMS), in a worker of the map (OffscreenCanvas) or in the page when the map has no workers.\n * The page plans each tile (`grid.ts`): which images, where they go in a mosaic, and a mesh of control points giving,\n * for the corners of 16 × 16 cells of the tile, the mosaic pixel under them. Here the images are fetched (kept for the\n * neighbouring tiles), drawn into the mosaic, and every pixel of the tile sampled from it, its source position\n * interpolated within its cell (bilinear), its color between the four nearest source pixels (bilinear, alpha\n * premultiplied). This code knows no projection.\n */\nimport { Lru } from './lru.ts';\nimport { withHeaders } from './requests.ts';\n\n/** Source images kept decoded (by the page, or shared by the workers of a pool): the neighbours of a tile share them */\nexport const SOURCE_CACHE = 96;\n\n/** A source image and the rectangle of the mosaic it covers (pixels) */\nexport interface Placed {\n url: string;\n x: number;\n y: number;\n w: number;\n h: number;\n}\n\n/** How to draw a Mercator tile of `size` pixels: the mosaic of the source images, and the mesh of `n` × `n` cells\n * ((n + 1)² points, rows from the north, x then y): the mosaic position of each corner, NaN where the source CRS has\n * none */\nexport interface Job {\n size: number;\n width: number;\n height: number;\n sources: Placed[];\n n: number;\n mesh: Float32Array;\n}\n\n/**\n * Samples the pixels of a `size` × `size` tile (RGBA, straight alpha) from a mosaic of `width` × `height` (RGBA,\n * straight alpha) through the mesh of a job. Pixels whose position falls outside the mosaic, or on a NaN, stay\n * transparent; the mosaic's edge fades over half a pixel\n */\nexport function resample(\n source: Uint8ClampedArray,\n width: number,\n height: number,\n mesh: Float32Array,\n n: number,\n size: number,\n): Uint8ClampedArray<ArrayBuffer> {\n const out = new Uint8ClampedArray(size * size * 4);\n const cell = size / n;\n const stride = n + 1;\n for (let row = 0; row < size; row += 1) {\n const fy = (row + 0.5) / cell;\n const j = Math.min(n - 1, Math.floor(fy));\n const ty = fy - j;\n for (let col = 0; col < size; col += 1) {\n const fx = (col + 0.5) / cell;\n const i = Math.min(n - 1, Math.floor(fx));\n const tx = fx - i;\n const a = 2 * (j * stride + i);\n const b = a + 2 * stride;\n // The corners of the cell, then the position in it\n const w00 = (1 - tx) * (1 - ty);\n const w10 = tx * (1 - ty);\n const w01 = (1 - tx) * ty;\n const w11 = tx * ty;\n const u =\n w00 * (mesh[a] as number) +\n w10 * (mesh[a + 2] as number) +\n w01 * (mesh[b] as number) +\n w11 * (mesh[b + 2] as number);\n const v =\n w00 * (mesh[a + 1] as number) +\n w10 * (mesh[a + 3] as number) +\n w01 * (mesh[b + 1] as number) +\n w11 * (mesh[b + 3] as number);\n // Pixel centers at half pixels: the four around (u, v)\n const sx = u - 0.5;\n const sy = v - 0.5;\n if (!(sx > -1 && sy > -1 && sx < width && sy < height)) continue;\n const x0 = Math.floor(sx);\n const y0 = Math.floor(sy);\n const kx = sx - x0;\n const ky = sy - y0;\n let r = 0;\n let g = 0;\n let bl = 0;\n let alpha = 0;\n for (let k = 0; k < 4; k += 1) {\n const x = x0 + (k & 1);\n const y = y0 + (k >> 1);\n if (x < 0 || y < 0 || x >= width || y >= height) continue;\n const p = 4 * (y * width + x);\n const wa = (k & 1 ? kx : 1 - kx) * (k >> 1 ? ky : 1 - ky) * (source[p + 3] as number);\n r += wa * (source[p] as number);\n g += wa * (source[p + 1] as number);\n bl += wa * (source[p + 2] as number);\n alpha += wa;\n }\n if (alpha <= 0) continue;\n const q = 4 * (row * size + col);\n out[q] = r / alpha;\n out[q + 1] = g / alpha;\n out[q + 2] = bl / alpha;\n out[q + 3] = alpha;\n }\n }\n return out;\n}\n\n/** Draws a planned tile: its image, null where the source has nothing; rejects on errors */\nexport type DrawJob = (job: Job, signal: AbortSignal) => Promise<ImageBitmap | null>;\n\n/**\n * Draws planned tiles, keeping `cached` source images decoded. A missing source image (404, 204, 410) leaves its part\n * empty; a tile with no source at all is missing; other errors reject (retried by the engine). In the page, or in a\n * worker of the map (`close` frees the images kept)\n */\nexport function resampler(cached = SOURCE_CACHE): { draw: DrawJob; close: () => void; cache: { capacity: number } } {\n type Image = Promise<ImageBitmap | null>;\n /** Tiles being drawn from each source image: an evicted one is closed once none is */\n const users = new Map<Image, number>();\n const evicted = new Set<Image>();\n const close = (image: Image) => {\n evicted.delete(image);\n image.then(\n (bitmap) => bitmap?.close(),\n () => undefined,\n );\n };\n /** Freed now, or once the tiles drawing from it are done */\n const drop = (image: Image) => {\n if (users.has(image)) evicted.add(image);\n else close(image);\n };\n // Source images by URL: a request is shared by the tiles that need it, its signal is not theirs\n const cache = new Lru<string, Image>(cached, drop);\n const release = (image: Image) => {\n const count = (users.get(image) ?? 1) - 1;\n if (count > 0) users.set(image, count);\n else {\n users.delete(image);\n if (evicted.has(image)) close(image);\n }\n };\n const fetchImage = (url: string): Image => {\n let image = cache.get(url);\n if (!image) {\n image = (async () => {\n const response = await fetch(url, withHeaders(url));\n if (response.status === 404 || response.status === 204 || response.status === 410) return null;\n if (!response.ok) throw new Error(`isard: ${response.status} for a raster to reproject`);\n return createImageBitmap(await response.blob());\n })();\n // A failure is not kept: the engine's retry fetches again\n image.catch(() => cache.delete(url));\n cache.set(url, image);\n }\n users.set(image, (users.get(image) ?? 0) + 1);\n return image;\n };\n const draw: DrawJob = async (job, signal) => {\n const pending = job.sources.map((s) => [s, fetchImage(s.url)] as const);\n try {\n const images = await Promise.all(pending.map(async ([s, image]) => [s, await image] as const));\n signal.throwIfAborted();\n if (!images.some(([, image]) => image)) return null;\n const canvas = new OffscreenCanvas(job.width, job.height);\n const context = canvas.getContext('2d', { willReadFrequently: true });\n if (!context) throw new Error('isard: no 2D canvas to reproject the tiles');\n for (const [s, image] of images) if (image) context.drawImage(image, s.x, s.y, s.w, s.h);\n const mosaic = context.getImageData(0, 0, job.width, job.height).data;\n const pixels = resample(mosaic, job.width, job.height, job.mesh, job.n, job.size);\n return createImageBitmap(new ImageData(pixels, job.size, job.size), { premultiplyAlpha: 'none' });\n } finally {\n for (const [, image] of pending) release(image);\n }\n };\n return {\n draw,\n cache,\n close: () => {\n for (const image of cache.values()) drop(image);\n cache.clear();\n },\n };\n}\n",
11
- "/**\n * Altitudes encoded in the colors of PNG tiles, for the relief: Terrarium (Mapzen, the Terrain Tiles of AWS) and\n * Terrain-RGB (Mapbox, MapTiler). The engine reads raw floats only; a loader gives it the altitudes of each tile,\n * decoded in a worker of the map's pool (OffscreenCanvas), or in the page when the map has no workers.\n */\nimport { withHeaders } from './requests.ts';\n\n/** The encodings of altitudes in the colors of PNG tiles */\nexport type PngEncoding = 'terrarium' | 'mapbox';\n\nconst SIZE = 256;\n\n/** Altitudes (metres, rows from the north) of RGBA pixels in an encoding; below `floor` raised to it */\nexport function decodeHeights(\n rgba: Uint8ClampedArray | Uint8Array,\n encoding: PngEncoding,\n floor = Number.NEGATIVE_INFINITY,\n): Float32Array {\n const n = rgba.length >> 2;\n const out = new Float32Array(n);\n // A loop per encoding, without allocations: 65 536 pixels a tile\n if (encoding === 'terrarium') {\n for (let i = 0, j = 0; i < n; i += 1, j += 4) {\n const h = (rgba[j] as number) * 256 + (rgba[j + 1] as number) + (rgba[j + 2] as number) / 256 - 32768;\n out[i] = h > floor ? h : floor;\n }\n } else {\n for (let i = 0, j = 0; i < n; i += 1, j += 4) {\n const h = -10000 + ((rgba[j] as number) * 65536 + (rgba[j + 1] as number) * 256 + (rgba[j + 2] as number)) * 0.1;\n out[i] = h > floor ? h : floor;\n }\n }\n return out;\n}\n\n/** Where the tiles are drawn and read back, made on first use and kept (each tile drawn and read at once) */\nexport interface Surface {\n canvas?: OffscreenCanvas;\n}\n\n/**\n * The altitudes of the PNG tile at `url`: 256 × 256, null where the server has no tile; a network or server error\n * rejects (the engine retries). Where it runs: in a worker of the map, or in the page without workers\n */\nexport async function fetchHeights(\n url: string,\n encoding: PngEncoding,\n floor: number | undefined,\n signal: AbortSignal,\n surface: Surface,\n): Promise<Float32Array | null> {\n const response = await fetch(url, withHeaders(url, { signal }));\n if (response.status === 404 || response.status === 204 || response.status === 410) return null;\n if (!response.ok) throw new Error(`${response.url}: ${response.status}`);\n // The colors as stored: no color management, no premultiplied alpha\n const bitmap = await createImageBitmap(await response.blob(), {\n premultiplyAlpha: 'none',\n colorSpaceConversion: 'none',\n });\n try {\n surface.canvas ??= new OffscreenCanvas(SIZE, SIZE);\n const g = surface.canvas.getContext('2d', { willReadFrequently: true });\n if (!g) throw new Error('no 2D context');\n // Another size is resampled to the nearest pixel: an interpolated color is no altitude\n g.imageSmoothingEnabled = false;\n g.clearRect(0, 0, SIZE, SIZE);\n g.drawImage(bitmap, 0, 0, SIZE, SIZE);\n return decodeHeights(g.getImageData(0, 0, SIZE, SIZE).data, encoding, floor);\n } finally {\n bitmap.close();\n }\n}\n\n/** `fetchHeights` run in a worker for tile `z`/`x`/`y`; undefined when the map has no workers (run in the page) */\nexport type RemoteHeights = (\n url: string,\n encoding: PngEncoding,\n floor: number | undefined,\n tile: [z: number, x: number, y: number],\n signal: AbortSignal,\n) => Promise<Float32Array | null> | undefined;\n\n/**\n * A loader of the engine's relief for PNG tiles of `url` ({z}, {x}, {y}) in an encoding: 256 × 256 altitudes, null\n * where the server has no tile; a network or server error rejects (retried). `floor`: the lowest altitude kept (the\n * sea floor of a worldwide model flattened at sea level). `remote`: decodes in a worker when it can\n */\nexport function encodedTerrainLoader(\n url: string,\n encoding: PngEncoding,\n floor?: number,\n remote?: RemoteHeights,\n): (z: number, x: number, y: number, signal: AbortSignal) => Promise<Float32Array | null> {\n const surface: Surface = {};\n return (z, x, y, signal) => {\n const tile = url.replaceAll('{z}', String(z)).replaceAll('{x}', String(x)).replaceAll('{y}', String(y));\n return remote?.(tile, encoding, floor, [z, x, y], signal) ?? fetchHeights(tile, encoding, floor, signal, surface);\n };\n}\n",
12
- "/**\n * CSS colors to RGBA 0-1: `#rgb`, `#rgba`, `#rrggbb`, `#rrggbbaa`, `rgb()` and `rgba()`, `hsl()` and `hsla()` (comma\n * or space syntax, `/` before the alpha, percentages), the CSS named colors and `transparent`. No DOM: the workers use\n * it too.\n */\n\nexport type Rgba = [r: number, g: number, b: number, a: number];\n\n/** The CSS named colors, as name and `rrggbb` pairs */\nconst NAMES =\n 'aliceblue f0f8ff antiquewhite faebd7 aqua 00ffff aquamarine 7fffd4 azure f0ffff beige f5f5dc bisque ffe4c4 ' +\n 'black 000000 blanchedalmond ffebcd blue 0000ff blueviolet 8a2be2 brown a52a2a burlywood deb887 cadetblue 5f9ea0 ' +\n 'chartreuse 7fff00 chocolate d2691e coral ff7f50 cornflowerblue 6495ed cornsilk fff8dc crimson dc143c ' +\n 'cyan 00ffff darkblue 00008b darkcyan 008b8b darkgoldenrod b8860b darkgray a9a9a9 darkgreen 006400 ' +\n 'darkgrey a9a9a9 darkkhaki bdb76b darkmagenta 8b008b darkolivegreen 556b2f darkorange ff8c00 darkorchid 9932cc ' +\n 'darkred 8b0000 darksalmon e9967a darkseagreen 8fbc8f darkslateblue 483d8b darkslategray 2f4f4f ' +\n 'darkslategrey 2f4f4f darkturquoise 00ced1 darkviolet 9400d3 deeppink ff1493 deepskyblue 00bfff dimgray 696969 ' +\n 'dimgrey 696969 dodgerblue 1e90ff firebrick b22222 floralwhite fffaf0 forestgreen 228b22 fuchsia ff00ff ' +\n 'gainsboro dcdcdc ghostwhite f8f8ff gold ffd700 goldenrod daa520 gray 808080 green 008000 greenyellow adff2f ' +\n 'grey 808080 honeydew f0fff0 hotpink ff69b4 indianred cd5c5c indigo 4b0082 ivory fffff0 khaki f0e68c ' +\n 'lavender e6e6fa lavenderblush fff0f5 lawngreen 7cfc00 lemonchiffon fffacd lightblue add8e6 lightcoral f08080 ' +\n 'lightcyan e0ffff lightgoldenrodyellow fafad2 lightgray d3d3d3 lightgreen 90ee90 lightgrey d3d3d3 ' +\n 'lightpink ffb6c1 lightsalmon ffa07a lightseagreen 20b2aa lightskyblue 87cefa lightslategray 778899 ' +\n 'lightslategrey 778899 lightsteelblue b0c4de lightyellow ffffe0 lime 00ff00 limegreen 32cd32 linen faf0e6 ' +\n 'magenta ff00ff maroon 800000 mediumaquamarine 66cdaa mediumblue 0000cd mediumorchid ba55d3 ' +\n 'mediumpurple 9370db mediumseagreen 3cb371 mediumslateblue 7b68ee mediumspringgreen 00fa9a ' +\n 'mediumturquoise 48d1cc mediumvioletred c71585 midnightblue 191970 mintcream f5fffa mistyrose ffe4e1 ' +\n 'moccasin ffe4b5 navajowhite ffdead navy 000080 oldlace fdf5e6 olive 808000 olivedrab 6b8e23 orange ffa500 ' +\n 'orangered ff4500 orchid da70d6 palegoldenrod eee8aa palegreen 98fb98 paleturquoise afeeee ' +\n 'palevioletred db7093 papayawhip ffefd5 peachpuff ffdab9 peru cd853f pink ffc0cb plum dda0dd ' +\n 'powderblue b0e0e6 purple 800080 rebeccapurple 663399 red ff0000 rosybrown bc8f8f royalblue 4169e1 ' +\n 'saddlebrown 8b4513 salmon fa8072 sandybrown f4a460 seagreen 2e8b57 seashell fff5ee sienna a0522d ' +\n 'silver c0c0c0 skyblue 87ceeb slateblue 6a5acd slategray 708090 slategrey 708090 snow fffafa ' +\n 'springgreen 00ff7f steelblue 4682b4 tan d2b48c teal 008080 thistle d8bfd8 tomato ff6347 turquoise 40e0d0 ' +\n 'violet ee82ee wheat f5deb3 white ffffff whitesmoke f5f5f5 yellow ffff00 yellowgreen 9acd32';\n\nlet named: Map<string, string> | undefined;\n\nfunction namedHex(name: string): string | undefined {\n if (!named) {\n named = new Map();\n const words = NAMES.split(' ');\n for (let i = 0; i + 1 < words.length; i += 2) named.set(words[i] as string, words[i + 1] as string);\n }\n return named.get(name);\n}\n\nconst clamp = (v: number) => (Number.isFinite(v) ? Math.max(0, Math.min(1, v)) : 0);\n\nfunction hex(digits: string): Rgba | undefined {\n if (!/^[0-9a-f]+$/.test(digits) || ![3, 4, 6, 8].includes(digits.length)) return undefined;\n const full = digits.length <= 4 ? [...digits].map((h) => h + h).join('') : digits;\n const v = (i: number) => Number.parseInt(full.slice(i, i + 2), 16) / 255;\n return [v(0), v(2), v(4), full.length === 8 ? v(6) : 1];\n}\n\n/** An alpha: a number from 0 to 1 or a percentage */\nfunction alpha(p: string | undefined): number {\n if (p === undefined) return 1;\n return clamp(p.endsWith('%') ? Number.parseFloat(p) / 100 : Number.parseFloat(p));\n}\n\nfunction hsl(h: number, s: number, l: number): [number, number, number] {\n const q = l < 0.5 ? l * (1 + s) : l + s - l * s;\n const p = 2 * l - q;\n const hue = (t: number) => {\n const u = ((t % 1) + 1) % 1;\n if (u < 1 / 6) return p + (q - p) * 6 * u;\n if (u < 1 / 2) return q;\n if (u < 2 / 3) return p + (q - p) * (2 / 3 - u) * 6;\n return p;\n };\n return [hue(h + 1 / 3), hue(h), hue(h - 1 / 3)];\n}\n\n/** A CSS color to RGBA 0-1; undefined if it is not one */\nexport function parseCssColor(value: unknown): Rgba | undefined {\n if (typeof value !== 'string') return undefined;\n const c = value.trim().toLowerCase();\n if (c.startsWith('#')) return hex(c.slice(1));\n if (c === 'transparent') return [0, 0, 0, 0];\n const name = namedHex(c);\n if (name) return hex(name);\n const match = /^(rgba?|hsla?)\\(([^)]*)\\)$/.exec(c);\n if (!match?.[1] || match[2] === undefined) return undefined;\n const parts = match[2].split(/[\\s,/]+/).filter(Boolean);\n if (parts.length < 3 || parts.slice(0, 3).some((p) => Number.isNaN(Number.parseFloat(p)))) return undefined;\n const a = alpha(parts[3]);\n if (match[1].startsWith('rgb')) {\n const channel = (p: string) => clamp(p.endsWith('%') ? Number.parseFloat(p) / 100 : Number.parseFloat(p) / 255);\n return [channel(parts[0] as string), channel(parts[1] as string), channel(parts[2] as string), a];\n }\n const h = Number.parseFloat(parts[0] as string) / 360;\n const [r, g, b] = hsl(\n h,\n clamp(Number.parseFloat(parts[1] as string) / 100),\n clamp(Number.parseFloat(parts[2] as string) / 100),\n );\n return [r, g, b, a];\n}\n",
13
- "/**\n * The parts of the MapLibre style specification a vector basemap needs, evaluated on the page: filters (legacy\n * `[\"==\", \"key\", value]` forms and expressions), property values given as constants, legacy functions (`{ stops }`\n * of zoom or of a property: exponential, interval, categorical, identity) or expressions (`get`, `has`, `concat`,\n * `interpolate`, `step`, `match`, `case`, `coalesce`, comparisons, `all`, `any`, `!`, `in`, `zoom`, arithmetic,\n * `format`, conversions and assertions, `upcase`, `downcase`, `literal`…; others give null, with a warning), colors\n * interpolated in RGBA, `{token}` text fields.\n */\nimport { parseCssColor } from './color.ts';\nimport type { TileFeature, Value } from './mvt.ts';\n\nexport type Json = null | boolean | number | string | Json[] | { [key: string]: Json };\n\nexport interface StyleLayer {\n id: string;\n type: string;\n source?: string;\n 'source-layer'?: string;\n minzoom?: number;\n maxzoom?: number;\n filter?: Json;\n layout?: Record<string, Json>;\n paint?: Record<string, Json>;\n}\n\nexport interface Style {\n version: number;\n sources: Record<\n string,\n { type: string; tiles?: string[]; url?: string; maxzoom?: number; minzoom?: number; tileSize?: number }\n >;\n layers: StyleLayer[];\n glyphs?: string;\n /** One sprite's URL (without extension), or several with their ids (`id:name` names their images) */\n sprite?: string | { id: string; url: string }[];\n}\n\n/** A raster source of a style: its tile URL, its deepest level and the CSS pixels of its tiles (MapLibre's\n * `tileSize`: 512 by default) */\nexport interface RasterSource {\n tiles: string;\n maxzoom: number;\n tileSize: number;\n}\n\n/** How a label's text or icon meets the others (`*-allow-overlap` and `*-ignore-placement`, see `Overlap`) */\nexport type CandidateOverlap = boolean | 'allow' | 'ignore';\n\n/** The icon of a label, in style terms evaluated at the tile's zoom */\nexport interface CandidateIcon {\n /** Its image in the style's sprite */\n image: string;\n /** A number, or zoom stops */\n size: Json;\n anchor: string;\n offset: [number, number];\n rotate: number;\n /** `map` or `viewport` (`auto` resolved) */\n alignment: 'map' | 'viewport';\n overlap: CandidateOverlap;\n optional: boolean;\n fit: 'none' | 'width' | 'height' | 'both';\n padding: [number, number, number, number];\n color: string;\n opacity: number;\n}\n\n/** A label to shape and place, in style terms evaluated at the tile's zoom */\nexport interface LabelCandidate {\n /** Index of its style layer: higher ones are placed first */\n layer: number;\n /** Its text, empty for an icon alone */\n text: string;\n lon: number;\n lat: number;\n /** On a line: the direction there (degrees of longitude and latitude) */\n along?: [number, number];\n /** Its text runs along the line (`symbol-placement: line`, `text-rotation-alignment` not `viewport`) */\n textAlong?: boolean;\n textOptional?: boolean;\n icon?: CandidateIcon;\n font: string;\n size: Json;\n color: string;\n haloColor: string;\n haloWidth: number;\n anchor: string;\n offset: [number, number];\n maxWidth: number;\n lineHeight: number;\n overlap: CandidateOverlap;\n}\n\n/** What expressions see of a feature */\nexport interface Context {\n zoom: number;\n properties: Record<string, Value>;\n /** 'Point', 'LineString' or 'Polygon' */\n type: string;\n}\n\nconst TYPES = ['Unknown', 'Point', 'LineString', 'Polygon'];\n\nexport function context(feature: TileFeature, zoom: number): Context {\n return { zoom, properties: feature.properties, type: TYPES[feature.type] ?? 'Unknown' };\n}\n\n// ── Colors ──\n\n/** A color to RGBA 0-1, undefined if it is not one */\nexport function color(value: unknown): [number, number, number, number] | undefined {\n return parseCssColor(value);\n}\n\nexport function css([r, g, b, a]: [number, number, number, number]): string {\n return `rgba(${Math.round(r * 255)},${Math.round(g * 255)},${Math.round(b * 255)},${a})`;\n}\n\n// ── Interpolation ──\n\n/** Factor between two stops: linear, or exponential of `base` */\nfunction factor(x: number, x0: number, x1: number, base = 1): number {\n const d = x1 - x0;\n if (d === 0) return 0;\n const t = x - x0;\n return base === 1 ? t / d : (base ** t - 1) / (base ** d - 1);\n}\n\nfunction mix(a: unknown, b: unknown, t: number): unknown {\n if (typeof a === 'number' && typeof b === 'number') return a + (b - a) * t;\n const ca = color(a);\n const cb = color(b);\n if (ca && cb)\n return css(\n [0, 1, 2, 3].map((i) => (ca[i] ?? 0) + ((cb[i] ?? 0) - (ca[i] ?? 0)) * t) as [number, number, number, number],\n );\n if (Array.isArray(a) && Array.isArray(b)) return a.map((v, i) => mix(v, b[i], t));\n return t < 0.5 ? a : b;\n}\n\n// ── Legacy functions ──\n\ninterface LegacyFunction {\n stops: [Json, Json][];\n base?: number;\n type?: string;\n property?: string;\n default?: Json;\n}\n\nfunction isFunction(v: Json): v is { [key: string]: Json } & LegacyFunction {\n return typeof v === 'object' && v !== null && !Array.isArray(v) && Array.isArray((v as { stops?: Json }).stops);\n}\n\nfunction legacy(f: LegacyFunction, ctx: Context): unknown {\n const input = f.property === undefined ? ctx.zoom : ctx.properties[f.property];\n const stops = f.stops;\n const type =\n f.type ?? (f.property === undefined || typeof stops[0]?.[0] === 'number' ? 'exponential' : 'categorical');\n if (type === 'identity') return input ?? f.default;\n if (type === 'categorical') return stops.find(([k]) => k === input)?.[1] ?? f.default;\n if (typeof input !== 'number' || !stops.length) return f.default ?? stops[0]?.[1];\n // Zoom-and-property stops ({ zoom, value } keys) are taken at their zoom only\n const key = (s: [Json, Json]) =>\n typeof s[0] === 'object' && s[0] !== null ? Number((s[0] as { zoom?: number }).zoom) : Number(s[0]);\n const first = stops[0];\n if (!first) return f.default;\n if (input <= key(first)) return first[1];\n for (let i = 1; i < stops.length; i += 1) {\n const [s0, s1] = [stops[i - 1], stops[i]];\n if (!s0 || !s1) continue;\n if (input < key(s1)) {\n if (type === 'interval') return s0[1];\n return mix(s0[1], s1[1], factor(input, key(s0), key(s1), f.base ?? 1));\n }\n }\n return stops.at(-1)?.[1];\n}\n\n// ── Expressions ──\n\nfunction get(ctx: Context, key: unknown): unknown {\n if (key === '$type') return ctx.type;\n return typeof key === 'string' ? ctx.properties[key] : undefined;\n}\n\n/** The operators `evaluate` knows */\nconst OPERATORS = new Set([\n 'literal',\n 'zoom',\n 'get',\n 'has',\n '!has',\n 'properties',\n 'id',\n 'geometry-type',\n 'concat',\n 'format',\n 'image',\n 'number-format',\n 'to-number',\n 'to-string',\n 'to-boolean',\n 'to-color',\n 'number',\n 'string',\n 'boolean',\n 'typeof',\n 'length',\n 'at',\n 'upcase',\n 'downcase',\n 'coalesce',\n '!',\n 'all',\n 'any',\n '==',\n '!=',\n '<',\n '<=',\n '>',\n '>=',\n 'in',\n 'case',\n 'match',\n 'step',\n 'interpolate',\n 'interpolate-hcl',\n 'interpolate-lab',\n 'rgb',\n 'rgba',\n '+',\n '-',\n '*',\n '/',\n '%',\n '^',\n 'min',\n 'max',\n 'abs',\n 'round',\n 'floor',\n 'ceil',\n 'sqrt',\n 'ln',\n 'log10',\n 'log2',\n 'pi',\n 'e',\n]);\n\n/** Whether a value is an expression (an array starting with a known operator), not a literal array */\nexport function isExpression(e: unknown): e is Json[] {\n return Array.isArray(e) && typeof e[0] === 'string' && OPERATORS.has(e[0]);\n}\n\n/** Operators already warned about */\nconst warned = new Set<string>();\n\nconst str = (v: unknown) => (v === undefined || v === null ? '' : String(v));\n\nexport function evaluate(e: Json, ctx: Context): unknown {\n if (isFunction(e)) return legacy(e, ctx);\n if (!Array.isArray(e)) return e;\n const [op, ...args] = e;\n if (typeof op !== 'string') return e;\n const ev = (i: number) => evaluate(args[i] ?? null, ctx);\n const num = (i: number) => Number(ev(i));\n const nums = () => args.map((_, i) => num(i));\n switch (op) {\n case 'literal':\n return args[0];\n case 'zoom':\n return ctx.zoom;\n case 'get':\n return get(ctx, ev(0));\n case 'has':\n return get(ctx, ev(0)) !== undefined;\n case '!has':\n return get(ctx, ev(0)) === undefined;\n case 'properties':\n return ctx.properties;\n case 'id':\n return null;\n case 'geometry-type':\n return ctx.type;\n case 'concat':\n return args.map((_, i) => str(ev(i))).join('');\n case 'format':\n // Its text sections, the options of each (objects) left out\n return args.map((a, i) => (a !== null && typeof a === 'object' && !Array.isArray(a) ? '' : str(ev(i)))).join('');\n case 'image':\n return ev(0);\n case 'number-format': {\n const options = (args[1] ?? {}) as {\n locale?: string;\n 'min-fraction-digits'?: number;\n 'max-fraction-digits'?: number;\n };\n const n = num(0);\n if (!Number.isFinite(n)) return '';\n return n.toLocaleString(options.locale, {\n minimumFractionDigits: options['min-fraction-digits'],\n maximumFractionDigits: options['max-fraction-digits'],\n });\n }\n case 'to-number': {\n for (let i = 0; i < args.length; i += 1) {\n const v = ev(i);\n const n = typeof v === 'string' && v.trim() === '' ? Number.NaN : Number(v);\n if (v !== null && v !== undefined && !Number.isNaN(n)) return n;\n }\n return 0;\n }\n case 'to-string':\n return str(ev(0));\n case 'to-boolean': {\n const v = ev(0);\n return !(v === '' || v === 0 || v === false || v === null || v === undefined || Number.isNaN(v));\n }\n case 'to-color':\n case 'number':\n case 'string':\n case 'boolean': {\n // Assertions: the first value of the type, else the last one\n const types: Record<string, (v: unknown) => boolean> = {\n 'to-color': (v) => color(v) !== undefined,\n number: (v) => typeof v === 'number',\n string: (v) => typeof v === 'string',\n boolean: (v) => typeof v === 'boolean',\n };\n for (let i = 0; i < args.length; i += 1) {\n const v = ev(i);\n if (types[op]?.(v)) return v;\n }\n return args.length ? ev(args.length - 1) : null;\n }\n case 'typeof': {\n const v = ev(0);\n if (v === null || v === undefined) return 'null';\n return Array.isArray(v) ? 'array' : typeof v;\n }\n case 'length': {\n const v = ev(0);\n return typeof v === 'string' || Array.isArray(v) ? v.length : 0;\n }\n case 'at': {\n const v = ev(1);\n return Array.isArray(v) ? (v[num(0)] ?? null) : null;\n }\n case 'upcase':\n return str(ev(0)).toUpperCase();\n case 'downcase':\n return str(ev(0)).toLowerCase();\n case 'coalesce':\n for (let i = 0; i < args.length; i += 1) {\n const v = ev(i);\n if (v !== undefined && v !== null) return v;\n }\n return null;\n case '!':\n return !ev(0);\n case 'all':\n return args.every((_, i) => Boolean(ev(i)));\n case 'any':\n return args.some((_, i) => Boolean(ev(i)));\n case '==':\n return ev(0) === ev(1);\n case '!=':\n return ev(0) !== ev(1);\n case '<':\n return (ev(0) as number) < (ev(1) as number);\n case '<=':\n return (ev(0) as number) <= (ev(1) as number);\n case '>':\n return (ev(0) as number) > (ev(1) as number);\n case '>=':\n return (ev(0) as number) >= (ev(1) as number);\n case 'in': {\n const haystack = ev(1);\n const needle = ev(0);\n if (typeof haystack === 'string') return haystack.includes(String(needle));\n return Array.isArray(haystack) && haystack.includes(needle as Json);\n }\n case 'case': {\n for (let i = 0; i + 1 < args.length; i += 2) if (ev(i)) return ev(i + 1);\n return ev(args.length - 1);\n }\n case 'match': {\n const input = ev(0);\n for (let i = 1; i + 1 < args.length; i += 2) {\n const label = args[i];\n if (Array.isArray(label) ? label.includes(input as Json) : label === input) return ev(i + 1);\n }\n return ev(args.length - 1);\n }\n case 'step': {\n const input = num(0);\n let out = ev(1);\n for (let i = 2; i + 1 < args.length; i += 2) {\n if (input >= Number(args[i])) out = ev(i + 1);\n else break;\n }\n return out;\n }\n case 'interpolate':\n case 'interpolate-hcl':\n case 'interpolate-lab': {\n const kind = args[0];\n const input = num(1);\n const base = Array.isArray(kind) && kind[0] === 'exponential' ? Number(kind[1]) : 1;\n const stops: [number, Json][] = [];\n for (let i = 2; i + 1 < args.length; i += 2) stops.push([Number(args[i]), args[i + 1] ?? null]);\n const first = stops[0];\n if (!first) return null;\n if (input <= first[0]) return evaluate(first[1], ctx);\n for (let i = 1; i < stops.length; i += 1) {\n const [s0, s1] = [stops[i - 1], stops[i]];\n if (s0 && s1 && input < s1[0])\n return mix(evaluate(s0[1], ctx), evaluate(s1[1], ctx), factor(input, s0[0], s1[0], base));\n }\n return evaluate(stops.at(-1)?.[1] ?? null, ctx);\n }\n case 'rgb':\n case 'rgba':\n return css([num(0) / 255, num(1) / 255, num(2) / 255, args.length > 3 ? num(3) : 1]);\n case '+':\n return nums().reduce((a, b) => a + b, 0);\n case '*':\n return nums().reduce((a, b) => a * b, 1);\n case '-':\n return args.length === 1 ? -num(0) : num(0) - num(1);\n case '/':\n return num(0) / num(1);\n case '%':\n return num(0) % num(1);\n case '^':\n return num(0) ** num(1);\n case 'min':\n return Math.min(...nums());\n case 'max':\n return Math.max(...nums());\n case 'abs':\n return Math.abs(num(0));\n case 'round':\n // Half away from zero, as MapLibre\n return Math.sign(num(0)) * Math.round(Math.abs(num(0)));\n case 'floor':\n return Math.floor(num(0));\n case 'ceil':\n return Math.ceil(num(0));\n case 'sqrt':\n return Math.sqrt(num(0));\n case 'ln':\n return Math.log(num(0));\n case 'log10':\n return Math.log10(num(0));\n case 'log2':\n return Math.log2(num(0));\n case 'pi':\n return Math.PI;\n case 'e':\n return Math.E;\n default:\n // Unsupported: no value (a filter drops the feature, a property takes its default)\n if (!warned.has(op)) {\n warned.add(op);\n console.warn(`isard: the style expression \"${op}\" is not supported`);\n }\n return null;\n }\n}\n\n// ── Filters ──\n\nconst LEGACY_COMPARISONS = new Set(['==', '!=', '<', '<=', '>', '>=']);\n\n/** Whether a filter (not `all`, `any`, `none`) is in the legacy form: `[\"==\", \"key\", value]`, `[\"in\", \"key\", a, b]`,\n * `[\"has\", \"key\"]`; a key and literal values, as MapLibre tells them from expressions */\nfunction isLegacyLeaf(f: Json[]): boolean {\n const [op, a, ...rest] = f;\n if (typeof op !== 'string' || typeof a !== 'string' || rest.some(Array.isArray)) return false;\n if (LEGACY_COMPARISONS.has(op)) return f.length === 3;\n if (op === 'in') return f.length !== 3 || !Array.isArray(f[2]);\n return op === '!in' || op === 'has' || op === '!has';\n}\n\nfunction legacyFilter(f: Json[], ctx: Context): boolean {\n const [op, key, ...rest] = f;\n const v = get(ctx, key);\n switch (op) {\n case '==':\n return v === rest[0];\n case '!=':\n return v !== rest[0];\n case '<':\n return (v as number) < (rest[0] as number);\n case '<=':\n return (v as number) <= (rest[0] as number);\n case '>':\n return (v as number) > (rest[0] as number);\n case '>=':\n return (v as number) >= (rest[0] as number);\n case 'in':\n return rest.includes(v as Json);\n case '!in':\n return !rest.includes(v as Json);\n case 'has':\n return v !== undefined;\n case '!has':\n return v === undefined;\n default:\n return true;\n }\n}\n\ntype Test = (ctx: Context) => boolean;\n\n/** Compiled filters, by filter object */\nconst compiled = new WeakMap<Json[], Test>();\n\n/** A filter as a function: `all`, `any`, `none` of their parts, each part legacy or an expression (they may mix) */\nfunction compile(f: Json): Test {\n if (!Array.isArray(f)) return () => Boolean(f);\n const hit = compiled.get(f);\n if (hit) return hit;\n let test: Test;\n const op = f[0];\n if (op === 'all' || op === 'any' || op === 'none') {\n const parts = f.slice(1).map(compile);\n if (op === 'all') test = (ctx) => parts.every((p) => p(ctx));\n else if (op === 'any') test = (ctx) => parts.some((p) => p(ctx));\n else test = (ctx) => !parts.some((p) => p(ctx));\n } else if (isLegacyLeaf(f)) {\n test = (ctx) => legacyFilter(f, ctx);\n } else {\n test = (ctx) => Boolean(evaluate(f, ctx));\n }\n compiled.set(f, test);\n return test;\n}\n\nexport function filter(f: Json | undefined, ctx: Context): boolean {\n if (f === undefined || f === null) return true;\n return compile(f)(ctx);\n}\n\n/** Whether a value depends on the feature (else only on the zoom, evaluated once per tile) */\nexport function isFeatureDependent(e: Json | undefined): boolean {\n if (e !== undefined && isFunction(e)) return e.property !== undefined;\n if (!Array.isArray(e)) return false;\n if (['get', 'has', '!has', 'geometry-type', 'properties', 'id'].includes(e[0] as string)) return true;\n return e.some((x) => isFeatureDependent(x));\n}\n\n/** A `{token}` text field (or an expression) to the text of a feature */\nexport function text(field: Json | undefined, ctx: Context): string {\n if (field === undefined || field === null) return '';\n if (typeof field === 'string') {\n return field.replace(/\\{([^}]+)\\}/g, (_, key: string) => {\n const v = ctx.properties[key];\n return v === undefined ? '' : String(v);\n });\n }\n const v = evaluate(field, ctx);\n if (Array.isArray(v)) {\n // A `format` value: its strings\n return v.filter((x) => typeof x === 'string').join('');\n }\n return v === undefined || v === null ? '' : String(v);\n}\n\n/** The font of a label from the first of its `text-font`: a family without its weight takes the regular one */\nexport function labelFont(font: string): string {\n return /Regular|Bold|Italic|Semibold|Light|Medium|Black/.test(font) ? font : `${font} Regular`;\n}\n\n/**\n * A value of the zoom only (an expression: `interpolate`, `step` of `[\"zoom\"]`) as stops `[[zoom, value], …]` for the\n * engine, which interpolates them linearly: evaluated at its own stops and at the whole zooms between (an exponential\n * curve followed closely), a step kept sharp just before its threshold\n */\nexport function zoomStops(e: Json): [number, number][] {\n const zooms = new Set<number>();\n const walk = (x: Json) => {\n if (!Array.isArray(x)) return;\n const zoomInput = (input: Json | undefined) => Array.isArray(input) && input[0] === 'zoom';\n if ((x[0] === 'interpolate' || x[0] === 'interpolate-hcl' || x[0] === 'interpolate-lab') && zoomInput(x[2])) {\n for (let i = 3; i < x.length; i += 2) zooms.add(Number(x[i]));\n } else if (x[0] === 'step' && zoomInput(x[1])) {\n for (let i = 3; i < x.length; i += 2) {\n const t = Number(x[i]);\n zooms.add(t);\n zooms.add(t - 0.01);\n }\n }\n for (const y of x) walk(y);\n };\n walk(e);\n const finite = [...zooms].filter(Number.isFinite);\n if (finite.length === 0) finite.push(0);\n const [lo, hi] = [Math.min(...finite), Math.max(...finite)];\n for (let z = Math.ceil(lo); z <= Math.floor(hi); z += 1) finite.push(z);\n return [...new Set(finite)]\n .sort((a, b) => a - b)\n .map((zoom) => [zoom, Number(evaluate(e, { zoom, properties: {}, type: 'Unknown' }))]);\n}\n",
14
- "/**\n * Worker of the vector basemaps: fetches and decodes vector tiles (kept for the tiles that share them), draws their\n * fills, lines and circles with a MapLibre style into images (Canvas 2D, off the main thread) for the raster pool,\n * with the style's raster layers under them, and lists the label candidates of the style's symbol layers (their texts\n * and icons) for the page to shape and place. Extrusions are drawn flat, as fills. It also decodes the altitudes of PNG relief tiles and\n * draws the rasters reprojected from other grids (planned by the page), for the map's other layers.\n *\n * A raster tile of level z covers 256 CSS pixels at map zoom z - 1 (MapLibre's 512 px convention): it is drawn from\n * the vector tile of level z - 1 (or the deepest one the source has), with the style at that zoom.\n */\nimport { latitude, longitude } from './geo.ts';\nimport { Lru } from './lru.ts';\nimport { decode, type TileFeature, type TileLayer } from './mvt.ts';\nimport { pmtilesTile } from './pmtiles.ts';\nimport { type HeaderRules, setHeaderRules, withHeaders } from './requests.ts';\nimport { type Job, resampler } from './resample.ts';\nimport { fetchHeights, type PngEncoding, type Surface } from './terrain.ts';\nimport {\n type CandidateIcon,\n type CandidateOverlap,\n type Context,\n color,\n context,\n css,\n evaluate,\n filter,\n isExpression,\n isFeatureDependent,\n type Json,\n type LabelCandidate,\n labelFont,\n type RasterSource,\n type StyleLayer,\n text,\n zoomStops,\n} from './vectorstyle.ts';\n\nexport type { LabelCandidate, RasterSource };\n\n/** Fetch priority of a request (`fetch`'s `priority`, a hint to the browser) */\nexport type Priority = 'high' | 'low' | 'auto';\n\n/** A tile's image or labels, asked of a worker; or a tile of another layer decoded: the altitudes of a PNG relief\n * tile, a Mercator tile reprojected from the source images of its plan (keeping `cached` of them) */\nexport type BasemapWork =\n | { type: 'render'; key: string; z: number; x: number; y: number; size: number; priority?: Priority }\n /** `zoom`: the zoom the style is evaluated at, past the source's deepest level (`z` by default) */\n | { type: 'labels'; key: string; z: number; x: number; y: number; zoom?: number; priority?: Priority }\n | { type: 'heights'; url: string; encoding: PngEncoding; floor?: number }\n | { type: 'reproject'; job: Job; cached: number };\n\nexport type BasemapRequest =\n /** The page's request headers (`setRequestHeaders`) */\n | { type: 'headers'; rules: HeaderRules }\n | {\n type: 'init';\n /** Renderers by key: each draws its own layers of the same source */\n key: string;\n tiles: string;\n maxzoom: number;\n layers: StyleLayer[];\n /** The style's raster sources, by name, for its raster layers */\n rasters?: Record<string, RasterSource>;\n /** The style's sprites, for the fill patterns (loaded once by the page) */\n sprites?: Sprite[];\n /** Workers of the pool: each keeps its share of the decoded tiles */\n workers?: number;\n }\n | (BasemapWork & { id: number })\n | { type: 'abort'; id: number }\n /** A renderer no longer used: forgotten */\n | { type: 'drop'; key: string };\n\nexport type BasemapResponse =\n | { id: number; image: ImageBitmap }\n | { id: number; missing: true }\n | { id: number; error: string }\n | { id: number; labels: LabelCandidate[] }\n | { id: number; heights: Float32Array };\n\ninterface Renderer {\n tiles: string;\n maxzoom: number;\n layers: StyleLayer[];\n rasters: Record<string, RasterSource>;\n sprites: Sprite[];\n /** Fill patterns by icon name, cut from the sprites once */\n patterns: Map<string, OffscreenCanvas | undefined>;\n}\n\n/** A sprite of the style: its images by name (`id:name` but in the default sprite) and its sheet */\nexport interface Sprite {\n image: ImageBitmap;\n icons: Record<string, { x: number; y: number; width: number; height: number; pixelRatio?: number }>;\n}\n\n/** An image of the sprites and its sheet */\nfunction spriteIcon(r: Renderer, name: string) {\n for (const sprite of r.sprites) {\n const icon = sprite.icons[name];\n if (icon) return { icon, image: sprite.image };\n }\n return undefined;\n}\n\nconst renderers = new Map<string, Renderer>();\n/** Decoded tiles kept by the pool, shared among its workers (a vector tile always goes to the same worker): some\n * 2 MB each */\nconst CACHE = 96;\n/** Decoded tiles by URL; this worker's share of them, set by the renderers */\nconst cache = new Lru<string, Promise<Map<string, TileLayer> | undefined>>(CACHE);\n\n/** The decoded tiles one worker of `workers` keeps */\nexport function cacheShare(workers: number): number {\n return Math.max(16, Math.ceil(CACHE / Math.max(1, workers)));\n}\n/** Requests in progress, and those of them aborted (both forgotten once answered) */\nconst active = new Set<number>();\nconst aborted = new Set<number>();\n/** The signals of the relief and reprojection requests in progress, aborted with them */\nconst controllers = new Map<number, AbortController>();\n\n/** Where this worker reads the colors of the relief tiles back */\nconst heightsSurface: Surface = {};\n\n/** The reprojected rasters' source images this worker keeps, shared by every source */\nconst reprojection = resampler();\n\n/** Images of the raster sources by URL. An image dropped is freed once settled, after the renders that awaited it have\n * drawn it (they draw without awaiting again) */\nconst images = new Lru<string, Promise<ImageBitmap | undefined>>(64, (evicted) =>\n evicted.then(\n (bitmap) => setTimeout(() => bitmap?.close(), 0),\n () => undefined,\n ),\n);\n\n/** An image of a raster source (shared by every renderer); undefined where the source has none */\nfunction image(url: string, priority: Priority = 'auto'): Promise<ImageBitmap | undefined> {\n const hit = images.get(url);\n if (hit) return hit;\n const pending = (async () => {\n // A tile of a PMTiles archive (`pmtiles://…/{z}/{x}/{y}`)\n const archived = pmtilesTile(url);\n if (archived) {\n const bytes = await archived;\n return bytes && createImageBitmap(new Blob([bytes as Uint8Array<ArrayBuffer>]));\n }\n const init: PriorityInit = { priority };\n const response = await fetch(url, withHeaders(url, init));\n if (response.status === 404 || response.status === 204) return undefined;\n if (!response.ok) throw new Error(`${url}: ${response.status}`);\n return createImageBitmap(await response.blob());\n })();\n pending.catch(() => images.delete(url));\n images.set(url, pending);\n return pending;\n}\n\n/** `RequestInit` with the fetch priority, which the TypeScript DOM library may not know yet */\ntype PriorityInit = RequestInit & { priority?: Priority };\n\n/** A vector tile, decoded (shared by every renderer of its URL); the first request's priority fetches it */\nfunction tile(url: string, priority: Priority = 'auto'): Promise<Map<string, TileLayer> | undefined> {\n const hit = cache.get(url);\n if (hit) return hit;\n const pending = (async () => {\n // A tile of a PMTiles archive, ungzipped by the reader\n const archived = pmtilesTile(url);\n if (archived) {\n const bytes = await archived;\n return bytes && decode(bytes);\n }\n for (let attempt = 0; ; attempt += 1) {\n const init: PriorityInit = { priority };\n const response = await fetch(url, withHeaders(url, init));\n if (response.status === 404 || response.status === 204) return undefined;\n if (response.ok) {\n // Every layer: renderers of other subsets share the tile\n return decode(new Uint8Array(await response.arrayBuffer()));\n }\n if (attempt >= 2) throw new Error(`${url}: ${response.status}`);\n await new Promise((r) => setTimeout(r, 400 * (attempt + 1)));\n }\n })();\n pending.catch(() => cache.delete(url));\n cache.set(url, pending);\n return pending;\n}\n\n/** The vector tile to draw a raster tile from, and where the raster tile lies in it (tile units) */\nfunction source(r: Renderer, z: number, x: number, y: number) {\n const vz = Math.max(0, Math.min(z - 1, r.maxzoom));\n const d = z - vz;\n const n = 2 ** Math.max(0, d);\n const [vx, vy] = d >= 0 ? [Math.floor(x / n), Math.floor(y / n)] : [x, y];\n const url = r.tiles.replace('{z}', String(vz)).replace('{x}', String(vx)).replace('{y}', String(vy));\n // Fraction of the vector tile covered, and the offset in it\n const part = 1 / n;\n return { url, vz, vx, vy, part, ox: (x % n) * part, oy: (y % n) * part };\n}\n\nconst value = (layer: StyleLayer, group: 'paint' | 'layout', key: string, ctx: Context, fallback: unknown) => {\n const v = layer[group]?.[key];\n if (v === undefined) return fallback;\n // An array that is not an expression is a literal value (`text-font`, `text-offset`, `line-dasharray`)\n const out = Array.isArray(v) && !isExpression(v) ? v : evaluate(v, ctx);\n return out === undefined || out === null ? fallback : out;\n};\n\n/** A color with an opacity, for the canvas */\nfunction paint(c: unknown, opacity: number): string {\n const rgba = color(c) ?? [0, 0, 0, 1];\n return css([rgba[0], rgba[1], rgba[2], rgba[3] * opacity]);\n}\n\nfunction shown(layer: StyleLayer, zoom: number): boolean {\n if (layer.layout?.visibility === 'none') return false;\n return zoom >= (layer.minzoom ?? 0) && zoom < (layer.maxzoom ?? 24);\n}\n\n/** The image of a fill pattern, cut from the sprite on first use */\nfunction patternImage(r: Renderer, name: string): OffscreenCanvas | undefined {\n if (r.patterns.has(name)) return r.patterns.get(name);\n const found = spriteIcon(r, name);\n let image: OffscreenCanvas | undefined;\n if (found && found.icon.width > 0 && found.icon.height > 0) {\n const { icon } = found;\n image = new OffscreenCanvas(icon.width, icon.height);\n image\n .getContext('2d')\n ?.drawImage(found.image, icon.x, icon.y, icon.width, icon.height, 0, 0, icon.width, icon.height);\n }\n r.patterns.set(name, image);\n return image;\n}\n\n/** Canvases free for the next tiles, by size: one per tile being drawn at most */\nconst canvases = new Map<number, OffscreenCanvas[]>();\n\n/** A blank canvas of `size` pixels and its context, from the free ones if any */\nfunction takeCanvas(size: number): { canvas: OffscreenCanvas; g: OffscreenCanvasRenderingContext2D } {\n const canvas = canvases.get(size)?.pop() ?? new OffscreenCanvas(size, size);\n // A canvas on the CPU: its pixels are read back here, in the worker, not on the main thread at the upload\n const g = canvas.getContext('2d', { willReadFrequently: true });\n if (!g) throw new Error('no 2D context');\n // The state a former tile left\n g.setTransform(1, 0, 0, 1, 0, 0);\n g.globalAlpha = 1;\n g.setLineDash([]);\n g.clearRect(0, 0, size, size);\n return { canvas, g };\n}\n\nfunction giveCanvas(canvas: OffscreenCanvas): void {\n const free = canvases.get(canvas.width) ?? [];\n canvases.set(canvas.width, free);\n if (free.length < 4) free.push(canvas);\n}\n\n/**\n * The image of a drawn canvas, its alpha straight (the engine blends straight alpha). An opaque tile (a background\n * of full opacity, as a basemap's) is moved out of the canvas as it is, premultiplied and straight being the same\n * there; another one is read back unpremultiplied, copied\n */\nexport function tileImage(\n canvas: OffscreenCanvas,\n g: OffscreenCanvasRenderingContext2D,\n opaque: boolean,\n): Promise<ImageBitmap> {\n if (opaque) return Promise.resolve(canvas.transferToImageBitmap());\n return createImageBitmap(g.getImageData(0, 0, canvas.width, canvas.height), { premultiplyAlpha: 'none' });\n}\n\nasync function render(r: Renderer, z: number, x: number, y: number, size: number, id: number, priority?: Priority) {\n const s = source(r, z, x, y);\n const layers = await tile(s.url, priority);\n if (aborted.has(id)) return undefined;\n const { canvas, g } = takeCanvas(size);\n try {\n return await draw(r, s, layers, canvas, g, z, x, y, size, id, priority);\n } finally {\n giveCanvas(canvas);\n }\n}\n\nasync function draw(\n r: Renderer,\n s: ReturnType<typeof source>,\n layers: Map<string, TileLayer> | undefined,\n canvas: OffscreenCanvas,\n g: OffscreenCanvasRenderingContext2D,\n z: number,\n x: number,\n y: number,\n size: number,\n id: number,\n priority?: Priority,\n) {\n const zoom = Math.max(0, z - 1);\n // CSS pixels to canvas pixels: the tile is 256 CSS pixels across at its zoom\n const px = size / 256;\n let drawn = false;\n /** A background of full opacity covers the tile: every pixel stays opaque */\n let opaque = false;\n for (const layer of r.layers) {\n if (!shown(layer, zoom)) continue;\n const zctx: Context = { zoom, properties: {}, type: 'Unknown' };\n if (layer.type === 'background') {\n const fill = value(layer, 'paint', 'background-color', zctx, '#000');\n const opacity = Number(value(layer, 'paint', 'background-opacity', zctx, 1));\n g.fillStyle = paint(fill, opacity);\n g.fillRect(0, 0, size, size);\n if ((color(fill) ?? [0, 0, 0, 1])[3] * opacity >= 1) opaque = true;\n drawn = true;\n continue;\n }\n if (layer.type === 'raster') {\n const source = layer.source === undefined ? undefined : r.rasters[layer.source];\n if (!source) continue;\n // The canvas covers the Web Mercator tile (z, x, y): a source tile of 512 px covers it from a level coarser\n const rz = Math.max(0, Math.min(z - (source.tileSize >= 512 ? 1 : 0), source.maxzoom));\n const n = 2 ** (z - rz);\n const url = source.tiles\n .replace('{z}', String(rz))\n .replace('{x}', String(Math.floor(x / n)))\n .replace('{y}', String(Math.floor(y / n)));\n const picture = await image(url, priority).catch(() => undefined);\n if (aborted.has(id)) return undefined;\n if (!picture) continue;\n const [w, h] = [picture.width / n, picture.height / n];\n g.globalAlpha = Number(value(layer, 'paint', 'raster-opacity', zctx, 1));\n g.drawImage(picture, (x % n) * w, (y % n) * h, w, h, 0, 0, size, size);\n g.globalAlpha = 1;\n drawn = true;\n continue;\n }\n const data = layers?.get(layer['source-layer'] ?? '');\n if (!data) continue;\n // Tile units to canvas pixels\n const k = size / (data.extent * s.part);\n const [ox, oy] = [s.ox * data.extent, s.oy * data.extent];\n const path = (f: TileFeature, close: boolean) => {\n g.beginPath();\n for (const line of f.geometry) {\n for (let i = 0; i + 1 < line.length; i += 2) {\n const [lx, ly] = [((line[i] ?? 0) - ox) * k, ((line[i + 1] ?? 0) - oy) * k];\n if (i === 0) g.moveTo(lx, ly);\n else g.lineTo(lx, ly);\n }\n if (close) g.closePath();\n }\n };\n // Values that only depend on the zoom are evaluated once for the layer\n const dependent = new Map<string, boolean>();\n const get = (group: 'paint' | 'layout', key: string, ctx: Context, fallback: unknown) => {\n let d = dependent.get(key);\n if (d === undefined) {\n d = isFeatureDependent(layer[group]?.[key]);\n dependent.set(key, d);\n }\n return value(layer, group, key, d ? ctx : zctx, fallback);\n };\n for (const f of data.features) {\n const ctx = context(f, zoom);\n if (!filter(layer.filter, ctx)) continue;\n if (layer.type === 'fill-extrusion' && f.type === 3) {\n // Flat, seen from above: its color\n path(f, true);\n g.fillStyle = paint(\n get('paint', 'fill-extrusion-color', ctx, '#000'),\n Number(get('paint', 'fill-extrusion-opacity', ctx, 1)),\n );\n g.fill('evenodd');\n drawn = true;\n } else if (layer.type === 'fill' && f.type === 3) {\n const opacity = Number(get('paint', 'fill-opacity', ctx, 1));\n const pattern = get('paint', 'fill-pattern', ctx, undefined);\n path(f, true);\n const icon = typeof pattern === 'string' ? spriteIcon(r, pattern)?.icon : undefined;\n const image = icon && patternImage(r, pattern as string);\n if (icon && image) {\n const p = g.createPattern(image, 'repeat');\n if (p) {\n p.setTransform(new DOMMatrix().scale(px / (icon.pixelRatio ?? 1)));\n g.globalAlpha = opacity;\n g.fillStyle = p;\n g.fill('evenodd');\n g.globalAlpha = 1;\n }\n } else {\n g.fillStyle = paint(get('paint', 'fill-color', ctx, '#000'), opacity);\n g.fill('evenodd');\n const outline = get('paint', 'fill-outline-color', ctx, undefined);\n if (outline !== undefined) {\n g.strokeStyle = paint(outline, opacity);\n g.lineWidth = px;\n g.setLineDash([]);\n g.stroke();\n }\n }\n drawn = true;\n } else if (layer.type === 'line' && f.type !== 1) {\n const width = Number(get('paint', 'line-width', ctx, 1));\n if (width <= 0) continue;\n // A gap: two lines on either side of it, drawn as one wide line (the casing of a road, its inside drawn over)\n const gap = Number(get('paint', 'line-gap-width', ctx, 0));\n g.strokeStyle = paint(get('paint', 'line-color', ctx, '#000'), Number(get('paint', 'line-opacity', ctx, 1)));\n g.lineWidth = (gap > 0 ? gap + 2 * width : width) * px;\n g.lineCap = String(get('layout', 'line-cap', ctx, 'butt')) as CanvasLineCap;\n g.lineJoin = String(get('layout', 'line-join', ctx, 'miter')) as CanvasLineJoin;\n const dash = get('paint', 'line-dasharray', ctx, undefined);\n g.setLineDash(Array.isArray(dash) ? dash.map((d) => Number(d) * width * px) : []);\n path(f, f.type === 3);\n g.stroke();\n drawn = true;\n } else if (layer.type === 'circle' && f.type === 1) {\n const radius = Number(get('paint', 'circle-radius', ctx, 5)) * px;\n g.fillStyle = paint(get('paint', 'circle-color', ctx, '#000'), Number(get('paint', 'circle-opacity', ctx, 1)));\n const stroke = Number(get('paint', 'circle-stroke-width', ctx, 0)) * px;\n g.strokeStyle = paint(\n get('paint', 'circle-stroke-color', ctx, '#000'),\n Number(get('paint', 'circle-stroke-opacity', ctx, 1)),\n );\n g.lineWidth = stroke;\n for (const point of f.geometry) {\n for (let i = 0; i + 1 < point.length; i += 2) {\n g.beginPath();\n g.arc(((point[i] ?? 0) - ox) * k, ((point[i + 1] ?? 0) - oy) * k, radius, 0, 2 * Math.PI);\n g.fill();\n if (stroke > 0) g.stroke();\n }\n }\n drawn = true;\n }\n }\n }\n if (!drawn && !layers) return null;\n return tileImage(canvas, g, opaque);\n}\n\n/** How a layer's text or icon (`prefix`) meets the others: allowed to overlap, ignored by the placement */\nfunction overlapOf(layer: StyleLayer, prefix: 'text' | 'icon', ctx: Context): CandidateOverlap {\n const allow = Boolean(value(layer, 'layout', `${prefix}-allow-overlap`, ctx, false));\n const ignore = Boolean(value(layer, 'layout', `${prefix}-ignore-placement`, ctx, false));\n if (allow && ignore) return true;\n if (allow) return 'allow';\n return ignore ? 'ignore' : false;\n}\n\n/** A pair of numbers of a style value, `fallback` if it is not one */\nfunction pair(v: unknown, fallback: [number, number]): [number, number] {\n return Array.isArray(v) ? [Number(v[0] ?? fallback[0]), Number(v[1] ?? fallback[1])] : fallback;\n}\n\n/** Top, right, bottom, left of one to four numbers, as CSS's sides */\nfunction sides(v: unknown): [number, number, number, number] {\n const n = (Array.isArray(v) ? v : [v]).map((x) => Number(x) || 0);\n const [top = 0, right = top, bottom = top, left = right] = n;\n return [top, right, bottom, left];\n}\n\n/** Points every `spacing` along a line (tile units, x and y interleaved), the first half a spacing in (the middle of a\n * shorter line): each point and the segment it lies on (x, y, x0, y0, x1, y1) */\nexport function lineAnchors(line: readonly number[], spacing: number): number[][] {\n let length = 0;\n for (let i = 2; i + 1 < line.length; i += 2) {\n length += Math.hypot((line[i] ?? 0) - (line[i - 2] ?? 0), (line[i + 1] ?? 0) - (line[i - 1] ?? 0));\n }\n const out: number[][] = [];\n if (!(length > 0) || !(spacing > 0)) return out;\n let next = Math.min(spacing / 2, length / 2);\n let walked = 0;\n for (let i = 2; i + 1 < line.length; i += 2) {\n const [ax, ay, bx, by] = [line[i - 2] ?? 0, line[i - 1] ?? 0, line[i] ?? 0, line[i + 1] ?? 0];\n const d = Math.hypot(bx - ax, by - ay);\n while (d > 0 && next <= walked + d) {\n const t = (next - walked) / d;\n out.push([ax + (bx - ax) * t, ay + (by - ay) * t, ax, ay, bx, by]);\n next += spacing;\n }\n walked += d;\n }\n return out;\n}\n\n/** Longitude and latitude of a point of tile (z, x, y) in tile units */\nfunction lonLat(z: number, x: number, y: number, extent: number, px: number, py: number): [number, number] {\n const n = 2 ** z;\n return [longitude((x + px / extent) / n), latitude((y + py / extent) / n)];\n}\n\n/** The icon of a label: its layer's icon properties for the feature */\nfunction iconOf(\n layer: StyleLayer,\n image: string,\n ctx: Context,\n placement: 'point' | 'line',\n sizeOf: (layer: StyleLayer) => Json,\n): CandidateIcon {\n const alignment = value(layer, 'layout', 'icon-rotation-alignment', ctx, 'auto');\n const fit = String(value(layer, 'layout', 'icon-text-fit', ctx, 'none'));\n const padding = value(layer, 'layout', 'icon-text-fit-padding', ctx, [0, 0, 0, 0]);\n return {\n image,\n size: isFeatureDependent(layer.layout?.['icon-size'])\n ? Number(value(layer, 'layout', 'icon-size', ctx, 1))\n : sizeOf(layer),\n anchor: String(value(layer, 'layout', 'icon-anchor', ctx, 'center')),\n offset: pair(value(layer, 'layout', 'icon-offset', ctx, [0, 0]), [0, 0]),\n rotate: Number(value(layer, 'layout', 'icon-rotate', ctx, 0)) || 0,\n alignment: alignment === 'map' || (alignment === 'auto' && placement === 'line') ? 'map' : 'viewport',\n overlap: overlapOf(layer, 'icon', ctx),\n optional: Boolean(value(layer, 'layout', 'icon-optional', ctx, false)),\n fit: fit === 'width' || fit === 'height' || fit === 'both' ? fit : 'none',\n padding: sides(padding),\n color: String(value(layer, 'paint', 'icon-color', ctx, '#000')),\n opacity: Number(value(layer, 'paint', 'icon-opacity', ctx, 1)),\n };\n}\n\nasync function labels(\n r: Renderer,\n z: number,\n x: number,\n y: number,\n id: number,\n priority?: Priority,\n zoom = z,\n): Promise<LabelCandidate[]> {\n const url = r.tiles.replace('{z}', String(z)).replace('{x}', String(x)).replace('{y}', String(y));\n const layers = await tile(url, priority);\n if (!layers || aborted.has(id)) return [];\n const out: LabelCandidate[] = [];\n // The text size of a layer when it depends on the zoom only: legacy stops as they are, an expression as stops\n const sizes = new Map<StyleLayer, Json>();\n const sizeOf = (layer: StyleLayer): Json => {\n let s = sizes.get(layer);\n if (s === undefined) {\n const v = layer.layout?.['text-size'] ?? 16;\n s = isExpression(v) ? zoomStops(v) : v;\n sizes.set(layer, s);\n }\n return s;\n };\n // The icon size of a layer when it depends on the zoom only, as the text size\n const iconSizes = new Map<StyleLayer, Json>();\n const iconSizeOf = (layer: StyleLayer): Json => {\n let s = iconSizes.get(layer);\n if (s === undefined) {\n const v = layer.layout?.['icon-size'] ?? 1;\n s = isExpression(v) ? zoomStops(v) : v;\n iconSizes.set(layer, s);\n }\n return s;\n };\n r.layers.forEach((layer, index) => {\n const layout = layer.layout ?? {};\n if (layer.type !== 'symbol' || !shown(layer, zoom)) return;\n if (layout['text-field'] === undefined && layout['icon-image'] === undefined) return;\n const data = layers.get(layer['source-layer'] ?? '');\n if (!data) return;\n const zctx: Context = { zoom, properties: {}, type: 'Unknown' };\n const placement = value(layer, 'layout', 'symbol-placement', zctx, 'point') === 'line' ? 'line' : 'point';\n const textAlong =\n placement === 'line' && value(layer, 'layout', 'text-rotation-alignment', zctx, 'auto') !== 'viewport';\n for (const f of data.features) {\n const ctx = context(f, zoom);\n if (!filter(layer.filter, ctx)) continue;\n let t = text(layout['text-field'], ctx).trim();\n const image = text(layout['icon-image'], ctx).trim();\n if (!t && !image) continue;\n const transform = value(layer, 'layout', 'text-transform', ctx, 'none');\n if (transform === 'uppercase') t = t.toUpperCase();\n else if (transform === 'lowercase') t = t.toLowerCase();\n const fonts = value(layer, 'layout', 'text-font', ctx, ['Noto Sans Regular']);\n const font = labelFont(Array.isArray(fonts) && typeof fonts[0] === 'string' ? fonts[0] : 'Noto Sans Regular');\n const offset = value(layer, 'layout', 'text-offset', ctx, [0, 0]);\n const base = {\n layer: index,\n text: t,\n font,\n // Zoom stops are kept for the engine; a value of the feature evaluated here\n size: isFeatureDependent(layer.layout?.['text-size'])\n ? Number(value(layer, 'layout', 'text-size', ctx, 16))\n : sizeOf(layer),\n color: String(value(layer, 'paint', 'text-color', ctx, '#000')),\n haloColor: String(value(layer, 'paint', 'text-halo-color', ctx, 'rgba(0,0,0,0)')),\n haloWidth: Number(value(layer, 'paint', 'text-halo-width', ctx, 0)),\n anchor: String(value(layer, 'layout', 'text-anchor', ctx, 'center')),\n offset: (Array.isArray(offset) ? [Number(offset[0] ?? 0), Number(offset[1] ?? 0)] : [0, 0]) as [number, number],\n maxWidth: Number(value(layer, 'layout', 'text-max-width', ctx, 10)),\n lineHeight: Number(value(layer, 'layout', 'text-line-height', ctx, 1.2)),\n overlap: overlapOf(layer, 'text', ctx),\n ...(textAlong ? { textAlong } : {}),\n ...(value(layer, 'layout', 'text-optional', ctx, false) ? { textOptional: true } : {}),\n ...(image ? { icon: iconOf(layer, image, ctx, placement, iconSizeOf) } : {}),\n };\n if (f.type === 1) {\n for (const point of f.geometry) {\n for (let i = 0; i + 1 < point.length; i += 2) {\n const [px, py] = [point[i] ?? 0, point[i + 1] ?? 0];\n // Points in the buffer belong to the neighbouring tile\n if (px < 0 || py < 0 || px >= data.extent || py >= data.extent) continue;\n const [lon, lat] = lonLat(z, x, y, data.extent, px, py);\n out.push({ ...base, lon, lat });\n }\n }\n } else if (!t && placement === 'line') {\n // Icons alone along lines (one-way arrows): every `symbol-spacing` CSS pixels (a tile is 512 across at its\n // level, twice as many at each zoom past it)\n const spacing =\n (Number(value(layer, 'layout', 'symbol-spacing', ctx, 250)) * data.extent) / (512 * 2 ** (zoom - z));\n for (const line of f.geometry) {\n for (const [px = 0, py = 0, ax = 0, ay = 0, bx = 0, by = 0] of lineAnchors(line, Math.max(spacing, 1))) {\n if (px < 0 || py < 0 || px >= data.extent || py >= data.extent) continue;\n const [lon, lat] = lonLat(z, x, y, data.extent, px, py);\n const [lon1, lat1] = lonLat(z, x, y, data.extent, bx, by);\n const [lon0, lat0] = lonLat(z, x, y, data.extent, ax, ay);\n out.push({ ...base, lon, lat, along: [lon1 - lon0, lat1 - lat0] });\n }\n }\n } else {\n // The middle of the longest line inside the tile, along it\n let best: number[] | undefined;\n let bestLength = 0;\n for (const line of f.geometry) {\n let length = 0;\n for (let i = 2; i + 1 < line.length; i += 2) {\n length += Math.hypot((line[i] ?? 0) - (line[i - 2] ?? 0), (line[i + 1] ?? 0) - (line[i - 1] ?? 0));\n }\n if (length > bestLength) {\n bestLength = length;\n best = line;\n }\n }\n if (!best || bestLength < data.extent / 32) continue;\n let rest = bestLength / 2;\n for (let i = 2; i + 1 < best.length; i += 2) {\n const [ax, ay, bx, by] = [best[i - 2] ?? 0, best[i - 1] ?? 0, best[i] ?? 0, best[i + 1] ?? 0];\n const d = Math.hypot(bx - ax, by - ay);\n if (d >= rest && d > 0) {\n const [px, py] = [ax + ((bx - ax) * rest) / d, ay + ((by - ay) * rest) / d];\n if (px < 0 || py < 0 || px >= data.extent || py >= data.extent) break;\n const [lon, lat] = lonLat(z, x, y, data.extent, px, py);\n const [lon1, lat1] = lonLat(z, x, y, data.extent, bx, by);\n const [lon0, lat0] = lonLat(z, x, y, data.extent, ax, ay);\n out.push({ ...base, lon, lat, ...(placement === 'line' ? { along: [lon1 - lon0, lat1 - lat0] } : {}) });\n break;\n }\n rest -= d;\n }\n }\n }\n });\n return out;\n}\n\nconst post = (message: BasemapResponse, transfer: Transferable[] = []) =>\n (self as unknown as Worker).postMessage(message, transfer);\n\nself.onmessage = async ({ data }: MessageEvent<BasemapRequest>) => {\n if (data.type === 'headers') {\n setHeaderRules(data.rules);\n return;\n }\n if (data.type === 'init') {\n if (data.workers !== undefined) cache.capacity = cacheShare(data.workers);\n renderers.set(data.key, {\n tiles: data.tiles,\n maxzoom: data.maxzoom,\n layers: data.layers,\n rasters: data.rasters ?? {},\n sprites: data.sprites ?? [],\n patterns: new Map(),\n });\n return;\n }\n if (data.type === 'drop') {\n // Its copy of the sprites\n for (const sprite of renderers.get(data.key)?.sprites ?? []) sprite.image.close();\n renderers.delete(data.key);\n return;\n }\n if (data.type === 'abort') {\n // An abort that arrives after the answer is ignored\n if (active.has(data.id)) aborted.add(data.id);\n controllers.get(data.id)?.abort();\n return;\n }\n if (data.type === 'heights' || data.type === 'reproject') {\n await decodeTile(data);\n return;\n }\n active.add(data.id);\n const r = renderers.get(data.key);\n try {\n if (!r) throw new Error(`no renderer ${data.key}`);\n if (data.type === 'render') {\n const image = await render(r, data.z, data.x, data.y, data.size, data.id, data.priority);\n if (image) post({ id: data.id, image }, [image]);\n else post({ id: data.id, missing: true });\n } else {\n post({ id: data.id, labels: await labels(r, data.z, data.x, data.y, data.id, data.priority, data.zoom) });\n }\n } catch (error) {\n post({ id: data.id, error: String(error) });\n } finally {\n active.delete(data.id);\n aborted.delete(data.id);\n }\n};\n\n/** A tile of another layer: the altitudes of a relief tile, or a reprojected raster tile */\nasync function decodeTile(data: Extract<BasemapWork, { type: 'heights' | 'reproject' }> & { id: number }) {\n const controller = new AbortController();\n controllers.set(data.id, controller);\n try {\n if (data.type === 'heights') {\n const heights = await fetchHeights(data.url, data.encoding, data.floor, controller.signal, heightsSurface);\n if (heights) post({ id: data.id, heights }, [heights.buffer]);\n else post({ id: data.id, missing: true });\n } else {\n reprojection.cache.capacity = data.cached;\n const image = await reprojection.draw(data.job, controller.signal);\n if (image) post({ id: data.id, image }, [image]);\n else post({ id: data.id, missing: true });\n }\n } catch (error) {\n post({ id: data.id, error: String(error) });\n } finally {\n controllers.delete(data.id);\n }\n}\n"
5
+ "/**\n * Mapbox Vector Tiles (MVT 2.1) decoding: layers of features with their properties and geometry, in tile units\n * (`extent`, usually 4096 across). Points are lists of points, lines lists of lines, polygons lists of rings (the\n * outer ones clockwise in tile coordinates, y down, holes the other way round, as the specification says).\n */\n\nexport type Value = string | number | boolean;\n\nexport interface TileFeature {\n /** 1 point, 2 line, 3 polygon */\n type: 1 | 2 | 3;\n properties: Record<string, Value>;\n /** Point lists: x0, y0, x1, y1… in tile units */\n geometry: number[][];\n}\n\nexport interface TileLayer {\n extent: number;\n features: TileFeature[];\n}\n\n/** Protobuf reader of a buffer range */\nclass Pbf {\n pos: number;\n constructor(\n private readonly buf: Uint8Array,\n start = 0,\n readonly end = buf.length,\n ) {\n this.pos = start;\n }\n /** An unsigned varint, approximated beyond 2^53; all its bytes are read (up to 10), so the next field is right */\n varint(): number {\n let value = 0;\n\n for (let shift = 0; shift < 70; shift += 7) {\n const b = this.buf[this.pos++] ?? 0;\n\n value += (b & 0x7f) * 2 ** shift;\n if (b < 0x80) break;\n }\n\n return value;\n }\n /** A signed 64-bit varint (two's complement: a negative value takes 10 bytes) */\n int64(): number {\n let lo = 0;\n let hi = 0;\n\n for (let i = 0; i < 10; i += 1) {\n const b = this.buf[this.pos++] ?? 0;\n const bits = b & 0x7f;\n\n // Bits 0-27 in the low word, bits 28-31 split, the rest in the high word\n if (i < 4) lo |= bits << (7 * i);\n else if (i === 4) {\n lo |= (bits & 0x0f) << 28;\n hi |= bits >> 4;\n } else hi |= bits << (7 * i - 32);\n if (b < 0x80) break;\n }\n\n // The high word signed: values from 2^63 up are negative\n return (hi | 0) * 2 ** 32 + (lo >>> 0);\n }\n sint(): number {\n const v = this.varint();\n\n return v % 2 === 1 ? -(v + 1) / 2 : v / 2;\n }\n /** A length-delimited field as a sub-reader */\n sub(): Pbf {\n const n = this.varint();\n // A length past the end (a truncated tile) stops at the end\n const end = Math.min(this.pos + n, this.end);\n const r = new Pbf(this.buf, this.pos, end);\n\n this.pos = end;\n\n return r;\n }\n string(): string {\n const n = this.varint();\n const end = Math.min(this.pos + n, this.end);\n const s = decoder.decode(this.buf.subarray(this.pos, end));\n\n this.pos = end;\n\n return s;\n }\n float(): number {\n const v = this.pos + 4 <= this.end ? this.view().getFloat32(this.pos, true) : 0;\n\n this.pos += 4;\n\n return v;\n }\n double(): number {\n const v = this.pos + 8 <= this.end ? this.view().getFloat64(this.pos, true) : 0;\n\n this.pos += 8;\n\n return v;\n }\n private view(): DataView {\n return new DataView(this.buf.buffer, this.buf.byteOffset, this.buf.byteLength);\n }\n skip(wire: number): void {\n if (wire === 0) this.varint();\n else if (wire === 1) this.pos += 8;\n else if (wire === 2) this.pos += this.varint();\n else if (wire === 5) this.pos += 4;\n }\n get more(): boolean {\n return this.pos < this.end;\n }\n}\n\nconst decoder = new TextDecoder();\n\nconst value = (p: Pbf): Value => {\n let v: Value = '';\n\n while (p.more) {\n const tag = p.varint();\n\n switch (tag >> 3) {\n case 1:\n v = p.string();\n break;\n case 2:\n v = p.float();\n break;\n case 3:\n v = p.double();\n break;\n case 4:\n v = p.int64();\n break;\n case 5:\n v = p.varint();\n break;\n case 6:\n v = p.sint();\n break;\n case 7:\n v = p.varint() !== 0;\n break;\n default:\n p.skip(tag & 7);\n }\n }\n\n return v;\n};\n\n/** Point lists of a geometry's commands (MoveTo, LineTo, ClosePath) */\nconst geometry = (p: Pbf): number[][] => {\n const out: number[][] = [];\n let current: number[] | undefined;\n let [x, y] = [0, 0];\n\n while (p.more) {\n const command = p.varint();\n const id = command & 7;\n const count = command >> 3;\n\n if (id === 7) {\n // ClosePath: back to the first point\n if (current && current.length >= 2) current.push(current[0] ?? 0, current[1] ?? 0);\n continue;\n }\n // A count past the end (a truncated geometry) stops there\n for (let i = 0; i < count && p.more; i += 1) {\n x += p.sint();\n y += p.sint();\n if (id === 1) {\n current = [];\n out.push(current);\n }\n current?.push(x, y);\n }\n }\n\n return out;\n};\n\n/** Decodes a tile; only the layers in `wanted` (all if undefined) */\nexport const decode = (bytes: Uint8Array, wanted?: Set<string>): Map<string, TileLayer> => {\n const layers = new Map<string, TileLayer>();\n const tile = new Pbf(bytes);\n\n while (tile.more) {\n const tag = tile.varint();\n\n if (tag >> 3 !== 3) {\n tile.skip(tag & 7);\n continue;\n }\n\n const l = tile.sub();\n let name = '';\n let extent = 4096;\n const keys: string[] = [];\n const values: Value[] = [];\n const raw: Pbf[] = [];\n\n while (l.more) {\n const t = l.varint();\n\n switch (t >> 3) {\n case 1:\n name = l.string();\n break;\n case 2:\n raw.push(l.sub());\n break;\n case 3:\n keys.push(l.string());\n break;\n case 4:\n values.push(value(l.sub()));\n break;\n case 5:\n extent = l.varint();\n break;\n default:\n l.skip(t & 7);\n }\n }\n if (wanted && !wanted.has(name)) continue;\n\n const features: TileFeature[] = [];\n\n for (const f of raw) {\n let type: 1 | 2 | 3 = 1;\n const properties: Record<string, Value> = {};\n let geom: number[][] = [];\n\n while (f.more) {\n const t = f.varint();\n\n switch (t >> 3) {\n case 2: {\n const tags = f.sub();\n\n while (tags.more) {\n const k = keys[tags.varint()];\n const v = values[tags.varint()];\n\n if (k !== undefined && v !== undefined) properties[k] = v;\n }\n break;\n }\n case 3:\n type = Math.min(3, Math.max(1, f.varint())) as 1 | 2 | 3;\n break;\n case 4:\n geom = geometry(f.sub());\n break;\n default:\n f.skip(t & 7);\n }\n }\n features.push({ type, properties, geometry: geom });\n }\n layers.set(name, { extent, features });\n }\n\n return layers;\n};\n",
6
+ "/**\n * Headers added to the requests of the page by URL prefix: an access token for private sources (a Géoplateforme\n * private stream, a server behind single sign-on), on every request isard makes, from the page, its workers (vector\n * tiles, 3D Tiles and point clouds) and its engine (raster tiles, tilesets): `setRequestHeaders(prefix, headers)`,\n * again with a new token when it is renewed. The rules of a URL are merged, the longest prefix last (it wins).\n */\n\n/** Rules: a URL prefix and its headers, the shortest prefix first */\nexport type HeaderRules = [prefix: string, headers: Record<string, string>][];\n\nlet rules: HeaderRules = [];\nconst listeners = new Set<(rules: HeaderRules) => void>();\n\n/**\n * Adds `headers` to every request isard makes to a URL starting with `prefix` (in the page and its workers), or with\n * no headers, stops: `setRequestHeaders('https://data.geopf.fr/private/', { Authorization: 'Bearer …' })`. The\n * server must allow these headers (CORS). For the whole page: every map, the ones to come too\n */\nexport const setRequestHeaders = (prefix: string, headers?: Record<string, string>): void => {\n const kept = rules.filter(([p]) => p !== prefix);\n\n if (headers && Object.keys(headers).length > 0) kept.push([prefix, { ...headers }]);\n kept.sort(([p], [q]) => p.length - q.length);\n setHeaderRules(kept);\n listeners.forEach((listener) => {\n listener(rules);\n });\n};\n\n/** @internal The rules now */\nexport const headerRules = (): HeaderRules => {\n return rules;\n};\n\n/** @internal The rules, from the page (a worker's copy) */\nexport const setHeaderRules = (next: HeaderRules): void => {\n rules = next;\n};\n\n/** @internal Follows the rules (the workers and engines of a map); returns the function that stops */\nexport const onHeaderRules = (listener: (rules: HeaderRules) => void): (() => void) => {\n listeners.add(listener);\n\n return () => listeners.delete(listener);\n};\n\n/** @internal `init` with the headers of the rules matching `url` (unchanged when none does) */\nexport const withHeaders = (url: string | URL, init: RequestInit = {}): RequestInit => {\n const href = String(url);\n const matching = rules.filter(([prefix]) => href.startsWith(prefix));\n\n if (matching.length === 0) return init;\n\n const headers = new Headers(init.headers);\n\n matching.forEach(([, set]) => {\n Object.entries(set).forEach(([name, value]) => {\n headers.set(name, value);\n });\n });\n\n return { ...init, headers };\n};\n",
7
+ "/**\n * Type guards for data from outside (fetched JSON, messages): what the code reads is checked at run time.\n */\n\n/** An object (not null, not an array): its keys can be read */\nexport const isRecord = (value: unknown): value is Record<string, unknown> =>\n typeof value === 'object' && value !== null && !Array.isArray(value);\n\n/** An array of numbers */\nexport const isNumbers = (value: unknown): value is number[] =>\n Array.isArray(value) && value.every((v) => typeof v === 'number');\n",
8
+ "/**\n * A cache keeping its most recently used entries (the decoded tiles and images of the workers, the source tiles of a\n * reprojection, the labels of the vector tiles): a `Map` in order of use, the least recent dropped past `capacity`.\n */\nexport class Lru<K, V> {\n private readonly entries = new Map<K, V>();\n\n /** `evict`: told of each entry dropped for room (not of those deleted) */\n constructor(\n public capacity: number,\n private readonly evict?: (value: V, key: K) => void,\n ) {}\n\n get size(): number {\n return this.entries.size;\n }\n\n /** The value of a key, now the most recently used; undefined if absent */\n get(key: K): V | undefined {\n const value = this.entries.get(key);\n\n if (value !== undefined) {\n this.entries.delete(key);\n this.entries.set(key, value);\n }\n\n return value;\n }\n\n /** Whether a key is kept, without using it */\n has(key: K): boolean {\n return this.entries.has(key);\n }\n\n /** Adds or replaces a value, the most recently used; drops the least recent ones past the capacity */\n set(key: K, value: V): void {\n this.entries.delete(key);\n this.entries.set(key, value);\n for (const [oldest, old] of this.entries) {\n if (this.entries.size <= this.capacity) break;\n this.entries.delete(oldest);\n this.evict?.(old, oldest);\n }\n }\n\n delete(key: K): boolean {\n return this.entries.delete(key);\n }\n\n /** The values, least recently used first */\n values(): IterableIterator<V> {\n return this.entries.values();\n }\n\n clear(): void {\n this.entries.clear();\n }\n}\n",
9
+ "/**\n * PMTiles v3 archives: one file of tiles read by HTTP range requests (or from a `Blob`), as Protomaps publishes them.\n * The header and root directory in one request, the leaf directories as needed (kept in a small cache), each tile in\n * its own range; gzip through `DecompressionStream`. The same reader in the page (raster tiles) and in the basemap\n * workers (vector tiles of a style source `pmtiles://…`, as MapLibre's protocol names them).\n */\n\nimport { withHeaders } from '../engine/requests.ts';\nimport { isRecord } from '../util/guards.ts';\nimport { Lru } from '../util/lru.ts';\n\n/** What a PMTiles archive's tiles are */\nexport type PmtilesTileType = 'unknown' | 'mvt' | 'png' | 'jpeg' | 'webp' | 'avif';\n\n/** The header of a PMTiles archive (v3) */\nexport interface PmtilesHeader {\n rootDirectoryOffset: number;\n rootDirectoryLength: number;\n metadataOffset: number;\n metadataLength: number;\n leafDirectoryOffset: number;\n leafDirectoryLength: number;\n tileDataOffset: number;\n tileDataLength: number;\n /** 1 none, 2 gzip, 3 brotli, 4 zstd (only none and gzip are read) */\n internalCompression: number;\n tileCompression: number;\n tileType: PmtilesTileType;\n minZoom: number;\n maxZoom: number;\n /** `[west, south, east, north]`, degrees */\n bounds: [number, number, number, number];\n center: [lon: number, lat: number, zoom: number];\n}\n\n/** An entry of a directory: a run of tiles (`runLength` > 0) or a leaf directory (0) */\nexport interface PmtilesEntry {\n tileId: number;\n offset: number;\n length: number;\n runLength: number;\n}\n\nconst HEADER = 127;\n/** The header and the root directory lie within the first 16 KB of the file */\nconst FIRST = 16384;\nconst TYPES: PmtilesTileType[] = ['unknown', 'mvt', 'png', 'jpeg', 'webp', 'avif'];\n\n/** Tiles before level z: (4^z - 1) / 3 */\nconst levelStart = (z: number) => (4 ** z - 1) / 3;\n\n/** The tile id of z/x/y: the tiles of the lower levels, then the position along the level's Hilbert curve */\nexport const zxyToTileId = (z: number, x: number, y: number): number => {\n if (z > 26) throw new Error(`isard: PMTiles level ${z} past 26`);\n\n const n = 2 ** z;\n\n if (x < 0 || y < 0 || x >= n || y >= n) throw new Error(`isard: PMTiles tile ${z}/${x}/${y} out of its level`);\n\n let [px, py] = [x, y];\n let d = 0;\n\n for (let s = n / 2; s >= 1; s /= 2) {\n const rx = (px & s) > 0 ? 1 : 0;\n const ry = (py & s) > 0 ? 1 : 0;\n\n d += s * s * ((3 * rx) ^ ry);\n if (ry === 0) {\n if (rx === 1) [px, py] = [s - 1 - px, s - 1 - py];\n [px, py] = [py, px];\n }\n }\n\n return levelStart(z) + d;\n};\n\n/** The z/x/y of a tile id (the inverse of `zxyToTileId`) */\nexport const tileIdToZxy = (id: number): [z: number, x: number, y: number] => {\n let z = 0;\n\n while (levelStart(z + 1) <= id) z += 1;\n\n const n = 2 ** z;\n let t = id - levelStart(z);\n let [x, y] = [0, 0];\n\n for (let s = 1; s < n; s *= 2) {\n // Arithmetic, not bitwise: positions pass 32 bits past level 16\n const rx = Math.floor(t / 2) % 2;\n const ry = (t % 2) ^ rx;\n\n if (ry === 0) {\n if (rx === 1) [x, y] = [s - 1 - x, s - 1 - y];\n [x, y] = [y, x];\n }\n x += s * rx;\n y += s * ry;\n t = Math.floor(t / 4);\n }\n\n return [z, x, y];\n};\n\n/** A reader of unsigned varints past 32 bits (tile ids reach 2^52) */\nclass Varints {\n pos = 0;\n constructor(private readonly bytes: Uint8Array) {}\n next(): number {\n let value = 0;\n let scale = 1;\n\n for (;;) {\n const b = this.bytes[this.pos++];\n\n if (b === undefined) throw new Error('isard: PMTiles directory truncated');\n value += (b & 0x7f) * scale;\n if (b < 0x80) return value;\n scale *= 128;\n if (scale > 2 ** 63) throw new Error('isard: PMTiles varint too long');\n }\n }\n}\n\n/** The entries of a directory (decompressed) */\nexport const parseDirectory = (bytes: Uint8Array): PmtilesEntry[] => {\n const v = new Varints(bytes);\n const count = v.next();\n\n if (count > bytes.length) throw new Error('isard: PMTiles directory larger than its bytes');\n\n const entries: PmtilesEntry[] = [];\n let id = 0;\n\n for (let i = 0; i < count; i += 1) {\n id += v.next();\n entries.push({ tileId: id, offset: 0, length: 0, runLength: 1 });\n }\n for (const e of entries) e.runLength = v.next();\n for (const e of entries) e.length = v.next();\n entries.forEach((e, i) => {\n const value = v.next();\n const previous = entries[i - 1];\n\n // 0 after the first: right after the previous entry's bytes\n e.offset = value === 0 && previous ? previous.offset + previous.length : value - 1;\n });\n\n return entries;\n};\n\n/** The entry holding a tile id: its run of tiles, or the leaf directory it falls in; undefined if none */\nexport const findEntry = (entries: readonly PmtilesEntry[], id: number): PmtilesEntry | undefined => {\n let [lo, hi] = [0, entries.length - 1];\n\n while (lo <= hi) {\n const mid = (lo + hi) >> 1;\n const e = entries[mid];\n\n if (!e) break;\n if (e.tileId === id) return e;\n if (e.tileId < id) lo = mid + 1;\n else hi = mid - 1;\n }\n\n const e = entries[hi];\n\n if (!e) return undefined;\n if (e.runLength === 0 || id - e.tileId < e.runLength) return e;\n\n return undefined;\n};\n\n/** The header of an archive from its first bytes */\nexport const parseHeader = (bytes: Uint8Array): PmtilesHeader => {\n if (bytes.length < HEADER || String.fromCharCode(...bytes.subarray(0, 7)) !== 'PMTiles') {\n throw new Error('isard: not a PMTiles archive');\n }\n if (bytes[7] !== 3) throw new Error(`isard: PMTiles version ${bytes[7]} (only 3 is read)`);\n\n const view = new DataView(bytes.buffer, bytes.byteOffset, bytes.byteLength);\n const u64 = (at: number) => Number(view.getBigUint64(at, true));\n const deg = (at: number) => view.getInt32(at, true) / 1e7;\n\n return {\n rootDirectoryOffset: u64(8),\n rootDirectoryLength: u64(16),\n metadataOffset: u64(24),\n metadataLength: u64(32),\n leafDirectoryOffset: u64(40),\n leafDirectoryLength: u64(48),\n tileDataOffset: u64(56),\n tileDataLength: u64(64),\n internalCompression: view.getUint8(97),\n tileCompression: view.getUint8(98),\n tileType: TYPES[view.getUint8(99)] ?? 'unknown',\n minZoom: view.getUint8(100),\n maxZoom: view.getUint8(101),\n bounds: [deg(102), deg(106), deg(110), deg(114)],\n center: [deg(119), deg(123), view.getUint8(118)],\n };\n};\n\n/** Bytes as they are stored, decompressed (1: none, 2: gzip; 0, unknown, is read as none) */\nexport const decompress = async (\n bytes: Uint8Array<ArrayBuffer>,\n compression: number,\n): Promise<Uint8Array<ArrayBuffer>> => {\n if (compression === 0 || compression === 1) return bytes;\n if (compression !== 2) {\n throw new Error(`isard: PMTiles compression ${compression === 3 ? 'brotli' : 'zstd'} is not read (gzip only)`);\n }\n\n const stream = new Blob([bytes]).stream().pipeThrough(new DecompressionStream('gzip'));\n\n return new Uint8Array(await new Response(stream).arrayBuffer());\n};\n\n/** Past this, a whole file sent for a range request (a server ignoring ranges) is an error rather than kept */\nconst WHOLE_FILE_MAX = 64 * 1024 * 1024;\n\n/** A PMTiles archive at a URL (range requests) or in a `Blob` (a dropped file) */\nexport class PMTiles {\n private head: Promise<{ header: PmtilesHeader; root: PmtilesEntry[] }> | undefined;\n /** The leaf directories read, by offset */\n private readonly leaves = new Lru<number, Promise<PmtilesEntry[]>>(64);\n /** The whole file, when the server answered a range request with it (small files, `blob:` URLs) */\n private whole: Promise<Uint8Array<ArrayBuffer>> | undefined;\n\n constructor(readonly source: string | Blob) {}\n\n /** `length` bytes from `offset` */\n private async range(offset: number, length: number, signal?: AbortSignal): Promise<Uint8Array<ArrayBuffer>> {\n if (typeof this.source !== 'string') {\n return new Uint8Array(await this.source.slice(offset, offset + length).arrayBuffer());\n }\n if (this.whole) return (await this.whole).subarray(offset, offset + length);\n\n const response = await fetch(\n this.source,\n withHeaders(this.source, {\n headers: { Range: `bytes=${offset}-${offset + Math.max(length, 1) - 1}` },\n ...(signal ? { signal } : {}),\n }),\n );\n\n if (!response.ok) throw new Error(`${this.source}: HTTP ${response.status}`);\n if (response.status === 206) return new Uint8Array(await response.arrayBuffer());\n\n // The whole file: kept, when small enough, for the next ranges\n const size = Number(response.headers.get('Content-Length'));\n\n if (size > WHOLE_FILE_MAX) {\n await response.body?.cancel();\n throw new Error(`${this.source}: the server ignores range requests (HTTP 206 expected)`);\n }\n\n const whole = response.arrayBuffer().then((b) => new Uint8Array(b));\n\n this.whole = whole;\n whole.catch(() => {\n this.whole = undefined;\n });\n\n return (await whole).subarray(offset, offset + length);\n }\n\n private load() {\n this.head ??= (async () => {\n const first = await this.range(0, FIRST);\n const header = parseHeader(first);\n const { rootDirectoryOffset: o, rootDirectoryLength: n } = header;\n const raw = o + n <= first.length ? first.subarray(o, o + n) : await this.range(o, n);\n const root = parseDirectory(await decompress(raw, header.internalCompression));\n\n return { header, root };\n })();\n // A failure is not kept: asked again next time\n this.head.catch(() => {\n this.head = undefined;\n });\n\n return this.head;\n }\n\n /** The archive's header */\n async header(): Promise<PmtilesHeader> {\n return (await this.load()).header;\n }\n\n /** The archive's JSON metadata (`vector_layers`, `attribution`, `name`…); `{}` if it has none */\n async metadata(): Promise<Record<string, unknown>> {\n const { header } = await this.load();\n\n if (header.metadataLength === 0) return {};\n\n const raw = await this.range(header.metadataOffset, header.metadataLength);\n const text = new TextDecoder().decode(await decompress(raw, header.internalCompression));\n const value: unknown = JSON.parse(text);\n\n return isRecord(value) ? value : {};\n }\n\n private leaf(header: PmtilesHeader, entry: PmtilesEntry): Promise<PmtilesEntry[]> {\n const offset = header.leafDirectoryOffset + entry.offset;\n const cached = this.leaves.get(offset);\n\n if (cached) return cached;\n\n const leaf = this.range(offset, entry.length).then(async (raw) =>\n parseDirectory(await decompress(raw, header.internalCompression)),\n );\n\n leaf.catch(() => this.leaves.delete(offset));\n this.leaves.set(offset, leaf);\n\n return leaf;\n }\n\n /** The bytes of tile z/x/y, decompressed (a vector tile ungzipped); undefined where the archive has none */\n async tile(z: number, x: number, y: number, signal?: AbortSignal): Promise<Uint8Array<ArrayBuffer> | undefined> {\n const { header, root } = await this.load();\n\n if (z < header.minZoom || z > header.maxZoom) return undefined;\n\n const id = zxyToTileId(z, x, y);\n let entries = root;\n\n // The root, then at most three levels of leaves\n for (let depth = 0; depth < 4; depth += 1) {\n const entry = findEntry(entries, id);\n\n if (!entry) return undefined;\n if (entry.runLength > 0) {\n const raw = await this.range(header.tileDataOffset + entry.offset, entry.length, signal);\n\n return decompress(raw, header.tileCompression);\n }\n entries = await this.leaf(header, entry);\n }\n throw new Error('isard: PMTiles directories nested too deep');\n }\n}\n\n/** The archives opened, by URL: one reader (and its directory cache) per archive in a page or worker */\nconst archives = new Lru<string, PMTiles>(16);\n\n/** The reader of an archive URL (without `pmtiles://`), shared */\nexport const pmtiles = (url: string): PMTiles => {\n const cached = archives.get(url);\n\n if (cached) return cached;\n\n const archive = new PMTiles(url);\n\n archives.set(url, archive);\n\n return archive;\n};\n\n/** The URL of the page (or of the worker); undefined out of a browser */\nconst pageUrl = (): string | undefined => {\n const location: unknown = Reflect.get(globalThis, 'location');\n\n return isRecord(location) && typeof location.href === 'string' ? location.href : undefined;\n};\n\n/** The archive URL of a `pmtiles://` URL, absolute (relative to the page), or undefined for another URL */\nexport const pmtilesUrl = (url: string, base?: string): string | undefined => {\n if (!url.startsWith('pmtiles://')) return undefined;\n\n const inner = url.slice('pmtiles://'.length);\n const from = base ?? pageUrl();\n\n try {\n return from ? new URL(inner, from).href : inner;\n } catch {\n return inner;\n }\n};\n\n/** A tile URL `pmtiles://<archive>/{z}/{x}/{y}` (with its numbers in) read from its archive: its bytes, undefined\n * where there is none; undefined too (`false`) for a URL that is not one */\nexport const pmtilesTile = (\n url: string,\n signal?: AbortSignal,\n): Promise<Uint8Array<ArrayBuffer> | undefined> | false => {\n const match = /^pmtiles:\\/\\/(.+)\\/(\\d+)\\/(\\d+)\\/(\\d+)$/.exec(url);\n\n if (!match) return false;\n\n const [, archive = '', z, x, y] = match;\n\n return pmtiles(archive).tile(Number(z), Number(x), Number(y), signal);\n};\n",
10
+ "/**\n * Raster reprojection, the drawing half: a Web Mercator tile drawn from the source images it spans (tiles of another\n * grid, or one image of a WMS), in a worker of the map (OffscreenCanvas) or in the page when the map has no workers.\n * The page plans each tile (`grid.ts`): which images, where they go in a mosaic, and a mesh of control points giving,\n * for the corners of 16 × 16 cells of the tile, the mosaic pixel under them. Here the images are fetched (kept for the\n * neighbouring tiles), drawn into the mosaic, and every pixel of the tile sampled from it, its source position\n * interpolated within its cell (bilinear), its color between the four nearest source pixels (bilinear, alpha\n * premultiplied). This code knows no projection.\n */\n\nimport { withHeaders } from '../engine/requests.ts';\nimport { Lru } from '../util/lru.ts';\n\n/** Source images kept decoded (by the page, or shared by the workers of a pool): the neighbours of a tile share them */\nexport const SOURCE_CACHE = 96;\n\n/** A source image and the rectangle of the mosaic it covers (pixels) */\nexport interface Placed {\n url: string;\n x: number;\n y: number;\n w: number;\n h: number;\n}\n\n/** How to draw a Mercator tile of `size` pixels: the mosaic of the source images, and the mesh of `n` × `n` cells\n * ((n + 1)² points, rows from the north, x then y): the mosaic position of each corner, NaN where the source CRS has\n * none */\nexport interface Job {\n size: number;\n width: number;\n height: number;\n sources: Placed[];\n n: number;\n mesh: Float32Array;\n}\n\n/**\n * Samples the pixels of a `size` × `size` tile (RGBA, straight alpha) from a mosaic of `width` × `height` (RGBA,\n * straight alpha) through the mesh of a job. Pixels whose position falls outside the mosaic, or on a NaN, stay\n * transparent; the mosaic's edge fades over half a pixel\n */\nexport const resample = (\n source: Uint8ClampedArray,\n width: number,\n height: number,\n mesh: Float32Array,\n n: number,\n size: number,\n): Uint8ClampedArray<ArrayBuffer> => {\n const out = new Uint8ClampedArray(size * size * 4);\n const cell = size / n;\n const stride = n + 1;\n\n for (let row = 0; row < size; row += 1) {\n const fy = (row + 0.5) / cell;\n const j = Math.min(n - 1, Math.floor(fy));\n const ty = fy - j;\n\n for (let col = 0; col < size; col += 1) {\n const fx = (col + 0.5) / cell;\n const i = Math.min(n - 1, Math.floor(fx));\n const tx = fx - i;\n const a = 2 * (j * stride + i);\n const b = a + 2 * stride;\n // The corners of the cell, then the position in it\n const w00 = (1 - tx) * (1 - ty);\n const w10 = tx * (1 - ty);\n const w01 = (1 - tx) * ty;\n const w11 = tx * ty;\n const u =\n w00 * (mesh[a] as number) +\n w10 * (mesh[a + 2] as number) +\n w01 * (mesh[b] as number) +\n w11 * (mesh[b + 2] as number);\n const v =\n w00 * (mesh[a + 1] as number) +\n w10 * (mesh[a + 3] as number) +\n w01 * (mesh[b + 1] as number) +\n w11 * (mesh[b + 3] as number);\n // Pixel centers at half pixels: the four around (u, v)\n const sx = u - 0.5;\n const sy = v - 0.5;\n\n if (!(sx > -1 && sy > -1 && sx < width && sy < height)) continue;\n\n const x0 = Math.floor(sx);\n const y0 = Math.floor(sy);\n const kx = sx - x0;\n const ky = sy - y0;\n let r = 0;\n let g = 0;\n let bl = 0;\n let alpha = 0;\n\n for (let k = 0; k < 4; k += 1) {\n const x = x0 + (k & 1);\n const y = y0 + (k >> 1);\n\n if (x < 0 || y < 0 || x >= width || y >= height) continue;\n\n const p = 4 * (y * width + x);\n const wa = (k & 1 ? kx : 1 - kx) * (k >> 1 ? ky : 1 - ky) * (source[p + 3] as number);\n\n r += wa * (source[p] as number);\n g += wa * (source[p + 1] as number);\n bl += wa * (source[p + 2] as number);\n alpha += wa;\n }\n if (alpha <= 0) continue;\n\n const q = 4 * (row * size + col);\n\n out[q] = r / alpha;\n out[q + 1] = g / alpha;\n out[q + 2] = bl / alpha;\n out[q + 3] = alpha;\n }\n }\n\n return out;\n};\n\n/** Draws a planned tile: its image, null where the source has nothing; rejects on errors */\nexport type DrawJob = (job: Job, signal: AbortSignal) => Promise<ImageBitmap | null>;\n\n/**\n * Draws planned tiles, keeping `cached` source images decoded. A missing source image (404, 204, 410) leaves its part\n * empty; a tile with no source at all is missing; other errors reject (retried by the engine). In the page, or in a\n * worker of the map (`close` frees the images kept)\n */\nexport const resampler = (cached = SOURCE_CACHE): { draw: DrawJob; close: () => void; cache: { capacity: number } } => {\n type Image = Promise<ImageBitmap | null>;\n\n /** Tiles being drawn from each source image: an evicted one is closed once none is */\n const users = new Map<Image, number>();\n const evicted = new Set<Image>();\n const close = (image: Image) => {\n evicted.delete(image);\n image.then(\n (bitmap) => bitmap?.close(),\n () => undefined,\n );\n };\n /** Freed now, or once the tiles drawing from it are done */\n const drop = (image: Image) => {\n if (users.has(image)) evicted.add(image);\n else close(image);\n };\n // Source images by URL: a request is shared by the tiles that need it, its signal is not theirs\n const cache = new Lru<string, Image>(cached, drop);\n const release = (image: Image) => {\n const count = (users.get(image) ?? 1) - 1;\n\n if (count > 0) users.set(image, count);\n else {\n users.delete(image);\n if (evicted.has(image)) close(image);\n }\n };\n const fetchImage = (url: string): Image => {\n const load = (): Image => {\n const loading = (async () => {\n const response = await fetch(url, withHeaders(url));\n\n if (response.status === 404 || response.status === 204 || response.status === 410) return null;\n if (!response.ok) throw new Error(`isard: ${response.status} for a raster to reproject`);\n\n return createImageBitmap(await response.blob());\n })();\n\n // A failure is not kept: the engine's retry fetches again\n loading.catch(() => cache.delete(url));\n cache.set(url, loading);\n\n return loading;\n };\n const image = cache.get(url) ?? load();\n\n users.set(image, (users.get(image) ?? 0) + 1);\n\n return image;\n };\n const draw: DrawJob = async (job, signal) => {\n const pending = job.sources.map((s) => [s, fetchImage(s.url)] as const);\n\n try {\n const images = await Promise.all(pending.map(async ([s, image]) => [s, await image] as const));\n\n signal.throwIfAborted();\n if (!images.some(([, image]) => image)) return null;\n\n const canvas = new OffscreenCanvas(job.width, job.height);\n const context = canvas.getContext('2d', { willReadFrequently: true });\n\n if (!context) throw new Error('isard: no 2D canvas to reproject the tiles');\n images.forEach(([s, image]) => {\n if (image) context.drawImage(image, s.x, s.y, s.w, s.h);\n });\n\n const mosaic = context.getImageData(0, 0, job.width, job.height).data;\n const pixels = resample(mosaic, job.width, job.height, job.mesh, job.n, job.size);\n\n return createImageBitmap(new ImageData(pixels, job.size, job.size), { premultiplyAlpha: 'none' });\n } finally {\n pending.forEach(([, image]) => {\n release(image);\n });\n }\n };\n\n return {\n draw,\n cache,\n close: () => {\n [...cache.values()].forEach(drop);\n cache.clear();\n },\n };\n};\n",
11
+ "/**\n * Altitudes encoded in the colors of PNG tiles, for the relief: Terrarium (Mapzen, the Terrain Tiles of AWS) and\n * Terrain-RGB (Mapbox, MapTiler). The engine reads raw floats only; a loader gives it the altitudes of each tile,\n * decoded in a worker of the map's pool (OffscreenCanvas), or in the page when the map has no workers.\n */\nimport { withHeaders } from '../engine/requests.ts';\n\n/** The encodings of altitudes in the colors of PNG tiles */\nexport type PngEncoding = 'terrarium' | 'mapbox';\n\nconst SIZE = 256;\n\n/** Altitudes (metres, rows from the north) of RGBA pixels in an encoding; below `floor` raised to it */\nexport const decodeHeights = (\n rgba: Uint8ClampedArray | Uint8Array,\n encoding: PngEncoding,\n floor = Number.NEGATIVE_INFINITY,\n): Float32Array => {\n const n = rgba.length >> 2;\n const out = new Float32Array(n);\n\n // A loop per encoding, without allocations: 65 536 pixels a tile\n if (encoding === 'terrarium') {\n for (let i = 0, j = 0; i < n; i += 1, j += 4) {\n const h = (rgba[j] as number) * 256 + (rgba[j + 1] as number) + (rgba[j + 2] as number) / 256 - 32768;\n\n out[i] = h > floor ? h : floor;\n }\n } else {\n for (let i = 0, j = 0; i < n; i += 1, j += 4) {\n const h = -10000 + ((rgba[j] as number) * 65536 + (rgba[j + 1] as number) * 256 + (rgba[j + 2] as number)) * 0.1;\n\n out[i] = h > floor ? h : floor;\n }\n }\n\n return out;\n};\n\n/** Where the tiles are drawn and read back, made on first use and kept (each tile drawn and read at once) */\nexport interface Surface {\n canvas?: OffscreenCanvas;\n}\n\n/**\n * The altitudes of the PNG tile at `url`: 256 × 256, null where the server has no tile; a network or server error\n * rejects (the engine retries). Where it runs: in a worker of the map, or in the page without workers\n */\nexport const fetchHeights = async (\n url: string,\n encoding: PngEncoding,\n floor: number | undefined,\n signal: AbortSignal,\n surface: Surface,\n): Promise<Float32Array | null> => {\n const response = await fetch(url, withHeaders(url, { signal }));\n\n if (response.status === 404 || response.status === 204 || response.status === 410) return null;\n if (!response.ok) throw new Error(`${response.url}: ${response.status}`);\n\n // The colors as stored: no color management, no premultiplied alpha\n const bitmap = await createImageBitmap(await response.blob(), {\n premultiplyAlpha: 'none',\n colorSpaceConversion: 'none',\n });\n\n try {\n surface.canvas ??= new OffscreenCanvas(SIZE, SIZE);\n\n const g = surface.canvas.getContext('2d', { willReadFrequently: true });\n\n if (!g) throw new Error('no 2D context');\n // Another size is resampled to the nearest pixel: an interpolated color is no altitude\n g.imageSmoothingEnabled = false;\n g.clearRect(0, 0, SIZE, SIZE);\n g.drawImage(bitmap, 0, 0, SIZE, SIZE);\n\n return decodeHeights(g.getImageData(0, 0, SIZE, SIZE).data, encoding, floor);\n } finally {\n bitmap.close();\n }\n};\n\n/** `fetchHeights` run in a worker for tile `z`/`x`/`y`; undefined when the map has no workers (run in the page) */\nexport type RemoteHeights = (\n url: string,\n encoding: PngEncoding,\n floor: number | undefined,\n tile: [z: number, x: number, y: number],\n signal: AbortSignal,\n) => Promise<Float32Array | null> | undefined;\n\n/**\n * A loader of the engine's relief for PNG tiles of `url` ({z}, {x}, {y}) in an encoding: 256 × 256 altitudes, null\n * where the server has no tile; a network or server error rejects (retried). `floor`: the lowest altitude kept (the\n * sea floor of a worldwide model flattened at sea level). `remote`: decodes in a worker when it can\n */\nexport const encodedTerrainLoader = (\n url: string,\n encoding: PngEncoding,\n floor?: number,\n remote?: RemoteHeights,\n): ((z: number, x: number, y: number, signal: AbortSignal) => Promise<Float32Array | null>) => {\n const surface: Surface = {};\n\n return (z, x, y, signal) => {\n const tile = url.replaceAll('{z}', String(z)).replaceAll('{x}', String(x)).replaceAll('{y}', String(y));\n\n return remote?.(tile, encoding, floor, [z, x, y], signal) ?? fetchHeights(tile, encoding, floor, signal, surface);\n };\n};\n",
12
+ "/**\n * CSS colors to RGBA 0-1: `#rgb`, `#rgba`, `#rrggbb`, `#rrggbbaa`, `rgb()` and `rgba()`, `hsl()` and `hsla()` (comma\n * or space syntax, `/` before the alpha, percentages), the CSS named colors and `transparent`. No DOM: the workers use\n * it too.\n */\n\nexport type Rgba = [r: number, g: number, b: number, a: number];\n\n/** The CSS named colors, as name and `rrggbb` pairs */\nconst NAMES =\n 'aliceblue f0f8ff antiquewhite faebd7 aqua 00ffff aquamarine 7fffd4 azure f0ffff beige f5f5dc bisque ffe4c4 ' +\n 'black 000000 blanchedalmond ffebcd blue 0000ff blueviolet 8a2be2 brown a52a2a burlywood deb887 cadetblue 5f9ea0 ' +\n 'chartreuse 7fff00 chocolate d2691e coral ff7f50 cornflowerblue 6495ed cornsilk fff8dc crimson dc143c ' +\n 'cyan 00ffff darkblue 00008b darkcyan 008b8b darkgoldenrod b8860b darkgray a9a9a9 darkgreen 006400 ' +\n 'darkgrey a9a9a9 darkkhaki bdb76b darkmagenta 8b008b darkolivegreen 556b2f darkorange ff8c00 darkorchid 9932cc ' +\n 'darkred 8b0000 darksalmon e9967a darkseagreen 8fbc8f darkslateblue 483d8b darkslategray 2f4f4f ' +\n 'darkslategrey 2f4f4f darkturquoise 00ced1 darkviolet 9400d3 deeppink ff1493 deepskyblue 00bfff dimgray 696969 ' +\n 'dimgrey 696969 dodgerblue 1e90ff firebrick b22222 floralwhite fffaf0 forestgreen 228b22 fuchsia ff00ff ' +\n 'gainsboro dcdcdc ghostwhite f8f8ff gold ffd700 goldenrod daa520 gray 808080 green 008000 greenyellow adff2f ' +\n 'grey 808080 honeydew f0fff0 hotpink ff69b4 indianred cd5c5c indigo 4b0082 ivory fffff0 khaki f0e68c ' +\n 'lavender e6e6fa lavenderblush fff0f5 lawngreen 7cfc00 lemonchiffon fffacd lightblue add8e6 lightcoral f08080 ' +\n 'lightcyan e0ffff lightgoldenrodyellow fafad2 lightgray d3d3d3 lightgreen 90ee90 lightgrey d3d3d3 ' +\n 'lightpink ffb6c1 lightsalmon ffa07a lightseagreen 20b2aa lightskyblue 87cefa lightslategray 778899 ' +\n 'lightslategrey 778899 lightsteelblue b0c4de lightyellow ffffe0 lime 00ff00 limegreen 32cd32 linen faf0e6 ' +\n 'magenta ff00ff maroon 800000 mediumaquamarine 66cdaa mediumblue 0000cd mediumorchid ba55d3 ' +\n 'mediumpurple 9370db mediumseagreen 3cb371 mediumslateblue 7b68ee mediumspringgreen 00fa9a ' +\n 'mediumturquoise 48d1cc mediumvioletred c71585 midnightblue 191970 mintcream f5fffa mistyrose ffe4e1 ' +\n 'moccasin ffe4b5 navajowhite ffdead navy 000080 oldlace fdf5e6 olive 808000 olivedrab 6b8e23 orange ffa500 ' +\n 'orangered ff4500 orchid da70d6 palegoldenrod eee8aa palegreen 98fb98 paleturquoise afeeee ' +\n 'palevioletred db7093 papayawhip ffefd5 peachpuff ffdab9 peru cd853f pink ffc0cb plum dda0dd ' +\n 'powderblue b0e0e6 purple 800080 rebeccapurple 663399 red ff0000 rosybrown bc8f8f royalblue 4169e1 ' +\n 'saddlebrown 8b4513 salmon fa8072 sandybrown f4a460 seagreen 2e8b57 seashell fff5ee sienna a0522d ' +\n 'silver c0c0c0 skyblue 87ceeb slateblue 6a5acd slategray 708090 slategrey 708090 snow fffafa ' +\n 'springgreen 00ff7f steelblue 4682b4 tan d2b48c teal 008080 thistle d8bfd8 tomato ff6347 turquoise 40e0d0 ' +\n 'violet ee82ee wheat f5deb3 white ffffff whitesmoke f5f5f5 yellow ffff00 yellowgreen 9acd32';\n\nlet named: Map<string, string> | undefined;\n\nconst namedHex = (name: string): string | undefined => {\n if (!named) {\n const words = NAMES.split(' ');\n\n named = new Map(\n Array.from({ length: Math.floor(words.length / 2) }, (_, i) => [words[2 * i] ?? '', words[2 * i + 1] ?? '']),\n );\n }\n\n return named.get(name);\n};\n\nconst clamp = (v: number) => (Number.isFinite(v) ? Math.max(0, Math.min(1, v)) : 0);\n\nconst hex = (digits: string): Rgba | undefined => {\n if (!/^[0-9a-f]+$/.test(digits) || ![3, 4, 6, 8].includes(digits.length)) return undefined;\n\n const full = digits.length <= 4 ? [...digits].map((h) => h + h).join('') : digits;\n const v = (i: number) => Number.parseInt(full.slice(i, i + 2), 16) / 255;\n\n return [v(0), v(2), v(4), full.length === 8 ? v(6) : 1];\n};\n\n/** An alpha: a number from 0 to 1 or a percentage */\nconst alpha = (p: string | undefined): number => {\n if (p === undefined) return 1;\n\n return clamp(p.endsWith('%') ? Number.parseFloat(p) / 100 : Number.parseFloat(p));\n};\n\nconst hsl = (h: number, s: number, l: number): [number, number, number] => {\n const q = l < 0.5 ? l * (1 + s) : l + s - l * s;\n const p = 2 * l - q;\n const hue = (t: number) => {\n const u = ((t % 1) + 1) % 1;\n\n if (u < 1 / 6) return p + (q - p) * 6 * u;\n if (u < 1 / 2) return q;\n if (u < 2 / 3) return p + (q - p) * (2 / 3 - u) * 6;\n\n return p;\n };\n\n return [hue(h + 1 / 3), hue(h), hue(h - 1 / 3)];\n};\n\n/** A CSS color to RGBA 0-1; undefined if it is not one */\nexport const parseCssColor = (value: unknown): Rgba | undefined => {\n if (typeof value !== 'string') return undefined;\n\n const c = value.trim().toLowerCase();\n\n if (c.startsWith('#')) return hex(c.slice(1));\n if (c === 'transparent') return [0, 0, 0, 0];\n\n const name = namedHex(c);\n\n if (name) return hex(name);\n\n const match = /^(rgba?|hsla?)\\(([^)]*)\\)$/.exec(c);\n\n if (!match?.[1] || match[2] === undefined) return undefined;\n\n const parts = match[2].split(/[\\s,/]+/).filter(Boolean);\n\n if (parts.length < 3 || parts.slice(0, 3).some((p) => Number.isNaN(Number.parseFloat(p)))) return undefined;\n\n const a = alpha(parts[3]);\n\n if (match[1].startsWith('rgb')) {\n const channel = (p: string) => clamp(p.endsWith('%') ? Number.parseFloat(p) / 100 : Number.parseFloat(p) / 255);\n\n return [channel(parts[0] ?? ''), channel(parts[1] ?? ''), channel(parts[2] ?? ''), a];\n }\n\n const h = Number.parseFloat(parts[0] ?? '') / 360;\n const [r, g, b] = hsl(\n h,\n clamp(Number.parseFloat(parts[1] ?? '') / 100),\n clamp(Number.parseFloat(parts[2] ?? '') / 100),\n );\n\n return [r, g, b, a];\n};\n",
13
+ "/**\n * The parts of the MapLibre style specification a vector basemap needs, evaluated on the page: filters (legacy\n * `[\"==\", \"key\", value]` forms and expressions), property values given as constants, legacy functions (`{ stops }`\n * of zoom or of a property: exponential, interval, categorical, identity) or expressions (`get`, `has`, `concat`,\n * `interpolate`, `step`, `match`, `case`, `coalesce`, comparisons, `all`, `any`, `!`, `in`, `zoom`, arithmetic,\n * `format`, conversions and assertions, `upcase`, `downcase`, `literal`…; others give null, with a warning), colors\n * interpolated in RGBA, `{token}` text fields.\n */\nimport { parseCssColor } from '../util/color.ts';\nimport { isRecord } from '../util/guards.ts';\nimport type { TileFeature, Value } from './mvt.ts';\n\nexport type Json = null | boolean | number | string | Json[] | { [key: string]: Json };\n\nexport interface StyleLayer {\n id: string;\n type: string;\n source?: string;\n 'source-layer'?: string;\n minzoom?: number;\n maxzoom?: number;\n filter?: Json;\n layout?: Record<string, Json>;\n paint?: Record<string, Json>;\n}\n\nexport interface Style {\n version: number;\n sources: Record<\n string,\n { type: string; tiles?: string[]; url?: string; maxzoom?: number; minzoom?: number; tileSize?: number }\n >;\n layers: StyleLayer[];\n glyphs?: string;\n /** One sprite's URL (without extension), or several with their ids (`id:name` names their images) */\n sprite?: string | { id: string; url: string }[];\n}\n\n/** A MapLibre style, as far as the basemap reads it: its sources and its layers (an id and a type each) */\nexport const isStyle = (value: unknown): value is Style =>\n isRecord(value) &&\n isRecord(value.sources) &&\n Object.values(value.sources).every((s) => isRecord(s) && typeof s.type === 'string') &&\n Array.isArray(value.layers) &&\n value.layers.every((l) => isRecord(l) && typeof l.id === 'string' && typeof l.type === 'string');\n\n/** A raster source of a style: its tile URL, its deepest level and the CSS pixels of its tiles (MapLibre's\n * `tileSize`: 512 by default) */\nexport interface RasterSource {\n tiles: string;\n maxzoom: number;\n tileSize: number;\n}\n\n/** How a label's text or icon meets the others (`*-allow-overlap` and `*-ignore-placement`, see `Overlap`) */\nexport type CandidateOverlap = boolean | 'allow' | 'ignore';\n\n/** The icon of a label, in style terms evaluated at the tile's zoom */\nexport interface CandidateIcon {\n /** Its image in the style's sprite */\n image: string;\n /** A number, or zoom stops */\n size: Json;\n anchor: string;\n offset: [number, number];\n rotate: number;\n /** `map` or `viewport` (`auto` resolved) */\n alignment: 'map' | 'viewport';\n overlap: CandidateOverlap;\n optional: boolean;\n fit: 'none' | 'width' | 'height' | 'both';\n padding: [number, number, number, number];\n color: string;\n opacity: number;\n}\n\n/** A label to shape and place, in style terms evaluated at the tile's zoom */\nexport interface LabelCandidate {\n /** Index of its style layer: higher ones are placed first */\n layer: number;\n /** Its text, empty for an icon alone */\n text: string;\n lon: number;\n lat: number;\n /** On a line: the direction there (degrees of longitude and latitude) */\n along?: [number, number];\n /** Its text runs along the line (`symbol-placement: line`, `text-rotation-alignment` not `viewport`) */\n textAlong?: boolean;\n textOptional?: boolean;\n icon?: CandidateIcon;\n font: string;\n size: Json;\n color: string;\n haloColor: string;\n haloWidth: number;\n anchor: string;\n offset: [number, number];\n maxWidth: number;\n lineHeight: number;\n overlap: CandidateOverlap;\n}\n\n/** What expressions see of a feature */\nexport interface Context {\n zoom: number;\n properties: Record<string, Value>;\n /** 'Point', 'LineString' or 'Polygon' */\n type: string;\n}\n\nconst TYPES = ['Unknown', 'Point', 'LineString', 'Polygon'];\n\nexport const context = (feature: TileFeature, zoom: number): Context => {\n return { zoom, properties: feature.properties, type: TYPES[feature.type] ?? 'Unknown' };\n};\n\n// ── Colors ──\n\n/** A color to RGBA 0-1, undefined if it is not one */\nexport const color = (value: unknown): [number, number, number, number] | undefined => {\n return parseCssColor(value);\n};\n\nexport const css = ([r, g, b, a]: [number, number, number, number]): string => {\n return `rgba(${Math.round(r * 255)},${Math.round(g * 255)},${Math.round(b * 255)},${a})`;\n};\n\n// ── Interpolation ──\n\n/** Factor between two stops: linear, or exponential of `base` */\nconst factor = (x: number, x0: number, x1: number, base = 1): number => {\n const d = x1 - x0;\n\n if (d === 0) return 0;\n\n const t = x - x0;\n\n return base === 1 ? t / d : (base ** t - 1) / (base ** d - 1);\n};\n\nconst mix = (a: unknown, b: unknown, t: number): unknown => {\n if (typeof a === 'number' && typeof b === 'number') return a + (b - a) * t;\n\n const ca = color(a);\n const cb = color(b);\n\n if (ca && cb) {\n const lerp = (i: 0 | 1 | 2 | 3) => ca[i] + (cb[i] - ca[i]) * t;\n\n return css([lerp(0), lerp(1), lerp(2), lerp(3)]);\n }\n if (Array.isArray(a) && Array.isArray(b)) return a.map((v, i) => mix(v, b[i], t));\n\n return t < 0.5 ? a : b;\n};\n\n// ── Legacy functions ──\n\ninterface LegacyFunction {\n stops: [Json, Json][];\n base?: number;\n type?: string;\n property?: string;\n default?: Json;\n}\n\nconst isFunction = (v: Json): v is { [key: string]: Json } & LegacyFunction => {\n return typeof v === 'object' && v !== null && !Array.isArray(v) && Array.isArray(v.stops);\n};\n\nconst legacy = (f: LegacyFunction, ctx: Context): unknown => {\n const input = f.property === undefined ? ctx.zoom : ctx.properties[f.property];\n const stops = f.stops;\n const type =\n f.type ?? (f.property === undefined || typeof stops[0]?.[0] === 'number' ? 'exponential' : 'categorical');\n\n if (type === 'identity') return input ?? f.default;\n if (type === 'categorical') return stops.find(([k]) => k === input)?.[1] ?? f.default;\n if (typeof input !== 'number' || !stops.length) return f.default ?? stops[0]?.[1];\n\n // Zoom-and-property stops ({ zoom, value } keys) are taken at their zoom only\n const key = ([k]: [Json, Json]) => {\n if (Array.isArray(k)) return Number.NaN;\n\n return isRecord(k) ? Number(k.zoom) : Number(k);\n };\n const first = stops[0];\n\n if (!first) return f.default;\n if (input <= key(first)) return first[1];\n\n const at = stops.findIndex((s1, i) => i > 0 && Boolean(stops[i - 1]) && Boolean(s1) && input < key(s1));\n const [s0, s1] = [stops[at - 1], stops[at]];\n\n if (at < 0 || !s0 || !s1) return stops.at(-1)?.[1];\n if (type === 'interval') return s0[1];\n\n return mix(s0[1], s1[1], factor(input, key(s0), key(s1), f.base ?? 1));\n};\n\n// ── Expressions ──\n\n/** A list of values to look a value up in (any value: `includes` compares with `===`) */\nconst labels = (values: readonly Json[]): readonly unknown[] => values;\n\ntype Comparison = '<' | '<=' | '>' | '>=';\n\nconst ORDERS: Record<Comparison, (a: number | string, b: number | string) => boolean> = {\n '<': (a, b) => a < b,\n '<=': (a, b) => a <= b,\n '>': (a, b) => a > b,\n '>=': (a, b) => a >= b,\n};\n\n/** A comparison of any two values the way JavaScript's operators make it: two strings (lists and objects as their\n * text) in text order, anything else as numbers */\nconst compare = (op: Comparison, a: unknown, b: unknown): boolean => {\n const text = (v: unknown) => (typeof v === 'object' && v !== null ? String(v) : v);\n const [x, y] = [text(a), text(b)];\n\n return typeof x === 'string' && typeof y === 'string' ? ORDERS[op](x, y) : ORDERS[op](Number(x), Number(y));\n};\n\nconst get = (ctx: Context, key: unknown): unknown => {\n if (key === '$type') return ctx.type;\n\n return typeof key === 'string' ? ctx.properties[key] : undefined;\n};\n\n/** The operators `evaluate` knows */\nconst OPERATORS = new Set([\n 'literal',\n 'zoom',\n 'get',\n 'has',\n '!has',\n 'properties',\n 'id',\n 'geometry-type',\n 'concat',\n 'format',\n 'image',\n 'number-format',\n 'to-number',\n 'to-string',\n 'to-boolean',\n 'to-color',\n 'number',\n 'string',\n 'boolean',\n 'typeof',\n 'length',\n 'at',\n 'upcase',\n 'downcase',\n 'coalesce',\n '!',\n 'all',\n 'any',\n '==',\n '!=',\n '<',\n '<=',\n '>',\n '>=',\n 'in',\n 'case',\n 'match',\n 'step',\n 'interpolate',\n 'interpolate-hcl',\n 'interpolate-lab',\n 'rgb',\n 'rgba',\n '+',\n '-',\n '*',\n '/',\n '%',\n '^',\n 'min',\n 'max',\n 'abs',\n 'round',\n 'floor',\n 'ceil',\n 'sqrt',\n 'ln',\n 'log10',\n 'log2',\n 'pi',\n 'e',\n]);\n\n/** Whether a value is an expression (an array starting with a known operator), not a literal array */\nexport const isExpression = (e: unknown): e is Json[] => {\n return Array.isArray(e) && typeof e[0] === 'string' && OPERATORS.has(e[0]);\n};\n\n/** Operators already warned about */\nconst warned = new Set<string>();\n\nconst str = (v: unknown) => (v === undefined || v === null ? '' : String(v));\n\nexport const evaluate = (e: Json, ctx: Context): unknown => {\n if (isFunction(e)) return legacy(e, ctx);\n if (!Array.isArray(e)) return e;\n\n const [op, ...args] = e;\n\n if (typeof op !== 'string') return e;\n\n const ev = (i: number) => evaluate(args[i] ?? null, ctx);\n const num = (i: number) => Number(ev(i));\n const nums = () => args.map((_, i) => num(i));\n\n switch (op) {\n case 'literal':\n return args[0];\n case 'zoom':\n return ctx.zoom;\n case 'get':\n return get(ctx, ev(0));\n case 'has':\n return get(ctx, ev(0)) !== undefined;\n case '!has':\n return get(ctx, ev(0)) === undefined;\n case 'properties':\n return ctx.properties;\n case 'id':\n return null;\n case 'geometry-type':\n return ctx.type;\n case 'concat':\n return args.map((_, i) => str(ev(i))).join('');\n case 'format':\n // Its text sections, the options of each (objects) left out\n return args.map((a, i) => (a !== null && typeof a === 'object' && !Array.isArray(a) ? '' : str(ev(i)))).join('');\n case 'image':\n return ev(0);\n case 'number-format': {\n const options = isRecord(args[1]) ? args[1] : {};\n const option = (key: string) => {\n const v = options[key];\n\n return typeof v === 'number' ? v : undefined;\n };\n const n = num(0);\n\n if (!Number.isFinite(n)) return '';\n\n return n.toLocaleString(typeof options.locale === 'string' ? options.locale : undefined, {\n minimumFractionDigits: option('min-fraction-digits'),\n maximumFractionDigits: option('max-fraction-digits'),\n });\n }\n case 'to-number': {\n for (let i = 0; i < args.length; i += 1) {\n const v = ev(i);\n const n = typeof v === 'string' && v.trim() === '' ? Number.NaN : Number(v);\n\n if (v !== null && v !== undefined && !Number.isNaN(n)) return n;\n }\n\n return 0;\n }\n case 'to-string':\n return str(ev(0));\n case 'to-boolean': {\n const v = ev(0);\n\n return !(v === '' || v === 0 || v === false || v === null || v === undefined || Number.isNaN(v));\n }\n case 'to-color':\n case 'number':\n case 'string':\n case 'boolean': {\n // Assertions: the first value of the type, else the last one\n const types: Record<string, (v: unknown) => boolean> = {\n 'to-color': (v) => color(v) !== undefined,\n number: (v) => typeof v === 'number',\n string: (v) => typeof v === 'string',\n boolean: (v) => typeof v === 'boolean',\n };\n\n for (let i = 0; i < args.length; i += 1) {\n const v = ev(i);\n\n if (types[op]?.(v)) return v;\n }\n\n return args.length ? ev(args.length - 1) : null;\n }\n case 'typeof': {\n const v = ev(0);\n\n if (v === null || v === undefined) return 'null';\n\n return Array.isArray(v) ? 'array' : typeof v;\n }\n case 'length': {\n const v = ev(0);\n\n return typeof v === 'string' || Array.isArray(v) ? v.length : 0;\n }\n case 'at': {\n const v = ev(1);\n\n return Array.isArray(v) ? (v[num(0)] ?? null) : null;\n }\n case 'upcase':\n return str(ev(0)).toUpperCase();\n case 'downcase':\n return str(ev(0)).toLowerCase();\n case 'coalesce':\n for (let i = 0; i < args.length; i += 1) {\n const v = ev(i);\n\n if (v !== undefined && v !== null) return v;\n }\n\n return null;\n case '!':\n return !ev(0);\n case 'all':\n return args.every((_, i) => Boolean(ev(i)));\n case 'any':\n return args.some((_, i) => Boolean(ev(i)));\n case '==':\n return ev(0) === ev(1);\n case '!=':\n return ev(0) !== ev(1);\n case '<':\n case '<=':\n case '>':\n case '>=':\n return compare(op, ev(0), ev(1));\n case 'in': {\n const haystack = ev(1);\n const needle = ev(0);\n\n if (typeof haystack === 'string') return haystack.includes(String(needle));\n\n return Array.isArray(haystack) && haystack.includes(needle);\n }\n case 'case': {\n const hit = args.findIndex((_, i) => i % 2 === 0 && i + 1 < args.length && Boolean(ev(i)));\n\n return hit < 0 ? ev(args.length - 1) : ev(hit + 1);\n }\n case 'match': {\n const input = ev(0);\n const hit = args.findIndex(\n (label, i) =>\n i % 2 === 1 &&\n i + 1 < args.length &&\n (Array.isArray(label) ? labels(label).includes(input) : label === input),\n );\n\n return hit < 0 ? ev(args.length - 1) : ev(hit + 1);\n }\n case 'step': {\n const input = num(0);\n let out = ev(1);\n\n for (let i = 2; i + 1 < args.length; i += 2) {\n if (input >= Number(args[i])) out = ev(i + 1);\n else break;\n }\n\n return out;\n }\n case 'interpolate':\n case 'interpolate-hcl':\n case 'interpolate-lab': {\n const kind = args[0];\n const input = num(1);\n const base = Array.isArray(kind) && kind[0] === 'exponential' ? Number(kind[1]) : 1;\n const stops = Array.from({ length: Math.floor((args.length - 2) / 2) }, (_, k): [number, Json] => [\n Number(args[2 + 2 * k]),\n args[3 + 2 * k] ?? null,\n ]);\n const first = stops[0];\n\n if (!first) return null;\n if (input <= first[0]) return evaluate(first[1], ctx);\n\n const at = stops.findIndex((s1, i) => i > 0 && input < s1[0]);\n const [s0, s1] = [stops[at - 1], stops[at]];\n\n if (at < 0 || !s0 || !s1) return evaluate(stops.at(-1)?.[1] ?? null, ctx);\n\n return mix(evaluate(s0[1], ctx), evaluate(s1[1], ctx), factor(input, s0[0], s1[0], base));\n }\n case 'rgb':\n case 'rgba':\n return css([num(0) / 255, num(1) / 255, num(2) / 255, args.length > 3 ? num(3) : 1]);\n case '+':\n return nums().reduce((a, b) => a + b, 0);\n case '*':\n return nums().reduce((a, b) => a * b, 1);\n case '-':\n return args.length === 1 ? -num(0) : num(0) - num(1);\n case '/':\n return num(0) / num(1);\n case '%':\n return num(0) % num(1);\n case '^':\n return num(0) ** num(1);\n case 'min':\n return Math.min(...nums());\n case 'max':\n return Math.max(...nums());\n case 'abs':\n return Math.abs(num(0));\n case 'round':\n // Half away from zero, as MapLibre\n return Math.sign(num(0)) * Math.round(Math.abs(num(0)));\n case 'floor':\n return Math.floor(num(0));\n case 'ceil':\n return Math.ceil(num(0));\n case 'sqrt':\n return Math.sqrt(num(0));\n case 'ln':\n return Math.log(num(0));\n case 'log10':\n return Math.log10(num(0));\n case 'log2':\n return Math.log2(num(0));\n case 'pi':\n return Math.PI;\n case 'e':\n return Math.E;\n default:\n // Unsupported: no value (a filter drops the feature, a property takes its default)\n if (!warned.has(op)) {\n warned.add(op);\n console.warn(`isard: the style expression \"${op}\" is not supported`);\n }\n\n return null;\n }\n};\n\n// ── Filters ──\n\nconst LEGACY_COMPARISONS = new Set(['==', '!=', '<', '<=', '>', '>=']);\n\n/** Whether a filter (not `all`, `any`, `none`) is in the legacy form: `[\"==\", \"key\", value]`, `[\"in\", \"key\", a, b]`,\n * `[\"has\", \"key\"]`; a key and literal values, as MapLibre tells them from expressions */\nconst isLegacyLeaf = (f: Json[]): boolean => {\n const [op, a, ...rest] = f;\n\n if (typeof op !== 'string' || typeof a !== 'string' || rest.some(Array.isArray)) return false;\n if (LEGACY_COMPARISONS.has(op)) return f.length === 3;\n if (op === 'in') return f.length !== 3 || !Array.isArray(f[2]);\n\n return op === '!in' || op === 'has' || op === '!has';\n};\n\nconst legacyFilter = (f: Json[], ctx: Context): boolean => {\n const [op, key, ...rest] = f;\n const v = get(ctx, key);\n\n switch (op) {\n case '==':\n return v === rest[0];\n case '!=':\n return v !== rest[0];\n case '<':\n case '<=':\n case '>':\n case '>=':\n return compare(op, v, rest[0]);\n case 'in':\n return labels(rest).includes(v);\n case '!in':\n return !labels(rest).includes(v);\n case 'has':\n return v !== undefined;\n case '!has':\n return v === undefined;\n default:\n return true;\n }\n};\n\ntype Test = (ctx: Context) => boolean;\n\n/** Compiled filters, by filter object */\nconst compiled = new WeakMap<Json[], Test>();\n\n/** A filter as a function: `all`, `any`, `none` of their parts, each part legacy or an expression (they may mix) */\nconst compile = (f: Json): Test => {\n if (!Array.isArray(f)) return () => Boolean(f);\n\n const hit = compiled.get(f);\n\n if (hit) return hit;\n\n const make = (): Test => {\n const op = f[0];\n\n if (op === 'all' || op === 'any' || op === 'none') {\n const parts = f.slice(1).map(compile);\n\n if (op === 'all') return (ctx) => parts.every((p) => p(ctx));\n if (op === 'any') return (ctx) => parts.some((p) => p(ctx));\n\n return (ctx) => !parts.some((p) => p(ctx));\n }\n if (isLegacyLeaf(f)) return (ctx) => legacyFilter(f, ctx);\n\n return (ctx) => Boolean(evaluate(f, ctx));\n };\n const test = make();\n\n compiled.set(f, test);\n\n return test;\n};\n\nexport const filter = (f: Json | undefined, ctx: Context): boolean => {\n if (f === undefined || f === null) return true;\n\n return compile(f)(ctx);\n};\n\n/** The operators that read the feature */\nconst FEATURE_OPERATORS: ReadonlySet<unknown> = new Set(['get', 'has', '!has', 'geometry-type', 'properties', 'id']);\n\n/** Whether a value depends on the feature (else only on the zoom, evaluated once per tile) */\nexport const isFeatureDependent = (e: Json | undefined): boolean => {\n if (e !== undefined && isFunction(e)) return e.property !== undefined;\n if (!Array.isArray(e)) return false;\n if (FEATURE_OPERATORS.has(e[0])) return true;\n\n return e.some((x) => isFeatureDependent(x));\n};\n\n/** A `{token}` text field (or an expression) to the text of a feature */\nexport const text = (field: Json | undefined, ctx: Context): string => {\n if (field === undefined || field === null) return '';\n if (typeof field === 'string') {\n return field.replace(/\\{([^}]+)\\}/g, (_, key: string) => {\n const v = ctx.properties[key];\n\n return v === undefined ? '' : String(v);\n });\n }\n\n const v = evaluate(field, ctx);\n\n if (Array.isArray(v)) {\n // A `format` value: its strings\n return v.filter((x) => typeof x === 'string').join('');\n }\n\n return v === undefined || v === null ? '' : String(v);\n};\n\n/** The font of a label from the first of its `text-font`: a family without its weight takes the regular one */\nexport const labelFont = (font: string): string => {\n return /Regular|Bold|Italic|Semibold|Light|Medium|Black/.test(font) ? font : `${font} Regular`;\n};\n\n/**\n * A value of the zoom only (an expression: `interpolate`, `step` of `[\"zoom\"]`) as stops `[[zoom, value], …]` for the\n * engine, which interpolates them linearly: evaluated at its own stops and at the whole zooms between (an exponential\n * curve followed closely), a step kept sharp just before its threshold\n */\nexport const zoomStops = (e: Json): [number, number][] => {\n const zooms = new Set<number>();\n // The inputs of the stops of an `interpolate` or a `step` (from its fourth argument, one in two)\n const stopInputs = (x: Json[]) => x.filter((_, i) => i >= 3 && i % 2 === 1).map(Number);\n const walk = (x: Json) => {\n if (!Array.isArray(x)) return;\n\n const zoomInput = (input: Json | undefined) => Array.isArray(input) && input[0] === 'zoom';\n\n if ((x[0] === 'interpolate' || x[0] === 'interpolate-hcl' || x[0] === 'interpolate-lab') && zoomInput(x[2])) {\n stopInputs(x).forEach((t) => {\n zooms.add(t);\n });\n } else if (x[0] === 'step' && zoomInput(x[1])) {\n stopInputs(x).forEach((t) => {\n zooms.add(t);\n zooms.add(t - 0.01);\n });\n }\n x.forEach(walk);\n };\n\n walk(e);\n\n const finite = [...zooms].filter(Number.isFinite);\n\n if (finite.length === 0) finite.push(0);\n\n const [lo, hi] = [Math.min(...finite), Math.max(...finite)];\n\n finite.push(...Array.from({ length: Math.floor(hi) - Math.ceil(lo) + 1 }, (_, i) => Math.ceil(lo) + i));\n\n return [...new Set(finite)]\n .sort((a, b) => a - b)\n .map((zoom) => [zoom, Number(evaluate(e, { zoom, properties: {}, type: 'Unknown' }))]);\n};\n",
14
+ "/**\n * Web Mercator in [0, 1] across the world (y towards the south), for the page and the workers alike: the positions\n * sent to the engine, the tiles of a view, the flights, the label candidates of the vector tiles.\n */\n\n/** The latitude where Web Mercator is square: the edges of the map */\nconst MAX_LAT = 85.051128779806589;\n\n/** Mercator x of a longitude (degrees) */\nexport const mercatorX = (lon: number): number => {\n return (lon + 180) / 360;\n};\n\n/** Mercator y of a latitude (degrees), clamped to the edges of the map */\nexport const mercatorY = (lat: number): number => {\n const phi = (Math.max(-MAX_LAT, Math.min(MAX_LAT, lat)) * Math.PI) / 180;\n\n return 0.5 - Math.log(Math.tan(Math.PI / 4 + phi / 2)) / (2 * Math.PI);\n};\n\n/** Longitude (degrees) of a Mercator x */\nexport const longitude = (x: number): number => {\n return x * 360 - 180;\n};\n\n/** Latitude (degrees) of a Mercator y */\nexport const latitude = (y: number): number => {\n return (Math.atan(Math.sinh(Math.PI * (1 - 2 * y))) * 180) / Math.PI;\n};\n\n/** Mercator x, y of a longitude and latitude */\nexport const toMercator = ([lon, lat]: readonly [number, number, ...unknown[]]): [x: number, y: number] => {\n return [mercatorX(lon), mercatorY(lat)];\n};\n\n/** Longitude and latitude of a Mercator x, y */\nexport const fromMercator = ([x, y]: readonly [number, number]): [lon: number, lat: number] => {\n return [longitude(x), latitude(y)];\n};\n",
15
+ "/**\n * Worker of the vector basemaps: fetches and decodes vector tiles (kept for the tiles that share them), draws their\n * fills, lines and circles with a MapLibre style into images (Canvas 2D, off the main thread) for the raster pool,\n * with the style's raster layers under them, and lists the label candidates of the style's symbol layers (their texts\n * and icons) for the page to shape and place. Extrusions are drawn flat, as fills. It also decodes the altitudes of PNG relief tiles and\n * draws the rasters reprojected from other grids (planned by the page), for the map's other layers.\n *\n * A raster tile of level z covers 256 CSS pixels at map zoom z - 1 (MapLibre's 512 px convention): it is drawn from\n * the vector tile of level z - 1 (or the deepest one the source has), with the style at that zoom.\n */\n\nimport { decode, type TileFeature, type TileLayer } from '../basemap/mvt.ts';\nimport { pmtilesTile } from '../basemap/pmtiles.ts';\nimport { type Job, resampler } from '../basemap/resample.ts';\nimport { fetchHeights, type PngEncoding, type Surface } from '../basemap/terrain.ts';\nimport {\n type CandidateIcon,\n type CandidateOverlap,\n type Context,\n color,\n context,\n css,\n evaluate,\n filter,\n isExpression,\n isFeatureDependent,\n type Json,\n type LabelCandidate,\n labelFont,\n type RasterSource,\n type StyleLayer,\n text,\n zoomStops,\n} from '../basemap/vectorstyle.ts';\nimport { type HeaderRules, setHeaderRules, withHeaders } from '../engine/requests.ts';\nimport { latitude, longitude } from '../util/geo.ts';\nimport { Lru } from '../util/lru.ts';\n\nexport type { LabelCandidate, RasterSource };\n\n/** Fetch priority of a request (`fetch`'s `priority`, a hint to the browser) */\nexport type Priority = 'high' | 'low' | 'auto';\n\n/** A tile's image or labels, asked of a worker; or a tile of another layer decoded: the altitudes of a PNG relief\n * tile, a Mercator tile reprojected from the source images of its plan (keeping `cached` of them) */\nexport type BasemapWork =\n | { type: 'render'; key: string; z: number; x: number; y: number; size: number; priority?: Priority }\n /** `zoom`: the zoom the style is evaluated at, past the source's deepest level (`z` by default) */\n | { type: 'labels'; key: string; z: number; x: number; y: number; zoom?: number; priority?: Priority }\n | { type: 'heights'; url: string; encoding: PngEncoding; floor?: number }\n | { type: 'reproject'; job: Job; cached: number };\n\nexport type BasemapRequest =\n /** The page's request headers (`setRequestHeaders`) */\n | { type: 'headers'; rules: HeaderRules }\n | {\n type: 'init';\n /** Renderers by key: each draws its own layers of the same source */\n key: string;\n tiles: string;\n maxzoom: number;\n layers: StyleLayer[];\n /** The style's raster sources, by name, for its raster layers */\n rasters?: Record<string, RasterSource>;\n /** The style's sprites, for the fill patterns (loaded once by the page) */\n sprites?: Sprite[];\n /** Workers of the pool: each keeps its share of the decoded tiles */\n workers?: number;\n }\n | (BasemapWork & { id: number })\n | { type: 'abort'; id: number }\n /** A renderer no longer used: forgotten */\n | { type: 'drop'; key: string };\n\nexport type BasemapResponse =\n | { id: number; image: ImageBitmap }\n | { id: number; missing: true }\n | { id: number; error: string }\n | { id: number; labels: LabelCandidate[] }\n | { id: number; heights: Float32Array };\n\ninterface Renderer {\n tiles: string;\n maxzoom: number;\n layers: StyleLayer[];\n rasters: Record<string, RasterSource>;\n sprites: Sprite[];\n /** Fill patterns by icon name, cut from the sprites once */\n patterns: Map<string, OffscreenCanvas | undefined>;\n}\n\n/** A sprite of the style: its images by name (`id:name` but in the default sprite) and its sheet */\nexport interface Sprite {\n image: ImageBitmap;\n icons: Record<string, { x: number; y: number; width: number; height: number; pixelRatio?: number }>;\n}\n\n/** An image of the sprites and its sheet */\nconst spriteIcon = (r: Renderer, name: string) => {\n const sprite = r.sprites.find((sp) => Boolean(sp.icons[name]));\n const icon = sprite?.icons[name];\n\n return sprite && icon ? { icon, image: sprite.image } : undefined;\n};\n\nconst renderers = new Map<string, Renderer>();\n/** Decoded tiles kept by the pool, shared among its workers (a vector tile always goes to the same worker): some\n * 2 MB each */\nconst CACHE = 96;\n/** Decoded tiles by URL; this worker's share of them, set by the renderers */\nconst cache = new Lru<string, Promise<Map<string, TileLayer> | undefined>>(CACHE);\n\n/** The decoded tiles one worker of `workers` keeps */\nexport const cacheShare = (workers: number): number => {\n return Math.max(16, Math.ceil(CACHE / Math.max(1, workers)));\n};\n/** Requests in progress, and those of them aborted (both forgotten once answered) */\nconst active = new Set<number>();\nconst aborted = new Set<number>();\n/** The signals of the relief and reprojection requests in progress, aborted with them */\nconst controllers = new Map<number, AbortController>();\n\n/** Where this worker reads the colors of the relief tiles back */\nconst heightsSurface: Surface = {};\n\n/** The reprojected rasters' source images this worker keeps, shared by every source */\nconst reprojection = resampler();\n\n/** Images of the raster sources by URL. An image dropped is freed once settled, after the renders that awaited it have\n * drawn it (they draw without awaiting again) */\nconst images = new Lru<string, Promise<ImageBitmap | undefined>>(64, (evicted) =>\n evicted.then(\n (bitmap) => setTimeout(() => bitmap?.close(), 0),\n () => undefined,\n ),\n);\n\n/** An image of a raster source (shared by every renderer); undefined where the source has none */\nconst image = (url: string, priority: Priority = 'auto'): Promise<ImageBitmap | undefined> => {\n const hit = images.get(url);\n\n if (hit) return hit;\n\n const pending = (async () => {\n // A tile of a PMTiles archive (`pmtiles://…/{z}/{x}/{y}`)\n const archived = pmtilesTile(url);\n\n if (archived) {\n const bytes = await archived;\n\n return bytes && createImageBitmap(new Blob([bytes]));\n }\n\n const init: PriorityInit = { priority };\n const response = await fetch(url, withHeaders(url, init));\n\n if (response.status === 404 || response.status === 204) return undefined;\n if (!response.ok) throw new Error(`${url}: ${response.status}`);\n\n return createImageBitmap(await response.blob());\n })();\n\n pending.catch(() => images.delete(url));\n images.set(url, pending);\n\n return pending;\n};\n\n/** `RequestInit` with the fetch priority, which the TypeScript DOM library may not know yet */\ntype PriorityInit = RequestInit & { priority?: Priority };\n\n/** A vector tile, decoded (shared by every renderer of its URL); the first request's priority fetches it */\nconst tile = (url: string, priority: Priority = 'auto'): Promise<Map<string, TileLayer> | undefined> => {\n const hit = cache.get(url);\n\n if (hit) return hit;\n\n const pending = (async () => {\n // A tile of a PMTiles archive, ungzipped by the reader\n const archived = pmtilesTile(url);\n\n if (archived) {\n const bytes = await archived;\n\n return bytes && decode(bytes);\n }\n for (let attempt = 0; ; attempt += 1) {\n const init: PriorityInit = { priority };\n const response = await fetch(url, withHeaders(url, init));\n\n if (response.status === 404 || response.status === 204) return undefined;\n if (response.ok) {\n // Every layer: renderers of other subsets share the tile\n return decode(new Uint8Array(await response.arrayBuffer()));\n }\n if (attempt >= 2) throw new Error(`${url}: ${response.status}`);\n await new Promise((r) => setTimeout(r, 400 * (attempt + 1)));\n }\n })();\n\n pending.catch(() => cache.delete(url));\n cache.set(url, pending);\n\n return pending;\n};\n\n/** The vector tile to draw a raster tile from, and where the raster tile lies in it (tile units) */\nconst source = (r: Renderer, z: number, x: number, y: number) => {\n const vz = Math.max(0, Math.min(z - 1, r.maxzoom));\n const d = z - vz;\n const n = 2 ** Math.max(0, d);\n const [vx, vy] = d >= 0 ? [Math.floor(x / n), Math.floor(y / n)] : [x, y];\n const url = r.tiles.replace('{z}', String(vz)).replace('{x}', String(vx)).replace('{y}', String(vy));\n // Fraction of the vector tile covered, and the offset in it\n const part = 1 / n;\n\n return { url, vz, vx, vy, part, ox: (x % n) * part, oy: (y % n) * part };\n};\n\nconst value = (layer: StyleLayer, group: 'paint' | 'layout', key: string, ctx: Context, fallback: unknown) => {\n const v = layer[group]?.[key];\n\n if (v === undefined) return fallback;\n\n // An array that is not an expression is a literal value (`text-font`, `text-offset`, `line-dasharray`)\n const out = Array.isArray(v) && !isExpression(v) ? v : evaluate(v, ctx);\n\n return out === undefined || out === null ? fallback : out;\n};\n\n/** A color with an opacity, for the canvas */\nconst paint = (c: unknown, opacity: number): string => {\n const rgba = color(c) ?? [0, 0, 0, 1];\n\n return css([rgba[0], rgba[1], rgba[2], rgba[3] * opacity]);\n};\n\nconst shown = (layer: StyleLayer, zoom: number): boolean => {\n if (layer.layout?.visibility === 'none') return false;\n\n return zoom >= (layer.minzoom ?? 0) && zoom < (layer.maxzoom ?? 24);\n};\n\nconst LINE_CAPS: ReadonlySet<unknown> = new Set<CanvasLineCap>(['butt', 'round', 'square']);\nconst LINE_JOINS: ReadonlySet<unknown> = new Set<CanvasLineJoin>(['bevel', 'miter', 'round']);\n\nconst isLineCap = (value: unknown): value is CanvasLineCap => LINE_CAPS.has(value);\nconst isLineJoin = (value: unknown): value is CanvasLineJoin => LINE_JOINS.has(value);\n\n/** A style's `line-cap` for the canvas: `butt` if it is none */\nconst lineCap = (value: unknown): CanvasLineCap => (isLineCap(value) ? value : 'butt');\n\n/** A style's `line-join` for the canvas: `miter` if it is none */\nconst lineJoin = (value: unknown): CanvasLineJoin => (isLineJoin(value) ? value : 'miter');\n\n/** The image of a fill pattern, cut from the sprite on first use */\nconst patternImage = (r: Renderer, name: string): OffscreenCanvas | undefined => {\n if (r.patterns.has(name)) return r.patterns.get(name);\n\n const cut = (): OffscreenCanvas | undefined => {\n const found = spriteIcon(r, name);\n\n if (!found || !(found.icon.width > 0) || !(found.icon.height > 0)) return undefined;\n\n const { icon } = found;\n const canvas = new OffscreenCanvas(icon.width, icon.height);\n\n canvas\n .getContext('2d')\n ?.drawImage(found.image, icon.x, icon.y, icon.width, icon.height, 0, 0, icon.width, icon.height);\n\n return canvas;\n };\n const image = cut();\n\n r.patterns.set(name, image);\n\n return image;\n};\n\n/** Canvases free for the next tiles, by size: one per tile being drawn at most */\nconst canvases = new Map<number, OffscreenCanvas[]>();\n\n/** A blank canvas of `size` pixels and its context, from the free ones if any */\nconst takeCanvas = (size: number): { canvas: OffscreenCanvas; g: OffscreenCanvasRenderingContext2D } => {\n const canvas = canvases.get(size)?.pop() ?? new OffscreenCanvas(size, size);\n // A canvas on the CPU: its pixels are read back here, in the worker, not on the main thread at the upload\n const g = canvas.getContext('2d', { willReadFrequently: true });\n\n if (!g) throw new Error('no 2D context');\n // The state a former tile left\n g.setTransform(1, 0, 0, 1, 0, 0);\n g.globalAlpha = 1;\n g.setLineDash([]);\n g.clearRect(0, 0, size, size);\n\n return { canvas, g };\n};\n\nconst giveCanvas = (canvas: OffscreenCanvas): void => {\n const free = canvases.get(canvas.width) ?? [];\n\n canvases.set(canvas.width, free);\n if (free.length < 4) free.push(canvas);\n};\n\n/**\n * The image of a drawn canvas, its alpha straight (the engine blends straight alpha). An opaque tile (a background\n * of full opacity, as a basemap's) is moved out of the canvas as it is, premultiplied and straight being the same\n * there; another one is read back unpremultiplied, copied\n */\nexport const tileImage = (\n canvas: OffscreenCanvas,\n g: OffscreenCanvasRenderingContext2D,\n opaque: boolean,\n): Promise<ImageBitmap> => {\n if (opaque) return Promise.resolve(canvas.transferToImageBitmap());\n\n return createImageBitmap(g.getImageData(0, 0, canvas.width, canvas.height), { premultiplyAlpha: 'none' });\n};\n\nconst render = async (r: Renderer, z: number, x: number, y: number, size: number, id: number, priority?: Priority) => {\n const s = source(r, z, x, y);\n const layers = await tile(s.url, priority);\n\n if (aborted.has(id)) return undefined;\n\n const { canvas, g } = takeCanvas(size);\n\n try {\n return await draw(r, s, layers, canvas, g, z, x, y, size, id, priority);\n } finally {\n giveCanvas(canvas);\n }\n};\n\nconst draw = async (\n r: Renderer,\n s: ReturnType<typeof source>,\n layers: Map<string, TileLayer> | undefined,\n canvas: OffscreenCanvas,\n g: OffscreenCanvasRenderingContext2D,\n z: number,\n x: number,\n y: number,\n size: number,\n id: number,\n priority?: Priority,\n) => {\n const zoom = Math.max(0, z - 1);\n // CSS pixels to canvas pixels: the tile is 256 CSS pixels across at its zoom\n const px = size / 256;\n let drawn = false;\n /** A background of full opacity covers the tile: every pixel stays opaque */\n let opaque = false;\n\n for (const layer of r.layers) {\n if (!shown(layer, zoom)) continue;\n\n const zctx: Context = { zoom, properties: {}, type: 'Unknown' };\n\n if (layer.type === 'background') {\n const fill = value(layer, 'paint', 'background-color', zctx, '#000');\n const opacity = Number(value(layer, 'paint', 'background-opacity', zctx, 1));\n\n g.fillStyle = paint(fill, opacity);\n g.fillRect(0, 0, size, size);\n if ((color(fill) ?? [0, 0, 0, 1])[3] * opacity >= 1) opaque = true;\n drawn = true;\n continue;\n }\n if (layer.type === 'raster') {\n const source = layer.source === undefined ? undefined : r.rasters[layer.source];\n\n if (!source) continue;\n\n // The canvas covers the Web Mercator tile (z, x, y): a source tile of 512 px covers it from a level coarser\n const rz = Math.max(0, Math.min(z - (source.tileSize >= 512 ? 1 : 0), source.maxzoom));\n const n = 2 ** (z - rz);\n const url = source.tiles\n .replace('{z}', String(rz))\n .replace('{x}', String(Math.floor(x / n)))\n .replace('{y}', String(Math.floor(y / n)));\n const picture = await image(url, priority).catch(() => undefined);\n\n if (aborted.has(id)) return undefined;\n if (!picture) continue;\n\n const [w, h] = [picture.width / n, picture.height / n];\n\n g.globalAlpha = Number(value(layer, 'paint', 'raster-opacity', zctx, 1));\n g.drawImage(picture, (x % n) * w, (y % n) * h, w, h, 0, 0, size, size);\n g.globalAlpha = 1;\n drawn = true;\n continue;\n }\n\n const data = layers?.get(layer['source-layer'] ?? '');\n\n if (!data) continue;\n\n // Tile units to canvas pixels\n const k = size / (data.extent * s.part);\n const [ox, oy] = [s.ox * data.extent, s.oy * data.extent];\n const path = (f: TileFeature, close: boolean) => {\n g.beginPath();\n for (const line of f.geometry) {\n for (let i = 0; i + 1 < line.length; i += 2) {\n const [lx, ly] = [((line[i] ?? 0) - ox) * k, ((line[i + 1] ?? 0) - oy) * k];\n\n if (i === 0) g.moveTo(lx, ly);\n else g.lineTo(lx, ly);\n }\n if (close) g.closePath();\n }\n };\n // Values that only depend on the zoom are evaluated once for the layer\n const dependent = new Map<string, boolean>();\n const get = (group: 'paint' | 'layout', key: string, ctx: Context, fallback: unknown) => {\n const known = dependent.get(key);\n const d = known ?? isFeatureDependent(layer[group]?.[key]);\n\n if (known === undefined) dependent.set(key, d);\n\n return value(layer, group, key, d ? ctx : zctx, fallback);\n };\n\n for (const f of data.features) {\n const ctx = context(f, zoom);\n\n if (!filter(layer.filter, ctx)) continue;\n if (layer.type === 'fill-extrusion' && f.type === 3) {\n // Flat, seen from above: its color\n path(f, true);\n g.fillStyle = paint(\n get('paint', 'fill-extrusion-color', ctx, '#000'),\n Number(get('paint', 'fill-extrusion-opacity', ctx, 1)),\n );\n g.fill('evenodd');\n drawn = true;\n } else if (layer.type === 'fill' && f.type === 3) {\n const opacity = Number(get('paint', 'fill-opacity', ctx, 1));\n const pattern = get('paint', 'fill-pattern', ctx, undefined);\n\n path(f, true);\n\n const icon = typeof pattern === 'string' ? spriteIcon(r, pattern)?.icon : undefined;\n const image = icon && typeof pattern === 'string' && patternImage(r, pattern);\n\n if (icon && image) {\n const p = g.createPattern(image, 'repeat');\n\n if (p) {\n p.setTransform(new DOMMatrix().scale(px / (icon.pixelRatio ?? 1)));\n g.globalAlpha = opacity;\n g.fillStyle = p;\n g.fill('evenodd');\n g.globalAlpha = 1;\n }\n } else {\n g.fillStyle = paint(get('paint', 'fill-color', ctx, '#000'), opacity);\n g.fill('evenodd');\n\n const outline = get('paint', 'fill-outline-color', ctx, undefined);\n\n if (outline !== undefined) {\n g.strokeStyle = paint(outline, opacity);\n g.lineWidth = px;\n g.setLineDash([]);\n g.stroke();\n }\n }\n drawn = true;\n } else if (layer.type === 'line' && f.type !== 1) {\n const width = Number(get('paint', 'line-width', ctx, 1));\n\n if (width <= 0) continue;\n\n // A gap: two lines on either side of it, drawn as one wide line (the casing of a road, its inside drawn over)\n const gap = Number(get('paint', 'line-gap-width', ctx, 0));\n\n g.strokeStyle = paint(get('paint', 'line-color', ctx, '#000'), Number(get('paint', 'line-opacity', ctx, 1)));\n g.lineWidth = (gap > 0 ? gap + 2 * width : width) * px;\n g.lineCap = lineCap(get('layout', 'line-cap', ctx, 'butt'));\n g.lineJoin = lineJoin(get('layout', 'line-join', ctx, 'miter'));\n\n const dash = get('paint', 'line-dasharray', ctx, undefined);\n\n g.setLineDash(Array.isArray(dash) ? dash.map((d) => Number(d) * width * px) : []);\n path(f, f.type === 3);\n g.stroke();\n drawn = true;\n } else if (layer.type === 'circle' && f.type === 1) {\n const radius = Number(get('paint', 'circle-radius', ctx, 5)) * px;\n\n g.fillStyle = paint(get('paint', 'circle-color', ctx, '#000'), Number(get('paint', 'circle-opacity', ctx, 1)));\n\n const stroke = Number(get('paint', 'circle-stroke-width', ctx, 0)) * px;\n\n g.strokeStyle = paint(\n get('paint', 'circle-stroke-color', ctx, '#000'),\n Number(get('paint', 'circle-stroke-opacity', ctx, 1)),\n );\n g.lineWidth = stroke;\n for (const point of f.geometry) {\n for (let i = 0; i + 1 < point.length; i += 2) {\n g.beginPath();\n g.arc(((point[i] ?? 0) - ox) * k, ((point[i + 1] ?? 0) - oy) * k, radius, 0, 2 * Math.PI);\n g.fill();\n if (stroke > 0) g.stroke();\n }\n }\n drawn = true;\n }\n }\n }\n if (!drawn && !layers) return null;\n\n return tileImage(canvas, g, opaque);\n};\n\n/** How a layer's text or icon (`prefix`) meets the others: allowed to overlap, ignored by the placement */\nconst overlapOf = (layer: StyleLayer, prefix: 'text' | 'icon', ctx: Context): CandidateOverlap => {\n const allow = Boolean(value(layer, 'layout', `${prefix}-allow-overlap`, ctx, false));\n const ignore = Boolean(value(layer, 'layout', `${prefix}-ignore-placement`, ctx, false));\n\n if (allow && ignore) return true;\n if (allow) return 'allow';\n\n return ignore ? 'ignore' : false;\n};\n\n/** A pair of numbers of a style value, `fallback` if it is not one */\nconst pair = (v: unknown, fallback: [number, number]): [number, number] => {\n return Array.isArray(v) ? [Number(v[0] ?? fallback[0]), Number(v[1] ?? fallback[1])] : fallback;\n};\n\n/** Top, right, bottom, left of one to four numbers, as CSS's sides */\nconst sides = (v: unknown): [number, number, number, number] => {\n const n = (Array.isArray(v) ? v : [v]).map((x) => Number(x) || 0);\n const [top = 0, right = top, bottom = top, left = right] = n;\n\n return [top, right, bottom, left];\n};\n\n/** A label's text in the case of its `text-transform` */\nconst cased = (t: string, transform: unknown): string => {\n if (transform === 'uppercase') return t.toUpperCase();\n if (transform === 'lowercase') return t.toLowerCase();\n\n return t;\n};\n\n/** Points every `spacing` along a line (tile units, x and y interleaved), the first half a spacing in (the middle of a\n * shorter line): each point and the segment it lies on (x, y, x0, y0, x1, y1) */\nexport const lineAnchors = (line: readonly number[], spacing: number): number[][] => {\n let length = 0;\n\n for (let i = 2; i + 1 < line.length; i += 2) {\n length += Math.hypot((line[i] ?? 0) - (line[i - 2] ?? 0), (line[i + 1] ?? 0) - (line[i - 1] ?? 0));\n }\n\n const out: number[][] = [];\n\n if (!(length > 0) || !(spacing > 0)) return out;\n\n let next = Math.min(spacing / 2, length / 2);\n let walked = 0;\n\n for (let i = 2; i + 1 < line.length; i += 2) {\n const [ax, ay, bx, by] = [line[i - 2] ?? 0, line[i - 1] ?? 0, line[i] ?? 0, line[i + 1] ?? 0];\n const d = Math.hypot(bx - ax, by - ay);\n\n while (d > 0 && next <= walked + d) {\n const t = (next - walked) / d;\n\n out.push([ax + (bx - ax) * t, ay + (by - ay) * t, ax, ay, bx, by]);\n next += spacing;\n }\n walked += d;\n }\n\n return out;\n};\n\n/** Longitude and latitude of a point of tile (z, x, y) in tile units */\nconst lonLat = (z: number, x: number, y: number, extent: number, px: number, py: number): [number, number] => {\n const n = 2 ** z;\n\n return [longitude((x + px / extent) / n), latitude((y + py / extent) / n)];\n};\n\n/** The icon of a label: its layer's icon properties for the feature */\nconst iconOf = (\n layer: StyleLayer,\n image: string,\n ctx: Context,\n placement: 'point' | 'line',\n sizeOf: (layer: StyleLayer) => Json,\n): CandidateIcon => {\n const alignment = value(layer, 'layout', 'icon-rotation-alignment', ctx, 'auto');\n const fit = String(value(layer, 'layout', 'icon-text-fit', ctx, 'none'));\n const padding = value(layer, 'layout', 'icon-text-fit-padding', ctx, [0, 0, 0, 0]);\n\n return {\n image,\n size: isFeatureDependent(layer.layout?.['icon-size'])\n ? Number(value(layer, 'layout', 'icon-size', ctx, 1))\n : sizeOf(layer),\n anchor: String(value(layer, 'layout', 'icon-anchor', ctx, 'center')),\n offset: pair(value(layer, 'layout', 'icon-offset', ctx, [0, 0]), [0, 0]),\n rotate: Number(value(layer, 'layout', 'icon-rotate', ctx, 0)) || 0,\n alignment: alignment === 'map' || (alignment === 'auto' && placement === 'line') ? 'map' : 'viewport',\n overlap: overlapOf(layer, 'icon', ctx),\n optional: Boolean(value(layer, 'layout', 'icon-optional', ctx, false)),\n fit: fit === 'width' || fit === 'height' || fit === 'both' ? fit : 'none',\n padding: sides(padding),\n color: String(value(layer, 'paint', 'icon-color', ctx, '#000')),\n opacity: Number(value(layer, 'paint', 'icon-opacity', ctx, 1)),\n };\n};\n\nconst labels = async (\n r: Renderer,\n z: number,\n x: number,\n y: number,\n id: number,\n priority?: Priority,\n zoom = z,\n): Promise<LabelCandidate[]> => {\n const url = r.tiles.replace('{z}', String(z)).replace('{x}', String(x)).replace('{y}', String(y));\n const layers = await tile(url, priority);\n\n if (!layers || aborted.has(id)) return [];\n\n const out: LabelCandidate[] = [];\n // The text size of a layer when it depends on the zoom only: legacy stops as they are, an expression as stops\n const sizes = new Map<StyleLayer, Json>();\n const sizeOf = (layer: StyleLayer): Json => {\n const known = sizes.get(layer);\n\n if (known !== undefined) return known;\n\n const v = layer.layout?.['text-size'] ?? 16;\n const s = isExpression(v) ? zoomStops(v) : v;\n\n sizes.set(layer, s);\n\n return s;\n };\n // The icon size of a layer when it depends on the zoom only, as the text size\n const iconSizes = new Map<StyleLayer, Json>();\n const iconSizeOf = (layer: StyleLayer): Json => {\n const known = iconSizes.get(layer);\n\n if (known !== undefined) return known;\n\n const v = layer.layout?.['icon-size'] ?? 1;\n const s = isExpression(v) ? zoomStops(v) : v;\n\n iconSizes.set(layer, s);\n\n return s;\n };\n\n r.layers.forEach((layer, index) => {\n const layout = layer.layout ?? {};\n\n if (layer.type !== 'symbol' || !shown(layer, zoom)) return;\n if (layout['text-field'] === undefined && layout['icon-image'] === undefined) return;\n\n const data = layers.get(layer['source-layer'] ?? '');\n\n if (!data) return;\n\n const zctx: Context = { zoom, properties: {}, type: 'Unknown' };\n const placement = value(layer, 'layout', 'symbol-placement', zctx, 'point') === 'line' ? 'line' : 'point';\n const textAlong =\n placement === 'line' && value(layer, 'layout', 'text-rotation-alignment', zctx, 'auto') !== 'viewport';\n\n for (const f of data.features) {\n const ctx = context(f, zoom);\n\n if (!filter(layer.filter, ctx)) continue;\n\n const field = text(layout['text-field'], ctx).trim();\n const image = text(layout['icon-image'], ctx).trim();\n\n if (!field && !image) continue;\n\n const t = cased(field, value(layer, 'layout', 'text-transform', ctx, 'none'));\n const fonts = value(layer, 'layout', 'text-font', ctx, ['Noto Sans Regular']);\n const font = labelFont(Array.isArray(fonts) && typeof fonts[0] === 'string' ? fonts[0] : 'Noto Sans Regular');\n const base = {\n layer: index,\n text: t,\n font,\n // Zoom stops are kept for the engine; a value of the feature evaluated here\n size: isFeatureDependent(layer.layout?.['text-size'])\n ? Number(value(layer, 'layout', 'text-size', ctx, 16))\n : sizeOf(layer),\n color: String(value(layer, 'paint', 'text-color', ctx, '#000')),\n haloColor: String(value(layer, 'paint', 'text-halo-color', ctx, 'rgba(0,0,0,0)')),\n haloWidth: Number(value(layer, 'paint', 'text-halo-width', ctx, 0)),\n anchor: String(value(layer, 'layout', 'text-anchor', ctx, 'center')),\n offset: pair(value(layer, 'layout', 'text-offset', ctx, [0, 0]), [0, 0]),\n maxWidth: Number(value(layer, 'layout', 'text-max-width', ctx, 10)),\n lineHeight: Number(value(layer, 'layout', 'text-line-height', ctx, 1.2)),\n overlap: overlapOf(layer, 'text', ctx),\n ...(textAlong ? { textAlong } : {}),\n ...(value(layer, 'layout', 'text-optional', ctx, false) ? { textOptional: true } : {}),\n ...(image ? { icon: iconOf(layer, image, ctx, placement, iconSizeOf) } : {}),\n };\n\n if (f.type === 1) {\n for (const point of f.geometry) {\n for (let i = 0; i + 1 < point.length; i += 2) {\n const [px, py] = [point[i] ?? 0, point[i + 1] ?? 0];\n\n // Points in the buffer belong to the neighbouring tile\n if (px < 0 || py < 0 || px >= data.extent || py >= data.extent) continue;\n\n const [lon, lat] = lonLat(z, x, y, data.extent, px, py);\n\n out.push({ ...base, lon, lat });\n }\n }\n } else if (!t && placement === 'line') {\n // Icons alone along lines (one-way arrows): every `symbol-spacing` CSS pixels (a tile is 512 across at its\n // level, twice as many at each zoom past it)\n const spacing =\n (Number(value(layer, 'layout', 'symbol-spacing', ctx, 250)) * data.extent) / (512 * 2 ** (zoom - z));\n\n for (const line of f.geometry) {\n for (const [px = 0, py = 0, ax = 0, ay = 0, bx = 0, by = 0] of lineAnchors(line, Math.max(spacing, 1))) {\n if (px < 0 || py < 0 || px >= data.extent || py >= data.extent) continue;\n\n const [lon, lat] = lonLat(z, x, y, data.extent, px, py);\n const [lon1, lat1] = lonLat(z, x, y, data.extent, bx, by);\n const [lon0, lat0] = lonLat(z, x, y, data.extent, ax, ay);\n\n out.push({ ...base, lon, lat, along: [lon1 - lon0, lat1 - lat0] });\n }\n }\n } else {\n // The middle of the longest line inside the tile, along it\n let best: number[] | undefined;\n let bestLength = 0;\n\n for (const line of f.geometry) {\n let length = 0;\n\n for (let i = 2; i + 1 < line.length; i += 2) {\n length += Math.hypot((line[i] ?? 0) - (line[i - 2] ?? 0), (line[i + 1] ?? 0) - (line[i - 1] ?? 0));\n }\n if (length > bestLength) {\n bestLength = length;\n best = line;\n }\n }\n if (!best || bestLength < data.extent / 32) continue;\n\n let rest = bestLength / 2;\n\n for (let i = 2; i + 1 < best.length; i += 2) {\n const [ax, ay, bx, by] = [best[i - 2] ?? 0, best[i - 1] ?? 0, best[i] ?? 0, best[i + 1] ?? 0];\n const d = Math.hypot(bx - ax, by - ay);\n\n if (d >= rest && d > 0) {\n const [px, py] = [ax + ((bx - ax) * rest) / d, ay + ((by - ay) * rest) / d];\n\n if (px < 0 || py < 0 || px >= data.extent || py >= data.extent) break;\n\n const [lon, lat] = lonLat(z, x, y, data.extent, px, py);\n const [lon1, lat1] = lonLat(z, x, y, data.extent, bx, by);\n const [lon0, lat0] = lonLat(z, x, y, data.extent, ax, ay);\n\n out.push({ ...base, lon, lat, ...(placement === 'line' ? { along: [lon1 - lon0, lat1 - lat0] } : {}) });\n break;\n }\n rest -= d;\n }\n }\n }\n });\n\n return out;\n};\n\nconst post = (message: BasemapResponse, transfer: Transferable[] = []) =>\n (self as unknown as Worker).postMessage(message, transfer);\n\nself.onmessage = async ({ data }: MessageEvent<BasemapRequest>) => {\n if (data.type === 'headers') {\n setHeaderRules(data.rules);\n\n return;\n }\n if (data.type === 'init') {\n if (data.workers !== undefined) cache.capacity = cacheShare(data.workers);\n renderers.set(data.key, {\n tiles: data.tiles,\n maxzoom: data.maxzoom,\n layers: data.layers,\n rasters: data.rasters ?? {},\n sprites: data.sprites ?? [],\n patterns: new Map(),\n });\n\n return;\n }\n if (data.type === 'drop') {\n // Its copy of the sprites\n renderers.get(data.key)?.sprites.forEach((sprite) => {\n sprite.image.close();\n });\n renderers.delete(data.key);\n\n return;\n }\n if (data.type === 'abort') {\n // An abort that arrives after the answer is ignored\n if (active.has(data.id)) aborted.add(data.id);\n controllers.get(data.id)?.abort();\n\n return;\n }\n if (data.type === 'heights' || data.type === 'reproject') {\n await decodeTile(data);\n\n return;\n }\n active.add(data.id);\n\n const r = renderers.get(data.key);\n\n try {\n if (!r) throw new Error(`no renderer ${data.key}`);\n if (data.type === 'render') {\n const image = await render(r, data.z, data.x, data.y, data.size, data.id, data.priority);\n\n if (image) post({ id: data.id, image }, [image]);\n else post({ id: data.id, missing: true });\n } else {\n post({ id: data.id, labels: await labels(r, data.z, data.x, data.y, data.id, data.priority, data.zoom) });\n }\n } catch (error) {\n post({ id: data.id, error: String(error) });\n } finally {\n active.delete(data.id);\n aborted.delete(data.id);\n }\n};\n\n/** A tile of another layer: the altitudes of a relief tile, or a reprojected raster tile */\nconst decodeTile = async (data: Extract<BasemapWork, { type: 'heights' | 'reproject' }> & { id: number }) => {\n const controller = new AbortController();\n\n controllers.set(data.id, controller);\n try {\n if (data.type === 'heights') {\n const heights = await fetchHeights(data.url, data.encoding, data.floor, controller.signal, heightsSurface);\n\n if (heights) post({ id: data.id, heights }, [heights.buffer]);\n else post({ id: data.id, missing: true });\n } else {\n reprojection.cache.capacity = data.cached;\n\n const image = await reprojection.draw(data.job, controller.signal);\n\n if (image) post({ id: data.id, image }, [image]);\n else post({ id: data.id, missing: true });\n }\n } catch (error) {\n post({ id: data.id, error: String(error) });\n } finally {\n controllers.delete(data.id);\n }\n};\n"
15
16
  ],
16
- "mappings": "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",
17
- "debugId": "5076A77936D7FFEB64756E2164756E21",
17
+ "mappings": "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",
18
+ "debugId": "0F7ADB5901D8D38D64756E2164756E21",
18
19
  "names": []
19
20
  }