Merge pull request #3107 from elemoine/imagestate
Also listen on loading images
This commit is contained in:
@@ -1,11 +1,8 @@
|
||||
goog.provide('ol.renderer.canvas.ImageLayer');
|
||||
|
||||
goog.require('goog.asserts');
|
||||
goog.require('goog.events');
|
||||
goog.require('goog.events.EventType');
|
||||
goog.require('goog.vec.Mat4');
|
||||
goog.require('ol.ImageBase');
|
||||
goog.require('ol.ImageState');
|
||||
goog.require('ol.ViewHint');
|
||||
goog.require('ol.extent');
|
||||
goog.require('ol.layer.Image');
|
||||
@@ -117,12 +114,8 @@ ol.renderer.canvas.ImageLayer.prototype.prepareFrame =
|
||||
image = imageSource.getImage(
|
||||
renderedExtent, viewResolution, pixelRatio, projection);
|
||||
if (!goog.isNull(image)) {
|
||||
var imageState = image.getState();
|
||||
if (imageState == ol.ImageState.IDLE) {
|
||||
goog.events.listenOnce(image, goog.events.EventType.CHANGE,
|
||||
this.handleImageChange, false, this);
|
||||
image.load();
|
||||
} else if (imageState == ol.ImageState.LOADED) {
|
||||
var loaded = this.loadImage(image);
|
||||
if (loaded) {
|
||||
this.image_ = image;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -149,7 +149,7 @@ ol.renderer.canvas.VectorLayer.prototype.forEachFeatureAtPixel =
|
||||
* @param {goog.events.Event} event Image style change event.
|
||||
* @private
|
||||
*/
|
||||
ol.renderer.canvas.VectorLayer.prototype.handleImageChange_ =
|
||||
ol.renderer.canvas.VectorLayer.prototype.handleStyleImageChange_ =
|
||||
function(event) {
|
||||
this.renderIfReadyAndVisible();
|
||||
};
|
||||
@@ -274,7 +274,7 @@ ol.renderer.canvas.VectorLayer.prototype.renderFeature =
|
||||
loading = ol.renderer.vector.renderFeature(
|
||||
replayGroup, feature, styles[i],
|
||||
ol.renderer.vector.getSquaredTolerance(resolution, pixelRatio),
|
||||
this.handleImageChange_, this) || loading;
|
||||
this.handleStyleImageChange_, this) || loading;
|
||||
}
|
||||
return loading;
|
||||
};
|
||||
|
||||
@@ -3,11 +3,8 @@ goog.provide('ol.renderer.dom.ImageLayer');
|
||||
goog.require('goog.asserts');
|
||||
goog.require('goog.dom');
|
||||
goog.require('goog.dom.TagName');
|
||||
goog.require('goog.events');
|
||||
goog.require('goog.events.EventType');
|
||||
goog.require('goog.vec.Mat4');
|
||||
goog.require('ol.ImageBase');
|
||||
goog.require('ol.ImageState');
|
||||
goog.require('ol.ViewHint');
|
||||
goog.require('ol.dom');
|
||||
goog.require('ol.extent');
|
||||
@@ -113,12 +110,8 @@ ol.renderer.dom.ImageLayer.prototype.prepareFrame =
|
||||
var image_ = imageSource.getImage(renderedExtent, viewResolution,
|
||||
frameState.pixelRatio, projection);
|
||||
if (!goog.isNull(image_)) {
|
||||
var imageState = image_.getState();
|
||||
if (imageState == ol.ImageState.IDLE) {
|
||||
goog.events.listenOnce(image_, goog.events.EventType.CHANGE,
|
||||
this.handleImageChange, false, this);
|
||||
image_.load();
|
||||
} else if (imageState == ol.ImageState.LOADED) {
|
||||
var loaded = this.loadImage(image_);
|
||||
if (loaded) {
|
||||
image = image_;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -209,7 +209,7 @@ ol.renderer.dom.VectorLayer.prototype.forEachFeatureAtPixel =
|
||||
* @param {goog.events.Event} event Image style change event.
|
||||
* @private
|
||||
*/
|
||||
ol.renderer.dom.VectorLayer.prototype.handleImageChange_ =
|
||||
ol.renderer.dom.VectorLayer.prototype.handleStyleImageChange_ =
|
||||
function(event) {
|
||||
this.renderIfReadyAndVisible();
|
||||
};
|
||||
@@ -334,7 +334,7 @@ ol.renderer.dom.VectorLayer.prototype.renderFeature =
|
||||
loading = ol.renderer.vector.renderFeature(
|
||||
replayGroup, feature, styles[i],
|
||||
ol.renderer.vector.getSquaredTolerance(resolution, pixelRatio),
|
||||
this.handleImageChange_, this) || loading;
|
||||
this.handleStyleImageChange_, this) || loading;
|
||||
}
|
||||
return loading;
|
||||
};
|
||||
|
||||
@@ -2,6 +2,8 @@ goog.provide('ol.renderer.Layer');
|
||||
|
||||
goog.require('goog.Disposable');
|
||||
goog.require('goog.asserts');
|
||||
goog.require('goog.events');
|
||||
goog.require('goog.events.EventType');
|
||||
goog.require('ol.ImageState');
|
||||
goog.require('ol.TileRange');
|
||||
goog.require('ol.TileState');
|
||||
@@ -84,9 +86,9 @@ ol.renderer.Layer.prototype.getMapRenderer = function() {
|
||||
/**
|
||||
* Handle changes in image state.
|
||||
* @param {goog.events.Event} event Image change event.
|
||||
* @protected
|
||||
* @private
|
||||
*/
|
||||
ol.renderer.Layer.prototype.handleImageChange = function(event) {
|
||||
ol.renderer.Layer.prototype.handleImageChange_ = function(event) {
|
||||
var image = /** @type {ol.Image} */ (event.target);
|
||||
if (image.getState() === ol.ImageState.LOADED) {
|
||||
this.renderIfReadyAndVisible();
|
||||
@@ -94,6 +96,34 @@ ol.renderer.Layer.prototype.handleImageChange = function(event) {
|
||||
};
|
||||
|
||||
|
||||
/**
|
||||
* Load the image if not already loaded, and register the image change
|
||||
* listener if needed.
|
||||
* @param {ol.ImageBase} image Image.
|
||||
* @return {boolean} `true` if the image is already loaded, `false`
|
||||
* otherwise.
|
||||
* @protected
|
||||
*/
|
||||
ol.renderer.Layer.prototype.loadImage = function(image) {
|
||||
var imageState = image.getState();
|
||||
if (imageState != ol.ImageState.LOADED &&
|
||||
imageState != ol.ImageState.ERROR) {
|
||||
// the image is either "idle" or "loading", register the change
|
||||
// listener (a noop if the listener was already registered)
|
||||
goog.asserts.assert(imageState == ol.ImageState.IDLE ||
|
||||
imageState == ol.ImageState.LOADING);
|
||||
goog.events.listenOnce(image, goog.events.EventType.CHANGE,
|
||||
this.handleImageChange_, false, this);
|
||||
}
|
||||
if (imageState == ol.ImageState.IDLE) {
|
||||
image.load();
|
||||
imageState = image.getState();
|
||||
goog.asserts.assert(imageState == ol.ImageState.LOADING);
|
||||
}
|
||||
return imageState == ol.ImageState.LOADED;
|
||||
};
|
||||
|
||||
|
||||
/**
|
||||
* @protected
|
||||
*/
|
||||
|
||||
@@ -1,14 +1,11 @@
|
||||
goog.provide('ol.renderer.webgl.ImageLayer');
|
||||
|
||||
goog.require('goog.asserts');
|
||||
goog.require('goog.events');
|
||||
goog.require('goog.events.EventType');
|
||||
goog.require('goog.vec.Mat4');
|
||||
goog.require('goog.webgl');
|
||||
goog.require('ol.Coordinate');
|
||||
goog.require('ol.Extent');
|
||||
goog.require('ol.ImageBase');
|
||||
goog.require('ol.ImageState');
|
||||
goog.require('ol.ViewHint');
|
||||
goog.require('ol.extent');
|
||||
goog.require('ol.layer.Image');
|
||||
@@ -133,12 +130,8 @@ ol.renderer.webgl.ImageLayer.prototype.prepareFrame =
|
||||
var image_ = imageSource.getImage(renderedExtent, viewResolution,
|
||||
frameState.pixelRatio, projection);
|
||||
if (!goog.isNull(image_)) {
|
||||
var imageState = image_.getState();
|
||||
if (imageState == ol.ImageState.IDLE) {
|
||||
goog.events.listenOnce(image_, goog.events.EventType.CHANGE,
|
||||
this.handleImageChange, false, this);
|
||||
image_.load();
|
||||
} else if (imageState == ol.ImageState.LOADED) {
|
||||
var loaded = this.loadImage(image_);
|
||||
if (loaded) {
|
||||
image = image_;
|
||||
texture = this.createTexture_(image_);
|
||||
if (!goog.isNull(this.texture)) {
|
||||
|
||||
@@ -108,7 +108,7 @@ ol.renderer.webgl.VectorLayer.prototype.forEachFeatureAtPixel =
|
||||
* @param {goog.events.Event} event Image style change event.
|
||||
* @private
|
||||
*/
|
||||
ol.renderer.webgl.VectorLayer.prototype.handleImageChange_ =
|
||||
ol.renderer.webgl.VectorLayer.prototype.handleStyleImageChange_ =
|
||||
function(event) {
|
||||
this.renderIfReadyAndVisible();
|
||||
};
|
||||
@@ -233,7 +233,7 @@ ol.renderer.webgl.VectorLayer.prototype.renderFeature =
|
||||
loading = ol.renderer.vector.renderFeature(
|
||||
replayGroup, feature, styles[i],
|
||||
ol.renderer.vector.getSquaredTolerance(resolution, pixelRatio),
|
||||
this.handleImageChange_, this) || loading;
|
||||
this.handleStyleImageChange_, this) || loading;
|
||||
}
|
||||
return loading;
|
||||
};
|
||||
|
||||
Reference in New Issue
Block a user