Add ol.renderer.canvas.ImageLayer
This commit is contained in:
121
src/ol/renderer/canvas/canvasimagelayerrenderer.js
Normal file
121
src/ol/renderer/canvas/canvasimagelayerrenderer.js
Normal file
@@ -0,0 +1,121 @@
|
|||||||
|
goog.provide('ol.renderer.canvas.ImageLayer');
|
||||||
|
|
||||||
|
goog.require('goog.vec.Mat4');
|
||||||
|
goog.require('ol.Image');
|
||||||
|
goog.require('ol.ImageState');
|
||||||
|
goog.require('ol.ViewHint');
|
||||||
|
goog.require('ol.layer.ImageLayer');
|
||||||
|
goog.require('ol.renderer.Map');
|
||||||
|
goog.require('ol.renderer.canvas.Layer');
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @constructor
|
||||||
|
* @extends {ol.renderer.canvas.Layer}
|
||||||
|
* @param {ol.renderer.Map} mapRenderer Map renderer.
|
||||||
|
* @param {ol.layer.ImageLayer} imageLayer Single image layer.
|
||||||
|
*/
|
||||||
|
ol.renderer.canvas.ImageLayer = function(mapRenderer, imageLayer) {
|
||||||
|
|
||||||
|
goog.base(this, mapRenderer, imageLayer);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @private
|
||||||
|
* @type {?ol.Image}
|
||||||
|
*/
|
||||||
|
this.image_ = null;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @private
|
||||||
|
* @type {!goog.vec.Mat4.Number}
|
||||||
|
*/
|
||||||
|
this.transform_ = goog.vec.Mat4.createNumber();
|
||||||
|
|
||||||
|
};
|
||||||
|
goog.inherits(ol.renderer.canvas.ImageLayer, ol.renderer.canvas.Layer);
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @inheritDoc
|
||||||
|
*/
|
||||||
|
ol.renderer.canvas.ImageLayer.prototype.getImage = function() {
|
||||||
|
return goog.isNull(this.image_) ?
|
||||||
|
null : this.image_.getImageElement(this);
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @return {ol.layer.ImageLayer} Single image layer.
|
||||||
|
*/
|
||||||
|
ol.renderer.canvas.ImageLayer.prototype.getImageLayer = function() {
|
||||||
|
return /** @type {ol.layer.ImageLayer} */ (this.getLayer());
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @inheritDoc
|
||||||
|
*/
|
||||||
|
ol.renderer.canvas.ImageLayer.prototype.getTransform = function() {
|
||||||
|
return this.transform_;
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @inheritDoc
|
||||||
|
*/
|
||||||
|
ol.renderer.canvas.ImageLayer.prototype.renderFrame =
|
||||||
|
function(frameState, layerState) {
|
||||||
|
|
||||||
|
var view2DState = frameState.view2DState;
|
||||||
|
var viewCenter = view2DState.center;
|
||||||
|
var viewResolution = view2DState.resolution;
|
||||||
|
var viewRotation = view2DState.rotation;
|
||||||
|
|
||||||
|
var image;
|
||||||
|
var imageLayer = this.getImageLayer();
|
||||||
|
var imageSource = imageLayer.getImageSource();
|
||||||
|
|
||||||
|
var hints = frameState.viewHints;
|
||||||
|
|
||||||
|
if (!hints[ol.ViewHint.ANIMATING] && !hints[ol.ViewHint.PANNING]) {
|
||||||
|
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;
|
||||||
|
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_)) {
|
||||||
|
image = this.image_;
|
||||||
|
var imageExtent = image.getExtent();
|
||||||
|
var imageResolution = image.getResolution();
|
||||||
|
var transform = this.transform_;
|
||||||
|
goog.vec.Mat4.makeIdentity(transform);
|
||||||
|
goog.vec.Mat4.translate(transform,
|
||||||
|
frameState.size.width / 2, frameState.size.height / 2, 0);
|
||||||
|
goog.vec.Mat4.rotateZ(transform, viewRotation);
|
||||||
|
goog.vec.Mat4.scale(
|
||||||
|
transform,
|
||||||
|
imageResolution / viewResolution,
|
||||||
|
imageResolution / viewResolution,
|
||||||
|
1);
|
||||||
|
goog.vec.Mat4.translate(
|
||||||
|
transform,
|
||||||
|
(imageExtent.minX - viewCenter.x) / imageResolution,
|
||||||
|
(viewCenter.y - imageExtent.maxY) / imageResolution,
|
||||||
|
0);
|
||||||
|
}
|
||||||
|
};
|
||||||
@@ -7,8 +7,10 @@ goog.require('goog.dom');
|
|||||||
goog.require('goog.style');
|
goog.require('goog.style');
|
||||||
goog.require('goog.vec.Mat4');
|
goog.require('goog.vec.Mat4');
|
||||||
goog.require('ol.Size');
|
goog.require('ol.Size');
|
||||||
|
goog.require('ol.layer.ImageLayer');
|
||||||
goog.require('ol.layer.TileLayer');
|
goog.require('ol.layer.TileLayer');
|
||||||
goog.require('ol.renderer.Map');
|
goog.require('ol.renderer.Map');
|
||||||
|
goog.require('ol.renderer.canvas.ImageLayer');
|
||||||
goog.require('ol.renderer.canvas.TileLayer');
|
goog.require('ol.renderer.canvas.TileLayer');
|
||||||
|
|
||||||
|
|
||||||
@@ -59,7 +61,9 @@ goog.inherits(ol.renderer.canvas.Map, ol.renderer.Map);
|
|||||||
* @inheritDoc
|
* @inheritDoc
|
||||||
*/
|
*/
|
||||||
ol.renderer.canvas.Map.prototype.createLayerRenderer = function(layer) {
|
ol.renderer.canvas.Map.prototype.createLayerRenderer = function(layer) {
|
||||||
if (layer instanceof ol.layer.TileLayer) {
|
if (layer instanceof ol.layer.ImageLayer) {
|
||||||
|
return new ol.renderer.canvas.ImageLayer(this, layer);
|
||||||
|
} else if (layer instanceof ol.layer.TileLayer) {
|
||||||
return new ol.renderer.canvas.TileLayer(this, layer);
|
return new ol.renderer.canvas.TileLayer(this, layer);
|
||||||
} else {
|
} else {
|
||||||
goog.asserts.assert(false);
|
goog.asserts.assert(false);
|
||||||
|
|||||||
Reference in New Issue
Block a user