Synchronize layout render flags to rasterization policy

This commit is contained in:
Nyall Dawson 2025-05-28 16:08:47 +10:00
parent 6bd71ef1de
commit 881bc87c66
6 changed files with 33 additions and 27 deletions

View File

@ -341,6 +341,7 @@ class LayoutContextSettingsRestorer
: mLayout( layout ) : mLayout( layout )
, mPreviousDpi( layout->renderContext().dpi() ) , mPreviousDpi( layout->renderContext().dpi() )
, mPreviousFlags( layout->renderContext().flags() ) , mPreviousFlags( layout->renderContext().flags() )
, mPreviousRasterPolicy( layout->renderContext().rasterizedRenderingPolicy() )
, mPreviousTextFormat( layout->renderContext().textRenderFormat() ) , mPreviousTextFormat( layout->renderContext().textRenderFormat() )
, mPreviousExportLayer( layout->renderContext().currentExportLayer() ) , mPreviousExportLayer( layout->renderContext().currentExportLayer() )
, mPreviousSimplifyMethod( layout->renderContext().simplifyMethod() ) , mPreviousSimplifyMethod( layout->renderContext().simplifyMethod() )
@ -355,6 +356,7 @@ class LayoutContextSettingsRestorer
{ {
mLayout->renderContext().setDpi( mPreviousDpi ); mLayout->renderContext().setDpi( mPreviousDpi );
mLayout->renderContext().setFlags( mPreviousFlags ); mLayout->renderContext().setFlags( mPreviousFlags );
mLayout->renderContext().setRasterizedRenderingPolicy( mPreviousRasterPolicy );
mLayout->renderContext().setTextRenderFormat( mPreviousTextFormat ); mLayout->renderContext().setTextRenderFormat( mPreviousTextFormat );
Q_NOWARN_DEPRECATED_PUSH Q_NOWARN_DEPRECATED_PUSH
mLayout->renderContext().setCurrentExportLayer( mPreviousExportLayer ); mLayout->renderContext().setCurrentExportLayer( mPreviousExportLayer );
@ -372,6 +374,7 @@ class LayoutContextSettingsRestorer
QgsLayout *mLayout = nullptr; QgsLayout *mLayout = nullptr;
double mPreviousDpi = 0; double mPreviousDpi = 0;
Qgis::LayoutRenderFlags mPreviousFlags; Qgis::LayoutRenderFlags mPreviousFlags;
Qgis::RasterizedRenderingPolicy mPreviousRasterPolicy = Qgis::RasterizedRenderingPolicy::AllowRasterization;
Qgis::TextRenderFormat mPreviousTextFormat = Qgis::TextRenderFormat::AlwaysOutlines; Qgis::TextRenderFormat mPreviousTextFormat = Qgis::TextRenderFormat::AlwaysOutlines;
int mPreviousExportLayer = 0; int mPreviousExportLayer = 0;
QgsVectorSimplifyMethod mPreviousSimplifyMethod; QgsVectorSimplifyMethod mPreviousSimplifyMethod;
@ -418,7 +421,6 @@ QgsLayoutExporter::ExportResult QgsLayoutExporter::exportToImage( const QString
mLayout->renderContext().setDpi( settings.dpi ); mLayout->renderContext().setDpi( settings.dpi );
mLayout->renderContext().setFlags( settings.flags ); mLayout->renderContext().setFlags( settings.flags );
mLayout->renderContext().setRasterizedRenderingPolicy( Qgis::RasterizedRenderingPolicy::AllowRasterization ); mLayout->renderContext().setRasterizedRenderingPolicy( Qgis::RasterizedRenderingPolicy::AllowRasterization );
mLayout->renderContext().setFlag( Qgis::LayoutRenderFlag::UseAdvancedEffects, true );
mLayout->renderContext().setPredefinedScales( settings.predefinedMapScales ); mLayout->renderContext().setPredefinedScales( settings.predefinedMapScales );
QList< int > pages; QList< int > pages;
@ -580,13 +582,10 @@ QgsLayoutExporter::ExportResult QgsLayoutExporter::exportToPdf( const QString &f
if ( settings.forceVectorOutput ) if ( settings.forceVectorOutput )
{ {
mLayout->renderContext().setRasterizedRenderingPolicy( Qgis::RasterizedRenderingPolicy::ForceVector ); mLayout->renderContext().setRasterizedRenderingPolicy( Qgis::RasterizedRenderingPolicy::ForceVector );
mLayout->renderContext().setFlag( Qgis::LayoutRenderFlag::UseAdvancedEffects, false );
mLayout->renderContext().setFlag( Qgis::LayoutRenderFlag::ForceVectorOutput, true );
} }
else else
{ {
mLayout->renderContext().setRasterizedRenderingPolicy( Qgis::RasterizedRenderingPolicy::PreferVector ); mLayout->renderContext().setRasterizedRenderingPolicy( Qgis::RasterizedRenderingPolicy::PreferVector );
mLayout->renderContext().setFlag( Qgis::LayoutRenderFlag::UseAdvancedEffects, true );
} }
// Force synchronous legend graphics requests. Necessary for WMS GetPrint, // Force synchronous legend graphics requests. Necessary for WMS GetPrint,
@ -821,13 +820,10 @@ QgsLayoutExporter::ExportResult QgsLayoutExporter::exportToPdf( QgsAbstractLayou
if ( settings.forceVectorOutput ) if ( settings.forceVectorOutput )
{ {
iterator->layout()->renderContext().setRasterizedRenderingPolicy( Qgis::RasterizedRenderingPolicy::ForceVector ); iterator->layout()->renderContext().setRasterizedRenderingPolicy( Qgis::RasterizedRenderingPolicy::ForceVector );
iterator->layout()->renderContext().setFlag( Qgis::LayoutRenderFlag::UseAdvancedEffects, false );
iterator->layout()->renderContext().setFlag( Qgis::LayoutRenderFlag::ForceVectorOutput, true );
} }
else else
{ {
iterator->layout()->renderContext().setRasterizedRenderingPolicy( Qgis::RasterizedRenderingPolicy::PreferVector ); iterator->layout()->renderContext().setRasterizedRenderingPolicy( Qgis::RasterizedRenderingPolicy::PreferVector );
iterator->layout()->renderContext().setFlag( Qgis::LayoutRenderFlag::UseAdvancedEffects, true );
} }
iterator->layout()->renderContext().setTextRenderFormat( settings.textRenderFormat ); iterator->layout()->renderContext().setTextRenderFormat( settings.textRenderFormat );
@ -944,8 +940,8 @@ QgsLayoutExporter::ExportResult QgsLayoutExporter::print( QPrinter &printer, con
// If we are not printing as raster, temporarily disable advanced effects // If we are not printing as raster, temporarily disable advanced effects
// as QPrinter does not support composition modes and can result // as QPrinter does not support composition modes and can result
// in items missing from the output // in items missing from the output
mLayout->renderContext().setFlag( Qgis::LayoutRenderFlag::UseAdvancedEffects, !settings.rasterizeWholeImage ); if ( !settings.rasterizeWholeImage )
mLayout->renderContext().setRasterizedRenderingPolicy( Qgis::RasterizedRenderingPolicy::ForceVector );
preparePrint( mLayout, &printer, true ); preparePrint( mLayout, &printer, true );
QPainter p; QPainter p;
if ( !p.begin( &printer ) ) if ( !p.begin( &printer ) )
@ -1007,7 +1003,8 @@ QgsLayoutExporter::ExportResult QgsLayoutExporter::print( QgsAbstractLayoutItera
// If we are not printing as raster, temporarily disable advanced effects // If we are not printing as raster, temporarily disable advanced effects
// as QPrinter does not support composition modes and can result // as QPrinter does not support composition modes and can result
// in items missing from the output // in items missing from the output
iterator->layout()->renderContext().setFlag( Qgis::LayoutRenderFlag::UseAdvancedEffects, !settings.rasterizeWholeImage ); if ( !settings.rasterizeWholeImage )
iterator->layout()->renderContext().setRasterizedRenderingPolicy( Qgis::RasterizedRenderingPolicy::ForceVector );
if ( first ) if ( first )
{ {
@ -1065,14 +1062,10 @@ QgsLayoutExporter::ExportResult QgsLayoutExporter::exportToSvg( const QString &f
if ( settings.forceVectorOutput ) if ( settings.forceVectorOutput )
{ {
mLayout->renderContext().setRasterizedRenderingPolicy( Qgis::RasterizedRenderingPolicy::ForceVector ); mLayout->renderContext().setRasterizedRenderingPolicy( Qgis::RasterizedRenderingPolicy::ForceVector );
mLayout->renderContext().setFlag( Qgis::LayoutRenderFlag::ForceVectorOutput, true );
mLayout->renderContext().setFlag( Qgis::LayoutRenderFlag::UseAdvancedEffects, false );
} }
else else
{ {
mLayout->renderContext().setRasterizedRenderingPolicy( Qgis::RasterizedRenderingPolicy::PreferVector ); mLayout->renderContext().setRasterizedRenderingPolicy( Qgis::RasterizedRenderingPolicy::PreferVector );
mLayout->renderContext().setFlag( Qgis::LayoutRenderFlag::ForceVectorOutput, false );
mLayout->renderContext().setFlag( Qgis::LayoutRenderFlag::UseAdvancedEffects, true );
} }
mLayout->renderContext().setTextRenderFormat( s.textRenderFormat ); mLayout->renderContext().setTextRenderFormat( s.textRenderFormat );
mLayout->renderContext().setPredefinedScales( settings.predefinedMapScales ); mLayout->renderContext().setPredefinedScales( settings.predefinedMapScales );

View File

@ -295,8 +295,7 @@ void QgsLayoutItem::paint( QPainter *painter, const QStyleOptionGraphicsItem *it
const bool useImageCache = false; const bool useImageCache = false;
bool forceRasterOutput = containsAdvancedEffects(); bool forceRasterOutput = containsAdvancedEffects();
QPainter::CompositionMode blendMode = blendModeForRender(); QPainter::CompositionMode blendMode = blendModeForRender();
if ( mLayout->renderContext().flags() & Qgis::LayoutRenderFlag::ForceVectorOutput if ( mLayout->renderContext().rasterizedRenderingPolicy() == Qgis::RasterizedRenderingPolicy::ForceVector )
|| mLayout->renderContext().rasterizedRenderingPolicy() == Qgis::RasterizedRenderingPolicy::ForceVector )
{ {
// the FlagForceVectorOutput flag overrides everything, and absolutely DISABLES rasterisation // the FlagForceVectorOutput flag overrides everything, and absolutely DISABLES rasterisation
// even when we need it to get correct rendering of opacity/blend modes/etc // even when we need it to get correct rendering of opacity/blend modes/etc
@ -1084,12 +1083,6 @@ QgsLayoutSize QgsLayoutItem::applyDataDefinedSize( const QgsLayoutSize &size )
QPainter::CompositionMode QgsLayoutItem::blendModeForRender() const QPainter::CompositionMode QgsLayoutItem::blendModeForRender() const
{ {
QPainter::CompositionMode mode = mEvaluatedBlendMode; QPainter::CompositionMode mode = mEvaluatedBlendMode;
if ( !( mLayout->renderContext().flags() & Qgis::LayoutRenderFlag::UseAdvancedEffects ) )
{
// advanced effects disabled, reset blend mode
mode = QPainter::CompositionMode_SourceOver;
}
if ( mLayout->renderContext().rasterizedRenderingPolicy() == Qgis::RasterizedRenderingPolicy::ForceVector ) if ( mLayout->renderContext().rasterizedRenderingPolicy() == Qgis::RasterizedRenderingPolicy::ForceVector )
{ {
// this policy overrides everything, and absolutely DISABLES rasterisation // this policy overrides everything, and absolutely DISABLES rasterisation

View File

@ -648,8 +648,7 @@ void QgsLayoutItemElevationProfile::paint( QPainter *painter, const QStyleOption
if ( !qgsDoubleNear( layoutSize.width(), 0.0 ) && !qgsDoubleNear( layoutSize.height(), 0.0 ) ) if ( !qgsDoubleNear( layoutSize.width(), 0.0 ) && !qgsDoubleNear( layoutSize.height(), 0.0 ) )
{ {
const bool forceVector = mLayout && ( ( mLayout->renderContext().flags() & Qgis::LayoutRenderFlag::ForceVectorOutput ) const bool forceVector = mLayout && mLayout->renderContext().rasterizedRenderingPolicy() == Qgis::RasterizedRenderingPolicy::ForceVector;
|| mLayout->renderContext().rasterizedRenderingPolicy() == Qgis::RasterizedRenderingPolicy::ForceVector );
if ( ( containsAdvancedEffects() || ( blendModeForRender() != QPainter::CompositionMode_SourceOver ) ) if ( ( containsAdvancedEffects() || ( blendModeForRender() != QPainter::CompositionMode_SourceOver ) )
&& !forceVector ) && !forceVector )
{ {

View File

@ -1198,8 +1198,7 @@ void QgsLayoutItemMap::paint( QPainter *painter, const QStyleOptionGraphicsItem
if ( mLayout && mLayout->renderContext().flags() & Qgis::LayoutRenderFlag::LosslessImageRendering ) if ( mLayout && mLayout->renderContext().flags() & Qgis::LayoutRenderFlag::LosslessImageRendering )
painter->setRenderHint( QPainter::LosslessImageRendering, true ); painter->setRenderHint( QPainter::LosslessImageRendering, true );
const bool forceVector = mLayout && ( ( mLayout->renderContext().flags() & Qgis::LayoutRenderFlag::ForceVectorOutput ) const bool forceVector = mLayout && ( mLayout->renderContext().rasterizedRenderingPolicy() == Qgis::RasterizedRenderingPolicy::ForceVector );
|| mLayout->renderContext().rasterizedRenderingPolicy() == Qgis::RasterizedRenderingPolicy::ForceVector );
if ( ( containsAdvancedEffects() || ( blendModeForRender() != QPainter::CompositionMode_SourceOver ) ) if ( ( containsAdvancedEffects() || ( blendModeForRender() != QPainter::CompositionMode_SourceOver ) )
&& ( !mLayout || !forceVector ) ) && ( !mLayout || !forceVector ) )
@ -1773,7 +1772,6 @@ QgsMapSettings QgsLayoutItemMap::mapSettings( const QgsRectangle &extent, QSizeF
jobMapSettings.setSelectionColor( mLayout->renderContext().selectionColor() ); jobMapSettings.setSelectionColor( mLayout->renderContext().selectionColor() );
jobMapSettings.setFlag( Qgis::MapSettingsFlag::DrawSelection, mLayout->renderContext().flags() & Qgis::LayoutRenderFlag::DrawSelection ); jobMapSettings.setFlag( Qgis::MapSettingsFlag::DrawSelection, mLayout->renderContext().flags() & Qgis::LayoutRenderFlag::DrawSelection );
jobMapSettings.setFlag( Qgis::MapSettingsFlag::RenderPartialOutput, mLayout->renderContext().flags() & Qgis::LayoutRenderFlag::DisableTiledRasterLayerRenders ); jobMapSettings.setFlag( Qgis::MapSettingsFlag::RenderPartialOutput, mLayout->renderContext().flags() & Qgis::LayoutRenderFlag::DisableTiledRasterLayerRenders );
jobMapSettings.setFlag( Qgis::MapSettingsFlag::UseAdvancedEffects, mLayout->renderContext().flags() & Qgis::LayoutRenderFlag::UseAdvancedEffects );
jobMapSettings.setFlag( Qgis::MapSettingsFlag::AlwaysUseGlobalMasks, mLayout->renderContext().flags() & Qgis::LayoutRenderFlag::AlwaysUseGlobalMasks ); jobMapSettings.setFlag( Qgis::MapSettingsFlag::AlwaysUseGlobalMasks, mLayout->renderContext().flags() & Qgis::LayoutRenderFlag::AlwaysUseGlobalMasks );
jobMapSettings.setTransformContext( mLayout->project()->transformContext() ); jobMapSettings.setTransformContext( mLayout->project()->transformContext() );
jobMapSettings.setPathResolver( mLayout->project()->pathResolver() ); jobMapSettings.setPathResolver( mLayout->project()->pathResolver() );

View File

@ -86,6 +86,18 @@ Qgis::RasterizedRenderingPolicy QgsLayoutRenderContext::rasterizedRenderingPolic
void QgsLayoutRenderContext::setRasterizedRenderingPolicy( Qgis::RasterizedRenderingPolicy policy ) void QgsLayoutRenderContext::setRasterizedRenderingPolicy( Qgis::RasterizedRenderingPolicy policy )
{ {
mRasterizedRenderingPolicy = policy; mRasterizedRenderingPolicy = policy;
switch ( mRasterizedRenderingPolicy )
{
case Qgis::RasterizedRenderingPolicy::AllowRasterization:
case Qgis::RasterizedRenderingPolicy::PreferVector:
mFlags.setFlag( Qgis::LayoutRenderFlag::ForceVectorOutput, false );
mFlags.setFlag( Qgis::LayoutRenderFlag::UseAdvancedEffects, true );
break;
case Qgis::RasterizedRenderingPolicy::ForceVector:
mFlags.setFlag( Qgis::LayoutRenderFlag::ForceVectorOutput, true );
mFlags.setFlag( Qgis::LayoutRenderFlag::UseAdvancedEffects, false );
break;
}
} }
void QgsLayoutRenderContext::setDpi( double dpi ) void QgsLayoutRenderContext::setDpi( double dpi )
@ -162,3 +174,12 @@ void QgsLayoutRenderContext::setFeatureFilterProvider( QgsFeatureFilterProvider
{ {
mFeatureFilterProvider = featureFilterProvider; mFeatureFilterProvider = featureFilterProvider;
} }
void QgsLayoutRenderContext::matchRasterizedRenderingPolicyToFlags()
{
if ( !mFlags.testFlag( Qgis::LayoutRenderFlag::ForceVectorOutput )
&& mFlags.testFlag( Qgis::LayoutRenderFlag::UseAdvancedEffects ) )
mRasterizedRenderingPolicy = Qgis::RasterizedRenderingPolicy::PreferVector;
else if ( mFlags.testFlag( Qgis::LayoutRenderFlag::ForceVectorOutput ) )
mRasterizedRenderingPolicy = Qgis::RasterizedRenderingPolicy::ForceVector;
}

View File

@ -370,6 +370,8 @@ class CORE_EXPORT QgsLayoutRenderContext : public QObject
private: private:
void matchRasterizedRenderingPolicyToFlags();
Qgis::LayoutRenderFlags mFlags; Qgis::LayoutRenderFlags mFlags;
Qgis::RasterizedRenderingPolicy mRasterizedRenderingPolicy = Qgis::RasterizedRenderingPolicy::PreferVector; Qgis::RasterizedRenderingPolicy mRasterizedRenderingPolicy = Qgis::RasterizedRenderingPolicy::PreferVector;