Skip to content

Commit

Permalink
Merge pull request #15630 from ahocevar/declutter-nothing-to-render
Browse files Browse the repository at this point in the history
Fix rendering nothing with declutter and postrender listener
  • Loading branch information
ahocevar committed Mar 11, 2024
2 parents c6c6044 + 0d0c8ee commit 16e6f37
Show file tree
Hide file tree
Showing 2 changed files with 35 additions and 2 deletions.
6 changes: 4 additions & 2 deletions src/ol/renderer/canvas/VectorLayer.js
Expand Up @@ -253,8 +253,7 @@ class CanvasVectorLayerRenderer extends CanvasLayerRenderer {
* @param {import("../../Map.js").FrameState} frameState Frame state.
*/
renderDeclutter(frameState) {
const declutter = this.getLayer().getDeclutter();
if (!declutter) {
if (!this.replayGroup_ || !this.getLayer().getDeclutter()) {
return;
}
this.setupCompositionContext_(); //FIXME Check if this works, or if we need to defer something.
Expand All @@ -267,6 +266,9 @@ class CanvasVectorLayerRenderer extends CanvasLayerRenderer {
* @param {import("../../Map.js").FrameState} frameState Frame state.
*/
renderDeferredInternal(frameState) {
if (!this.replayGroup_) {
return;
}
this.replayGroup_.renderDeferred();
}

Expand Down
31 changes: 31 additions & 0 deletions test/browser/spec/ol/renderer/canvas/VectorLayer.test.js
@@ -1,5 +1,6 @@
import CanvasVectorLayerRenderer from '../../../../../../src/ol/renderer/canvas/VectorLayer.js';
import Feature from '../../../../../../src/ol/Feature.js';
import GeoJSON from '../../../../../../src/ol/format/GeoJSON.js';
import Map from '../../../../../../src/ol/Map.js';
import Point from '../../../../../../src/ol/geom/Point.js';
import Style from '../../../../../../src/ol/style/Style.js';
Expand Down Expand Up @@ -562,4 +563,34 @@ describe('ol/renderer/canvas/VectorLayer', function () {
expect(renderer.clipUnrotated.callCount).to.be(0);
});
});

describe('#renderDeclutter', () => {
it('does not throw on decluttered layer with postrender listener entering zoom range without loaded data', (done) => {
const vectorLayer = new VectorLayer({
background: '#1a2b39',
source: new VectorSource({
url: 'data:application/json;utf-8,{"type":"FeatureCollection","features":[{"type":"Feature","properties":{},"geometry":{"type":"Point","coordinates":[0,0]}}]}',
format: new GeoJSON(),
}),
minZoom: 3,
declutter: true,
});
const map = new Map({
layers: [vectorLayer],
target: document.createElement('div'),
view: new View({
center: [0, 0],
zoom: 2,
}),
});
vectorLayer.on('postrender', function postrender() {
if (map.getView().getZoom() > vectorLayer.getMinZoom()) {
vectorLayer.un('postrender', postrender);
done();
}
});
map.setSize([100, 100]);
map.getView().animate({zoom: 3.01});
});
});
});

0 comments on commit 16e6f37

Please sign in to comment.