From 90e379782c33c19d839b6d508ba93cde45f7c846 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C3=89ric=20Lemoine?= Date: Sun, 4 Nov 2012 22:49:14 +0100 Subject: [PATCH 1/3] Only appending tiles to the dom after load A port of f46cdb4 to the current master. The tilelayer renderer can be simplified a bit by waiting to append tiles to the dom until they have loaded. Refs #84 and #33. --- src/ol/renderer/dom/domtilelayerrenderer.js | 66 ++------------------- 1 file changed, 5 insertions(+), 61 deletions(-) diff --git a/src/ol/renderer/dom/domtilelayerrenderer.js b/src/ol/renderer/dom/domtilelayerrenderer.js index 477eae9f3d..216ab5ce8e 100644 --- a/src/ol/renderer/dom/domtilelayerrenderer.js +++ b/src/ol/renderer/dom/domtilelayerrenderer.js @@ -32,20 +32,6 @@ ol.renderer.dom.TileLayer = function(mapRenderer, tileLayer, target) { * @private */ this.renderedMapResolution_ = undefined; - - /** - * @type {number|undefined} - * @private - */ - this.renderedZ_ = undefined; - - /** - * Map of tile keys loading at the currently rendered z. - * @type {Object.} - * @private - */ - this.loadingTiles_ = {}; - }; goog.inherits(ol.renderer.dom.TileLayer, ol.renderer.dom.Layer); @@ -104,42 +90,8 @@ ol.renderer.dom.TileLayer.prototype.removeExtraTiles_ = * @private */ ol.renderer.dom.TileLayer.prototype.handleTileChange_ = function(event) { - var tile = event.target; - goog.asserts.assert(tile.getState() == ol.TileState.LOADED); - var tileCoord = tile.tileCoord; - if (tileCoord.z === this.renderedZ_) { - var key = tileCoord.toString(); - delete this.loadingTiles_[key]; - } - var loaded = true; - for (var key in this.loadingTiles_) { - loaded = false; - break; - } - if (loaded) { - var z = this.renderedZ_; - for (var key in this.renderedTiles_) { - tileCoord = ol.TileCoord.createFromString(key); - if (tileCoord.z !== z) { - tile = this.renderedTiles_[key]; - delete this.renderedTiles_[key]; - goog.dom.removeNode(tile.getImage(this)); - } - } - } -}; - - -/** - * Remove all loading tiles that have been appended. - * @private - */ -ol.renderer.dom.TileLayer.prototype.removeLoadingTiles_ = function() { - for (var key in this.loadingTiles_) { - var tile = this.loadingTiles_[key]; - goog.dom.removeNode(tile.getImage(this)); - delete this.loadingTiles_[key]; - } + goog.asserts.assert(event.target.getState() == ol.TileState.LOADED); + this.render(); }; @@ -163,11 +115,6 @@ ol.renderer.dom.TileLayer.prototype.render = function() { // z represents the "best" resolution var z = tileGrid.getZForResolution(mapResolution); - if (z != this.renderedZ_) { - // no longer wait for previously loading tiles - this.removeLoadingTiles_(); - } - /** * @type {Object.>} */ @@ -187,18 +134,16 @@ ol.renderer.dom.TileLayer.prototype.render = function() { } var key = tile.tileCoord.toString(); - if (tile.getState() == ol.TileState.LOADED) { + var state = tile.getState(); + if (state == ol.TileState.LOADED) { tilesToDrawByZ[z][key] = tile; return; } else { - if (!(key in this.loadingTiles_)) { + if (state != ol.TileState.LOADING) { goog.events.listen(tile, goog.events.EventType.CHANGE, this.handleTileChange_, false, this); - this.loadingTiles_[key] = tile; tile.load(); } - // TODO: only append after load? - tilesToDrawByZ[z][key] = tile; } /** @@ -284,7 +229,6 @@ ol.renderer.dom.TileLayer.prototype.render = function() { goog.dom.appendChild(this.target, fragment); } - this.renderedZ_ = z; this.renderedMapResolution_ = mapResolution; this.removeExtraTiles_(tilesToDrawByZ); From 826505c6d4ca12c4b08e996a4d36db380cc075ff Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C3=89ric=20Lemoine?= Date: Thu, 8 Nov 2012 21:20:26 +0100 Subject: [PATCH 2/3] Register a CHANGE listener even if tile is loading This fixes an issue easily reproducible in the side-by-side example where the DOM renderer is not notified when tiles loaded by the WebGL renderer have been received. --- src/ol/renderer/dom/domtilelayerrenderer.js | 8 +++----- 1 file changed, 3 insertions(+), 5 deletions(-) diff --git a/src/ol/renderer/dom/domtilelayerrenderer.js b/src/ol/renderer/dom/domtilelayerrenderer.js index 216ab5ce8e..782313a46d 100644 --- a/src/ol/renderer/dom/domtilelayerrenderer.js +++ b/src/ol/renderer/dom/domtilelayerrenderer.js @@ -139,11 +139,9 @@ ol.renderer.dom.TileLayer.prototype.render = function() { tilesToDrawByZ[z][key] = tile; return; } else { - if (state != ol.TileState.LOADING) { - goog.events.listen(tile, goog.events.EventType.CHANGE, - this.handleTileChange_, false, this); - tile.load(); - } + goog.events.listen(tile, goog.events.EventType.CHANGE, + this.handleTileChange_, false, this); + tile.load(); } /** From 7b88f44a4181d92c52f590a830168b1091715fc6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C3=89ric=20Lemoine?= Date: Sun, 11 Nov 2012 21:31:12 +0100 Subject: [PATCH 3/3] Keep track of tiles we're already listening on --- src/ol/renderer/dom/domtilelayerrenderer.js | 21 +++++++++++++++++---- 1 file changed, 17 insertions(+), 4 deletions(-) diff --git a/src/ol/renderer/dom/domtilelayerrenderer.js b/src/ol/renderer/dom/domtilelayerrenderer.js index 782313a46d..7b3abd7d0d 100644 --- a/src/ol/renderer/dom/domtilelayerrenderer.js +++ b/src/ol/renderer/dom/domtilelayerrenderer.js @@ -32,6 +32,12 @@ ol.renderer.dom.TileLayer = function(mapRenderer, tileLayer, target) { * @private */ this.renderedMapResolution_ = undefined; + + /** + * @type {Object.} + * @private + */ + this.tileChangeListenerKeys_ = {}; }; goog.inherits(ol.renderer.dom.TileLayer, ol.renderer.dom.Layer); @@ -90,7 +96,11 @@ ol.renderer.dom.TileLayer.prototype.removeExtraTiles_ = * @private */ ol.renderer.dom.TileLayer.prototype.handleTileChange_ = function(event) { - goog.asserts.assert(event.target.getState() == ol.TileState.LOADED); + var tile = /** @type {ol.Tile} */ (event.target); + goog.asserts.assert(tile.getState() == ol.TileState.LOADED); + var tileKey = goog.getUid(tile); + goog.asserts.assert(tileKey in this.tileChangeListenerKeys_); + delete this.tileChangeListenerKeys_[tileKey]; this.render(); }; @@ -139,9 +149,12 @@ ol.renderer.dom.TileLayer.prototype.render = function() { tilesToDrawByZ[z][key] = tile; return; } else { - goog.events.listen(tile, goog.events.EventType.CHANGE, - this.handleTileChange_, false, this); - tile.load(); + var tileKey = goog.getUid(tile); + if (!(tileKey in this.tileChangeListenerKeys_)) { + this.tileChangeListenerKeys_[tileKey] = goog.events.listen(tile, + goog.events.EventType.CHANGE, this.handleTileChange_, false, this); + tile.load(); + } } /**