diff --git a/src/ol/PluggableMap.js b/src/ol/PluggableMap.js index 1a702641aa..7447acace7 100644 --- a/src/ol/PluggableMap.js +++ b/src/ol/PluggableMap.js @@ -41,7 +41,6 @@ import {create as createTransform, apply as applyTransform} from './transform.js * @property {null|import("./extent.js").Extent} extent * @property {import("./coordinate.js").Coordinate} focus * @property {number} index - * @property {Object} layerStates * @property {Array} layerStatesArray * @property {import("./transform.js").Transform} pixelToCoordinateTransform * @property {Array} postRenderFunctions @@ -1188,11 +1187,6 @@ class PluggableMap extends BaseObject { let frameState = null; if (size !== undefined && hasArea(size) && view && view.isDef()) { const viewHints = view.getHints(this.frameState_ ? this.frameState_.viewHints : undefined); - const layerStatesArray = this.getLayerGroup().getLayerStatesArray(); - const layerStates = {}; - for (let i = 0, ii = layerStatesArray.length; i < ii; ++i) { - layerStates[getUid(layerStatesArray[i].layer)] = layerStatesArray[i]; - } viewState = view.getState(this.pixelRatio_); frameState = /** @type {FrameState} */ ({ animate: false, @@ -1200,8 +1194,7 @@ class PluggableMap extends BaseObject { extent: extent, focus: this.focus_ ? this.focus_ : viewState.center, index: this.frameIndex_++, - layerStates: layerStates, - layerStatesArray: layerStatesArray, + layerStatesArray: this.getLayerGroup().getLayerStatesArray(), pixelRatio: this.pixelRatio_, pixelToCoordinateTransform: this.pixelToCoordinateTransform_, postRenderFunctions: [], diff --git a/src/ol/layer/Layer.js b/src/ol/layer/Layer.js index 723c7b5be1..d735a4eeef 100644 --- a/src/ol/layer/Layer.js +++ b/src/ol/layer/Layer.js @@ -3,7 +3,6 @@ */ import {listen, unlistenByKey} from '../events.js'; import EventType from '../events/EventType.js'; -import {getUid} from '../util.js'; import {getChangeEventType} from '../Object.js'; import BaseLayer from './Base.js'; import LayerProperty from './Property.js'; @@ -219,7 +218,6 @@ class Layer extends BaseLayer { layerState.zIndex = Infinity; } renderEvent.frameState.layerStatesArray.push(layerState); - renderEvent.frameState.layerStates[getUid(this)] = layerState; }, this); this.mapRenderKey_ = listen(this, EventType.CHANGE, map.render, map); this.changed(); diff --git a/src/ol/renderer/Map.js b/src/ol/renderer/Map.js index dcd4f96a69..105d41014f 100644 --- a/src/ol/renderer/Map.js +++ b/src/ol/renderer/Map.js @@ -1,6 +1,7 @@ /** * @module ol/renderer/Map */ +import {includes} from '../array.js'; import {abstract, getUid} from '../util.js'; import Disposable from '../Disposable.js'; import {listen, unlistenByKey} from '../events.js'; @@ -105,6 +106,11 @@ class MapRenderer extends Disposable { let result; const viewState = frameState.viewState; const viewResolution = viewState.resolution; + const managedLayers = frameState.layerStatesArray.map(function(state) { + if (state.managed) { + return getUid(state.layer); + } + }); /** * @param {import("../Feature.js").FeatureLike} feature Feature. @@ -112,7 +118,7 @@ class MapRenderer extends Disposable { * @return {?} Callback result. */ function forEachFeatureAtCoordinate(feature, layer) { - const managed = frameState.layerStates[getUid(layer)].managed; + const managed = includes(managedLayers, getUid(layer)); if (!(getUid(feature) in frameState.skippedFeatureUids && !managed)) { return callback.call(thisArg, feature, managed ? layer : null); } @@ -255,8 +261,9 @@ class MapRenderer extends Disposable { * @private */ removeUnusedLayerRenderers_(map, frameState) { + const layersUids = getLayersUids(frameState.layerStatesArray); for (const layerKey in this.layerRenderers_) { - if (!frameState || !(layerKey in frameState.layerStates)) { + if (!frameState || !(includes(layersUids, layerKey))) { this.removeLayerRendererByKey_(layerKey).dispose(); } } @@ -284,8 +291,9 @@ class MapRenderer extends Disposable { * @protected */ scheduleRemoveUnusedLayerRenderers(frameState) { + const layersUids = getLayersUids(frameState.layerStatesArray); for (const layerKey in this.layerRenderers_) { - if (!(layerKey in frameState.layerStates)) { + if (!(includes(layersUids, layerKey))) { frameState.postRenderFunctions.push( /** @type {import("../PluggableMap.js").PostRenderFunction} */ (this.removeUnusedLayerRenderers_.bind(this)) ); @@ -304,6 +312,15 @@ function expireIconCache(map, frameState) { iconImageCache.expire(); } +/** + * @param {Array} layerStatesArray Layer states array. + * @return {Array} Layers uid. + */ +function getLayersUids(layerStatesArray) { + return layerStatesArray.map(function(state) { + return getUid(state.layer); + }); +} /** * @param {import("../layer/Layer.js").State} state1 First layer state. diff --git a/src/ol/source/Raster.js b/src/ol/source/Raster.js index 6f3cbe229c..0e448d69f8 100644 --- a/src/ol/source/Raster.js +++ b/src/ol/source/Raster.js @@ -1,7 +1,6 @@ /** * @module ol/source/Raster */ -import {getUid} from '../util.js'; import ImageCanvas from '../ImageCanvas.js'; import TileQueue from '../TileQueue.js'; import {createCanvasContext2D} from '../dom.js'; @@ -185,16 +184,6 @@ class RasterSource extends ImageSource { return 1; }, this.changed.bind(this)); - const layerStatesArray = getLayerStatesArray(this.layers_); - - /** - * @type {Object} - */ - const layerStates = {}; - for (let i = 0, ii = layerStatesArray.length; i < ii; ++i) { - layerStates[getUid(layerStatesArray[i].layer)] = layerStatesArray[i]; - } - /** * The most recently requested frame state. * @type {import("../PluggableMap.js").FrameState} @@ -225,8 +214,7 @@ class RasterSource extends ImageSource { extent: null, focus: null, index: 0, - layerStates: layerStates, - layerStatesArray: layerStatesArray, + layerStatesArray: getLayerStatesArray(this.layers_), pixelRatio: 1, pixelToCoordinateTransform: createTransform(), postRenderFunctions: [], diff --git a/test/spec/ol/layer/layer.test.js b/test/spec/ol/layer/layer.test.js index ff3aeb97a5..e077455ac1 100644 --- a/test/spec/ol/layer/layer.test.js +++ b/test/spec/ol/layer/layer.test.js @@ -1,4 +1,3 @@ -import {getUid} from '../../../../src/ol/util.js'; import Map from '../../../../src/ol/Map.js'; import Layer, {visibleAtResolution} from '../../../../src/ol/layer/Layer.js'; import {get as getProjection} from '../../../../src/ol/proj.js'; @@ -396,15 +395,12 @@ describe('ol.layer.Layer', function() { map: map }); const frameState = { - layerStatesArray: [], - layerStates: {} + layerStatesArray: [] }; - map.dispatchEvent(new RenderEvent('precompose', null, - frameState, null, null)); + map.dispatchEvent(new RenderEvent('precompose', null, frameState, null, null)); expect(frameState.layerStatesArray.length).to.be(1); const layerState = frameState.layerStatesArray[0]; expect(layerState.layer).to.equal(layer); - expect(frameState.layerStates[getUid(layer)]).to.equal(layerState); }); }); diff --git a/test/spec/ol/renderer/canvas/vectorlayer.test.js b/test/spec/ol/renderer/canvas/vectorlayer.test.js index d540eb781d..b34d91ead7 100644 --- a/test/spec/ol/renderer/canvas/vectorlayer.test.js +++ b/test/spec/ol/renderer/canvas/vectorlayer.test.js @@ -1,4 +1,3 @@ -import {getUid} from '../../../../../src/ol/util.js'; import Feature from '../../../../../src/ol/Feature.js'; import Map from '../../../../../src/ol/Map.js'; import View from '../../../../../src/ol/View.js'; @@ -203,14 +202,13 @@ describe('ol.renderer.canvas.VectorLayer', function() { const spy = sinon.spy(); const coordinate = [0, 0]; const frameState = { - layerStates: {}, + layerStatesArray: [{}], skippedFeatureUids: {}, viewState: { resolution: 1, rotation: 0 } }; - frameState.layerStates[getUid(layer)] = {}; renderer.forEachFeatureAtCoordinate( coordinate, frameState, 0, spy, undefined); expect(spy.callCount).to.be(1); diff --git a/test/spec/ol/renderer/canvas/vectortilelayer.test.js b/test/spec/ol/renderer/canvas/vectortilelayer.test.js index 5521b586af..8e44634d7a 100644 --- a/test/spec/ol/renderer/canvas/vectortilelayer.test.js +++ b/test/spec/ol/renderer/canvas/vectortilelayer.test.js @@ -1,4 +1,3 @@ -import {getUid} from '../../../../../src/ol/util.js'; import {clear} from '../../../../../src/ol/obj.js'; import Feature from '../../../../../src/ol/Feature.js'; import Map from '../../../../../src/ol/Map.js'; @@ -329,7 +328,7 @@ describe('ol.renderer.canvas.VectorTileLayer', function() { const spy = sinon.spy(); const coordinate = [0, 0]; const frameState = { - layerStates: {}, + layerStatesArray: [{}], skippedFeatureUids: {}, viewState: { projection: getProjection('EPSG:3857'), @@ -337,7 +336,6 @@ describe('ol.renderer.canvas.VectorTileLayer', function() { rotation: 0 } }; - frameState.layerStates[getUid(layer)] = {}; renderer.renderedTiles = [new TileClass([0, 0, -1], undefined, 1)]; renderer.forEachFeatureAtCoordinate( coordinate, frameState, 0, spy, undefined);