Allow renderer to have a buffer.

This commit is contained in:
Tim Schaub
2012-07-07 16:50:22 -06:00
parent dc409ebcc4
commit ddd57426b5
4 changed files with 78 additions and 28 deletions

View File

@@ -25,9 +25,23 @@ ol.renderer.Composite = function(container) {
*/
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
*/
@@ -49,10 +65,22 @@ ol.renderer.Composite = function(container) {
*/
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.<ol.layer.Layer>} 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<ii; ++i) {
renderer = this.getOrCreateRenderer(layers[i]);
renderer.setContainerOffset(this.targetOffset_);

View File

@@ -1,6 +1,7 @@
goog.provide('ol.renderer.LayerRenderer');
goog.require('goog.math.Coordinate');
goog.require('goog.math.Size');
/**
* A single layer renderer that will be created by the composite map renderer.
@@ -17,6 +18,12 @@ ol.renderer.LayerRenderer = function(container, layer) {
*/
this.container_ = container;
/**
* @type {goog.math.Size}
* @private
*/
this.containerSize_ = null;
/**
* Pixel offset between the layer renderer container and the composite
* renderer container. These will always be integer values.
@@ -34,6 +41,19 @@ ol.renderer.LayerRenderer = function(container, layer) {
};
/**
* @return {goog.math.Size}
* @protected
*/
ol.renderer.LayerRenderer.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_;
};
/**
* Set the pixel offset between the layer renderer container and the composite
* renderer container.

View File

@@ -1,6 +1,7 @@
goog.provide('ol.renderer.MapRenderer');
goog.require('goog.style');
goog.require('goog.math.Size');
/**
* @constructor
@@ -14,6 +15,12 @@ ol.renderer.MapRenderer = function(container) {
*/
this.container_ = container;
/**
* @type {goog.math.Size}
* @private
*/
this.containerSize_ = null;
/**
* @type {ol.Loc}
* @protected
@@ -28,6 +35,20 @@ ol.renderer.MapRenderer = function(container) {
};
/**
* @return {goog.math.Size}
* @protected
*/
ol.renderer.MapRenderer.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_;
};
/**
* @param {Array.<ol.layer.Layer>} layers
* @param {ol.Loc} center

View File

@@ -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_;