Skip to content

Commit d4b1bb4

Browse files
committed
Reintroduce geometry caching while rendering (used esp. for snapping)
1 parent 4bfba09 commit d4b1bb4

5 files changed

+66
-12
lines changed

src/core/qgsmaprendererjob.cpp

+24
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,7 @@
1414
#include "qgsmaplayerrenderer.h"
1515
#include "qgsmaprenderercache.h"
1616
#include "qgspallabeling.h"
17+
#include "qgsvectorlayerrenderer.h"
1718

1819

1920
QgsMapRendererJob::QgsMapRendererJob( const QgsMapSettings& settings )
@@ -438,6 +439,17 @@ void QgsMapRendererJob::drawNewLabeling( const QgsMapSettings& settings, QgsRend
438439
}
439440
}
440441

442+
void QgsMapRendererJob::updateLayerGeometryCaches()
443+
{
444+
foreach ( QString id, mGeometryCaches.keys() )
445+
{
446+
const QgsGeometryCache& cache = mGeometryCaches[id];
447+
if ( QgsVectorLayer* vl = qobject_cast<QgsVectorLayer*>( QgsMapLayerRegistry::instance()->mapLayer( id ) ) )
448+
*vl->cache() = cache;
449+
}
450+
mGeometryCaches.clear();
451+
}
452+
441453

442454
bool QgsMapRendererJob::needTemporaryImage( QgsMapLayer* ml )
443455
{
@@ -525,6 +537,8 @@ LayerRenderJobs QgsMapRendererJob::prepareJobs( QPainter* painter, QgsPalLabelin
525537
qDebug("CACHE VALID: %d", cacheValid);
526538
}
527539

540+
mGeometryCaches.clear();
541+
528542
while ( li.hasPrevious() )
529543
{
530544
QString layerId = li.previous();
@@ -629,6 +643,14 @@ LayerRenderJobs QgsMapRendererJob::prepareJobs( QPainter* painter, QgsPalLabelin
629643

630644
job.renderer = ml->createMapRenderer( job.context );
631645

646+
if ( mRequestedGeomCacheForLayers.contains( ml->id() ) )
647+
{
648+
if ( QgsVectorLayerRenderer* vlr = dynamic_cast<QgsVectorLayerRenderer*>( job.renderer ) )
649+
{
650+
vlr->setGeometryCachePointer( &mGeometryCaches[ ml->id() ] );
651+
}
652+
}
653+
632654
/*
633655
// TODO: split extent
634656
if ( split )
@@ -675,6 +697,8 @@ void QgsMapRendererJob::cleanupJobs( LayerRenderJobs& jobs )
675697
}
676698

677699
jobs.clear();
700+
701+
updateLayerGeometryCaches();
678702
}
679703

680704
/////////////

src/core/qgsmaprendererjob.h

+12
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@
1212

1313
#include "qgsmapsettings.h"
1414

15+
#include "qgsgeometrycache.h"
1516

1617
class QgsLabelingResults;
1718
class QgsMapLayerRenderer;
@@ -77,6 +78,9 @@ class CORE_EXPORT QgsMapRendererJob : public QObject
7778
//! Does not take ownership of the object.
7879
void setCache( QgsMapRendererCache* cache );
7980

81+
//! Set which vector layers should be cached while rendering
82+
//! @note The way how geometries are cached is really suboptimal - this method may be removed in future releases
83+
void setRequestedGeometryCacheForLayers( const QStringList& layerIds ) { mRequestedGeomCacheForLayers = layerIds; }
8084

8185
//! Find out how log it took to finish the job (in miliseconds)
8286
int renderingTime() const { return mRenderingTime; }
@@ -108,11 +112,19 @@ class CORE_EXPORT QgsMapRendererJob : public QObject
108112
static void drawOldLabeling( const QgsMapSettings& settings, QgsRenderContext& renderContext );
109113
static void drawNewLabeling( const QgsMapSettings& settings, QgsRenderContext& renderContext, QgsPalLabeling* labelingEngine );
110114

115+
//! called when rendering has finished to update all layers' geometry caches
116+
void updateLayerGeometryCaches();
117+
111118
QgsMapSettings mSettings;
112119
Errors mErrors;
113120

114121
QgsMapRendererCache* mCache;
115122

123+
//! list of layer IDs for which the geometry cache should be updated
124+
QStringList mRequestedGeomCacheForLayers;
125+
//! map of geometry caches
126+
QMap<QString, QgsGeometryCache> mGeometryCaches;
127+
116128
QTime mRenderingStart;
117129
int mRenderingTime;
118130
};

src/core/qgsvectorlayerrenderer.cpp

+14-12
Original file line numberDiff line numberDiff line change
@@ -35,11 +35,6 @@ QgsVectorLayerRenderer::QgsVectorLayerRenderer( QgsVectorLayer* layer, QgsRender
3535
mSelectedFeatureIds = layer->selectedFeaturesIds();
3636

3737
mDrawVertexMarkers = ( layer->editBuffer() != 0 );
38-
mCacheFeatures = ( layer->editBuffer() != 0 );
39-
if ( mCacheFeatures )
40-
{
41-
mCache = new QgsGeometryCache();
42-
}
4338

4439
mGeometryType = layer->geometryType();
4540

@@ -70,11 +65,8 @@ QgsVectorLayerRenderer::QgsVectorLayerRenderer( QgsVectorLayer* layer, QgsRender
7065

7166
QgsDebugMsg( "rendering v2:\n" + mRendererV2->dump() );
7267

73-
if ( mCacheFeatures )
68+
if ( mDrawVertexMarkers )
7469
{
75-
// Destroy all cached geometries and clear the references to them
76-
mCache->setCachedGeometriesRect( mContext.extent() );
77-
7870
// set editing vertex markers style
7971
mRendererV2->setVertexMarkerAppearance( mVertexMarkerStyle, mVertexMarkerSize );
8072
}
@@ -91,7 +83,6 @@ QgsVectorLayerRenderer::QgsVectorLayerRenderer( QgsVectorLayer* layer, QgsRender
9183
QgsVectorLayerRenderer::~QgsVectorLayerRenderer()
9284
{
9385
delete mRendererV2;
94-
delete mCache;
9586
delete mSource;
9687
}
9788

@@ -142,6 +133,17 @@ bool QgsVectorLayerRenderer::render()
142133
return true;
143134
}
144135

136+
void QgsVectorLayerRenderer::setGeometryCachePointer( QgsGeometryCache* cache )
137+
{
138+
mCache = cache;
139+
140+
if ( mCache )
141+
{
142+
// Destroy all cached geometries and clear the references to them
143+
mCache->setCachedGeometriesRect( mContext.extent() );
144+
}
145+
}
146+
145147

146148

147149
void QgsVectorLayerRenderer::drawRendererV2( QgsFeatureIterator& fit )
@@ -166,7 +168,7 @@ void QgsVectorLayerRenderer::drawRendererV2( QgsFeatureIterator& fit )
166168
// render feature
167169
bool rendered = mRendererV2->renderFeature( fet, mContext, -1, sel, drawMarker );
168170

169-
if ( mCacheFeatures )
171+
if ( mCache )
170172
{
171173
// Cache this for the use of (e.g.) modifying the feature's uncommitted geometry.
172174
mCache->cacheGeometry( fet.id(), *fet.geometry() );
@@ -236,7 +238,7 @@ void QgsVectorLayerRenderer::drawRendererV2Levels( QgsFeatureIterator& fit )
236238
}
237239
features[sym].append( fet );
238240

239-
if ( mCacheFeatures )
241+
if ( mCache )
240242
{
241243
// Cache this for the use of (e.g.) modifying the feature's uncommitted geometry.
242244
mCache->cacheGeometry( fet.id(), *fet.geometry() );

src/core/qgsvectorlayerrenderer.h

+4
Original file line numberDiff line numberDiff line change
@@ -34,6 +34,10 @@ class QgsVectorLayerRenderer : public QgsMapLayerRenderer
3434

3535
virtual bool render();
3636

37+
//! where to save the cached geometries
38+
//! @note The way how geometries are cached is really suboptimal - this method may be removed in future releases
39+
void setGeometryCachePointer( QgsGeometryCache* cache );
40+
3741
private:
3842

3943
/**Registers label and diagram layer

src/gui/qgsmapcanvas.cpp

+12
Original file line numberDiff line numberDiff line change
@@ -652,6 +652,18 @@ void QgsMapCanvas::refreshMap()
652652
mJob = new QgsMapRendererSequentialJob( mSettings );
653653
connect(mJob, SIGNAL( finished() ), SLOT( rendererJobFinished() ) );
654654
mJob->setCache( mCache );
655+
656+
QStringList layersForGeometryCache;
657+
foreach ( QString id, mSettings.layers() )
658+
{
659+
if ( QgsVectorLayer* vl = qobject_cast<QgsVectorLayer*>( QgsMapLayerRegistry::instance()->mapLayer( id ) ) )
660+
{
661+
if ( vl->isEditable() )
662+
layersForGeometryCache << id;
663+
}
664+
}
665+
mJob->setRequestedGeometryCacheForLayers( layersForGeometryCache );
666+
655667
mJob->start();
656668

657669
mMapUpdateTimer.start();

0 commit comments

Comments
 (0)