From ddc51ee267e66b6ec87098436bb55193d66e64d4 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C3=89ric=20Lemoine?= Date: Thu, 18 Dec 2014 12:27:06 +0100 Subject: [PATCH 1/3] Unconditionally draw Replay's --- src/ol/render/canvas/canvasreplay.js | 43 +++---------------- src/ol/render/webgl/webglreplay.js | 27 ++---------- .../canvas/canvasimagelayerrenderer.js | 3 +- src/ol/renderer/canvas/canvasmaprenderer.js | 2 +- .../canvas/canvasvectorlayerrenderer.js | 5 +-- src/ol/renderer/dom/domimagelayerrenderer.js | 3 +- src/ol/renderer/dom/dommaprenderer.js | 3 +- src/ol/renderer/dom/domvectorlayerrenderer.js | 8 ++-- .../renderer/webgl/webglimagelayerrenderer.js | 3 +- src/ol/renderer/webgl/webglmaprenderer.js | 2 +- .../webgl/webglvectorlayerrenderer.js | 6 +-- src/ol/source/imagevectorsource.js | 7 ++- src/ol/source/source.js | 2 - .../canvas/canvasvectorlayerrenderer.test.js | 3 +- 14 files changed, 29 insertions(+), 88 deletions(-) diff --git a/src/ol/render/canvas/canvasreplay.js b/src/ol/render/canvas/canvasreplay.js index fe3f31258ac..92127daabc0 100644 --- a/src/ol/render/canvas/canvasreplay.js +++ b/src/ol/render/canvas/canvasreplay.js @@ -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} @@ -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 */ @@ -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(); @@ -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(); @@ -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( @@ -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( @@ -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 @@ -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 @@ -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 @@ -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_); } @@ -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. @@ -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, @@ -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. @@ -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.} */ var zs = goog.array.map(goog.object.getKeys(this.replaysByZIndex_), Number); @@ -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); } @@ -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 @@ -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.} */ var zs = goog.array.map(goog.object.getKeys(this.replaysByZIndex_), Number); @@ -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) { diff --git a/src/ol/render/webgl/webglreplay.js b/src/ol/render/webgl/webglreplay.js index 29c054dab32..68785008495 100644 --- a/src/ol/render/webgl/webglreplay.js +++ b/src/ol/render/webgl/webglreplay.js @@ -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.} * @private @@ -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_( @@ -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_( @@ -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. @@ -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(); @@ -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. @@ -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; diff --git a/src/ol/renderer/canvas/canvasimagelayerrenderer.js b/src/ol/renderer/canvas/canvasimagelayerrenderer.js index 6fad17913b2..6fa2e36188c 100644 --- a/src/ol/renderer/canvas/canvasimagelayerrenderer.js +++ b/src/ol/renderer/canvas/canvasimagelayerrenderer.js @@ -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. diff --git a/src/ol/renderer/canvas/canvasmaprenderer.js b/src/ol/renderer/canvas/canvasmaprenderer.js index a6c9bb056fd..d057cafbb91 100644 --- a/src/ol/renderer/canvas/canvasmaprenderer.js +++ b/src/ol/renderer/canvas/canvasmaprenderer.js @@ -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(); diff --git a/src/ol/renderer/canvas/canvasvectorlayerrenderer.js b/src/ol/renderer/canvas/canvasvectorlayerrenderer.js index ca92336afa5..d53f68fb65d 100644 --- a/src/ol/renderer/canvas/canvasvectorlayerrenderer.js +++ b/src/ol/renderer/canvas/canvasvectorlayerrenderer.js @@ -98,7 +98,7 @@ ol.renderer.canvas.VectorLayer.prototype.composeFrame = var alpha = replayContext.globalAlpha; replayContext.globalAlpha = layerState.opacity; replayGroup.replay( - replayContext, frameState.extent, frameState.pixelRatio, transform, + replayContext, frameState.pixelRatio, transform, frameState.viewState.rotation, frameState.skippedFeatureUids); if (replayContext != context) { @@ -121,13 +121,12 @@ ol.renderer.canvas.VectorLayer.prototype.forEachFeatureAtPixel = if (goog.isNull(this.replayGroup_)) { return undefined; } else { - var extent = frameState.extent; var resolution = frameState.viewState.resolution; var rotation = frameState.viewState.rotation; var layer = this.getLayer(); /** @type {Object.} */ var features = {}; - return this.replayGroup_.forEachGeometryAtPixel(extent, resolution, + return this.replayGroup_.forEachGeometryAtPixel(resolution, rotation, coordinate, frameState.skippedFeatureUids, /** * @param {ol.Feature} feature Feature. diff --git a/src/ol/renderer/dom/domimagelayerrenderer.js b/src/ol/renderer/dom/domimagelayerrenderer.js index 0a8f59388bf..f41162b049f 100644 --- a/src/ol/renderer/dom/domimagelayerrenderer.js +++ b/src/ol/renderer/dom/domimagelayerrenderer.js @@ -54,12 +54,11 @@ ol.renderer.dom.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. diff --git a/src/ol/renderer/dom/dommaprenderer.js b/src/ol/renderer/dom/dommaprenderer.js index 2cc2e64acf7..97831d3c50a 100644 --- a/src/ol/renderer/dom/dommaprenderer.js +++ b/src/ol/renderer/dom/dommaprenderer.js @@ -160,8 +160,7 @@ ol.renderer.dom.Map.prototype.dispatchComposeEvent_ = map.dispatchEvent(composeEvent); replayGroup.finish(); if (!replayGroup.isEmpty()) { - replayGroup.replay(context, extent, pixelRatio, this.transform_, - rotation, {}); + replayGroup.replay(context, pixelRatio, this.transform_, rotation, {}); } vectorContext.flush(); this.replayGroup = replayGroup; diff --git a/src/ol/renderer/dom/domvectorlayerrenderer.js b/src/ol/renderer/dom/domvectorlayerrenderer.js index 4fe8a911926..6bc535af219 100644 --- a/src/ol/renderer/dom/domvectorlayerrenderer.js +++ b/src/ol/renderer/dom/domvectorlayerrenderer.js @@ -121,9 +121,8 @@ ol.renderer.dom.VectorLayer.prototype.composeFrame = if (!goog.isNull(replayGroup) && !replayGroup.isEmpty()) { context.globalAlpha = layerState.opacity; - replayGroup.replay( - context, frameState.extent, pixelRatio, transform, - viewRotation, frameState.skippedFeatureUids); + replayGroup.replay(context, pixelRatio, transform, viewRotation, + frameState.skippedFeatureUids); this.dispatchEvent_(ol.render.EventType.RENDER, frameState, transform); } @@ -162,13 +161,12 @@ ol.renderer.dom.VectorLayer.prototype.forEachFeatureAtPixel = if (goog.isNull(this.replayGroup_)) { return undefined; } else { - var extent = frameState.extent; var resolution = frameState.viewState.resolution; var rotation = frameState.viewState.rotation; var layer = this.getLayer(); /** @type {Object.} */ var features = {}; - return this.replayGroup_.forEachGeometryAtPixel(extent, resolution, + return this.replayGroup_.forEachGeometryAtPixel(resolution, rotation, coordinate, frameState.skippedFeatureUids, /** * @param {ol.Feature} feature Feature. diff --git a/src/ol/renderer/webgl/webglimagelayerrenderer.js b/src/ol/renderer/webgl/webglimagelayerrenderer.js index 6f31e1cf428..61dd3f6a2c4 100644 --- a/src/ol/renderer/webgl/webglimagelayerrenderer.js +++ b/src/ol/renderer/webgl/webglimagelayerrenderer.js @@ -80,12 +80,11 @@ ol.renderer.webgl.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. diff --git a/src/ol/renderer/webgl/webglmaprenderer.js b/src/ol/renderer/webgl/webglmaprenderer.js index b7d65306700..9ba76fc26f4 100644 --- a/src/ol/renderer/webgl/webglmaprenderer.js +++ b/src/ol/renderer/webgl/webglmaprenderer.js @@ -299,7 +299,7 @@ ol.renderer.webgl.Map.prototype.dispatchComposeEvent_ = var contrast = 1; var hue = 0; var saturation = 1; - replayGroup.replay(context, center, resolution, rotation, size, extent, + replayGroup.replay(context, center, resolution, rotation, size, pixelRatio, opacity, brightness, contrast, hue, saturation, {}); } replayGroup.getDeleteResourcesFunction(context)(); diff --git a/src/ol/renderer/webgl/webglvectorlayerrenderer.js b/src/ol/renderer/webgl/webglvectorlayerrenderer.js index 0520c60a12c..02947e8ace9 100644 --- a/src/ol/renderer/webgl/webglvectorlayerrenderer.js +++ b/src/ol/renderer/webgl/webglvectorlayerrenderer.js @@ -72,9 +72,9 @@ ol.renderer.webgl.VectorLayer.prototype.composeFrame = if (!goog.isNull(replayGroup) && !replayGroup.isEmpty()) { replayGroup.replay(context, viewState.center, viewState.resolution, viewState.rotation, - frameState.size, frameState.extent, frameState.pixelRatio, - layerState.opacity, layerState.brightness, layerState.contrast, - layerState.hue, layerState.saturation, frameState.skippedFeatureUids); + frameState.size, frameState.pixelRatio, layerState.opacity, + layerState.brightness, layerState.contrast, layerState.hue, + layerState.saturation, frameState.skippedFeatureUids); } }; diff --git a/src/ol/source/imagevectorsource.js b/src/ol/source/imagevectorsource.js index 808869288bf..ee40500e336 100644 --- a/src/ol/source/imagevectorsource.js +++ b/src/ol/source/imagevectorsource.js @@ -141,8 +141,7 @@ ol.source.ImageVector.prototype.canvasFunctionInternal_ = var transform = this.getTransform_(ol.extent.getCenter(extent), resolution, pixelRatio, size); - replayGroup.replay(this.canvasContext_, extent, pixelRatio, transform, 0, - {}); + replayGroup.replay(this.canvasContext_, pixelRatio, transform, 0, {}); this.replayGroup_ = replayGroup; @@ -154,14 +153,14 @@ ol.source.ImageVector.prototype.canvasFunctionInternal_ = * @inheritDoc */ ol.source.ImageVector.prototype.forEachFeatureAtPixel = function( - extent, resolution, rotation, coordinate, skippedFeatureUids, callback) { + resolution, rotation, coordinate, skippedFeatureUids, callback) { if (goog.isNull(this.replayGroup_)) { return undefined; } else { /** @type {Object.} */ var features = {}; return this.replayGroup_.forEachGeometryAtPixel( - extent, resolution, 0, coordinate, skippedFeatureUids, + resolution, 0, coordinate, skippedFeatureUids, /** * @param {ol.Feature} feature Feature. * @return {?} Callback result. diff --git a/src/ol/source/source.js b/src/ol/source/source.js index 5cae7305ff2..ea2c84c9c94 100644 --- a/src/ol/source/source.js +++ b/src/ol/source/source.js @@ -3,7 +3,6 @@ goog.provide('ol.source.State'); goog.require('goog.events.EventType'); goog.require('ol.Attribution'); -goog.require('ol.Extent'); goog.require('ol.Observable'); goog.require('ol.proj'); @@ -78,7 +77,6 @@ goog.inherits(ol.source.Source, ol.Observable); /** - * @param {ol.Extent} extent Extent. * @param {number} resolution Resolution. * @param {number} rotation Rotation. * @param {ol.Coordinate} coordinate Coordinate. diff --git a/test/spec/ol/renderer/canvas/canvasvectorlayerrenderer.test.js b/test/spec/ol/renderer/canvas/canvasvectorlayerrenderer.test.js index 2b644eeeeb9..65971bb0a65 100644 --- a/test/spec/ol/renderer/canvas/canvasvectorlayerrenderer.test.js +++ b/test/spec/ol/renderer/canvas/canvasvectorlayerrenderer.test.js @@ -70,7 +70,7 @@ describe('ol.renderer.canvas.VectorLayer', function() { map.getRenderer(), layer); var replayGroup = {}; renderer.replayGroup_ = replayGroup; - replayGroup.forEachGeometryAtPixel = function(extent, resolution, + replayGroup.forEachGeometryAtPixel = function(resolution, rotation, coordinate, skippedFeaturesUids, callback) { var geometry = new ol.geom.Point([0, 0]); var feature = new ol.Feature(); @@ -83,7 +83,6 @@ describe('ol.renderer.canvas.VectorLayer', function() { var spy = sinon.spy(); var coordinate = [0, 0]; var frameState = { - extent: [1, 1, 10, 10], skippedFeatureUids: {}, viewState: { resolution: 1, From 8e8fc9977c0d13616502964900a41283687bd957 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C3=89ric=20Lemoine?= Date: Tue, 21 Oct 2014 09:00:44 +0200 Subject: [PATCH 2/3] Add a renderBuffer option to ol.layer.Vector --- externs/olx.js | 11 +++++++++++ src/ol/layer/vectorlayer.js | 15 +++++++++++++++ .../renderer/canvas/canvasvectorlayerrenderer.js | 8 ++------ src/ol/renderer/dom/domvectorlayerrenderer.js | 8 ++------ src/ol/renderer/webgl/webglvectorlayerrenderer.js | 8 ++------ 5 files changed, 32 insertions(+), 18 deletions(-) diff --git a/externs/olx.js b/externs/olx.js index 83c1e2f418c..48f6e8c8cfa 100644 --- a/externs/olx.js +++ b/externs/olx.js @@ -3188,6 +3188,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.StyleFunction|undefined), @@ -3264,6 +3265,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} diff --git a/src/ol/layer/vectorlayer.js b/src/ol/layer/vectorlayer.js index 2acd21415aa..025f76e4dd6 100644 --- a/src/ol/layer/vectorlayer.js +++ b/src/ol/layer/vectorlayer.js @@ -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.StyleFunction} @@ -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. diff --git a/src/ol/renderer/canvas/canvasvectorlayerrenderer.js b/src/ol/renderer/canvas/canvasvectorlayerrenderer.js index d53f68fb65d..f34d4c3a4b2 100644 --- a/src/ol/renderer/canvas/canvasvectorlayerrenderer.js +++ b/src/ol/renderer/canvas/canvasvectorlayerrenderer.js @@ -194,12 +194,8 @@ ol.renderer.canvas.VectorLayer.prototype.prepareFrame = } var extent = this.renderedExtent_; - var xBuffer = ol.extent.getWidth(frameStateExtent) / 4; - var yBuffer = ol.extent.getHeight(frameStateExtent) / 4; - extent[0] = frameStateExtent[0] - xBuffer; - extent[1] = frameStateExtent[1] - yBuffer; - extent[2] = frameStateExtent[2] + xBuffer; - extent[3] = frameStateExtent[3] + yBuffer; + var renderBuffer = vectorLayer.getRenderBuffer(); + ol.extent.buffer(frameStateExtent, renderBuffer * resolution, extent); // FIXME dispose of old replayGroup in post render goog.dispose(this.replayGroup_); diff --git a/src/ol/renderer/dom/domvectorlayerrenderer.js b/src/ol/renderer/dom/domvectorlayerrenderer.js index 6bc535af219..eb2593237db 100644 --- a/src/ol/renderer/dom/domvectorlayerrenderer.js +++ b/src/ol/renderer/dom/domvectorlayerrenderer.js @@ -234,12 +234,8 @@ ol.renderer.dom.VectorLayer.prototype.prepareFrame = } var extent = this.renderedExtent_; - var xBuffer = ol.extent.getWidth(frameStateExtent) / 4; - var yBuffer = ol.extent.getHeight(frameStateExtent) / 4; - extent[0] = frameStateExtent[0] - xBuffer; - extent[1] = frameStateExtent[1] - yBuffer; - extent[2] = frameStateExtent[2] + xBuffer; - extent[3] = frameStateExtent[3] + yBuffer; + var renderBuffer = vectorLayer.getRenderBuffer(); + ol.extent.buffer(frameStateExtent, renderBuffer * resolution, extent); // FIXME dispose of old replayGroup in post render goog.dispose(this.replayGroup_); diff --git a/src/ol/renderer/webgl/webglvectorlayerrenderer.js b/src/ol/renderer/webgl/webglvectorlayerrenderer.js index 02947e8ace9..4287ef99dbb 100644 --- a/src/ol/renderer/webgl/webglvectorlayerrenderer.js +++ b/src/ol/renderer/webgl/webglvectorlayerrenderer.js @@ -153,12 +153,8 @@ ol.renderer.webgl.VectorLayer.prototype.prepareFrame = } var extent = this.renderedExtent_; - var xBuffer = ol.extent.getWidth(frameStateExtent) / 4; - var yBuffer = ol.extent.getHeight(frameStateExtent) / 4; - extent[0] = frameStateExtent[0] - xBuffer; - extent[1] = frameStateExtent[1] - yBuffer; - extent[2] = frameStateExtent[2] + xBuffer; - extent[3] = frameStateExtent[3] + yBuffer; + var renderBuffer = vectorLayer.getRenderBuffer(); + ol.extent.buffer(frameStateExtent, renderBuffer * resolution, extent); if (!goog.isNull(this.replayGroup_)) { frameState.postRenderFunctions.push( From f1bf7821337f1078b74b6fecc0676a6c22a70a75 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C3=89ric=20Lemoine?= Date: Thu, 18 Dec 2014 13:13:48 +0100 Subject: [PATCH 3/3] Change "recreate batch" strategy Only recreate batch when the (buffered) rendered extent contains the **buffered** viewport extent. --- src/ol/renderer/canvas/canvasvectorlayerrenderer.js | 12 +++++++----- src/ol/renderer/dom/domvectorlayerrenderer.js | 12 +++++++----- src/ol/renderer/webgl/webglvectorlayerrenderer.js | 12 +++++++----- 3 files changed, 21 insertions(+), 15 deletions(-) diff --git a/src/ol/renderer/canvas/canvasvectorlayerrenderer.js b/src/ol/renderer/canvas/canvasvectorlayerrenderer.js index f34d4c3a4b2..3fe8912969d 100644 --- a/src/ol/renderer/canvas/canvasvectorlayerrenderer.js +++ b/src/ol/renderer/canvas/canvasvectorlayerrenderer.js @@ -180,23 +180,24 @@ ol.renderer.canvas.VectorLayer.prototype.prepareFrame = var resolution = viewState.resolution; var pixelRatio = frameState.pixelRatio; var vectorLayerRevision = vectorLayer.getRevision(); + var vectorLayerRenderBuffer = vectorLayer.getRenderBuffer(); var vectorLayerRenderOrder = vectorLayer.getRenderOrder(); + if (!goog.isDef(vectorLayerRenderOrder)) { vectorLayerRenderOrder = ol.renderer.vector.defaultOrder; } + var extent = ol.extent.buffer(frameStateExtent, + vectorLayerRenderBuffer * resolution); + if (!this.dirty_ && this.renderedResolution_ == resolution && this.renderedRevision_ == vectorLayerRevision && this.renderedRenderOrder_ == vectorLayerRenderOrder && - ol.extent.containsExtent(this.renderedExtent_, frameStateExtent)) { + ol.extent.containsExtent(this.renderedExtent_, extent)) { return true; } - var extent = this.renderedExtent_; - var renderBuffer = vectorLayer.getRenderBuffer(); - ol.extent.buffer(frameStateExtent, renderBuffer * resolution, extent); - // FIXME dispose of old replayGroup in post render goog.dispose(this.replayGroup_); this.replayGroup_ = null; @@ -247,6 +248,7 @@ ol.renderer.canvas.VectorLayer.prototype.prepareFrame = this.renderedResolution_ = resolution; this.renderedRevision_ = vectorLayerRevision; this.renderedRenderOrder_ = vectorLayerRenderOrder; + this.renderedExtent_ = extent; this.replayGroup_ = replayGroup; return true; diff --git a/src/ol/renderer/dom/domvectorlayerrenderer.js b/src/ol/renderer/dom/domvectorlayerrenderer.js index eb2593237db..5d2d802d211 100644 --- a/src/ol/renderer/dom/domvectorlayerrenderer.js +++ b/src/ol/renderer/dom/domvectorlayerrenderer.js @@ -220,23 +220,24 @@ ol.renderer.dom.VectorLayer.prototype.prepareFrame = var resolution = viewState.resolution; var pixelRatio = frameState.pixelRatio; var vectorLayerRevision = vectorLayer.getRevision(); + var vectorLayerRenderBuffer = vectorLayer.getRenderBuffer(); var vectorLayerRenderOrder = vectorLayer.getRenderOrder(); + if (!goog.isDef(vectorLayerRenderOrder)) { vectorLayerRenderOrder = ol.renderer.vector.defaultOrder; } + var extent = ol.extent.buffer(frameStateExtent, + vectorLayerRenderBuffer * resolution); + if (!this.dirty_ && this.renderedResolution_ == resolution && this.renderedRevision_ == vectorLayerRevision && this.renderedRenderOrder_ == vectorLayerRenderOrder && - ol.extent.containsExtent(this.renderedExtent_, frameStateExtent)) { + ol.extent.containsExtent(this.renderedExtent_, extent)) { return true; } - var extent = this.renderedExtent_; - var renderBuffer = vectorLayer.getRenderBuffer(); - ol.extent.buffer(frameStateExtent, renderBuffer * resolution, extent); - // FIXME dispose of old replayGroup in post render goog.dispose(this.replayGroup_); this.replayGroup_ = null; @@ -287,6 +288,7 @@ ol.renderer.dom.VectorLayer.prototype.prepareFrame = this.renderedResolution_ = resolution; this.renderedRevision_ = vectorLayerRevision; this.renderedRenderOrder_ = vectorLayerRenderOrder; + this.renderedExtent_ = extent; this.replayGroup_ = replayGroup; return true; diff --git a/src/ol/renderer/webgl/webglvectorlayerrenderer.js b/src/ol/renderer/webgl/webglvectorlayerrenderer.js index 4287ef99dbb..e2a685a6336 100644 --- a/src/ol/renderer/webgl/webglvectorlayerrenderer.js +++ b/src/ol/renderer/webgl/webglvectorlayerrenderer.js @@ -139,23 +139,24 @@ ol.renderer.webgl.VectorLayer.prototype.prepareFrame = var resolution = viewState.resolution; var pixelRatio = frameState.pixelRatio; var vectorLayerRevision = vectorLayer.getRevision(); + var vectorLayerRenderBuffer = vectorLayer.getRenderBuffer(); var vectorLayerRenderOrder = vectorLayer.getRenderOrder(); + if (!goog.isDef(vectorLayerRenderOrder)) { vectorLayerRenderOrder = ol.renderer.vector.defaultOrder; } + var extent = ol.extent.buffer(frameStateExtent, + vectorLayerRenderBuffer * resolution); + if (!this.dirty_ && this.renderedResolution_ == resolution && this.renderedRevision_ == vectorLayerRevision && this.renderedRenderOrder_ == vectorLayerRenderOrder && - ol.extent.containsExtent(this.renderedExtent_, frameStateExtent)) { + ol.extent.containsExtent(this.renderedExtent_, extent)) { return true; } - var extent = this.renderedExtent_; - var renderBuffer = vectorLayer.getRenderBuffer(); - ol.extent.buffer(frameStateExtent, renderBuffer * resolution, extent); - if (!goog.isNull(this.replayGroup_)) { frameState.postRenderFunctions.push( this.replayGroup_.getDeleteResourcesFunction(context)); @@ -206,6 +207,7 @@ ol.renderer.webgl.VectorLayer.prototype.prepareFrame = this.renderedResolution_ = resolution; this.renderedRevision_ = vectorLayerRevision; this.renderedRenderOrder_ = vectorLayerRenderOrder; + this.renderedExtent_ = extent; this.replayGroup_ = replayGroup; return true;