From edbe2316efe32767c1b6ffb78fcba1ee5567a6e4 Mon Sep 17 00:00:00 2001 From: ahocevar Date: Fri, 16 Nov 2018 15:01:00 +0100 Subject: [PATCH] Lazily create interim tiles (fixes most tests) --- src/ol/VectorImageTile.js | 47 +++++++++++-------- .../renderer/canvas/vectortilelayer.test.js | 7 +-- 2 files changed, 31 insertions(+), 23 deletions(-) diff --git a/src/ol/VectorImageTile.js b/src/ol/VectorImageTile.js index a8531a7dbe..daacded3bb 100644 --- a/src/ol/VectorImageTile.js +++ b/src/ol/VectorImageTile.js @@ -103,8 +103,6 @@ class VectorImageTile extends Tile { */ this.sourceTileListenerKeys_ = []; - this.sourceTilesLoaded = false; - /** * Use only source tiles that are loaded already * @type {boolean} @@ -150,35 +148,44 @@ class VectorImageTile extends Tile { this.finishLoading_(); } - if (!this.sourceTilesLoaded && !useLoadedOnly) { - let bestZoom = -1; - for (const key in sourceTiles) { - const sourceTile = sourceTiles[key]; - if (sourceTile.getState() === TileState.LOADED) { - const sourceTileCoord = sourceTile.tileCoord; - const sourceTileExtent = sourceTileGrid.getTileCoordExtent(sourceTileCoord); - if (containsExtent(sourceTileExtent, extent) && sourceTileCoord[0] > bestZoom) { - bestZoom = sourceTileCoord[0]; + this.createInterimTile_ = function() { + if (this.getState() !== TileState.LOADED && !useLoadedOnly) { + let bestZoom = -1; + for (const key in sourceTiles) { + const sourceTile = sourceTiles[key]; + if (sourceTile.getState() === TileState.LOADED) { + const sourceTileCoord = sourceTile.tileCoord; + const sourceTileExtent = sourceTileGrid.getTileCoordExtent(sourceTileCoord); + if (containsExtent(sourceTileExtent, extent) && sourceTileCoord[0] > bestZoom) { + bestZoom = sourceTileCoord[0]; + } } } - } - if (bestZoom !== -1) { - const tile = new VectorImageTile(tileCoord, state, sourceRevision, - format, tileLoadFunction, urlTileCoord, tileUrlFunction, - sourceTileGrid, tileGrid, sourceTiles, pixelRatio, projection, - tileClass, VOID, bestZoom); - this.interimTile = tile; - } + if (bestZoom !== -1) { + const tile = new VectorImageTile(tileCoord, state, sourceRevision, + format, tileLoadFunction, urlTileCoord, tileUrlFunction, + sourceTileGrid, tileGrid, sourceTiles, pixelRatio, projection, + tileClass, VOID, bestZoom); + this.interimTile = tile; + } + } } } } + getInterimTile() { + if (!this.interimTile) { + this.createInterimTile_(); + } + return super.getInterimTile(); + } + /** * @inheritDoc */ disposeInternal() { - this.getInterimTile = super.getInterimTile; + delete this.createInterimTile_; this.state = TileState.ABORT; this.changed(); if (this.interimTile) { diff --git a/test/spec/ol/renderer/canvas/vectortilelayer.test.js b/test/spec/ol/renderer/canvas/vectortilelayer.test.js index 96f5ab22f6..0e8793850f 100644 --- a/test/spec/ol/renderer/canvas/vectortilelayer.test.js +++ b/test/spec/ol/renderer/canvas/vectortilelayer.test.js @@ -75,6 +75,7 @@ describe('ol.renderer.canvas.VectorTileLayer', function() { tileGrid: createXYZ() }); source.getTile = function() { + arguments[1] = TileState.LOADED; const tile = VectorTileSource.prototype.getTile.apply(source, arguments); tile.setState(TileState.LOADED); return tile; @@ -106,7 +107,7 @@ describe('ol.renderer.canvas.VectorTileLayer', function() { map.removeLayer(layer); map.addLayer(testLayer); const spy = sinon.spy(CanvasVectorTileLayerRenderer.prototype, - 'getTransform'); + 'getRenderTransform'); map.renderSync(); expect(spy.callCount).to.be(0); spy.restore(); @@ -114,7 +115,7 @@ describe('ol.renderer.canvas.VectorTileLayer', function() { it('renders both replays and images for hybrid rendering', function() { const spy1 = sinon.spy(CanvasVectorTileLayerRenderer.prototype, - 'getTransform'); + 'getRenderTransform'); const spy2 = sinon.spy(CanvasVectorTileLayerRenderer.prototype, 'renderTileImage_'); map.renderSync(); @@ -129,7 +130,7 @@ describe('ol.renderer.canvas.VectorTileLayer', function() { renderer: function() {} })); const spy = sinon.spy(CanvasVectorTileLayerRenderer.prototype, - 'getTransform'); + 'getRenderTransform'); map.renderSync(); expect(spy.callCount).to.be(1); spy.restore();