From 40c49a9ce5c9b7216351acd3f7494a5dbec6a482 Mon Sep 17 00:00:00 2001 From: Frederic Junod Date: Wed, 22 May 2019 14:09:25 +0200 Subject: [PATCH 1/3] Remove `layerState` param from `prepareFrame` and `renderFrame` function --- rendering/cases/layer-group/expected.png | Bin 0 -> 50512 bytes rendering/cases/layer-group/main.js | 30 ++++++++++++++++++ src/ol/PluggableMap.js | 6 ++-- src/ol/layer/Base.js | 3 ++ src/ol/layer/Layer.js | 6 ++-- src/ol/renderer/Composite.js | 1 + src/ol/renderer/Layer.js | 6 ++-- src/ol/renderer/canvas/ImageLayer.js | 6 ++-- src/ol/renderer/canvas/TileLayer.js | 5 +-- src/ol/renderer/canvas/VectorImageLayer.js | 6 ++-- src/ol/renderer/canvas/VectorLayer.js | 5 +-- src/ol/renderer/canvas/VectorTileLayer.js | 9 +++--- src/ol/renderer/webgl/PointsLayer.js | 3 +- src/ol/source/Raster.js | 11 ++++--- .../ol/renderer/canvas/vectorimage.test.js | 4 ++- .../ol/renderer/canvas/vectorlayer.test.js | 18 ++++++----- .../renderer/canvas/vectortilelayer.test.js | 8 +++-- 17 files changed, 87 insertions(+), 40 deletions(-) create mode 100644 rendering/cases/layer-group/expected.png create mode 100644 rendering/cases/layer-group/main.js diff --git a/rendering/cases/layer-group/expected.png b/rendering/cases/layer-group/expected.png new file mode 100644 index 0000000000000000000000000000000000000000..ab2a151bc4530d29f7bb706bbdc89e6b8ce647a0 GIT binary patch literal 50512 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 literal 0 HcmV?d00001 diff --git a/rendering/cases/layer-group/main.js b/rendering/cases/layer-group/main.js new file mode 100644 index 0000000000..4ca07a5c66 --- /dev/null +++ b/rendering/cases/layer-group/main.js @@ -0,0 +1,30 @@ +import Map from '../../../src/ol/Map.js'; +import View from '../../../src/ol/View.js'; +import {Group as LayerGroup, Tile as TileLayer} from '../../../src/ol/layer.js'; +import XYZ from '../../../src/ol/source/XYZ'; + +new Map({ + target: 'map', + view: new View({ + center: [0, 0], + zoom: 3 + }), + layers: new LayerGroup({ + opacity: 0.75, + layers: [ + new TileLayer({ + opacity: 0.25, + source: new XYZ({ + url: '/data/tiles/satellite/{z}/{x}/{y}.jpg' + }) + }), + new TileLayer({ + source: new XYZ({ + url: '/data/tiles/stamen-labels/{z}/{x}/{y}.png' + }) + }) + ] + }) +}); + +render(); diff --git a/src/ol/PluggableMap.js b/src/ol/PluggableMap.js index 9a3db53e73..d4c57c4d4a 100644 --- a/src/ol/PluggableMap.js +++ b/src/ol/PluggableMap.js @@ -43,6 +43,7 @@ import {create as createTransform, apply as applyTransform} from './transform.js * @property {import("./coordinate.js").Coordinate} focus * @property {number} index * @property {Array} layerStatesArray + * @property {number} layerIndex * @property {import("./transform.js").Transform} pixelToCoordinateTransform * @property {Array} postRenderFunctions * @property {import("./size.js").Size} size @@ -1231,13 +1232,14 @@ class PluggableMap extends BaseObject { if (size !== undefined && hasArea(size) && view && view.isDef()) { const viewHints = view.getHints(this.frameState_ ? this.frameState_.viewHints : undefined); viewState = view.getState(this.pixelRatio_); - frameState = /** @type {FrameState} */ ({ + frameState = { animate: false, coordinateToPixelTransform: this.coordinateToPixelTransform_, declutterItems: previousFrameState ? previousFrameState.declutterItems : [], extent: extent, focus: this.focus_ ? this.focus_ : viewState.center, index: this.frameIndex_++, + layerIndex: 0, layerStatesArray: this.getLayerGroup().getLayerStatesArray(), pixelRatio: this.pixelRatio_, pixelToCoordinateTransform: this.pixelToCoordinateTransform_, @@ -1250,7 +1252,7 @@ class PluggableMap extends BaseObject { viewState: viewState, viewHints: viewHints, wantedTiles: {} - }); + }; } if (frameState) { diff --git a/src/ol/layer/Base.js b/src/ol/layer/Base.js index 3754ba1049..7e5bbe5fdd 100644 --- a/src/ol/layer/Base.js +++ b/src/ol/layer/Base.js @@ -83,6 +83,9 @@ class BaseLayer extends BaseObject { } /** + * This method is not meant to be called by layers or layer renderers because the state + * is iccorect if the layer is included in a layer group. + * * @param {boolean=} opt_managed Layer is managed. * @return {import("./Layer.js").State} Layer state. */ diff --git a/src/ol/layer/Layer.js b/src/ol/layer/Layer.js index 424429cc26..a1dfe0aad5 100644 --- a/src/ol/layer/Layer.js +++ b/src/ol/layer/Layer.js @@ -195,9 +195,9 @@ class Layer extends BaseLayer { */ render(frameState, target) { const layerRenderer = this.getRenderer(); - const layerState = this.getLayerState(); - if (layerRenderer.prepareFrame(frameState, layerState)) { - return layerRenderer.renderFrame(frameState, layerState, target); + + if (layerRenderer.prepareFrame(frameState)) { + return layerRenderer.renderFrame(frameState, target); } } diff --git a/src/ol/renderer/Composite.js b/src/ol/renderer/Composite.js index 3934b5b14d..6d707a9706 100644 --- a/src/ol/renderer/Composite.js +++ b/src/ol/renderer/Composite.js @@ -90,6 +90,7 @@ class CompositeMapRenderer extends MapRenderer { let previousElement = null; for (let i = 0, ii = layerStatesArray.length; i < ii; ++i) { const layerState = layerStatesArray[i]; + frameState.layerIndex = i; if (!visibleAtResolution(layerState, viewResolution) || (layerState.sourceState != SourceState.READY && layerState.sourceState != SourceState.UNDEFINED)) { continue; diff --git a/src/ol/renderer/Layer.js b/src/ol/renderer/Layer.js index 31c052354b..cde8519918 100644 --- a/src/ol/renderer/Layer.js +++ b/src/ol/renderer/Layer.js @@ -29,10 +29,9 @@ class LayerRenderer extends Observable { * Determine whether render should be called. * @abstract * @param {import("../PluggableMap.js").FrameState} frameState Frame state. - * @param {import("../layer/Layer.js").State} layerState Layer state. * @return {boolean} Layer is ready to be rendered. */ - prepareFrame(frameState, layerState) { + prepareFrame(frameState) { return abstract(); } @@ -40,11 +39,10 @@ class LayerRenderer extends Observable { * Render the layer. * @abstract * @param {import("../PluggableMap.js").FrameState} frameState Frame state. - * @param {import("../layer/Layer.js").State} layerState Layer state. * @param {HTMLElement} target Target that may be used to render content to. * @return {HTMLElement} The rendered element. */ - renderFrame(frameState, layerState, target) { + renderFrame(frameState, target) { return abstract(); } diff --git a/src/ol/renderer/canvas/ImageLayer.js b/src/ol/renderer/canvas/ImageLayer.js index bd40b16878..5d4c7b6cda 100644 --- a/src/ol/renderer/canvas/ImageLayer.js +++ b/src/ol/renderer/canvas/ImageLayer.js @@ -38,7 +38,8 @@ class CanvasImageLayerRenderer extends CanvasLayerRenderer { /** * @inheritDoc */ - prepareFrame(frameState, layerState) { + prepareFrame(frameState) { + const layerState = frameState.layerStatesArray[frameState.layerIndex]; const pixelRatio = frameState.pixelRatio; const viewState = frameState.viewState; const viewResolution = viewState.resolution; @@ -72,11 +73,12 @@ class CanvasImageLayerRenderer extends CanvasLayerRenderer { /** * @inheritDoc */ - renderFrame(frameState, layerState, target) { + renderFrame(frameState, target) { const image = this.image_; const imageExtent = image.getExtent(); const imageResolution = image.getResolution(); const imagePixelRatio = image.getPixelRatio(); + const layerState = frameState.layerStatesArray[frameState.layerIndex]; const pixelRatio = frameState.pixelRatio; const viewState = frameState.viewState; const viewCenter = viewState.center; diff --git a/src/ol/renderer/canvas/TileLayer.js b/src/ol/renderer/canvas/TileLayer.js index dd65150e9a..f005c466e2 100644 --- a/src/ol/renderer/canvas/TileLayer.js +++ b/src/ol/renderer/canvas/TileLayer.js @@ -125,7 +125,7 @@ class CanvasTileLayerRenderer extends CanvasLayerRenderer { /** * @inheritDoc */ - prepareFrame(frameState, layerState) { + prepareFrame(frameState) { return true; } @@ -137,7 +137,8 @@ class CanvasTileLayerRenderer extends CanvasLayerRenderer { * @inheritDoc * @returns {HTMLElement} The rendered element. */ - renderFrame(frameState, layerState, target) { + renderFrame(frameState, target) { + const layerState = frameState.layerStatesArray[frameState.layerIndex]; const viewState = frameState.viewState; const projection = viewState.projection; const viewResolution = viewState.resolution; diff --git a/src/ol/renderer/canvas/VectorImageLayer.js b/src/ol/renderer/canvas/VectorImageLayer.js index c4b6d98c27..6340b60abd 100644 --- a/src/ol/renderer/canvas/VectorImageLayer.js +++ b/src/ol/renderer/canvas/VectorImageLayer.js @@ -63,7 +63,7 @@ class CanvasVectorImageLayerRenderer extends CanvasImageLayerRenderer { /** * @inheritDoc */ - prepareFrame(frameState, layerState) { + prepareFrame(frameState) { const pixelRatio = frameState.pixelRatio; const viewState = frameState.viewState; const viewResolution = viewState.resolution; @@ -92,10 +92,10 @@ class CanvasVectorImageLayerRenderer extends CanvasImageLayerRenderer { })); const newSkippedFeatures = Object.keys(imageFrameState.skippedFeatureUids).sort(); const image = new ImageCanvas(renderedExtent, viewResolution, pixelRatio, context.canvas, function(callback) { - if (vectorRenderer.prepareFrame(imageFrameState, layerState) && + if (vectorRenderer.prepareFrame(imageFrameState) && (vectorRenderer.replayGroupChanged || !equals(skippedFeatures, newSkippedFeatures))) { - vectorRenderer.renderFrame(imageFrameState, layerState, null); + vectorRenderer.renderFrame(imageFrameState, null); renderDeclutterItems(imageFrameState, null); skippedFeatures = newSkippedFeatures; callback(); diff --git a/src/ol/renderer/canvas/VectorLayer.js b/src/ol/renderer/canvas/VectorLayer.js index 9246bf3c6c..538aa612b9 100644 --- a/src/ol/renderer/canvas/VectorLayer.js +++ b/src/ol/renderer/canvas/VectorLayer.js @@ -80,9 +80,10 @@ class CanvasVectorLayerRenderer extends CanvasLayerRenderer { /** * @inheritDoc */ - renderFrame(frameState, layerState, target) { + renderFrame(frameState, target) { const pixelRatio = frameState.pixelRatio; + const layerState = frameState.layerStatesArray[frameState.layerIndex]; // set forward and inverse pixel transforms makeScale(this.pixelTransform_, 1 / pixelRatio, 1 / pixelRatio); @@ -232,7 +233,7 @@ class CanvasVectorLayerRenderer extends CanvasLayerRenderer { /** * @inheritDoc */ - prepareFrame(frameState, layerState) { + prepareFrame(frameState) { const vectorLayer = /** @type {import("../../layer/Vector.js").default} */ (this.getLayer()); const vectorSource = vectorLayer.getSource(); diff --git a/src/ol/renderer/canvas/VectorTileLayer.js b/src/ol/renderer/canvas/VectorTileLayer.js index e59bcbafa5..29e58b7f97 100644 --- a/src/ol/renderer/canvas/VectorTileLayer.js +++ b/src/ol/renderer/canvas/VectorTileLayer.js @@ -218,13 +218,13 @@ class CanvasVectorTileLayerRenderer extends CanvasTileLayerRenderer { /** * @inheritDoc */ - prepareFrame(frameState, layerState) { + prepareFrame(frameState) { const layerRevision = this.getLayer().getRevision(); if (this.renderedLayerRevision_ != layerRevision) { this.renderedTiles.length = 0; } this.renderedLayerRevision_ = layerRevision; - return super.prepareFrame(frameState, layerState); + return super.prepareFrame(frameState); } /** @@ -390,12 +390,12 @@ class CanvasVectorTileLayerRenderer extends CanvasTileLayerRenderer { /** * @inheritDoc */ - renderFrame(frameState, layerState, target) { + renderFrame(frameState, target) { const viewHints = frameState.viewHints; const hifi = !(viewHints[ViewHint.ANIMATING] || viewHints[ViewHint.INTERACTING]); this.renderQueuedTileImages_(hifi, frameState); - super.renderFrame(frameState, layerState, target); + super.renderFrame(frameState, target); const layer = /** @type {import("../../layer/VectorTile.js").default} */ (this.getLayer()); const renderMode = layer.getRenderMode(); @@ -495,6 +495,7 @@ class CanvasVectorTileLayerRenderer extends CanvasTileLayerRenderer { } } if (declutterReplays) { + const layerState = frameState.layerStatesArray[frameState.layerIndex]; replayDeclutter(declutterReplays, context, rotation, layerState.opacity, hifi, frameState.declutterItems); } diff --git a/src/ol/renderer/webgl/PointsLayer.js b/src/ol/renderer/webgl/PointsLayer.js index 77b4e5f623..ff9757fcef 100644 --- a/src/ol/renderer/webgl/PointsLayer.js +++ b/src/ol/renderer/webgl/PointsLayer.js @@ -284,7 +284,8 @@ class WebGLPointsLayerRenderer extends WebGLLayerRenderer { /** * @inheritDoc */ - renderFrame(frameState, layerState) { + renderFrame(frameState) { + const layerState = frameState.layerStatesArray[frameState.layerIndex]; this.helper_.drawElements(0, this.indicesBuffer_.getArray().length); this.helper_.finalizeDraw(frameState); const canvas = this.helper_.getCanvas(); diff --git a/src/ol/source/Raster.js b/src/ol/source/Raster.js index 9759b66dbb..75a81ec633 100644 --- a/src/ol/source/Raster.js +++ b/src/ol/source/Raster.js @@ -214,6 +214,7 @@ class RasterSource extends ImageSource { extent: null, focus: null, index: 0, + layerIndex: 0, layerStatesArray: getLayerStatesArray(this.layers_), pixelRatio: 1, pixelToCoordinateTransform: createTransform(), @@ -358,7 +359,8 @@ class RasterSource extends ImageSource { const len = this.layers_.length; const imageDatas = new Array(len); for (let i = 0; i < len; ++i) { - const imageData = getImageData(this.layers_[i], frameState, frameState.layerStatesArray[i]); + frameState.layerIndex = i; + const imageData = getImageData(this.layers_[i], frameState); if (imageData) { imageDatas[i] = imageData; } else { @@ -430,21 +432,20 @@ let sharedContext = null; * Get image data from a layer. * @param {import("../layer/Layer.js").default} layer Layer to render. * @param {import("../PluggableMap.js").FrameState} frameState The frame state. - * @param {import("../layer/Layer.js").State} layerState The layer state. * @return {ImageData} The image data. */ -function getImageData(layer, frameState, layerState) { +function getImageData(layer, frameState) { const renderer = layer.getRenderer(); if (!renderer) { throw new Error('Unsupported layer type: ' + layer); } - if (!renderer.prepareFrame(frameState, layerState)) { + if (!renderer.prepareFrame(frameState)) { return null; } const width = frameState.size[0]; const height = frameState.size[1]; - const container = renderer.renderFrame(frameState, layerState, null); + const container = renderer.renderFrame(frameState, null); let element; if (container) { element = container.firstElementChild; diff --git a/test/spec/ol/renderer/canvas/vectorimage.test.js b/test/spec/ol/renderer/canvas/vectorimage.test.js index a3a0b48593..c9467ab2f2 100644 --- a/test/spec/ol/renderer/canvas/vectorimage.test.js +++ b/test/spec/ol/renderer/canvas/vectorimage.test.js @@ -35,6 +35,8 @@ describe('ol/renderer/canvas/VectorImageLayer', function() { projExtent[0] - 10000, -10000, projExtent[0] + 10000, 10000 ]; const frameState = { + layerStatesArray: [layer.getLayerState()], + layerIndex: 0, extent: extent, skippedFeatureUids: {}, viewHints: [], @@ -44,7 +46,7 @@ describe('ol/renderer/canvas/VectorImageLayer', function() { rotation: 0 } }; - renderer.prepareFrame(frameState, {}); + renderer.prepareFrame(frameState); const expected = renderer.image_.getExtent(); scaleFromCenter(extent, 2); diff --git a/test/spec/ol/renderer/canvas/vectorlayer.test.js b/test/spec/ol/renderer/canvas/vectorlayer.test.js index b2ea559139..a3921a8539 100644 --- a/test/spec/ol/renderer/canvas/vectorlayer.test.js +++ b/test/spec/ol/renderer/canvas/vectorlayer.test.js @@ -243,7 +243,7 @@ describe('ol.renderer.canvas.VectorLayer', function() { frameState.extent = [projExtent[0] - 10000, -10000, projExtent[0] + 10000, 10000]; - renderer.prepareFrame(frameState, {}); + renderer.prepareFrame(frameState); expect(renderer.replayGroup_.maxExtent_).to.eql(bufferExtent([ projExtent[0] - worldWidth + buffer, -10000, projExtent[2] + worldWidth - buffer, 10000 @@ -255,7 +255,7 @@ describe('ol.renderer.canvas.VectorLayer', function() { frameState.extent = [projExtent[0] - 10000, -10000, projExtent[1] - 10000, 10000]; - renderer.prepareFrame(frameState, {}); + renderer.prepareFrame(frameState); expect(renderer.replayGroup_.maxExtent_).to.eql(bufferExtent([ projExtent[0] - worldWidth + buffer, -10000, projExtent[2] + worldWidth - buffer, 10000 @@ -266,7 +266,7 @@ describe('ol.renderer.canvas.VectorLayer', function() { frameState.extent = [2 * projExtent[0] - 10000, -10000, 2 * projExtent[1] + 10000, 10000]; - renderer.prepareFrame(frameState, {}); + renderer.prepareFrame(frameState); expect(renderer.replayGroup_.maxExtent_).to.eql(bufferExtent([ projExtent[0] - worldWidth + buffer, -10000, projExtent[2] + worldWidth - buffer, 10000 @@ -279,7 +279,7 @@ describe('ol.renderer.canvas.VectorLayer', function() { projExtent[0] - 2 * worldWidth - 10000, -10000, projExtent[1] + 2 * worldWidth + 10000, 10000 ]; - renderer.prepareFrame(frameState, {}); + renderer.prepareFrame(frameState); expect(renderer.replayGroup_.maxExtent_).to.eql(bufferExtent([ projExtent[0] - 2 * worldWidth - 10000, -10000, projExtent[2] + 2 * worldWidth + 10000, 10000 @@ -288,9 +288,9 @@ describe('ol.renderer.canvas.VectorLayer', function() { it('sets replayGroupChanged correctly', function() { frameState.extent = [-10000, -10000, 10000, 10000]; - renderer.prepareFrame(frameState, {}); + renderer.prepareFrame(frameState); expect(renderer.replayGroupChanged).to.be(true); - renderer.prepareFrame(frameState, {}); + renderer.prepareFrame(frameState); expect(renderer.replayGroupChanged).to.be(false); }); @@ -301,13 +301,15 @@ describe('ol.renderer.canvas.VectorLayer', function() { expect(true); done(); }); + frameState.layerStatesArray = [layer.getLayerState()]; + frameState.layerIndex = 0; frameState.extent = [-10000, -10000, 10000, 10000]; frameState.size = [100, 100]; frameState.viewState.center = [0, 0]; let rendered = false; - if (renderer.prepareFrame(frameState, {})) { + if (renderer.prepareFrame(frameState)) { rendered = true; - renderer.renderFrame(frameState, layer.getLayerState(), null); + renderer.renderFrame(frameState, null); } expect(rendered).to.be(true); }); diff --git a/test/spec/ol/renderer/canvas/vectortilelayer.test.js b/test/spec/ol/renderer/canvas/vectortilelayer.test.js index 9efe8fe0d1..7c49141c4b 100644 --- a/test/spec/ol/renderer/canvas/vectortilelayer.test.js +++ b/test/spec/ol/renderer/canvas/vectortilelayer.test.js @@ -234,6 +234,8 @@ describe('ol.renderer.canvas.VectorTileLayer', function() { }; const proj = getProjection('EPSG:3857'); const frameState = { + layerStatesArray: [layer.getLayerState()], + layerIndex: 0, extent: proj.getExtent(), pixelRatio: 1, time: Date.now(), @@ -247,13 +249,13 @@ describe('ol.renderer.canvas.VectorTileLayer', function() { usedTiles: {}, wantedTiles: {} }; - renderer.renderFrame(frameState, {}); + renderer.renderFrame(frameState); const replayState = renderer.renderedTiles[0].getReplayState(layer); const revision = replayState.renderedTileRevision; - renderer.renderFrame(frameState, {}, null); + renderer.renderFrame(frameState, null); expect(replayState.renderedTileRevision).to.be(revision); layer.changed(); - renderer.renderFrame(frameState, {}, null); + renderer.renderFrame(frameState, null); expect(replayState.renderedTileRevision).to.be(revision + 1); expect(Object.keys(renderer.tileListenerKeys_).length).to.be(0); }); From c92bf2967742a593e7d6eb104af5a0dff844443d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Fr=C3=A9d=C3=A9ric=20Junod?= Date: Wed, 29 May 2019 09:07:05 +0200 Subject: [PATCH 2/3] Fix spelling Co-Authored-By: Tim Schaub --- src/ol/layer/Base.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/ol/layer/Base.js b/src/ol/layer/Base.js index 7e5bbe5fdd..994ee5544c 100644 --- a/src/ol/layer/Base.js +++ b/src/ol/layer/Base.js @@ -84,7 +84,7 @@ class BaseLayer extends BaseObject { /** * This method is not meant to be called by layers or layer renderers because the state - * is iccorect if the layer is included in a layer group. + * is incorrect if the layer is included in a layer group. * * @param {boolean=} opt_managed Layer is managed. * @return {import("./Layer.js").State} Layer state. From bfea8583060472a9d1996d59a4fe0128375bdacd Mon Sep 17 00:00:00 2001 From: Frederic Junod Date: Wed, 29 May 2019 09:19:17 +0200 Subject: [PATCH 3/3] Add missing extension in import --- rendering/cases/layer-group/main.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/rendering/cases/layer-group/main.js b/rendering/cases/layer-group/main.js index 4ca07a5c66..a6fae1260e 100644 --- a/rendering/cases/layer-group/main.js +++ b/rendering/cases/layer-group/main.js @@ -1,7 +1,7 @@ import Map from '../../../src/ol/Map.js'; import View from '../../../src/ol/View.js'; import {Group as LayerGroup, Tile as TileLayer} from '../../../src/ol/layer.js'; -import XYZ from '../../../src/ol/source/XYZ'; +import XYZ from '../../../src/ol/source/XYZ.js'; new Map({ target: 'map',