diff --git a/src/ol/framestate.js b/src/ol/framestate.js
index 51a7dfaacb..ccb38ccdc3 100644
--- a/src/ol/framestate.js
+++ b/src/ol/framestate.js
@@ -1,4 +1,5 @@
goog.provide('ol.FrameState');
+goog.provide('ol.PostRenderFunction');
goog.provide('ol.PreRenderFunction');
goog.require('ol.Color');
@@ -15,6 +16,7 @@ goog.require('ol.layer.LayerState');
* extent: (null|ol.Extent),
* layersArray: Array.
,
* layerStates: Object.,
+ * postRenderFunctions: Array.,
* size: ol.Size,
* time: number,
* view2DState: ol.View2DState}}
@@ -22,6 +24,12 @@ goog.require('ol.layer.LayerState');
ol.FrameState;
+/**
+ * @typedef {function(ol.Map, ?ol.FrameState): boolean}
+ */
+ol.PostRenderFunction;
+
+
/**
* @typedef {function(ol.Map, ?ol.FrameState): boolean}
*/
diff --git a/src/ol/map.js b/src/ol/map.js
index 8485f2a221..8b623c8320 100644
--- a/src/ol/map.js
+++ b/src/ol/map.js
@@ -89,14 +89,6 @@ ol.DEFAULT_RENDERER_HINTS = [
];
-/**
- * @enum {string}
- */
-ol.MapEventType = {
- POSTRENDER: 'postrender'
-};
-
-
/**
* @enum {string}
*/
@@ -245,9 +237,17 @@ ol.Map = function(mapOptions) {
*/
this.preRenderFunctions_ = [];
- this.dispatchPostRenderEvent_ = goog.bind(function() {
- this.dispatchEvent(ol.MapEventType.POSTRENDER);
- }, this);
+ /**
+ * @private
+ * @type {Array.}
+ */
+ this.postRenderFunctions_ = [];
+
+ /**
+ * @private
+ * @type {function(this: ol.Map)}
+ */
+ this.handlePostRender_ = goog.bind(this.handlePostRender, this);
this.setValues(mapOptionsInternal.values);
@@ -470,6 +470,20 @@ ol.Map.prototype.handleMapBrowserEvent = function(mapBrowserEvent) {
};
+/**
+ * @protected
+ */
+ol.Map.prototype.handlePostRender = function() {
+ goog.array.forEach(
+ this.postRenderFunctions_,
+ function(postRenderFunction) {
+ postRenderFunction(this, this.frameState_);
+ },
+ this);
+ this.postRenderFunctions_.length = 0;
+};
+
+
/**
* @protected
*/
@@ -556,6 +570,7 @@ ol.Map.prototype.renderFrame_ = function(time) {
extent: null,
layersArray: layersArray,
layerStates: layerStates,
+ postRenderFunctions: [],
size: size,
view2DState: view2DState,
time: time
@@ -596,15 +611,13 @@ ol.Map.prototype.renderFrame_ = function(time) {
if (frameState.animate) {
this.requestRenderFrame();
}
+ Array.prototype.push.apply(
+ this.postRenderFunctions_, frameState.postRenderFunctions);
}
this.frameState_ = frameState;
this.dirty_ = false;
- if (goog.DEBUG) {
- this.logger.info('postrender');
- }
-
- goog.global.setTimeout(this.dispatchPostRenderEvent_, 0);
+ goog.global.setTimeout(this.handlePostRender_, 0);
};
diff --git a/src/ol/renderer/webgl/webgltilelayerrenderer.js b/src/ol/renderer/webgl/webgltilelayerrenderer.js
index 23de60684e..fa4160dfe1 100644
--- a/src/ol/renderer/webgl/webgltilelayerrenderer.js
+++ b/src/ol/renderer/webgl/webgltilelayerrenderer.js
@@ -17,6 +17,7 @@ goog.require('goog.vec.Mat4');
goog.require('goog.vec.Vec4');
goog.require('goog.webgl');
goog.require('ol.Coordinate');
+goog.require('ol.FrameState');
goog.require('ol.Size');
goog.require('ol.TileState');
goog.require('ol.layer.TileLayer');
@@ -166,11 +167,12 @@ goog.inherits(ol.renderer.webgl.TileLayer, ol.renderer.webgl.Layer);
/**
+ * @param {ol.FrameState} frameState Frame state.
* @param {number} framebufferDimension Framebuffer dimension.
* @private
*/
ol.renderer.webgl.TileLayer.prototype.bindFramebuffer_ =
- function(framebufferDimension) {
+ function(frameState, framebufferDimension) {
var mapRenderer = this.getMapRenderer();
var gl = mapRenderer.getGL();
@@ -192,13 +194,8 @@ ol.renderer.webgl.TileLayer.prototype.bindFramebuffer_ =
}
} else {
var map = this.getMap();
- goog.events.listenOnce(
- map,
- ol.MapEventType.POSTRENDER,
+ frameState.postRenderFunctions.push(
goog.partial(function(gl, framebuffer, texture) {
- if (goog.DEBUG) {
- this.logger.info('freeing WebGL resources on postrender');
- }
if (!gl.isContextLost()) {
gl.deleteFramebuffer(framebuffer);
gl.deleteTexture(texture);
@@ -330,7 +327,7 @@ ol.renderer.webgl.TileLayer.prototype.renderFrame =
minX + framebufferExtentSize.width,
minY + framebufferExtentSize.height);
- this.bindFramebuffer_(framebufferDimension);
+ this.bindFramebuffer_(frameState, framebufferDimension);
gl.viewport(0, 0, framebufferDimension, framebufferDimension);
gl.clearColor(0, 0, 0, 0);
@@ -455,21 +452,12 @@ ol.renderer.webgl.TileLayer.prototype.renderFrame =
}, this);
if (!goog.array.isEmpty(tilesToLoad)) {
- goog.events.listenOnce(
- this.getMap(),
- ol.MapEventType.POSTRENDER,
+ frameState.postRenderFunctions.push(
goog.partial(function(mapRenderer, tilesToLoad) {
- if (goog.DEBUG) {
- this.logger.info(
- 'uploading ' + tilesToLoad.length + ' textures');
- }
goog.array.forEach(tilesToLoad, function(tile) {
mapRenderer.bindTileTexture(
tile, goog.webgl.LINEAR, goog.webgl.LINEAR);
});
- if (goog.DEBUG) {
- this.logger.info('uploaded textures');
- }
}, mapRenderer, tilesToLoad));
}