Skip to content

Commit f5876ea

Browse files
committedJan 18, 2018
[layouts] Don't needlessly calculate layer sets for maps linked
to a map theme This is very expensive to do, so avoid calculating it as much as possible Refs #17027
1 parent a09cb6f commit f5876ea

File tree

5 files changed

+35
-24
lines changed

5 files changed

+35
-24
lines changed
 

‎python/core/layout/qgslayoutitemmap.sip.in

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -458,9 +458,13 @@ This is calculated using the width of the map item and the width of the
458458
current visible map extent.
459459
%End
460460

461-
QgsMapSettings mapSettings( const QgsRectangle &extent, QSizeF size, double dpi ) const;
461+
QgsMapSettings mapSettings( const QgsRectangle &extent, QSizeF size, double dpi, bool includeLayerSettings ) const;
462462
%Docstring
463463
Return map settings that will be used for drawing of the map.
464+
465+
If ``includeLayerSettings`` is true, than settings specifically relating to map layers and map layer styles
466+
will be calculated. This can be expensive to calculate, so if they are not required in the map settings
467+
(e.g. for map settings which are used for scale related calculations only) then ``includeLayerSettings`` should be false.
464468
%End
465469

466470
virtual void finalizeRestoreFromXml();

‎src/core/layout/qgslayoutitemlegend.cpp

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -89,7 +89,7 @@ void QgsLayoutItemLegend::paint( QPainter *painter, const QStyleOptionGraphicsIt
8989
QSizeF mapSizePixels = QSizeF( mMap->rect().width() * dotsPerMM, mMap->rect().height() * dotsPerMM );
9090
QgsRectangle mapExtent = mMap->extent();
9191

92-
QgsMapSettings ms = mMap->mapSettings( mapExtent, mapSizePixels, dpi );
92+
QgsMapSettings ms = mMap->mapSettings( mapExtent, mapSizePixels, dpi, false );
9393
mSettings.setMapScale( ms.scale() );
9494
}
9595
mInitialMapScaleCalculated = true;
@@ -761,7 +761,7 @@ void QgsLayoutItemLegend::doUpdateFilterByMap()
761761
QSizeF size( requestRectangle.width(), requestRectangle.height() );
762762
size *= mLayout->convertFromLayoutUnits( mMap->mapUnitsToLayoutUnits(), QgsUnitTypes::LayoutMillimeters ).length() * dpi / 25.4;
763763

764-
QgsMapSettings ms = mMap->mapSettings( requestRectangle, size, dpi );
764+
QgsMapSettings ms = mMap->mapSettings( requestRectangle, size, dpi, true );
765765

766766
QgsGeometry filterPolygon;
767767
if ( mInAtlas )

‎src/core/layout/qgslayoutitemmap.cpp

Lines changed: 22 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -960,7 +960,7 @@ void QgsLayoutItemMap::drawMap( QPainter *painter, const QgsRectangle &extent, Q
960960
}
961961

962962
// render
963-
QgsMapRendererCustomPainterJob job( mapSettings( extent, size, dpi ), painter );
963+
QgsMapRendererCustomPainterJob job( mapSettings( extent, size, dpi, true ), painter );
964964
// Render the map in this thread. This is done because of problems
965965
// with printing to printer on Windows (printing to PDF is fine though).
966966
// Raster images were not displayed - see #10599
@@ -1037,13 +1037,13 @@ void QgsLayoutItemMap::recreateCachedImageInBackground( double viewScaleFactor )
10371037

10381038
mCacheInvalidated = false;
10391039
mPainter.reset( new QPainter( mCacheRenderingImage.get() ) );
1040-
QgsMapSettings settings( mapSettings( ext, QSizeF( w, h ), mCacheRenderingImage->logicalDpiX() ) );
1040+
QgsMapSettings settings( mapSettings( ext, QSizeF( w, h ), mCacheRenderingImage->logicalDpiX(), true ) );
10411041
mPainterJob.reset( new QgsMapRendererCustomPainterJob( settings, mPainter.get() ) );
10421042
connect( mPainterJob.get(), &QgsMapRendererCustomPainterJob::finished, this, &QgsLayoutItemMap::painterJobFinished );
10431043
mPainterJob->start();
10441044
}
10451045

1046-
QgsMapSettings QgsLayoutItemMap::mapSettings( const QgsRectangle &extent, QSizeF size, double dpi ) const
1046+
QgsMapSettings QgsLayoutItemMap::mapSettings( const QgsRectangle &extent, QSizeF size, double dpi, bool includeLayerSettings ) const
10471047
{
10481048
QgsExpressionContext expressionContext = createExpressionContext();
10491049
QgsCoordinateReferenceSystem renderCrs = crs();
@@ -1058,26 +1058,29 @@ QgsMapSettings QgsLayoutItemMap::mapSettings( const QgsRectangle &extent, QSizeF
10581058
if ( mLayout )
10591059
jobMapSettings.setEllipsoid( mLayout->project()->ellipsoid() );
10601060

1061-
//set layers to render
1062-
QList<QgsMapLayer *> layers = layersToRender( &expressionContext );
1063-
if ( mLayout && -1 != mLayout->renderContext().currentExportLayer() )
1061+
if ( includeLayerSettings )
10641062
{
1065-
const int layerIdx = mLayout->renderContext().currentExportLayer() - ( hasBackground() ? 1 : 0 );
1066-
if ( layerIdx >= 0 && layerIdx < layers.length() )
1063+
//set layers to render
1064+
QList<QgsMapLayer *> layers = layersToRender( &expressionContext );
1065+
if ( mLayout && -1 != mLayout->renderContext().currentExportLayer() )
10671066
{
1068-
// exporting with separate layers (e.g., to svg layers), so we only want to render a single map layer
1069-
QgsMapLayer *ml = layers[ layers.length() - layerIdx - 1 ];
1070-
layers.clear();
1071-
layers << ml;
1072-
}
1073-
else
1074-
{
1075-
// exporting decorations such as map frame/grid/overview, so no map layers required
1076-
layers.clear();
1067+
const int layerIdx = mLayout->renderContext().currentExportLayer() - ( hasBackground() ? 1 : 0 );
1068+
if ( layerIdx >= 0 && layerIdx < layers.length() )
1069+
{
1070+
// exporting with separate layers (e.g., to svg layers), so we only want to render a single map layer
1071+
QgsMapLayer *ml = layers[ layers.length() - layerIdx - 1 ];
1072+
layers.clear();
1073+
layers << ml;
1074+
}
1075+
else
1076+
{
1077+
// exporting decorations such as map frame/grid/overview, so no map layers required
1078+
layers.clear();
1079+
}
10771080
}
1081+
jobMapSettings.setLayers( layers );
1082+
jobMapSettings.setLayerStyleOverrides( layerStyleOverridesToRender( expressionContext ) );
10781083
}
1079-
jobMapSettings.setLayers( layers );
1080-
jobMapSettings.setLayerStyleOverrides( layerStyleOverridesToRender( expressionContext ) );
10811084

10821085
if ( !mLayout->renderContext().isPreviewRender() )
10831086
{

‎src/core/layout/qgslayoutitemmap.h

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -408,8 +408,12 @@ class CORE_EXPORT QgsLayoutItemMap : public QgsLayoutItem
408408

409409
/**
410410
* Return map settings that will be used for drawing of the map.
411+
*
412+
* If \a includeLayerSettings is true, than settings specifically relating to map layers and map layer styles
413+
* will be calculated. This can be expensive to calculate, so if they are not required in the map settings
414+
* (e.g. for map settings which are used for scale related calculations only) then \a includeLayerSettings should be false.
411415
*/
412-
QgsMapSettings mapSettings( const QgsRectangle &extent, QSizeF size, double dpi ) const;
416+
QgsMapSettings mapSettings( const QgsRectangle &extent, QSizeF size, double dpi, bool includeLayerSettings ) const;
413417

414418
void finalizeRestoreFromXml() override;
415419

‎src/core/layout/qgslayoututils.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -123,7 +123,7 @@ QgsRenderContext QgsLayoutUtils::createRenderContextForMap( QgsLayoutItemMap *ma
123123
QgsRectangle extent = map->extent();
124124
QSizeF mapSizeLayoutUnits = map->rect().size();
125125
QSizeF mapSizeMM = map->layout()->convertFromLayoutUnits( mapSizeLayoutUnits, QgsUnitTypes::LayoutMillimeters ).toQSizeF();
126-
QgsMapSettings ms = map->mapSettings( extent, mapSizeMM * dotsPerMM, dpi );
126+
QgsMapSettings ms = map->mapSettings( extent, mapSizeMM * dotsPerMM, dpi, false );
127127
QgsRenderContext context = QgsRenderContext::fromMapSettings( ms );
128128
if ( painter )
129129
context.setPainter( painter );

0 commit comments

Comments
 (0)
Please sign in to comment.