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({