Merge pull request #9072 from fredj/rm_layerStates
Remove 'layerStates' property from the FrameState
This commit is contained in:
@@ -41,7 +41,6 @@ import {create as createTransform, apply as applyTransform} from './transform.js
|
|||||||
* @property {null|import("./extent.js").Extent} extent
|
* @property {null|import("./extent.js").Extent} extent
|
||||||
* @property {import("./coordinate.js").Coordinate} focus
|
* @property {import("./coordinate.js").Coordinate} focus
|
||||||
* @property {number} index
|
* @property {number} index
|
||||||
* @property {Object<string, import("./layer/Layer.js").State>} layerStates
|
|
||||||
* @property {Array<import("./layer/Layer.js").State>} layerStatesArray
|
* @property {Array<import("./layer/Layer.js").State>} layerStatesArray
|
||||||
* @property {import("./transform.js").Transform} pixelToCoordinateTransform
|
* @property {import("./transform.js").Transform} pixelToCoordinateTransform
|
||||||
* @property {Array<PostRenderFunction>} postRenderFunctions
|
* @property {Array<PostRenderFunction>} postRenderFunctions
|
||||||
@@ -55,7 +54,7 @@ import {create as createTransform, apply as applyTransform} from './transform.js
|
|||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @typedef {function(PluggableMap, ?FrameState): boolean} PostRenderFunction
|
* @typedef {function(PluggableMap, ?FrameState): any} PostRenderFunction
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
|
||||||
@@ -1161,11 +1160,6 @@ class PluggableMap extends BaseObject {
|
|||||||
let frameState = null;
|
let frameState = null;
|
||||||
if (size !== undefined && hasArea(size) && view && view.isDef()) {
|
if (size !== undefined && hasArea(size) && view && view.isDef()) {
|
||||||
const viewHints = view.getHints(this.frameState_ ? this.frameState_.viewHints : undefined);
|
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_);
|
viewState = view.getState(this.pixelRatio_);
|
||||||
frameState = /** @type {FrameState} */ ({
|
frameState = /** @type {FrameState} */ ({
|
||||||
animate: false,
|
animate: false,
|
||||||
@@ -1173,8 +1167,7 @@ class PluggableMap extends BaseObject {
|
|||||||
extent: extent,
|
extent: extent,
|
||||||
focus: this.focus_ ? this.focus_ : viewState.center,
|
focus: this.focus_ ? this.focus_ : viewState.center,
|
||||||
index: this.frameIndex_++,
|
index: this.frameIndex_++,
|
||||||
layerStates: layerStates,
|
layerStatesArray: this.getLayerGroup().getLayerStatesArray(),
|
||||||
layerStatesArray: layerStatesArray,
|
|
||||||
pixelRatio: this.pixelRatio_,
|
pixelRatio: this.pixelRatio_,
|
||||||
pixelToCoordinateTransform: this.pixelToCoordinateTransform_,
|
pixelToCoordinateTransform: this.pixelToCoordinateTransform_,
|
||||||
postRenderFunctions: [],
|
postRenderFunctions: [],
|
||||||
|
|||||||
@@ -3,7 +3,6 @@
|
|||||||
*/
|
*/
|
||||||
import {listen, unlistenByKey} from '../events.js';
|
import {listen, unlistenByKey} from '../events.js';
|
||||||
import EventType from '../events/EventType.js';
|
import EventType from '../events/EventType.js';
|
||||||
import {getUid} from '../util.js';
|
|
||||||
import {getChangeEventType} from '../Object.js';
|
import {getChangeEventType} from '../Object.js';
|
||||||
import BaseLayer from './Base.js';
|
import BaseLayer from './Base.js';
|
||||||
import LayerProperty from './Property.js';
|
import LayerProperty from './Property.js';
|
||||||
@@ -219,7 +218,6 @@ class Layer extends BaseLayer {
|
|||||||
layerState.zIndex = Infinity;
|
layerState.zIndex = Infinity;
|
||||||
}
|
}
|
||||||
renderEvent.frameState.layerStatesArray.push(layerState);
|
renderEvent.frameState.layerStatesArray.push(layerState);
|
||||||
renderEvent.frameState.layerStates[getUid(this)] = layerState;
|
|
||||||
}, this);
|
}, this);
|
||||||
this.mapRenderKey_ = listen(this, EventType.CHANGE, map.render, map);
|
this.mapRenderKey_ = listen(this, EventType.CHANGE, map.render, map);
|
||||||
this.changed();
|
this.changed();
|
||||||
|
|||||||
+22
-22
@@ -107,12 +107,12 @@ class MapRenderer extends Disposable {
|
|||||||
const viewResolution = viewState.resolution;
|
const viewResolution = viewState.resolution;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
* @param {boolean} managed Managed layer.
|
||||||
* @param {import("../Feature.js").FeatureLike} feature Feature.
|
* @param {import("../Feature.js").FeatureLike} feature Feature.
|
||||||
* @param {import("../layer/Layer.js").default} layer Layer.
|
* @param {import("../layer/Layer.js").default} layer Layer.
|
||||||
* @return {?} Callback result.
|
* @return {?} Callback result.
|
||||||
*/
|
*/
|
||||||
function forEachFeatureAtCoordinate(feature, layer) {
|
function forEachFeatureAtCoordinate(managed, feature, layer) {
|
||||||
const managed = frameState.layerStates[getUid(layer)].managed;
|
|
||||||
if (!(getUid(feature) in frameState.skippedFeatureUids && !managed)) {
|
if (!(getUid(feature) in frameState.skippedFeatureUids && !managed)) {
|
||||||
return callback.call(thisArg, feature, managed ? layer : null);
|
return callback.call(thisArg, feature, managed ? layer : null);
|
||||||
}
|
}
|
||||||
@@ -141,9 +141,10 @@ class MapRenderer extends Disposable {
|
|||||||
const layerRenderer = this.getLayerRenderer(layer);
|
const layerRenderer = this.getLayerRenderer(layer);
|
||||||
const source = layer.getSource();
|
const source = layer.getSource();
|
||||||
if (layerRenderer && source) {
|
if (layerRenderer && source) {
|
||||||
|
const callback = forEachFeatureAtCoordinate.bind(null, layerState.managed);
|
||||||
result = layerRenderer.forEachFeatureAtCoordinate(
|
result = layerRenderer.forEachFeatureAtCoordinate(
|
||||||
source.getWrapX() ? translatedCoordinate : coordinate,
|
source.getWrapX() ? translatedCoordinate : coordinate,
|
||||||
frameState, hitTolerance, forEachFeatureAtCoordinate);
|
frameState, hitTolerance, callback);
|
||||||
}
|
}
|
||||||
if (result) {
|
if (result) {
|
||||||
return result;
|
return result;
|
||||||
@@ -249,19 +250,6 @@ class MapRenderer extends Disposable {
|
|||||||
return layerRenderer;
|
return layerRenderer;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
|
||||||
* @param {import("../PluggableMap.js").default} map Map.
|
|
||||||
* @param {import("../PluggableMap.js").FrameState} frameState Frame state.
|
|
||||||
* @private
|
|
||||||
*/
|
|
||||||
removeUnusedLayerRenderers_(map, frameState) {
|
|
||||||
for (const layerKey in this.layerRenderers_) {
|
|
||||||
if (!frameState || !(layerKey in frameState.layerStates)) {
|
|
||||||
this.removeLayerRendererByKey_(layerKey).dispose();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Render.
|
* Render.
|
||||||
* @abstract
|
* @abstract
|
||||||
@@ -276,7 +264,9 @@ class MapRenderer extends Disposable {
|
|||||||
* @protected
|
* @protected
|
||||||
*/
|
*/
|
||||||
scheduleExpireIconCache(frameState) {
|
scheduleExpireIconCache(frameState) {
|
||||||
frameState.postRenderFunctions.push(/** @type {import("../PluggableMap.js").PostRenderFunction} */ (expireIconCache));
|
if (iconImageCache.canExpireCache()) {
|
||||||
|
frameState.postRenderFunctions.push(expireIconCache);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -284,12 +274,12 @@ class MapRenderer extends Disposable {
|
|||||||
* @protected
|
* @protected
|
||||||
*/
|
*/
|
||||||
scheduleRemoveUnusedLayerRenderers(frameState) {
|
scheduleRemoveUnusedLayerRenderers(frameState) {
|
||||||
|
const layerStatesMap = getLayerStatesMap(frameState.layerStatesArray);
|
||||||
for (const layerKey in this.layerRenderers_) {
|
for (const layerKey in this.layerRenderers_) {
|
||||||
if (!(layerKey in frameState.layerStates)) {
|
if (!(layerKey in layerStatesMap)) {
|
||||||
frameState.postRenderFunctions.push(
|
frameState.postRenderFunctions.push(function() {
|
||||||
/** @type {import("../PluggableMap.js").PostRenderFunction} */ (this.removeUnusedLayerRenderers_.bind(this))
|
this.removeLayerRendererByKey_(layerKey).dispose();
|
||||||
);
|
}.bind(this));
|
||||||
return;
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -304,6 +294,16 @@ function expireIconCache(map, frameState) {
|
|||||||
iconImageCache.expire();
|
iconImageCache.expire();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @param {Array<import("../layer/Layer.js").State>} layerStatesArray Layer states array.
|
||||||
|
* @return {Object<string, import("../layer/Layer.js").State>} States mapped by layer uid.
|
||||||
|
*/
|
||||||
|
function getLayerStatesMap(layerStatesArray) {
|
||||||
|
return layerStatesArray.reduce(function(acc, state) {
|
||||||
|
acc[getUid(state.layer)] = state;
|
||||||
|
return acc;
|
||||||
|
}, {});
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @param {import("../layer/Layer.js").State} state1 First layer state.
|
* @param {import("../layer/Layer.js").State} state1 First layer state.
|
||||||
|
|||||||
+1
-13
@@ -1,7 +1,6 @@
|
|||||||
/**
|
/**
|
||||||
* @module ol/source/Raster
|
* @module ol/source/Raster
|
||||||
*/
|
*/
|
||||||
import {getUid} from '../util.js';
|
|
||||||
import ImageCanvas from '../ImageCanvas.js';
|
import ImageCanvas from '../ImageCanvas.js';
|
||||||
import TileQueue from '../TileQueue.js';
|
import TileQueue from '../TileQueue.js';
|
||||||
import {createCanvasContext2D} from '../dom.js';
|
import {createCanvasContext2D} from '../dom.js';
|
||||||
@@ -185,16 +184,6 @@ class RasterSource extends ImageSource {
|
|||||||
return 1;
|
return 1;
|
||||||
}, this.changed.bind(this));
|
}, this.changed.bind(this));
|
||||||
|
|
||||||
const layerStatesArray = getLayerStatesArray(this.layers_);
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @type {Object<string, import("../layer/Layer.js").State>}
|
|
||||||
*/
|
|
||||||
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.
|
* The most recently requested frame state.
|
||||||
* @type {import("../PluggableMap.js").FrameState}
|
* @type {import("../PluggableMap.js").FrameState}
|
||||||
@@ -225,8 +214,7 @@ class RasterSource extends ImageSource {
|
|||||||
extent: null,
|
extent: null,
|
||||||
focus: null,
|
focus: null,
|
||||||
index: 0,
|
index: 0,
|
||||||
layerStates: layerStates,
|
layerStatesArray: getLayerStatesArray(this.layers_),
|
||||||
layerStatesArray: layerStatesArray,
|
|
||||||
pixelRatio: 1,
|
pixelRatio: 1,
|
||||||
pixelToCoordinateTransform: createTransform(),
|
pixelToCoordinateTransform: createTransform(),
|
||||||
postRenderFunctions: [],
|
postRenderFunctions: [],
|
||||||
|
|||||||
@@ -37,11 +37,18 @@ class IconImageCache {
|
|||||||
this.cacheSize_ = 0;
|
this.cacheSize_ = 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @return {boolean} Can expire cache.
|
||||||
|
*/
|
||||||
|
canExpireCache() {
|
||||||
|
return this.cacheSize_ > this.maxCacheSize_;
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* FIXME empty description for jsdoc
|
* FIXME empty description for jsdoc
|
||||||
*/
|
*/
|
||||||
expire() {
|
expire() {
|
||||||
if (this.cacheSize_ > this.maxCacheSize_) {
|
if (this.canExpireCache()) {
|
||||||
let i = 0;
|
let i = 0;
|
||||||
for (const key in this.cache_) {
|
for (const key in this.cache_) {
|
||||||
const iconImage = this.cache_[key];
|
const iconImage = this.cache_[key];
|
||||||
|
|||||||
@@ -1,4 +1,3 @@
|
|||||||
import {getUid} from '../../../../src/ol/util.js';
|
|
||||||
import Map from '../../../../src/ol/Map.js';
|
import Map from '../../../../src/ol/Map.js';
|
||||||
import Layer, {visibleAtResolution} from '../../../../src/ol/layer/Layer.js';
|
import Layer, {visibleAtResolution} from '../../../../src/ol/layer/Layer.js';
|
||||||
import {get as getProjection} from '../../../../src/ol/proj.js';
|
import {get as getProjection} from '../../../../src/ol/proj.js';
|
||||||
@@ -396,15 +395,12 @@ describe('ol.layer.Layer', function() {
|
|||||||
map: map
|
map: map
|
||||||
});
|
});
|
||||||
const frameState = {
|
const frameState = {
|
||||||
layerStatesArray: [],
|
layerStatesArray: []
|
||||||
layerStates: {}
|
|
||||||
};
|
};
|
||||||
map.dispatchEvent(new RenderEvent('precompose', null,
|
map.dispatchEvent(new RenderEvent('precompose', null, frameState, null, null));
|
||||||
frameState, null, null));
|
|
||||||
expect(frameState.layerStatesArray.length).to.be(1);
|
expect(frameState.layerStatesArray.length).to.be(1);
|
||||||
const layerState = frameState.layerStatesArray[0];
|
const layerState = frameState.layerStatesArray[0];
|
||||||
expect(layerState.layer).to.equal(layer);
|
expect(layerState.layer).to.equal(layer);
|
||||||
expect(frameState.layerStates[getUid(layer)]).to.equal(layerState);
|
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
|
|
||||||
|
|||||||
@@ -1,4 +1,3 @@
|
|||||||
import {getUid} from '../../../../../src/ol/util.js';
|
|
||||||
import Feature from '../../../../../src/ol/Feature.js';
|
import Feature from '../../../../../src/ol/Feature.js';
|
||||||
import Map from '../../../../../src/ol/Map.js';
|
import Map from '../../../../../src/ol/Map.js';
|
||||||
import View from '../../../../../src/ol/View.js';
|
import View from '../../../../../src/ol/View.js';
|
||||||
@@ -203,14 +202,13 @@ describe('ol.renderer.canvas.VectorLayer', function() {
|
|||||||
const spy = sinon.spy();
|
const spy = sinon.spy();
|
||||||
const coordinate = [0, 0];
|
const coordinate = [0, 0];
|
||||||
const frameState = {
|
const frameState = {
|
||||||
layerStates: {},
|
layerStatesArray: [{}],
|
||||||
skippedFeatureUids: {},
|
skippedFeatureUids: {},
|
||||||
viewState: {
|
viewState: {
|
||||||
resolution: 1,
|
resolution: 1,
|
||||||
rotation: 0
|
rotation: 0
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
frameState.layerStates[getUid(layer)] = {};
|
|
||||||
renderer.forEachFeatureAtCoordinate(
|
renderer.forEachFeatureAtCoordinate(
|
||||||
coordinate, frameState, 0, spy, undefined);
|
coordinate, frameState, 0, spy, undefined);
|
||||||
expect(spy.callCount).to.be(1);
|
expect(spy.callCount).to.be(1);
|
||||||
|
|||||||
@@ -1,4 +1,3 @@
|
|||||||
import {getUid} from '../../../../../src/ol/util.js';
|
|
||||||
import {clear} from '../../../../../src/ol/obj.js';
|
import {clear} from '../../../../../src/ol/obj.js';
|
||||||
import Feature from '../../../../../src/ol/Feature.js';
|
import Feature from '../../../../../src/ol/Feature.js';
|
||||||
import Map from '../../../../../src/ol/Map.js';
|
import Map from '../../../../../src/ol/Map.js';
|
||||||
@@ -329,7 +328,7 @@ describe('ol.renderer.canvas.VectorTileLayer', function() {
|
|||||||
const spy = sinon.spy();
|
const spy = sinon.spy();
|
||||||
const coordinate = [0, 0];
|
const coordinate = [0, 0];
|
||||||
const frameState = {
|
const frameState = {
|
||||||
layerStates: {},
|
layerStatesArray: [{}],
|
||||||
skippedFeatureUids: {},
|
skippedFeatureUids: {},
|
||||||
viewState: {
|
viewState: {
|
||||||
projection: getProjection('EPSG:3857'),
|
projection: getProjection('EPSG:3857'),
|
||||||
@@ -337,7 +336,6 @@ describe('ol.renderer.canvas.VectorTileLayer', function() {
|
|||||||
rotation: 0
|
rotation: 0
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
frameState.layerStates[getUid(layer)] = {};
|
|
||||||
renderer.renderedTiles = [new TileClass([0, 0, -1], undefined, 1)];
|
renderer.renderedTiles = [new TileClass([0, 0, -1], undefined, 1)];
|
||||||
renderer.forEachFeatureAtCoordinate(
|
renderer.forEachFeatureAtCoordinate(
|
||||||
coordinate, frameState, 0, spy, undefined);
|
coordinate, frameState, 0, spy, undefined);
|
||||||
|
|||||||
Reference in New Issue
Block a user