diff --git a/src/ol/renderer/canvas/imagelayer.js b/src/ol/renderer/canvas/imagelayer.js index b9a159548c..b807dee5b6 100644 --- a/src/ol/renderer/canvas/imagelayer.js +++ b/src/ol/renderer/canvas/imagelayer.js @@ -127,8 +127,9 @@ ol.renderer.canvas.ImageLayer.prototype.prepareFrame = function(frameState, laye projection = sourceProjection; } } - if (this.vectorRenderer_) { - var context = this.vectorRenderer_.context; + var vectorRenderer = this.vectorRenderer_; + if (vectorRenderer) { + var context = vectorRenderer.context; var imageFrameState = /** @type {olx.FrameState} */ (ol.obj.assign({}, frameState, { size: [ ol.extent.getWidth(renderedExtent) / viewResolution, @@ -138,12 +139,12 @@ ol.renderer.canvas.ImageLayer.prototype.prepareFrame = function(frameState, laye rotation: 0 })) })); - if (this.vectorRenderer_.prepareFrame(imageFrameState, layerState)) { + if (vectorRenderer.prepareFrame(imageFrameState, layerState) && vectorRenderer.replayGroupChanged) { context.canvas.width = imageFrameState.size[0] * pixelRatio; context.canvas.height = imageFrameState.size[1] * pixelRatio; - this.vectorRenderer_.composeFrame(imageFrameState, layerState, context); + vectorRenderer.composeFrame(imageFrameState, layerState, context); + this.image_ = new ol.ImageCanvas(renderedExtent, viewResolution, pixelRatio, context.canvas); } - this.image_ = new ol.ImageCanvas(renderedExtent, viewResolution, pixelRatio, context.canvas); } else { image = imageSource.getImage( renderedExtent, viewResolution, pixelRatio, projection); diff --git a/src/ol/renderer/canvas/vectorlayer.js b/src/ol/renderer/canvas/vectorlayer.js index 173bef5b37..6372dac53f 100644 --- a/src/ol/renderer/canvas/vectorlayer.js +++ b/src/ol/renderer/canvas/vectorlayer.js @@ -69,6 +69,12 @@ ol.renderer.canvas.VectorLayer = function(vectorLayer) { */ this.replayGroup_ = null; + /** + * A new replay group had to be created by `prepareFrame()` + * @type {boolean} + */ + this.replayGroupChanged = true; + /** * @type {CanvasRenderingContext2D} */ @@ -343,6 +349,7 @@ ol.renderer.canvas.VectorLayer.prototype.prepareFrame = function(frameState, lay this.renderedRevision_ == vectorLayerRevision && this.renderedRenderOrder_ == vectorLayerRenderOrder && ol.extent.containsExtent(this.renderedExtent_, extent)) { + this.replayGroupChanged = false; return true; } @@ -400,6 +407,7 @@ ol.renderer.canvas.VectorLayer.prototype.prepareFrame = function(frameState, lay this.renderedExtent_ = extent; this.replayGroup_ = replayGroup; + this.replayGroupChanged = true; return true; }; diff --git a/test/spec/ol/renderer/canvas/vectorlayer.test.js b/test/spec/ol/renderer/canvas/vectorlayer.test.js index 1a2c88a162..098622aa55 100644 --- a/test/spec/ol/renderer/canvas/vectorlayer.test.js +++ b/test/spec/ol/renderer/canvas/vectorlayer.test.js @@ -290,6 +290,14 @@ describe('ol.renderer.canvas.VectorLayer', function() { ], buffer)); }); + it('sets replayGroupChanged correctly', function() { + frameState.extent = [-10000, -10000, 10000, 10000]; + renderer.prepareFrame(frameState, {}); + expect(renderer.replayGroupChanged).to.be(true); + renderer.prepareFrame(frameState, {}); + expect(renderer.replayGroupChanged).to.be(false); + }); + }); });