Raster source listens for layer change

This commit is contained in:
Tim Schaub
2018-11-16 18:09:24 +01:00
parent 95c16cfa11
commit 358d86c33e
+35 -34
View File
@@ -169,26 +169,23 @@ class RasterSource extends ImageSource {
/** /**
* @private * @private
* @type {Array<import("../renderer/canvas/Layer.js").default>} * @type {Array<import("../layer/Layer.js").default>}
*/ */
this.renderers_ = createRenderers(options.sources); this.layers_ = createLayers(options.sources);
for (let r = 0, rr = this.renderers_.length; r < rr; ++r) { for (let i = 0, ii = this.layers_.length; i < ii; ++i) {
listen(this.renderers_[r], EventType.CHANGE, listen(this.layers_[i], EventType.CHANGE, this.changed, this);
this.changed, this);
} }
/** /**
* @private * @private
* @type {import("../TileQueue.js").default} * @type {import("../TileQueue.js").default}
*/ */
this.tileQueue_ = new TileQueue( this.tileQueue_ = new TileQueue(function() {
function() { return 1;
return 1; }, this.changed.bind(this));
},
this.changed.bind(this));
const layerStatesArray = getLayerStatesArray(this.renderers_); const layerStatesArray = getLayerStatesArray(this.layers_);
/** /**
* @type {Object<string, import("../layer/Layer.js").State>} * @type {Object<string, import("../layer/Layer.js").State>}
@@ -307,8 +304,8 @@ class RasterSource extends ImageSource {
allSourcesReady_() { allSourcesReady_() {
let ready = true; let ready = true;
let source; let source;
for (let i = 0, ii = this.renderers_.length; i < ii; ++i) { for (let i = 0, ii = this.layers_.length; i < ii; ++i) {
source = this.renderers_[i].getLayer().getSource(); source = this.layers_[i].getSource();
if (source.getState() !== SourceState.READY) { if (source.getState() !== SourceState.READY) {
ready = false; ready = false;
break; break;
@@ -356,11 +353,10 @@ class RasterSource extends ImageSource {
*/ */
processSources_() { processSources_() {
const frameState = this.requestedFrameState_; const frameState = this.requestedFrameState_;
const len = this.renderers_.length; const len = this.layers_.length;
const imageDatas = new Array(len); const imageDatas = new Array(len);
for (let i = 0; i < len; ++i) { for (let i = 0; i < len; ++i) {
const imageData = getImageData( const imageData = getImageData(this.layers_[i], frameState, frameState.layerStatesArray[i]);
this.renderers_[i], frameState, frameState.layerStatesArray[i]);
if (imageData) { if (imageData) {
imageDatas[i] = imageData; imageDatas[i] = imageData;
} else { } else {
@@ -429,13 +425,18 @@ let sharedContext = null;
/** /**
* Get image data from a renderer. * Get image data from a layer.
* @param {import("../renderer/canvas/Layer.js").default} renderer Layer renderer. * @param {import("../layer/Layer.js").default} layer Layer to render.
* @param {import("../PluggableMap.js").FrameState} frameState The frame state. * @param {import("../PluggableMap.js").FrameState} frameState The frame state.
* @param {import("../layer/Layer.js").State} layerState The layer state. * @param {import("../layer/Layer.js").State} layerState The layer state.
* @return {ImageData} The image data. * @return {ImageData} The image data.
*/ */
function getImageData(renderer, frameState, layerState) { function getImageData(layer, frameState, layerState) {
const renderer = layer.getRenderer();
if (!renderer) {
throw new Error('Unsupported layer type: ' + layer);
}
if (!renderer.prepareFrame(frameState, layerState)) { if (!renderer.prepareFrame(frameState, layerState)) {
return null; return null;
} }
@@ -466,38 +467,38 @@ function getImageData(renderer, frameState, layerState) {
/** /**
* Get a list of layer states from a list of renderers. * Get a list of layer states from a list of layers.
* @param {Array<import("../renderer/canvas/Layer.js").default>} renderers Layer renderers. * @param {Array<import("../layer/Layer.js").default>} layers Layers.
* @return {Array<import("../layer/Layer.js").State>} The layer states. * @return {Array<import("../layer/Layer.js").State>} The layer states.
*/ */
function getLayerStatesArray(renderers) { function getLayerStatesArray(layers) {
return renderers.map(function(renderer) { return layers.map(function(layer) {
return renderer.getLayer().getLayerState(); return layer.getLayerState();
}); });
} }
/** /**
* Create renderers for all sources. * Create layers for all sources.
* @param {Array<import("./Source.js").default|import("../layer/Layer.js").default>} sources The sources. * @param {Array<import("./Source.js").default|import("../layer/Layer.js").default>} sources The sources.
* @return {Array<import("../renderer/canvas/Layer.js").default>} Array of layer renderers. * @return {Array<import("../layer/Layer.js").default>} Array of layers.
*/ */
function createRenderers(sources) { function createLayers(sources) {
const len = sources.length; const len = sources.length;
const renderers = new Array(len); const layers = new Array(len);
for (let i = 0; i < len; ++i) { for (let i = 0; i < len; ++i) {
renderers[i] = createRenderer(sources[i]); layers[i] = createLayer(sources[i]);
} }
return renderers; return layers;
} }
/** /**
* Create a renderer for the provided source. * Create a layer for the provided source.
* @param {import("./Source.js").default|import("../layer/Layer.js").default} layerOrSource The layer or source. * @param {import("./Source.js").default|import("../layer/Layer.js").default} layerOrSource The layer or source.
* @return {import("../renderer/canvas/Layer.js").default} The renderer. * @return {import("../layer/Layer.js").default} The layer.
*/ */
function createRenderer(layerOrSource) { function createLayer(layerOrSource) {
// @type {import("../layer/Layer.js").default} // @type {import("../layer/Layer.js").default}
let layer; let layer;
if (layerOrSource instanceof Source) { if (layerOrSource instanceof Source) {
@@ -509,7 +510,7 @@ function createRenderer(layerOrSource) {
} else { } else {
layer = layerOrSource; layer = layerOrSource;
} }
return layer ? /** @type {import("../renderer/canvas/Layer.js").default} */ (layer.createRenderer()) : null; return layer;
} }