From acac7a9403560b4119c4c3a0fbf9143e2efe44ef Mon Sep 17 00:00:00 2001 From: Simon Seyock Date: Tue, 24 Sep 2019 09:31:07 +0200 Subject: [PATCH] remove skipFeature logic --- src/ol/PluggableMap.js | 25 ----------- src/ol/render/canvas/Executor.js | 22 ++------- src/ol/render/canvas/ExecutorGroup.js | 14 ++---- src/ol/renderer/Map.js | 6 +-- src/ol/renderer/canvas/VectorImageLayer.js | 14 +----- src/ol/renderer/canvas/VectorLayer.js | 9 ++-- src/ol/renderer/canvas/VectorTileLayer.js | 6 +-- src/ol/source/Raster.js | 1 - test/spec/ol/renderer/canvas/builder.test.js | 45 ++----------------- .../ol/renderer/canvas/vectorimage.test.js | 1 - .../ol/renderer/canvas/vectorlayer.test.js | 4 +- .../renderer/canvas/vectortilelayer.test.js | 3 +- 12 files changed, 24 insertions(+), 126 deletions(-) diff --git a/src/ol/PluggableMap.js b/src/ol/PluggableMap.js index d75e4b7f65..e732ad348f 100644 --- a/src/ol/PluggableMap.js +++ b/src/ol/PluggableMap.js @@ -47,7 +47,6 @@ import {create as createTransform, apply as applyTransform} from './transform.js * @property {import("./transform.js").Transform} pixelToCoordinateTransform * @property {Array} postRenderFunctions * @property {import("./size.js").Size} size - * @property {!Object} skippedFeatureUids * @property {TileQueue} tileQueue * @property {!Object>} usedTiles * @property {Array} viewHints @@ -366,13 +365,6 @@ class PluggableMap extends BaseObject { this.getTilePriority.bind(this), this.handleTileChange_.bind(this)); - /** - * Uids of features to skip at rendering time. - * @type {Object} - * @private - */ - this.skippedFeatureUids_ = {}; - this.addEventListener(getChangeEventType(MapProperty.LAYERGROUP), this.handleLayerGroupChanged_); this.addEventListener(getChangeEventType(MapProperty.VIEW), this.handleViewChanged_); this.addEventListener(getChangeEventType(MapProperty.SIZE), this.handleSizeChanged_); @@ -1244,7 +1236,6 @@ class PluggableMap extends BaseObject { pixelToCoordinateTransform: this.pixelToCoordinateTransform_, postRenderFunctions: [], size: size, - skippedFeatureUids: this.skippedFeatureUids_, tileQueue: this.tileQueue_, time: time, usedTiles: {}, @@ -1337,14 +1328,6 @@ class PluggableMap extends BaseObject { this.set(MapProperty.VIEW, view); } - /** - * @param {import("./Feature.js").default} feature Feature. - */ - skipFeature(feature) { - this.skippedFeatureUids_[getUid(feature)] = true; - this.render(); - } - /** * Force a recalculation of the map viewport size. This should be called when * third-party code changes the size of the map viewport. @@ -1371,14 +1354,6 @@ class PluggableMap extends BaseObject { ]); } } - - /** - * @param {import("./Feature.js").default} feature Feature. - */ - unskipFeature(feature) { - delete this.skippedFeatureUids_[getUid(feature)]; - this.render(); - } } diff --git a/src/ol/render/canvas/Executor.js b/src/ol/render/canvas/Executor.js index 52b5ebc546..2a5e24c7de 100644 --- a/src/ol/render/canvas/Executor.js +++ b/src/ol/render/canvas/Executor.js @@ -1,14 +1,12 @@ /** * @module ol/render/canvas/Executor */ -import {getUid} from '../../util.js'; import {equals} from '../../array.js'; import {createEmpty, createOrUpdate, createOrUpdateEmpty, extend, intersects} from '../../extent.js'; import {lineStringLength} from '../../geom/flat/length.js'; import {drawTextOnPath} from '../../geom/flat/textpath.js'; import {transform2D} from '../../geom/flat/transform.js'; -import {isEmpty} from '../../obj.js'; import {drawImage, defaultPadding, defaultTextBaseline} from '../canvas.js'; import CanvasInstruction from './Instruction.js'; import {TEXT_ALIGN} from './TextBuilder.js'; @@ -497,8 +495,6 @@ class Executor extends Disposable { * @private * @param {CanvasRenderingContext2D} context Context. * @param {import("../../transform.js").Transform} transform Transform. - * @param {Object} skippedFeaturesHash Ids of features - * to skip. * @param {Array<*>} instructions Instructions array. * @param {boolean} snapToPixel Snap point symbols and text to integer pixels. * @param {function(import("../../Feature.js").FeatureLike): T|undefined} featureCallback Feature callback. @@ -510,7 +506,6 @@ class Executor extends Disposable { execute_( context, transform, - skippedFeaturesHash, instructions, snapToPixel, featureCallback, @@ -530,7 +525,6 @@ class Executor extends Disposable { transform, this.pixelCoordinates_); transformSetFromArray(this.renderedTransform_, transform); } - const skipFeatures = !isEmpty(skippedFeaturesHash); let i = 0; // instruction index const ii = instructions.length; // end of instructions let d = 0; // data index @@ -562,9 +556,7 @@ class Executor extends Disposable { switch (type) { case CanvasInstruction.BEGIN_GEOMETRY: feature = /** @type {import("../../Feature.js").FeatureLike} */ (instruction[1]); - if ((skipFeatures && skippedFeaturesHash[getUid(feature)]) || !feature.getGeometry()) { - i = /** @type {number} */ (instruction[2]); - } else if (opt_hitExtent !== undefined && !intersects( + if (opt_hitExtent !== undefined && !intersects( opt_hitExtent, feature.getGeometry().getExtent())) { i = /** @type {number} */ (instruction[2]) + 1; } else { @@ -871,22 +863,17 @@ class Executor extends Disposable { * @param {CanvasRenderingContext2D} context Context. * @param {import("../../transform.js").Transform} transform Transform. * @param {number} viewRotation View rotation. - * @param {Object} skippedFeaturesHash Ids of features - * to skip. * @param {boolean} snapToPixel Snap point symbols and text to integer pixels. */ - execute(context, transform, viewRotation, skippedFeaturesHash, snapToPixel) { + execute(context, transform, viewRotation, snapToPixel) { this.viewRotation_ = viewRotation; - this.execute_(context, transform, - skippedFeaturesHash, this.instructions, snapToPixel, undefined, undefined); + this.execute_(context, transform, this.instructions, snapToPixel, undefined, undefined); } /** * @param {CanvasRenderingContext2D} context Context. * @param {import("../../transform.js").Transform} transform Transform. * @param {number} viewRotation View rotation. - * @param {Object} skippedFeaturesHash Ids of features - * to skip. * @param {function(import("../../Feature.js").FeatureLike): T=} opt_featureCallback * Feature callback. * @param {import("../../extent.js").Extent=} opt_hitExtent Only check features that intersect this @@ -898,12 +885,11 @@ class Executor extends Disposable { context, transform, viewRotation, - skippedFeaturesHash, opt_featureCallback, opt_hitExtent ) { this.viewRotation_ = viewRotation; - return this.execute_(context, transform, skippedFeaturesHash, + return this.execute_(context, transform, this.hitDetectionInstructions, true, opt_featureCallback, opt_hitExtent); } } diff --git a/src/ol/render/canvas/ExecutorGroup.js b/src/ol/render/canvas/ExecutorGroup.js index 1d74dd0eb1..bb8257efa9 100644 --- a/src/ol/render/canvas/ExecutorGroup.js +++ b/src/ol/render/canvas/ExecutorGroup.js @@ -167,7 +167,6 @@ class ExecutorGroup extends Disposable { * @param {number} resolution Resolution. * @param {number} rotation Rotation. * @param {number} hitTolerance Hit tolerance in pixels. - * @param {Object} skippedFeaturesHash Ids of features to skip. * @param {function(import("../../Feature.js").FeatureLike): T} callback Feature callback. * @param {Array} declutteredFeatures Decluttered features. * @return {T|undefined} Callback result. @@ -178,7 +177,6 @@ class ExecutorGroup extends Disposable { resolution, rotation, hitTolerance, - skippedFeaturesHash, callback, declutteredFeatures ) { @@ -256,8 +254,7 @@ class ExecutorGroup extends Disposable { builderType = ORDER[j]; executor = executors[builderType]; if (executor !== undefined) { - result = executor.executeHitDetection(context, transform, rotation, - skippedFeaturesHash, featureCallback, hitExtent); + result = executor.executeHitDetection(context, transform, rotation, featureCallback, hitExtent); if (result) { return result; } @@ -297,14 +294,12 @@ class ExecutorGroup extends Disposable { * @param {CanvasRenderingContext2D} context Context. * @param {import("../../transform.js").Transform} transform Transform. * @param {number} viewRotation View rotation. - * @param {Object} skippedFeaturesHash Ids of features to skip. * @param {boolean} snapToPixel Snap point symbols and test to integer pixel. * @param {Array=} opt_builderTypes Ordered replay types to replay. * Default is {@link module:ol/render/replay~ORDER} * @param {Object=} opt_declutterReplays Declutter replays. */ - execute(context, transform, viewRotation, skippedFeaturesHash, snapToPixel, opt_builderTypes, - opt_declutterReplays) { + execute(context, transform, viewRotation, snapToPixel, opt_builderTypes, opt_declutterReplays) { /** @type {Array} */ const zs = Object.keys(this.executorsByZIndex_).map(Number); @@ -335,7 +330,7 @@ class ExecutorGroup extends Disposable { declutter.push(replay, transform.slice(0)); } } else { - replay.execute(context, transform, viewRotation, skippedFeaturesHash, snapToPixel); + replay.execute(context, transform, viewRotation, snapToPixel); } } } @@ -436,7 +431,6 @@ export function getCircleArray(radius) { */ export function replayDeclutter(declutterReplays, context, rotation, opacity, snapToPixel, declutterItems) { const zs = Object.keys(declutterReplays).map(Number).sort(numberSafeCompareFunction); - const skippedFeatureUids = {}; for (let z = 0, zz = zs.length; z < zz; ++z) { const executorData = declutterReplays[zs[z].toString()]; let currentExecutor; @@ -450,7 +444,7 @@ export function replayDeclutter(declutterReplays, context, rotation, opacity, sn }); } const transform = executorData[i++]; - executor.execute(context, transform, rotation, skippedFeatureUids, snapToPixel); + executor.execute(context, transform, rotation, snapToPixel); } } } diff --git a/src/ol/renderer/Map.js b/src/ol/renderer/Map.js index c8efb1bb72..829d66916a 100644 --- a/src/ol/renderer/Map.js +++ b/src/ol/renderer/Map.js @@ -1,7 +1,7 @@ /** * @module ol/renderer/Map */ -import {abstract, getUid} from '../util.js'; +import {abstract} from '../util.js'; import Disposable from '../Disposable.js'; import {getWidth} from '../extent.js'; import {TRUE} from '../functions.js'; @@ -95,8 +95,8 @@ class MapRenderer extends Disposable { * @return {?} Callback result. */ function forEachFeatureAtCoordinate(managed, feature, layer) { - if (!(getUid(feature) in frameState.skippedFeatureUids && !managed)) { - return callback.call(thisArg, feature, managed ? layer : null); + if (managed) { + return callback.call(thisArg, feature, layer); } } diff --git a/src/ol/renderer/canvas/VectorImageLayer.js b/src/ol/renderer/canvas/VectorImageLayer.js index 29492157f7..e1cec57020 100644 --- a/src/ol/renderer/canvas/VectorImageLayer.js +++ b/src/ol/renderer/canvas/VectorImageLayer.js @@ -3,7 +3,6 @@ */ import ImageCanvas from '../../ImageCanvas.js'; import ViewHint from '../../ViewHint.js'; -import {equals} from '../../array.js'; import {getHeight, getWidth, isEmpty, scaleFromCenter} from '../../extent.js'; import {assign} from '../../obj.js'; import CanvasImageLayerRenderer from './ImageLayer.js'; @@ -25,11 +24,6 @@ class CanvasVectorImageLayerRenderer extends CanvasImageLayerRenderer { constructor(layer) { super(layer); - /** - * @type {!Array} - */ - this.skippedFeatures_ = []; - /** * @private * @type {import("./VectorLayer.js").default} @@ -76,7 +70,6 @@ class CanvasVectorImageLayerRenderer extends CanvasImageLayerRenderer { } if (!hints[ViewHint.ANIMATING] && !hints[ViewHint.INTERACTING] && !isEmpty(renderedExtent)) { - let skippedFeatures = this.skippedFeatures_; vectorRenderer.useContainer(null, null, 1); const context = vectorRenderer.context; const imageFrameState = /** @type {import("../../PluggableMap.js").FrameState} */ (assign({}, frameState, { @@ -89,14 +82,10 @@ class CanvasVectorImageLayerRenderer extends CanvasImageLayerRenderer { rotation: 0 })) })); - const newSkippedFeatures = Object.keys(imageFrameState.skippedFeatureUids).sort(); const image = new ImageCanvas(renderedExtent, viewResolution, pixelRatio, context.canvas, function(callback) { - if (vectorRenderer.prepareFrame(imageFrameState) && - (vectorRenderer.replayGroupChanged || - !equals(skippedFeatures, newSkippedFeatures))) { + if (vectorRenderer.prepareFrame(imageFrameState) && vectorRenderer.replayGroupChanged) { vectorRenderer.renderFrame(imageFrameState, null); renderDeclutterItems(imageFrameState, null); - skippedFeatures = newSkippedFeatures; callback(); } }); @@ -104,7 +93,6 @@ class CanvasVectorImageLayerRenderer extends CanvasImageLayerRenderer { image.addEventListener(EventType.CHANGE, function() { if (image.getState() === ImageState.LOADED) { this.image_ = image; - this.skippedFeatures_ = skippedFeatures; } }.bind(this)); image.load(); diff --git a/src/ol/renderer/canvas/VectorLayer.js b/src/ol/renderer/canvas/VectorLayer.js index 7726a03c7e..ab4f741c82 100644 --- a/src/ol/renderer/canvas/VectorLayer.js +++ b/src/ol/renderer/canvas/VectorLayer.js @@ -140,9 +140,8 @@ class CanvasVectorLayerRenderer extends CanvasLayerRenderer { const snapToPixel = !(viewHints[ViewHint.ANIMATING] || viewHints[ViewHint.INTERACTING]); const transform = this.getRenderTransform(frameState, width, height, 0); - const skippedFeatureUids = layerState.managed ? frameState.skippedFeatureUids : {}; const declutterReplays = /** @type {import("../../layer/Vector.js").default} */ (this.getLayer()).getDeclutter() ? {} : null; - replayGroup.execute(context, transform, rotation, skippedFeatureUids, snapToPixel, undefined, declutterReplays); + replayGroup.execute(context, transform, rotation, snapToPixel, undefined, declutterReplays); if (vectorSource.getWrapX() && projection.canWrapX() && !containsExtent(projectionExtent, extent)) { let startX = extent[0]; @@ -153,7 +152,7 @@ class CanvasVectorLayerRenderer extends CanvasLayerRenderer { --world; offsetX = worldWidth * world; const transform = this.getRenderTransform(frameState, width, height, offsetX); - replayGroup.execute(context, transform, rotation, skippedFeatureUids, snapToPixel, undefined, declutterReplays); + replayGroup.execute(context, transform, rotation, snapToPixel, undefined, declutterReplays); startX += worldWidth; } world = 0; @@ -162,7 +161,7 @@ class CanvasVectorLayerRenderer extends CanvasLayerRenderer { ++world; offsetX = worldWidth * world; const transform = this.getRenderTransform(frameState, width, height, offsetX); - replayGroup.execute(context, transform, rotation, skippedFeatureUids, snapToPixel, undefined, declutterReplays); + replayGroup.execute(context, transform, rotation, snapToPixel, undefined, declutterReplays); startX -= worldWidth; } } @@ -199,7 +198,7 @@ class CanvasVectorLayerRenderer extends CanvasLayerRenderer { const layer = /** @type {import("../../layer/Vector").default} */ (this.getLayer()); /** @type {!Object} */ const features = {}; - const result = this.replayGroup_.forEachFeatureAtCoordinate(coordinate, resolution, rotation, hitTolerance, {}, + const result = this.replayGroup_.forEachFeatureAtCoordinate(coordinate, resolution, rotation, hitTolerance, /** * @param {import("../../Feature.js").FeatureLike} feature Feature. * @return {?} Callback result. diff --git a/src/ol/renderer/canvas/VectorTileLayer.js b/src/ol/renderer/canvas/VectorTileLayer.js index 126f6483d0..c84d44ff38 100644 --- a/src/ol/renderer/canvas/VectorTileLayer.js +++ b/src/ol/renderer/canvas/VectorTileLayer.js @@ -357,7 +357,7 @@ class CanvasVectorTileLayerRenderer extends CanvasTileLayerRenderer { const executorGroups = tile.executorGroups[getUid(layer)]; for (let t = 0, tt = executorGroups.length; t < tt; ++t) { const executorGroup = executorGroups[t]; - found = found || executorGroup.forEachFeatureAtCoordinate(coordinate, resolution, rotation, hitTolerance, {}, + found = found || executorGroup.forEachFeatureAtCoordinate(coordinate, resolution, rotation, hitTolerance, /** * @param {import("../../Feature.js").FeatureLike} feature Feature. * @return {?} Callback result. @@ -497,7 +497,7 @@ class CanvasVectorTileLayerRenderer extends CanvasTileLayerRenderer { } } } - executorGroup.execute(context, transform, rotation, {}, hifi, replayTypes, declutterReplays); + executorGroup.execute(context, transform, rotation, hifi, replayTypes, declutterReplays); if (!declutterReplays && !clipped) { context.restore(); clips.push(currentClip); @@ -617,7 +617,7 @@ class CanvasVectorTileLayerRenderer extends CanvasTileLayerRenderer { translateTransform(transform, -tileExtent[0], -tileExtent[3]); for (let i = 0, ii = executorGroups.length; i < ii; ++i) { const executorGroup = executorGroups[i]; - executorGroup.execute(context, transform, 0, {}, true, IMAGE_REPLAYS[layer.getRenderMode()]); + executorGroup.execute(context, transform, 0, true, IMAGE_REPLAYS[layer.getRenderMode()]); } replayState.renderedTileResolution = tile.wantedResolution; } diff --git a/src/ol/source/Raster.js b/src/ol/source/Raster.js index 51f1c3f922..3ff6d9186f 100644 --- a/src/ol/source/Raster.js +++ b/src/ol/source/Raster.js @@ -220,7 +220,6 @@ class RasterSource extends ImageSource { pixelToCoordinateTransform: createTransform(), postRenderFunctions: [], size: [0, 0], - skippedFeatureUids: {}, tileQueue: this.tileQueue_, time: Date.now(), usedTiles: {}, diff --git a/test/spec/ol/renderer/canvas/builder.test.js b/test/spec/ol/renderer/canvas/builder.test.js index 754cf7b3e2..c97987ef5e 100644 --- a/test/spec/ol/renderer/canvas/builder.test.js +++ b/test/spec/ol/renderer/canvas/builder.test.js @@ -1,4 +1,3 @@ -import {getUid} from '../../../../../src/ol/util.js'; import Feature from '../../../../../src/ol/Feature.js'; import GeometryCollection from '../../../../../src/ol/geom/GeometryCollection.js'; import LineString from '../../../../../src/ol/geom/LineString.js'; @@ -29,14 +28,13 @@ describe('ol.render.canvas.BuilderGroup', function() { /** * @param {BuilderGroup} builder The builder to get instructions from. - * @param {Object=} skippedUids The ids to skip. * @param {number=} pixelRatio The pixel ratio. * @param {boolean=} overlaps Whether there is overlaps. */ - function execute(builder, skippedUids, pixelRatio, overlaps) { + function execute(builder, pixelRatio, overlaps) { const executor = new ExecutorGroup([-180, -90, 180, 90], 1, pixelRatio || 1, !!overlaps, builder.finish()); - executor.execute(context, transform, 0, skippedUids || {}); + executor.execute(context, transform, 0, false); } beforeEach(function() { @@ -147,43 +145,6 @@ describe('ol.render.canvas.BuilderGroup', function() { expect(beginPathCount).to.be(3); }); - it('batches fill and stroke instructions for skipped feature at the beginning', function() { - renderFeature(builder, feature1, style1, 1); - renderFeature(builder, feature2, style2, 1); - renderFeature(builder, feature3, style2, 1); - const skippedUids = {}; - skippedUids[getUid(feature1)] = true; - execute(builder, skippedUids); - expect(fillCount).to.be(1); - expect(strokeCount).to.be(1); - expect(beginPathCount).to.be(1); - }); - - it('batches fill and stroke instructions for skipped feature at the end', function() { - renderFeature(builder, feature1, style1, 1); - renderFeature(builder, feature2, style1, 1); - renderFeature(builder, feature3, style2, 1); - const skippedUids = {}; - skippedUids[getUid(feature3)] = true; - execute(builder, skippedUids); - expect(fillCount).to.be(1); - expect(strokeCount).to.be(1); - expect(beginPathCount).to.be(1); - }); - - it('batches fill and stroke instructions for skipped features', function() { - renderFeature(builder, feature1, style1, 1); - renderFeature(builder, feature2, style1, 1); - renderFeature(builder, feature3, style2, 1); - const skippedUids = {}; - skippedUids[getUid(feature1)] = true; - skippedUids[getUid(feature2)] = true; - execute(builder, skippedUids); - expect(fillCount).to.be(1); - expect(strokeCount).to.be(1); - expect(beginPathCount).to.be(1); - }); - it('does not batch when overlaps is set to true', function() { builder = new BuilderGroup(1, [-180, -90, 180, 90], 1, 1, true); renderFeature(builder, feature1, style1, 1); @@ -263,7 +224,7 @@ describe('ol.render.canvas.BuilderGroup', function() { renderFeature(builder, multipolygon, style, 1); renderFeature(builder, geometrycollection, style, 1); scaleTransform(transform, 0.1, 0.1); - execute(builder, {}, 1, true); + execute(builder, 1, true); expect(calls.length).to.be(9); expect(calls[0].geometry).to.be(point.getGeometry()); expect(calls[0].feature).to.be(point); diff --git a/test/spec/ol/renderer/canvas/vectorimage.test.js b/test/spec/ol/renderer/canvas/vectorimage.test.js index c9467ab2f2..fcb6fe505c 100644 --- a/test/spec/ol/renderer/canvas/vectorimage.test.js +++ b/test/spec/ol/renderer/canvas/vectorimage.test.js @@ -38,7 +38,6 @@ describe('ol/renderer/canvas/VectorImageLayer', function() { layerStatesArray: [layer.getLayerState()], layerIndex: 0, extent: extent, - skippedFeatureUids: {}, viewHints: [], viewState: { projection: projection, diff --git a/test/spec/ol/renderer/canvas/vectorlayer.test.js b/test/spec/ol/renderer/canvas/vectorlayer.test.js index d6221ff07d..e5713456d9 100644 --- a/test/spec/ol/renderer/canvas/vectorlayer.test.js +++ b/test/spec/ol/renderer/canvas/vectorlayer.test.js @@ -190,7 +190,7 @@ describe('ol.renderer.canvas.VectorLayer', function() { const replayGroup = {}; renderer.replayGroup_ = replayGroup; replayGroup.forEachFeatureAtCoordinate = function(coordinate, - resolution, rotation, hitTolerance, skippedFeaturesUids, callback) { + resolution, rotation, hitTolerance, callback) { const feature = new Feature(); callback(feature); callback(feature); @@ -202,7 +202,6 @@ describe('ol.renderer.canvas.VectorLayer', function() { const coordinate = [0, 0]; const frameState = { layerStatesArray: [{}], - skippedFeatureUids: {}, viewState: { resolution: 1, rotation: 0 @@ -228,7 +227,6 @@ describe('ol.renderer.canvas.VectorLayer', function() { worldWidth = getWidth(projExtent); buffer = layer.getRenderBuffer(); frameState = { - skippedFeatureUids: {}, viewHints: [], viewState: { projection: projection, diff --git a/test/spec/ol/renderer/canvas/vectortilelayer.test.js b/test/spec/ol/renderer/canvas/vectortilelayer.test.js index 47d381d2e2..d20bc0715a 100644 --- a/test/spec/ol/renderer/canvas/vectortilelayer.test.js +++ b/test/spec/ol/renderer/canvas/vectortilelayer.test.js @@ -314,7 +314,7 @@ describe('ol.renderer.canvas.VectorTileLayer', function() { }); renderer = new CanvasVectorTileLayerRenderer(layer); executorGroup.forEachFeatureAtCoordinate = function(coordinate, - resolution, rotation, hitTolerance, skippedFeaturesUids, callback) { + resolution, rotation, hitTolerance, callback) { const feature = new Feature(); callback(feature); callback(feature); @@ -326,7 +326,6 @@ describe('ol.renderer.canvas.VectorTileLayer', function() { const coordinate = [0, 0]; const frameState = { layerStatesArray: [{}], - skippedFeatureUids: {}, viewState: { projection: getProjection('EPSG:3857'), resolution: 1,