Skip to content

Commit

Permalink
Merge pull request openlayers#3061 from elemoine/render-bug2
Browse files Browse the repository at this point in the history
Add a renderBuffer option to ol.layer.Vector
  • Loading branch information
Éric Lemoine committed Dec 19, 2014
2 parents a24716a + f1bf782 commit 85a6de0
Show file tree
Hide file tree
Showing 16 changed files with 76 additions and 115 deletions.
11 changes: 11 additions & 0 deletions externs/olx.js
Original file line number Diff line number Diff line change
Expand Up @@ -3229,6 +3229,7 @@ olx.layer.TileOptions.prototype.useInterimTilesOnError;
* minResolution: (number|undefined),
* maxResolution: (number|undefined),
* opacity: (number|undefined),
* renderBuffer: (number|undefined),
* saturation: (number|undefined),
* source: (ol.source.Vector|undefined),
* style: (ol.style.Style|Array.<ol.style.Style>|ol.style.StyleFunction|undefined),
Expand Down Expand Up @@ -3305,6 +3306,16 @@ olx.layer.VectorOptions.prototype.maxResolution;
olx.layer.VectorOptions.prototype.opacity;


/**
* The buffer around the viewport extent used by the renderer when getting
* features from the vector source. Recommended value: the size of the
* largest symbol or line width. Default is 100 pixels.
* @type {number|undefined}
* @api
*/
olx.layer.VectorOptions.prototype.renderBuffer;


/**
* Saturation.
* @type {number|undefined}
Expand Down
15 changes: 15 additions & 0 deletions src/ol/layer/vectorlayer.js
Original file line number Diff line number Diff line change
Expand Up @@ -37,6 +37,13 @@ ol.layer.Vector = function(opt_options) {
delete baseOptions.style;
goog.base(this, /** @type {olx.layer.LayerOptions} */ (baseOptions));

/**
* @type {number}
* @private
*/
this.renderBuffer_ = goog.isDef(options.renderBuffer) ?
options.renderBuffer : 100;

/**
* User provided style.
* @type {ol.style.Style|Array.<ol.style.Style>|ol.style.StyleFunction}
Expand All @@ -57,6 +64,14 @@ ol.layer.Vector = function(opt_options) {
goog.inherits(ol.layer.Vector, ol.layer.Layer);


/**
* @return {number|undefined} Render buffer.
*/
ol.layer.Vector.prototype.getRenderBuffer = function() {
return this.renderBuffer_;
};


/**
* @return {function(ol.Feature, ol.Feature): number|null|undefined} Render
* order.
Expand Down
43 changes: 7 additions & 36 deletions src/ol/render/canvas/canvasreplay.js
Original file line number Diff line number Diff line change
Expand Up @@ -120,12 +120,6 @@ ol.render.canvas.Replay = function(tolerance, maxExtent, resolution) {
*/
this.pixelCoordinates_ = [];

/**
* @private
* @type {ol.Extent}
*/
this.extent_ = ol.extent.createEmpty();

/**
* @private
* @type {!goog.vec.Mat4.Number}
Expand Down Expand Up @@ -620,14 +614,6 @@ ol.render.canvas.Replay.prototype.getBufferedMaxExtent = function() {
};


/**
* @return {ol.Extent} Extent.
*/
ol.render.canvas.Replay.prototype.getExtent = function() {
return this.extent_;
};


/**
* @inheritDoc
*/
Expand Down Expand Up @@ -775,7 +761,6 @@ ol.render.canvas.ImageReplay.prototype.drawPointGeometry =
goog.asserts.assert(goog.isDef(this.rotation_));
goog.asserts.assert(goog.isDef(this.scale_));
goog.asserts.assert(goog.isDef(this.width_));
ol.extent.extend(this.extent_, pointGeometry.getExtent());
this.beginGeometry(pointGeometry, feature);
var flatCoordinates = pointGeometry.getFlatCoordinates();
var stride = pointGeometry.getStride();
Expand Down Expand Up @@ -819,7 +804,6 @@ ol.render.canvas.ImageReplay.prototype.drawMultiPointGeometry =
goog.asserts.assert(goog.isDef(this.rotation_));
goog.asserts.assert(goog.isDef(this.scale_));
goog.asserts.assert(goog.isDef(this.width_));
ol.extent.extend(this.extent_, multiPointGeometry.getExtent());
this.beginGeometry(multiPointGeometry, feature);
var flatCoordinates = multiPointGeometry.getFlatCoordinates();
var stride = multiPointGeometry.getStride();
Expand Down Expand Up @@ -1036,7 +1020,6 @@ ol.render.canvas.LineStringReplay.prototype.drawLineStringGeometry =
if (!goog.isDef(strokeStyle) || !goog.isDef(lineWidth)) {
return;
}
ol.extent.extend(this.extent_, lineStringGeometry.getExtent());
this.setStrokeStyle_();
this.beginGeometry(lineStringGeometry, feature);
this.hitDetectionInstructions.push(
Expand Down Expand Up @@ -1065,7 +1048,6 @@ ol.render.canvas.LineStringReplay.prototype.drawMultiLineStringGeometry =
if (!goog.isDef(strokeStyle) || !goog.isDef(lineWidth)) {
return;
}
ol.extent.extend(this.extent_, multiLineStringGeometry.getExtent());
this.setStrokeStyle_();
this.beginGeometry(multiLineStringGeometry, feature);
this.hitDetectionInstructions.push(
Expand Down Expand Up @@ -1243,7 +1225,6 @@ ol.render.canvas.PolygonReplay.prototype.drawCircleGeometry =
if (goog.isDef(strokeStyle)) {
goog.asserts.assert(goog.isDef(state.lineWidth));
}
ol.extent.extend(this.extent_, circleGeometry.getExtent());
this.setFillStrokeStyles_();
this.beginGeometry(circleGeometry, feature);
// always fill the circle for hit detection
Expand Down Expand Up @@ -1295,7 +1276,6 @@ ol.render.canvas.PolygonReplay.prototype.drawPolygonGeometry =
if (goog.isDef(strokeStyle)) {
goog.asserts.assert(goog.isDef(state.lineWidth));
}
ol.extent.extend(this.extent_, polygonGeometry.getExtent());
this.setFillStrokeStyles_();
this.beginGeometry(polygonGeometry, feature);
// always fill the polygon for hit detection
Expand Down Expand Up @@ -1331,7 +1311,6 @@ ol.render.canvas.PolygonReplay.prototype.drawMultiPolygonGeometry =
if (goog.isDef(strokeStyle)) {
goog.asserts.assert(goog.isDef(state.lineWidth));
}
ol.extent.extend(this.extent_, multiPolygonGeometry.getExtent());
this.setFillStrokeStyles_();
this.beginGeometry(multiPolygonGeometry, feature);
// always fill the multi-polygon for hit detection
Expand Down Expand Up @@ -1576,8 +1555,6 @@ ol.render.canvas.TextReplay.prototype.drawText =
goog.isNull(this.textStrokeState_))) {
return;
}
ol.extent.extendFlatCoordinates(
this.extent_, flatCoordinates, offset, end, stride);
if (!goog.isNull(this.textFillState_)) {
this.setReplayFillState_(this.textFillState_);
}
Expand Down Expand Up @@ -1866,7 +1843,6 @@ ol.render.canvas.ReplayGroup.prototype.finish = function() {


/**
* @param {ol.Extent} extent Extent.
* @param {number} resolution Resolution.
* @param {number} rotation Rotation.
* @param {ol.Coordinate} coordinate Coordinate.
Expand All @@ -1876,8 +1852,7 @@ ol.render.canvas.ReplayGroup.prototype.finish = function() {
* @template T
*/
ol.render.canvas.ReplayGroup.prototype.forEachGeometryAtPixel = function(
extent, resolution, rotation, coordinate,
skippedFeaturesHash, callback) {
resolution, rotation, coordinate, skippedFeaturesHash, callback) {

var transform = this.hitDetectionTransform_;
ol.vec.Mat4.makeTransform2D(transform, 0.5, 0.5,
Expand All @@ -1887,8 +1862,8 @@ ol.render.canvas.ReplayGroup.prototype.forEachGeometryAtPixel = function(
var context = this.hitDetectionContext_;
context.clearRect(0, 0, 1, 1);

return this.replayHitDetection_(context, extent, transform,
rotation, skippedFeaturesHash,
return this.replayHitDetection_(context, transform, rotation,
skippedFeaturesHash,
/**
* @param {ol.Feature} feature Feature.
* @return {?} Callback result.
Expand Down Expand Up @@ -1939,14 +1914,13 @@ ol.render.canvas.ReplayGroup.prototype.isEmpty = function() {

/**
* @param {CanvasRenderingContext2D} context Context.
* @param {ol.Extent} extent Extent.
* @param {number} pixelRatio Pixel ratio.
* @param {goog.vec.Mat4.Number} transform Transform.
* @param {number} viewRotation View rotation.
* @param {Object} skippedFeaturesHash Ids of features to skip
*/
ol.render.canvas.ReplayGroup.prototype.replay = function(
context, extent, pixelRatio, transform, viewRotation, skippedFeaturesHash) {
context, pixelRatio, transform, viewRotation, skippedFeaturesHash) {

/** @type {Array.<number>} */
var zs = goog.array.map(goog.object.getKeys(this.replaysByZIndex_), Number);
Expand Down Expand Up @@ -1974,8 +1948,7 @@ ol.render.canvas.ReplayGroup.prototype.replay = function(
replays = this.replaysByZIndex_[zs[i].toString()];
for (j = 0, jj = ol.render.REPLAY_ORDER.length; j < jj; ++j) {
replay = replays[ol.render.REPLAY_ORDER[j]];
if (goog.isDef(replay) &&
ol.extent.intersects(extent, replay.getExtent())) {
if (goog.isDef(replay)) {
replay.replay(context, pixelRatio, transform, viewRotation,
skippedFeaturesHash);
}
Expand All @@ -1989,7 +1962,6 @@ ol.render.canvas.ReplayGroup.prototype.replay = function(
/**
* @private
* @param {CanvasRenderingContext2D} context Context.
* @param {ol.Extent} extent Extent.
* @param {goog.vec.Mat4.Number} transform Transform.
* @param {number} viewRotation View rotation.
* @param {Object} skippedFeaturesHash Ids of features to skip
Expand All @@ -1998,7 +1970,7 @@ ol.render.canvas.ReplayGroup.prototype.replay = function(
* @template T
*/
ol.render.canvas.ReplayGroup.prototype.replayHitDetection_ = function(
context, extent, transform, viewRotation, skippedFeaturesHash,
context, transform, viewRotation, skippedFeaturesHash,
featureCallback) {
/** @type {Array.<number>} */
var zs = goog.array.map(goog.object.getKeys(this.replaysByZIndex_), Number);
Expand All @@ -2009,8 +1981,7 @@ ol.render.canvas.ReplayGroup.prototype.replayHitDetection_ = function(
replays = this.replaysByZIndex_[zs[i].toString()];
for (j = ol.render.REPLAY_ORDER.length - 1; j >= 0; --j) {
replay = replays[ol.render.REPLAY_ORDER[j]];
if (goog.isDef(replay) &&
ol.extent.intersects(extent, replay.getExtent())) {
if (goog.isDef(replay)) {
result = replay.replayHitDetection(context, transform, viewRotation,
skippedFeaturesHash, featureCallback);
if (result) {
Expand Down
27 changes: 4 additions & 23 deletions src/ol/render/webgl/webglreplay.js
Original file line number Diff line number Diff line change
Expand Up @@ -54,12 +54,6 @@ ol.render.webgl.ImageReplay = function(tolerance, maxExtent) {
*/
this.origin_ = ol.extent.getCenter(maxExtent);

/**
* @type {ol.Extent}
* @private
*/
this.extent_ = ol.extent.createEmpty();

/**
* @type {Array.<number>}
* @private
Expand Down Expand Up @@ -383,7 +377,6 @@ ol.render.webgl.ImageReplay.prototype.drawMultiLineStringGeometry =
*/
ol.render.webgl.ImageReplay.prototype.drawMultiPointGeometry =
function(multiPointGeometry, feature) {
ol.extent.extend(this.extent_, multiPointGeometry.getExtent());
var flatCoordinates = multiPointGeometry.getFlatCoordinates();
var stride = multiPointGeometry.getStride();
this.drawCoordinates_(
Expand All @@ -403,7 +396,6 @@ ol.render.webgl.ImageReplay.prototype.drawMultiPolygonGeometry =
*/
ol.render.webgl.ImageReplay.prototype.drawPointGeometry =
function(pointGeometry, feature) {
ol.extent.extend(this.extent_, pointGeometry.getExtent());
var flatCoordinates = pointGeometry.getFlatCoordinates();
var stride = pointGeometry.getStride();
this.drawCoordinates_(
Expand Down Expand Up @@ -498,21 +490,12 @@ ol.render.webgl.ImageReplay.prototype.finish = function(context) {
};


/**
* @return {ol.Extent} Extent.
*/
ol.render.webgl.ImageReplay.prototype.getExtent = function() {
return this.extent_;
};


/**
* @param {ol.webgl.Context} context Context.
* @param {ol.Coordinate} center Center.
* @param {number} resolution Resolution.
* @param {number} rotation Rotation.
* @param {ol.Size} size Size.
* @param {ol.Extent} extent Extent.
* @param {number} pixelRatio Pixel ratio.
* @param {number} opacity Global opacity.
* @param {number} brightness Global brightness.
Expand All @@ -524,7 +507,7 @@ ol.render.webgl.ImageReplay.prototype.getExtent = function() {
* @template T
*/
ol.render.webgl.ImageReplay.prototype.replay = function(context,
center, resolution, rotation, size, extent, pixelRatio,
center, resolution, rotation, size, pixelRatio,
opacity, brightness, contrast, hue, saturation, skippedFeaturesHash) {
var gl = context.getGL();

Expand Down Expand Up @@ -798,7 +781,6 @@ ol.render.webgl.ReplayGroup.prototype.isEmpty = function() {
* @param {number} resolution Resolution.
* @param {number} rotation Rotation.
* @param {ol.Size} size Size.
* @param {ol.Extent} extent Extent.
* @param {number} pixelRatio Pixel ratio.
* @param {number} opacity Global opacity.
* @param {number} brightness Global brightness.
Expand All @@ -810,15 +792,14 @@ ol.render.webgl.ReplayGroup.prototype.isEmpty = function() {
* @template T
*/
ol.render.webgl.ReplayGroup.prototype.replay = function(context,
center, resolution, rotation, size, extent, pixelRatio,
center, resolution, rotation, size, pixelRatio,
opacity, brightness, contrast, hue, saturation, skippedFeaturesHash) {
var i, ii, replay, result;
for (i = 0, ii = ol.render.REPLAY_ORDER.length; i < ii; ++i) {
replay = this.replays_[ol.render.REPLAY_ORDER[i]];
if (goog.isDef(replay) &&
ol.extent.intersects(extent, replay.getExtent())) {
if (goog.isDef(replay)) {
result = replay.replay(context,
center, resolution, rotation, size, extent, pixelRatio,
center, resolution, rotation, size, pixelRatio,
opacity, brightness, contrast, hue, saturation, skippedFeaturesHash);
if (result) {
return result;
Expand Down
3 changes: 1 addition & 2 deletions src/ol/renderer/canvas/canvasimagelayerrenderer.js
Original file line number Diff line number Diff line change
Expand Up @@ -49,12 +49,11 @@ ol.renderer.canvas.ImageLayer.prototype.forEachFeatureAtPixel =
function(coordinate, frameState, callback, thisArg) {
var layer = this.getLayer();
var source = layer.getSource();
var extent = frameState.extent;
var resolution = frameState.viewState.resolution;
var rotation = frameState.viewState.rotation;
var skippedFeatureUids = frameState.skippedFeatureUids;
return source.forEachFeatureAtPixel(
extent, resolution, rotation, coordinate, skippedFeatureUids,
resolution, rotation, coordinate, skippedFeatureUids,
/**
* @param {ol.Feature} feature Feature.
* @return {?} Callback result.
Expand Down
2 changes: 1 addition & 1 deletion src/ol/renderer/canvas/canvasmaprenderer.js
Original file line number Diff line number Diff line change
Expand Up @@ -123,7 +123,7 @@ ol.renderer.canvas.Map.prototype.dispatchComposeEvent_ =

replayGroup.finish();
if (!replayGroup.isEmpty()) {
replayGroup.replay(context, extent, pixelRatio, this.transform_,
replayGroup.replay(context, pixelRatio, this.transform_,
rotation, {});
}
vectorContext.flush();
Expand Down
Loading

0 comments on commit 85a6de0

Please sign in to comment.