From 523f4d61fc064743e3cf298bdf3dc61ba501bbd9 Mon Sep 17 00:00:00 2001 From: Tim Schaub Date: Sat, 7 Jul 2012 13:13:07 -0600 Subject: [PATCH] Shift container for all layer renderers together. --- src/ol/renderer/Composite.js | 56 +++++++++++++-- src/ol/renderer/LayerRenderer.js | 21 ++++++ src/ol/renderer/TileLayerRenderer.js | 103 +++++++++++++-------------- 3 files changed, 120 insertions(+), 60 deletions(-) diff --git a/src/ol/renderer/Composite.js b/src/ol/renderer/Composite.js index 505d9e4a9f..054392bf70 100644 --- a/src/ol/renderer/Composite.js +++ b/src/ol/renderer/Composite.js @@ -7,6 +7,8 @@ goog.require('ol.Loc'); goog.require('goog.array'); goog.require('goog.dom'); +goog.require('goog.style'); +goog.require('goog.math.Coordinate'); /** * @constructor @@ -30,19 +32,25 @@ ol.renderer.Composite = function(container) { goog.dom.appendChild(container, target); /** - * @type Element + * @type {Element} * @private */ this.target_ = target; + + /** + * @type {goog.math.Coordinate} + * @private + */ + this.targetOffset_ = new goog.math.Coordinate(0, 0); /** - * @type Object + * @type {Object} * @private */ this.layerContainers_ = {}; + }; - goog.inherits(ol.renderer.Composite, ol.renderer.MapRenderer); /** @@ -53,13 +61,38 @@ goog.inherits(ol.renderer.Composite, ol.renderer.MapRenderer); */ ol.renderer.Composite.prototype.draw = function(layers, center, resolution, animate) { // TODO: deal with layer order and removal - for (var i=0, ii=layers.length; i 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); + // calculate vector from tile origin to top-left tile (in pixel space) + var colsLeft = Math.floor(pxMap[0] / pxTileWidth); + var rowsAbove = Math.floor(pxMap[1] / pxTileHeight); + var pxTile = [colsLeft * pxTileWidth, rowsAbove * pxTileHeight]; - // assume a buffer of zero for now - if (pxMinX < 0) { + // offset vector from container origin to top-left tile (in pixel space) + var pxOffsetX = pxTile[0] - pxMap[0] - this.containerOffset_.x; + var pxOffsetY = pxTile[1] - pxMap[1] - this.containerOffset_.y; + + // index of the top left tile + var leftTileX = xRight ? colsLeft : (-colsLeft - 1); + var topTileY = yDown ? rowsAbove : (-rowsAbove - 1); + + var numTilesWide = Math.ceil(containerSize.width / pxTileWidth); + var numTilesHigh = Math.ceil(containerSize.height / pxTileHeight); + if (pxOffsetX !== 0) { numTilesWide += 1; } - if (pxMinY < 0) { + if (pxOffsetY !== 0) { numTilesHigh += 1; } + + var pxMinX = pxOffsetX; + var pxMinY = pxOffsetY; + var pxTileLeft = pxMinX; - var tileX, tileY, tile, img, pxTileRight, pxTileBottom, xyz, append; + var tileX, tileY, tile, img, pxTileBottom, pxTileRight, pxTileTop, xyz, append; var fragment = document.createDocumentFragment(); var newTiles = false; for (var i=0; i 0); - var yDown = (this.yDown_ > 0); + var xRight = this.xRight_; + var yDown = this.yDown_; var top = this.renderedTop_; var right = this.renderedRight_; var bottom = this.renderedBottom_;