diff --git a/externs/olx.js b/externs/olx.js index 7deab6bc85..65bcf571c9 100644 --- a/externs/olx.js +++ b/externs/olx.js @@ -8525,7 +8525,7 @@ olx.view.FitOptions.prototype.callback; * pixelToCoordinateTransform: ol.Transform, * postRenderFunctions: Array., * size: ol.Size, - * skippedFeatureUids: Object., + * skippedFeatureUids: !Object., * tileQueue: ol.TileQueue, * time: number, * usedTiles: Object.>, diff --git a/src/ol/renderer/canvas/imagelayer.js b/src/ol/renderer/canvas/imagelayer.js index b807dee5b6..dd4043ba44 100644 --- a/src/ol/renderer/canvas/imagelayer.js +++ b/src/ol/renderer/canvas/imagelayer.js @@ -4,6 +4,7 @@ goog.require('ol'); goog.require('ol.ImageCanvas'); goog.require('ol.LayerType'); goog.require('ol.ViewHint'); +goog.require('ol.array'); goog.require('ol.extent'); goog.require('ol.layer.VectorRenderType'); goog.require('ol.obj'); @@ -35,6 +36,11 @@ ol.renderer.canvas.ImageLayer = function(imageLayer) { */ this.imageTransform_ = ol.transform.create(); + /** + * @type {!Array.} + */ + this.skippedFeatures_ = []; + /** * @private * @type {ol.renderer.canvas.VectorLayer} @@ -139,11 +145,15 @@ ol.renderer.canvas.ImageLayer.prototype.prepareFrame = function(frameState, laye rotation: 0 })) })); - if (vectorRenderer.prepareFrame(imageFrameState, layerState) && vectorRenderer.replayGroupChanged) { + var skippedFeatures = Object.keys(imageFrameState.skippedFeatureUids).sort(); + if (vectorRenderer.prepareFrame(imageFrameState, layerState) && + (vectorRenderer.replayGroupChanged || + !ol.array.equals(skippedFeatures, this.skippedFeatures_))) { context.canvas.width = imageFrameState.size[0] * pixelRatio; context.canvas.height = imageFrameState.size[1] * pixelRatio; vectorRenderer.composeFrame(imageFrameState, layerState, context); this.image_ = new ol.ImageCanvas(renderedExtent, viewResolution, pixelRatio, context.canvas); + this.skippedFeatures_ = skippedFeatures; } } else { image = imageSource.getImage( diff --git a/test/rendering/ol/layer/expected/vector.png b/test/rendering/ol/layer/expected/vector.png new file mode 100644 index 0000000000..9227b57208 Binary files /dev/null and b/test/rendering/ol/layer/expected/vector.png differ diff --git a/test/rendering/ol/layer/vector.test.js b/test/rendering/ol/layer/vector.test.js index 0f33f50977..2c578d8d34 100644 --- a/test/rendering/ol/layer/vector.test.js +++ b/test/rendering/ol/layer/vector.test.js @@ -248,6 +248,32 @@ describe('ol.rendering.layer.Vector', function() { }); }); + it('unskips features correctly with renderMode: \'image\'', function(done) { + createMap('canvas'); + addCircle(500); + addPolygon(300); + map.skipFeature(source.getFeatures()[1]); + map.addLayer(new ol.layer.Vector({ + renderMode: 'image', + source: source, + style: new ol.style.Style({ + fill: new ol.style.Fill({ + color: 'rgba(255,0,0,0.5)' + }), + stroke: new ol.style.Stroke({ + width: 2, + color: 'black' + }) + }) + })); + map.renderSync(); + map.unskipFeature(source.getFeatures()[1]); + map.once('postrender', function() { + expectResemble(map, 'rendering/ol/layer/expected/vector.png', + IMAGE_TOLERANCE, done); + }); + }); + it('renders fill/stroke batches correctly with the canvas renderer', function(done) { createMap('canvas'); source = new ol.source.Vector({