ol 9.2.5-sh.1 → 10.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 (674) hide show
  1. package/Collection.d.ts +1 -1
  2. package/Collection.d.ts.map +1 -1
  3. package/DataTile.d.ts +15 -1
  4. package/DataTile.d.ts.map +1 -1
  5. package/DataTile.js +26 -1
  6. package/Feature.d.ts +1 -1
  7. package/Feature.d.ts.map +1 -1
  8. package/Geolocation.d.ts +2 -2
  9. package/Geolocation.d.ts.map +1 -1
  10. package/Geolocation.js +1 -0
  11. package/Image.d.ts +4 -4
  12. package/Image.d.ts.map +1 -1
  13. package/ImageCanvas.d.ts +2 -1
  14. package/ImageCanvas.d.ts.map +1 -1
  15. package/ImageCanvas.js +2 -0
  16. package/ImageTile.d.ts.map +1 -1
  17. package/ImageTile.js +1 -1
  18. package/Map.d.ts +5 -4
  19. package/Map.d.ts.map +1 -1
  20. package/Map.js +15 -14
  21. package/MapBrowserEvent.d.ts +4 -2
  22. package/MapBrowserEvent.d.ts.map +1 -1
  23. package/MapBrowserEvent.js +4 -0
  24. package/MapBrowserEventHandler.d.ts +4 -1
  25. package/MapBrowserEventHandler.d.ts.map +1 -1
  26. package/MapBrowserEventHandler.js +4 -0
  27. package/MapBrowserEventType.d.ts +1 -1
  28. package/MapEvent.d.ts.map +1 -1
  29. package/MapEventType.d.ts +1 -1
  30. package/Object.d.ts.map +1 -1
  31. package/ObjectEventType.d.ts +1 -1
  32. package/Observable.d.ts +2 -2
  33. package/Observable.d.ts.map +1 -1
  34. package/Overlay.d.ts +2 -2
  35. package/Overlay.d.ts.map +1 -1
  36. package/Overlay.js +2 -2
  37. package/README.md +1 -1
  38. package/Tile.d.ts +10 -30
  39. package/Tile.d.ts.map +1 -1
  40. package/Tile.js +6 -79
  41. package/TileCache.d.ts +2 -1
  42. package/TileCache.d.ts.map +1 -1
  43. package/TileCache.js +4 -0
  44. package/TileQueue.d.ts +3 -2
  45. package/TileQueue.d.ts.map +1 -1
  46. package/TileQueue.js +7 -4
  47. package/VectorRenderTile.d.ts +11 -16
  48. package/VectorRenderTile.d.ts.map +1 -1
  49. package/VectorRenderTile.js +19 -24
  50. package/VectorTile.d.ts +20 -17
  51. package/VectorTile.d.ts.map +1 -1
  52. package/VectorTile.js +14 -10
  53. package/View.d.ts +1 -1
  54. package/View.d.ts.map +1 -1
  55. package/array.d.ts +2 -2
  56. package/array.d.ts.map +1 -1
  57. package/asserts.d.ts.map +1 -1
  58. package/centerconstraint.d.ts.map +1 -1
  59. package/color.d.ts.map +1 -1
  60. package/color.js +2 -2
  61. package/console.d.ts +1 -1
  62. package/console.d.ts.map +1 -1
  63. package/control/Attribution.d.ts.map +1 -1
  64. package/control/Attribution.js +5 -12
  65. package/control/Control.d.ts.map +1 -1
  66. package/control/Control.js +4 -6
  67. package/control/FullScreen.d.ts +1 -1
  68. package/control/FullScreen.d.ts.map +1 -1
  69. package/control/FullScreen.js +1 -0
  70. package/control/MousePosition.d.ts +1 -1
  71. package/control/MousePosition.d.ts.map +1 -1
  72. package/control/MousePosition.js +1 -0
  73. package/control/OverviewMap.d.ts.map +1 -1
  74. package/control/OverviewMap.js +16 -13
  75. package/control/Rotate.d.ts +4 -1
  76. package/control/Rotate.d.ts.map +1 -1
  77. package/control/Rotate.js +3 -0
  78. package/control/ScaleLine.d.ts +3 -3
  79. package/control/ScaleLine.d.ts.map +1 -1
  80. package/control/ZoomSlider.d.ts.map +1 -1
  81. package/control/ZoomSlider.js +1 -0
  82. package/control/ZoomToExtent.d.ts.map +1 -1
  83. package/control/defaults.d.ts.map +1 -1
  84. package/coordinate.d.ts +1 -1
  85. package/coordinate.d.ts.map +1 -1
  86. package/css.d.ts.map +1 -1
  87. package/dist/ol.d.ts +10 -8
  88. package/dist/ol.d.ts.map +1 -1
  89. package/dist/ol.js +1 -3
  90. package/dist/ol.js.map +1 -1
  91. package/dom.d.ts +0 -5
  92. package/dom.d.ts.map +1 -1
  93. package/dom.js +1 -9
  94. package/events/SnapEvent.d.ts.map +1 -1
  95. package/events/Target.d.ts.map +1 -1
  96. package/events/Target.js +1 -0
  97. package/events/condition.d.ts +2 -2
  98. package/events/condition.d.ts.map +1 -1
  99. package/events/condition.js +1 -1
  100. package/events.d.ts.map +1 -1
  101. package/events.js +6 -4
  102. package/expr/cpu.d.ts +1 -1
  103. package/expr/cpu.d.ts.map +1 -1
  104. package/expr/cpu.js +2 -16
  105. package/expr/expression.d.ts +8 -15
  106. package/expr/expression.d.ts.map +1 -1
  107. package/expr/expression.js +388 -508
  108. package/expr/gpu.d.ts +3 -3
  109. package/expr/gpu.d.ts.map +1 -1
  110. package/expr/gpu.js +1 -14
  111. package/extent.d.ts +2 -2
  112. package/extent.d.ts.map +1 -1
  113. package/featureloader.d.ts +10 -10
  114. package/featureloader.d.ts.map +1 -1
  115. package/featureloader.js +6 -6
  116. package/format/EsriJSON.d.ts +9 -12
  117. package/format/EsriJSON.d.ts.map +1 -1
  118. package/format/EsriJSON.js +7 -0
  119. package/format/Feature.d.ts +14 -14
  120. package/format/Feature.d.ts.map +1 -1
  121. package/format/Feature.js +8 -6
  122. package/format/GML2.d.ts.map +1 -1
  123. package/format/GML2.js +7 -9
  124. package/format/GML3.d.ts +2 -1
  125. package/format/GML3.d.ts.map +1 -1
  126. package/format/GML3.js +23 -31
  127. package/format/GML32.d.ts.map +1 -1
  128. package/format/GML32.js +1 -0
  129. package/format/GMLBase.d.ts.map +1 -1
  130. package/format/GMLBase.js +3 -0
  131. package/format/GPX.d.ts.map +1 -1
  132. package/format/GPX.js +3 -0
  133. package/format/GeoJSON.d.ts +17 -13
  134. package/format/GeoJSON.d.ts.map +1 -1
  135. package/format/GeoJSON.js +25 -17
  136. package/format/IGC.d.ts +1 -1
  137. package/format/IGC.d.ts.map +1 -1
  138. package/format/IGC.js +2 -0
  139. package/format/IIIFInfo.d.ts.map +1 -1
  140. package/format/JSONFeature.d.ts +15 -31
  141. package/format/JSONFeature.d.ts.map +1 -1
  142. package/format/JSONFeature.js +20 -16
  143. package/format/KML.d.ts +6 -6
  144. package/format/KML.d.ts.map +1 -1
  145. package/format/KML.js +5 -1
  146. package/format/MVT.d.ts +15 -13
  147. package/format/MVT.d.ts.map +1 -1
  148. package/format/MVT.js +19 -20
  149. package/format/OSMXML.d.ts.map +1 -1
  150. package/format/OSMXML.js +1 -0
  151. package/format/OWS.d.ts.map +1 -1
  152. package/format/OWS.js +1 -0
  153. package/format/Polyline.d.ts +6 -3
  154. package/format/Polyline.d.ts.map +1 -1
  155. package/format/Polyline.js +6 -0
  156. package/format/TextFeature.d.ts +9 -14
  157. package/format/TextFeature.d.ts.map +1 -1
  158. package/format/TextFeature.js +8 -0
  159. package/format/TopoJSON.d.ts +1 -8
  160. package/format/TopoJSON.d.ts.map +1 -1
  161. package/format/TopoJSON.js +2 -0
  162. package/format/WFS.d.ts.map +1 -1
  163. package/format/WFS.js +3 -0
  164. package/format/WKB.d.ts +9 -5
  165. package/format/WKB.d.ts.map +1 -1
  166. package/format/WKB.js +8 -0
  167. package/format/WKT.d.ts.map +1 -1
  168. package/format/WKT.js +6 -0
  169. package/format/WMSCapabilities.d.ts.map +1 -1
  170. package/format/WMSCapabilities.js +1 -0
  171. package/format/WMSGetFeatureInfo.d.ts.map +1 -1
  172. package/format/WMSGetFeatureInfo.js +1 -0
  173. package/format/WMTSCapabilities.d.ts.map +1 -1
  174. package/format/WMTSCapabilities.js +1 -0
  175. package/format/XMLFeature.d.ts +11 -15
  176. package/format/XMLFeature.d.ts.map +1 -1
  177. package/format/XMLFeature.js +8 -0
  178. package/format/filter/Bbox.d.ts.map +1 -1
  179. package/format/filter/Comparison.d.ts.map +1 -1
  180. package/format/filter/ComparisonBinary.d.ts.map +1 -1
  181. package/format/filter/Contains.d.ts.map +1 -1
  182. package/format/filter/DWithin.d.ts.map +1 -1
  183. package/format/filter/Disjoint.d.ts.map +1 -1
  184. package/format/filter/During.d.ts.map +1 -1
  185. package/format/filter/EqualTo.d.ts.map +1 -1
  186. package/format/filter/Filter.d.ts.map +1 -1
  187. package/format/filter/GreaterThan.d.ts.map +1 -1
  188. package/format/filter/GreaterThanOrEqualTo.d.ts.map +1 -1
  189. package/format/filter/Intersects.d.ts.map +1 -1
  190. package/format/filter/IsBetween.d.ts.map +1 -1
  191. package/format/filter/IsLike.d.ts.map +1 -1
  192. package/format/filter/IsNull.d.ts.map +1 -1
  193. package/format/filter/LessThan.d.ts.map +1 -1
  194. package/format/filter/LessThanOrEqualTo.d.ts.map +1 -1
  195. package/format/filter/LogicalNary.d.ts.map +1 -1
  196. package/format/filter/Not.d.ts.map +1 -1
  197. package/format/filter/NotEqualTo.d.ts.map +1 -1
  198. package/format/filter/ResourceId.d.ts.map +1 -1
  199. package/format/filter/Spatial.d.ts.map +1 -1
  200. package/format/filter/Within.d.ts.map +1 -1
  201. package/format/filter.d.ts.map +1 -1
  202. package/functions.d.ts +2 -2
  203. package/functions.d.ts.map +1 -1
  204. package/functions.js +6 -5
  205. package/geom/Circle.d.ts +10 -3
  206. package/geom/Circle.d.ts.map +1 -1
  207. package/geom/Circle.js +13 -0
  208. package/geom/Geometry.d.ts +2 -2
  209. package/geom/GeometryCollection.d.ts +6 -3
  210. package/geom/GeometryCollection.d.ts.map +1 -1
  211. package/geom/GeometryCollection.js +13 -0
  212. package/geom/LineString.d.ts +9 -5
  213. package/geom/LineString.d.ts.map +1 -1
  214. package/geom/LineString.js +7 -0
  215. package/geom/LinearRing.d.ts +8 -4
  216. package/geom/LinearRing.d.ts.map +1 -1
  217. package/geom/LinearRing.js +7 -0
  218. package/geom/MultiLineString.d.ts +8 -4
  219. package/geom/MultiLineString.d.ts.map +1 -1
  220. package/geom/MultiLineString.js +7 -0
  221. package/geom/MultiPoint.d.ts +6 -3
  222. package/geom/MultiPoint.d.ts.map +1 -1
  223. package/geom/MultiPoint.js +6 -0
  224. package/geom/MultiPolygon.d.ts +8 -4
  225. package/geom/MultiPolygon.d.ts.map +1 -1
  226. package/geom/MultiPolygon.js +8 -0
  227. package/geom/Point.d.ts +4 -2
  228. package/geom/Point.d.ts.map +1 -1
  229. package/geom/Point.js +7 -0
  230. package/geom/Polygon.d.ts +8 -4
  231. package/geom/Polygon.d.ts.map +1 -1
  232. package/geom/Polygon.js +8 -0
  233. package/geom/SimpleGeometry.d.ts +2 -1
  234. package/geom/SimpleGeometry.d.ts.map +1 -1
  235. package/geom/SimpleGeometry.js +6 -0
  236. package/geom/flat/area.d.ts.map +1 -1
  237. package/geom/flat/area.js +9 -7
  238. package/geom/flat/center.d.ts.map +1 -1
  239. package/geom/flat/closest.d.ts.map +1 -1
  240. package/geom/flat/contains.d.ts.map +1 -1
  241. package/geom/flat/deflate.d.ts.map +1 -1
  242. package/geom/flat/flip.d.ts.map +1 -1
  243. package/geom/flat/geodesic.d.ts.map +1 -1
  244. package/geom/flat/inflate.d.ts.map +1 -1
  245. package/geom/flat/interiorpoint.d.ts.map +1 -1
  246. package/geom/flat/interpolate.d.ts.map +1 -1
  247. package/geom/flat/intersectsextent.d.ts.map +1 -1
  248. package/geom/flat/length.d.ts.map +1 -1
  249. package/geom/flat/linechunk.d.ts.map +1 -1
  250. package/geom/flat/orient.d.ts.map +1 -1
  251. package/geom/flat/reverse.d.ts.map +1 -1
  252. package/geom/flat/segments.d.ts +1 -1
  253. package/geom/flat/segments.d.ts.map +1 -1
  254. package/geom/flat/simplify.d.ts.map +1 -1
  255. package/geom/flat/straightchunk.d.ts.map +1 -1
  256. package/geom/flat/textpath.d.ts.map +1 -1
  257. package/geom/flat/topology.d.ts.map +1 -1
  258. package/geom/flat/transform.d.ts.map +1 -1
  259. package/interaction/DblClickDragZoom.d.ts.map +1 -1
  260. package/interaction/DblClickDragZoom.js +1 -0
  261. package/interaction/DoubleClickZoom.d.ts.map +1 -1
  262. package/interaction/DoubleClickZoom.js +1 -0
  263. package/interaction/DragAndDrop.d.ts +4 -3
  264. package/interaction/DragAndDrop.d.ts.map +1 -1
  265. package/interaction/DragAndDrop.js +2 -0
  266. package/interaction/DragBox.d.ts +3 -3
  267. package/interaction/DragBox.d.ts.map +1 -1
  268. package/interaction/DragBox.js +6 -2
  269. package/interaction/DragPan.d.ts +6 -4
  270. package/interaction/DragPan.d.ts.map +1 -1
  271. package/interaction/DragPan.js +6 -1
  272. package/interaction/DragRotate.d.ts +3 -3
  273. package/interaction/DragRotate.d.ts.map +1 -1
  274. package/interaction/DragRotate.js +5 -2
  275. package/interaction/DragRotateAndZoom.d.ts +2 -2
  276. package/interaction/DragRotateAndZoom.d.ts.map +1 -1
  277. package/interaction/DragRotateAndZoom.js +4 -1
  278. package/interaction/DragZoom.d.ts +3 -3
  279. package/interaction/DragZoom.d.ts.map +1 -1
  280. package/interaction/DragZoom.js +3 -2
  281. package/interaction/Draw.d.ts +9 -8
  282. package/interaction/Draw.d.ts.map +1 -1
  283. package/interaction/Draw.js +9 -5
  284. package/interaction/Extent.d.ts +4 -3
  285. package/interaction/Extent.d.ts.map +1 -1
  286. package/interaction/Extent.js +6 -1
  287. package/interaction/Interaction.d.ts +1 -1
  288. package/interaction/Interaction.d.ts.map +1 -1
  289. package/interaction/KeyboardPan.d.ts +2 -2
  290. package/interaction/KeyboardPan.d.ts.map +1 -1
  291. package/interaction/KeyboardPan.js +2 -1
  292. package/interaction/KeyboardZoom.d.ts +2 -2
  293. package/interaction/KeyboardZoom.d.ts.map +1 -1
  294. package/interaction/KeyboardZoom.js +2 -1
  295. package/interaction/Link.d.ts +1 -1
  296. package/interaction/Link.d.ts.map +1 -1
  297. package/interaction/Link.js +4 -0
  298. package/interaction/Modify.d.ts +15 -12
  299. package/interaction/Modify.d.ts.map +1 -1
  300. package/interaction/Modify.js +11 -3
  301. package/interaction/MouseWheelZoom.d.ts +3 -3
  302. package/interaction/MouseWheelZoom.d.ts.map +1 -1
  303. package/interaction/MouseWheelZoom.js +2 -1
  304. package/interaction/PinchRotate.d.ts.map +1 -1
  305. package/interaction/PinchRotate.js +3 -0
  306. package/interaction/PinchZoom.d.ts.map +1 -1
  307. package/interaction/PinchZoom.js +3 -0
  308. package/interaction/Pointer.d.ts.map +1 -1
  309. package/interaction/Pointer.js +1 -0
  310. package/interaction/Select.d.ts +14 -15
  311. package/interaction/Select.d.ts.map +1 -1
  312. package/interaction/Select.js +8 -6
  313. package/interaction/Snap.d.ts +3 -2
  314. package/interaction/Snap.d.ts.map +1 -1
  315. package/interaction/Snap.js +3 -0
  316. package/interaction/Translate.d.ts +11 -10
  317. package/interaction/Translate.d.ts.map +1 -1
  318. package/interaction/Translate.js +9 -4
  319. package/interaction/defaults.d.ts.map +1 -1
  320. package/layer/Base.d.ts +1 -1
  321. package/layer/Base.d.ts.map +1 -1
  322. package/layer/Base.js +1 -0
  323. package/layer/BaseImage.d.ts.map +1 -1
  324. package/layer/BaseTile.d.ts +22 -5
  325. package/layer/BaseTile.d.ts.map +1 -1
  326. package/layer/BaseTile.js +23 -3
  327. package/layer/BaseVector.d.ts +7 -6
  328. package/layer/BaseVector.d.ts.map +1 -1
  329. package/layer/BaseVector.js +9 -4
  330. package/layer/Graticule.d.ts +5 -3
  331. package/layer/Graticule.d.ts.map +1 -1
  332. package/layer/Graticule.js +2 -1
  333. package/layer/Group.d.ts +2 -2
  334. package/layer/Group.d.ts.map +1 -1
  335. package/layer/Group.js +3 -0
  336. package/layer/Heatmap.d.ts +16 -10
  337. package/layer/Heatmap.d.ts.map +1 -1
  338. package/layer/Heatmap.js +25 -12
  339. package/layer/Image.d.ts.map +1 -1
  340. package/layer/Image.js +4 -0
  341. package/layer/Layer.d.ts +4 -4
  342. package/layer/Layer.d.ts.map +1 -1
  343. package/layer/Layer.js +7 -8
  344. package/layer/Tile.d.ts +6 -3
  345. package/layer/Tile.d.ts.map +1 -1
  346. package/layer/Tile.js +7 -2
  347. package/layer/Vector.d.ts +19 -9
  348. package/layer/Vector.d.ts.map +1 -1
  349. package/layer/Vector.js +15 -5
  350. package/layer/VectorImage.d.ts +9 -7
  351. package/layer/VectorImage.d.ts.map +1 -1
  352. package/layer/VectorImage.js +9 -4
  353. package/layer/VectorTile.d.ts +50 -15
  354. package/layer/VectorTile.d.ts.map +1 -1
  355. package/layer/VectorTile.js +51 -12
  356. package/layer/WebGLPoints.d.ts +1 -2
  357. package/layer/WebGLPoints.d.ts.map +1 -1
  358. package/layer/WebGLPoints.js +3 -0
  359. package/layer/WebGLTile.d.ts +9 -12
  360. package/layer/WebGLTile.d.ts.map +1 -1
  361. package/layer/WebGLTile.js +20 -21
  362. package/loadingstrategy.d.ts.map +1 -1
  363. package/math.d.ts.map +1 -1
  364. package/net.d.ts.map +1 -1
  365. package/obj.d.ts.map +1 -1
  366. package/ol.css +4 -0
  367. package/package.json +4 -4
  368. package/pixel.d.ts.map +1 -1
  369. package/proj/Projection.d.ts +1 -1
  370. package/proj/Projection.d.ts.map +1 -1
  371. package/proj/Units.d.ts +1 -1
  372. package/proj/epsg3857.d.ts.map +1 -1
  373. package/proj/epsg4326.d.ts.map +1 -1
  374. package/proj/proj4.d.ts.map +1 -1
  375. package/proj.d.ts.map +1 -1
  376. package/render/Box.d.ts.map +1 -1
  377. package/render/Box.js +1 -0
  378. package/render/Event.d.ts.map +1 -1
  379. package/render/EventType.d.ts +2 -2
  380. package/render/Feature.d.ts +6 -4
  381. package/render/Feature.d.ts.map +1 -1
  382. package/render/Feature.js +2 -0
  383. package/render/canvas/Builder.d.ts.map +1 -1
  384. package/render/canvas/Builder.js +2 -0
  385. package/render/canvas/BuilderGroup.d.ts.map +1 -1
  386. package/render/canvas/Executor.d.ts +6 -27
  387. package/render/canvas/Executor.d.ts.map +1 -1
  388. package/render/canvas/Executor.js +7 -13
  389. package/render/canvas/ExecutorGroup.d.ts +4 -5
  390. package/render/canvas/ExecutorGroup.d.ts.map +1 -1
  391. package/render/canvas/ExecutorGroup.js +2 -1
  392. package/render/canvas/ImageBuilder.d.ts +2 -1
  393. package/render/canvas/ImageBuilder.d.ts.map +1 -1
  394. package/render/canvas/ImageBuilder.js +4 -0
  395. package/render/canvas/Immediate.d.ts +24 -12
  396. package/render/canvas/Immediate.d.ts.map +1 -1
  397. package/render/canvas/Immediate.js +14 -0
  398. package/render/canvas/Instruction.d.ts.map +1 -1
  399. package/render/canvas/LineStringBuilder.d.ts.map +1 -1
  400. package/render/canvas/LineStringBuilder.js +4 -0
  401. package/render/canvas/PolygonBuilder.d.ts.map +1 -1
  402. package/render/canvas/PolygonBuilder.js +4 -0
  403. package/render/canvas/TextBuilder.d.ts +4 -2
  404. package/render/canvas/TextBuilder.d.ts.map +1 -1
  405. package/render/canvas/TextBuilder.js +4 -0
  406. package/render/canvas/ZIndexContext.d.ts +2 -1
  407. package/render/canvas/ZIndexContext.d.ts.map +1 -1
  408. package/render/canvas/ZIndexContext.js +1 -0
  409. package/render/canvas/hitdetect.d.ts +1 -1
  410. package/render/canvas/hitdetect.d.ts.map +1 -1
  411. package/render/canvas/style.d.ts +3 -3
  412. package/render/canvas/style.d.ts.map +1 -1
  413. package/render/canvas/style.js +6 -5
  414. package/render/canvas.d.ts +1 -1
  415. package/render/canvas.d.ts.map +1 -1
  416. package/render/canvas.js +2 -1
  417. package/render/webgl/MixedGeometryBatch.d.ts +4 -1
  418. package/render/webgl/MixedGeometryBatch.d.ts.map +1 -1
  419. package/render/webgl/MixedGeometryBatch.js +4 -0
  420. package/render/webgl/VectorStyleRenderer.d.ts +56 -30
  421. package/render/webgl/VectorStyleRenderer.d.ts.map +1 -1
  422. package/render/webgl/VectorStyleRenderer.js +39 -0
  423. package/render/webgl/renderinstructions.d.ts +4 -4
  424. package/render/webgl/utils.d.ts +1 -1
  425. package/render/webgl/utils.d.ts.map +1 -1
  426. package/render.d.ts.map +1 -1
  427. package/renderer/Composite.d.ts +3 -2
  428. package/renderer/Composite.d.ts.map +1 -1
  429. package/renderer/Composite.js +10 -4
  430. package/renderer/Layer.d.ts +22 -29
  431. package/renderer/Layer.d.ts.map +1 -1
  432. package/renderer/Layer.js +33 -37
  433. package/renderer/Map.d.ts +1 -1
  434. package/renderer/Map.d.ts.map +1 -1
  435. package/renderer/canvas/ImageLayer.d.ts +6 -4
  436. package/renderer/canvas/ImageLayer.d.ts.map +1 -1
  437. package/renderer/canvas/ImageLayer.js +12 -9
  438. package/renderer/canvas/Layer.d.ts +4 -9
  439. package/renderer/canvas/Layer.d.ts.map +1 -1
  440. package/renderer/canvas/Layer.js +1 -6
  441. package/renderer/canvas/TileLayer.d.ts +106 -42
  442. package/renderer/canvas/TileLayer.d.ts.map +1 -1
  443. package/renderer/canvas/TileLayer.js +546 -330
  444. package/renderer/canvas/VectorImageLayer.d.ts +7 -4
  445. package/renderer/canvas/VectorImageLayer.d.ts.map +1 -1
  446. package/renderer/canvas/VectorImageLayer.js +10 -3
  447. package/renderer/canvas/VectorLayer.d.ts +7 -4
  448. package/renderer/canvas/VectorLayer.d.ts.map +1 -1
  449. package/renderer/canvas/VectorLayer.js +8 -0
  450. package/renderer/canvas/VectorTileLayer.d.ts +18 -16
  451. package/renderer/canvas/VectorTileLayer.d.ts.map +1 -1
  452. package/renderer/canvas/VectorTileLayer.js +79 -54
  453. package/renderer/vector.d.ts.map +1 -1
  454. package/renderer/webgl/Layer.d.ts +1 -6
  455. package/renderer/webgl/Layer.d.ts.map +1 -1
  456. package/renderer/webgl/Layer.js +2 -6
  457. package/renderer/webgl/PointsLayer.d.ts +23 -8
  458. package/renderer/webgl/PointsLayer.d.ts.map +1 -1
  459. package/renderer/webgl/PointsLayer.js +22 -1
  460. package/renderer/webgl/TileLayer.d.ts +16 -5
  461. package/renderer/webgl/TileLayer.d.ts.map +1 -1
  462. package/renderer/webgl/TileLayer.js +18 -0
  463. package/renderer/webgl/TileLayerBase.d.ts +7 -16
  464. package/renderer/webgl/TileLayerBase.d.ts.map +1 -1
  465. package/renderer/webgl/TileLayerBase.js +69 -84
  466. package/renderer/webgl/VectorLayer.d.ts +32 -8
  467. package/renderer/webgl/VectorLayer.d.ts.map +1 -1
  468. package/renderer/webgl/VectorLayer.js +53 -0
  469. package/renderer/webgl/VectorTileLayer.d.ts +34 -29
  470. package/renderer/webgl/VectorTileLayer.d.ts.map +1 -1
  471. package/renderer/webgl/VectorTileLayer.js +27 -0
  472. package/renderer/webgl/worldUtil.d.ts.map +1 -1
  473. package/reproj/DataTile.d.ts.map +1 -1
  474. package/reproj/DataTile.js +121 -119
  475. package/reproj/Image.d.ts +2 -1
  476. package/reproj/Image.d.ts.map +1 -1
  477. package/reproj/Image.js +4 -2
  478. package/reproj/Tile.d.ts.map +1 -1
  479. package/reproj/Tile.js +16 -19
  480. package/reproj/Triangulation.d.ts.map +1 -1
  481. package/reproj.d.ts +1 -1
  482. package/reproj.d.ts.map +1 -1
  483. package/resolution.d.ts.map +1 -1
  484. package/resolutionconstraint.d.ts.map +1 -1
  485. package/rotationconstraint.d.ts.map +1 -1
  486. package/size.d.ts.map +1 -1
  487. package/source/BingMaps.d.ts +3 -3
  488. package/source/BingMaps.d.ts.map +1 -1
  489. package/source/BingMaps.js +1 -2
  490. package/source/CartoDB.d.ts +2 -2
  491. package/source/CartoDB.d.ts.map +1 -1
  492. package/source/CartoDB.js +1 -1
  493. package/source/Cluster.d.ts +5 -5
  494. package/source/Cluster.d.ts.map +1 -1
  495. package/source/Cluster.js +5 -2
  496. package/source/DataTile.d.ts +51 -22
  497. package/source/DataTile.d.ts.map +1 -1
  498. package/source/DataTile.js +67 -9
  499. package/source/GeoTIFF.d.ts +4 -7
  500. package/source/GeoTIFF.d.ts.map +1 -1
  501. package/source/GeoTIFF.js +4 -3
  502. package/source/Google.d.ts +2 -1
  503. package/source/Google.d.ts.map +1 -1
  504. package/source/Google.js +4 -2
  505. package/source/IIIF.d.ts +1 -1
  506. package/source/IIIF.js +1 -1
  507. package/source/Image.d.ts +3 -2
  508. package/source/Image.d.ts.map +1 -1
  509. package/source/Image.js +1 -0
  510. package/source/ImageArcGISRest.d.ts.map +1 -1
  511. package/source/ImageArcGISRest.js +4 -0
  512. package/source/ImageCanvas.d.ts +2 -1
  513. package/source/ImageCanvas.d.ts.map +1 -1
  514. package/source/ImageCanvas.js +1 -0
  515. package/source/ImageMapGuide.d.ts.map +1 -1
  516. package/source/ImageMapGuide.js +4 -0
  517. package/source/ImageStatic.d.ts.map +1 -1
  518. package/source/ImageStatic.js +1 -0
  519. package/source/ImageTile.d.ts +102 -0
  520. package/source/ImageTile.d.ts.map +1 -0
  521. package/source/ImageTile.js +206 -0
  522. package/source/ImageWMS.d.ts.map +1 -1
  523. package/source/ImageWMS.js +4 -0
  524. package/source/OGCMapTile.d.ts +2 -2
  525. package/source/OGCMapTile.js +1 -1
  526. package/source/OGCVectorTile.d.ts +9 -9
  527. package/source/OGCVectorTile.d.ts.map +1 -1
  528. package/source/OGCVectorTile.js +4 -4
  529. package/source/OSM.d.ts +2 -7
  530. package/source/OSM.d.ts.map +1 -1
  531. package/source/OSM.js +1 -3
  532. package/source/Raster.d.ts +41 -26
  533. package/source/Raster.d.ts.map +1 -1
  534. package/source/Raster.js +83 -102
  535. package/source/Source.d.ts +1 -1
  536. package/source/Source.d.ts.map +1 -1
  537. package/source/Source.js +5 -14
  538. package/source/StadiaMaps.d.ts +2 -2
  539. package/source/StadiaMaps.d.ts.map +1 -1
  540. package/source/StadiaMaps.js +2 -18
  541. package/source/Tile.d.ts +7 -36
  542. package/source/Tile.d.ts.map +1 -1
  543. package/source/Tile.js +9 -69
  544. package/source/TileArcGISRest.d.ts +2 -2
  545. package/source/TileArcGISRest.d.ts.map +1 -1
  546. package/source/TileArcGISRest.js +2 -1
  547. package/source/TileDebug.d.ts.map +1 -1
  548. package/source/TileDebug.js +0 -1
  549. package/source/TileEventType.d.ts +1 -1
  550. package/source/TileImage.d.ts +9 -12
  551. package/source/TileImage.d.ts.map +1 -1
  552. package/source/TileImage.js +21 -43
  553. package/source/TileJSON.d.ts +2 -2
  554. package/source/TileJSON.d.ts.map +1 -1
  555. package/source/TileJSON.js +1 -1
  556. package/source/TileWMS.d.ts +2 -2
  557. package/source/TileWMS.d.ts.map +1 -1
  558. package/source/TileWMS.js +3 -4
  559. package/source/UTFGrid.d.ts +5 -3
  560. package/source/UTFGrid.d.ts.map +1 -1
  561. package/source/UTFGrid.js +7 -8
  562. package/source/UrlTile.d.ts +16 -13
  563. package/source/UrlTile.d.ts.map +1 -1
  564. package/source/UrlTile.js +13 -7
  565. package/source/Vector.d.ts +21 -21
  566. package/source/Vector.d.ts.map +1 -1
  567. package/source/Vector.js +16 -13
  568. package/source/VectorEventType.d.ts +1 -1
  569. package/source/VectorTile.d.ts +13 -24
  570. package/source/VectorTile.d.ts.map +1 -1
  571. package/source/VectorTile.js +19 -87
  572. package/source/WMTS.d.ts +3 -3
  573. package/source/WMTS.d.ts.map +1 -1
  574. package/source/WMTS.js +5 -4
  575. package/source/XYZ.d.ts +14 -17
  576. package/source/XYZ.d.ts.map +1 -1
  577. package/source/XYZ.js +8 -8
  578. package/source/Zoomify.d.ts +5 -4
  579. package/source/Zoomify.d.ts.map +1 -1
  580. package/source/Zoomify.js +5 -2
  581. package/source/arcgisRest.d.ts +4 -4
  582. package/source/arcgisRest.d.ts.map +1 -1
  583. package/source/arcgisRest.js +5 -5
  584. package/source/mapguide.d.ts +3 -3
  585. package/source/mapguide.d.ts.map +1 -1
  586. package/source/mapguide.js +11 -8
  587. package/source/ogcTileUtil.d.ts +2 -2
  588. package/source/ogcTileUtil.d.ts.map +1 -1
  589. package/source/ogcTileUtil.js +7 -7
  590. package/source/static.d.ts +3 -3
  591. package/source/static.d.ts.map +1 -1
  592. package/source/static.js +7 -7
  593. package/source/wms.d.ts +2 -2
  594. package/source/wms.d.ts.map +1 -1
  595. package/source/wms.js +16 -19
  596. package/source.d.ts +1 -0
  597. package/source.d.ts.map +1 -1
  598. package/source.js +1 -0
  599. package/sphere.d.ts +1 -1
  600. package/structs/LRUCache.d.ts.map +1 -1
  601. package/structs/PriorityQueue.d.ts.map +1 -1
  602. package/structs/RBush.d.ts +10 -32
  603. package/structs/RBush.d.ts.map +1 -1
  604. package/structs/RBush.js +9 -12
  605. package/style/Circle.d.ts +2 -1
  606. package/style/Circle.d.ts.map +1 -1
  607. package/style/Circle.js +2 -1
  608. package/style/Fill.d.ts +3 -3
  609. package/style/Fill.d.ts.map +1 -1
  610. package/style/Fill.js +1 -1
  611. package/style/Icon.d.ts +8 -5
  612. package/style/Icon.d.ts.map +1 -1
  613. package/style/Icon.js +21 -0
  614. package/style/IconImage.d.ts.map +1 -1
  615. package/style/IconImage.js +3 -2
  616. package/style/IconImageCache.d.ts.map +1 -1
  617. package/style/Image.d.ts +3 -3
  618. package/style/Image.d.ts.map +1 -1
  619. package/style/RegularShape.d.ts +11 -5
  620. package/style/RegularShape.d.ts.map +1 -1
  621. package/style/RegularShape.js +23 -5
  622. package/style/Stroke.d.ts.map +1 -1
  623. package/style/Style.d.ts +5 -5
  624. package/style/Style.d.ts.map +1 -1
  625. package/style/Style.js +2 -2
  626. package/style/Text.d.ts +2 -2
  627. package/style/Text.d.ts.map +1 -1
  628. package/style/flat.d.ts.map +1 -1
  629. package/style/webgl.d.ts.map +1 -1
  630. package/tilecoord.d.ts +7 -0
  631. package/tilecoord.d.ts.map +1 -1
  632. package/tilecoord.js +11 -1
  633. package/tilegrid/TileGrid.d.ts +1 -1
  634. package/tilegrid/TileGrid.d.ts.map +1 -1
  635. package/tilegrid/WMTS.d.ts.map +1 -1
  636. package/tilegrid/WMTS.js +1 -1
  637. package/tileurlfunction.d.ts +3 -7
  638. package/tileurlfunction.d.ts.map +1 -1
  639. package/tileurlfunction.js +14 -47
  640. package/transform.d.ts +15 -15
  641. package/transform.d.ts.map +1 -1
  642. package/uri.d.ts +23 -3
  643. package/uri.d.ts.map +1 -1
  644. package/uri.js +75 -0
  645. package/util.d.ts.map +1 -1
  646. package/util.js +1 -1
  647. package/vec/mat4.d.ts.map +1 -1
  648. package/webgl/BaseTileRepresentation.d.ts +3 -3
  649. package/webgl/BaseTileRepresentation.d.ts.map +1 -1
  650. package/webgl/BaseTileRepresentation.js +9 -2
  651. package/webgl/Buffer.d.ts.map +1 -1
  652. package/webgl/Helper.d.ts.map +1 -1
  653. package/webgl/Helper.js +1 -0
  654. package/webgl/PostProcessingPass.d.ts +48 -12
  655. package/webgl/PostProcessingPass.d.ts.map +1 -1
  656. package/webgl/PostProcessingPass.js +42 -6
  657. package/webgl/RenderTarget.d.ts.map +1 -1
  658. package/webgl/ShaderBuilder.d.ts +1 -1
  659. package/webgl/TileGeometry.d.ts.map +1 -1
  660. package/webgl/TileGeometry.js +4 -1
  661. package/webgl/TileTexture.d.ts.map +1 -1
  662. package/webgl/TileTexture.js +14 -8
  663. package/webgl/styleparser.d.ts.map +1 -1
  664. package/webgl/styleparser.js +54 -66
  665. package/webgl.d.ts.map +1 -1
  666. package/worker/webgl.js +1 -1
  667. package/xml.d.ts.map +1 -1
  668. package/xml.js +27 -39
  669. package/source/SentinelHub.d.ts +0 -507
  670. package/source/SentinelHub.d.ts.map +0 -1
  671. package/source/SentinelHub.js +0 -616
  672. package/structs/LinkedList.d.ts +0 -130
  673. package/structs/LinkedList.d.ts.map +0 -1
  674. package/structs/LinkedList.js +0 -259
@@ -2,7 +2,10 @@
2
2
  * @module ol/renderer/canvas/TileLayer
3
3
  */
4
4
  import CanvasLayerRenderer from './Layer.js';
5
+ import DataTile, {asImageLike} from '../../DataTile.js';
5
6
  import ImageTile from '../../ImageTile.js';
7
+ import LRUCache from '../../structs/LRUCache.js';
8
+ import ReprojDataTile from '../../reproj/DataTile.js';
6
9
  import ReprojTile from '../../reproj/Tile.js';
7
10
  import TileRange from '../../TileRange.js';
8
11
  import TileState from '../../TileState.js';
@@ -16,34 +19,125 @@ import {
16
19
  createEmpty,
17
20
  equals,
18
21
  getIntersection,
19
- getRotatedViewport,
20
22
  getTopLeft,
21
23
  intersects,
22
24
  } from '../../extent.js';
25
+ import {createOrUpdate as createTileCoord, getKeyZXY} from '../../tilecoord.js';
23
26
  import {fromUserExtent} from '../../proj.js';
24
27
  import {getUid} from '../../util.js';
25
28
  import {toSize} from '../../size.js';
26
29
 
30
+ /**
31
+ * @param {string} sourceKey The source key.
32
+ * @param {number} z The tile z level.
33
+ * @param {number} x The tile x level.
34
+ * @param {number} y The tile y level.
35
+ * @return {string} The cache key.
36
+ */
37
+ function getCacheKey(sourceKey, z, x, y) {
38
+ return `${sourceKey},${getKeyZXY(z, x, y)}`;
39
+ }
40
+
41
+ /**
42
+ * @typedef {Object<number, Set<import("../../Tile.js").default>>} TileLookup
43
+ */
44
+
45
+ /**
46
+ * Add a tile to the lookup.
47
+ * @param {TileLookup} tilesByZ Lookup of tiles by zoom level.
48
+ * @param {import("../../Tile.js").default} tile A tile.
49
+ * @param {number} z The zoom level.
50
+ * @return {boolean} The tile was added to the lookup.
51
+ */
52
+ function addTileToLookup(tilesByZ, tile, z) {
53
+ if (!(z in tilesByZ)) {
54
+ tilesByZ[z] = new Set([tile]);
55
+ return true;
56
+ }
57
+ const set = tilesByZ[z];
58
+ const existing = set.has(tile);
59
+ if (!existing) {
60
+ set.add(tile);
61
+ }
62
+ return !existing;
63
+ }
64
+
65
+ /**
66
+ * Remove a tile from the lookup.
67
+ * @param {TileLookup} tilesByZ Lookup of tiles by zoom level.
68
+ * @param {import("../../Tile.js").default} tile A tile.
69
+ * @param {number} z The zoom level.
70
+ * @return {boolean} The tile was removed from the lookup.
71
+ */
72
+ function removeTileFromLookup(tilesByZ, tile, z) {
73
+ const set = tilesByZ[z];
74
+ if (set) {
75
+ return set.delete(tile);
76
+ }
77
+ return false;
78
+ }
79
+
80
+ /**
81
+ * @param {import("../../Map.js").FrameState} frameState Frame state.
82
+ * @param {import("../../extent.js").Extent} extent The frame extent.
83
+ * @return {import("../../extent.js").Extent} Frame extent intersected with layer extents.
84
+ */
85
+ function getRenderExtent(frameState, extent) {
86
+ const layerState = frameState.layerStatesArray[frameState.layerIndex];
87
+ if (layerState.extent) {
88
+ extent = getIntersection(
89
+ extent,
90
+ fromUserExtent(layerState.extent, frameState.viewState.projection),
91
+ );
92
+ }
93
+ const source = /** @type {import("../../source/Tile.js").default} */ (
94
+ layerState.layer.getRenderSource()
95
+ );
96
+ if (!source.getWrapX()) {
97
+ const gridExtent = source
98
+ .getTileGridForProjection(frameState.viewState.projection)
99
+ .getExtent();
100
+ if (gridExtent) {
101
+ extent = getIntersection(extent, gridExtent);
102
+ }
103
+ }
104
+ return extent;
105
+ }
106
+
107
+ /**
108
+ * @typedef {Object} Options
109
+ * @property {number} [cacheSize=512] The cache size.
110
+ */
111
+
27
112
  /**
28
113
  * @classdesc
29
114
  * Canvas renderer for tile layers.
30
115
  * @api
31
- * @template {import("../../layer/Tile.js").default<import("../../source/Tile.js").default>|import("../../layer/VectorTile.js").default} [LayerType=import("../../layer/Tile.js").default<import("../../source/Tile.js").default>|import("../../layer/VectorTile.js").default]
116
+ * @template {import("../../layer/Tile.js").default|import("../../layer/VectorTile.js").default} [LayerType=import("../../layer/Tile.js").default<import("../../source/Tile.js").default>|import("../../layer/VectorTile.js").default]
32
117
  * @extends {CanvasLayerRenderer<LayerType>}
33
118
  */
34
119
  class CanvasTileLayerRenderer extends CanvasLayerRenderer {
35
120
  /**
36
121
  * @param {LayerType} tileLayer Tile layer.
122
+ * @param {Options} [options] Options.
37
123
  */
38
- constructor(tileLayer) {
124
+ constructor(tileLayer, options) {
39
125
  super(tileLayer);
40
126
 
127
+ options = options || {};
128
+
41
129
  /**
42
130
  * Rendered extent has changed since the previous `renderFrame()` call
43
131
  * @type {boolean}
44
132
  */
45
133
  this.extentChanged = true;
46
134
 
135
+ /**
136
+ * The last call to `renderFrame` was completed with all tiles loaded
137
+ * @type {boolean}
138
+ */
139
+ this.renderComplete = false;
140
+
47
141
  /**
48
142
  * @private
49
143
  * @type {?import("../../extent.js").Extent}
@@ -76,60 +170,101 @@ class CanvasTileLayerRenderer extends CanvasLayerRenderer {
76
170
 
77
171
  /**
78
172
  * @private
79
- * @type {boolean}
173
+ * @type {string}
80
174
  */
81
- this.newTiles_ = false;
175
+ this.renderedSourceKey_;
176
+
177
+ /**
178
+ * @private
179
+ * @type {number}
180
+ */
181
+ this.renderedSourceRevision_;
82
182
 
83
183
  /**
84
184
  * @protected
85
185
  * @type {import("../../extent.js").Extent}
86
186
  */
87
- this.tmpExtent = createEmpty();
187
+ this.tempExtent = createEmpty();
88
188
 
89
189
  /**
90
190
  * @private
91
191
  * @type {import("../../TileRange.js").default}
92
192
  */
93
- this.tmpTileRange_ = new TileRange(0, 0, 0, 0);
193
+ this.tempTileRange_ = new TileRange(0, 0, 0, 0);
194
+
195
+ /**
196
+ * @type {import("../../tilecoord.js").TileCoord}
197
+ * @private
198
+ */
199
+ this.tempTileCoord_ = createTileCoord(0, 0, 0);
200
+
201
+ const cacheSize = options.cacheSize !== undefined ? options.cacheSize : 512;
202
+
203
+ /**
204
+ * @type {import("../../structs/LRUCache.js").default<import("../../Tile.js").default>}
205
+ * @private
206
+ */
207
+ this.tileCache_ = new LRUCache(cacheSize);
208
+
209
+ this.maxStaleKeys = cacheSize * 0.5;
94
210
  }
95
211
 
96
212
  /**
97
- * @protected
98
- * @param {import("../../Tile.js").default} tile Tile.
99
- * @return {boolean} Tile is drawable.
213
+ * @return {LRUCache} Tile cache.
100
214
  */
101
- isDrawableTile(tile) {
102
- const tileLayer = this.getLayer();
103
- const tileState = tile.getState();
104
- const useInterimTilesOnError = tileLayer.getUseInterimTilesOnError();
105
- return (
106
- tileState == TileState.LOADED ||
107
- tileState == TileState.EMPTY ||
108
- (tileState == TileState.ERROR && !useInterimTilesOnError)
109
- );
215
+ getTileCache() {
216
+ return this.tileCache_;
110
217
  }
111
218
 
112
219
  /**
220
+ * Get a tile from the cache or create one if needed.
221
+ *
113
222
  * @param {number} z Tile coordinate z.
114
223
  * @param {number} x Tile coordinate x.
115
224
  * @param {number} y Tile coordinate y.
116
225
  * @param {import("../../Map.js").FrameState} frameState Frame state.
117
- * @return {!import("../../Tile.js").default} Tile.
226
+ * @return {import("../../Tile.js").default|null} Tile (or null if outside source extent).
227
+ * @protected
118
228
  */
119
- getTile(z, x, y, frameState) {
120
- const pixelRatio = frameState.pixelRatio;
121
- const projection = frameState.viewState.projection;
229
+ getOrCreateTile(z, x, y, frameState) {
230
+ const tileCache = this.tileCache_;
122
231
  const tileLayer = this.getLayer();
123
232
  const tileSource = tileLayer.getSource();
124
- let tile = tileSource.getTile(z, x, y, pixelRatio, projection);
125
- if (tile.getState() == TileState.ERROR) {
126
- if (tileLayer.getUseInterimTilesOnError() && tileLayer.getPreload() > 0) {
127
- // Preloaded tiles for lower resolutions might have finished loading.
128
- this.newTiles_ = true;
233
+ const cacheKey = getCacheKey(tileSource.getKey(), z, x, y);
234
+
235
+ /** @type {import("../../Tile.js").default} */
236
+ let tile;
237
+
238
+ if (tileCache.containsKey(cacheKey)) {
239
+ tile = tileCache.get(cacheKey);
240
+ } else {
241
+ tile = tileSource.getTile(
242
+ z,
243
+ x,
244
+ y,
245
+ frameState.pixelRatio,
246
+ frameState.viewState.projection,
247
+ );
248
+ if (!tile) {
249
+ return null;
129
250
  }
251
+ tileCache.set(cacheKey, tile);
130
252
  }
131
- if (!this.isDrawableTile(tile)) {
132
- tile = tile.getInterimTile();
253
+ return tile;
254
+ }
255
+
256
+ /**
257
+ * @param {number} z Tile coordinate z.
258
+ * @param {number} x Tile coordinate x.
259
+ * @param {number} y Tile coordinate y.
260
+ * @param {import("../../Map.js").FrameState} frameState Frame state.
261
+ * @return {import("../../Tile.js").default|null} Tile (or null if outside source extent).
262
+ * @protected
263
+ */
264
+ getTile(z, x, y, frameState) {
265
+ const tile = this.getOrCreateTile(z, x, y, frameState);
266
+ if (!tile) {
267
+ return null;
133
268
  }
134
269
  return tile;
135
270
  }
@@ -137,6 +272,7 @@ class CanvasTileLayerRenderer extends CanvasLayerRenderer {
137
272
  /**
138
273
  * @param {import("../../pixel.js").Pixel} pixel Pixel.
139
274
  * @return {Uint8ClampedArray} Data at the pixel location.
275
+ * @override
140
276
  */
141
277
  getData(pixel) {
142
278
  const frameState = this.frameState;
@@ -157,8 +293,6 @@ class CanvasTileLayerRenderer extends CanvasLayerRenderer {
157
293
  }
158
294
  }
159
295
 
160
- const pixelRatio = frameState.pixelRatio;
161
- const projection = frameState.viewState.projection;
162
296
  const viewState = frameState.viewState;
163
297
  const source = layer.getRenderSource();
164
298
  const tileGrid = source.getTileGridForProjection(viewState.projection);
@@ -170,21 +304,8 @@ class CanvasTileLayerRenderer extends CanvasLayerRenderer {
170
304
  --z
171
305
  ) {
172
306
  const tileCoord = tileGrid.getTileCoordForCoordAndZ(coordinate, z);
173
- const tile = source.getTile(
174
- z,
175
- tileCoord[1],
176
- tileCoord[2],
177
- pixelRatio,
178
- projection,
179
- );
180
- if (
181
- !(tile instanceof ImageTile || tile instanceof ReprojTile) ||
182
- (tile instanceof ReprojTile && tile.getState() === TileState.EMPTY)
183
- ) {
184
- return null;
185
- }
186
-
187
- if (tile.getState() !== TileState.LOADED) {
307
+ const tile = this.getTile(z, tileCoord[1], tileCoord[2], frameState);
308
+ if (!tile || tile.getState() !== TileState.LOADED) {
188
309
  continue;
189
310
  }
190
311
 
@@ -192,6 +313,21 @@ class CanvasTileLayerRenderer extends CanvasLayerRenderer {
192
313
  const tileSize = toSize(tileGrid.getTileSize(z));
193
314
  const tileResolution = tileGrid.getResolution(z);
194
315
 
316
+ /**
317
+ * @type {import('../../DataTile.js').ImageLike}
318
+ */
319
+ let image;
320
+ if (tile instanceof ImageTile) {
321
+ image = tile.getImage();
322
+ } else if (tile instanceof DataTile) {
323
+ image = asImageLike(tile.getData());
324
+ if (!image) {
325
+ continue;
326
+ }
327
+ } else {
328
+ continue;
329
+ }
330
+
195
331
  const col = Math.floor(
196
332
  tilePixelRatio *
197
333
  ((coordinate[0] - tileOrigin[0]) / tileResolution -
@@ -208,47 +344,210 @@ class CanvasTileLayerRenderer extends CanvasLayerRenderer {
208
344
  tilePixelRatio * source.getGutterForProjection(viewState.projection),
209
345
  );
210
346
 
211
- return this.getImageData(tile.getImage(), col + gutter, row + gutter);
347
+ return this.getImageData(image, col + gutter, row + gutter);
212
348
  }
213
349
 
214
350
  return null;
215
351
  }
216
352
 
217
353
  /**
218
- * @param {Object<number, Object<string, import("../../Tile.js").default>>} tiles Lookup of loaded tiles by zoom level.
219
- * @param {number} zoom Zoom level.
220
- * @param {import("../../Tile.js").default} tile Tile.
221
- * @return {boolean|void} If `false`, the tile will not be considered loaded.
354
+ * Determine whether render should be called.
355
+ * @param {import("../../Map.js").FrameState} frameState Frame state.
356
+ * @return {boolean} Layer is ready to be rendered.
357
+ * @override
222
358
  */
223
- loadedTileCallback(tiles, zoom, tile) {
224
- if (this.isDrawableTile(tile)) {
225
- return super.loadedTileCallback(tiles, zoom, tile);
359
+ prepareFrame(frameState) {
360
+ const source = this.getLayer().getSource();
361
+ if (!source) {
362
+ return false;
226
363
  }
227
- return false;
364
+ const sourceRevision = this.getLayer().getSource().getRevision();
365
+ if (!this.renderedRevision_) {
366
+ this.renderedRevision_ = sourceRevision;
367
+ } else if (this.renderedRevision_ !== sourceRevision) {
368
+ this.renderedRevision_ = sourceRevision;
369
+ if (this.renderedSourceKey_ === source.getKey()) {
370
+ this.tileCache_.clear();
371
+ }
372
+ }
373
+ return true;
228
374
  }
229
375
 
230
376
  /**
231
- * Determine whether render should be called.
232
377
  * @param {import("../../Map.js").FrameState} frameState Frame state.
233
- * @return {boolean} Layer is ready to be rendered.
378
+ * @param {import("../../extent.js").Extent} extent The extent to be rendered.
379
+ * @param {number} initialZ The zoom level.
380
+ * @param {TileLookup} tilesByZ Lookup of tiles by zoom level.
381
+ * @param {number} preload Number of additional levels to load.
234
382
  */
235
- prepareFrame(frameState) {
236
- return !!this.getLayer().getSource();
383
+ enqueueTiles(frameState, extent, initialZ, tilesByZ, preload) {
384
+ const viewState = frameState.viewState;
385
+ const tileLayer = this.getLayer();
386
+ const tileSource = tileLayer.getRenderSource();
387
+ const tileGrid = tileSource.getTileGridForProjection(viewState.projection);
388
+
389
+ const tileSourceKey = getUid(tileSource);
390
+ if (!(tileSourceKey in frameState.wantedTiles)) {
391
+ frameState.wantedTiles[tileSourceKey] = {};
392
+ }
393
+
394
+ const wantedTiles = frameState.wantedTiles[tileSourceKey];
395
+
396
+ const map = tileLayer.getMapInternal();
397
+ const minZ = Math.max(
398
+ initialZ - preload,
399
+ tileGrid.getMinZoom(),
400
+ tileGrid.getZForResolution(
401
+ Math.min(
402
+ tileLayer.getMaxResolution(),
403
+ map
404
+ ? map
405
+ .getView()
406
+ .getResolutionForZoom(Math.max(tileLayer.getMinZoom(), 0))
407
+ : tileGrid.getResolution(0),
408
+ ),
409
+ tileSource.zDirection,
410
+ ),
411
+ );
412
+ for (let z = initialZ; z >= minZ; --z) {
413
+ const tileRange = tileGrid.getTileRangeForExtentAndZ(
414
+ extent,
415
+ z,
416
+ this.tempTileRange_,
417
+ );
418
+
419
+ const tileResolution = tileGrid.getResolution(z);
420
+
421
+ for (let x = tileRange.minX; x <= tileRange.maxX; ++x) {
422
+ for (let y = tileRange.minY; y <= tileRange.maxY; ++y) {
423
+ const tile = this.getTile(z, x, y, frameState);
424
+ if (!tile) {
425
+ continue;
426
+ }
427
+ const added = addTileToLookup(tilesByZ, tile, z);
428
+ if (!added) {
429
+ continue;
430
+ }
431
+
432
+ const tileQueueKey = tile.getKey();
433
+ wantedTiles[tileQueueKey] = true;
434
+
435
+ if (tile.getState() === TileState.IDLE) {
436
+ if (!frameState.tileQueue.isKeyQueued(tileQueueKey)) {
437
+ const tileCoord = createTileCoord(z, x, y, this.tempTileCoord_);
438
+ frameState.tileQueue.enqueue([
439
+ tile,
440
+ tileSourceKey,
441
+ tileGrid.getTileCoordCenter(tileCoord),
442
+ tileResolution,
443
+ ]);
444
+ }
445
+ }
446
+ }
447
+ }
448
+ }
449
+ }
450
+
451
+ /**
452
+ * Look for tiles covering the provided tile coordinate at an alternate
453
+ * zoom level. Loaded tiles will be added to the provided tile texture lookup.
454
+ * @param {import("../../tilecoord.js").TileCoord} tileCoord The target tile coordinate.
455
+ * @param {TileLookup} tilesByZ Lookup of tiles by zoom level.
456
+ * @return {boolean} The tile coordinate is covered by loaded tiles at the alternate zoom level.
457
+ * @private
458
+ */
459
+ findStaleTile_(tileCoord, tilesByZ) {
460
+ const tileCache = this.tileCache_;
461
+ const z = tileCoord[0];
462
+ const x = tileCoord[1];
463
+ const y = tileCoord[2];
464
+ const staleKeys = this.getStaleKeys();
465
+ for (let i = 0; i < staleKeys.length; ++i) {
466
+ const cacheKey = getCacheKey(staleKeys[i], z, x, y);
467
+ if (tileCache.containsKey(cacheKey)) {
468
+ const tile = tileCache.get(cacheKey);
469
+ if (tile.getState() === TileState.LOADED) {
470
+ tile.endTransition(getUid(this));
471
+ addTileToLookup(tilesByZ, tile, z);
472
+ return true;
473
+ }
474
+ }
475
+ }
476
+ return false;
477
+ }
478
+
479
+ /**
480
+ * Look for tiles covering the provided tile coordinate at an alternate
481
+ * zoom level. Loaded tiles will be added to the provided tile texture lookup.
482
+ * @param {import("../../tilegrid/TileGrid.js").default} tileGrid The tile grid.
483
+ * @param {import("../../tilecoord.js").TileCoord} tileCoord The target tile coordinate.
484
+ * @param {number} altZ The alternate zoom level.
485
+ * @param {TileLookup} tilesByZ Lookup of tiles by zoom level.
486
+ * @return {boolean} The tile coordinate is covered by loaded tiles at the alternate zoom level.
487
+ * @private
488
+ */
489
+ findAltTiles_(tileGrid, tileCoord, altZ, tilesByZ) {
490
+ const tileRange = tileGrid.getTileRangeForTileCoordAndZ(
491
+ tileCoord,
492
+ altZ,
493
+ this.tempTileRange_,
494
+ );
495
+
496
+ if (!tileRange) {
497
+ return false;
498
+ }
499
+
500
+ let covered = true;
501
+ const tileCache = this.tileCache_;
502
+ const source = this.getLayer().getRenderSource();
503
+ const sourceKey = source.getKey();
504
+ for (let x = tileRange.minX; x <= tileRange.maxX; ++x) {
505
+ for (let y = tileRange.minY; y <= tileRange.maxY; ++y) {
506
+ const cacheKey = getCacheKey(sourceKey, altZ, x, y);
507
+ let loaded = false;
508
+ if (tileCache.containsKey(cacheKey)) {
509
+ const tile = tileCache.get(cacheKey);
510
+ if (tile.getState() === TileState.LOADED) {
511
+ addTileToLookup(tilesByZ, tile, altZ);
512
+ loaded = true;
513
+ }
514
+ }
515
+ if (!loaded) {
516
+ covered = false;
517
+ }
518
+ }
519
+ }
520
+ return covered;
237
521
  }
238
522
 
239
523
  /**
240
524
  * Render the layer.
525
+ *
526
+ * The frame rendering logic has three parts:
527
+ *
528
+ * 1. Enqueue tiles
529
+ * 2. Find alt tiles for those that are not yet loaded
530
+ * 3. Render loaded tiles
531
+ *
241
532
  * @param {import("../../Map.js").FrameState} frameState Frame state.
242
533
  * @param {HTMLElement} target Target that may be used to render content to.
243
534
  * @return {HTMLElement} The rendered element.
535
+ * @override
244
536
  */
245
537
  renderFrame(frameState, target) {
538
+ this.renderComplete = true;
539
+
540
+ /**
541
+ * TODO:
542
+ * * maybe skip transition when not fully opaque
543
+ * * decide if this.renderComplete is useful
544
+ */
545
+
246
546
  const layerState = frameState.layerStatesArray[frameState.layerIndex];
247
547
  const viewState = frameState.viewState;
248
548
  const projection = viewState.projection;
249
549
  const viewResolution = viewState.resolution;
250
550
  const viewCenter = viewState.center;
251
- const rotation = viewState.rotation;
252
551
  const pixelRatio = frameState.pixelRatio;
253
552
 
254
553
  const tileLayer = this.getLayer();
@@ -258,8 +557,15 @@ class CanvasTileLayerRenderer extends CanvasLayerRenderer {
258
557
  const z = tileGrid.getZForResolution(viewResolution, tileSource.zDirection);
259
558
  const tileResolution = tileGrid.getResolution(z);
260
559
 
261
- let extent = frameState.extent;
262
- const resolution = frameState.viewState.resolution;
560
+ const sourceKey = tileSource.getKey();
561
+ if (!this.renderedSourceKey_) {
562
+ this.renderedSourceKey_ = sourceKey;
563
+ } else if (this.renderedSourceKey_ !== sourceKey) {
564
+ this.prependStaleKey(this.renderedSourceKey_);
565
+ this.renderedSourceKey_ = sourceKey;
566
+ }
567
+
568
+ let frameExtent = frameState.extent;
263
569
  const tilePixelRatio = tileSource.getTilePixelRatio(pixelRatio);
264
570
 
265
571
  this.prepareContainer(frameState, target);
@@ -271,8 +577,8 @@ class CanvasTileLayerRenderer extends CanvasLayerRenderer {
271
577
  const layerExtent =
272
578
  layerState.extent && fromUserExtent(layerState.extent, projection);
273
579
  if (layerExtent) {
274
- extent = getIntersection(
275
- extent,
580
+ frameExtent = getIntersection(
581
+ frameExtent,
276
582
  fromUserExtent(layerState.extent, projection),
277
583
  );
278
584
  }
@@ -286,84 +592,107 @@ class CanvasTileLayerRenderer extends CanvasLayerRenderer {
286
592
  viewCenter[1] + dy,
287
593
  ];
288
594
 
289
- const tileRange = tileGrid.getTileRangeForExtentAndZ(extent, z);
595
+ /**
596
+ * @type {TileLookup}
597
+ */
598
+ const tilesByZ = {};
290
599
 
291
600
  /**
292
- * @type {Object<number, Object<string, import("../../Tile.js").default>>}
601
+ * Part 1: Enqueue tiles
293
602
  */
294
- const tilesToDrawByZ = {};
295
- tilesToDrawByZ[z] = {};
296
603
 
297
- const findLoadedTiles = this.createLoadedTileFinder(
298
- tileSource,
299
- projection,
300
- tilesToDrawByZ,
301
- );
604
+ const preload = tileLayer.getPreload();
605
+ if (frameState.nextExtent) {
606
+ const targetZ = tileGrid.getZForResolution(
607
+ viewState.nextResolution,
608
+ tileSource.zDirection,
609
+ );
610
+ const nextExtent = getRenderExtent(frameState, frameState.nextExtent);
611
+ this.enqueueTiles(frameState, nextExtent, targetZ, tilesByZ, preload);
612
+ }
302
613
 
303
- const tmpExtent = this.tmpExtent;
304
- const tmpTileRange = this.tmpTileRange_;
305
- this.newTiles_ = false;
306
- const viewport = rotation
307
- ? getRotatedViewport(
308
- viewState.center,
309
- resolution,
310
- rotation,
311
- frameState.size,
312
- )
313
- : undefined;
314
- for (let x = tileRange.minX; x <= tileRange.maxX; ++x) {
315
- for (let y = tileRange.minY; y <= tileRange.maxY; ++y) {
316
- if (
317
- rotation &&
318
- !tileGrid.tileCoordIntersectsViewport([z, x, y], viewport)
319
- ) {
614
+ const renderExtent = getRenderExtent(frameState, frameExtent);
615
+ this.enqueueTiles(frameState, renderExtent, z, tilesByZ, 0);
616
+ if (preload > 0) {
617
+ setTimeout(() => {
618
+ this.enqueueTiles(
619
+ frameState,
620
+ renderExtent,
621
+ z - 1,
622
+ tilesByZ,
623
+ preload - 1,
624
+ );
625
+ }, 0);
626
+ }
627
+
628
+ /**
629
+ * Part 2: Find alt tiles for those that are not yet loaded
630
+ */
631
+
632
+ const uid = getUid(this);
633
+ const time = frameState.time;
634
+
635
+ // look for cached tiles to use if a target tile is not ready
636
+ for (const tile of tilesByZ[z]) {
637
+ const tileState = tile.getState();
638
+ if (
639
+ (tile instanceof ReprojTile || tile instanceof ReprojDataTile) &&
640
+ tileState === TileState.EMPTY
641
+ ) {
642
+ continue;
643
+ }
644
+ const tileCoord = tile.tileCoord;
645
+
646
+ if (tileState === TileState.LOADED) {
647
+ const alpha = tile.getAlpha(uid, time);
648
+ if (alpha === 1) {
649
+ // no need to look for alt tiles
650
+ tile.endTransition(uid);
320
651
  continue;
321
652
  }
322
- const tile = this.getTile(z, x, y, frameState);
323
- if (this.isDrawableTile(tile)) {
324
- const uid = getUid(this);
325
- if (tile.getState() == TileState.LOADED) {
326
- tilesToDrawByZ[z][tile.tileCoord.toString()] = tile;
327
- let inTransition = tile.inTransition(uid);
328
- if (inTransition && layerState.opacity !== 1) {
329
- // Skipping transition when layer is not fully opaque avoids visual artifacts.
330
- tile.endTransition(uid);
331
- inTransition = false;
332
- }
333
- if (
334
- !this.newTiles_ &&
335
- (inTransition || !this.renderedTiles.includes(tile))
336
- ) {
337
- this.newTiles_ = true;
338
- }
339
- }
340
- if (tile.getAlpha(uid, frameState.time) === 1) {
341
- // don't look for alt tiles if alpha is 1
342
- continue;
343
- }
344
- }
653
+ }
654
+ this.renderComplete = false;
345
655
 
346
- const childTileRange = tileGrid.getTileCoordChildTileRange(
347
- tile.tileCoord,
348
- tmpTileRange,
349
- tmpExtent,
656
+ const hasStaleTile = this.findStaleTile_(tileCoord, tilesByZ);
657
+ if (hasStaleTile) {
658
+ // use the stale tile before the new tile's transition has completed
659
+ removeTileFromLookup(tilesByZ, tile, z);
660
+ frameState.animate = true;
661
+ continue;
662
+ }
663
+
664
+ // first look for child tiles (at z + 1)
665
+ const coveredByChildren = this.findAltTiles_(
666
+ tileGrid,
667
+ tileCoord,
668
+ z + 1,
669
+ tilesByZ,
670
+ );
671
+
672
+ if (coveredByChildren) {
673
+ continue;
674
+ }
675
+
676
+ // next look for parent tiles
677
+ const minZoom = tileGrid.getMinZoom();
678
+ for (let parentZ = z - 1; parentZ >= minZoom; --parentZ) {
679
+ const coveredByParent = this.findAltTiles_(
680
+ tileGrid,
681
+ tileCoord,
682
+ parentZ,
683
+ tilesByZ,
350
684
  );
351
685
 
352
- let covered = false;
353
- if (childTileRange) {
354
- covered = findLoadedTiles(z + 1, childTileRange);
355
- }
356
- if (!covered) {
357
- tileGrid.forEachTileCoordParentTileRange(
358
- tile.tileCoord,
359
- findLoadedTiles,
360
- tmpTileRange,
361
- tmpExtent,
362
- );
686
+ if (coveredByParent) {
687
+ break;
363
688
  }
364
689
  }
365
690
  }
366
691
 
692
+ /**
693
+ * Part 3: Render loaded tiles
694
+ */
695
+
367
696
  const canvasScale =
368
697
  ((tileResolution / viewResolution) * pixelRatio) / tilePixelRatio;
369
698
 
@@ -381,7 +710,7 @@ class CanvasTileLayerRenderer extends CanvasLayerRenderer {
381
710
  -height / 2,
382
711
  );
383
712
 
384
- if (layerExtent) {
713
+ if (layerState.extent) {
385
714
  this.clipUnrotated(context, frameState, layerExtent);
386
715
  }
387
716
 
@@ -393,20 +722,12 @@ class CanvasTileLayerRenderer extends CanvasLayerRenderer {
393
722
 
394
723
  this.renderedTiles.length = 0;
395
724
  /** @type {Array<number>} */
396
- let zs = Object.keys(tilesToDrawByZ).map(Number);
725
+ const zs = Object.keys(tilesByZ).map(Number);
397
726
  zs.sort(ascending);
398
727
 
399
- let clips, clipZs, currentClip;
400
- if (
401
- layerState.opacity === 1 &&
402
- (!this.containerReused ||
403
- tileSource.getOpaque(frameState.viewState.projection))
404
- ) {
405
- zs = zs.reverse();
406
- } else {
407
- clips = [];
408
- clipZs = [];
409
- }
728
+ let currentClip;
729
+ const clips = [];
730
+ const clipZs = [];
410
731
  for (let i = zs.length - 1; i >= 0; --i) {
411
732
  const currentZ = zs[i];
412
733
  const currentTilePixelSize = tileSource.getTilePixelSize(
@@ -431,11 +752,10 @@ class CanvasTileLayerRenderer extends CanvasLayerRenderer {
431
752
  ]);
432
753
  const tileGutter =
433
754
  tilePixelRatio * tileSource.getGutterForProjection(projection);
434
- const tilesToDraw = tilesToDrawByZ[currentZ];
435
- for (const tileCoordKey in tilesToDraw) {
436
- const tile = /** @type {import("../../ImageTile.js").default} */ (
437
- tilesToDraw[tileCoordKey]
438
- );
755
+ for (const tile of tilesByZ[currentZ]) {
756
+ if (tile.getState() !== TileState.LOADED) {
757
+ continue;
758
+ }
439
759
  const tileCoord = tile.tileCoord;
440
760
 
441
761
  // Calculate integer positions and sizes so that tiles align
@@ -447,67 +767,50 @@ class CanvasTileLayerRenderer extends CanvasLayerRenderer {
447
767
  const y = Math.round(origin[1] - yIndex * dy);
448
768
  const w = nextX - x;
449
769
  const h = nextY - y;
450
- const transition = z === currentZ;
770
+ const transition = zs.length === 1;
451
771
 
452
- const inTransition =
453
- transition && tile.getAlpha(getUid(this), frameState.time) !== 1;
454
772
  let contextSaved = false;
455
- if (!inTransition) {
456
- if (clips) {
457
- // Clip mask for regions in this tile that already filled by a higher z tile
458
- currentClip = [x, y, x + w, y, x + w, y + h, x, y + h];
459
- for (let i = 0, ii = clips.length; i < ii; ++i) {
460
- if (z !== currentZ && currentZ < clipZs[i]) {
461
- const clip = clips[i];
462
- if (
463
- intersects(
464
- [x, y, x + w, y + h],
465
- [clip[0], clip[3], clip[4], clip[7]],
466
- )
467
- ) {
468
- if (!contextSaved) {
469
- context.save();
470
- contextSaved = true;
471
- }
472
- context.beginPath();
473
- // counter-clockwise (outer ring) for current tile
474
- context.moveTo(currentClip[0], currentClip[1]);
475
- context.lineTo(currentClip[2], currentClip[3]);
476
- context.lineTo(currentClip[4], currentClip[5]);
477
- context.lineTo(currentClip[6], currentClip[7]);
478
- // clockwise (inner ring) for higher z tile
479
- context.moveTo(clip[6], clip[7]);
480
- context.lineTo(clip[4], clip[5]);
481
- context.lineTo(clip[2], clip[3]);
482
- context.lineTo(clip[0], clip[1]);
483
- context.clip();
484
- }
773
+
774
+ // Clip mask for regions in this tile that already filled by a higher z tile
775
+ currentClip = [x, y, x + w, y, x + w, y + h, x, y + h];
776
+ for (let i = 0, ii = clips.length; i < ii; ++i) {
777
+ if (!transition && currentZ < clipZs[i]) {
778
+ const clip = clips[i];
779
+ if (
780
+ intersects(
781
+ [x, y, x + w, y + h],
782
+ [clip[0], clip[3], clip[4], clip[7]],
783
+ )
784
+ ) {
785
+ if (!contextSaved) {
786
+ context.save();
787
+ contextSaved = true;
485
788
  }
789
+ context.beginPath();
790
+ // counter-clockwise (outer ring) for current tile
791
+ context.moveTo(currentClip[0], currentClip[1]);
792
+ context.lineTo(currentClip[2], currentClip[3]);
793
+ context.lineTo(currentClip[4], currentClip[5]);
794
+ context.lineTo(currentClip[6], currentClip[7]);
795
+ // clockwise (inner ring) for higher z tile
796
+ context.moveTo(clip[6], clip[7]);
797
+ context.lineTo(clip[4], clip[5]);
798
+ context.lineTo(clip[2], clip[3]);
799
+ context.lineTo(clip[0], clip[1]);
800
+ context.clip();
486
801
  }
487
- clips.push(currentClip);
488
- clipZs.push(currentZ);
489
- } else {
490
- context.clearRect(x, y, w, h);
491
802
  }
492
803
  }
493
- this.drawTileImage(
494
- tile,
495
- frameState,
496
- x,
497
- y,
498
- w,
499
- h,
500
- tileGutter,
501
- transition,
502
- );
503
- if (clips && !inTransition) {
504
- if (contextSaved) {
505
- context.restore();
506
- }
507
- this.renderedTiles.unshift(tile);
508
- } else {
509
- this.renderedTiles.push(tile);
804
+ clips.push(currentClip);
805
+ clipZs.push(currentZ);
806
+
807
+ this.drawTile(tile, frameState, x, y, w, h, tileGutter, transition);
808
+ if (contextSaved) {
809
+ context.restore();
510
810
  }
811
+ this.renderedTiles.unshift(tile);
812
+
813
+ // TODO: decide if this is necessary
511
814
  this.updateUsedTiles(frameState.usedTiles, tileSource, tile);
512
815
  }
513
816
  }
@@ -520,18 +823,6 @@ class CanvasTileLayerRenderer extends CanvasLayerRenderer {
520
823
  this.renderedPixelRatio = pixelRatio;
521
824
  this.renderedProjection = projection;
522
825
 
523
- this.manageTilePyramid(
524
- frameState,
525
- tileSource,
526
- tileGrid,
527
- pixelRatio,
528
- projection,
529
- extent,
530
- z,
531
- tileLayer.getPreload(),
532
- );
533
- this.scheduleExpireCache(frameState, tileSource);
534
-
535
826
  this.postRender(this.context, frameState);
536
827
 
537
828
  if (layerState.extent) {
@@ -539,11 +830,39 @@ class CanvasTileLayerRenderer extends CanvasLayerRenderer {
539
830
  }
540
831
  context.imageSmoothingEnabled = true;
541
832
 
833
+ // TODO: let the renderers manage their own cache instead of managing the source cache
834
+ /**
835
+ * Here we unconditionally expire the source cache since the renderer maintains
836
+ * its own cache.
837
+ * @param {import("../../Map.js").default} map Map.
838
+ * @param {import("../../Map.js").FrameState} frameState Frame state.
839
+ */
840
+ const postRenderFunction = (map, frameState) => {
841
+ const tileSourceKey = getUid(tileSource);
842
+ const wantedTiles = frameState.wantedTiles[tileSourceKey];
843
+ const tilesCount = wantedTiles ? Object.keys(wantedTiles).length : 0;
844
+ this.updateCacheSize(tilesCount);
845
+ this.tileCache_.expireCache();
846
+ };
847
+
848
+ frameState.postRenderFunctions.push(postRenderFunction);
849
+
542
850
  return this.container;
543
851
  }
544
852
 
545
853
  /**
546
- * @param {import("../../ImageTile.js").default} tile Tile.
854
+ * Increases the cache size if needed
855
+ * @param {number} tileCount Minimum number of tiles needed.
856
+ */
857
+ updateCacheSize(tileCount) {
858
+ this.tileCache_.highWaterMark = Math.max(
859
+ this.tileCache_.highWaterMark,
860
+ tileCount * 2,
861
+ );
862
+ }
863
+
864
+ /**
865
+ * @param {import("../../Tile.js").default} tile Tile.
547
866
  * @param {import("../../Map.js").FrameState} frameState Frame state.
548
867
  * @param {number} x Left of the tile.
549
868
  * @param {number} y Top of the tile.
@@ -551,9 +870,20 @@ class CanvasTileLayerRenderer extends CanvasLayerRenderer {
551
870
  * @param {number} h Height of the tile.
552
871
  * @param {number} gutter Tile gutter.
553
872
  * @param {boolean} transition Apply an alpha transition.
873
+ * @protected
554
874
  */
555
- drawTileImage(tile, frameState, x, y, w, h, gutter, transition) {
556
- const image = this.getTileImage(tile);
875
+ drawTile(tile, frameState, x, y, w, h, gutter, transition) {
876
+ let image;
877
+ if (tile instanceof DataTile) {
878
+ image = asImageLike(tile.getData());
879
+ if (!image) {
880
+ throw new Error('Rendering array data is not yet supported');
881
+ }
882
+ } else {
883
+ image = this.getTileImage(
884
+ /** @type {import("../../ImageTile.js").default} */ (tile),
885
+ );
886
+ }
557
887
  if (!image) {
558
888
  return;
559
889
  }
@@ -608,36 +938,6 @@ class CanvasTileLayerRenderer extends CanvasLayerRenderer {
608
938
  return tile.getImage();
609
939
  }
610
940
 
611
- /**
612
- * @param {import("../../Map.js").FrameState} frameState Frame state.
613
- * @param {import("../../source/Tile.js").default} tileSource Tile source.
614
- * @protected
615
- */
616
- scheduleExpireCache(frameState, tileSource) {
617
- if (tileSource.canExpireCache()) {
618
- /**
619
- * @param {import("../../source/Tile.js").default} tileSource Tile source.
620
- * @param {import("../../Map.js").default} map Map.
621
- * @param {import("../../Map.js").FrameState} frameState Frame state.
622
- */
623
- const postRenderFunction = function (tileSource, map, frameState) {
624
- const tileSourceKey = getUid(tileSource);
625
- if (tileSourceKey in frameState.usedTiles) {
626
- tileSource.expireCache(
627
- frameState.viewState.projection,
628
- frameState.usedTiles[tileSourceKey],
629
- );
630
- }
631
- }.bind(null, tileSource);
632
-
633
- frameState.postRenderFunctions.push(
634
- /** @type {import("../../Map.js").PostRenderFunction} */ (
635
- postRenderFunction
636
- ),
637
- );
638
- }
639
- }
640
-
641
941
  /**
642
942
  * @param {!Object<string, !Object<string, boolean>>} usedTiles Used tiles.
643
943
  * @param {import("../../source/Tile.js").default} tileSource Tile source.
@@ -652,90 +952,6 @@ class CanvasTileLayerRenderer extends CanvasLayerRenderer {
652
952
  }
653
953
  usedTiles[tileSourceKey][tile.getKey()] = true;
654
954
  }
655
-
656
- /**
657
- * Manage tile pyramid.
658
- * This function performs a number of functions related to the tiles at the
659
- * current zoom and lower zoom levels:
660
- * - registers idle tiles in frameState.wantedTiles so that they are not
661
- * discarded by the tile queue
662
- * - enqueues missing tiles
663
- * @param {import("../../Map.js").FrameState} frameState Frame state.
664
- * @param {import("../../source/Tile.js").default} tileSource Tile source.
665
- * @param {import("../../tilegrid/TileGrid.js").default} tileGrid Tile grid.
666
- * @param {number} pixelRatio Pixel ratio.
667
- * @param {import("../../proj/Projection.js").default} projection Projection.
668
- * @param {import("../../extent.js").Extent} extent Extent.
669
- * @param {number} currentZ Current Z.
670
- * @param {number} preload Load low resolution tiles up to `preload` levels.
671
- * @param {function(import("../../Tile.js").default):void} [tileCallback] Tile callback.
672
- * @protected
673
- */
674
- manageTilePyramid(
675
- frameState,
676
- tileSource,
677
- tileGrid,
678
- pixelRatio,
679
- projection,
680
- extent,
681
- currentZ,
682
- preload,
683
- tileCallback,
684
- ) {
685
- const tileSourceKey = getUid(tileSource);
686
- if (!(tileSourceKey in frameState.wantedTiles)) {
687
- frameState.wantedTiles[tileSourceKey] = {};
688
- }
689
- const wantedTiles = frameState.wantedTiles[tileSourceKey];
690
- const tileQueue = frameState.tileQueue;
691
- const minZoom = tileGrid.getMinZoom();
692
- const rotation = frameState.viewState.rotation;
693
- const viewport = rotation
694
- ? getRotatedViewport(
695
- frameState.viewState.center,
696
- frameState.viewState.resolution,
697
- rotation,
698
- frameState.size,
699
- )
700
- : undefined;
701
- let tileCount = 0;
702
- let tile, tileRange, tileResolution, x, y, z;
703
- for (z = minZoom; z <= currentZ; ++z) {
704
- tileRange = tileGrid.getTileRangeForExtentAndZ(extent, z, tileRange);
705
- tileResolution = tileGrid.getResolution(z);
706
- for (x = tileRange.minX; x <= tileRange.maxX; ++x) {
707
- for (y = tileRange.minY; y <= tileRange.maxY; ++y) {
708
- if (
709
- rotation &&
710
- !tileGrid.tileCoordIntersectsViewport([z, x, y], viewport)
711
- ) {
712
- continue;
713
- }
714
- if (currentZ - z <= preload) {
715
- ++tileCount;
716
- tile = tileSource.getTile(z, x, y, pixelRatio, projection);
717
- if (tile.getState() == TileState.IDLE) {
718
- wantedTiles[tile.getKey()] = true;
719
- if (!tileQueue.isKeyQueued(tile.getKey())) {
720
- tileQueue.enqueue([
721
- tile,
722
- tileSourceKey,
723
- tileGrid.getTileCoordCenter(tile.tileCoord),
724
- tileResolution,
725
- ]);
726
- }
727
- }
728
- if (tileCallback !== undefined) {
729
- tileCallback(tile);
730
- }
731
- } else {
732
- tileSource.useTile(z, x, y, projection);
733
- }
734
- }
735
- }
736
- }
737
- tileSource.updateCacheSize(tileCount, projection);
738
- }
739
955
  }
740
956
 
741
957
  export default CanvasTileLayerRenderer;