diff --git a/src/ol/renderer/Composite.js b/src/ol/renderer/Composite.js
index 054392bf70..6ec58ffe7d 100644
--- a/src/ol/renderer/Composite.js
+++ b/src/ol/renderer/Composite.js
@@ -24,10 +24,24 @@ ol.renderer.Composite = function(container) {
* @private
*/
this.renderers_ = [];
+
+ /**
+ * Pixel buffer for renderer container.
+ *
+ * @type {number}
+ * @private
+ */
+ this.buffer_ = 128;
+
+ var containerSize = this.getContainerSize();
+ var width = containerSize.width + (2 * this.buffer_);
+ var height = containerSize.height + (2 * this.buffer_);
var target = goog.dom.createDom('div', {
'class': 'ol-renderer-composite',
- 'style': 'width:100%;height:100%;top:0;left:0;position:absolute'
+ 'style': 'width:' + width + 'px;height:' + height + 'px;' +
+ 'top:-' + this.buffer_ + 'px;left:-' + this.buffer_ + 'px;' +
+ 'position:absolute'
});
goog.dom.appendChild(container, target);
@@ -38,6 +52,8 @@ ol.renderer.Composite = function(container) {
this.target_ = target;
/**
+ * The cumulative offset from the original position of the target element.
+ *
* @type {goog.math.Coordinate}
* @private
*/
@@ -48,11 +64,23 @@ ol.renderer.Composite = function(container) {
* @private
*/
this.layerContainers_ = {};
-
};
goog.inherits(ol.renderer.Composite, ol.renderer.MapRenderer);
+/**
+ * Adjust the position of the renderer target by some offset.
+ *
+ * @param {number} x The x-offset (in pixel space)
+ * @param {number} y The y-offset (in pixel space)
+ */
+ol.renderer.Composite.prototype.shiftTarget = function(x, y) {
+ var newX = this.targetOffset_.x + x;
+ var newY = this.targetOffset_.y + y;
+ this.targetOffset_ = new goog.math.Coordinate(newX, newY);
+ goog.style.setPosition(this.target_, newX-this.buffer_, newY-this.buffer_);
+};
+
/**
* @param {Array.
} layers
* @param {ol.Loc} center
@@ -65,24 +93,23 @@ ol.renderer.Composite.prototype.draw = function(layers, center, resolution, anim
if (this.renderedResolution_) {
if (resolution !== this.renderedResolution_) {
// TODO: apply transition to old target
- this.targetOffset_ = new goog.math.Coordinate(0, 0);
- goog.style.setPosition(this.target_, this.targetOffset_);
+ this.shiftTarget(0, 0);
}
}
this.renderedResolution_ = resolution;
// shift target element to account for center change
if (this.renderedCenter_) {
- this.targetOffset_ = new goog.math.Coordinate(
- this.targetOffset_.x + Math.round((this.renderedCenter_.getX() - center.getX()) / resolution),
- this.targetOffset_.y + Math.round((center.getY() - this.renderedCenter_.getY()) / resolution)
+ this.shiftTarget(
+ Math.round((this.renderedCenter_.getX() - center.getX()) / resolution),
+ Math.round((center.getY() - this.renderedCenter_.getY()) / resolution)
);
- goog.style.setPosition(this.target_, this.targetOffset_);
}
this.renderedCenter_ = center;
// update each layer renderer
var renderer, container;
+
for (var i=0, ii=layers.length; i} layers
* @param {ol.Loc} center
diff --git a/src/ol/renderer/TileLayerRenderer.js b/src/ol/renderer/TileLayerRenderer.js
index 1082cb962e..f390764f0a 100644
--- a/src/ol/renderer/TileLayerRenderer.js
+++ b/src/ol/renderer/TileLayerRenderer.js
@@ -82,12 +82,6 @@ ol.renderer.TileLayerRenderer = function(container, layer) {
*/
this.renderedZ_ = undefined;
- /**
- * @type {goog.math.Size}
- * @private
- */
- this.containerSize_ = null;
-
};
goog.inherits(ol.renderer.TileLayerRenderer, ol.renderer.LayerRenderer);
@@ -114,18 +108,6 @@ ol.renderer.TileLayerRenderer.prototype.getPreferredResAndZ_ = function(resoluti
return [r, z];
};
-/**
- * @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_);
- }
- return this.containerSize_;
-};
-
/**
* Tiles rendered at the current resolution;
* @type {Object}
@@ -147,7 +129,7 @@ ol.renderer.TileLayerRenderer.prototype.draw = function(center, resolution) {
var tileZ = pair[1];
var scale = resolution / tileResolution;
- var containerSize = this.getContainerSize_();
+ var containerSize = this.getContainerSize();
var xRight = this.xRight_;
var yDown = this.yDown_;
@@ -155,7 +137,7 @@ ol.renderer.TileLayerRenderer.prototype.draw = function(center, resolution) {
var halfMapHeight = (resolution * containerSize.height) / 2;
var centerX = center.getX();
var centerY = center.getY();
-
+
// calculate vector from tile origin to map top-left (in integer pixel space)
var tileOrigin = this.tileOrigin_;
var mapOrigin = [centerX - halfMapWidth, centerY + halfMapHeight];