@sakuzu/maplibre-gl-draw 1.0.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 (636) hide show
  1. package/CHANGELOG.md +43 -0
  2. package/LICENSE +661 -0
  3. package/README.ja.md +248 -0
  4. package/README.md +255 -0
  5. package/THIRD_PARTY_NOTICES.md +275 -0
  6. package/dist/api/api.d.ts +1259 -0
  7. package/dist/api/api.js +86 -0
  8. package/dist/api/context.d.ts +173 -0
  9. package/dist/api/context.js +193 -0
  10. package/dist/api/display-api.d.ts +1 -0
  11. package/dist/api/display-api.js +23 -0
  12. package/dist/api/event-api.d.ts +13 -0
  13. package/dist/api/event-api.js +17 -0
  14. package/dist/api/extension-api.d.ts +46 -0
  15. package/dist/api/extension-api.js +85 -0
  16. package/dist/api/feature-api.d.ts +11 -0
  17. package/dist/api/feature-api.js +101 -0
  18. package/dist/api/geometry/apply.d.ts +51 -0
  19. package/dist/api/geometry/apply.js +114 -0
  20. package/dist/api/geometry/boolean.d.ts +28 -0
  21. package/dist/api/geometry/boolean.js +65 -0
  22. package/dist/api/geometry/buffer.d.ts +11 -0
  23. package/dist/api/geometry/buffer.js +105 -0
  24. package/dist/api/geometry/split.d.ts +16 -0
  25. package/dist/api/geometry/split.js +75 -0
  26. package/dist/api/geometry/targets.d.ts +76 -0
  27. package/dist/api/geometry/targets.js +158 -0
  28. package/dist/api/geometry/types.d.ts +31 -0
  29. package/dist/api/geometry/types.js +3 -0
  30. package/dist/api/geometry-operations.d.ts +162 -0
  31. package/dist/api/geometry-operations.js +94 -0
  32. package/dist/api/group-api.d.ts +10 -0
  33. package/dist/api/group-api.js +78 -0
  34. package/dist/api/import-export/constants.d.ts +29 -0
  35. package/dist/api/import-export/constants.js +40 -0
  36. package/dist/api/import-export/embedded-file.d.ts +13 -0
  37. package/dist/api/import-export/embedded-file.js +31 -0
  38. package/dist/api/import-export/file-name.d.ts +10 -0
  39. package/dist/api/import-export/file-name.js +20 -0
  40. package/dist/api/import-export/format-detection.d.ts +12 -0
  41. package/dist/api/import-export/format-detection.js +29 -0
  42. package/dist/api/import-export/geojson-export.d.ts +19 -0
  43. package/dist/api/import-export/geojson-export.js +262 -0
  44. package/dist/api/import-export/geojson-import.d.ts +34 -0
  45. package/dist/api/import-export/geojson-import.js +538 -0
  46. package/dist/api/import-export/geometry-validation.d.ts +20 -0
  47. package/dist/api/import-export/geometry-validation.js +107 -0
  48. package/dist/api/import-export/image-import.d.ts +12 -0
  49. package/dist/api/import-export/image-import.js +53 -0
  50. package/dist/api/import-export/index.d.ts +9 -0
  51. package/dist/api/import-export/index.js +107 -0
  52. package/dist/api/import-export/native-format.d.ts +15 -0
  53. package/dist/api/import-export/native-format.js +126 -0
  54. package/dist/api/import-export/native-validation.d.ts +28 -0
  55. package/dist/api/import-export/native-validation.js +212 -0
  56. package/dist/api/import-export/own-property.d.ts +10 -0
  57. package/dist/api/import-export/own-property.js +19 -0
  58. package/dist/api/import-export/style-validation.d.ts +27 -0
  59. package/dist/api/import-export/style-validation.js +49 -0
  60. package/dist/api/import-export/types.d.ts +26 -0
  61. package/dist/api/import-export/types.js +3 -0
  62. package/dist/api/index.d.ts +15 -0
  63. package/dist/api/index.js +3 -0
  64. package/dist/api/input-api.d.ts +158 -0
  65. package/dist/api/input-api.js +144 -0
  66. package/dist/api/instance-api.d.ts +38 -0
  67. package/dist/api/instance-api.js +136 -0
  68. package/dist/api/layer-api.d.ts +12 -0
  69. package/dist/api/layer-api.js +62 -0
  70. package/dist/api/selection-api.d.ts +7 -0
  71. package/dist/api/selection-api.js +78 -0
  72. package/dist/api/snapping-api.d.ts +125 -0
  73. package/dist/api/snapping-api.js +50 -0
  74. package/dist/api/topology-api.d.ts +30 -0
  75. package/dist/api/topology-api.js +16 -0
  76. package/dist/api/tracing-api.d.ts +31 -0
  77. package/dist/api/tracing-api.js +16 -0
  78. package/dist/dispatcher/hit-test/box-strategies.d.ts +19 -0
  79. package/dist/dispatcher/hit-test/box-strategies.js +275 -0
  80. package/dist/dispatcher/hit-test/box-strategy.d.ts +59 -0
  81. package/dist/dispatcher/hit-test/box-strategy.js +37 -0
  82. package/dist/dispatcher/hit-test/globe-shape.d.ts +46 -0
  83. package/dist/dispatcher/hit-test/globe-shape.js +70 -0
  84. package/dist/dispatcher/hit-test/index.d.ts +14 -0
  85. package/dist/dispatcher/hit-test/index.js +9 -0
  86. package/dist/dispatcher/hit-test/local-frame.d.ts +77 -0
  87. package/dist/dispatcher/hit-test/local-frame.js +112 -0
  88. package/dist/dispatcher/hit-test/segment-grid.d.ts +32 -0
  89. package/dist/dispatcher/hit-test/segment-grid.js +79 -0
  90. package/dist/dispatcher/hit-test/service.d.ts +120 -0
  91. package/dist/dispatcher/hit-test/service.js +333 -0
  92. package/dist/dispatcher/hit-test/strategies/base.d.ts +136 -0
  93. package/dist/dispatcher/hit-test/strategies/base.js +66 -0
  94. package/dist/dispatcher/hit-test/strategies/circle.d.ts +10 -0
  95. package/dist/dispatcher/hit-test/strategies/circle.js +56 -0
  96. package/dist/dispatcher/hit-test/strategies/image.d.ts +22 -0
  97. package/dist/dispatcher/hit-test/strategies/image.js +115 -0
  98. package/dist/dispatcher/hit-test/strategies/index.d.ts +11 -0
  99. package/dist/dispatcher/hit-test/strategies/index.js +10 -0
  100. package/dist/dispatcher/hit-test/strategies/line.d.ts +17 -0
  101. package/dist/dispatcher/hit-test/strategies/line.js +30 -0
  102. package/dist/dispatcher/hit-test/strategies/multi.d.ts +44 -0
  103. package/dist/dispatcher/hit-test/strategies/multi.js +141 -0
  104. package/dist/dispatcher/hit-test/strategies/point.d.ts +20 -0
  105. package/dist/dispatcher/hit-test/strategies/point.js +29 -0
  106. package/dist/dispatcher/hit-test/strategies/polygon.d.ts +52 -0
  107. package/dist/dispatcher/hit-test/strategies/polygon.js +138 -0
  108. package/dist/dispatcher/hit-test/topmost.d.ts +48 -0
  109. package/dist/dispatcher/hit-test/topmost.js +157 -0
  110. package/dist/dispatcher/hit-test/visibility-lookup.d.ts +23 -0
  111. package/dist/dispatcher/hit-test/visibility-lookup.js +40 -0
  112. package/dist/dispatcher/index.d.ts +15 -0
  113. package/dist/dispatcher/index.js +3 -0
  114. package/dist/dispatcher/input-router.d.ts +1 -0
  115. package/dist/dispatcher/input-router.js +288 -0
  116. package/dist/dispatcher/normalizer.d.ts +1 -0
  117. package/dist/dispatcher/normalizer.js +513 -0
  118. package/dist/dispatcher/types.d.ts +144 -0
  119. package/dist/dispatcher/types.js +15 -0
  120. package/dist/display/chunk-set.d.ts +24 -0
  121. package/dist/display/chunk-set.js +533 -0
  122. package/dist/display/chunk.d.ts +1 -0
  123. package/dist/display/chunk.js +104 -0
  124. package/dist/display/columnar/index.d.ts +12 -0
  125. package/dist/display/columnar/index.js +13 -0
  126. package/dist/display/columnar/prepare.d.ts +42 -0
  127. package/dist/display/columnar/prepare.js +116 -0
  128. package/dist/display/columnar/source.d.ts +1 -0
  129. package/dist/display/columnar/source.js +531 -0
  130. package/dist/display/columnar/table.d.ts +1 -0
  131. package/dist/display/columnar/table.js +471 -0
  132. package/dist/display/columnar/types.d.ts +223 -0
  133. package/dist/display/columnar/types.js +3 -0
  134. package/dist/display/dataset.d.ts +2 -0
  135. package/dist/display/dataset.js +891 -0
  136. package/dist/display/index.d.ts +13 -0
  137. package/dist/display/index.js +3 -0
  138. package/dist/display/interaction.d.ts +1 -0
  139. package/dist/display/interaction.js +90 -0
  140. package/dist/display/manager.d.ts +1 -0
  141. package/dist/display/manager.js +440 -0
  142. package/dist/display/packed-rtree.d.ts +1 -0
  143. package/dist/display/packed-rtree.js +244 -0
  144. package/dist/display/partition.d.ts +1 -0
  145. package/dist/display/partition.js +226 -0
  146. package/dist/display/provider.d.ts +1 -0
  147. package/dist/display/provider.js +342 -0
  148. package/dist/display/retained.d.ts +40 -0
  149. package/dist/display/retained.js +898 -0
  150. package/dist/display/selection.d.ts +13 -0
  151. package/dist/display/selection.js +226 -0
  152. package/dist/display/source.d.ts +1 -0
  153. package/dist/display/source.js +119 -0
  154. package/dist/display/spatial.d.ts +1 -0
  155. package/dist/display/spatial.js +71 -0
  156. package/dist/display/style.d.ts +1 -0
  157. package/dist/display/style.js +126 -0
  158. package/dist/display/thinning.d.ts +65 -0
  159. package/dist/display/thinning.js +910 -0
  160. package/dist/display/triangulation.d.ts +1 -0
  161. package/dist/display/triangulation.js +0 -0
  162. package/dist/display/types.d.ts +561 -0
  163. package/dist/display/types.js +43 -0
  164. package/dist/extension/feature-handler.d.ts +182 -0
  165. package/dist/extension/feature-handler.js +3 -0
  166. package/dist/extension/index.d.ts +9 -0
  167. package/dist/extension/index.js +3 -0
  168. package/dist/extension/renderers.d.ts +208 -0
  169. package/dist/extension/renderers.js +3 -0
  170. package/dist/geometry/angle.d.ts +47 -0
  171. package/dist/geometry/angle.js +44 -0
  172. package/dist/geometry/bbox.d.ts +48 -0
  173. package/dist/geometry/bbox.js +83 -0
  174. package/dist/geometry/boolean.d.ts +162 -0
  175. package/dist/geometry/boolean.js +331 -0
  176. package/dist/geometry/buffer.d.ts +72 -0
  177. package/dist/geometry/buffer.js +218 -0
  178. package/dist/geometry/circle.d.ts +55 -0
  179. package/dist/geometry/circle.js +107 -0
  180. package/dist/geometry/coords.d.ts +97 -0
  181. package/dist/geometry/coords.js +149 -0
  182. package/dist/geometry/distance.d.ts +79 -0
  183. package/dist/geometry/distance.js +111 -0
  184. package/dist/geometry/errors.d.ts +74 -0
  185. package/dist/geometry/errors.js +104 -0
  186. package/dist/geometry/index.d.ts +28 -0
  187. package/dist/geometry/index.js +38 -0
  188. package/dist/geometry/measure.d.ts +81 -0
  189. package/dist/geometry/measure.js +236 -0
  190. package/dist/geometry/predicates.d.ts +62 -0
  191. package/dist/geometry/predicates.js +132 -0
  192. package/dist/geometry/simplify.d.ts +74 -0
  193. package/dist/geometry/simplify.js +159 -0
  194. package/dist/geometry/split.d.ts +68 -0
  195. package/dist/geometry/split.js +430 -0
  196. package/dist/geometry/types.d.ts +95 -0
  197. package/dist/geometry/types.js +3 -0
  198. package/dist/geometry/units.d.ts +35 -0
  199. package/dist/geometry/units.js +41 -0
  200. package/dist/index.d.ts +72 -0
  201. package/dist/index.js +20 -0
  202. package/dist/maplibre-gl-draw.d.ts +47 -0
  203. package/dist/maplibre-gl-draw.js +407 -0
  204. package/dist/messages.d.ts +64 -0
  205. package/dist/messages.js +36 -0
  206. package/dist/modes/cursor.d.ts +1 -0
  207. package/dist/modes/cursor.js +72 -0
  208. package/dist/modes/draw/circle.d.ts +1 -0
  209. package/dist/modes/draw/circle.js +222 -0
  210. package/dist/modes/draw/commit-layer.d.ts +26 -0
  211. package/dist/modes/draw/commit-layer.js +31 -0
  212. package/dist/modes/draw/freehand.d.ts +1 -0
  213. package/dist/modes/draw/freehand.js +264 -0
  214. package/dist/modes/draw/image.d.ts +1 -0
  215. package/dist/modes/draw/image.js +60 -0
  216. package/dist/modes/draw/index.d.ts +9 -0
  217. package/dist/modes/draw/index.js +11 -0
  218. package/dist/modes/draw/line.d.ts +1 -0
  219. package/dist/modes/draw/line.js +363 -0
  220. package/dist/modes/draw/point.d.ts +1 -0
  221. package/dist/modes/draw/point.js +87 -0
  222. package/dist/modes/draw/polygon.d.ts +1 -0
  223. package/dist/modes/draw/polygon.js +378 -0
  224. package/dist/modes/draw/trace-support.d.ts +79 -0
  225. package/dist/modes/draw/trace-support.js +161 -0
  226. package/dist/modes/handler.d.ts +285 -0
  227. package/dist/modes/handler.js +3 -0
  228. package/dist/modes/index.d.ts +7 -0
  229. package/dist/modes/index.js +3 -0
  230. package/dist/modes/manager.d.ts +15 -0
  231. package/dist/modes/manager.js +196 -0
  232. package/dist/modes/select/box-selection.d.ts +52 -0
  233. package/dist/modes/select/box-selection.js +140 -0
  234. package/dist/modes/select/click-handler.d.ts +32 -0
  235. package/dist/modes/select/click-handler.js +166 -0
  236. package/dist/modes/select/cursor-handler.d.ts +15 -0
  237. package/dist/modes/select/cursor-handler.js +59 -0
  238. package/dist/modes/select/drag/auxiliary.d.ts +26 -0
  239. package/dist/modes/select/drag/auxiliary.js +56 -0
  240. package/dist/modes/select/drag/intermediate-writes.d.ts +1 -0
  241. package/dist/modes/select/drag/intermediate-writes.js +171 -0
  242. package/dist/modes/select/drag/move.d.ts +24 -0
  243. package/dist/modes/select/drag/move.js +59 -0
  244. package/dist/modes/select/drag/operation.d.ts +30 -0
  245. package/dist/modes/select/drag/operation.js +18 -0
  246. package/dist/modes/select/drag/radius.d.ts +15 -0
  247. package/dist/modes/select/drag/radius.js +49 -0
  248. package/dist/modes/select/drag/transform.d.ts +17 -0
  249. package/dist/modes/select/drag/transform.js +155 -0
  250. package/dist/modes/select/drag/vertex.d.ts +17 -0
  251. package/dist/modes/select/drag/vertex.js +163 -0
  252. package/dist/modes/select/drag-handler.d.ts +1 -0
  253. package/dist/modes/select/drag-handler.js +254 -0
  254. package/dist/modes/select/hit-helpers.d.ts +40 -0
  255. package/dist/modes/select/hit-helpers.js +51 -0
  256. package/dist/modes/select/mode.d.ts +1 -0
  257. package/dist/modes/select/mode.js +397 -0
  258. package/dist/modes/select/shortcut-handler.d.ts +40 -0
  259. package/dist/modes/select/shortcut-handler.js +128 -0
  260. package/dist/operations/index.d.ts +9 -0
  261. package/dist/operations/index.js +3 -0
  262. package/dist/operations/layer-operations.d.ts +1 -0
  263. package/dist/operations/layer-operations.js +350 -0
  264. package/dist/operations/resize.d.ts +71 -0
  265. package/dist/operations/resize.js +252 -0
  266. package/dist/operations/rotate.d.ts +17 -0
  267. package/dist/operations/rotate.js +166 -0
  268. package/dist/operations/selection-operations.d.ts +20 -0
  269. package/dist/operations/selection-operations.js +159 -0
  270. package/dist/operations/shared-vertex.d.ts +1 -0
  271. package/dist/operations/shared-vertex.js +210 -0
  272. package/dist/operations/trace-graph.d.ts +96 -0
  273. package/dist/operations/trace-graph.js +283 -0
  274. package/dist/operations/vertex.d.ts +1 -0
  275. package/dist/operations/vertex.js +538 -0
  276. package/dist/plugins/index.d.ts +10 -0
  277. package/dist/plugins/index.js +3 -0
  278. package/dist/plugins/mutation-hooks.d.ts +28 -0
  279. package/dist/plugins/mutation-hooks.js +84 -0
  280. package/dist/plugins/plugin-context.d.ts +1 -0
  281. package/dist/plugins/plugin-context.js +367 -0
  282. package/dist/plugins/plugin-manager.d.ts +103 -0
  283. package/dist/plugins/plugin-manager.js +316 -0
  284. package/dist/plugins/plugin.d.ts +529 -0
  285. package/dist/plugins/plugin.js +3 -0
  286. package/dist/shared/config/constants.d.ts +66 -0
  287. package/dist/shared/config/constants.js +60 -0
  288. package/dist/shared/config/feature-style.d.ts +155 -0
  289. package/dist/shared/config/feature-style.js +154 -0
  290. package/dist/shared/config/index.d.ts +17 -0
  291. package/dist/shared/config/index.js +8 -0
  292. package/dist/shared/config/rendering.d.ts +107 -0
  293. package/dist/shared/config/rendering.js +33 -0
  294. package/dist/shared/config/selection-highlight.d.ts +29 -0
  295. package/dist/shared/config/selection-highlight.js +35 -0
  296. package/dist/shared/config/selection.d.ts +273 -0
  297. package/dist/shared/config/selection.js +266 -0
  298. package/dist/shared/config/topology.d.ts +33 -0
  299. package/dist/shared/config/topology.js +17 -0
  300. package/dist/shared/config/trace.d.ts +40 -0
  301. package/dist/shared/config/trace.js +17 -0
  302. package/dist/shared/math/angle.d.ts +21 -0
  303. package/dist/shared/math/angle.js +34 -0
  304. package/dist/shared/math/circle.d.ts +6 -0
  305. package/dist/shared/math/circle.js +10 -0
  306. package/dist/shared/math/constants.d.ts +48 -0
  307. package/dist/shared/math/constants.js +59 -0
  308. package/dist/shared/math/distance.d.ts +78 -0
  309. package/dist/shared/math/distance.js +147 -0
  310. package/dist/shared/math/globe-subdivision.d.ts +62 -0
  311. package/dist/shared/math/globe-subdivision.js +99 -0
  312. package/dist/shared/math/index.d.ts +17 -0
  313. package/dist/shared/math/index.js +21 -0
  314. package/dist/shared/math/intersection.d.ts +63 -0
  315. package/dist/shared/math/intersection.js +236 -0
  316. package/dist/shared/math/longitude.d.ts +20 -0
  317. package/dist/shared/math/longitude.js +31 -0
  318. package/dist/shared/math/mercator-plane.d.ts +27 -0
  319. package/dist/shared/math/mercator-plane.js +26 -0
  320. package/dist/shared/math/obb.d.ts +65 -0
  321. package/dist/shared/math/obb.js +107 -0
  322. package/dist/shared/math/rotation.d.ts +93 -0
  323. package/dist/shared/math/rotation.js +186 -0
  324. package/dist/shared/math/segment-grid.d.ts +69 -0
  325. package/dist/shared/math/segment-grid.js +159 -0
  326. package/dist/shared/math/transform.d.ts +140 -0
  327. package/dist/shared/math/transform.js +189 -0
  328. package/dist/shared/types/events.d.ts +128 -0
  329. package/dist/shared/types/events.js +3 -0
  330. package/dist/shared/types/model.d.ts +950 -0
  331. package/dist/shared/types/model.js +3 -0
  332. package/dist/shared/types/selection-box.d.ts +23 -0
  333. package/dist/shared/types/selection-box.js +3 -0
  334. package/dist/shared/types/style.d.ts +68 -0
  335. package/dist/shared/types/style.js +3 -0
  336. package/dist/shared/utils/color.d.ts +49 -0
  337. package/dist/shared/utils/color.js +180 -0
  338. package/dist/shared/utils/coordinates.d.ts +52 -0
  339. package/dist/shared/utils/coordinates.js +75 -0
  340. package/dist/shared/utils/embedded-image.d.ts +34 -0
  341. package/dist/shared/utils/embedded-image.js +161 -0
  342. package/dist/shared/utils/event-emitter.d.ts +262 -0
  343. package/dist/shared/utils/event-emitter.js +44 -0
  344. package/dist/shared/utils/feature-bbox.d.ts +8 -0
  345. package/dist/shared/utils/feature-bbox.js +207 -0
  346. package/dist/shared/utils/feature-segments.d.ts +23 -0
  347. package/dist/shared/utils/feature-segments.js +179 -0
  348. package/dist/shared/utils/id.d.ts +1 -0
  349. package/dist/shared/utils/id.js +35 -0
  350. package/dist/shared/utils/image.d.ts +34 -0
  351. package/dist/shared/utils/image.js +106 -0
  352. package/dist/shared/utils/index.d.ts +15 -0
  353. package/dist/shared/utils/index.js +24 -0
  354. package/dist/shared/utils/map.d.ts +26 -0
  355. package/dist/shared/utils/map.js +35 -0
  356. package/dist/shared/utils/name-generator.d.ts +197 -0
  357. package/dist/shared/utils/name-generator.js +337 -0
  358. package/dist/shared/utils/pixel-ratio.d.ts +111 -0
  359. package/dist/shared/utils/pixel-ratio.js +85 -0
  360. package/dist/shared/utils/property.d.ts +88 -0
  361. package/dist/shared/utils/property.js +140 -0
  362. package/dist/shared/utils/vertex-ref.d.ts +23 -0
  363. package/dist/shared/utils/vertex-ref.js +20 -0
  364. package/dist/snapping/custom-targets.d.ts +1 -0
  365. package/dist/snapping/custom-targets.js +21 -0
  366. package/dist/snapping/geometry.d.ts +1 -0
  367. package/dist/snapping/geometry.js +61 -0
  368. package/dist/snapping/index.d.ts +14 -0
  369. package/dist/snapping/index.js +4 -0
  370. package/dist/snapping/indicator.d.ts +19 -0
  371. package/dist/snapping/indicator.js +145 -0
  372. package/dist/snapping/providers/display.d.ts +72 -0
  373. package/dist/snapping/providers/display.js +268 -0
  374. package/dist/snapping/providers/guide.d.ts +69 -0
  375. package/dist/snapping/providers/guide.js +187 -0
  376. package/dist/snapping/providers/intersection.d.ts +1 -0
  377. package/dist/snapping/providers/intersection.js +92 -0
  378. package/dist/snapping/providers/shared.d.ts +39 -0
  379. package/dist/snapping/providers/shared.js +146 -0
  380. package/dist/snapping/providers/store.d.ts +1 -0
  381. package/dist/snapping/providers/store.js +132 -0
  382. package/dist/snapping/service.d.ts +1 -0
  383. package/dist/snapping/service.js +272 -0
  384. package/dist/snapping/types.d.ts +267 -0
  385. package/dist/snapping/types.js +66 -0
  386. package/dist/store/change-merger.d.ts +1 -0
  387. package/dist/store/change-merger.js +102 -0
  388. package/dist/store/draw-store.d.ts +1 -0
  389. package/dist/store/draw-store.js +396 -0
  390. package/dist/store/event-bridge.d.ts +1 -0
  391. package/dist/store/event-bridge.js +161 -0
  392. package/dist/store/index.d.ts +12 -0
  393. package/dist/store/index.js +4 -0
  394. package/dist/store/local-visibility.d.ts +21 -0
  395. package/dist/store/local-visibility.js +27 -0
  396. package/dist/store/lock.d.ts +67 -0
  397. package/dist/store/lock.js +54 -0
  398. package/dist/store/memory/change-bus.d.ts +60 -0
  399. package/dist/store/memory/change-bus.js +232 -0
  400. package/dist/store/memory/file-store.d.ts +15 -0
  401. package/dist/store/memory/file-store.js +33 -0
  402. package/dist/store/memory/frozen.d.ts +21 -0
  403. package/dist/store/memory/frozen.js +51 -0
  404. package/dist/store/memory/ui-state.d.ts +51 -0
  405. package/dist/store/memory/ui-state.js +223 -0
  406. package/dist/store/memory.d.ts +26 -0
  407. package/dist/store/memory.js +708 -0
  408. package/dist/store/spatial/index.d.ts +6 -0
  409. package/dist/store/spatial/index.js +4 -0
  410. package/dist/store/spatial/spatial-index.d.ts +90 -0
  411. package/dist/store/spatial/spatial-index.js +148 -0
  412. package/dist/store/spatial/store-spatial-index.d.ts +60 -0
  413. package/dist/store/spatial/store-spatial-index.js +125 -0
  414. package/dist/store/store.d.ts +417 -0
  415. package/dist/store/store.js +3 -0
  416. package/dist/store/types.d.ts +8 -0
  417. package/dist/store/types.js +3 -0
  418. package/dist/store/writable-layer.d.ts +35 -0
  419. package/dist/store/writable-layer.js +20 -0
  420. package/dist/view/cache/buffer.d.ts +28 -0
  421. package/dist/view/cache/buffer.js +176 -0
  422. package/dist/view/cache/earcut.d.ts +1 -0
  423. package/dist/view/cache/earcut.js +122 -0
  424. package/dist/view/cache/style-rule.d.ts +1 -0
  425. package/dist/view/cache/style-rule.js +97 -0
  426. package/dist/view/cache/terrain-fill.d.ts +30 -0
  427. package/dist/view/cache/terrain-fill.js +60 -0
  428. package/dist/view/cache/texture.d.ts +14 -0
  429. package/dist/view/cache/texture.js +292 -0
  430. package/dist/view/coordinator.d.ts +27 -0
  431. package/dist/view/coordinator.js +72 -0
  432. package/dist/view/feature-companion.d.ts +173 -0
  433. package/dist/view/feature-companion.js +108 -0
  434. package/dist/view/globe-subdivision.d.ts +78 -0
  435. package/dist/view/globe-subdivision.js +128 -0
  436. package/dist/view/index.d.ts +47 -0
  437. package/dist/view/index.js +20 -0
  438. package/dist/view/layer/attach.d.ts +20 -0
  439. package/dist/view/layer/attach.js +47 -0
  440. package/dist/view/layer/blend.d.ts +57 -0
  441. package/dist/view/layer/blend.js +14 -0
  442. package/dist/view/layer/custom-layer.d.ts +1 -0
  443. package/dist/view/layer/custom-layer.js +509 -0
  444. package/dist/view/layer/depth-state.d.ts +14 -0
  445. package/dist/view/layer/depth-state.js +44 -0
  446. package/dist/view/layer/display-list.d.ts +1 -0
  447. package/dist/view/layer/display-list.js +111 -0
  448. package/dist/view/layer/drape-planner.d.ts +139 -0
  449. package/dist/view/layer/drape-planner.js +726 -0
  450. package/dist/view/layer/frame-render.d.ts +57 -0
  451. package/dist/view/layer/frame-render.js +209 -0
  452. package/dist/view/layer/frame-state.d.ts +147 -0
  453. package/dist/view/layer/frame-state.js +484 -0
  454. package/dist/view/layer/gl-state.d.ts +77 -0
  455. package/dist/view/layer/gl-state.js +132 -0
  456. package/dist/view/layer/index.d.ts +6 -0
  457. package/dist/view/layer/index.js +5 -0
  458. package/dist/view/layer/render-scope.d.ts +30 -0
  459. package/dist/view/layer/render-scope.js +28 -0
  460. package/dist/view/layer/render.d.ts +87 -0
  461. package/dist/view/layer/render.js +187 -0
  462. package/dist/view/layer/renderers.d.ts +81 -0
  463. package/dist/view/layer/renderers.js +142 -0
  464. package/dist/view/layer/slot-manager.d.ts +26 -0
  465. package/dist/view/layer/slot-manager.js +133 -0
  466. package/dist/view/layer/slots.d.ts +33 -0
  467. package/dist/view/layer/slots.js +50 -0
  468. package/dist/view/layer/store-retained-bbox.d.ts +36 -0
  469. package/dist/view/layer/store-retained-bbox.js +188 -0
  470. package/dist/view/layer/store-retained-chunk.d.ts +97 -0
  471. package/dist/view/layer/store-retained-chunk.js +94 -0
  472. package/dist/view/layer/store-retained-classify.d.ts +34 -0
  473. package/dist/view/layer/store-retained-classify.js +88 -0
  474. package/dist/view/layer/store-retained-collect.d.ts +24 -0
  475. package/dist/view/layer/store-retained-collect.js +121 -0
  476. package/dist/view/layer/store-retained-coord-patch.d.ts +119 -0
  477. package/dist/view/layer/store-retained-coord-patch.js +168 -0
  478. package/dist/view/layer/store-retained-immediate.d.ts +63 -0
  479. package/dist/view/layer/store-retained-immediate.js +49 -0
  480. package/dist/view/layer/store-retained-invalidation.d.ts +96 -0
  481. package/dist/view/layer/store-retained-invalidation.js +192 -0
  482. package/dist/view/layer/store-retained.d.ts +198 -0
  483. package/dist/view/layer/store-retained.js +430 -0
  484. package/dist/view/layer/terrain-resolver.d.ts +1 -0
  485. package/dist/view/layer/terrain-resolver.js +174 -0
  486. package/dist/view/renderers/batch-manager.d.ts +61 -0
  487. package/dist/view/renderers/batch-manager.js +718 -0
  488. package/dist/view/renderers/draw-factors.d.ts +60 -0
  489. package/dist/view/renderers/draw-factors.js +35 -0
  490. package/dist/view/renderers/drawer.d.ts +1 -0
  491. package/dist/view/renderers/drawer.js +346 -0
  492. package/dist/view/renderers/image.d.ts +1 -0
  493. package/dist/view/renderers/image.js +255 -0
  494. package/dist/view/renderers/line/dash.d.ts +31 -0
  495. package/dist/view/renderers/line/dash.js +152 -0
  496. package/dist/view/renderers/line/line-geometry.d.ts +39 -0
  497. package/dist/view/renderers/line/line-geometry.js +460 -0
  498. package/dist/view/renderers/line/line-gl.d.ts +1 -0
  499. package/dist/view/renderers/line/line-gl.js +236 -0
  500. package/dist/view/renderers/line/line-shader.d.ts +1 -0
  501. package/dist/view/renderers/line/line-shader.js +364 -0
  502. package/dist/view/renderers/line/line-types.d.ts +43 -0
  503. package/dist/view/renderers/line/line-types.js +3 -0
  504. package/dist/view/renderers/line/line-uniforms.d.ts +1 -0
  505. package/dist/view/renderers/line/line-uniforms.js +390 -0
  506. package/dist/view/renderers/line/sdf-line.d.ts +92 -0
  507. package/dist/view/renderers/line/sdf-line.js +567 -0
  508. package/dist/view/renderers/point/billboard-depth.d.ts +10 -0
  509. package/dist/view/renderers/point/billboard-depth.js +56 -0
  510. package/dist/view/renderers/point/point-instance.d.ts +124 -0
  511. package/dist/view/renderers/point/point-instance.js +738 -0
  512. package/dist/view/renderers/point/point-sdf.d.ts +58 -0
  513. package/dist/view/renderers/point/point-sdf.js +170 -0
  514. package/dist/view/renderers/point/point-shape.d.ts +99 -0
  515. package/dist/view/renderers/point/point-shape.js +504 -0
  516. package/dist/view/renderers/point/point-style.d.ts +1 -0
  517. package/dist/view/renderers/point/point-style.js +46 -0
  518. package/dist/view/renderers/polygon/batch.d.ts +26 -0
  519. package/dist/view/renderers/polygon/batch.js +336 -0
  520. package/dist/view/renderers/polygon/earcut-input.d.ts +37 -0
  521. package/dist/view/renderers/polygon/earcut-input.js +55 -0
  522. package/dist/view/renderers/polygon/earcut-sliced.d.ts +69 -0
  523. package/dist/view/renderers/polygon/earcut-sliced.js +960 -0
  524. package/dist/view/renderers/polygon/fill.d.ts +74 -0
  525. package/dist/view/renderers/polygon/fill.js +251 -0
  526. package/dist/view/renderers/polygon/sdf-polygon.d.ts +62 -0
  527. package/dist/view/renderers/polygon/sdf-polygon.js +919 -0
  528. package/dist/view/renderers/polygon/terrain-cull.d.ts +3 -0
  529. package/dist/view/renderers/polygon/terrain-cull.js +14 -0
  530. package/dist/view/renderers/polygon/triangulator.d.ts +41 -0
  531. package/dist/view/renderers/polygon/triangulator.js +3 -0
  532. package/dist/view/renderers/retained.d.ts +43 -0
  533. package/dist/view/renderers/retained.js +3 -0
  534. package/dist/view/renderers/stroke.d.ts +121 -0
  535. package/dist/view/renderers/stroke.js +621 -0
  536. package/dist/view/shaders/frame.d.ts +8 -0
  537. package/dist/view/shaders/frame.js +37 -0
  538. package/dist/view/shaders/helpers.d.ts +238 -0
  539. package/dist/view/shaders/helpers.js +611 -0
  540. package/dist/view/shaders/initializer.d.ts +27 -0
  541. package/dist/view/shaders/initializer.js +125 -0
  542. package/dist/view/shaders/projection.d.ts +123 -0
  543. package/dist/view/shaders/projection.js +299 -0
  544. package/dist/view/shaders/quad-grid.d.ts +77 -0
  545. package/dist/view/shaders/quad-grid.js +128 -0
  546. package/dist/view/shaders/quad.d.ts +189 -0
  547. package/dist/view/shaders/quad.js +582 -0
  548. package/dist/view/shaders/retained-origin.d.ts +50 -0
  549. package/dist/view/shaders/retained-origin.js +67 -0
  550. package/dist/view/shaders/terrain-shade.d.ts +23 -0
  551. package/dist/view/shaders/terrain-shade.js +93 -0
  552. package/dist/view/style-rule.d.ts +166 -0
  553. package/dist/view/style-rule.js +300 -0
  554. package/dist/view/terrain/anchor.d.ts +135 -0
  555. package/dist/view/terrain/anchor.js +226 -0
  556. package/dist/view/terrain/context.d.ts +132 -0
  557. package/dist/view/terrain/context.js +437 -0
  558. package/dist/view/terrain/dem-atlas.d.ts +97 -0
  559. package/dist/view/terrain/dem-atlas.js +534 -0
  560. package/dist/view/terrain/detect.d.ts +126 -0
  561. package/dist/view/terrain/detect.js +198 -0
  562. package/dist/view/terrain/drape/bin-store.d.ts +179 -0
  563. package/dist/view/terrain/drape/bin-store.js +529 -0
  564. package/dist/view/terrain/drape/binning.d.ts +259 -0
  565. package/dist/view/terrain/drape/binning.js +604 -0
  566. package/dist/view/terrain/drape/edge-constrain.d.ts +37 -0
  567. package/dist/view/terrain/drape/edge-constrain.js +175 -0
  568. package/dist/view/terrain/drape/geometry.d.ts +95 -0
  569. package/dist/view/terrain/drape/geometry.js +260 -0
  570. package/dist/view/terrain/drape/mesh.d.ts +50 -0
  571. package/dist/view/terrain/drape/mesh.js +86 -0
  572. package/dist/view/terrain/drape/pass.d.ts +122 -0
  573. package/dist/view/terrain/drape/pass.js +379 -0
  574. package/dist/view/terrain/drape/quad-glyphs.d.ts +64 -0
  575. package/dist/view/terrain/drape/quad-glyphs.js +117 -0
  576. package/dist/view/terrain/drape/quad.d.ts +249 -0
  577. package/dist/view/terrain/drape/quad.js +835 -0
  578. package/dist/view/terrain/drape/renderer.d.ts +184 -0
  579. package/dist/view/terrain/drape/renderer.js +706 -0
  580. package/dist/view/terrain/drape/shared.d.ts +80 -0
  581. package/dist/view/terrain/drape/shared.js +173 -0
  582. package/dist/view/terrain/drape/stitch.d.ts +155 -0
  583. package/dist/view/terrain/drape/stitch.js +228 -0
  584. package/dist/view/terrain/ground.d.ts +72 -0
  585. package/dist/view/terrain/ground.js +151 -0
  586. package/dist/view/terrain/metrics.d.ts +180 -0
  587. package/dist/view/terrain/metrics.js +231 -0
  588. package/dist/view/terrain/occlusion.d.ts +11 -0
  589. package/dist/view/terrain/occlusion.js +129 -0
  590. package/dist/view/terrain/polygon.d.ts +86 -0
  591. package/dist/view/terrain/polygon.js +301 -0
  592. package/dist/view/terrain/shade.d.ts +48 -0
  593. package/dist/view/terrain/shade.js +45 -0
  594. package/dist/view/terrain/state.d.ts +99 -0
  595. package/dist/view/terrain/state.js +186 -0
  596. package/dist/view/terrain/tessellation.d.ts +265 -0
  597. package/dist/view/terrain/tessellation.js +924 -0
  598. package/dist/view/terrain/tiling.d.ts +56 -0
  599. package/dist/view/terrain/tiling.js +155 -0
  600. package/dist/view/terrain/upstream-terrain.d.ts +82 -0
  601. package/dist/view/terrain/upstream-terrain.js +116 -0
  602. package/dist/view/ui/auxiliary-handles.d.ts +151 -0
  603. package/dist/view/ui/auxiliary-handles.js +22 -0
  604. package/dist/view/ui/bounds.d.ts +53 -0
  605. package/dist/view/ui/bounds.js +149 -0
  606. package/dist/view/ui/box-selection.d.ts +1 -0
  607. package/dist/view/ui/box-selection.js +83 -0
  608. package/dist/view/ui/handle-test.d.ts +1 -0
  609. package/dist/view/ui/handle-test.js +437 -0
  610. package/dist/view/ui/handle-thinning.d.ts +122 -0
  611. package/dist/view/ui/handle-thinning.js +430 -0
  612. package/dist/view/ui/handles.d.ts +25 -0
  613. package/dist/view/ui/handles.js +673 -0
  614. package/dist/view/ui/helper.d.ts +19 -0
  615. package/dist/view/ui/helper.js +76 -0
  616. package/dist/view/ui/index.d.ts +15 -0
  617. package/dist/view/ui/index.js +15 -0
  618. package/dist/view/ui/selection-scope.d.ts +25 -0
  619. package/dist/view/ui/selection-scope.js +34 -0
  620. package/dist/view/ui/selection-ui/bounding-box.d.ts +44 -0
  621. package/dist/view/ui/selection-ui/bounding-box.js +240 -0
  622. package/dist/view/ui/selection-ui/extension-registry.d.ts +76 -0
  623. package/dist/view/ui/selection-ui/extension-registry.js +78 -0
  624. package/dist/view/ui/selection-ui/index.d.ts +12 -0
  625. package/dist/view/ui/selection-ui/index.js +12 -0
  626. package/dist/view/ui/selection-ui/renderer.d.ts +29 -0
  627. package/dist/view/ui/selection-ui/renderer.js +227 -0
  628. package/dist/view/ui/selection-ui/types.d.ts +55 -0
  629. package/dist/view/ui/selection-ui/types.js +3 -0
  630. package/dist/view/ui/selection-ui-drawer.d.ts +52 -0
  631. package/dist/view/ui/selection-ui-drawer.js +329 -0
  632. package/dist/view/ui/tentative.d.ts +1 -0
  633. package/dist/view/ui/tentative.js +320 -0
  634. package/dist/view/viewport.d.ts +119 -0
  635. package/dist/view/viewport.js +254 -0
  636. package/package.json +113 -0
@@ -0,0 +1,292 @@
1
+ // SPDX-FileCopyrightText: 2026 SAKAIDA Atsushi
2
+ // SPDX-License-Identifier: AGPL-3.0-only
3
+ /**
4
+ * TextureCache
5
+ *
6
+ * Manages the images of Image features as cached WebGL textures.
7
+ *
8
+ * Every texture is uploaded while the engine is rendering (inside the custom layer's render),
9
+ * never from a callback such as `img.onload`: the GL context is shared with maplibre, and
10
+ * outside a render call its state belongs to maplibre. An image is decoded asynchronously and
11
+ * kept as a decoded image; the next frame that asks for it uploads it.
12
+ */
13
+ import { isEmbeddedImageDataUrl } from '../../shared/utils/embedded-image.js';
14
+ /**
15
+ * TextureCache
16
+ *
17
+ * @internal
18
+ */
19
+ export class TextureCache {
20
+ constructor(gl, maxCacheSize = 500) {
21
+ Object.defineProperty(this, "gl", {
22
+ enumerable: true,
23
+ configurable: true,
24
+ writable: true,
25
+ value: void 0
26
+ });
27
+ Object.defineProperty(this, "imageCache", {
28
+ enumerable: true,
29
+ configurable: true,
30
+ writable: true,
31
+ value: new Map()
32
+ });
33
+ Object.defineProperty(this, "maxCacheSize", {
34
+ enumerable: true,
35
+ configurable: true,
36
+ writable: true,
37
+ value: void 0
38
+ });
39
+ /** Images decoded and waiting for their upload, by src */
40
+ Object.defineProperty(this, "decodedImages", {
41
+ enumerable: true,
42
+ configurable: true,
43
+ writable: true,
44
+ value: new Map()
45
+ });
46
+ /** Decodes in progress, by src (one decode per src, shared by every caller) */
47
+ Object.defineProperty(this, "loadingImages", {
48
+ enumerable: true,
49
+ configurable: true,
50
+ writable: true,
51
+ value: new Map()
52
+ });
53
+ /**
54
+ * srcs whose decode failed, with the error (not retried every frame; invalidateImage
55
+ * forgets them)
56
+ */
57
+ Object.defineProperty(this, "failedImages", {
58
+ enumerable: true,
59
+ configurable: true,
60
+ writable: true,
61
+ value: new Map()
62
+ });
63
+ /** Set by dispose(); a decode that finishes afterwards is dropped */
64
+ Object.defineProperty(this, "disposed", {
65
+ enumerable: true,
66
+ configurable: true,
67
+ writable: true,
68
+ value: false
69
+ });
70
+ /** MAX_TEXTURE_SIZE of the context (read once, 0 = not read yet) */
71
+ Object.defineProperty(this, "maxTextureSize", {
72
+ enumerable: true,
73
+ configurable: true,
74
+ writable: true,
75
+ value: 0
76
+ });
77
+ this.gl = gl;
78
+ this.maxCacheSize = maxCacheSize;
79
+ }
80
+ /**
81
+ * The texture of an image, uploaded in this call if its decode has finished
82
+ *
83
+ * Call it while rendering. It returns null while the image is not decoded yet; the decode is
84
+ * started once per src (every caller shares it), and `onReady` is called when it finishes so
85
+ * that a frame can be requested. A decode that finishes after dispose() is dropped.
86
+ *
87
+ * @param src An embedded PNG/JPEG/WebP/GIF data URL
88
+ * @param onReady Called when the decode has finished (not called on failure)
89
+ * @param onError Called when the decode fails or the src is refused. Only the call that
90
+ * starts the decode is told; a later caller reads the failure with `getImageError`
91
+ */
92
+ acquireImageTexture(src, onReady, onError) {
93
+ const cached = this.getImageTextureSync(src);
94
+ if (cached)
95
+ return cached;
96
+ const decoded = this.decodedImages.get(src);
97
+ if (decoded) {
98
+ this.decodedImages.delete(src);
99
+ return this.uploadImage(src, decoded);
100
+ }
101
+ if (this.failedImages.has(src) || this.loadingImages.has(src))
102
+ return null;
103
+ this.decodeImage(src).then(() => onReady?.(), (error) => {
104
+ this.failedImages.set(src, error);
105
+ onError?.(error);
106
+ });
107
+ return null;
108
+ }
109
+ /**
110
+ * The error of a src whose decode failed, or null (not failed, or not tried yet)
111
+ */
112
+ getImageError(src) {
113
+ return this.failedImages.get(src) ?? null;
114
+ }
115
+ /**
116
+ * Decodes an image (the shared decode of a src while one is in progress)
117
+ */
118
+ decodeImage(src) {
119
+ const loading = this.loadingImages.get(src);
120
+ if (loading)
121
+ return loading;
122
+ // Only embedded raster images are decoded. Any other URL would make every viewer of the
123
+ // data send a request to an outside host (the data may come from another participant).
124
+ if (!isEmbeddedImageDataUrl(src)) {
125
+ return Promise.reject(new Error('Refused to load an image that is not an embedded PNG/JPEG/WebP/GIF data URL'));
126
+ }
127
+ const promise = new Promise((resolve, reject) => {
128
+ const img = new Image();
129
+ img.crossOrigin = 'anonymous';
130
+ img.onload = () => {
131
+ this.loadingImages.delete(src);
132
+ // Only the decoded image is kept here; the upload happens in the next render
133
+ if (!this.disposed)
134
+ this.decodedImages.set(src, img);
135
+ resolve();
136
+ };
137
+ img.onerror = () => {
138
+ this.loadingImages.delete(src);
139
+ reject(new Error(`Failed to load image: ${src.slice(0, 64)}`));
140
+ };
141
+ img.src = src;
142
+ });
143
+ this.loadingImages.set(src, promise);
144
+ return promise;
145
+ }
146
+ /**
147
+ * Uploads a decoded image and caches its texture
148
+ *
149
+ * An image larger than MAX_TEXTURE_SIZE is scaled down to fit (texImage2D would fail and the
150
+ * image would silently be missing). The info keeps the size of the image itself, which is what
151
+ * its display size is derived from.
152
+ */
153
+ uploadImage(src, img) {
154
+ if (this.imageCache.size >= this.maxCacheSize) {
155
+ this.evictOldestImage();
156
+ }
157
+ const texture = uploadRgbaTexture(this.gl, this.fitToTextureSize(img), true);
158
+ if (!texture)
159
+ return null;
160
+ const entry = {
161
+ texture,
162
+ width: img.width,
163
+ height: img.height,
164
+ lastUsed: Date.now(),
165
+ };
166
+ this.imageCache.set(src, entry);
167
+ return { texture, width: img.width, height: img.height };
168
+ }
169
+ /**
170
+ * The image itself, or a copy scaled down to MAX_TEXTURE_SIZE when it is larger
171
+ */
172
+ fitToTextureSize(img) {
173
+ if (this.maxTextureSize === 0) {
174
+ const max = Number(this.gl.getParameter(this.gl.MAX_TEXTURE_SIZE));
175
+ this.maxTextureSize = Number.isFinite(max) && max > 0 ? max : 4096;
176
+ }
177
+ const max = this.maxTextureSize;
178
+ if (img.width <= max && img.height <= max)
179
+ return img;
180
+ const scale = max / Math.max(img.width, img.height);
181
+ const canvas = document.createElement('canvas');
182
+ canvas.width = Math.max(1, Math.floor(img.width * scale));
183
+ canvas.height = Math.max(1, Math.floor(img.height * scale));
184
+ canvas.getContext('2d')?.drawImage(img, 0, 0, canvas.width, canvas.height);
185
+ return canvas;
186
+ }
187
+ /**
188
+ * Gets an image texture synchronously (only when it is already cached)
189
+ */
190
+ getImageTextureSync(src) {
191
+ const cached = this.imageCache.get(src);
192
+ if (cached) {
193
+ cached.lastUsed = Date.now();
194
+ return {
195
+ texture: cached.texture,
196
+ width: cached.width,
197
+ height: cached.height,
198
+ };
199
+ }
200
+ return null;
201
+ }
202
+ /**
203
+ * Deletes the oldest image entry
204
+ */
205
+ evictOldestImage() {
206
+ let oldestKey = null;
207
+ let oldestTime = Infinity;
208
+ for (const [key, entry] of this.imageCache) {
209
+ if (entry.lastUsed < oldestTime) {
210
+ oldestTime = entry.lastUsed;
211
+ oldestKey = key;
212
+ }
213
+ }
214
+ if (oldestKey) {
215
+ const entry = this.imageCache.get(oldestKey);
216
+ if (entry) {
217
+ this.gl.deleteTexture(entry.texture);
218
+ }
219
+ this.imageCache.delete(oldestKey);
220
+ }
221
+ }
222
+ /**
223
+ * Invalidates a specific image cache entry
224
+ */
225
+ invalidateImage(src) {
226
+ this.decodedImages.delete(src);
227
+ this.failedImages.delete(src);
228
+ const entry = this.imageCache.get(src);
229
+ if (entry) {
230
+ this.gl.deleteTexture(entry.texture);
231
+ this.imageCache.delete(src);
232
+ }
233
+ }
234
+ /**
235
+ * Clears the whole cache
236
+ */
237
+ clear() {
238
+ for (const entry of this.imageCache.values()) {
239
+ this.gl.deleteTexture(entry.texture);
240
+ }
241
+ this.imageCache.clear();
242
+ this.decodedImages.clear();
243
+ }
244
+ /**
245
+ * Disposes of the resources
246
+ *
247
+ * A decode still in progress is dropped when it finishes (it never reaches the GL context).
248
+ */
249
+ dispose() {
250
+ this.disposed = true;
251
+ this.clear();
252
+ }
253
+ }
254
+ /**
255
+ * Uploads an image to a new RGBA texture with the unpack state the engine's shaders expect
256
+ *
257
+ * The shaders output colors that are not premultiplied and read the image with its first row at
258
+ * the top, so the upload sets `UNPACK_PREMULTIPLY_ALPHA_WEBGL` and `UNPACK_FLIP_Y_WEBGL` to
259
+ * false explicitly instead of inheriting whatever maplibre left in the context. The pixel store
260
+ * and the texture binding are borrowed and given back (maplibre-coupling.md): the values found
261
+ * are restored after the upload.
262
+ *
263
+ * @param mipmap Whether to build mipmaps (for images, which are often drawn smaller than their
264
+ * size)
265
+ * @returns The texture, or null when it cannot be created (a lost context)
266
+ */
267
+ export function uploadRgbaTexture(gl, source, mipmap) {
268
+ const texture = gl.createTexture();
269
+ if (!texture)
270
+ return null;
271
+ const previousTexture = gl.getParameter(gl.TEXTURE_BINDING_2D);
272
+ const previousFlipY = gl.getParameter(gl.UNPACK_FLIP_Y_WEBGL) === true;
273
+ const previousPremultiply = gl.getParameter(gl.UNPACK_PREMULTIPLY_ALPHA_WEBGL) === true;
274
+ gl.pixelStorei(gl.UNPACK_FLIP_Y_WEBGL, false);
275
+ gl.pixelStorei(gl.UNPACK_PREMULTIPLY_ALPHA_WEBGL, false);
276
+ gl.bindTexture(gl.TEXTURE_2D, texture);
277
+ gl.texImage2D(gl.TEXTURE_2D, 0, gl.RGBA, gl.RGBA, gl.UNSIGNED_BYTE, source);
278
+ gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_S, gl.CLAMP_TO_EDGE);
279
+ gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_T, gl.CLAMP_TO_EDGE);
280
+ gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, gl.LINEAR);
281
+ if (mipmap) {
282
+ gl.generateMipmap(gl.TEXTURE_2D);
283
+ gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, gl.LINEAR_MIPMAP_LINEAR);
284
+ }
285
+ else {
286
+ gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, gl.LINEAR);
287
+ }
288
+ gl.bindTexture(gl.TEXTURE_2D, previousTexture);
289
+ gl.pixelStorei(gl.UNPACK_FLIP_Y_WEBGL, previousFlipY);
290
+ gl.pixelStorei(gl.UNPACK_PREMULTIPLY_ALPHA_WEBGL, previousPremultiply);
291
+ return texture;
292
+ }
@@ -0,0 +1,27 @@
1
+ /**
2
+ * RenderCoordinator
3
+ *
4
+ * Subscribes to the Store and automatically triggers a repaint when the state changes.
5
+ * This removes the need for each mode to call requestRepaint() explicitly.
6
+ */
7
+ import type { Map as MapLibreMap } from 'maplibre-gl';
8
+ import type { Store } from '../store/store.js';
9
+ /**
10
+ * Dependencies of RenderCoordinator
11
+ */
12
+ export interface RenderCoordinatorDeps {
13
+ map: MapLibreMap;
14
+ store: Store;
15
+ }
16
+ /**
17
+ * RenderCoordinator implementation
18
+ */
19
+ export declare class RenderCoordinatorImpl implements RenderCoordinator {
20
+ private map;
21
+ private store;
22
+ private unsubscribe;
23
+ constructor(deps: RenderCoordinatorDeps);
24
+ start(): void;
25
+ stop(): void;
26
+ requestRender(): void;
27
+ }
@@ -0,0 +1,72 @@
1
+ // SPDX-FileCopyrightText: 2026 SAKAIDA Atsushi
2
+ // SPDX-License-Identifier: AGPL-3.0-only
3
+ /**
4
+ * Determines whether a change requires a repaint
5
+ */
6
+ function shouldRepaint(changes) {
7
+ // A repaint is required if any of the following changed
8
+ return !!((changes.features || // creation, update or deletion of features
9
+ changes.layers || // layer changes
10
+ changes.groups || // group changes (reordering, show/hide)
11
+ changes.layerReorder || // reordering of items within a layer
12
+ changes.groupReorder || // reordering of features within a group
13
+ changes.selection || // selection state changes
14
+ changes.tentative || // changes to the transient state while drawing
15
+ changes.uiStateChanged) // changes to the UI state (dragState, boxSelection)
16
+ );
17
+ }
18
+ /**
19
+ * RenderCoordinator implementation
20
+ */
21
+ export class RenderCoordinatorImpl {
22
+ constructor(deps) {
23
+ Object.defineProperty(this, "map", {
24
+ enumerable: true,
25
+ configurable: true,
26
+ writable: true,
27
+ value: void 0
28
+ });
29
+ Object.defineProperty(this, "store", {
30
+ enumerable: true,
31
+ configurable: true,
32
+ writable: true,
33
+ value: void 0
34
+ });
35
+ Object.defineProperty(this, "unsubscribe", {
36
+ enumerable: true,
37
+ configurable: true,
38
+ writable: true,
39
+ value: null
40
+ });
41
+ this.map = deps.map;
42
+ this.store = deps.store;
43
+ }
44
+ start() {
45
+ // Do nothing if already subscribed
46
+ if (this.unsubscribe) {
47
+ return;
48
+ }
49
+ this.unsubscribe = this.store.subscribe((changes) => {
50
+ if (shouldRepaint(changes)) {
51
+ this.map.triggerRepaint();
52
+ }
53
+ });
54
+ }
55
+ stop() {
56
+ if (this.unsubscribe) {
57
+ this.unsubscribe();
58
+ this.unsubscribe = null;
59
+ }
60
+ }
61
+ requestRender() {
62
+ this.map.triggerRepaint();
63
+ }
64
+ }
65
+ /**
66
+ * Creates a RenderCoordinator
67
+ *
68
+ * @internal
69
+ */
70
+ export function createRenderCoordinator(deps) {
71
+ return new RenderCoordinatorImpl(deps);
72
+ }
@@ -0,0 +1,173 @@
1
+ /**
2
+ * The extension point for companion rendering and companion hits (feature companion)
3
+ *
4
+ * A hook for the extension implementation to add "things that are not the feature itself,
5
+ * but that accompany the feature, are drawn at the same z position, and are grabbable in
6
+ * that same z order". core knows nothing at all about what a companion means (it only asks
7
+ * where they are with has, lets them draw with draw, asks for hits with hitTest, and hands
8
+ * a click that hit back to the provider).
9
+ *
10
+ * Rendering and hit testing are given to the same provider so that what is visible and
11
+ * what is grabbable agree (they are resolved at the same position in the z scan).
12
+ *
13
+ * Where they are called:
14
+ * - Rendering: immediately before the feature itself is drawn (= one step lower in the
15
+ * z order). core flushes the batch in progress before and after the call to keep z
16
+ * consistency
17
+ * - Hits: in the front-to-back scan of a click, immediately after the test of the feature
18
+ * itself misses and before moving on to the next (one step further back) feature
19
+ *
20
+ * `has` is called for every feature inside the per-frame z scan and the hit scan, so it
21
+ * must be O(1) (an index, or an O(1) derivation from the feature). As long as it returns
22
+ * false, no batch flush, no draw and no hitTest happen at all, and the conventional
23
+ * rendering efficiency and hit testing path are kept as they were.
24
+ *
25
+ * Unlike the extension points of auxiliary handles and the selection UI, there is one
26
+ * registry per draw instance (createFeatureCompanionRegistry). When several instances
27
+ * (the hidden renderers of printing and thumbnails) hold different Stores that have the
28
+ * same feature ids, the provider has no way to tell "is this a feature of my own Store?"
29
+ * (a replaced DocumentStore may return a new object from getFeature every time, so identity
30
+ * cannot be used), so ownership is expressed by separating the registries.
31
+ */
32
+ import type { ProjectionData } from 'maplibre-gl';
33
+ import type { CustomRendererDrawContext } from '../extension/index.js';
34
+ import type { LngLat, ScreenPoint } from '../shared/math/index.js';
35
+ import type { Coordinate, Feature } from '../store/types.js';
36
+ /**
37
+ * A hit on a companion, as returned by {@link FeatureCompanionProvider.hitTest}.
38
+ *
39
+ * core does not interpret the contents. The provider puts its own identifier in and
40
+ * receives it back through `onCompanionClick`.
41
+ */
42
+ export interface CompanionHit {
43
+ /** The identifier inside the provider */
44
+ id: string;
45
+ }
46
+ /**
47
+ * The context passed to {@link FeatureCompanionProvider.hitTest}.
48
+ *
49
+ * A minimal structure holding the point being tested (screen px) plus the coordinate
50
+ * transform, the zoom and the click tolerance. The coordinate transform follows the same
51
+ * style as the context of auxiliary handles (AuxiliaryHandleContext)
52
+ * (geographic coordinates [lng, lat] <-> screen px).
53
+ */
54
+ export interface CompanionHitContext {
55
+ /** The point being tested (screen px) */
56
+ point: ScreenPoint;
57
+ /** Geographic coordinates -> screen px */
58
+ project(lngLat: Coordinate): ScreenPoint;
59
+ /** Screen px -> geographic coordinates */
60
+ unproject(point: ScreenPoint): LngLat;
61
+ /** The current zoom level */
62
+ zoom: number;
63
+ /** The click tolerance (screen px; the same value as core's hit testing setting) */
64
+ tolerancePx: number;
65
+ }
66
+ /**
67
+ * Draws something that accompanies a feature (a label, a callout) right below it in the
68
+ * draw order, and makes it clickable in the same order.
69
+ *
70
+ * Register one with `draw.registerFeatureCompanionProvider(provider)`. What is drawn and what
71
+ * is hit are resolved at the same position of the z order, so what is visible is what can be
72
+ * grabbed. A click on a companion does not change the selection; it is handed to
73
+ * `onCompanionClick`.
74
+ */
75
+ export interface FeatureCompanionProvider {
76
+ /** An identifier unique within the registry (re-registering with the same id overwrites) */
77
+ id: string;
78
+ /**
79
+ * Whether this feature has companions.
80
+ *
81
+ * It is called for every feature in the per-frame z scan and the hit scan, so it must
82
+ * be O(1).
83
+ */
84
+ has(feature: Feature): boolean;
85
+ /**
86
+ * Called immediately before the feature itself (= one z step lower).
87
+ *
88
+ * core flushes the batch in progress before and after the call, so what is drawn always
89
+ * comes below this feature and above the feature one step further back.
90
+ */
91
+ draw(feature: Feature, projectionData: ProjectionData, zoom: number, context: CustomRendererDrawContext): void;
92
+ /**
93
+ * Called in the z scan of click resolution, after the feature itself misses and before
94
+ * the next feature.
95
+ *
96
+ * If it returns a hit, core consumes that click (it does not change the selection state,
97
+ * nor does it clear the selection as an empty click would) and calls
98
+ * `onCompanionClick`.
99
+ */
100
+ hitTest(feature: Feature, point: ScreenPoint, context: CompanionHitContext): CompanionHit | null;
101
+ /**
102
+ * The notification of a consumed click.
103
+ *
104
+ * @param featureId The ID of the feature that owns the companion
105
+ * @param hit The hit returned by hitTest
106
+ */
107
+ onCompanionClick(featureId: string, hit: CompanionHit): void;
108
+ }
109
+ /**
110
+ * A companion hit resolved in the z scan, with the provider and the feature it belongs to.
111
+ */
112
+ export interface FeatureCompanionHitResult {
113
+ /** The id of the provider that returned the hit */
114
+ providerId: string;
115
+ /** The id of the feature that owns the companion */
116
+ featureId: string;
117
+ /** The hit as the provider returned it */
118
+ hit: CompanionHit;
119
+ }
120
+ /**
121
+ * The registered {@link FeatureCompanionProvider}s of one draw instance.
122
+ *
123
+ * One is held per draw instance. It has the same scope as the renderers of custom type
124
+ * features (customLayer.registerFeatureRenderer), so the providers of other instances
125
+ * (the hidden renderers of printing, thumbnails and previews) do not get mixed in.
126
+ *
127
+ * It must not be made a module-level singleton. A provider closes over its own Store, and
128
+ * feature IDs agree across several instances when the document is the same, so sharing it
129
+ * would draw things twice with the geometry of another instance's Store. The provider
130
+ * cannot tell "is this my own feature?" (depending on the Store implementation, getFeature
131
+ * builds a different object every time, so object identity cannot be used). Ownership is
132
+ * expressed by separating the registries.
133
+ */
134
+ export interface FeatureCompanionRegistry {
135
+ /**
136
+ * Registers a provider
137
+ *
138
+ * @returns The function that cancels the registration (calling it after a re-registration
139
+ * with the same id does not remove the provider that came in later)
140
+ */
141
+ register(provider: FeatureCompanionProvider): () => void;
142
+ /** Gets a registered provider by id */
143
+ get(id: string): FeatureCompanionProvider | undefined;
144
+ /** Enumerates the registered providers (in registration order) */
145
+ list(): FeatureCompanionProvider[];
146
+ /**
147
+ * Whether even one provider is registered
148
+ *
149
+ * An O(1) early exit looked at once at the entrance of a scan. If false, the path is the
150
+ * conventional one.
151
+ */
152
+ any(): boolean;
153
+ /**
154
+ * The generation number (for deciding cache invalidation)
155
+ *
156
+ * It increases on every registration and cancellation. The cache of retained mode
157
+ * (view/layer/store-retained) caches the classification that "cuts features having
158
+ * companions out into the immediate rendering run", and that classification can change
159
+ * as registrations come and go. Watch the generation number change and discard the cache.
160
+ */
161
+ generation(): number;
162
+ /** Cancels all registrations */
163
+ clear(): void;
164
+ /** Whether there is a provider that has companions for this feature */
165
+ has(feature: Feature): boolean;
166
+ }
167
+ /**
168
+ * Creates an empty {@link FeatureCompanionRegistry}, for testing a provider in isolation.
169
+ * Each draw instance holds its own; do not share one between instances.
170
+ *
171
+ * @returns A new registry with no provider
172
+ */
173
+ export declare function createFeatureCompanionRegistry(): FeatureCompanionRegistry;
@@ -0,0 +1,108 @@
1
+ // SPDX-FileCopyrightText: 2026 SAKAIDA Atsushi
2
+ // SPDX-License-Identifier: AGPL-3.0-only
3
+ /**
4
+ * Creates an empty {@link FeatureCompanionRegistry}, for testing a provider in isolation.
5
+ * Each draw instance holds its own; do not share one between instances.
6
+ *
7
+ * @returns A new registry with no provider
8
+ */
9
+ export function createFeatureCompanionRegistry() {
10
+ const providers = new Map();
11
+ let generation = 0;
12
+ return {
13
+ register(provider) {
14
+ providers.set(provider.id, provider);
15
+ generation++;
16
+ return () => {
17
+ if (providers.get(provider.id) === provider) {
18
+ providers.delete(provider.id);
19
+ generation++;
20
+ }
21
+ };
22
+ },
23
+ get: (id) => providers.get(id),
24
+ list: () => [...providers.values()],
25
+ any: () => providers.size > 0,
26
+ generation: () => generation,
27
+ clear() {
28
+ if (providers.size === 0)
29
+ return;
30
+ providers.clear();
31
+ generation++;
32
+ },
33
+ has(feature) {
34
+ if (providers.size === 0)
35
+ return false;
36
+ for (const provider of providers.values()) {
37
+ if (provider.has(feature))
38
+ return true;
39
+ }
40
+ return false;
41
+ },
42
+ };
43
+ }
44
+ /**
45
+ * Draws the things accompanying a feature after closing the batch frame (registration order)
46
+ *
47
+ * A batch is not painted until endFrame, so without a flush here the companions would be
48
+ * drawn before the features further back within the same layer (the same reason as the
49
+ * immediate rendering of custom type features). Once drawing is done, the frame is opened
50
+ * again for the features that follow.
51
+ *
52
+ * For features without companions, neither endFrame nor beginFrame is called. As long as
53
+ * has is false, the conventional batching efficiency is not harmed at all.
54
+ *
55
+ * @param restoreBlendState Restores the blend state that an external renderer may have
56
+ * rewritten (if omitted, nothing is restored)
57
+ * @returns Whether even one thing was drawn
58
+ *
59
+ * @internal
60
+ */
61
+ export function drawFeatureCompanionsInFrame(registry, feature, batch, projectionData, zoom, layer, context, restoreBlendState) {
62
+ if (!registry.any())
63
+ return false;
64
+ let drawn = false;
65
+ for (const provider of registry.list()) {
66
+ if (!provider.has(feature))
67
+ continue;
68
+ if (!drawn) {
69
+ batch.endFrame();
70
+ drawn = true;
71
+ }
72
+ provider.draw(feature, projectionData, zoom, context);
73
+ }
74
+ if (drawn) {
75
+ restoreBlendState?.();
76
+ batch.beginFrame(projectionData, zoom, layer);
77
+ }
78
+ return drawn;
79
+ }
80
+ /**
81
+ * Asks for hits on the things accompanying a feature (registration order; returns the
82
+ * first one that hits)
83
+ *
84
+ * @internal
85
+ */
86
+ export function hitTestFeatureCompanions(registry, feature, context) {
87
+ if (!registry.any())
88
+ return null;
89
+ for (const provider of registry.list()) {
90
+ if (!provider.has(feature))
91
+ continue;
92
+ const hit = provider.hitTest(feature, context.point, context);
93
+ if (hit)
94
+ return { providerId: provider.id, featureId: feature.id, hit };
95
+ }
96
+ return null;
97
+ }
98
+ /**
99
+ * Hands a consumed click back to the provider
100
+ *
101
+ * If the provider has already been unregistered, nothing happens (the click stays
102
+ * consumed and the selection state does not change).
103
+ *
104
+ * @internal
105
+ */
106
+ export function notifyFeatureCompanionClick(registry, result) {
107
+ registry.get(result.providerId)?.onCompanionClick(result.featureId, result.hit);
108
+ }