From 948048cd4d2e369526ac101af2841acffe25ba94 Mon Sep 17 00:00:00 2001 From: "arnaud.morvan@camptocamp.com" Date: Tue, 8 Jan 2019 14:13:50 +0100 Subject: [PATCH 1/2] Do not overwrite renderContext in QgsMapRendererJob::drawLabeling Dedicated QgsRenderContext is already created and configured in prepareLabelingJob. --- .../auto_generated/qgsmaprendererjob.sip.in | 1 + src/core/qgsmaprenderercustompainterjob.cpp | 19 +++++++++---------- src/core/qgsmaprendererjob.h | 8 +++++++- src/core/qgsmaprendererparalleljob.cpp | 2 +- 4 files changed, 18 insertions(+), 12 deletions(-) diff --git a/python/core/auto_generated/qgsmaprendererjob.sip.in b/python/core/auto_generated/qgsmaprendererjob.sip.in index daef61d8d00e..7bd7e562a576 100644 --- a/python/core/auto_generated/qgsmaprendererjob.sip.in +++ b/python/core/auto_generated/qgsmaprendererjob.sip.in @@ -183,6 +183,7 @@ emitted when asynchronous rendering is finished (or canceled). + }; diff --git a/src/core/qgsmaprenderercustompainterjob.cpp b/src/core/qgsmaprenderercustompainterjob.cpp index 0814d663037a..f5136b5bfb05 100644 --- a/src/core/qgsmaprenderercustompainterjob.cpp +++ b/src/core/qgsmaprenderercustompainterjob.cpp @@ -295,12 +295,12 @@ void QgsMapRendererCustomPainterJob::doRender() mLabelJob.img->fill( 0 ); painter.begin( mLabelJob.img ); mLabelJob.context.setPainter( &painter ); - drawLabeling( mSettings, mLabelJob.context, mLabelingEngineV2.get(), &painter ); + drawLabeling( mLabelJob.context, mLabelingEngineV2.get(), &painter ); painter.end(); } else { - drawLabeling( mSettings, mLabelJob.context, mLabelingEngineV2.get(), mPainter ); + drawLabeling( mLabelJob.context, mLabelingEngineV2.get(), mPainter ); } mLabelJob.complete = true; @@ -318,8 +318,7 @@ void QgsMapRendererCustomPainterJob::doRender() QgsDebugMsgLevel( "Rendering completed in (seconds): " + QString( "%1" ).arg( renderTime.elapsed() / 1000.0 ), 2 ); } - -void QgsMapRendererJob::drawLabeling( const QgsMapSettings &settings, QgsRenderContext &renderContext, QgsLabelingEngine *labelingEngine2, QPainter *painter ) +void QgsMapRendererJob::drawLabeling( QgsRenderContext &renderContext, QgsLabelingEngine *labelingEngine2, QPainter *painter ) { QgsDebugMsgLevel( QStringLiteral( "Draw labeling start" ), 5 ); @@ -329,22 +328,22 @@ void QgsMapRendererJob::drawLabeling( const QgsMapSettings &settings, QgsRenderC // Reset the composition mode before rendering the labels painter->setCompositionMode( QPainter::CompositionMode_SourceOver ); - // TODO: this is not ideal - we could override rendering stopped flag that has been set in meanwhile - renderContext = QgsRenderContext::fromMapSettings( settings ); renderContext.setPainter( painter ); if ( labelingEngine2 ) { - // set correct extent - renderContext.setExtent( settings.visibleExtent() ); - renderContext.setCoordinateTransform( QgsCoordinateTransform() ); - labelingEngine2->run( renderContext ); } QgsDebugMsg( QStringLiteral( "Draw labeling took (seconds): %1" ).arg( t.elapsed() / 1000. ) ); } +void QgsMapRendererJob::drawLabeling( const QgsMapSettings &settings, QgsRenderContext &renderContext, QgsLabelingEngine *labelingEngine2, QPainter *painter ) +{ + Q_UNUSED( settings ); + + drawLabeling( renderContext, labelingEngine2, painter ); +} bool QgsMapRendererJob::needTemporaryImage( QgsMapLayer *ml ) { diff --git a/src/core/qgsmaprendererjob.h b/src/core/qgsmaprendererjob.h index 75245fc4590b..74689f98b090 100644 --- a/src/core/qgsmaprendererjob.h +++ b/src/core/qgsmaprendererjob.h @@ -286,8 +286,14 @@ class CORE_EXPORT QgsMapRendererJob : public QObject */ void cleanupLabelJob( LabelRenderJob &job ) SIP_SKIP; + /** + * \note not available in Python bindings + * \deprecated Will be removed in QGIS 4.0 + */ + Q_DECL_DEPRECATED static void drawLabeling( const QgsMapSettings &settings, QgsRenderContext &renderContext, QgsLabelingEngine *labelingEngine2, QPainter *painter ) SIP_SKIP; + //! \note not available in Python bindings - static void drawLabeling( const QgsMapSettings &settings, QgsRenderContext &renderContext, QgsLabelingEngine *labelingEngine2, QPainter *painter ) SIP_SKIP; + static void drawLabeling( QgsRenderContext &renderContext, QgsLabelingEngine *labelingEngine2, QPainter *painter ) SIP_SKIP; private: diff --git a/src/core/qgsmaprendererparalleljob.cpp b/src/core/qgsmaprendererparalleljob.cpp index c7728ece24c0..278636990c1f 100644 --- a/src/core/qgsmaprendererparalleljob.cpp +++ b/src/core/qgsmaprendererparalleljob.cpp @@ -297,7 +297,7 @@ void QgsMapRendererParallelJob::renderLabelsStatic( QgsMapRendererParallelJob *s // draw the labels! try { - drawLabeling( self->mSettings, job.context, self->mLabelingEngineV2.get(), &painter ); + drawLabeling( job.context, self->mLabelingEngineV2.get(), &painter ); } catch ( QgsException &e ) { From a222906fcf796416a8d7eccbf322f507feccd529 Mon Sep 17 00:00:00 2001 From: "arnaud.morvan@camptocamp.com" Date: Tue, 8 Jan 2019 14:18:02 +0100 Subject: [PATCH 2/2] Apply featureFilterProvider in QgsVectorLayerDiagramProvider --- src/core/qgsmaprendererjob.cpp | 1 + src/core/qgsvectorlayerdiagramprovider.cpp | 6 +++++- 2 files changed, 6 insertions(+), 1 deletion(-) diff --git a/src/core/qgsmaprendererjob.cpp b/src/core/qgsmaprendererjob.cpp index e7f004925668..feae5b049b7a 100644 --- a/src/core/qgsmaprendererjob.cpp +++ b/src/core/qgsmaprendererjob.cpp @@ -358,6 +358,7 @@ LabelRenderJob QgsMapRendererJob::prepareLabelingJob( QPainter *painter, QgsLabe job.context.setPainter( painter ); job.context.setLabelingEngine( labelingEngine2 ); job.context.setExtent( mSettings.visibleExtent() ); + job.context.setFeatureFilterProvider( mFeatureFilterProvider ); // if we can use the cache, let's do it and avoid rendering! bool hasCache = canUseLabelCache && mCache && mCache->hasCacheImage( LABEL_CACHE_ID ); diff --git a/src/core/qgsvectorlayerdiagramprovider.cpp b/src/core/qgsvectorlayerdiagramprovider.cpp index 9ea4fb9e2296..bed494a672f0 100644 --- a/src/core/qgsvectorlayerdiagramprovider.cpp +++ b/src/core/qgsvectorlayerdiagramprovider.cpp @@ -78,9 +78,13 @@ QList QgsVectorLayerDiagramProvider::labelFeatures( QgsRender QgsFeatureRequest request; request.setFilterRect( layerExtent ); request.setSubsetOfAttributes( attributeNames, mFields ); + const QgsFeatureFilterProvider *featureFilterProvider = context.featureFilterProvider(); + if ( featureFilterProvider ) + { + featureFilterProvider->filterFeatures( qobject_cast( mLayer ), request ); + } QgsFeatureIterator fit = mSource->getFeatures( request ); - QgsFeature fet; while ( fit.nextFeature( fet ) ) {