Accept custom isLoaded method in findLoadedTiles method

This commit is contained in:
Tim Schaub
2013-02-19 12:13:58 -07:00
parent 1b984ac06c
commit 80dc7b5bf7
5 changed files with 33 additions and 19 deletions

View File

@@ -129,8 +129,11 @@ ol.renderer.canvas.TileLayer.prototype.renderFrame =
var tilesToDrawByZ = {}; var tilesToDrawByZ = {};
tilesToDrawByZ[z] = {}; tilesToDrawByZ[z] = {};
function isLoaded(tile) {
return !goog.isNull(tile) && tile.getState() == ol.TileState.LOADED;
}
var findLoadedTiles = goog.bind(tileSource.findLoadedTiles, tileSource, var findLoadedTiles = goog.bind(tileSource.findLoadedTiles, tileSource,
tilesToDrawByZ); tilesToDrawByZ, isLoaded);
var allTilesLoaded = true; var allTilesLoaded = true;
var tile, tileCenter, tileCoord, tileState, x, y; var tile, tileCenter, tileCoord, tileState, x, y;

View File

@@ -93,8 +93,11 @@ ol.renderer.dom.TileLayer.prototype.renderFrame =
var tilesToDrawByZ = {}; var tilesToDrawByZ = {};
tilesToDrawByZ[z] = {}; tilesToDrawByZ[z] = {};
function isLoaded(tile) {
return !goog.isNull(tile) && tile.getState() == ol.TileState.LOADED;
}
var findLoadedTiles = goog.bind(tileSource.findLoadedTiles, tileSource, var findLoadedTiles = goog.bind(tileSource.findLoadedTiles, tileSource,
tilesToDrawByZ); tilesToDrawByZ, isLoaded);
var allTilesLoaded = true; var allTilesLoaded = true;
var tile, tileCenter, tileCoord, tileState, x, y; var tile, tileCenter, tileCoord, tileState, x, y;

View File

@@ -365,8 +365,12 @@ ol.renderer.webgl.TileLayer.prototype.renderFrame =
var tilesToDrawByZ = {}; var tilesToDrawByZ = {};
tilesToDrawByZ[z] = {}; tilesToDrawByZ[z] = {};
function isLoaded(tile) {
return !goog.isNull(tile) && tile.getState() == ol.TileState.LOADED &&
mapRenderer.isTileTextureLoaded(tile);
}
var findLoadedTiles = goog.bind(tileSource.findLoadedTiles, tileSource, var findLoadedTiles = goog.bind(tileSource.findLoadedTiles, tileSource,
tilesToDrawByZ); tilesToDrawByZ, isLoaded);
var tilesToLoad = new goog.structs.PriorityQueue(); var tilesToLoad = new goog.structs.PriorityQueue();

View File

@@ -8,7 +8,6 @@ goog.require('ol.Projection');
goog.require('ol.Tile'); goog.require('ol.Tile');
goog.require('ol.TileCoord'); goog.require('ol.TileCoord');
goog.require('ol.TileRange'); goog.require('ol.TileRange');
goog.require('ol.TileState');
goog.require('ol.source.Source'); goog.require('ol.source.Source');
goog.require('ol.tilegrid.TileGrid'); goog.require('ol.tilegrid.TileGrid');
@@ -66,16 +65,17 @@ ol.source.TileSource.prototype.expireCache = goog.abstractMethod;
* *
* @param {Object.<number, Object.<string, ol.Tile>>} loadedTilesByZ A lookup of * @param {Object.<number, Object.<string, ol.Tile>>} loadedTilesByZ A lookup of
* loaded tiles by zoom level. * loaded tiles by zoom level.
* @param {function(ol.Tile): boolean} isLoaded A function to determine if a
* tile is fully loaded.
* @param {number} z Zoom level. * @param {number} z Zoom level.
* @param {ol.TileRange} tileRange Tile range. * @param {ol.TileRange} tileRange Tile range.
* @return {boolean} The tile range is fully covered with loaded tiles. * @return {boolean} The tile range is fully covered with loaded tiles.
*/ */
ol.source.TileSource.prototype.findLoadedTiles = function(loadedTilesByZ, z, ol.source.TileSource.prototype.findLoadedTiles = function(loadedTilesByZ,
tileRange) { isLoaded, z, tileRange) {
// FIXME this could be more efficient about filling partial holes // FIXME this could be more efficient about filling partial holes
var fullyCovered = true; var fullyCovered = true;
var tile, tileCoord, tileCoordKey, x, y; var tile, tileCoord, tileCoordKey, x, y;
// TODO: tile range is misunderstood (inclusive or not?)
for (x = tileRange.minX; x <= tileRange.maxX; ++x) { for (x = tileRange.minX; x <= tileRange.maxX; ++x) {
for (y = tileRange.minY; y <= tileRange.maxY; ++y) { for (y = tileRange.minY; y <= tileRange.maxY; ++y) {
tileCoord = new ol.TileCoord(z, x, y); tileCoord = new ol.TileCoord(z, x, y);
@@ -84,7 +84,7 @@ ol.source.TileSource.prototype.findLoadedTiles = function(loadedTilesByZ, z,
continue; continue;
} }
tile = this.getTile(tileCoord); tile = this.getTile(tileCoord);
if (!goog.isNull(tile) && tile.getState() == ol.TileState.LOADED) { if (isLoaded(tile)) {
if (!loadedTilesByZ[z]) { if (!loadedTilesByZ[z]) {
loadedTilesByZ[z] = {}; loadedTilesByZ[z] = {};
} }

View File

@@ -14,6 +14,10 @@ describe('ol.source.TileSource', function() {
describe('#findLoadedTiles()', function() { describe('#findLoadedTiles()', function() {
function isLoaded(tile) {
return !goog.isNull(tile) && tile.getState() === ol.TileState.LOADED;
}
it('adds no tiles if none are already loaded', function() { it('adds no tiles if none are already loaded', function() {
// a source with no loaded tiles // a source with no loaded tiles
var source = new ol.test.source.MockTileSource({}); var source = new ol.test.source.MockTileSource({});
@@ -21,7 +25,7 @@ describe('ol.source.TileSource', function() {
var loadedTilesByZ = {}; var loadedTilesByZ = {};
var grid = source.getTileGrid(); var grid = source.getTileGrid();
var range = grid.getTileRangeForExtentAndZ(source.getExtent(), 3); var range = grid.getTileRangeForExtentAndZ(source.getExtent(), 3);
source.findLoadedTiles(loadedTilesByZ, 3, range); source.findLoadedTiles(loadedTilesByZ, isLoaded, 3, range);
var keys = goog.object.getKeys(loadedTilesByZ); var keys = goog.object.getKeys(loadedTilesByZ);
expect(keys.length).toBe(0); expect(keys.length).toBe(0);
@@ -37,7 +41,7 @@ describe('ol.source.TileSource', function() {
var loadedTilesByZ = {}; var loadedTilesByZ = {};
var grid = source.getTileGrid(); var grid = source.getTileGrid();
var range = grid.getTileRangeForExtentAndZ(source.getExtent(), 0); var range = grid.getTileRangeForExtentAndZ(source.getExtent(), 0);
source.findLoadedTiles(loadedTilesByZ, 0, range); source.findLoadedTiles(loadedTilesByZ, isLoaded, 0, range);
var keys = goog.object.getKeys(loadedTilesByZ); var keys = goog.object.getKeys(loadedTilesByZ);
expect(keys.length).toBe(1); expect(keys.length).toBe(1);
var tile = loadedTilesByZ['0']['0/0/0']; var tile = loadedTilesByZ['0']['0/0/0'];
@@ -55,7 +59,7 @@ describe('ol.source.TileSource', function() {
var loadedTilesByZ = {}; var loadedTilesByZ = {};
var grid = source.getTileGrid(); var grid = source.getTileGrid();
var range = grid.getTileRangeForExtentAndZ(source.getExtent(), 1); var range = grid.getTileRangeForExtentAndZ(source.getExtent(), 1);
source.findLoadedTiles(loadedTilesByZ, 1, range); source.findLoadedTiles(loadedTilesByZ, isLoaded, 1, range);
var keys = goog.object.getKeys(loadedTilesByZ); var keys = goog.object.getKeys(loadedTilesByZ);
expect(keys.length).toBe(1); expect(keys.length).toBe(1);
var tile = loadedTilesByZ['1']['1/0/0']; var tile = loadedTilesByZ['1']['1/0/0'];
@@ -75,8 +79,8 @@ describe('ol.source.TileSource', function() {
var loadedTilesByZ = {}; var loadedTilesByZ = {};
var grid = source.getTileGrid(); var grid = source.getTileGrid();
var range = grid.getTileRangeForExtentAndZ(source.getExtent(), 1); var range = grid.getTileRangeForExtentAndZ(source.getExtent(), 1);
var allLoaded = source.findLoadedTiles(loadedTilesByZ, 1, range); var loaded = source.findLoadedTiles(loadedTilesByZ, isLoaded, 1, range);
expect(allLoaded).toBe(true); expect(loaded).toBe(true);
}); });
it('returns true when all tiles are already loaded (part 2)', function() { it('returns true when all tiles are already loaded (part 2)', function() {
@@ -94,8 +98,8 @@ describe('ol.source.TileSource', function() {
}; };
var grid = source.getTileGrid(); var grid = source.getTileGrid();
var range = grid.getTileRangeForExtentAndZ(source.getExtent(), 1); var range = grid.getTileRangeForExtentAndZ(source.getExtent(), 1);
var allLoaded = source.findLoadedTiles(loadedTilesByZ, 1, range); var loaded = source.findLoadedTiles(loadedTilesByZ, isLoaded, 1, range);
expect(allLoaded).toBe(true); expect(loaded).toBe(true);
}); });
it('returns false when all tiles are already loaded', function() { it('returns false when all tiles are already loaded', function() {
@@ -110,8 +114,8 @@ describe('ol.source.TileSource', function() {
var loadedTilesByZ = {}; var loadedTilesByZ = {};
var grid = source.getTileGrid(); var grid = source.getTileGrid();
var range = grid.getTileRangeForExtentAndZ(source.getExtent(), 1); var range = grid.getTileRangeForExtentAndZ(source.getExtent(), 1);
var allLoaded = source.findLoadedTiles(loadedTilesByZ, 1, range); var loaded = source.findLoadedTiles(loadedTilesByZ, isLoaded, 1, range);
expect(allLoaded).toBe(false); expect(loaded).toBe(false);
}); });
it('returns false when all tiles are already loaded (part 2)', function() { it('returns false when all tiles are already loaded (part 2)', function() {
@@ -128,8 +132,8 @@ describe('ol.source.TileSource', function() {
}; };
var grid = source.getTileGrid(); var grid = source.getTileGrid();
var range = grid.getTileRangeForExtentAndZ(source.getExtent(), 1); var range = grid.getTileRangeForExtentAndZ(source.getExtent(), 1);
var allLoaded = source.findLoadedTiles(loadedTilesByZ, 1, range); var loaded = source.findLoadedTiles(loadedTilesByZ, isLoaded, 1, range);
expect(allLoaded).toBe(false); expect(loaded).toBe(false);
}); });
}); });