Skip to content

Commit

Permalink
Add new map settings/render context flag for high quality image trans…
Browse files Browse the repository at this point in the history
…forms

which is opt in, and consistently respect this for better quality
raster image markers, svg/raster fills when set

We don't set this by default (keep things light for server), but
do use it in the map canvas and layout exports whenever antialiasing
is enabled.
  • Loading branch information
nyalldawson committed Nov 7, 2021
1 parent a119884 commit 294282c
Show file tree
Hide file tree
Showing 18 changed files with 45 additions and 12 deletions.
10 changes: 8 additions & 2 deletions python/core/auto_additions/qgis.py
Expand Up @@ -825,7 +825,10 @@
QgsMapSettings.Render3DMap = Qgis.MapSettingsFlag.Render3DMap
QgsMapSettings.Render3DMap.is_monkey_patched = True
QgsMapSettings.Render3DMap.__doc__ = "Render is for a 3D map"
Qgis.MapSettingsFlag.__doc__ = 'Flags which adjust the way maps are rendered.\n\n.. versionadded:: 3.22\n\n' + '* ``Antialiasing``: ' + Qgis.MapSettingsFlag.Antialiasing.__doc__ + '\n' + '* ``DrawEditingInfo``: ' + Qgis.MapSettingsFlag.DrawEditingInfo.__doc__ + '\n' + '* ``ForceVectorOutput``: ' + Qgis.MapSettingsFlag.ForceVectorOutput.__doc__ + '\n' + '* ``UseAdvancedEffects``: ' + Qgis.MapSettingsFlag.UseAdvancedEffects.__doc__ + '\n' + '* ``DrawLabeling``: ' + Qgis.MapSettingsFlag.DrawLabeling.__doc__ + '\n' + '* ``UseRenderingOptimization``: ' + Qgis.MapSettingsFlag.UseRenderingOptimization.__doc__ + '\n' + '* ``DrawSelection``: ' + Qgis.MapSettingsFlag.DrawSelection.__doc__ + '\n' + '* ``DrawSymbolBounds``: ' + Qgis.MapSettingsFlag.DrawSymbolBounds.__doc__ + '\n' + '* ``RenderMapTile``: ' + Qgis.MapSettingsFlag.RenderMapTile.__doc__ + '\n' + '* ``RenderPartialOutput``: ' + Qgis.MapSettingsFlag.RenderPartialOutput.__doc__ + '\n' + '* ``RenderPreviewJob``: ' + Qgis.MapSettingsFlag.RenderPreviewJob.__doc__ + '\n' + '* ``RenderBlocking``: ' + Qgis.MapSettingsFlag.RenderBlocking.__doc__ + '\n' + '* ``LosslessImageRendering``: ' + Qgis.MapSettingsFlag.LosslessImageRendering.__doc__ + '\n' + '* ``Render3DMap``: ' + Qgis.MapSettingsFlag.Render3DMap.__doc__
QgsMapSettings.HighQualityImageTransforms = Qgis.MapSettingsFlag.HighQualityImageTransforms
QgsMapSettings.HighQualityImageTransforms.is_monkey_patched = True
QgsMapSettings.HighQualityImageTransforms.__doc__ = "Enable high quality image transformations, which results in better appearance of scaled or rotated raster components of a map (since QGIS 3.24)"
Qgis.MapSettingsFlag.__doc__ = 'Flags which adjust the way maps are rendered.\n\n.. versionadded:: 3.22\n\n' + '* ``Antialiasing``: ' + Qgis.MapSettingsFlag.Antialiasing.__doc__ + '\n' + '* ``DrawEditingInfo``: ' + Qgis.MapSettingsFlag.DrawEditingInfo.__doc__ + '\n' + '* ``ForceVectorOutput``: ' + Qgis.MapSettingsFlag.ForceVectorOutput.__doc__ + '\n' + '* ``UseAdvancedEffects``: ' + Qgis.MapSettingsFlag.UseAdvancedEffects.__doc__ + '\n' + '* ``DrawLabeling``: ' + Qgis.MapSettingsFlag.DrawLabeling.__doc__ + '\n' + '* ``UseRenderingOptimization``: ' + Qgis.MapSettingsFlag.UseRenderingOptimization.__doc__ + '\n' + '* ``DrawSelection``: ' + Qgis.MapSettingsFlag.DrawSelection.__doc__ + '\n' + '* ``DrawSymbolBounds``: ' + Qgis.MapSettingsFlag.DrawSymbolBounds.__doc__ + '\n' + '* ``RenderMapTile``: ' + Qgis.MapSettingsFlag.RenderMapTile.__doc__ + '\n' + '* ``RenderPartialOutput``: ' + Qgis.MapSettingsFlag.RenderPartialOutput.__doc__ + '\n' + '* ``RenderPreviewJob``: ' + Qgis.MapSettingsFlag.RenderPreviewJob.__doc__ + '\n' + '* ``RenderBlocking``: ' + Qgis.MapSettingsFlag.RenderBlocking.__doc__ + '\n' + '* ``LosslessImageRendering``: ' + Qgis.MapSettingsFlag.LosslessImageRendering.__doc__ + '\n' + '* ``Render3DMap``: ' + Qgis.MapSettingsFlag.Render3DMap.__doc__ + '\n' + '* ``HighQualityImageTransforms``: ' + Qgis.MapSettingsFlag.HighQualityImageTransforms.__doc__
# --
QgsMapSettings.Flags = Qgis.MapSettingsFlags
Qgis.MapSettingsFlag.baseClass = Qgis
Expand Down Expand Up @@ -882,7 +885,10 @@
QgsRenderContext.RenderingSubSymbol = Qgis.RenderContextFlag.RenderingSubSymbol
QgsRenderContext.RenderingSubSymbol.is_monkey_patched = True
QgsRenderContext.RenderingSubSymbol.__doc__ = "Set whenever a sub-symbol of a parent symbol is currently being rendered. Can be used during symbol and symbol layer rendering to determine whether the symbol being rendered is a subsymbol. (Since QGIS 3.24)"
Qgis.RenderContextFlag.__doc__ = 'Flags which affect rendering operations.\n\n.. versionadded:: 3.22\n\n' + '* ``DrawEditingInfo``: ' + Qgis.RenderContextFlag.DrawEditingInfo.__doc__ + '\n' + '* ``ForceVectorOutput``: ' + Qgis.RenderContextFlag.ForceVectorOutput.__doc__ + '\n' + '* ``UseAdvancedEffects``: ' + Qgis.RenderContextFlag.UseAdvancedEffects.__doc__ + '\n' + '* ``UseRenderingOptimization``: ' + Qgis.RenderContextFlag.UseRenderingOptimization.__doc__ + '\n' + '* ``DrawSelection``: ' + Qgis.RenderContextFlag.DrawSelection.__doc__ + '\n' + '* ``DrawSymbolBounds``: ' + Qgis.RenderContextFlag.DrawSymbolBounds.__doc__ + '\n' + '* ``RenderMapTile``: ' + Qgis.RenderContextFlag.RenderMapTile.__doc__ + '\n' + '* ``Antialiasing``: ' + Qgis.RenderContextFlag.Antialiasing.__doc__ + '\n' + '* ``RenderPartialOutput``: ' + Qgis.RenderContextFlag.RenderPartialOutput.__doc__ + '\n' + '* ``RenderPreviewJob``: ' + Qgis.RenderContextFlag.RenderPreviewJob.__doc__ + '\n' + '* ``RenderBlocking``: ' + Qgis.RenderContextFlag.RenderBlocking.__doc__ + '\n' + '* ``RenderSymbolPreview``: ' + Qgis.RenderContextFlag.RenderSymbolPreview.__doc__ + '\n' + '* ``LosslessImageRendering``: ' + Qgis.RenderContextFlag.LosslessImageRendering.__doc__ + '\n' + '* ``ApplyScalingWorkaroundForTextRendering``: ' + Qgis.RenderContextFlag.ApplyScalingWorkaroundForTextRendering.__doc__ + '\n' + '* ``Render3DMap``: ' + Qgis.RenderContextFlag.Render3DMap.__doc__ + '\n' + '* ``ApplyClipAfterReprojection``: ' + Qgis.RenderContextFlag.ApplyClipAfterReprojection.__doc__ + '\n' + '* ``RenderingSubSymbol``: ' + Qgis.RenderContextFlag.RenderingSubSymbol.__doc__
QgsRenderContext.HighQualityImageTransforms = Qgis.RenderContextFlag.HighQualityImageTransforms
QgsRenderContext.HighQualityImageTransforms.is_monkey_patched = True
QgsRenderContext.HighQualityImageTransforms.__doc__ = "Enable high quality image transformations, which results in better appearance of scaled or rotated raster components of a map (since QGIS 3.24)"
Qgis.RenderContextFlag.__doc__ = 'Flags which affect rendering operations.\n\n.. versionadded:: 3.22\n\n' + '* ``DrawEditingInfo``: ' + Qgis.RenderContextFlag.DrawEditingInfo.__doc__ + '\n' + '* ``ForceVectorOutput``: ' + Qgis.RenderContextFlag.ForceVectorOutput.__doc__ + '\n' + '* ``UseAdvancedEffects``: ' + Qgis.RenderContextFlag.UseAdvancedEffects.__doc__ + '\n' + '* ``UseRenderingOptimization``: ' + Qgis.RenderContextFlag.UseRenderingOptimization.__doc__ + '\n' + '* ``DrawSelection``: ' + Qgis.RenderContextFlag.DrawSelection.__doc__ + '\n' + '* ``DrawSymbolBounds``: ' + Qgis.RenderContextFlag.DrawSymbolBounds.__doc__ + '\n' + '* ``RenderMapTile``: ' + Qgis.RenderContextFlag.RenderMapTile.__doc__ + '\n' + '* ``Antialiasing``: ' + Qgis.RenderContextFlag.Antialiasing.__doc__ + '\n' + '* ``RenderPartialOutput``: ' + Qgis.RenderContextFlag.RenderPartialOutput.__doc__ + '\n' + '* ``RenderPreviewJob``: ' + Qgis.RenderContextFlag.RenderPreviewJob.__doc__ + '\n' + '* ``RenderBlocking``: ' + Qgis.RenderContextFlag.RenderBlocking.__doc__ + '\n' + '* ``RenderSymbolPreview``: ' + Qgis.RenderContextFlag.RenderSymbolPreview.__doc__ + '\n' + '* ``LosslessImageRendering``: ' + Qgis.RenderContextFlag.LosslessImageRendering.__doc__ + '\n' + '* ``ApplyScalingWorkaroundForTextRendering``: ' + Qgis.RenderContextFlag.ApplyScalingWorkaroundForTextRendering.__doc__ + '\n' + '* ``Render3DMap``: ' + Qgis.RenderContextFlag.Render3DMap.__doc__ + '\n' + '* ``ApplyClipAfterReprojection``: ' + Qgis.RenderContextFlag.ApplyClipAfterReprojection.__doc__ + '\n' + '* ``RenderingSubSymbol``: ' + Qgis.RenderContextFlag.RenderingSubSymbol.__doc__ + '\n' + '* ``HighQualityImageTransforms``: ' + Qgis.RenderContextFlag.HighQualityImageTransforms.__doc__
# --
QgsRenderContext.Flags = Qgis.RenderContextFlags
Qgis.RenderContextFlag.baseClass = Qgis
Expand Down
2 changes: 2 additions & 0 deletions python/core/auto_generated/qgis.sip.in
Expand Up @@ -575,6 +575,7 @@ The development version
RenderBlocking,
LosslessImageRendering,
Render3DMap,
HighQualityImageTransforms,
};
typedef QFlags<Qgis::MapSettingsFlag> MapSettingsFlags;

Expand All @@ -598,6 +599,7 @@ The development version
Render3DMap,
ApplyClipAfterReprojection,
RenderingSubSymbol,
HighQualityImageTransforms,
};
typedef QFlags<Qgis::RenderContextFlag> RenderContextFlags;

Expand Down
1 change: 1 addition & 0 deletions src/analysis/processing/qgsalgorithmrasterize.cpp
Expand Up @@ -197,6 +197,7 @@ QVariantMap QgsRasterizeAlgorithm::processAlgorithm( const QVariantMap &paramete
mapSettings.setOutputImageFormat( QImage::Format_ARGB32 );
mapSettings.setDestinationCrs( context.project()->crs() );
mapSettings.setFlag( Qgis::MapSettingsFlag::Antialiasing, true );
mapSettings.setFlag( Qgis::MapSettingsFlag::HighQualityImageTransforms, true );
mapSettings.setFlag( Qgis::MapSettingsFlag::RenderMapTile, true );
mapSettings.setFlag( Qgis::MapSettingsFlag::UseAdvancedEffects, true );
mapSettings.setTransformContext( context.transformContext() );
Expand Down
1 change: 1 addition & 0 deletions src/app/qgsanimationexportdialog.cpp
Expand Up @@ -241,6 +241,7 @@ void QgsAnimationExportDialog::applyMapSettings( QgsMapSettings &mapSettings )
const QgsSettings settings;

mapSettings.setFlag( Qgis::MapSettingsFlag::Antialiasing, settings.value( QStringLiteral( "qgis/enable_anti_aliasing" ), true ).toBool() );
mapSettings.setFlag( Qgis::MapSettingsFlag::HighQualityImageTransforms, settings.value( QStringLiteral( "qgis/enable_anti_aliasing" ), true ).toBool() );
mapSettings.setFlag( Qgis::MapSettingsFlag::DrawEditingInfo, false );
mapSettings.setFlag( Qgis::MapSettingsFlag::DrawSelection, false );
mapSettings.setSelectionColor( mMapCanvas->mapSettings().selectionColor() );
Expand Down
2 changes: 2 additions & 0 deletions src/app/qgsmapsavedialog.cpp
Expand Up @@ -319,10 +319,12 @@ void QgsMapSaveDialog::applyMapSettings( QgsMapSettings &mapSettings )
{
case Pdf:
mapSettings.setFlag( Qgis::MapSettingsFlag::Antialiasing, true ); // hardcode antialiasing when saving as PDF
mapSettings.setFlag( Qgis::MapSettingsFlag::HighQualityImageTransforms, true ); // hardcode antialiasing when saving as PDF
break;

case Image:
mapSettings.setFlag( Qgis::MapSettingsFlag::Antialiasing, settings.value( QStringLiteral( "qgis/enable_anti_aliasing" ), true ).toBool() );
mapSettings.setFlag( Qgis::MapSettingsFlag::HighQualityImageTransforms, settings.value( QStringLiteral( "qgis/enable_anti_aliasing" ), true ).toBool() );
break;
}
mapSettings.setFlag( Qgis::MapSettingsFlag::ForceVectorOutput, true ); // force vector output (no caching of marker images etc.)
Expand Down
1 change: 1 addition & 0 deletions src/core/layout/qgslayoutitemmap.cpp
Expand Up @@ -1531,6 +1531,7 @@ QgsMapSettings QgsLayoutItemMap::mapSettings( const QgsRectangle &extent, QSizeF
// layout-specific overrides of flags
jobMapSettings.setFlag( Qgis::MapSettingsFlag::ForceVectorOutput, true ); // force vector output (no caching of marker images etc.)
jobMapSettings.setFlag( Qgis::MapSettingsFlag::Antialiasing, mLayout->renderContext().flags() & QgsLayoutRenderContext::FlagAntialiasing );
jobMapSettings.setFlag( Qgis::MapSettingsFlag::HighQualityImageTransforms, mLayout->renderContext().flags() & QgsLayoutRenderContext::FlagAntialiasing );
jobMapSettings.setFlag( Qgis::MapSettingsFlag::LosslessImageRendering, mLayout->renderContext().flags() & QgsLayoutRenderContext::FlagLosslessImageRendering );
jobMapSettings.setFlag( Qgis::MapSettingsFlag::DrawEditingInfo, false );
jobMapSettings.setSelectionColor( mLayout->renderContext().selectionColor() );
Expand Down
3 changes: 3 additions & 0 deletions src/core/layout/qgslayoutrendercontext.cpp
Expand Up @@ -63,7 +63,10 @@ Qgis::RenderContextFlags QgsLayoutRenderContext::renderContextFlags() const
{
Qgis::RenderContextFlags flags = Qgis::RenderContextFlags();
if ( mFlags & FlagAntialiasing )
{
flags = flags | Qgis::RenderContextFlag::Antialiasing;
flags = flags | Qgis::RenderContextFlag::HighQualityImageTransforms;
}
if ( mFlags & FlagUseAdvancedEffects )
flags = flags | Qgis::RenderContextFlag::UseAdvancedEffects;
if ( mFlags & FlagLosslessImageRendering )
Expand Down
1 change: 1 addition & 0 deletions src/core/maprenderer/qgsmaprenderercustompainterjob.cpp
Expand Up @@ -40,6 +40,7 @@ void QgsMapRendererAbstractCustomPainterJob::preparePainter( QPainter *painter,
painter->fillRect( 0, 0, mSettings.deviceOutputSize().width(), mSettings.deviceOutputSize().height(), backgroundColor );

painter->setRenderHint( QPainter::Antialiasing, mSettings.testFlag( Qgis::MapSettingsFlag::Antialiasing ) );
painter->setRenderHint( QPainter::SmoothPixmapTransform, mSettings.testFlag( Qgis::MapSettingsFlag::HighQualityImageTransforms ) );
#if QT_VERSION >= QT_VERSION_CHECK(5, 13, 0)
painter->setRenderHint( QPainter::LosslessImageRendering, mSettings.testFlag( Qgis::MapSettingsFlag::LosslessImageRendering ) );
#endif
Expand Down
1 change: 1 addition & 0 deletions src/core/maprenderer/qgsmaprendererjob.cpp
Expand Up @@ -390,6 +390,7 @@ QPainter *QgsMapRendererJob::allocateImageAndPainter( QString layerId, QImage *&
{
painter = new QPainter( image );
painter->setRenderHint( QPainter::Antialiasing, mSettings.testFlag( Qgis::MapSettingsFlag::Antialiasing ) );
painter->setRenderHint( QPainter::SmoothPixmapTransform, mSettings.testFlag( Qgis::MapSettingsFlag::HighQualityImageTransforms ) );
#if QT_VERSION >= QT_VERSION_CHECK(5, 13, 0)
painter->setRenderHint( QPainter::LosslessImageRendering, mSettings.testFlag( Qgis::MapSettingsFlag::LosslessImageRendering ) );
#endif
Expand Down
2 changes: 2 additions & 0 deletions src/core/qgis.h
Expand Up @@ -933,6 +933,7 @@ class CORE_EXPORT Qgis
RenderBlocking = 0x800, //!< Render and load remote sources in the same thread to ensure rendering remote sources (svg and images). WARNING: this flag must NEVER be used from GUI based applications (like the main QGIS application) or crashes will result. Only for use in external scripts or QGIS server.
LosslessImageRendering = 0x1000, //!< Render images losslessly whenever possible, instead of the default lossy jpeg rendering used for some destination devices (e.g. PDF). This flag only works with builds based on Qt 5.13 or later.
Render3DMap = 0x2000, //!< Render is for a 3D map
HighQualityImageTransforms = 0x4000, //!< Enable high quality image transformations, which results in better appearance of scaled or rotated raster components of a map (since QGIS 3.24)
};
//! Map settings flags
Q_DECLARE_FLAGS( MapSettingsFlags, MapSettingsFlag ) SIP_MONKEYPATCH_FLAGS_UNNEST( QgsMapSettings, Flags )
Expand Down Expand Up @@ -962,6 +963,7 @@ class CORE_EXPORT Qgis
Render3DMap = 0x4000, //!< Render is for a 3D map
ApplyClipAfterReprojection = 0x8000, //!< Feature geometry clipping to mapExtent() must be performed after the geometries are transformed using coordinateTransform(). Usually feature geometry clipping occurs using the extent() in the layer's CRS prior to geometry transformation, but in some cases when extent() could not be accurately calculated it is necessary to clip geometries to mapExtent() AFTER transforming them using coordinateTransform().
RenderingSubSymbol = 0x10000, //!< Set whenever a sub-symbol of a parent symbol is currently being rendered. Can be used during symbol and symbol layer rendering to determine whether the symbol being rendered is a subsymbol. (Since QGIS 3.24)
HighQualityImageTransforms = 0x20000, //!< Enable high quality image transformations, which results in better appearance of scaled or rotated raster components of a map (since QGIS 3.24)
};
//! Render context flags
Q_DECLARE_FLAGS( RenderContextFlags, RenderContextFlag ) SIP_MONKEYPATCH_FLAGS_UNNEST( QgsRenderContext, Flags )
Expand Down
4 changes: 4 additions & 0 deletions src/core/qgsrendercontext.cpp
Expand Up @@ -145,6 +145,8 @@ QgsRenderContext QgsRenderContext::fromQPainter( QPainter *painter )

if ( painter && painter->renderHints() & QPainter::Antialiasing )
context.setFlag( Qgis::RenderContextFlag::Antialiasing, true );
if ( painter && painter->renderHints() & QPainter::SmoothPixmapTransform )
context.setFlag( Qgis::RenderContextFlag::HighQualityImageTransforms, true );

#if QT_VERSION >= QT_VERSION_CHECK(5, 13, 0)
if ( painter && painter->renderHints() & QPainter::LosslessImageRendering )
Expand All @@ -166,6 +168,7 @@ void QgsRenderContext::setPainterFlagsUsingContext( QPainter *painter ) const
#if QT_VERSION >= QT_VERSION_CHECK(5, 13, 0)
painter->setRenderHint( QPainter::LosslessImageRendering, mFlags & Qgis::RenderContextFlag::LosslessImageRendering );
#endif
painter->setRenderHint( QPainter::SmoothPixmapTransform, mFlags & Qgis::RenderContextFlag::HighQualityImageTransforms );
}

QgsCoordinateTransformContext QgsRenderContext::transformContext() const
Expand Down Expand Up @@ -241,6 +244,7 @@ QgsRenderContext QgsRenderContext::fromMapSettings( const QgsMapSettings &mapSet
ctx.setFlag( Qgis::RenderContextFlag::RenderBlocking, mapSettings.testFlag( Qgis::MapSettingsFlag::RenderBlocking ) );
ctx.setFlag( Qgis::RenderContextFlag::LosslessImageRendering, mapSettings.testFlag( Qgis::MapSettingsFlag::LosslessImageRendering ) );
ctx.setFlag( Qgis::RenderContextFlag::Render3DMap, mapSettings.testFlag( Qgis::MapSettingsFlag::Render3DMap ) );
ctx.setFlag( Qgis::RenderContextFlag::HighQualityImageTransforms, mapSettings.testFlag( Qgis::MapSettingsFlag::HighQualityImageTransforms ) );
ctx.setScaleFactor( mapSettings.outputDpi() / 25.4 ); // = pixels per mm
ctx.setDpiTarget( mapSettings.dpiTarget() >= 0.0 ? mapSettings.dpiTarget() : -1.0 );
ctx.setRendererScale( mapSettings.scale() );
Expand Down
4 changes: 0 additions & 4 deletions src/core/symbology/qgsfillsymbollayer.cpp
Expand Up @@ -3711,10 +3711,6 @@ void QgsPointPatternFillSymbolLayer::applyPattern( const QgsSymbolRenderContext
pointRenderContext.setPainter( &p );
pointRenderContext.setScaleFactor( context.renderContext().scaleFactor() );

if ( context.renderContext().flags() & Qgis::RenderContextFlag::Antialiasing )
pointRenderContext.setFlag( Qgis::RenderContextFlag::Antialiasing, true );
pointRenderContext.setFlag( Qgis::RenderContextFlag::LosslessImageRendering, context.renderContext().flags() & Qgis::RenderContextFlag::LosslessImageRendering );

context.renderContext().setPainterFlagsUsingContext( &p );
QgsMapToPixel mtp( context.renderContext().mapToPixel().mapUnitsPerPixel() );
pointRenderContext.setMapToPixel( mtp );
Expand Down
3 changes: 1 addition & 2 deletions src/core/symbology/qgslinesymbollayer.cpp
Expand Up @@ -2956,8 +2956,7 @@ void QgsAbstractBrushedLineSymbolLayer::renderLine( const QPolygonF &points, Qgs
// prepare temporary image
QPainter imagePainter;
imagePainter.begin( &temporaryImage );
imagePainter.setRenderHint( QPainter::Antialiasing, true );
imagePainter.setRenderHint( QPainter::SmoothPixmapTransform, true );
context.renderContext().setPainterFlagsUsingContext( &imagePainter );
imagePainter.translate( -minX + lineThickness + ANTIALIAS_ALLOWANCE_PIXELS, -minY + lineThickness + ANTIALIAS_ALLOWANCE_PIXELS );

imagePainter.setClipPath( stroke, Qt::IntersectClip );
Expand Down
3 changes: 0 additions & 3 deletions src/core/symbology/qgsmarkersymbollayer.cpp
Expand Up @@ -2972,10 +2972,7 @@ void QgsRasterMarkerSymbolLayer::renderPoint( QPointF point, QgsSymbolRenderCont
if ( context.selected() )
QgsImageOperation::adjustHueSaturation( img, 1.0, context.renderContext().selectionColor(), 1.0, context.renderContext().feedback() );

const bool prevSmoothTransform = p->testRenderHint( QPainter::RenderHint::SmoothPixmapTransform );
p->setRenderHint( QPainter::RenderHint::SmoothPixmapTransform, true );
p->drawImage( -img.width() / 2.0, -img.height() / 2.0, img );
p->setRenderHint( QPainter::RenderHint::SmoothPixmapTransform, prevSmoothTransform );
}
}

Expand Down
4 changes: 4 additions & 0 deletions src/core/symbology/qgssymbol.cpp
Expand Up @@ -683,6 +683,7 @@ QImage QgsSymbol::asImage( QSize size, QgsRenderContext *customContext )

QPainter p( &image );
p.setRenderHint( QPainter::Antialiasing );
p.setRenderHint( QPainter::SmoothPixmapTransform );

drawPreviewIcon( &p, size, customContext );

Expand All @@ -708,6 +709,9 @@ QImage QgsSymbol::bigSymbolPreviewImage( QgsExpressionContext *expressionContext

QgsRenderContext context = QgsRenderContext::fromQPainter( &p );
context.setFlag( Qgis::RenderContextFlag::RenderSymbolPreview );
context.setFlag( Qgis::RenderContextFlag::Antialiasing );
context.setFlag( Qgis::RenderContextFlag::HighQualityImageTransforms );
context.setPainterFlagsUsingContext( &p );
if ( expressionContext )
context.setExpressionContext( *expressionContext );

Expand Down

0 comments on commit 294282c

Please sign in to comment.