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

View File

@ -295,8 +295,7 @@ void QgsLayoutItem::paint( QPainter *painter, const QStyleOptionGraphicsItem *it
const bool useImageCache = false;
bool forceRasterOutput = containsAdvancedEffects();
QPainter::CompositionMode blendMode = blendModeForRender();
if ( mLayout->renderContext().flags() & Qgis::LayoutRenderFlag::ForceVectorOutput
|| mLayout->renderContext().rasterizedRenderingPolicy() == Qgis::RasterizedRenderingPolicy::ForceVector )
if ( mLayout->renderContext().rasterizedRenderingPolicy() == Qgis::RasterizedRenderingPolicy::ForceVector )
{
// the FlagForceVectorOutput flag overrides everything, and absolutely DISABLES rasterisation
// 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 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 )
{
// 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 ) )
{
const bool forceVector = mLayout && ( ( mLayout->renderContext().flags() & Qgis::LayoutRenderFlag::ForceVectorOutput )
|| mLayout->renderContext().rasterizedRenderingPolicy() == Qgis::RasterizedRenderingPolicy::ForceVector );
const bool forceVector = mLayout && mLayout->renderContext().rasterizedRenderingPolicy() == Qgis::RasterizedRenderingPolicy::ForceVector;
if ( ( containsAdvancedEffects() || ( blendModeForRender() != QPainter::CompositionMode_SourceOver ) )
&& !forceVector )
{

View File

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

View File

@ -86,6 +86,18 @@ Qgis::RasterizedRenderingPolicy QgsLayoutRenderContext::rasterizedRenderingPolic
void QgsLayoutRenderContext::setRasterizedRenderingPolicy( Qgis::RasterizedRenderingPolicy 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 )
@ -162,3 +174,12 @@ void QgsLayoutRenderContext::setFeatureFilterProvider( QgsFeatureFilterProvider
{
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:
void matchRasterizedRenderingPolicyToFlags();
Qgis::LayoutRenderFlags mFlags;
Qgis::RasterizedRenderingPolicy mRasterizedRenderingPolicy = Qgis::RasterizedRenderingPolicy::PreferVector;