From afc2d008fa61c55feb4f720de9c4a1834f6145ba Mon Sep 17 00:00:00 2001 From: Nyall Dawson Date: Wed, 11 Jun 2025 13:37:00 +1000 Subject: [PATCH] Only draw source once if forcing vector and any part of stack requires raster Avoids multiple stacked sources when forcing vector outputs --- src/core/effects/qgseffectstack.cpp | 21 +++++++++++++++++++++ src/core/effects/qgspainteffect.h | 1 + 2 files changed, 22 insertions(+) diff --git a/src/core/effects/qgseffectstack.cpp b/src/core/effects/qgseffectstack.cpp index 4857b9aebc7..0edf4d9fc02 100644 --- a/src/core/effects/qgseffectstack.cpp +++ b/src/core/effects/qgseffectstack.cpp @@ -94,6 +94,27 @@ void QgsEffectStack::draw( QgsRenderContext &context ) { QPainter *destPainter = context.painter(); + if ( context.rasterizedRenderingPolicy() == Qgis::RasterizedRenderingPolicy::ForceVector ) + { + // can we render this stack if we're forcing vectors? + bool requiresRasterization = false; + for ( const QgsPaintEffect *effect : std::as_const( mEffectList ) ) + { + if ( effect->enabled() && effect->flags().testFlag( Qgis::PaintEffectFlag::RequiresRasterization ) ) + { + requiresRasterization = true; + break; + } + } + + if ( requiresRasterization ) + { + //just draw unmodified source, we can't render this effect stack when forcing vectors + drawSource( *context.painter() ); + } + return; + } + //first, we build up a list of rendered effects //we do this moving backwards through the stack, so that each effect's results //becomes the source of the previous effect diff --git a/src/core/effects/qgspainteffect.h b/src/core/effects/qgspainteffect.h index 1d38684bba9..d03621ccc0c 100644 --- a/src/core/effects/qgspainteffect.h +++ b/src/core/effects/qgspainteffect.h @@ -19,6 +19,7 @@ #include "qgis_core.h" #include "qgis_sip.h" +#include "qgis.h" #include #include #include