From e513b8cc390ba7022fead343db99269c6dbb5bcc Mon Sep 17 00:00:00 2001 From: Tom Payne Date: Thu, 21 Feb 2013 16:12:45 +0100 Subject: [PATCH 1/6] Make it explicit that functions operate on tile sources --- src/ol/renderer/layerrenderer.js | 31 +++++++++++++++---------------- 1 file changed, 15 insertions(+), 16 deletions(-) diff --git a/src/ol/renderer/layerrenderer.js b/src/ol/renderer/layerrenderer.js index 3379e0da5e..f1477ac8d7 100644 --- a/src/ol/renderer/layerrenderer.js +++ b/src/ol/renderer/layerrenderer.js @@ -14,7 +14,6 @@ goog.require('ol.TileState'); goog.require('ol.layer.Layer'); goog.require('ol.layer.LayerProperty'); goog.require('ol.layer.LayerState'); -goog.require('ol.source.Source'); goog.require('ol.source.TileSource'); @@ -222,24 +221,24 @@ ol.renderer.Layer.prototype.updateAttributions = /** * @protected * @param {Object.>} usedTiles Used tiles. - * @param {ol.source.Source} source Source. + * @param {ol.source.TileSource} tileSource Tile source. * @param {number} z Z. * @param {ol.TileRange} tileRange Tile range. */ ol.renderer.Layer.prototype.updateUsedTiles = - function(usedTiles, source, z, tileRange) { + function(usedTiles, tileSource, z, tileRange) { // FIXME should we use tilesToDrawByZ instead? - var sourceKey = goog.getUid(source).toString(); + var tileSourceKey = goog.getUid(tileSource).toString(); var zKey = z.toString(); - if (sourceKey in usedTiles) { - if (zKey in usedTiles[sourceKey]) { - usedTiles[sourceKey][zKey].extend(tileRange); + if (tileSourceKey in usedTiles) { + if (zKey in usedTiles[tileSourceKey]) { + usedTiles[tileSourceKey][zKey].extend(tileRange); } else { - usedTiles[sourceKey][zKey] = tileRange; + usedTiles[tileSourceKey][zKey] = tileRange; } } else { - usedTiles[sourceKey] = {}; - usedTiles[sourceKey][zKey] = tileRange; + usedTiles[tileSourceKey] = {}; + usedTiles[tileSourceKey][zKey] = tileRange; } }; @@ -247,15 +246,15 @@ ol.renderer.Layer.prototype.updateUsedTiles = /** * @protected * @param {Object.>} wantedTiles Wanted tiles. - * @param {ol.source.Source} source Source. + * @param {ol.source.TileSource} tileSource Tile source. * @param {ol.TileCoord} tileCoord Tile coordinate. */ ol.renderer.Layer.prototype.updateWantedTiles = - function(wantedTiles, source, tileCoord) { - var sourceKey = goog.getUid(source).toString(); + function(wantedTiles, tileSource, tileCoord) { + var tileSourceKey = goog.getUid(tileSource).toString(); var coordKey = tileCoord.toString(); - if (!(sourceKey in wantedTiles)) { - wantedTiles[sourceKey] = {}; + if (!(tileSourceKey in wantedTiles)) { + wantedTiles[tileSourceKey] = {}; } - wantedTiles[sourceKey][coordKey] = true; + wantedTiles[tileSourceKey][coordKey] = true; }; From e68c1adbae62f290f9cef6480daefec6d33ff212 Mon Sep 17 00:00:00 2001 From: Tom Payne Date: Thu, 21 Feb 2013 16:13:34 +0100 Subject: [PATCH 2/6] Add ol.source.TileSource.useTile --- src/ol/source/tilesource.js | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/src/ol/source/tilesource.js b/src/ol/source/tilesource.js index e9666dada6..2199511127 100644 --- a/src/ol/source/tilesource.js +++ b/src/ol/source/tilesource.js @@ -119,3 +119,10 @@ ol.source.TileSource.prototype.getTile = goog.abstractMethod; ol.source.TileSource.prototype.getTileGrid = function() { return this.tileGrid; }; + + +/** + * Marks a tile coord as being used, without triggering a load. + * @param {ol.TileCoord} tileCoord Tile coordinate. + */ +ol.source.TileSource.prototype.useTile = goog.nullFunction; From 57b446fa0a8fd479452d9d6f3cd938ad15703456 Mon Sep 17 00:00:00 2001 From: Tom Payne Date: Thu, 21 Feb 2013 16:14:15 +0100 Subject: [PATCH 3/6] Implement useTile for image tile sources with caches --- src/ol/source/imagetilesource.js | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/src/ol/source/imagetilesource.js b/src/ol/source/imagetilesource.js index 4a59b1bcff..d47b9215e5 100644 --- a/src/ol/source/imagetilesource.js +++ b/src/ol/source/imagetilesource.js @@ -109,3 +109,14 @@ ol.source.ImageTileSource.prototype.getTile = function(tileCoord) { ol.source.ImageTileSource.prototype.getTileCoordUrl = function(tileCoord) { return this.tileUrlFunction(tileCoord); }; + + +/** + * @inheritDoc + */ +ol.source.ImageTileSource.prototype.useTile = function(tileCoord) { + var key = tileCoord.toString(); + if (this.tileCache_.containsKey(key)) { + this.tileCache_.get(key); + } +}; From 47e799ced0b580f1e369c13c1e7450dae3097251 Mon Sep 17 00:00:00 2001 From: Tom Payne Date: Thu, 21 Feb 2013 16:14:51 +0100 Subject: [PATCH 4/6] Mark all low resolution tiles as used to prevent cache expiration --- .../canvas/canvastilelayerrenderer.js | 1 + src/ol/renderer/dom/domtilelayerrenderer.js | 1 + src/ol/renderer/layerrenderer.js | 23 +++++++++++++++++++ .../renderer/webgl/webgltilelayerrenderer.js | 1 + 4 files changed, 26 insertions(+) diff --git a/src/ol/renderer/canvas/canvastilelayerrenderer.js b/src/ol/renderer/canvas/canvastilelayerrenderer.js index e7c48f044c..c60ef7e49a 100644 --- a/src/ol/renderer/canvas/canvastilelayerrenderer.js +++ b/src/ol/renderer/canvas/canvastilelayerrenderer.js @@ -199,6 +199,7 @@ ol.renderer.canvas.TileLayer.prototype.renderFrame = } this.updateUsedTiles(frameState.usedTiles, tileSource, z, tileRange); + this.useLowResolutionTiles(tileSource, z, frameState.extent); this.scheduleExpireCache(frameState, tileSource); var transform = this.transform_; diff --git a/src/ol/renderer/dom/domtilelayerrenderer.js b/src/ol/renderer/dom/domtilelayerrenderer.js index faeb67d47d..3821f2a22b 100644 --- a/src/ol/renderer/dom/domtilelayerrenderer.js +++ b/src/ol/renderer/dom/domtilelayerrenderer.js @@ -217,6 +217,7 @@ ol.renderer.dom.TileLayer.prototype.renderFrame = } this.updateUsedTiles(frameState.usedTiles, tileSource, z, tileRange); + this.useLowResolutionTiles(tileSource, z, frameState.extent); this.scheduleExpireCache(frameState, tileSource); }; diff --git a/src/ol/renderer/layerrenderer.js b/src/ol/renderer/layerrenderer.js index f1477ac8d7..beb91f376a 100644 --- a/src/ol/renderer/layerrenderer.js +++ b/src/ol/renderer/layerrenderer.js @@ -3,6 +3,7 @@ goog.provide('ol.renderer.Layer'); goog.require('goog.events'); goog.require('goog.events.EventType'); goog.require('ol.Attribution'); +goog.require('ol.Extent'); goog.require('ol.FrameState'); goog.require('ol.Image'); goog.require('ol.ImageState'); @@ -258,3 +259,25 @@ ol.renderer.Layer.prototype.updateWantedTiles = } wantedTiles[tileSourceKey][coordKey] = true; }; + + +/** + * @protected + * @param {ol.source.TileSource} tileSource Tile source. + * @param {number} z Z. + * @param {ol.Extent} extent Extent. + */ +ol.renderer.Layer.prototype.useLowResolutionTiles = + function(tileSource, z, extent) { + var tileGrid = tileSource.getTileGrid(); + var tileRange, x, y, zKey; + // FIXME this should loop up to tileGrid's minZ when implemented + for (; z >= 0; --z) { + tileRange = tileGrid.getTileRangeForExtentAndZ(extent, z); + for (x = tileRange.minX; x <= tileRange.maxX; ++x) { + for (y = tileRange.minY; y <= tileRange.maxY; ++y) { + tileSource.useTile(new ol.TileCoord(z, x, y)); + } + } + } +}; diff --git a/src/ol/renderer/webgl/webgltilelayerrenderer.js b/src/ol/renderer/webgl/webgltilelayerrenderer.js index 53405ca10a..0e939f8665 100644 --- a/src/ol/renderer/webgl/webgltilelayerrenderer.js +++ b/src/ol/renderer/webgl/webgltilelayerrenderer.js @@ -459,6 +459,7 @@ ol.renderer.webgl.TileLayer.prototype.renderFrame = } this.updateUsedTiles(frameState.usedTiles, tileSource, z, tileRange); + this.useLowResolutionTiles(tileSource, z, frameState.extent); this.scheduleExpireCache(frameState, tileSource); goog.vec.Mat4.makeIdentity(this.texCoordMatrix_); From 4c9b70fa5c21c86204f57b6dcd517756f1a293d1 Mon Sep 17 00:00:00 2001 From: Tom Payne Date: Thu, 21 Feb 2013 16:47:10 +0100 Subject: [PATCH 5/6] Move useLowResolutionTiles from layer renderer to tile source --- .../canvas/canvastilelayerrenderer.js | 2 +- src/ol/renderer/dom/domtilelayerrenderer.js | 2 +- src/ol/renderer/layerrenderer.js | 23 ------------------- .../renderer/webgl/webgltilelayerrenderer.js | 2 +- src/ol/source/tilesource.js | 19 +++++++++++++++ 5 files changed, 22 insertions(+), 26 deletions(-) diff --git a/src/ol/renderer/canvas/canvastilelayerrenderer.js b/src/ol/renderer/canvas/canvastilelayerrenderer.js index c60ef7e49a..8cd80ac388 100644 --- a/src/ol/renderer/canvas/canvastilelayerrenderer.js +++ b/src/ol/renderer/canvas/canvastilelayerrenderer.js @@ -199,7 +199,7 @@ ol.renderer.canvas.TileLayer.prototype.renderFrame = } this.updateUsedTiles(frameState.usedTiles, tileSource, z, tileRange); - this.useLowResolutionTiles(tileSource, z, frameState.extent); + tileSource.useLowResolutionTiles(z, frameState.extent); this.scheduleExpireCache(frameState, tileSource); var transform = this.transform_; diff --git a/src/ol/renderer/dom/domtilelayerrenderer.js b/src/ol/renderer/dom/domtilelayerrenderer.js index 3821f2a22b..81c50f779e 100644 --- a/src/ol/renderer/dom/domtilelayerrenderer.js +++ b/src/ol/renderer/dom/domtilelayerrenderer.js @@ -217,7 +217,7 @@ ol.renderer.dom.TileLayer.prototype.renderFrame = } this.updateUsedTiles(frameState.usedTiles, tileSource, z, tileRange); - this.useLowResolutionTiles(tileSource, z, frameState.extent); + tileSource.useLowResolutionTiles(z, frameState.extent); this.scheduleExpireCache(frameState, tileSource); }; diff --git a/src/ol/renderer/layerrenderer.js b/src/ol/renderer/layerrenderer.js index beb91f376a..f1477ac8d7 100644 --- a/src/ol/renderer/layerrenderer.js +++ b/src/ol/renderer/layerrenderer.js @@ -3,7 +3,6 @@ goog.provide('ol.renderer.Layer'); goog.require('goog.events'); goog.require('goog.events.EventType'); goog.require('ol.Attribution'); -goog.require('ol.Extent'); goog.require('ol.FrameState'); goog.require('ol.Image'); goog.require('ol.ImageState'); @@ -259,25 +258,3 @@ ol.renderer.Layer.prototype.updateWantedTiles = } wantedTiles[tileSourceKey][coordKey] = true; }; - - -/** - * @protected - * @param {ol.source.TileSource} tileSource Tile source. - * @param {number} z Z. - * @param {ol.Extent} extent Extent. - */ -ol.renderer.Layer.prototype.useLowResolutionTiles = - function(tileSource, z, extent) { - var tileGrid = tileSource.getTileGrid(); - var tileRange, x, y, zKey; - // FIXME this should loop up to tileGrid's minZ when implemented - for (; z >= 0; --z) { - tileRange = tileGrid.getTileRangeForExtentAndZ(extent, z); - for (x = tileRange.minX; x <= tileRange.maxX; ++x) { - for (y = tileRange.minY; y <= tileRange.maxY; ++y) { - tileSource.useTile(new ol.TileCoord(z, x, y)); - } - } - } -}; diff --git a/src/ol/renderer/webgl/webgltilelayerrenderer.js b/src/ol/renderer/webgl/webgltilelayerrenderer.js index 0e939f8665..16df44aa6d 100644 --- a/src/ol/renderer/webgl/webgltilelayerrenderer.js +++ b/src/ol/renderer/webgl/webgltilelayerrenderer.js @@ -459,7 +459,7 @@ ol.renderer.webgl.TileLayer.prototype.renderFrame = } this.updateUsedTiles(frameState.usedTiles, tileSource, z, tileRange); - this.useLowResolutionTiles(tileSource, z, frameState.extent); + tileSource.useLowResolutionTiles(z, frameState.extent); this.scheduleExpireCache(frameState, tileSource); goog.vec.Mat4.makeIdentity(this.texCoordMatrix_); diff --git a/src/ol/source/tilesource.js b/src/ol/source/tilesource.js index 2199511127..2afd321a1b 100644 --- a/src/ol/source/tilesource.js +++ b/src/ol/source/tilesource.js @@ -121,6 +121,25 @@ ol.source.TileSource.prototype.getTileGrid = function() { }; +/** + * @param {number} z Z. + * @param {ol.Extent} extent Extent. + */ +ol.source.TileSource.prototype.useLowResolutionTiles = function(z, extent) { + var tileGrid = this.getTileGrid(); + var tileRange, x, y, zKey; + // FIXME this should loop up to tileGrid's minZ when implemented + for (; z >= 0; --z) { + tileRange = tileGrid.getTileRangeForExtentAndZ(extent, z); + for (x = tileRange.minX; x <= tileRange.maxX; ++x) { + for (y = tileRange.minY; y <= tileRange.maxY; ++y) { + this.useTile(new ol.TileCoord(z, x, y)); + } + } + } +}; + + /** * Marks a tile coord as being used, without triggering a load. * @param {ol.TileCoord} tileCoord Tile coordinate. From c36de098bd9ffb941d93fc2d76c372d19059dbf5 Mon Sep 17 00:00:00 2001 From: Tom Payne Date: Thu, 21 Feb 2013 16:52:52 +0100 Subject: [PATCH 6/6] Avoid creating a TileCoord object when marking used tiles --- src/ol/source/tilesource.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/ol/source/tilesource.js b/src/ol/source/tilesource.js index 2afd321a1b..c250951e7e 100644 --- a/src/ol/source/tilesource.js +++ b/src/ol/source/tilesource.js @@ -133,7 +133,7 @@ ol.source.TileSource.prototype.useLowResolutionTiles = function(z, extent) { tileRange = tileGrid.getTileRangeForExtentAndZ(extent, z); for (x = tileRange.minX; x <= tileRange.maxX; ++x) { for (y = tileRange.minY; y <= tileRange.maxY; ++y) { - this.useTile(new ol.TileCoord(z, x, y)); + this.useTile(z + '/' + x + '/' + y); } } } @@ -142,6 +142,6 @@ ol.source.TileSource.prototype.useLowResolutionTiles = function(z, extent) { /** * Marks a tile coord as being used, without triggering a load. - * @param {ol.TileCoord} tileCoord Tile coordinate. + * @param {string} tileCoordKey Tile coordinate key. */ ol.source.TileSource.prototype.useTile = goog.nullFunction;