Skip to content

Commit 632edab

Browse files
authoredMar 6, 2023
Merge pull request #52015 from signedav/legend_fix
Fix inconcequent use of DPI at generating the WMS legend
2 parents 4d78e34 + a850194 commit 632edab

File tree

103 files changed

+2235
-54
lines changed

Some content is hidden

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

103 files changed

+2235
-54
lines changed
 

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

Lines changed: 44 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -127,27 +127,44 @@ namespace QgsWms
127127
QgsLegendSettings settings = legendSettings();
128128
QgsLegendRenderer renderer( &model, settings );
129129

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

141-
// configure painter
157+
// configure painter and addapt to the context
142158
QPainter painter( image.get() );
143-
QgsRenderContext context = QgsRenderContext::fromQPainter( &painter );
159+
160+
context.setPainter( &painter );
161+
if ( painter.renderHints() & QPainter::SmoothPixmapTransform )
162+
context.setFlag( Qgis::RenderContextFlag::HighQualityImageTransforms, true );
163+
if ( painter.renderHints() & QPainter::LosslessImageRendering )
164+
context.setFlag( Qgis::RenderContextFlag::LosslessImageRendering, true );
165+
144166
context.setFlag( Qgis::RenderContextFlag::Antialiasing, true );
145167
QgsScopedRenderContextScaleToMm scaleContext( context );
146-
// QGIS 4.0 -- take from real render context instead
147-
Q_NOWARN_DEPRECATED_PUSH
148-
context.setRendererScale( settings.mapScale() );
149-
context.setMapToPixel( QgsMapToPixel( 1 / ( settings.mmPerMapUnit() * context.scaleFactor() ) ) );
150-
Q_NOWARN_DEPRECATED_POP
151168

152169
// rendering
153170
renderer.drawLegend( context );
@@ -186,6 +203,11 @@ namespace QgsWms
186203
QgsLegendSettings settings = legendSettings();
187204
QgsLayerTreeModelLegendNode::ItemContext ctx;
188205
ctx.painter = painter.get();
206+
207+
// create context
208+
QgsRenderContext context = configureDefaultRenderContext( painter.get() );
209+
ctx.context = &context;
210+
189211
nodeModel.drawSymbol( settings, &ctx, size.height() / dpmm );
190212
painter->end();
191213

@@ -1353,6 +1375,19 @@ namespace QgsWms
13531375
}
13541376
}
13551377

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

‎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.