Skip to content

Commit c84ea71

Browse files
committedFeb 1, 2017
Use list of map layers instead of map layer ids
1 parent 0aa085d commit c84ea71

File tree

8 files changed

+42
-39
lines changed

8 files changed

+42
-39
lines changed
 

‎python/core/qgsmaprenderercache.sip

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,7 @@ class QgsMapRendererCache : QObject
1212

1313
bool init( const QgsRectangle& extent, double scale );
1414

15-
void setCacheImage( const QString& cacheKey, const QImage& image, const QStringList& dependentLayerIds = QStringList() );
15+
void setCacheImage( const QString& cacheKey, const QImage& image, const QList< QgsMapLayer* >& dependentLayers = QList< QgsMapLayer* >() );
1616

1717
bool hasCacheImage( const QString& cacheKey ) const;
1818

‎src/core/qgsmaplayerlistutils.h

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -93,6 +93,11 @@ inline static QgsMapLayer* _qgis_findLayer( const QList< QgsMapLayer*> layers, c
9393
}
9494
}
9595

96+
inline uint qHash( const QPointer< QgsMapLayer >& key )
97+
{
98+
return qHash( key ? key->id() : QString() );
99+
}
100+
96101
///@endcond
97102

98103
#endif // QGSMAPLAYERLISTUTILS_H

‎src/core/qgsmaprenderercache.cpp

Lines changed: 18 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -15,8 +15,8 @@
1515

1616
#include "qgsmaprenderercache.h"
1717

18-
#include "qgsproject.h"
1918
#include "qgsmaplayer.h"
19+
#include "qgsmaplayerlistutils.h"
2020

2121
QgsMapRendererCache::QgsMapRendererCache()
2222
{
@@ -35,44 +35,42 @@ void QgsMapRendererCache::clearInternal()
3535
mScale = 0;
3636

3737
// make sure we are disconnected from all layers
38-
Q_FOREACH ( const QString& id, mConnectedLayerIds )
38+
Q_FOREACH ( const QPointer< QgsMapLayer >& layer, mConnectedLayers )
3939
{
40-
QgsMapLayer* layer = QgsProject::instance()->mapLayer( id );
41-
if ( layer )
40+
if ( layer.data() )
4241
{
43-
disconnect( layer, &QgsMapLayer::repaintRequested, this, &QgsMapRendererCache::layerRequestedRepaint );
42+
disconnect( layer.data(), &QgsMapLayer::repaintRequested, this, &QgsMapRendererCache::layerRequestedRepaint );
4443
}
4544
}
4645
mCachedImages.clear();
47-
mConnectedLayerIds.clear();
46+
mConnectedLayers.clear();
4847
}
4948

5049
void QgsMapRendererCache::dropUnusedConnections()
5150
{
52-
QSet< QString > stillDepends = dependentLayerIds();
53-
QSet< QString > disconnects = mConnectedLayerIds.subtract( stillDepends );
54-
Q_FOREACH ( const QString& id, disconnects )
51+
QSet< QPointer< QgsMapLayer > > stillDepends = dependentLayers();
52+
QSet< QPointer< QgsMapLayer > > disconnects = mConnectedLayers.subtract( stillDepends );
53+
Q_FOREACH ( const QPointer< QgsMapLayer >& layer, disconnects )
5554
{
56-
QgsMapLayer* layer = QgsProject::instance()->mapLayer( id );
57-
if ( layer )
55+
if ( layer.data() )
5856
{
59-
disconnect( layer, &QgsMapLayer::repaintRequested, this, &QgsMapRendererCache::layerRequestedRepaint );
57+
disconnect( layer.data(), &QgsMapLayer::repaintRequested, this, &QgsMapRendererCache::layerRequestedRepaint );
6058
}
6159
}
6260

63-
mConnectedLayerIds = stillDepends;
61+
mConnectedLayers = stillDepends;
6462
}
6563

66-
QSet< QString > QgsMapRendererCache::dependentLayerIds() const
64+
QSet<QPointer<QgsMapLayer> > QgsMapRendererCache::dependentLayers() const
6765
{
68-
QSet< QString > result;
66+
QSet< QPointer< QgsMapLayer > > result;
6967
QMap<QString, CacheParameters>::const_iterator it = mCachedImages.constBegin();
7068
for ( ; it != mCachedImages.constEnd(); ++it )
7169
{
7270
Q_FOREACH ( const QPointer< QgsMapLayer >& l, it.value().dependentLayers )
7371
{
7472
if ( l.data() )
75-
result << l->id();
73+
result << l;
7674
}
7775
}
7876
return result;
@@ -96,24 +94,23 @@ bool QgsMapRendererCache::init( const QgsRectangle& extent, double scale )
9694
return false;
9795
}
9896

99-
void QgsMapRendererCache::setCacheImage( const QString& cacheKey, const QImage& image, const QStringList& dependentLayerIds )
97+
void QgsMapRendererCache::setCacheImage( const QString& cacheKey, const QImage& image, const QList<QgsMapLayer*>& dependentLayers )
10098
{
10199
QMutexLocker lock( &mMutex );
102100

103101
CacheParameters params;
104102
params.cachedImage = image;
105103

106104
// connect to the layer to listen to layer's repaintRequested() signals
107-
Q_FOREACH ( const QString& id, dependentLayerIds )
105+
Q_FOREACH ( QgsMapLayer* layer, dependentLayers )
108106
{
109-
QgsMapLayer* layer = QgsProject::instance()->mapLayer( id );
110107
if ( layer )
111108
{
112109
params.dependentLayers << layer;
113-
if ( !mConnectedLayerIds.contains( id ) )
110+
if ( !mConnectedLayers.contains( QPointer< QgsMapLayer >( layer ) ) )
114111
{
115112
connect( layer, &QgsMapLayer::repaintRequested, this, &QgsMapRendererCache::layerRequestedRepaint );
116-
mConnectedLayerIds << id;
113+
mConnectedLayers << layer;
117114
}
118115
}
119116
}

‎src/core/qgsmaprenderercache.h

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -61,12 +61,12 @@ class CORE_EXPORT QgsMapRendererCache : public QObject
6161
/**
6262
* Set the cached \a image for a particular \a cacheKey. The \a cacheKey usually
6363
* matches the QgsMapLayer::id() which the image is a render of.
64-
* A list of \a dependentLayerIds should be passed containing all layer IDs
64+
* A list of \a dependentLayers should be passed containing all layer
6565
* on which this cache image is dependent. If any of these layers triggers a
6666
* repaint then the cache image will be cleared.
6767
* @see cacheImage()
6868
*/
69-
void setCacheImage( const QString& cacheKey, const QImage& image, const QStringList& dependentLayerIds = QStringList() );
69+
void setCacheImage( const QString& cacheKey, const QImage& image, const QList< QgsMapLayer* >& dependentLayers = QList< QgsMapLayer* >() );
7070

7171
/**
7272
* Returns true if the cache contains an image with the specified \a cacheKey.
@@ -108,16 +108,16 @@ class CORE_EXPORT QgsMapRendererCache : public QObject
108108
//! Disconnects from layers we no longer care about
109109
void dropUnusedConnections();
110110

111-
QSet<QString> dependentLayerIds() const;
111+
QSet< QPointer< QgsMapLayer > > dependentLayers() const;
112112

113113
mutable QMutex mMutex;
114114
QgsRectangle mExtent;
115115
double mScale = 0;
116116

117117
//! Map of cache key to cache parameters
118118
QMap<QString, CacheParameters> mCachedImages;
119-
//! List of all layer ids on which this cache is currently connected
120-
QSet< QString > mConnectedLayerIds;
119+
//! List of all layers on which this cache is currently connected
120+
QSet< QPointer< QgsMapLayer > > mConnectedLayers;
121121
};
122122

123123

‎src/core/qgsmaprendererjob.cpp

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -243,7 +243,7 @@ LayerRenderJobs QgsMapRendererJob::prepareJobs( QPainter* painter, QgsLabelingEn
243243
{
244244
job.opacity = 1.0 - vl->layerTransparency() / 100.0;
245245
}
246-
job.layerId = ml->id();
246+
job.layer = ml;
247247
job.renderingTime = -1;
248248

249249
job.context = QgsRenderContext::fromMapSettings( mSettings );
@@ -323,10 +323,10 @@ void QgsMapRendererJob::cleanupJobs( LayerRenderJobs& jobs )
323323
delete job.context.painter();
324324
job.context.setPainter( nullptr );
325325

326-
if ( mCache && !job.cached && !job.context.renderingStopped() )
326+
if ( mCache && !job.cached && !job.context.renderingStopped() && job.layer )
327327
{
328-
QgsDebugMsg( "caching image for " + job.layerId );
329-
mCache->setCacheImage( job.layerId, *job.img, QStringList() << job.layerId );
328+
QgsDebugMsg( "caching image for " + ( job.layer ? job.layer->id() : QString() ) );
329+
mCache->setCacheImage( job.layer->id(), *job.img, QList< QgsMapLayer* >() << job.layer );
330330
}
331331

332332
delete job.img;
@@ -380,7 +380,7 @@ void QgsMapRendererJob::logRenderingTime( const LayerRenderJobs& jobs )
380380

381381
QMultiMap<int, QString> elapsed;
382382
Q_FOREACH ( const LayerRenderJob& job, jobs )
383-
elapsed.insert( job.renderingTime, job.layerId );
383+
elapsed.insert( job.renderingTime, job.layer ? job.layer->id() : QString() );
384384

385385
QList<int> tt( elapsed.uniqueKeys() );
386386
qSort( tt.begin(), tt.end(), qGreater<int>() );

‎src/core/qgsmaprendererjob.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -50,7 +50,7 @@ struct LayerRenderJob
5050
QPainter::CompositionMode blendMode;
5151
double opacity;
5252
bool cached; // if true, img already contains cached image from previous rendering
53-
QString layerId;
53+
QPointer< QgsMapLayer > layer;
5454
int renderingTime; //!< Time it took to render the layer in ms (it is -1 if not rendered or still rendering)
5555
};
5656

‎src/core/qgsmaprendererparalleljob.cpp

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,7 @@
2121
#include "qgsmaplayerrenderer.h"
2222
#include "qgspallabeling.h"
2323
#include "qgsproject.h"
24+
#include "qgsmaplayer.h"
2425

2526
#include <QtConcurrentMap>
2627

@@ -220,7 +221,7 @@ void QgsMapRendererParallelJob::renderLayerStatic( LayerRenderJob& job )
220221

221222
QTime t;
222223
t.start();
223-
QgsDebugMsgLevel( QString( "job %1 start (layer %2)" ).arg( reinterpret_cast< quint64 >( &job ), 0, 16 ).arg( job.layerId ), 2 );
224+
QgsDebugMsgLevel( QString( "job %1 start (layer %2)" ).arg( reinterpret_cast< quint64 >( &job ), 0, 16 ).arg( job.layer ? job.layer->id() : QString() ), 2 );
224225

225226
try
226227
{
@@ -242,7 +243,7 @@ void QgsMapRendererParallelJob::renderLayerStatic( LayerRenderJob& job )
242243
}
243244

244245
job.renderingTime = t.elapsed();
245-
QgsDebugMsgLevel( QString( "job %1 end [%2 ms] (layer %3)" ).arg( reinterpret_cast< quint64 >( &job ), 0, 16 ).arg( job.renderingTime ).arg( job.layerId ), 2 );
246+
QgsDebugMsgLevel( QString( "job %1 end [%2 ms] (layer %3)" ).arg( reinterpret_cast< quint64 >( &job ), 0, 16 ).arg( job.renderingTime ).arg( job.layer ? job.layer->id() : QString() ), 2 );
246247
}
247248

248249

‎tests/src/python/test_qgsmaprenderercache.py

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -105,7 +105,7 @@ def testRequestRepaintSimple(self):
105105
# add image to cache
106106
cache = QgsMapRendererCache()
107107
im = QImage(200, 200, QImage.Format_RGB32)
108-
cache.setCacheImage('xxx', im, [layer.id()])
108+
cache.setCacheImage('xxx', im, [layer])
109109
self.assertFalse(cache.cacheImage('xxx').isNull())
110110
self.assertTrue(cache.hasCacheImage('xxx'))
111111

@@ -144,15 +144,15 @@ def testRequestRepaintMultiple(self):
144144

145145
# image depends on 1 layer
146146
im_l1 = QImage(200, 200, QImage.Format_RGB32)
147-
cache.setCacheImage('im1', im_l1, [layer1.id()])
147+
cache.setCacheImage('im1', im_l1, [layer1])
148148

149149
# image depends on 2 layers
150150
im_l1_l2 = QImage(200, 200, QImage.Format_RGB32)
151-
cache.setCacheImage('im1_im2', im_l1_l2, [layer1.id(), layer2.id()])
151+
cache.setCacheImage('im1_im2', im_l1_l2, [layer1, layer2])
152152

153153
# image depends on 2nd layer alone
154154
im_l2 = QImage(200, 200, QImage.Format_RGB32)
155-
cache.setCacheImage('im2', im_l2, [layer2.id()])
155+
cache.setCacheImage('im2', im_l2, [layer2])
156156

157157
self.assertFalse(cache.cacheImage('im1').isNull())
158158
self.assertTrue(cache.hasCacheImage('im1'))

0 commit comments

Comments
 (0)
Please sign in to comment.