diff --git a/src/ol/renderer/canvas/canvasimagelayerrenderer.js b/src/ol/renderer/canvas/canvasimagelayerrenderer.js index 1b7857b9e2..33558a9c51 100644 --- a/src/ol/renderer/canvas/canvasimagelayerrenderer.js +++ b/src/ol/renderer/canvas/canvasimagelayerrenderer.js @@ -82,20 +82,13 @@ ol.renderer.canvas.ImageLayer.prototype.renderFrame = image = imageSource.getImage( frameState.extent, viewResolution); var imageState = image.getState(); - var animate = false; - if (imageState == ol.ImageState.ERROR) { - // pass - } else if (imageState == ol.ImageState.IDLE) { - animate = true; + if (imageState == ol.ImageState.IDLE) { + goog.events.listenOnce(image, goog.events.EventType.CHANGE, + this.handleImageChange, false, this); image.load(); - } else if (imageState == ol.ImageState.LOADING) { - animate = true; } else if (imageState == ol.ImageState.LOADED) { this.image_ = image; } - if (animate) { - frameState.animate = true; - } } if (!goog.isNull(this.image_)) { diff --git a/src/ol/renderer/dom/domimagelayerrenderer.js b/src/ol/renderer/dom/domimagelayerrenderer.js index eda01022e1..1e32a94775 100644 --- a/src/ol/renderer/dom/domimagelayerrenderer.js +++ b/src/ol/renderer/dom/domimagelayerrenderer.js @@ -69,20 +69,13 @@ ol.renderer.dom.ImageLayer.prototype.renderFrame = if (!hints[ol.ViewHint.ANIMATING] && !hints[ol.ViewHint.PANNING]) { var image_ = imageSource.getImage(frameState.extent, viewResolution); var imageState = image_.getState(); - var animate = false; - if (imageState == ol.ImageState.ERROR) { - // pass - } else if (imageState == ol.ImageState.IDLE) { - animate = true; + if (imageState == ol.ImageState.IDLE) { + goog.events.listenOnce(image_, goog.events.EventType.CHANGE, + this.handleImageChange, false, this); image_.load(); - } else if (imageState == ol.ImageState.LOADING) { - animate = true; } else if (imageState == ol.ImageState.LOADED) { image = image_; } - if (animate) { - frameState.animate = true; - } } if (!goog.isNull(image)) { diff --git a/src/ol/renderer/layerrenderer.js b/src/ol/renderer/layerrenderer.js index fab64889fc..bfe98600c4 100644 --- a/src/ol/renderer/layerrenderer.js +++ b/src/ol/renderer/layerrenderer.js @@ -3,6 +3,8 @@ goog.provide('ol.renderer.Layer'); goog.require('goog.events'); goog.require('goog.events.EventType'); goog.require('ol.FrameState'); +goog.require('ol.Image'); +goog.require('ol.ImageState'); goog.require('ol.Object'); goog.require('ol.Tile'); goog.require('ol.TileCoord'); @@ -119,6 +121,19 @@ ol.renderer.Layer.prototype.handleLayerContrastChange = goog.nullFunction; ol.renderer.Layer.prototype.handleLayerHueChange = goog.nullFunction; +/** + * Handle changes in image state. + * @param {goog.events.Event} event Image change event. + * @protected + */ +ol.renderer.Layer.prototype.handleImageChange = function(event) { + var image = /** @type {ol.Image} */ (event.target); + if (image.getState() === ol.ImageState.LOADED) { + this.getMap().requestRenderFrame(); + } +}; + + /** * @protected */ diff --git a/src/ol/renderer/webgl/webglimagelayerrenderer.js b/src/ol/renderer/webgl/webglimagelayerrenderer.js index c259b02b99..f7c7e3dc9c 100644 --- a/src/ol/renderer/webgl/webglimagelayerrenderer.js +++ b/src/ol/renderer/webgl/webglimagelayerrenderer.js @@ -160,14 +160,10 @@ ol.renderer.webgl.ImageLayer.prototype.renderFrame = if (!hints[ol.ViewHint.ANIMATING] && !hints[ol.ViewHint.PANNING]) { var image_ = imageSource.getImage(frameState.extent, viewResolution); var imageState = image_.getState(); - var animate = false; - if (imageState == ol.ImageState.ERROR) { - // pass - } else if (imageState == ol.ImageState.IDLE) { - animate = true; + if (imageState == ol.ImageState.IDLE) { + goog.events.listenOnce(image_, goog.events.EventType.CHANGE, + this.handleImageChange, false, this); image_.load(); - } else if (imageState == ol.ImageState.LOADING) { - animate = true; } else if (imageState == ol.ImageState.LOADED) { image = image_; texture = this.createTexture_(image_); @@ -180,9 +176,6 @@ ol.renderer.webgl.ImageLayer.prototype.renderFrame = }, gl, this.texture_)); } } - if (animate) { - frameState.animate = true; - } } if (!goog.isNull(image)) {