diff --git a/src/gui/qgshighlight.cpp b/src/gui/qgshighlight.cpp index edfab451ad5..5c508e0352f 100644 --- a/src/gui/qgshighlight.cpp +++ b/src/gui/qgshighlight.cpp @@ -83,35 +83,21 @@ void QgsHighlight::init() void QgsHighlight::updateTransformedGeometry() { - QgsCoordinateTransform ct = mMapCanvas->mapSettings().layerTransform( mLayer ); - if ( ct.isValid() ) + const QgsCoordinateTransform ct = mMapCanvas->mapSettings().layerTransform( mLayer ); + + // we don't auto-transform if we are highlighting a feature -- the renderer will take care + // of that for us + if ( ct.isValid() && !mGeometry.isNull() ) { // reset to original geometry and transform - if ( !mGeometry.isNull() ) + mGeometry = mOriginalGeometry; + try { - mGeometry = mOriginalGeometry; - try - { - mGeometry.transform( ct ); - } - catch ( QgsCsException & ) - { - QgsDebugMsg( QStringLiteral( "Could not transform highlight geometry to canvas CRS" ) ); - } + mGeometry.transform( ct ); } - else if ( mFeature.hasGeometry() ) + catch ( QgsCsException & ) { - mFeature.setGeometry( mOriginalGeometry ); - QgsGeometry g = mFeature.geometry(); - try - { - g.transform( ct ); - mFeature.setGeometry( g ); - } - catch ( QgsCsException & ) - { - QgsDebugMsg( QStringLiteral( "Could not transform highlight geometry to canvas CRS" ) ); - } + QgsDebugMsg( QStringLiteral( "Could not transform highlight geometry to canvas CRS" ) ); } } updateRect(); @@ -329,6 +315,27 @@ void QgsHighlight::paint( QPainter *p ) return; QgsRenderContext context = createRenderContext(); + const QgsCoordinateTransform layerToCanvasTransform = mMapCanvas->mapSettings().layerTransform( mLayer ); + context.setCoordinateTransform( layerToCanvasTransform ); + QgsRectangle mapExtentInLayerCrs = mMapCanvas->mapSettings().visibleExtent(); + if ( layerToCanvasTransform.isValid() ) + { + QgsCoordinateTransform approxTransform = layerToCanvasTransform; + approxTransform.setBallparkTransformsAreAppropriate( true ); + try + { + mapExtentInLayerCrs = approxTransform.transformBoundingBox( mapExtentInLayerCrs, Qgis::TransformDirection::Reverse ); + } + catch ( QgsCsException & ) + { + QgsDebugMsg( QStringLiteral( "Error transforming canvas extent to layer CRS" ) ); + } + } + if ( !mapExtentInLayerCrs.isFinite() ) + { + return; + } + context.setExtent( mapExtentInLayerCrs ); // Because lower level outlines must be covered by upper level fill color // we render first with temporary opaque color, which is then replaced diff --git a/tests/src/python/test_qgshighlight.py b/tests/src/python/test_qgshighlight.py index 35d1a1b5dc9..96c3d2ed38b 100644 --- a/tests/src/python/test_qgshighlight.py +++ b/tests/src/python/test_qgshighlight.py @@ -17,26 +17,38 @@ import shutil from qgis.PyQt.QtCore import ( QSize, - Qt + Qt, + QDir, + ) from qgis.PyQt.QtGui import ( QColor, QImage, QPainter, - QResizeEvent + QResizeEvent, + QPixmap ) from qgis.core import ( QgsVectorLayer, QgsProject, QgsRectangle, - QgsRenderChecker + QgsRenderChecker, + QgsCoordinateReferenceSystem, + QgsMultiRenderChecker, + QgsGeometryGeneratorSymbolLayer, + QgsFillSymbol, + QgsSingleSymbolRenderer, + QgsSymbol +) +from qgis.gui import ( + QgsHighlight, + QgsMapCanvas ) -from qgis.gui import QgsHighlight from qgis.testing import start_app, unittest from qgis.testing.mocked import get_iface from utilities import unitTestDataPath -start_app() +app = start_app() TEST_DATA_DIR = unitTestDataPath() @@ -48,8 +60,13 @@ class TestQgsHighlight(unittest.TestCase): self.iface.mapCanvas().viewport().resize(400, 400) # For some reason the resizeEvent is not delivered, fake it self.iface.mapCanvas().resizeEvent(QResizeEvent(QSize(400, 400), self.iface.mapCanvas().size())) + self.report = "