From 095c0dc9c9830e8f10135a3e559078c4fd44185f Mon Sep 17 00:00:00 2001 From: Nyall Dawson Date: Wed, 23 Jun 2021 09:02:00 +1000 Subject: [PATCH] [layouts] Restore forced rasterization of whole layout map item when a layer has opacity set for Qt < 5.15 Workarounds bugs in the PDF export for these earlier versions Fixes #42698 --- src/core/qgsmapsettingsutils.cpp | 7 +++++++ tests/src/core/testqgsmapsettingsutils.cpp | 5 +++++ 2 files changed, 12 insertions(+) diff --git a/src/core/qgsmapsettingsutils.cpp b/src/core/qgsmapsettingsutils.cpp index 6ad3a54594b4..de05a6a88e00 100644 --- a/src/core/qgsmapsettingsutils.cpp +++ b/src/core/qgsmapsettingsutils.cpp @@ -54,6 +54,13 @@ QStringList QgsMapSettingsUtils::containsAdvancedEffects( const QgsMapSettings & // if vector layer, check labels and feature blend mode if ( QgsVectorLayer *currentVectorLayer = qobject_cast( layer ) ) { +#if QT_VERSION < QT_VERSION_CHECK(5, 15, 0) + // Qt < 5.15 does not correctly support layer level opacity in PDF exports -- see https://github.com/qgis/QGIS/issues/42698 + if ( !qgsDoubleNear( currentVectorLayer->opacity(), 1.0 ) && !( flags & EffectsCheckFlag::IgnoreGeoPdfSupportedEffects ) ) + { + layers << layer->name(); + } +#endif if ( currentVectorLayer->featureBlendMode() != QPainter::CompositionMode_SourceOver ) { layers << layer->name(); diff --git a/tests/src/core/testqgsmapsettingsutils.cpp b/tests/src/core/testqgsmapsettingsutils.cpp index ea7adfca52bf..49c066d7646d 100644 --- a/tests/src/core/testqgsmapsettingsutils.cpp +++ b/tests/src/core/testqgsmapsettingsutils.cpp @@ -96,7 +96,12 @@ void TestQgsMapSettingsUtils::containsAdvancedEffects() // changing an individual layer's opacity is OK -- we don't want to force the whole map to be rasterized just because of this setting! // (just let that one layer get exported as raster instead) layer->setOpacity( 0.5 ); +#if QT_VERSION >= QT_VERSION_CHECK(5, 15, 0) + // this only works on Qt 5.15 or later -- see https://github.com/qgis/QGIS/issues/42698 QCOMPARE( QgsMapSettingsUtils::containsAdvancedEffects( mapSettings ).size(), 0 ); +#else + QCOMPARE( QgsMapSettingsUtils::containsAdvancedEffects( mapSettings ).size(), 1 ); +#endif QCOMPARE( QgsMapSettingsUtils::containsAdvancedEffects( mapSettings, QgsMapSettingsUtils::EffectsCheckFlag::IgnoreGeoPdfSupportedEffects ).size(), 0 ); }