From 7b5868546254e844dad8f2470e15779f837b1084 Mon Sep 17 00:00:00 2001 From: Tom Payne Date: Tue, 9 Apr 2013 15:20:47 +0200 Subject: [PATCH 01/10] Add ol.TileCoord.createOrUpdate --- src/ol/tilecoord.js | 19 +++++++++++++++++++ 1 file changed, 19 insertions(+) diff --git a/src/ol/tilecoord.js b/src/ol/tilecoord.js index a6f671e33c..66ce92882d 100644 --- a/src/ol/tilecoord.js +++ b/src/ol/tilecoord.js @@ -83,6 +83,25 @@ ol.TileCoord.createFromString = function(str) { }; +/** + * @param {number} z Z. + * @param {number} x X. + * @param {number} y Y. + * @param {ol.TileCoord|undefined} tileCoord Tile coordinate. + * @return {ol.TileCoord} Tile coordinate. + */ +ol.TileCoord.createOrUpdate = function(z, x, y, tileCoord) { + if (goog.isDef(tileCoord)) { + tileCoord.z = z; + tileCoord.x = x; + tileCoord.y = y; + return tileCoord; + } else { + return new ol.TileCoord(z, x, y); + } +}; + + /** * @param {number} z Z. * @param {number} x X. From 5a4033db7aedbb3d7e1137546f22f948de4e80b0 Mon Sep 17 00:00:00 2001 From: Tom Payne Date: Tue, 9 Apr 2013 15:23:11 +0200 Subject: [PATCH 02/10] Enable ol.TileCoord re-use --- src/ol/tilegrid/tilegrid.js | 15 +++++++++------ 1 file changed, 9 insertions(+), 6 deletions(-) diff --git a/src/ol/tilegrid/tilegrid.js b/src/ol/tilegrid/tilegrid.js index a210631eed..60df10b90d 100644 --- a/src/ol/tilegrid/tilegrid.js +++ b/src/ol/tilegrid/tilegrid.js @@ -262,12 +262,13 @@ ol.tilegrid.TileGrid.prototype.getTileCoordExtent = function(tileCoord) { * * @param {ol.Coordinate} coordinate Coordinate. * @param {number} resolution Resolution. + * @param {ol.TileCoord=} opt_tileCoord Destination ol.TileCoord object. * @return {ol.TileCoord} Tile coordinate. */ ol.tilegrid.TileGrid.prototype.getTileCoordForCoordAndResolution = function( - coordinate, resolution) { + coordinate, resolution, opt_tileCoord) { return this.getTileCoordForXYAndResolution_( - coordinate[0], coordinate[1], resolution, false); + coordinate[0], coordinate[1], resolution, false, opt_tileCoord); }; @@ -278,11 +279,12 @@ ol.tilegrid.TileGrid.prototype.getTileCoordForCoordAndResolution = function( * @param {boolean} reverseIntersectionPolicy Instead of letting edge * intersections go to the higher tile coordinate, let edge intersections * go to the lower tile coordinate. + * @param {ol.TileCoord=} opt_tileCoord Temporary ol.TileCoord object. * @return {ol.TileCoord} Tile coordinate. * @private */ ol.tilegrid.TileGrid.prototype.getTileCoordForXYAndResolution_ = function( - x, y, resolution, reverseIntersectionPolicy) { + x, y, resolution, reverseIntersectionPolicy, opt_tileCoord) { var z = this.getZForResolution(resolution); var scale = resolution / this.getResolution(z); var origin = this.getOrigin(z); @@ -299,20 +301,21 @@ ol.tilegrid.TileGrid.prototype.getTileCoordForXYAndResolution_ = function( tileCoordY = Math.floor(tileCoordY); } - return new ol.TileCoord(z, tileCoordX, tileCoordY); + return ol.TileCoord.createOrUpdate(z, tileCoordX, tileCoordY, opt_tileCoord); }; /** * @param {ol.Coordinate} coordinate Coordinate. * @param {number} z Z. + * @param {ol.TileCoord=} opt_tileCoord Destination ol.TileCoord object. * @return {ol.TileCoord} Tile coordinate. */ ol.tilegrid.TileGrid.prototype.getTileCoordForCoordAndZ = - function(coordinate, z) { + function(coordinate, z, opt_tileCoord) { var resolution = this.getResolution(z); return this.getTileCoordForXYAndResolution_( - coordinate[0], coordinate[1], resolution, false); + coordinate[0], coordinate[1], resolution, false, opt_tileCoord); }; From 5bd67e13256da98db00ce70387e371b46566d01c Mon Sep 17 00:00:00 2001 From: Tom Payne Date: Tue, 9 Apr 2013 15:28:49 +0200 Subject: [PATCH 03/10] Re-use ol.TileCoord objects --- src/ol/source/wmtssource.js | 7 +++++-- src/ol/source/xyzsource.js | 7 +++++-- src/ol/tilegrid/tilegrid.js | 10 ++++++---- 3 files changed, 16 insertions(+), 8 deletions(-) diff --git a/src/ol/source/wmtssource.js b/src/ol/source/wmtssource.js index 51cdbd037d..0f94d03dff 100644 --- a/src/ol/source/wmtssource.js +++ b/src/ol/source/wmtssource.js @@ -113,6 +113,7 @@ ol.source.WMTS = function(options) { })); } + var tmpTileCoord = new ol.TileCoord(0, 0, 0); tileUrlFunction = ol.TileUrlFunction.withTileCoordTransform( function(tileCoord, projection) { var tileGrid = this.getTileGrid(); @@ -134,8 +135,10 @@ ol.source.WMTS = function(options) { (extent.maxX - extent.minX) / (tileExtent.maxX - tileExtent.minX)); x = goog.math.modulo(x, numCols); - tileExtent = tileGrid.getTileCoordExtent( - new ol.TileCoord(tileCoord.z, x, tileCoord.y)); + tmpTileCoord.z = tileCoord.z; + tmpTileCoord.x = x; + tmpTileCoord.y = tileCoord.y; + tileExtent = tileGrid.getTileCoordExtent(tmpTileCoord); } if (!tileExtent.intersects(extent)) { return null; diff --git a/src/ol/source/xyzsource.js b/src/ol/source/xyzsource.js index 8ee937578d..508a8a501c 100644 --- a/src/ol/source/xyzsource.js +++ b/src/ol/source/xyzsource.js @@ -61,6 +61,7 @@ ol.source.XYZ = function(options) { var extent = options.extent; if (goog.isDefAndNotNull(extent)) { + var tmpTileCoord = new ol.TileCoord(0, 0, 0); tileUrlFunction = ol.TileUrlFunction.withTileCoordTransform( function(tileCoord) { if (options.maxZoom < tileCoord.z) { @@ -72,8 +73,10 @@ ol.source.XYZ = function(options) { return null; } var x = goog.math.modulo(tileCoord.x, n); - var tileExtent = tileGrid.getTileCoordExtent( - new ol.TileCoord(tileCoord.z, x, tileCoord.y)); + tmpTileCoord.z = tileCoord.z; + tmpTileCoord.x = x; + tmpTileCoord.y = tileCoord.y; + var tileExtent = tileGrid.getTileCoordExtent(tmpTileCoord); // FIXME we shouldn't need a typecast here if (!tileExtent.intersects(/** @type {ol.Extent} */ (extent))) { return null; diff --git a/src/ol/tilegrid/tilegrid.js b/src/ol/tilegrid/tilegrid.js index 60df10b90d..91863a9540 100644 --- a/src/ol/tilegrid/tilegrid.js +++ b/src/ol/tilegrid/tilegrid.js @@ -205,11 +205,13 @@ ol.tilegrid.TileGrid.prototype.getTileRangeExtent = function(z, tileRange) { */ ol.tilegrid.TileGrid.prototype.getTileRangeForExtentAndResolution = function( extent, resolution) { - var min = this.getTileCoordForXYAndResolution_( + var tileCoord = this.getTileCoordForXYAndResolution_( extent.minX, extent.minY, resolution, false); - var max = this.getTileCoordForXYAndResolution_( - extent.maxX, extent.maxY, resolution, true); - return new ol.TileRange(min.x, min.y, max.x, max.y); + var minX = tileCoord.x; + var minY = tileCoord.y; + tileCoord = this.getTileCoordForXYAndResolution_( + extent.maxX, extent.maxY, resolution, true, tileCoord); + return new ol.TileRange(minX, minY, tileCoord.x, tileCoord.y); }; From 7a4672d429f1f377e858a149bc20eac98389b782 Mon Sep 17 00:00:00 2001 From: Tom Payne Date: Tue, 9 Apr 2013 15:50:54 +0200 Subject: [PATCH 04/10] Add ol.TileRange.createOrUpdate --- src/ol/tilerange.js | 21 +++++++++++++++++++++ 1 file changed, 21 insertions(+) diff --git a/src/ol/tilerange.js b/src/ol/tilerange.js index b428e07c89..bace42fe15 100644 --- a/src/ol/tilerange.js +++ b/src/ol/tilerange.js @@ -64,6 +64,27 @@ ol.TileRange.boundingTileRange = function(var_args) { }; +/** + * @param {number} minX Minimum X. + * @param {number} minY Minimum Y. + * @param {number} maxX Maximum X. + * @param {number} maxY Maximum Y. + * @param {ol.TileRange|undefined} tileRange TileRange. + * @return {ol.TileRange} Tile range. + */ +ol.TileRange.createOrUpdate = function(minX, minY, maxX, maxY, tileRange) { + if (goog.isDef(tileRange)) { + tileRange.minX = minX; + tileRange.minY = minY; + tileRange.maxX = maxX; + tileRange.maxY = maxY; + return tileRange; + } else { + return new ol.TileRange(minX, minY, maxX, maxY); + } +}; + + /** * @param {ol.TileCoord} tileCoord Tile coordinate. * @return {boolean} Contains tile coordinate. From e30109913e8be94517b1a0a2e5890ddab97c626f Mon Sep 17 00:00:00 2001 From: Tom Payne Date: Tue, 9 Apr 2013 15:53:31 +0200 Subject: [PATCH 05/10] Enable ol.TileRange re-use --- src/ol/tilegrid/tilegrid.js | 28 ++++++++++++++++++---------- src/ol/tilegrid/xyztilegrid.js | 13 ++++++++----- 2 files changed, 26 insertions(+), 15 deletions(-) diff --git a/src/ol/tilegrid/tilegrid.js b/src/ol/tilegrid/tilegrid.js index 91863a9540..d80e21878f 100644 --- a/src/ol/tilegrid/tilegrid.js +++ b/src/ol/tilegrid/tilegrid.js @@ -96,16 +96,17 @@ ol.tilegrid.TileGrid = function(options) { * @param {ol.TileCoord} tileCoord Tile coordinate. * @param {function(this: T, number, ol.TileRange): boolean} callback Callback. * @param {T=} opt_obj Object. + * @param {ol.TileRange=} opt_tileRange Temporary ol.TileRange object. * @return {boolean} Callback succeeded. * @template T */ ol.tilegrid.TileGrid.prototype.forEachTileCoordParentTileRange = - function(tileCoord, callback, opt_obj) { + function(tileCoord, callback, opt_obj, opt_tileRange) { var tileCoordExtent = this.getTileCoordExtent(tileCoord); var z = tileCoord.z - 1; while (z >= 0) { - if (callback.call( - opt_obj, z, this.getTileRangeForExtentAndZ(tileCoordExtent, z))) { + if (callback.call(opt_obj, z, + this.getTileRangeForExtentAndZ(tileCoordExtent, z, opt_tileRange))) { return true; } --z; @@ -168,13 +169,15 @@ ol.tilegrid.TileGrid.prototype.getResolutions = function() { /** * @param {ol.TileCoord} tileCoord Tile coordinate. + * @param {ol.TileRange=} opt_tileRange Temporary ol.TileRange object. * @return {ol.TileRange} Tile range. */ ol.tilegrid.TileGrid.prototype.getTileCoordChildTileRange = - function(tileCoord) { + function(tileCoord, opt_tileRange) { if (tileCoord.z < this.resolutions_.length) { var tileCoordExtent = this.getTileCoordExtent(tileCoord); - return this.getTileRangeForExtentAndZ(tileCoordExtent, tileCoord.z + 1); + return this.getTileRangeForExtentAndZ( + tileCoordExtent, tileCoord.z + 1, opt_tileRange); } else { return null; } @@ -201,28 +204,33 @@ ol.tilegrid.TileGrid.prototype.getTileRangeExtent = function(z, tileRange) { /** * @param {ol.Extent} extent Extent. * @param {number} resolution Resolution. + * @param {ol.TileRange=} opt_tileRange Temporary tile range object. * @return {ol.TileRange} Tile range. */ -ol.tilegrid.TileGrid.prototype.getTileRangeForExtentAndResolution = function( - extent, resolution) { +ol.tilegrid.TileGrid.prototype.getTileRangeForExtentAndResolution = + function(extent, resolution, opt_tileRange) { var tileCoord = this.getTileCoordForXYAndResolution_( extent.minX, extent.minY, resolution, false); var minX = tileCoord.x; var minY = tileCoord.y; tileCoord = this.getTileCoordForXYAndResolution_( extent.maxX, extent.maxY, resolution, true, tileCoord); - return new ol.TileRange(minX, minY, tileCoord.x, tileCoord.y); + return ol.TileRange.createOrUpdate( + minX, minY, tileCoord.x, tileCoord.y, opt_tileRange); }; /** * @param {ol.Extent} extent Extent. * @param {number} z Z. + * @param {ol.TileRange=} opt_tileRange Temporary tile range object. * @return {ol.TileRange} Tile range. */ -ol.tilegrid.TileGrid.prototype.getTileRangeForExtentAndZ = function(extent, z) { +ol.tilegrid.TileGrid.prototype.getTileRangeForExtentAndZ = + function(extent, z, opt_tileRange) { var resolution = this.getResolution(z); - return this.getTileRangeForExtentAndResolution(extent, resolution); + return this.getTileRangeForExtentAndResolution( + extent, resolution, opt_tileRange); }; diff --git a/src/ol/tilegrid/xyztilegrid.js b/src/ol/tilegrid/xyztilegrid.js index 49829503b2..036c414640 100644 --- a/src/ol/tilegrid/xyztilegrid.js +++ b/src/ol/tilegrid/xyztilegrid.js @@ -42,11 +42,13 @@ goog.inherits(ol.tilegrid.XYZ, ol.tilegrid.TileGrid); /** * @inheritDoc */ -ol.tilegrid.XYZ.prototype.getTileCoordChildTileRange = function(tileCoord) { +ol.tilegrid.XYZ.prototype.getTileCoordChildTileRange = + function(tileCoord, opt_tileRange) { if (tileCoord.z < this.maxZoom_) { - return new ol.TileRange( + return ol.TileRange.createOrUpdate( tileCoord.x << 1, tileCoord.y << 1, - tileCoord.x + 1 << 1, tileCoord.y + 1 << 1); + tileCoord.x + 1 << 1, tileCoord.y + 1 << 1, + opt_tileRange); } else { return null; } @@ -57,8 +59,9 @@ ol.tilegrid.XYZ.prototype.getTileCoordChildTileRange = function(tileCoord) { * @inheritDoc */ ol.tilegrid.XYZ.prototype.forEachTileCoordParentTileRange = - function(tileCoord, callback, opt_obj) { - var tileRange = new ol.TileRange(0, 0, tileCoord.x, tileCoord.y); + function(tileCoord, callback, opt_obj, opt_tileRange) { + var tileRange = ol.TileRange.createOrUpdate( + 0, 0, tileCoord.x, tileCoord.y, opt_tileRange); var z; for (z = tileCoord.z - 1; z >= 0; --z) { tileRange.minX = tileRange.maxX >>= 1; From e556c87a7c12a81291dd449da88edfa3e76a3caf Mon Sep 17 00:00:00 2001 From: Tom Payne Date: Tue, 9 Apr 2013 16:04:04 +0200 Subject: [PATCH 06/10] Re-use ol.TileRange objects --- .../renderer/canvas/canvastilelayerrenderer.js | 8 +++++--- src/ol/renderer/dom/domtilelayerrenderer.js | 16 ++++++++++------ src/ol/renderer/webgl/webgltilelayerrenderer.js | 6 ++++-- 3 files changed, 19 insertions(+), 11 deletions(-) diff --git a/src/ol/renderer/canvas/canvastilelayerrenderer.js b/src/ol/renderer/canvas/canvastilelayerrenderer.js index b8c6f833bf..586a32fa96 100644 --- a/src/ol/renderer/canvas/canvastilelayerrenderer.js +++ b/src/ol/renderer/canvas/canvastilelayerrenderer.js @@ -201,6 +201,7 @@ ol.renderer.canvas.TileLayer.prototype.renderFrame = tilesToDrawByZ, getTileIfLoaded); var allTilesLoaded = true; + var tmpTileRange = new ol.TileRange(0, 0, 0, 0); var childTileRange, fullyLoaded, tile, tileState, x, y; for (x = tileRange.minX; x <= tileRange.maxX; ++x) { for (y = tileRange.minY; y <= tileRange.maxY; ++y) { @@ -216,9 +217,10 @@ ol.renderer.canvas.TileLayer.prototype.renderFrame = allTilesLoaded = false; fullyLoaded = tileGrid.forEachTileCoordParentTileRange( - tile.tileCoord, findLoadedTiles); + tile.tileCoord, findLoadedTiles, null, tmpTileRange); if (!fullyLoaded) { - childTileRange = tileGrid.getTileCoordChildTileRange(tile.tileCoord); + childTileRange = tileGrid.getTileCoordChildTileRange( + tile.tileCoord, tmpTileRange); if (!goog.isNull(childTileRange)) { findLoadedTiles(z + 1, childTileRange); } @@ -276,7 +278,7 @@ ol.renderer.canvas.TileLayer.prototype.renderFrame = context.drawImage(tile.getImage(), x, y, width, height); } interimTileRange = - tileGrid.getTileRangeForExtentAndZ(tileExtent, z); + tileGrid.getTileRangeForExtentAndZ(tileExtent, z, tmpTileRange); minX = Math.max(interimTileRange.minX, canvasTileRange.minX); maxX = Math.min(interimTileRange.maxX, canvasTileRange.maxX); minY = Math.max(interimTileRange.minY, canvasTileRange.minY); diff --git a/src/ol/renderer/dom/domtilelayerrenderer.js b/src/ol/renderer/dom/domtilelayerrenderer.js index fb7d4babbd..7deb602476 100644 --- a/src/ol/renderer/dom/domtilelayerrenderer.js +++ b/src/ol/renderer/dom/domtilelayerrenderer.js @@ -14,6 +14,7 @@ goog.require('ol.Coordinate'); goog.require('ol.Extent'); goog.require('ol.Tile'); goog.require('ol.TileCoord'); +goog.require('ol.TileRange'); goog.require('ol.TileState'); goog.require('ol.ViewHint'); goog.require('ol.dom'); @@ -115,6 +116,7 @@ ol.renderer.dom.TileLayer.prototype.renderFrame = tilesToDrawByZ, getTileIfLoaded); var allTilesLoaded = true; + var tmpTileRange = new ol.TileRange(0, 0, 0, 0); var childTileRange, fullyLoaded, tile, tileState, x, y; for (x = tileRange.minX; x <= tileRange.maxX; ++x) { for (y = tileRange.minY; y <= tileRange.maxY; ++y) { @@ -131,9 +133,10 @@ ol.renderer.dom.TileLayer.prototype.renderFrame = allTilesLoaded = false; fullyLoaded = tileGrid.forEachTileCoordParentTileRange( - tile.tileCoord, findLoadedTiles); + tile.tileCoord, findLoadedTiles, null, tmpTileRange); if (!fullyLoaded) { - childTileRange = tileGrid.getTileCoordChildTileRange(tile.tileCoord); + childTileRange = tileGrid.getTileCoordChildTileRange( + tile.tileCoord, tmpTileRange); if (!goog.isNull(childTileRange)) { findLoadedTiles(z + 1, childTileRange); } @@ -212,7 +215,7 @@ ol.renderer.dom.TileLayer.prototype.renderFrame = } else { if (!frameState.viewHints[ol.ViewHint.ANIMATING] && !frameState.viewHints[ol.ViewHint.INTERACTING]) { - tileLayerZ.removeTilesOutsideExtent(extent); + tileLayerZ.removeTilesOutsideExtent(extent, tmpTileRange); } } } @@ -351,11 +354,12 @@ ol.renderer.dom.TileLayerZ_.prototype.getResolution = function() { /** * @param {ol.Extent} extent Extent. + * @param {ol.TileRange=} opt_tileRange Temporary ol.TileRange object. */ ol.renderer.dom.TileLayerZ_.prototype.removeTilesOutsideExtent = - function(extent) { - var tileRange = - this.tileGrid_.getTileRangeForExtentAndZ(extent, this.tileCoordOrigin_.z); + function(extent, opt_tileRange) { + var tileRange = this.tileGrid_.getTileRangeForExtentAndZ( + extent, this.tileCoordOrigin_.z, opt_tileRange); var tilesToRemove = []; var tile, tileCoordKey; for (tileCoordKey in this.tiles_) { diff --git a/src/ol/renderer/webgl/webgltilelayerrenderer.js b/src/ol/renderer/webgl/webgltilelayerrenderer.js index f20a95f76b..1f22f8e2dd 100644 --- a/src/ol/renderer/webgl/webgltilelayerrenderer.js +++ b/src/ol/renderer/webgl/webgltilelayerrenderer.js @@ -199,6 +199,7 @@ ol.renderer.webgl.TileLayer.prototype.renderFrame = tilesToDrawByZ, getTileIfLoaded); var allTilesLoaded = true; + var tmpTileRange = new ol.TileRange(0, 0, 0, 0); var childTileRange, fullyLoaded, tile, tileState, x, y; for (x = tileRange.minX; x <= tileRange.maxX; ++x) { for (y = tileRange.minY; y <= tileRange.maxY; ++y) { @@ -217,9 +218,10 @@ ol.renderer.webgl.TileLayer.prototype.renderFrame = allTilesLoaded = false; fullyLoaded = tileGrid.forEachTileCoordParentTileRange( - tile.tileCoord, findLoadedTiles); + tile.tileCoord, findLoadedTiles, null, tmpTileRange); if (!fullyLoaded) { - childTileRange = tileGrid.getTileCoordChildTileRange(tile.tileCoord); + childTileRange = tileGrid.getTileCoordChildTileRange( + tile.tileCoord, tmpTileRange); if (!goog.isNull(childTileRange)) { findLoadedTiles(z + 1, childTileRange); } From e08d19ac55226ff031280642e15e7e53aa0c7eb3 Mon Sep 17 00:00:00 2001 From: Tom Payne Date: Tue, 9 Apr 2013 16:45:35 +0200 Subject: [PATCH 07/10] Add ol.Extent.createOrUpdate --- src/ol/extent.js | 21 +++++++++++++++++++++ 1 file changed, 21 insertions(+) diff --git a/src/ol/extent.js b/src/ol/extent.js index bf79c4cbdf..c5e38e7a91 100644 --- a/src/ol/extent.js +++ b/src/ol/extent.js @@ -92,6 +92,27 @@ ol.Extent.prototype.containsCoordinate = function(coordinate) { }; +/** + * @param {number} minX Minimum X. + * @param {number} minY Minimum Y. + * @param {number} maxX Maximum X. + * @param {number} maxY Maximum Y. + * @param {ol.Extent|undefined} extent Extent. + * @return {ol.Extent} Extent. + */ +ol.Extent.createOrUpdate = function(minX, minY, maxX, maxY, extent) { + if (goog.isDef(extent)) { + extent.minX = minX; + extent.minY = minY; + extent.maxX = maxX; + extent.maxY = maxY; + return extent; + } else { + return new ol.Extent(minX, minY, maxX, maxY); + } +}; + + /** * Checks if the passed extent is contained or on the edge of the * extent. From ee8e565be2c9ef1fd2133002b6c5f963db08b37c Mon Sep 17 00:00:00 2001 From: Tom Payne Date: Tue, 9 Apr 2013 16:48:32 +0200 Subject: [PATCH 08/10] Enable ol.Extent re-use --- src/ol/tilegrid/tilegrid.js | 20 +++++++++++++------- 1 file changed, 13 insertions(+), 7 deletions(-) diff --git a/src/ol/tilegrid/tilegrid.js b/src/ol/tilegrid/tilegrid.js index d80e21878f..2035b1f7a4 100644 --- a/src/ol/tilegrid/tilegrid.js +++ b/src/ol/tilegrid/tilegrid.js @@ -97,12 +97,13 @@ ol.tilegrid.TileGrid = function(options) { * @param {function(this: T, number, ol.TileRange): boolean} callback Callback. * @param {T=} opt_obj Object. * @param {ol.TileRange=} opt_tileRange Temporary ol.TileRange object. + * @param {ol.Extent=} opt_extent Temporary ol.Extent object. * @return {boolean} Callback succeeded. * @template T */ ol.tilegrid.TileGrid.prototype.forEachTileCoordParentTileRange = - function(tileCoord, callback, opt_obj, opt_tileRange) { - var tileCoordExtent = this.getTileCoordExtent(tileCoord); + function(tileCoord, callback, opt_obj, opt_tileRange, opt_extent) { + var tileCoordExtent = this.getTileCoordExtent(tileCoord, opt_extent); var z = tileCoord.z - 1; while (z >= 0) { if (callback.call(opt_obj, z, @@ -170,12 +171,13 @@ ol.tilegrid.TileGrid.prototype.getResolutions = function() { /** * @param {ol.TileCoord} tileCoord Tile coordinate. * @param {ol.TileRange=} opt_tileRange Temporary ol.TileRange object. + * @param {ol.Extent=} opt_extent Temporary ol.Extent object. * @return {ol.TileRange} Tile range. */ ol.tilegrid.TileGrid.prototype.getTileCoordChildTileRange = - function(tileCoord, opt_tileRange) { + function(tileCoord, opt_tileRange, opt_extent) { if (tileCoord.z < this.resolutions_.length) { - var tileCoordExtent = this.getTileCoordExtent(tileCoord); + var tileCoordExtent = this.getTileCoordExtent(tileCoord, opt_extent); return this.getTileRangeForExtentAndZ( tileCoordExtent, tileCoord.z + 1, opt_tileRange); } else { @@ -187,9 +189,11 @@ ol.tilegrid.TileGrid.prototype.getTileCoordChildTileRange = /** * @param {number} z Z. * @param {ol.TileRange} tileRange Tile range. + * @param {ol.Extent=} opt_extent Temporary ol.Extent object. * @return {ol.Extent} Extent. */ -ol.tilegrid.TileGrid.prototype.getTileRangeExtent = function(z, tileRange) { +ol.tilegrid.TileGrid.prototype.getTileRangeExtent = + function(z, tileRange, opt_extent) { var origin = this.getOrigin(z); var resolution = this.getResolution(z); var tileSize = this.getTileSize(z); @@ -251,9 +255,11 @@ ol.tilegrid.TileGrid.prototype.getTileCoordCenter = function(tileCoord) { /** * @param {ol.TileCoord} tileCoord Tile coordinate. + * @param {ol.Extent=} opt_extent Temporary extent object. * @return {ol.Extent} Extent. */ -ol.tilegrid.TileGrid.prototype.getTileCoordExtent = function(tileCoord) { +ol.tilegrid.TileGrid.prototype.getTileCoordExtent = + function(tileCoord, opt_extent) { var origin = this.getOrigin(tileCoord.z); var resolution = this.getResolution(tileCoord.z); var tileSize = this.getTileSize(tileCoord.z); @@ -261,7 +267,7 @@ ol.tilegrid.TileGrid.prototype.getTileCoordExtent = function(tileCoord) { var minY = origin[1] + tileCoord.y * tileSize.height * resolution; var maxX = minX + tileSize.width * resolution; var maxY = minY + tileSize.height * resolution; - return new ol.Extent(minX, minY, maxX, maxY); + return ol.Extent.createOrUpdate(minX, minY, maxX, maxY, opt_extent); }; From fe03ebe99c2f138fc4b6543bce6b3e4cc5257e1f Mon Sep 17 00:00:00 2001 From: Tom Payne Date: Tue, 9 Apr 2013 17:30:46 +0200 Subject: [PATCH 09/10] Re-use ol.Extent objects --- src/ol/renderer/canvas/canvastilelayerrenderer.js | 9 +++++---- src/ol/renderer/dom/domtilelayerrenderer.js | 5 +++-- src/ol/renderer/webgl/webgltilelayerrenderer.js | 7 ++++--- src/ol/source/wmtssource.js | 4 +++- src/ol/source/xyzsource.js | 3 ++- src/ol/tileurlfunction.js | 4 +++- 6 files changed, 20 insertions(+), 12 deletions(-) diff --git a/src/ol/renderer/canvas/canvastilelayerrenderer.js b/src/ol/renderer/canvas/canvastilelayerrenderer.js index 586a32fa96..d68c642df9 100644 --- a/src/ol/renderer/canvas/canvastilelayerrenderer.js +++ b/src/ol/renderer/canvas/canvastilelayerrenderer.js @@ -201,6 +201,7 @@ ol.renderer.canvas.TileLayer.prototype.renderFrame = tilesToDrawByZ, getTileIfLoaded); var allTilesLoaded = true; + var tmpExtent = new ol.Extent(0, 0, 0, 0); var tmpTileRange = new ol.TileRange(0, 0, 0, 0); var childTileRange, fullyLoaded, tile, tileState, x, y; for (x = tileRange.minX; x <= tileRange.maxX; ++x) { @@ -217,10 +218,10 @@ ol.renderer.canvas.TileLayer.prototype.renderFrame = allTilesLoaded = false; fullyLoaded = tileGrid.forEachTileCoordParentTileRange( - tile.tileCoord, findLoadedTiles, null, tmpTileRange); + tile.tileCoord, findLoadedTiles, null, tmpTileRange, tmpExtent); if (!fullyLoaded) { childTileRange = tileGrid.getTileCoordChildTileRange( - tile.tileCoord, tmpTileRange); + tile.tileCoord, tmpTileRange, tmpExtent); if (!goog.isNull(childTileRange)) { findLoadedTiles(z + 1, childTileRange); } @@ -234,7 +235,7 @@ ol.renderer.canvas.TileLayer.prototype.renderFrame = goog.array.sort(zs); var opaque = tileSource.getOpaque(); var origin = tileGrid.getTileCoordExtent(new ol.TileCoord( - z, canvasTileRange.minX, canvasTileRange.maxY)).getTopLeft(); + z, canvasTileRange.minX, canvasTileRange.maxY), tmpExtent).getTopLeft(); var currentZ, i, index, scale, tileCoordKey, tileExtent, tilesToDraw; var ix, iy, interimTileExtent, interimTileRange, maxX, maxY; var height, width; @@ -265,7 +266,7 @@ ol.renderer.canvas.TileLayer.prototype.renderFrame = scale = tileGrid.getResolution(currentZ) / tileResolution; for (tileCoordKey in tilesToDraw) { tile = tilesToDraw[tileCoordKey]; - tileExtent = tileGrid.getTileCoordExtent(tile.tileCoord); + tileExtent = tileGrid.getTileCoordExtent(tile.tileCoord, tmpExtent); x = (tileExtent.minX - origin[0]) / tileResolution; y = (origin[1] - tileExtent.maxY) / tileResolution; width = scale * tileSize.width; diff --git a/src/ol/renderer/dom/domtilelayerrenderer.js b/src/ol/renderer/dom/domtilelayerrenderer.js index 7deb602476..7236881298 100644 --- a/src/ol/renderer/dom/domtilelayerrenderer.js +++ b/src/ol/renderer/dom/domtilelayerrenderer.js @@ -116,6 +116,7 @@ ol.renderer.dom.TileLayer.prototype.renderFrame = tilesToDrawByZ, getTileIfLoaded); var allTilesLoaded = true; + var tmpExtent = new ol.Extent(0, 0, 0, 0); var tmpTileRange = new ol.TileRange(0, 0, 0, 0); var childTileRange, fullyLoaded, tile, tileState, x, y; for (x = tileRange.minX; x <= tileRange.maxX; ++x) { @@ -133,10 +134,10 @@ ol.renderer.dom.TileLayer.prototype.renderFrame = allTilesLoaded = false; fullyLoaded = tileGrid.forEachTileCoordParentTileRange( - tile.tileCoord, findLoadedTiles, null, tmpTileRange); + tile.tileCoord, findLoadedTiles, null, tmpTileRange, tmpExtent); if (!fullyLoaded) { childTileRange = tileGrid.getTileCoordChildTileRange( - tile.tileCoord, tmpTileRange); + tile.tileCoord, tmpTileRange, tmpExtent); if (!goog.isNull(childTileRange)) { findLoadedTiles(z + 1, childTileRange); } diff --git a/src/ol/renderer/webgl/webgltilelayerrenderer.js b/src/ol/renderer/webgl/webgltilelayerrenderer.js index 1f22f8e2dd..e0bc1fa404 100644 --- a/src/ol/renderer/webgl/webgltilelayerrenderer.js +++ b/src/ol/renderer/webgl/webgltilelayerrenderer.js @@ -199,6 +199,7 @@ ol.renderer.webgl.TileLayer.prototype.renderFrame = tilesToDrawByZ, getTileIfLoaded); var allTilesLoaded = true; + var tmpExtent = new ol.Extent(0, 0, 0, 0); var tmpTileRange = new ol.TileRange(0, 0, 0, 0); var childTileRange, fullyLoaded, tile, tileState, x, y; for (x = tileRange.minX; x <= tileRange.maxX; ++x) { @@ -218,10 +219,10 @@ ol.renderer.webgl.TileLayer.prototype.renderFrame = allTilesLoaded = false; fullyLoaded = tileGrid.forEachTileCoordParentTileRange( - tile.tileCoord, findLoadedTiles, null, tmpTileRange); + tile.tileCoord, findLoadedTiles, null, tmpTileRange, tmpExtent); if (!fullyLoaded) { childTileRange = tileGrid.getTileCoordChildTileRange( - tile.tileCoord, tmpTileRange); + tile.tileCoord, tmpTileRange, tmpExtent); if (!goog.isNull(childTileRange)) { findLoadedTiles(z + 1, childTileRange); } @@ -237,7 +238,7 @@ ol.renderer.webgl.TileLayer.prototype.renderFrame = var u_tileOffset = goog.vec.Vec4.createFloat32(); goog.array.forEach(zs, function(z) { goog.object.forEach(tilesToDrawByZ[z], function(tile) { - var tileExtent = tileGrid.getTileCoordExtent(tile.tileCoord); + var tileExtent = tileGrid.getTileCoordExtent(tile.tileCoord, tmpExtent); var sx = 2 * tileExtent.getWidth() / framebufferExtentSize.width; var sy = 2 * tileExtent.getHeight() / framebufferExtentSize.height; var tx = 2 * (tileExtent.minX - framebufferExtent.minX) / diff --git a/src/ol/source/wmtssource.js b/src/ol/source/wmtssource.js index 0f94d03dff..44fe980cd2 100644 --- a/src/ol/source/wmtssource.js +++ b/src/ol/source/wmtssource.js @@ -6,6 +6,7 @@ goog.require('goog.asserts'); goog.require('goog.math'); goog.require('goog.object'); goog.require('goog.uri.utils'); +goog.require('ol.Extent'); goog.require('ol.TileCoord'); goog.require('ol.TileUrlFunction'); goog.require('ol.TileUrlFunctionType'); @@ -113,6 +114,7 @@ ol.source.WMTS = function(options) { })); } + var tmpExtent = new ol.Extent(0, 0, 0, 0); var tmpTileCoord = new ol.TileCoord(0, 0, 0); tileUrlFunction = ol.TileUrlFunction.withTileCoordTransform( function(tileCoord, projection) { @@ -138,7 +140,7 @@ ol.source.WMTS = function(options) { tmpTileCoord.z = tileCoord.z; tmpTileCoord.x = x; tmpTileCoord.y = tileCoord.y; - tileExtent = tileGrid.getTileCoordExtent(tmpTileCoord); + tileExtent = tileGrid.getTileCoordExtent(tmpTileCoord, tmpExtent); } if (!tileExtent.intersects(extent)) { return null; diff --git a/src/ol/source/xyzsource.js b/src/ol/source/xyzsource.js index 508a8a501c..fbe84f7f3a 100644 --- a/src/ol/source/xyzsource.js +++ b/src/ol/source/xyzsource.js @@ -61,6 +61,7 @@ ol.source.XYZ = function(options) { var extent = options.extent; if (goog.isDefAndNotNull(extent)) { + var tmpExtent = new ol.Extent(0, 0, 0, 0); var tmpTileCoord = new ol.TileCoord(0, 0, 0); tileUrlFunction = ol.TileUrlFunction.withTileCoordTransform( function(tileCoord) { @@ -76,7 +77,7 @@ ol.source.XYZ = function(options) { tmpTileCoord.z = tileCoord.z; tmpTileCoord.x = x; tmpTileCoord.y = tileCoord.y; - var tileExtent = tileGrid.getTileCoordExtent(tmpTileCoord); + var tileExtent = tileGrid.getTileCoordExtent(tmpTileCoord, tmpExtent); // FIXME we shouldn't need a typecast here if (!tileExtent.intersects(/** @type {ol.Extent} */ (extent))) { return null; diff --git a/src/ol/tileurlfunction.js b/src/ol/tileurlfunction.js index aafc989add..c3057b1649 100644 --- a/src/ol/tileurlfunction.js +++ b/src/ol/tileurlfunction.js @@ -3,6 +3,7 @@ goog.provide('ol.TileUrlFunctionType'); goog.require('goog.array'); goog.require('goog.math'); +goog.require('ol.Extent'); goog.require('ol.TileCoord'); @@ -68,6 +69,7 @@ ol.TileUrlFunction.createFromTileUrlFunctions = function(tileUrlFunctions) { */ ol.TileUrlFunction.createFromParamsFunction = function(baseUrl, params, paramsFunction) { + var tmpExtent = new ol.Extent(0, 0, 0, 0); return function(tileCoord, projection) { if (goog.isNull(tileCoord)) { return undefined; @@ -77,7 +79,7 @@ ol.TileUrlFunction.createFromParamsFunction = tileGrid = ol.tilegrid.getForProjection(projection); } var size = tileGrid.getTileSize(tileCoord.z); - var extent = tileGrid.getTileCoordExtent(tileCoord); + var extent = tileGrid.getTileCoordExtent(tileCoord, tmpExtent); return paramsFunction.call(this, baseUrl, params, extent, size, projection); } From 680b31c5e017568331818817898a43e99dfe4b31 Mon Sep 17 00:00:00 2001 From: Tom Payne Date: Tue, 9 Apr 2013 19:54:15 +0200 Subject: [PATCH 10/10] Eliminate an ol.TileCoord allocation --- src/ol/tilegrid/tilegrid.js | 14 +++++++++++--- 1 file changed, 11 insertions(+), 3 deletions(-) diff --git a/src/ol/tilegrid/tilegrid.js b/src/ol/tilegrid/tilegrid.js index 2035b1f7a4..577f6dec6a 100644 --- a/src/ol/tilegrid/tilegrid.js +++ b/src/ol/tilegrid/tilegrid.js @@ -92,6 +92,13 @@ ol.tilegrid.TileGrid = function(options) { }; +/** + * @private + * @type {ol.TileCoord} + */ +ol.tilegrid.TileGrid.tmpTileCoord_ = new ol.TileCoord(0, 0, 0); + + /** * @param {ol.TileCoord} tileCoord Tile coordinate. * @param {function(this: T, number, ol.TileRange): boolean} callback Callback. @@ -213,11 +220,12 @@ ol.tilegrid.TileGrid.prototype.getTileRangeExtent = */ ol.tilegrid.TileGrid.prototype.getTileRangeForExtentAndResolution = function(extent, resolution, opt_tileRange) { - var tileCoord = this.getTileCoordForXYAndResolution_( - extent.minX, extent.minY, resolution, false); + var tileCoord = ol.tilegrid.TileGrid.tmpTileCoord_; + this.getTileCoordForXYAndResolution_( + extent.minX, extent.minY, resolution, false, tileCoord); var minX = tileCoord.x; var minY = tileCoord.y; - tileCoord = this.getTileCoordForXYAndResolution_( + this.getTileCoordForXYAndResolution_( extent.maxX, extent.maxY, resolution, true, tileCoord); return ol.TileRange.createOrUpdate( minX, minY, tileCoord.x, tileCoord.y, opt_tileRange);