Skip to content
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.

Commit 86e655d

Browse files
authoredMar 11, 2023
Merge pull request #52147 from qgis/backport-52015-to-queued_ltr_backports
[Backport queued_ltr_backports] Fix inconcequent use of DPI at generating the WMS legend
2 parents 086bd5c + 3b5a822 commit 86e655d

File tree

144 files changed

+2227
-48
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

144 files changed

+2227
-48
lines changed
 

‎src/server/services/wms/qgswmsrenderer.cpp

Lines changed: 44 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -132,27 +132,44 @@ namespace QgsWms
132132
QgsLegendSettings settings = legendSettings();
133133
QgsLegendRenderer renderer( &model, settings );
134134

135-
// create image
135+
// create context
136+
QgsRenderContext context;
137+
if ( !mWmsParameters.bbox().isEmpty() )
138+
{
139+
QgsMapSettings mapSettings;
140+
mapSettings.setFlag( Qgis::MapSettingsFlag::RenderBlocking );
141+
std::unique_ptr<QImage> tmp( createImage( mContext.mapSize( false ) ) );
142+
configureMapSettings( tmp.get(), mapSettings );
143+
context = QgsRenderContext::fromMapSettings( mapSettings );
144+
}
145+
else
146+
{
147+
//use default scale settings
148+
context = configureDefaultRenderContext();
149+
}
150+
151+
// create image according to context
136152
std::unique_ptr<QImage> image;
137153
const qreal dpmm = mContext.dotsPerMm();
138-
const QSizeF minSize = renderer.minimumSize();
154+
const QSizeF minSize = renderer.minimumSize( &context );
139155
const QSize size( static_cast<int>( minSize.width() * dpmm ), static_cast<int>( minSize.height() * dpmm ) );
140156
if ( !mContext.isValidWidthHeight( size.width(), size.height() ) )
141157
{
142158
throw QgsServerException( QStringLiteral( "Legend image is too large" ) );
143159
}
144160
image.reset( createImage( size ) );
145161

146-
// configure painter
162+
// configure painter and addapt to the context
147163
QPainter painter( image.get() );
148-
QgsRenderContext context = QgsRenderContext::fromQPainter( &painter );
164+
165+
context.setPainter( &painter );
166+
if ( painter.renderHints() & QPainter::SmoothPixmapTransform )
167+
context.setFlag( Qgis::RenderContextFlag::HighQualityImageTransforms, true );
168+
if ( painter.renderHints() & QPainter::LosslessImageRendering )
169+
context.setFlag( Qgis::RenderContextFlag::LosslessImageRendering, true );
170+
149171
context.setFlag( Qgis::RenderContextFlag::Antialiasing, true );
150172
QgsScopedRenderContextScaleToMm scaleContext( context );
151-
// QGIS 4.0 -- take from real render context instead
152-
Q_NOWARN_DEPRECATED_PUSH
153-
context.setRendererScale( settings.mapScale() );
154-
context.setMapToPixel( QgsMapToPixel( 1 / ( settings.mmPerMapUnit() * context.scaleFactor() ) ) );
155-
Q_NOWARN_DEPRECATED_POP
156173

157174
// rendering
158175
renderer.drawLegend( context );
@@ -191,6 +208,11 @@ namespace QgsWms
191208
QgsLegendSettings settings = legendSettings();
192209
QgsLayerTreeModelLegendNode::ItemContext ctx;
193210
ctx.painter = painter.get();
211+
212+
// create context
213+
QgsRenderContext context = configureDefaultRenderContext( painter.get() );
214+
ctx.context = &context;
215+
194216
nodeModel.drawSymbol( settings, &ctx, size.height() / dpmm );
195217
painter->end();
196218

@@ -1358,6 +1380,19 @@ namespace QgsWms
13581380
}
13591381
}
13601382

1383+
QgsRenderContext QgsRenderer::configureDefaultRenderContext( QPainter *painter )
1384+
{
1385+
QgsRenderContext context = QgsRenderContext::fromQPainter( painter );
1386+
context.setScaleFactor( mContext.dotsPerMm() );
1387+
const double mmPerMapUnit = 1 / QgsServerProjectUtils::wmsDefaultMapUnitsPerMm( *mProject );
1388+
context.setMapToPixel( QgsMapToPixel( 1 / ( mmPerMapUnit * context.scaleFactor() ) ) );
1389+
QgsDistanceArea distanceArea = QgsDistanceArea();
1390+
distanceArea.setSourceCrs( QgsCoordinateReferenceSystem( mWmsParameters.crs() ), mProject->transformContext() );
1391+
distanceArea.setEllipsoid( geoNone() );
1392+
context.setDistanceArea( distanceArea );
1393+
return context;
1394+
}
1395+
13611396
QDomDocument QgsRenderer::featureInfoDocument( QList<QgsMapLayer *> &layers, const QgsMapSettings &mapSettings,
13621397
const QImage *outputImage, const QString &version ) const
13631398
{

‎src/server/services/wms/qgswmsrenderer.h

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -195,6 +195,14 @@ namespace QgsWms
195195
*/
196196
void configureMapSettings( const QPaintDevice *paintDevice, QgsMapSettings &mapSettings, bool mandatoryCrsParam = true );
197197

198+
/**
199+
* Configures QgsRenderContext according to the WMS parameters and default settings as well as the passed painter.
200+
* Used, for example, when no mapSettings are available.
201+
* \param painter to create the context from
202+
* \returns the renderer context with default parameters and settings of the passed painter
203+
*/
204+
QgsRenderContext configureDefaultRenderContext( QPainter *painter = nullptr );
205+
198206
QDomDocument featureInfoDocument( QList<QgsMapLayer *> &layers, const QgsMapSettings &mapSettings,
199207
const QImage *outputImage, const QString &version ) const;
200208

0 commit comments

Comments
 (0)
Please sign in to comment.