Support vector layers instead of renderers for ol/source/Raster

This commit is contained in:
ahocevar
2018-05-28 10:23:47 +02:00
parent a59dd8ea65
commit 137c875df7
5 changed files with 46 additions and 71 deletions

View File

@@ -10,13 +10,11 @@ import {equals} from '../../array.js';
import {getHeight, getIntersection, getWidth, isEmpty} from '../../extent.js';
import VectorRenderType from '../../layer/VectorRenderType.js';
import {assign} from '../../obj.js';
import {layerRendererConstructors} from './Map.js';
import IntermediateCanvasRenderer from '../canvas/IntermediateCanvas.js';
import {create as createTransform, compose as composeTransform} from '../../transform.js';
/**
* Renderer for {@link module:ol/layer/Image} layers. When a vector renderer is
* set with the {@link module:ol/renderer/canvas/ImageLayer#setVectorRenderer}
* method, it can also render vector layers to an image.
* @constructor
* @extends {module:ol/renderer/canvas/IntermediateCanvas}
* @param {module:ol/layer/Image|module:ol/layer/Vector} imageLayer Image or vector layer.
@@ -49,6 +47,16 @@ const CanvasImageLayerRenderer = function(imageLayer) {
*/
this.vectorRenderer_ = null;
if (imageLayer.getType() === LayerType.VECTOR && imageLayer.getRenderMode() === VectorRenderType.IMAGE) {
for (let i = 0, ii = layerRendererConstructors.length; i < ii; ++i) {
const ctor = layerRendererConstructors[i];
if (ctor !== CanvasImageLayerRenderer && ctor['handles'](imageLayer)) {
this.vectorRenderer_ = new ctor(imageLayer);
break;
}
}
}
};
inherits(CanvasImageLayerRenderer, IntermediateCanvasRenderer);
@@ -73,18 +81,7 @@ CanvasImageLayerRenderer['handles'] = function(layer) {
* @return {module:ol/renderer/canvas/ImageLayer} The layer renderer.
*/
CanvasImageLayerRenderer['create'] = function(mapRenderer, layer) {
const renderer = new CanvasImageLayerRenderer(/** @type {module:ol/layer/Image} */ (layer));
if (layer.getType() === LayerType.VECTOR) {
const candidates = mapRenderer.getLayerRendererConstructors();
for (let i = 0, ii = candidates.length; i < ii; ++i) {
const candidate = /** @type {Object.<string, Function>} */ (candidates[i]);
if (candidate !== CanvasImageLayerRenderer && candidate['handles'](layer)) {
renderer.setVectorRenderer(candidate['create'](mapRenderer, layer));
break;
}
}
}
return renderer;
return new CanvasImageLayerRenderer(/** @type {module:ol/layer/Image} */ (layer));
};
@@ -219,16 +216,4 @@ CanvasImageLayerRenderer.prototype.forEachFeatureAtCoordinate = function(coordin
};
/**
* Sets a vector renderer on this renderer. Call this methond to set up the
* renderer for rendering vector layers to an image.
* @param {module:ol/renderer/canvas/VectorLayer} renderer Vector renderer.
* @api
*/
CanvasImageLayerRenderer.prototype.setVectorRenderer = function(renderer) {
if (this.vectorRenderer_) {
this.vectorRenderer_.dispose();
}
this.vectorRenderer_ = renderer;
};
export default CanvasImageLayerRenderer;

View File

@@ -3,7 +3,7 @@
*/
import {create as createTransform, apply as applyTransform, compose as composeTransform} from '../../transform.js';
import {inherits} from '../../index.js';
import {stableSort} from '../../array.js';
import {includes, stableSort} from '../../array.js';
import {CLASS_UNSELECTABLE} from '../../css.js';
import {createCanvasContext2D} from '../../dom.js';
import {visibleAtResolution} from '../../layer/Layer.js';
@@ -14,6 +14,13 @@ import CanvasImmediateRenderer from '../../render/canvas/Immediate.js';
import MapRenderer, {sortByZIndex} from '../Map.js';
import SourceState from '../../source/State.js';
/**
* @type {Array.<module:ol/renderer/Layer>}
*/
export const layerRendererConstructors = [];
/**
* @constructor
* @extends {module:ol/renderer/Map}
@@ -202,4 +209,19 @@ CanvasMapRenderer.prototype.forEachLayerAtPixel = function(pixel, frameState, ca
}
return undefined;
};
/**
* @inheritDoc
*/
CanvasMapRenderer.prototype.registerLayerRenderers = function(constructors) {
MapRenderer.prototype.registerLayerRenderers.call(this, constructors);
for (let i = 0, ii = constructors.length; i < ii; ++i) {
const ctor = constructors[i];
if (!includes(layerRendererConstructors, ctor)) {
layerRendererConstructors.push(ctor);
}
}
};
export default CanvasMapRenderer;