From 1e7027b006882d7b03d7173837f0c782a6702fcb Mon Sep 17 00:00:00 2001 From: Mathieu Pellerin Date: Tue, 30 Jan 2024 18:18:51 +0700 Subject: [PATCH] [layouts] Fix layout item refresh state icon drawing on high DPI screens --- src/core/layout/qgslayoutitem.cpp | 4 ++-- src/core/layout/qgslayoutitemmap.cpp | 8 +------- 2 files changed, 3 insertions(+), 9 deletions(-) diff --git a/src/core/layout/qgslayoutitem.cpp b/src/core/layout/qgslayoutitem.cpp index 29c9159d40ad0..de89420af6e2c 100644 --- a/src/core/layout/qgslayoutitem.cpp +++ b/src/core/layout/qgslayoutitem.cpp @@ -1288,11 +1288,11 @@ void QgsLayoutItem::drawRefreshingOverlay( QPainter *painter, const QStyleOption { const QgsScopedQPainterState painterState( painter ); bool fitsInCache = false; - const int xSize = QFontMetrics( QFont() ).horizontalAdvance( 'X' ); + const int xSize = std::floor( static_cast( QFontMetrics( QFont() ).horizontalAdvance( 'X' ) ) * painter->device()->devicePixelRatioF() ); const QImage refreshingImage = QgsApplication::svgCache()->svgAsImage( QStringLiteral( ":/images/composer/refreshing_item.svg" ), xSize * 3, QColor(), QColor(), 1, 1, fitsInCache ); const double previewScaleFactor = QgsLayoutUtils::scaleFactorFromItemStyle( itemStyle, painter ); - painter->scale( 1.0 / previewScaleFactor, 1.0 / previewScaleFactor ); + painter->scale( 1.0 / previewScaleFactor / painter->device()->devicePixelRatioF(), 1.0 / previewScaleFactor / painter->device()->devicePixelRatioF() ); painter->drawImage( xSize, xSize, refreshingImage ); } diff --git a/src/core/layout/qgslayoutitemmap.cpp b/src/core/layout/qgslayoutitemmap.cpp index 55527059157d8..51864db031015 100644 --- a/src/core/layout/qgslayoutitemmap.cpp +++ b/src/core/layout/qgslayoutitemmap.cpp @@ -1599,7 +1599,6 @@ void QgsLayoutItemMap::recreateCachedImageInBackground() { devicePixelRatio = ( activeWindow->screen() ? QApplication::activeWindow()->screen()->devicePixelRatio() : 1.0 ); } - mCacheRenderingImage.reset( new QImage( w * devicePixelRatio, h * devicePixelRatio, QImage::Format_ARGB32 ) ); // set DPI of the image @@ -1678,12 +1677,7 @@ QgsMapSettings QgsLayoutItemMap::mapSettings( const QgsRectangle &extent, QSizeF if ( layout()->renderContext().isPreviewRender() ) { jobMapSettings.setDpiTarget( layout()->renderContext().dpi() ); - double devicePixelRatio = 1.0; - if ( QWidget *activeWindow = QApplication::activeWindow() ) - { - devicePixelRatio = ( activeWindow->screen() ? QApplication::activeWindow()->screen()->devicePixelRatio() : 1.0 ); - } - jobMapSettings.setDevicePixelRatio( devicePixelRatio ); + jobMapSettings.setDevicePixelRatio( mPainter ? mPainter->device()->devicePixelRatioF() : 1.0 ); } jobMapSettings.setBackgroundColor( Qt::transparent ); jobMapSettings.setRotation( mEvaluatedMapRotation );