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
+60 -25
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) { ol.Map.prototype.freeze = function() {
var layers = this.getLayers(); ++this.freezeCount_;
if (goog.isDefAndNotNull(layers)) {
layers.forEach(function(layer) {
var key = goog.getUid(layer);
var layerRenderer = this.layerRenderers[key];
f.call(opt_obj, layerRenderer);
}, this);
}
}; };
/** /**
* @inheritDoc
*/ */
ol.Map.prototype.freeze = function() { ol.Map.prototype.disposeInternal = function() {
++this.freezeCount_; 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. * @return {ol.Array} Layers.
*/ */
@@ -278,11 +295,8 @@ ol.Map.prototype.handleLayerAdd = function(layer) {
var projection = this.getProjection(); var projection = this.getProjection();
var storeProjection = layer.getStore().getProjection(); var storeProjection = layer.getStore().getProjection();
goog.asserts.assert(ol.Projection.equivalent(projection, storeProjection)); goog.asserts.assert(ol.Projection.equivalent(projection, storeProjection));
var key = goog.getUid(layer);
var layerRenderer = this.createLayerRenderer(layer); var layerRenderer = this.createLayerRenderer(layer);
if (!goog.isNull(layerRenderer)) { this.setLayerRenderer(layer, layerRenderer);
this.layerRenderers[key] = layerRenderer;
}
}; };
@@ -291,12 +305,7 @@ ol.Map.prototype.handleLayerAdd = function(layer) {
* @protected * @protected
*/ */
ol.Map.prototype.handleLayerRemove = function(layer) { ol.Map.prototype.handleLayerRemove = function(layer) {
var key = goog.getUid(layer); this.removeLayerRenderer(layer);
if (key in this.layerRenderers) {
var layerRenderer = this.layerRenderers[key];
delete this.layerRenderers[key];
goog.dispose(layerRenderer);
}
}; };
@@ -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. * @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. * @param {ol.Array} layers Layers.
*/ */
+6 -15
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. * @return {WebGLRenderingContext} GL.
*/ */
@@ -170,8 +160,11 @@ ol.webgl.Map.prototype.handleSizeChanged = function() {
*/ */
ol.webgl.Map.prototype.handleWebGLContextLost = function(event) { ol.webgl.Map.prototype.handleWebGLContextLost = function(event) {
event.preventDefault(); event.preventDefault();
this.forEachLayerRenderer(goog.dispose); this.forEachLayer(function(layer) {
this.layerRenderers = {}; 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(); var layers = this.getLayers();
layers.forEach(function(layer) { layers.forEach(function(layer) {
var layerRenderer = this.createLayerRenderer(layer); var layerRenderer = this.createLayerRenderer(layer);
var key = goog.getUid(layer); this.setLayerRenderer(layer, layerRenderer);
goog.asserts.assert(!(key in this.layerRenderers));
this.layerRenderers[key] = layerRenderer;
}, this); }, this);
}; };