Skip to content

Commit

Permalink
Start using data provider in renderer
Browse files Browse the repository at this point in the history
  • Loading branch information
nyalldawson committed Mar 20, 2023
1 parent ca34d14 commit d2ca8a1
Show file tree
Hide file tree
Showing 4 changed files with 32 additions and 4 deletions.
10 changes: 10 additions & 0 deletions src/core/vectortile/qgsvectortilelayer.cpp
Expand Up @@ -1354,6 +1354,11 @@ bool QgsVectorTileDataProvider::renderInPreview( const PreviewContext &context )
return context.lastRenderingTimeMs <= 1000;
}

bool QgsVectorTileDataProvider::supportsAsync() const
{
return false;
}

//
// QgsXyzVectorTileDataProvider
//
Expand Down Expand Up @@ -1396,6 +1401,11 @@ QgsCoordinateReferenceSystem QgsXyzVectorTileDataProvider::crs() const
return QgsCoordinateReferenceSystem( QStringLiteral( "EPSG:3857" ) );
}

bool QgsXyzVectorTileDataProvider::supportsAsync() const
{
return true;
}

QByteArray QgsXyzVectorTileDataProvider::readTile( const QgsTileMatrix &tileMatrix, const QgsTileXYZ &id ) const
{
QgsDataSourceUri dsUri;
Expand Down
8 changes: 8 additions & 0 deletions src/core/vectortile/qgsvectortilelayer.h
Expand Up @@ -343,6 +343,13 @@ class QgsVectorTileDataProvider : public QgsDataProvider
virtual QString sourcePath() const = 0;
virtual QgsVectorTileDataProvider *clone() const = 0 SIP_FACTORY;

/**
* Returns TRUE if the provider supports async tile reading.
*
* The default implementation returns FALSE.
*/
virtual bool supportsAsync() const;

//! Returns raw tile data for a single tile
virtual QByteArray readTile( const QgsTileMatrix &tileMatrix, const QgsTileXYZ &id ) const = 0;

Expand All @@ -361,6 +368,7 @@ class QgsXyzVectorTileDataProvider : public QgsVectorTileDataProvider
QString sourcePath() const override;
bool isValid() const override;
QgsCoordinateReferenceSystem crs() const override;
bool supportsAsync() const override;
QByteArray readTile( const QgsTileMatrix &tileMatrix, const QgsTileXYZ &id ) const override;
};

Expand Down
14 changes: 10 additions & 4 deletions src/core/vectortile/qgsvectortilelayerrenderer.cpp
Expand Up @@ -16,6 +16,7 @@
#include "qgsvectortilelayerrenderer.h"

#include <QElapsedTimer>
#include <QThread>

#include "qgsexpressioncontextutils.h"
#include "qgsfeedback.h"
Expand All @@ -36,6 +37,7 @@ QgsVectorTileLayerRenderer::QgsVectorTileLayerRenderer( QgsVectorTileLayer *laye
: QgsMapLayerRenderer( layer->id(), &context )
, mSourceType( layer->sourceType() )
, mSourcePath( layer->sourcePath() )
, mDataProvider( qgis::down_cast< const QgsVectorTileDataProvider* >( layer->dataProvider() )->clone() )
, mRenderer( layer->renderer()->clone() )
, mDrawTileBoundaries( layer->isTileBorderRenderingEnabled() )
, mFeedback( new QgsFeedback )
Expand All @@ -62,15 +64,21 @@ QgsVectorTileLayerRenderer::QgsVectorTileLayerRenderer( QgsVectorTileLayer *laye
}

mClippingRegions = QgsMapClippingUtils::collectClippingRegionsForLayer( *renderContext(), layer );

mDataProvider->moveToThread( nullptr );
}

QgsVectorTileLayerRenderer::~QgsVectorTileLayerRenderer() = default;

bool QgsVectorTileLayerRenderer::render()
{
QgsRenderContext &ctx = *renderContext();

if ( ctx.renderingStopped() )
return false;

mDataProvider->moveToThread( QThread::currentThread() );

const QgsScopedQPainterState painterState( ctx.painter() );

if ( !mClippingRegions.empty() )
Expand Down Expand Up @@ -107,8 +115,6 @@ bool QgsVectorTileLayerRenderer::render()
return true; // nothing to do
}

const bool isAsync = ( mSourceType == QLatin1String( "xyz" ) );

if ( mSourceType == QLatin1String( "xyz" ) && mSourcePath.contains( QLatin1String( "{usage}" ) ) )
{
switch ( renderContext()->rendererUsage() )
Expand All @@ -127,7 +133,7 @@ bool QgsVectorTileLayerRenderer::render()

std::unique_ptr<QgsVectorTileLoader> asyncLoader;
QList<QgsVectorTileRawData> rawTiles;
if ( !isAsync )
if ( !mDataProvider->supportsAsync() )
{
QElapsedTimer tFetch;
tFetch.start();
Expand Down Expand Up @@ -191,7 +197,7 @@ bool QgsVectorTileLayerRenderer::render()
}
}

if ( !isAsync )
if ( !mDataProvider->supportsAsync() )
{
for ( const QgsVectorTileRawData &rawTile : std::as_const( rawTiles ) )
{
Expand Down
4 changes: 4 additions & 0 deletions src/core/vectortile/qgsvectortilelayerrenderer.h
Expand Up @@ -23,6 +23,7 @@
class QgsVectorTileLayer;
class QgsVectorTileRawData;
class QgsVectorTileLabelProvider;
class QgsVectorTileDataProvider;

#include "qgsvectortilerenderer.h"
#include "qgsmapclippingregion.h"
Expand All @@ -45,6 +46,7 @@ class QgsVectorTileLayerRenderer : public QgsMapLayerRenderer
public:
//! Creates the renderer. Always called from main thread, should copy whatever necessary from the layer
QgsVectorTileLayerRenderer( QgsVectorTileLayer *layer, QgsRenderContext &context );
~QgsVectorTileLayerRenderer() override;

virtual bool render() override;
virtual QgsFeedback *feedback() const override { return mFeedback.get(); }
Expand All @@ -63,6 +65,8 @@ class QgsVectorTileLayerRenderer : public QgsMapLayerRenderer
QString mAuthCfg;
QgsHttpHeaders mHeaders;

std::unique_ptr< QgsVectorTileDataProvider > mDataProvider;

//! Tile renderer object to do rendering of individual tiles
std::unique_ptr<QgsVectorTileRenderer> mRenderer;

Expand Down

0 comments on commit d2ca8a1

Please sign in to comment.