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 bd095d0

Browse files
nirvngithub-actions[bot]
authored andcommittedMar 16, 2023
Better fix (faster rendering, works for PDF, better during progressive rendering)
1 parent 7f30d09 commit bd095d0

File tree

6 files changed

+45
-16
lines changed

6 files changed

+45
-16
lines changed
 

‎python/core/auto_generated/vectortile/qgsvectortilebasicrenderer.sip.in

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -161,6 +161,8 @@ Constructs renderer with no styles
161161

162162
virtual void stopRender( QgsRenderContext &context );
163163

164+
virtual void renderBackground( QgsRenderContext &context );
165+
164166
virtual void renderTile( const QgsVectorTileRendererData &tile, QgsRenderContext &context );
165167

166168
virtual void renderSelectedFeatures( const QList< QgsFeature > &selection, QgsRenderContext &context );

‎python/core/auto_generated/vectortile/qgsvectortilerenderer.sip.in

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -124,6 +124,11 @@ An empty string present in the list indicates that all layer in the tiles are re
124124
virtual void stopRender( QgsRenderContext &context ) = 0;
125125
%Docstring
126126
Finishes rendering and cleans up any resources
127+
%End
128+
129+
virtual void renderBackground( QgsRenderContext &context ) = 0;
130+
%Docstring
131+
Renders the background if defined
127132
%End
128133

129134
virtual void renderTile( const QgsVectorTileRendererData &tile, QgsRenderContext &context ) = 0;

‎src/core/vectortile/qgsvectortilebasicrenderer.cpp

Lines changed: 30 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -163,14 +163,42 @@ void QgsVectorTileBasicRenderer::stopRender( QgsRenderContext &context )
163163
Q_UNUSED( context )
164164
}
165165

166+
void QgsVectorTileBasicRenderer::renderBackground( QgsRenderContext &context )
167+
{
168+
for ( const QgsVectorTileBasicRendererStyle &layerStyle : std::as_const( mStyles ) )
169+
{
170+
if ( !layerStyle.symbol() || layerStyle.layerName() != QLatin1String( "background" ) )
171+
continue;
172+
173+
QgsExpression filterExpression( layerStyle.filterExpression() );
174+
filterExpression.prepare( &context.expressionContext() );
175+
176+
QgsSymbol *sym = layerStyle.symbol();
177+
sym->startRender( context, QgsFields() );
178+
179+
QgsFillSymbol *fillSym = dynamic_cast<QgsFillSymbol *>( sym );
180+
if ( fillSym )
181+
{
182+
QPolygon polygon;
183+
polygon << QPoint( 0, 0 );
184+
polygon << QPoint( 0, context.outputSize().height() );
185+
polygon << QPoint( context.outputSize().width(), context.outputSize().height() );
186+
polygon << QPoint( context.outputSize().width(), 0 );
187+
fillSym->renderPolygon( polygon, nullptr, nullptr, context );
188+
}
189+
sym->stopRender( context );
190+
break;
191+
}
192+
}
193+
166194
void QgsVectorTileBasicRenderer::renderTile( const QgsVectorTileRendererData &tile, QgsRenderContext &context )
167195
{
168196
const QgsVectorTileFeatures tileData = tile.features();
169197
int zoomLevel = tile.id().zoomLevel();
170198

171199
for ( const QgsVectorTileBasicRendererStyle &layerStyle : std::as_const( mStyles ) )
172200
{
173-
if ( !layerStyle.isActive( zoomLevel ) || !layerStyle.symbol() )
201+
if ( !layerStyle.isActive( zoomLevel ) || !layerStyle.symbol() || layerStyle.layerName() == QLatin1String( "background" ) )
174202
continue;
175203

176204
QgsExpressionContextScope *scope = new QgsExpressionContextScope( QObject::tr( "Layer" ) ); // will be deleted by popper
@@ -182,21 +210,7 @@ void QgsVectorTileBasicRenderer::renderTile( const QgsVectorTileRendererData &ti
182210

183211
QgsSymbol *sym = layerStyle.symbol();
184212
sym->startRender( context, QgsFields() );
185-
if ( layerStyle.layerName() == QLatin1String( "background" ) )
186-
{
187-
QgsFillSymbol *fillSym = dynamic_cast<QgsFillSymbol *>( sym );
188-
if ( fillSym )
189-
{
190-
QPolygon tilePolygon = tile.tilePolygon();
191-
// Order of points set in QgsVectorTileUtils::tilePolygon
192-
tilePolygon.setPoint( 0, QPoint( tilePolygon.point( 0 ).x() - 10, tilePolygon.point( 0 ).y() + 10 ) );
193-
tilePolygon.setPoint( 1, QPoint( tilePolygon.point( 1 ).x() - 10, tilePolygon.point( 1 ).y() - 10 ) );
194-
tilePolygon.setPoint( 2, QPoint( tilePolygon.point( 2 ).x() + 10, tilePolygon.point( 2 ).y() - 10 ) );
195-
tilePolygon.setPoint( 3, QPoint( tilePolygon.point( 3 ).x() + 10, tilePolygon.point( 3 ).y() + 10 ) );
196-
fillSym->renderPolygon( tilePolygon, nullptr, nullptr, context );
197-
}
198-
}
199-
else if ( layerStyle.layerName().isEmpty() )
213+
if ( layerStyle.layerName().isEmpty() )
200214
{
201215
// matching all layers
202216
for ( QString layerName : tileData.keys() )

‎src/core/vectortile/qgsvectortilebasicrenderer.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -136,6 +136,7 @@ class CORE_EXPORT QgsVectorTileBasicRenderer : public QgsVectorTileRenderer
136136
QMap<QString, QSet<QString> > usedAttributes( const QgsRenderContext & ) override SIP_SKIP;
137137
QSet< QString > requiredLayers( QgsRenderContext &context, int tileZoom ) const override;
138138
void stopRender( QgsRenderContext &context ) override;
139+
void renderBackground( QgsRenderContext &context ) override;
139140
void renderTile( const QgsVectorTileRendererData &tile, QgsRenderContext &context ) override;
140141
void renderSelectedFeatures( const QList< QgsFeature > &selection, QgsRenderContext &context ) override;
141142
bool willRenderFeature( const QgsFeature &feature, int tileZoom, const QString &layerName, QgsRenderContext &context ) override;

‎src/core/vectortile/qgsvectortilelayerrenderer.cpp

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,7 @@
2121
#include "qgsfeedback.h"
2222
#include "qgslogger.h"
2323

24+
#include "qgsvectortilebasicrenderer.h"
2425
#include "qgsvectortilemvtdecoder.h"
2526
#include "qgsvectortilelayer.h"
2627
#include "qgsvectortileloader.h"
@@ -156,6 +157,9 @@ bool QgsVectorTileLayerRenderer::render()
156157

157158
mRenderer->startRender( *renderContext(), mTileZoom, mTileRange );
158159

160+
// Draw background style if present
161+
mRenderer->renderBackground( ctx );
162+
159163
QMap<QString, QSet<QString> > requiredFields = mRenderer->usedAttributes( ctx );
160164

161165
if ( mLabelProvider )

‎src/core/vectortile/qgsvectortilerenderer.h

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -135,6 +135,9 @@ class CORE_EXPORT QgsVectorTileRenderer
135135
//! Finishes rendering and cleans up any resources
136136
virtual void stopRender( QgsRenderContext &context ) = 0;
137137

138+
//! Renders the background if defined
139+
virtual void renderBackground( QgsRenderContext &context ) = 0;
140+
138141
//! Renders given vector tile. Must be called between startRender/stopRender.
139142
virtual void renderTile( const QgsVectorTileRendererData &tile, QgsRenderContext &context ) = 0;
140143

0 commit comments

Comments
 (0)
Please sign in to comment.