diff --git a/src/ol/map.js b/src/ol/map.js index 185379f311..b6454cbd00 100644 --- a/src/ol/map.js +++ b/src/ol/map.js @@ -133,27 +133,31 @@ ol.Map.prototype.createLayerRenderer = goog.abstractMethod; /** - * @protected - * @param {function(this: T, ol.LayerRenderer)} f Function. - * @param {T=} opt_obj The object to be used for the value of 'this' within f. - * @template T */ -ol.Map.prototype.forEachLayerRenderer = function(f, opt_obj) { - var layers = this.getLayers(); - if (goog.isDefAndNotNull(layers)) { - layers.forEach(function(layer) { - var key = goog.getUid(layer); - var layerRenderer = this.layerRenderers[key]; - f.call(opt_obj, layerRenderer); - }, this); - } +ol.Map.prototype.freeze = function() { + ++this.freezeCount_; }; /** + * @inheritDoc */ -ol.Map.prototype.freeze = function() { - ++this.freezeCount_; +ol.Map.prototype.disposeInternal = function() { + goog.object.forEach(this.layerRenderers, function(layerRenderer) { + goog.dispose(layerRenderer); + }); + goog.base(this, 'disposeInternal'); +}; + + +/** + * @param {function(this: T, *, number)} f Function. + * @param {T=} opt_obj Object. + * @template T + */ +ol.Map.prototype.forEachLayer = function(f, opt_obj) { + var layers = this.getLayers(); + layers.forEach(f, opt_obj); }; @@ -190,6 +194,19 @@ ol.Map.prototype.getExtent = function() { }; +/** + * @param {ol.Layer} layer Layer. + * @protected + * @return {ol.LayerRenderer} Layer renderer. + */ +ol.Map.prototype.getLayerRenderer = function(layer) { + var key = goog.getUid(layer); + var layerRenderer = this.layerRenderers[key]; + goog.asserts.assert(goog.isDef(layerRenderer)); + return layerRenderer; +}; + + /** * @return {ol.Array} Layers. */ @@ -278,11 +295,8 @@ ol.Map.prototype.handleLayerAdd = function(layer) { var projection = this.getProjection(); var storeProjection = layer.getStore().getProjection(); goog.asserts.assert(ol.Projection.equivalent(projection, storeProjection)); - var key = goog.getUid(layer); var layerRenderer = this.createLayerRenderer(layer); - if (!goog.isNull(layerRenderer)) { - this.layerRenderers[key] = layerRenderer; - } + this.setLayerRenderer(layer, layerRenderer); }; @@ -291,12 +305,7 @@ ol.Map.prototype.handleLayerAdd = function(layer) { * @protected */ ol.Map.prototype.handleLayerRemove = function(layer) { - var key = goog.getUid(layer); - if (key in this.layerRenderers) { - var layerRenderer = this.layerRenderers[key]; - delete this.layerRenderers[key]; - goog.dispose(layerRenderer); - } + this.removeLayerRenderer(layer); }; @@ -427,6 +436,20 @@ ol.Map.prototype.redrawInternal = function() { }; +/** + * @param {ol.Layer} layer Layer. + * @return {ol.LayerRenderer} Layer renderer. + * @protected + */ +ol.Map.prototype.removeLayerRenderer = function(layer) { + var key = goog.getUid(layer); + goog.asserts.assert(key in this.layerRenderers); + var layerRenderer = this.layerRenderers[key]; + delete this.layerRenderers[key]; + return layerRenderer; +}; + + /** * @param {goog.math.Coordinate} center Center. */ @@ -463,6 +486,18 @@ ol.Map.prototype.setExtent = function(extent) { }; +/** + * @param {ol.Layer} layer Layer. + * @param {ol.LayerRenderer} layerRenderer Layer renderer. + * @protected + */ +ol.Map.prototype.setLayerRenderer = function(layer, layerRenderer) { + var key = goog.getUid(layer); + goog.asserts.assert(!(key in this.layerRenderers)); + this.layerRenderers[key] = layerRenderer; +}; + + /** * @param {ol.Array} layers Layers. */ diff --git a/src/ol/webgl/map.js b/src/ol/webgl/map.js index 88fb905ec4..13fac630d6 100644 --- a/src/ol/webgl/map.js +++ b/src/ol/webgl/map.js @@ -87,16 +87,6 @@ ol.webgl.Map.prototype.createLayerRenderer = function(layer) { }; -/** - * @inheritDoc - */ -ol.webgl.Map.prototype.disposeInternal = function() { - this.forEachLayerRenderer(goog.dispose); - this.layerRenderers = {}; - goog.base(this, 'disposeInternal'); -}; - - /** * @return {WebGLRenderingContext} GL. */ @@ -170,8 +160,11 @@ ol.webgl.Map.prototype.handleSizeChanged = function() { */ ol.webgl.Map.prototype.handleWebGLContextLost = function(event) { event.preventDefault(); - this.forEachLayerRenderer(goog.dispose); - this.layerRenderers = {}; + this.forEachLayer(function(layer) { + var layerRenderer = this.removeLayerRenderer(layer); + goog.dispose(layerRenderer); + }, this); + goog.asserts.assert(goog.object.isEmpty(this.layerRenderers)); }; @@ -186,9 +179,7 @@ ol.webgl.Map.prototype.handleWebGLContextRestored = function() { var layers = this.getLayers(); layers.forEach(function(layer) { var layerRenderer = this.createLayerRenderer(layer); - var key = goog.getUid(layer); - goog.asserts.assert(!(key in this.layerRenderers)); - this.layerRenderers[key] = layerRenderer; + this.setLayerRenderer(layer, layerRenderer); }, this); };