diff --git a/src/ol/renderer/TileLayerRenderer.js b/src/ol/renderer/TileLayerRenderer.js index df7e66098e..d70ff6c8c8 100644 --- a/src/ol/renderer/TileLayerRenderer.js +++ b/src/ol/renderer/TileLayerRenderer.js @@ -32,6 +32,25 @@ ol.renderer.TileLayerRenderer = function(container, layer) { */ this.layerResolutions_ = layer.getResolutions(); + /** + * @type {Array.} + */ + this.tileOrigin_ = layer.getTileOrigin(); + + /** + * @type {Array.} + */ + this.tileSize_ = layer.getTileSize(); + + /** + * @type {number} + */ + this.xRight_ = layer.getXRight() ? 1 : -1; + + /** + * @type {number} + */ + this.yDown_ = layer.getYDown() ? 1 : -1; /** * @type {number|undefined} @@ -75,6 +94,8 @@ ol.renderer.TileLayerRenderer.prototype.getPreferredResAndZ_ = function(resoluti * @return {goog.math.Size} */ ol.renderer.TileLayerRenderer.prototype.getContainerSize_ = function() { + // TODO: listen for resize and set this.constainerSize_ null + // https://github.com/openlayers/ol3/issues/2 if (goog.isNull(this.containerSize_)) { this.containerSize_ = goog.style.getSize(this.container_); } @@ -97,61 +118,89 @@ ol.renderer.TileLayerRenderer.prototype.draw = function(center, resolution) { if (resolution !== this.renderedResolution_) { this.renderedTiles_ = {}; } - var mapSize = this.getContainerSize_(); - var halfMapWidth = (resolution * mapSize.width) / 2; - var halfMapHeight = (resolution * mapSize.height) / 2; - var x = center.getX(); - var y = center.getY(); - var mapMinX = x - halfMapWidth; - var mapMaxY = y + halfMapHeight; - var projection = center.getProjection(); - var bounds = new ol.Bounds( - mapMinX, y - halfMapHeight, x + halfMapWidth, mapMaxY, projection); - var tileSet = this.layer_.getData(bounds, resolution); - var tiles = tileSet.getTiles(); - var rows = tiles.length; - var first = rows > 0 ? tiles[0][0] : null; - if (first) { - var cols = tiles[0].length; - var tileResolution = tileSet.getResolution(); - var scale = resolution / tileResolution; - // TODO: implement ol.TileSet#getBounds - var firstBounds = first.getBounds(); - var tileMinX = firstBounds.getMinX(); - var tileMaxX = tileMinX; - var tileMaxY = firstBounds.getMaxY(); - var tileMinY = tileMaxY; - var pxOriginX = (tileMinX - mapMinX) / resolution; - var pxOriginY = (mapMaxY - tileMaxY) / resolution; - var pxTileHeight = tileSet.getTileHeight(); - var pxTileWidth = tileSet.getTileWidth(); - var tileHeight = tileResolution * pxTileHeight; - var tileWidth = tileResolution * pxTileWidth; - var fragment = document.createDocumentFragment(); - var tile, img; - for (var j=0, pxTileTop=pxOriginY; j 0) { + pxMinX = Math.round(leftTileX * pxTileWidth) - pxOffsetX; + } else { + pxMinX = Math.round((-leftTileX-1) * pxTileWidth) - pxOffsetX; } + var pxMinY; + if (yDown > 0) { + pxMinY = Math.round(topTileY * pxTileHeight) - pxOffsetY; + } else { + pxMinY = Math.round((-topTileY-1) * pxTileHeight) - pxOffsetY; + } + + var pxTileLeft = pxMinX; + var pxTileTop = pxMinY; + + var numTilesWide = Math.ceil(pxMapSize.width / pxTileWidth); + var numTilesHigh = Math.ceil(pxMapSize.height / pxTileHeight); + + // assume a buffer of zero for now + if (pxMinX < 0) { + numTilesWide += 1; + } + if (pxMinY < 0) { + numTilesHigh += 1; + } + + var tileX, tileY, tile, img, pxTileRight, pxTileBottom; + var fragment = document.createDocumentFragment(); + for (var i=0; i