Skip to content

Commit

Permalink
Browse files Browse the repository at this point in the history
Better fix (faster rendering, works for PDF, better during progressiv…
…e rendering)
  • Loading branch information
nirvn authored and nyalldawson committed Apr 1, 2023
1 parent 62a9d41 commit 622815e
Show file tree
Hide file tree
Showing 6 changed files with 45 additions and 16 deletions.
Expand Up @@ -161,6 +161,8 @@ Constructs renderer with no styles

virtual void stopRender( QgsRenderContext &context );

virtual void renderBackground( QgsRenderContext &context );

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

virtual void renderSelectedFeatures( const QList< QgsFeature > &selection, QgsRenderContext &context );
Expand Down
Expand Up @@ -124,6 +124,11 @@ An empty string present in the list indicates that all layer in the tiles are re
virtual void stopRender( QgsRenderContext &context ) = 0;
%Docstring
Finishes rendering and cleans up any resources
%End

virtual void renderBackground( QgsRenderContext &context ) = 0;
%Docstring
Renders the background if defined
%End

virtual void renderTile( const QgsVectorTileRendererData &tile, QgsRenderContext &context ) = 0;
Expand Down
46 changes: 30 additions & 16 deletions src/core/vectortile/qgsvectortilebasicrenderer.cpp
Expand Up @@ -163,14 +163,42 @@ void QgsVectorTileBasicRenderer::stopRender( QgsRenderContext &context )
Q_UNUSED( context )
}

void QgsVectorTileBasicRenderer::renderBackground( QgsRenderContext &context )
{
for ( const QgsVectorTileBasicRendererStyle &layerStyle : std::as_const( mStyles ) )
{
if ( !layerStyle.symbol() || layerStyle.layerName() != QLatin1String( "background" ) )
continue;

QgsExpression filterExpression( layerStyle.filterExpression() );
filterExpression.prepare( &context.expressionContext() );

QgsSymbol *sym = layerStyle.symbol();
sym->startRender( context, QgsFields() );

QgsFillSymbol *fillSym = dynamic_cast<QgsFillSymbol *>( sym );
if ( fillSym )
{
QPolygon polygon;
polygon << QPoint( 0, 0 );
polygon << QPoint( 0, context.outputSize().height() );
polygon << QPoint( context.outputSize().width(), context.outputSize().height() );
polygon << QPoint( context.outputSize().width(), 0 );
fillSym->renderPolygon( polygon, nullptr, nullptr, context );
}
sym->stopRender( context );
break;
}
}

void QgsVectorTileBasicRenderer::renderTile( const QgsVectorTileRendererData &tile, QgsRenderContext &context )
{
const QgsVectorTileFeatures tileData = tile.features();
int zoomLevel = tile.id().zoomLevel();

for ( const QgsVectorTileBasicRendererStyle &layerStyle : std::as_const( mStyles ) )
{
if ( !layerStyle.isActive( zoomLevel ) || !layerStyle.symbol() )
if ( !layerStyle.isActive( zoomLevel ) || !layerStyle.symbol() || layerStyle.layerName() == QLatin1String( "background" ) )
continue;

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

QgsSymbol *sym = layerStyle.symbol();
sym->startRender( context, QgsFields() );
if ( layerStyle.layerName() == QLatin1String( "background" ) )
{
QgsFillSymbol *fillSym = dynamic_cast<QgsFillSymbol *>( sym );
if ( fillSym )
{
QPolygon tilePolygon = tile.tilePolygon();
// Order of points set in QgsVectorTileUtils::tilePolygon
tilePolygon.setPoint( 0, QPoint( tilePolygon.point( 0 ).x() - 10, tilePolygon.point( 0 ).y() + 10 ) );
tilePolygon.setPoint( 1, QPoint( tilePolygon.point( 1 ).x() - 10, tilePolygon.point( 1 ).y() - 10 ) );
tilePolygon.setPoint( 2, QPoint( tilePolygon.point( 2 ).x() + 10, tilePolygon.point( 2 ).y() - 10 ) );
tilePolygon.setPoint( 3, QPoint( tilePolygon.point( 3 ).x() + 10, tilePolygon.point( 3 ).y() + 10 ) );
fillSym->renderPolygon( tilePolygon, nullptr, nullptr, context );
}
}
else if ( layerStyle.layerName().isEmpty() )
if ( layerStyle.layerName().isEmpty() )
{
// matching all layers
for ( QString layerName : tileData.keys() )
Expand Down
1 change: 1 addition & 0 deletions src/core/vectortile/qgsvectortilebasicrenderer.h
Expand Up @@ -136,6 +136,7 @@ class CORE_EXPORT QgsVectorTileBasicRenderer : public QgsVectorTileRenderer
QMap<QString, QSet<QString> > usedAttributes( const QgsRenderContext & ) override SIP_SKIP;
QSet< QString > requiredLayers( QgsRenderContext &context, int tileZoom ) const override;
void stopRender( QgsRenderContext &context ) override;
void renderBackground( QgsRenderContext &context ) override;
void renderTile( const QgsVectorTileRendererData &tile, QgsRenderContext &context ) override;
void renderSelectedFeatures( const QList< QgsFeature > &selection, QgsRenderContext &context ) override;
bool willRenderFeature( const QgsFeature &feature, int tileZoom, const QString &layerName, QgsRenderContext &context ) override;
Expand Down
4 changes: 4 additions & 0 deletions src/core/vectortile/qgsvectortilelayerrenderer.cpp
Expand Up @@ -21,6 +21,7 @@
#include "qgsfeedback.h"
#include "qgslogger.h"

#include "qgsvectortilebasicrenderer.h"
#include "qgsvectortilemvtdecoder.h"
#include "qgsvectortilelayer.h"
#include "qgsvectortileloader.h"
Expand Down Expand Up @@ -156,6 +157,9 @@ bool QgsVectorTileLayerRenderer::render()

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

// Draw background style if present
mRenderer->renderBackground( ctx );

QMap<QString, QSet<QString> > requiredFields = mRenderer->usedAttributes( ctx );

if ( mLabelProvider )
Expand Down
3 changes: 3 additions & 0 deletions src/core/vectortile/qgsvectortilerenderer.h
Expand Up @@ -135,6 +135,9 @@ class CORE_EXPORT QgsVectorTileRenderer
//! Finishes rendering and cleans up any resources
virtual void stopRender( QgsRenderContext &context ) = 0;

//! Renders the background if defined
virtual void renderBackground( QgsRenderContext &context ) = 0;

//! Renders given vector tile. Must be called between startRender/stopRender.
virtual void renderTile( const QgsVectorTileRendererData &tile, QgsRenderContext &context ) = 0;

Expand Down

0 comments on commit 622815e

Please sign in to comment.