diff --git a/src/ol/render.js b/src/ol/render.js index 150c8809a3..c9cd338c8d 100644 --- a/src/ol/render.js +++ b/src/ol/render.js @@ -88,6 +88,8 @@ export function toContext(context, opt_options) { * @api */ export function getVectorContext(event) { + // canvas may be at a different pixel ratio than frameState.pixelRatio + const canvasPixelRatio = event.inversePixelTransform[0]; const frameState = event.frameState; const transform = multiplyTransform( event.inversePixelTransform.slice(), @@ -95,7 +97,7 @@ export function getVectorContext(event) { ); const squaredTolerance = getSquaredTolerance( frameState.viewState.resolution, - frameState.pixelRatio + canvasPixelRatio ); let userTransform; const userProjection = getUserProjection(); @@ -107,7 +109,7 @@ export function getVectorContext(event) { } return new CanvasImmediateRenderer( event.context, - frameState.pixelRatio, + canvasPixelRatio, frameState.extent, transform, frameState.viewState.rotation, diff --git a/test/rendering/cases/postrender-immediate/expected.png b/test/rendering/cases/postrender-immediate/expected.png new file mode 100644 index 0000000000..a260603a5e Binary files /dev/null and b/test/rendering/cases/postrender-immediate/expected.png differ diff --git a/test/rendering/cases/postrender-immediate/main.js b/test/rendering/cases/postrender-immediate/main.js new file mode 100644 index 0000000000..430fc5271b --- /dev/null +++ b/test/rendering/cases/postrender-immediate/main.js @@ -0,0 +1,45 @@ +import {Circle, Stroke, Style} from '../../../../src/ol/style.js'; +import {Map, View} from '../../../../src/ol/index.js'; +import {Point} from '../../../../src/ol/geom.js'; +import {Tile as TileLayer} from '../../../../src/ol/layer.js'; +import {XYZ} from '../../../../src/ol/source.js'; +import {getVectorContext} from '../../../../src/ol/render.js'; +import {useGeographic} from '../../../../src/ol/proj.js'; + +useGeographic(); + +const center = [8.6, 50.1]; +const point = new Point(center); +const style = new Style({ + image: new Circle({ + radius: 40, + stroke: new Stroke({ + width: 5, + color: 'red', + }), + }), +}); + +const tileLayer = new TileLayer({ + source: new XYZ({ + url: '/data/tiles/satellite/{z}/{x}/{y}.jpg', + transition: 0, + }), +}); + +new Map({ + layers: [tileLayer], + target: 'map', + view: new View({ + center: center, + zoom: 3, + }), + pixelRatio: 2, +}); +tileLayer.on('postrender', function (evt) { + const vectorContext = getVectorContext(evt); + vectorContext.setStyle(style); + vectorContext.drawGeometry(point); +}); + +render();