Refresh layer renderer management

This commit is contained in:
Tom Payne
2012-07-15 12:31:33 +02:00
parent 446fe16da1
commit 26aa704a4d
2 changed files with 66 additions and 40 deletions

View File

@@ -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.
*/

View File

@@ -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);
};