Merge pull request #12831 from MoonE/fix-emptied-vectorimage
Fix rendering VectorImage with no features in view extent
This commit is contained in:
@@ -120,6 +120,7 @@ class CanvasVectorImageLayerRenderer extends CanvasImageLayerRenderer {
|
|||||||
),
|
),
|
||||||
})
|
})
|
||||||
);
|
);
|
||||||
|
let emptyImage = true;
|
||||||
const image = new ImageCanvas(
|
const image = new ImageCanvas(
|
||||||
renderedExtent,
|
renderedExtent,
|
||||||
viewResolution,
|
viewResolution,
|
||||||
@@ -131,8 +132,10 @@ class CanvasVectorImageLayerRenderer extends CanvasImageLayerRenderer {
|
|||||||
vectorRenderer.replayGroupChanged
|
vectorRenderer.replayGroupChanged
|
||||||
) {
|
) {
|
||||||
vectorRenderer.clipping = false;
|
vectorRenderer.clipping = false;
|
||||||
vectorRenderer.renderFrame(imageFrameState, null);
|
if (vectorRenderer.renderFrame(imageFrameState, null)) {
|
||||||
vectorRenderer.renderDeclutter(imageFrameState);
|
vectorRenderer.renderDeclutter(imageFrameState);
|
||||||
|
emptyImage = false;
|
||||||
|
}
|
||||||
callback();
|
callback();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -141,24 +144,25 @@ class CanvasVectorImageLayerRenderer extends CanvasImageLayerRenderer {
|
|||||||
image.addEventListener(
|
image.addEventListener(
|
||||||
EventType.CHANGE,
|
EventType.CHANGE,
|
||||||
function () {
|
function () {
|
||||||
if (image.getState() === ImageState.LOADED) {
|
if (image.getState() !== ImageState.LOADED) {
|
||||||
this.image_ = image;
|
return;
|
||||||
const imageResolution = image.getResolution();
|
|
||||||
const imagePixelRatio = image.getPixelRatio();
|
|
||||||
const renderedResolution =
|
|
||||||
(imageResolution * pixelRatio) / imagePixelRatio;
|
|
||||||
this.renderedResolution = renderedResolution;
|
|
||||||
this.coordinateToVectorPixelTransform_ = compose(
|
|
||||||
this.coordinateToVectorPixelTransform_,
|
|
||||||
width / 2,
|
|
||||||
height / 2,
|
|
||||||
1 / renderedResolution,
|
|
||||||
-1 / renderedResolution,
|
|
||||||
0,
|
|
||||||
-viewState.center[0],
|
|
||||||
-viewState.center[1]
|
|
||||||
);
|
|
||||||
}
|
}
|
||||||
|
this.image_ = emptyImage ? null : image;
|
||||||
|
const imageResolution = image.getResolution();
|
||||||
|
const imagePixelRatio = image.getPixelRatio();
|
||||||
|
const renderedResolution =
|
||||||
|
(imageResolution * pixelRatio) / imagePixelRatio;
|
||||||
|
this.renderedResolution = renderedResolution;
|
||||||
|
this.coordinateToVectorPixelTransform_ = compose(
|
||||||
|
this.coordinateToVectorPixelTransform_,
|
||||||
|
width / 2,
|
||||||
|
height / 2,
|
||||||
|
1 / renderedResolution,
|
||||||
|
-1 / renderedResolution,
|
||||||
|
0,
|
||||||
|
-viewState.center[0],
|
||||||
|
-viewState.center[1]
|
||||||
|
);
|
||||||
}.bind(this)
|
}.bind(this)
|
||||||
);
|
);
|
||||||
image.load();
|
image.load();
|
||||||
|
|||||||
@@ -1,4 +1,7 @@
|
|||||||
import CanvasVectorImageLayerRenderer from '../../../../../../src/ol/renderer/canvas/VectorImageLayer.js';
|
import CanvasVectorImageLayerRenderer from '../../../../../../src/ol/renderer/canvas/VectorImageLayer.js';
|
||||||
|
import Feature from '../../../../../../src/ol/Feature.js';
|
||||||
|
import ImageCanvas from '../../../../../../src/ol/ImageCanvas.js';
|
||||||
|
import Point from '../../../../../../src/ol/geom/Point.js';
|
||||||
import VectorImageLayer from '../../../../../../src/ol/layer/VectorImage.js';
|
import VectorImageLayer from '../../../../../../src/ol/layer/VectorImage.js';
|
||||||
import VectorSource from '../../../../../../src/ol/source/Vector.js';
|
import VectorSource from '../../../../../../src/ol/source/Vector.js';
|
||||||
import {create} from '../../../../../../src/ol/transform.js';
|
import {create} from '../../../../../../src/ol/transform.js';
|
||||||
@@ -19,12 +22,19 @@ describe('ol/renderer/canvas/VectorImageLayer', function () {
|
|||||||
});
|
});
|
||||||
|
|
||||||
describe('#prepareFrame', function () {
|
describe('#prepareFrame', function () {
|
||||||
it('sets correct extent with imageRatio = 2', function () {
|
/** @type {VectorImageLayer} */
|
||||||
const layer = new VectorImageLayer({
|
let layer;
|
||||||
|
/** @type {CanvasVectorImageLayerRenderer} */
|
||||||
|
let renderer;
|
||||||
|
let frameState;
|
||||||
|
this.beforeEach(function () {
|
||||||
|
layer = new VectorImageLayer({
|
||||||
imageRatio: 2,
|
imageRatio: 2,
|
||||||
source: new VectorSource(),
|
source: new VectorSource({
|
||||||
|
features: [new Feature(new Point([0, 0]))],
|
||||||
|
}),
|
||||||
});
|
});
|
||||||
const renderer = new CanvasVectorImageLayerRenderer(layer);
|
renderer = new CanvasVectorImageLayerRenderer(layer);
|
||||||
const projection = getProjection('EPSG:3857');
|
const projection = getProjection('EPSG:3857');
|
||||||
const projExtent = projection.getExtent();
|
const projExtent = projection.getExtent();
|
||||||
const extent = [
|
const extent = [
|
||||||
@@ -33,7 +43,7 @@ describe('ol/renderer/canvas/VectorImageLayer', function () {
|
|||||||
projExtent[0] + 10000,
|
projExtent[0] + 10000,
|
||||||
10000,
|
10000,
|
||||||
];
|
];
|
||||||
const frameState = {
|
frameState = {
|
||||||
layerStatesArray: [layer.getLayerState()],
|
layerStatesArray: [layer.getLayerState()],
|
||||||
layerIndex: 0,
|
layerIndex: 0,
|
||||||
extent: extent,
|
extent: extent,
|
||||||
@@ -46,12 +56,22 @@ describe('ol/renderer/canvas/VectorImageLayer', function () {
|
|||||||
rotation: 0,
|
rotation: 0,
|
||||||
},
|
},
|
||||||
};
|
};
|
||||||
|
});
|
||||||
|
it('sets image to null if no features are rendered', function () {
|
||||||
renderer.prepareFrame(frameState);
|
renderer.prepareFrame(frameState);
|
||||||
const expected = renderer.image_.getExtent();
|
expect(renderer.image_).to.be.a(ImageCanvas);
|
||||||
|
|
||||||
|
layer.getSource().clear();
|
||||||
|
renderer.prepareFrame(frameState);
|
||||||
|
expect(renderer.image_).to.be(null);
|
||||||
|
});
|
||||||
|
it('sets correct extent with imageRatio = 2', function () {
|
||||||
|
const extent = frameState.extent.slice();
|
||||||
scaleFromCenter(extent, 2);
|
scaleFromCenter(extent, 2);
|
||||||
|
|
||||||
expect(expected).to.eql(extent);
|
renderer.prepareFrame(frameState);
|
||||||
|
const imageExtent = renderer.image_.getExtent();
|
||||||
|
expect(imageExtent).to.eql(extent);
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
|
|||||||
Reference in New Issue
Block a user