[QGIS Commit] r13647 - branches/threading-branch/src/core
svn_qgis at osgeo.org
svn_qgis at osgeo.org
Fri Jun 4 10:32:27 EDT 2010
Author: wonder
Date: 2010-06-04 10:32:27 -0400 (Fri, 04 Jun 2010)
New Revision: 13647
Added:
branches/threading-branch/src/core/qgsoverlayobjectpositionmanager.cpp
Modified:
branches/threading-branch/src/core/CMakeLists.txt
branches/threading-branch/src/core/qgsmaprenderer.cpp
branches/threading-branch/src/core/qgsmaprenderer.h
branches/threading-branch/src/core/qgsoverlayobjectpositionmanager.h
Log:
Housekeeping: moved rendering of layers and labels to separate functions, added utility functions for vector overlay object position manager
Modified: branches/threading-branch/src/core/CMakeLists.txt
===================================================================
--- branches/threading-branch/src/core/CMakeLists.txt 2010-06-04 13:47:11 UTC (rev 13646)
+++ branches/threading-branch/src/core/CMakeLists.txt 2010-06-04 14:32:27 UTC (rev 13647)
@@ -59,6 +59,7 @@
qgsmessageoutput.cpp
qgscredentials.cpp
qgsoverlayobject.cpp
+ qgsoverlayobjectpositionmanager.cpp
qgspalgeometry.cpp
qgspallabeling.cpp
qgspalobjectpositionmanager.cpp
Modified: branches/threading-branch/src/core/qgsmaprenderer.cpp
===================================================================
--- branches/threading-branch/src/core/qgsmaprenderer.cpp 2010-06-04 13:47:11 UTC (rev 13646)
+++ branches/threading-branch/src/core/qgsmaprenderer.cpp 2010-06-04 14:32:27 UTC (rev 13647)
@@ -230,7 +230,6 @@
mDrawing = true;
- QgsCoordinateTransform* ct;
#ifdef QGISDEBUG
QgsDebugMsg( "Starting to render layer stack." );
@@ -293,20 +292,11 @@
}
}
- bool placeOverlays = false;
QgsOverlayObjectPositionManager* overlayManager = overlayManagerFromSettings();
- QList<QgsVectorOverlay*> allOverlayList; //list of all overlays, used to draw them after layers have been rendered
- if ( overlayManager )
- {
- placeOverlays = true;
- }
// render all layers in the stack, starting at the base
QListIterator<QString> li( mLayerSet );
li.toBack();
-
- QgsRectangle r1, r2;
-
while ( li.hasPrevious() )
{
if ( mRenderContext.renderingStopped() )
@@ -314,282 +304,278 @@
break;
}
- // Store the painter in case we need to swap it out for the
- // cache painter
- QPainter * mypContextPainter = mRenderContext.painter();
-
QString layerId = li.previous();
+ renderLayer( layerId, mySameAsLastFlag, overlayManager );
+ }
- QgsDebugMsg( "Rendering at layer item " + layerId );
+ QgsDebugMsg( "Done rendering map layers" );
- // This call is supposed to cause the progress bar to
- // advance. However, it seems that updating the progress bar is
- // incompatible with having a QPainter active (the one that is
- // passed into this function), as Qt produces a number of errors
- // when try to do so. I'm (Gavin) not sure how to fix this, but
- // added these comments and debug statement to help others...
- QgsDebugMsg( "If there is a QPaintEngine error here, it is caused by an emit call" );
+ // render labels for vector layers (not using PAL)
+ if ( !mOverview )
+ {
+ renderLabels();
+ }
- //emit drawingProgress(myRenderCounter++, mLayerSet.size());
- QgsMapLayer *ml = QgsMapLayerRegistry::instance()->mapLayer( layerId );
+ //find overlay positions and draw the vector overlays
+ if ( overlayManager )
+ {
+ overlayManager->drawOverlays( mRenderContext, mScaleCalculator->mapUnits() );
+ delete overlayManager;
+ overlayManager = NULL;
+ }
- if ( !ml )
- {
- QgsDebugMsg( "Layer not found in registry!" );
- continue;
- }
+ // make sure progress bar arrives at 100%!
+ emit drawingProgress( 1, 1 );
- QgsDebugMsg( "Rendering layer " + ml->name() );
- QgsDebugMsg( " Layer minscale " + QString( "%1" ).arg( ml->minimumScale() ) );
- QgsDebugMsg( " Layer maxscale " + QString( "%1" ).arg( ml->maximumScale() ) );
- QgsDebugMsg( " Scale dep. visibility enabled? " + QString( "%1" ).arg( ml->hasScaleBasedVisibility() ) );
- QgsDebugMsg( " Input extent: " + ml->extent().toString() );
+ if ( mLabelingEngine )
+ {
+ // set correct extent
+ mRenderContext.setExtent( mExtent );
+ mRenderContext.setCoordinateTransform( NULL );
- if ( !ml->hasScaleBasedVisibility() || ( ml->minimumScale() < mScale && mScale < ml->maximumScale() ) || mOverview )
- {
- connect( ml, SIGNAL( drawingProgress( int, int ) ), this, SLOT( onDrawingProgress( int, int ) ) );
+ mLabelingEngine->drawLabeling( mRenderContext );
+ mLabelingEngine->exit();
+ }
- //
- // Now do the call to the layer that actually does
- // the rendering work!
- //
+ QgsDebugMsg( "Rendering completed in (seconds): " + QString( "%1" ).arg( renderTime.elapsed() / 1000.0 ) );
- bool split = false;
+ mDrawing = false;
- if ( hasCrsTransformEnabled() )
- {
- r1 = mExtent;
- split = splitLayersExtent( ml, r1, r2 );
- ct = new QgsCoordinateTransform( ml->srs(), *mDestCRS );
- mRenderContext.setExtent( r1 );
- }
- else
- {
- ct = NULL;
- }
+}
- mRenderContext.setCoordinateTransform( ct );
- //decide if we have to scale the raster
- //this is necessary in case QGraphicsScene is used
- bool scaleRaster = false;
- QgsMapToPixel rasterMapToPixel;
- QgsMapToPixel bk_mapToPixel;
- if ( ml->type() == QgsMapLayer::RasterLayer && fabs( rasterScaleFactor - 1.0 ) > 0.000001 )
- {
- scaleRaster = true;
- }
+void QgsMapRenderer::renderLayer( QString layerId, bool mySameAsLastFlag, QgsOverlayObjectPositionManager* overlayManager )
+{
+ // Store the painter in case we need to swap it out for the
+ // cache painter
+ QPainter * mypContextPainter = mRenderContext.painter();
- //create overlay objects for features within the view extent
- if ( ml->type() == QgsMapLayer::VectorLayer && overlayManager )
- {
- QgsVectorLayer* vl = qobject_cast<QgsVectorLayer *>( ml );
- if ( vl )
- {
- QList<QgsVectorOverlay*> thisLayerOverlayList;
- vl->vectorOverlays( thisLayerOverlayList );
+ QgsDebugMsg( "Rendering at layer item " + layerId );
- QList<QgsVectorOverlay*>::iterator overlayIt = thisLayerOverlayList.begin();
- for ( ; overlayIt != thisLayerOverlayList.end(); ++overlayIt )
- {
- if (( *overlayIt )->displayFlag() )
- {
- ( *overlayIt )->createOverlayObjects( mRenderContext );
- allOverlayList.push_back( *overlayIt );
- }
- }
+ //emit drawingProgress(myRenderCounter++, mLayerSet.size());
+ QgsMapLayer *ml = QgsMapLayerRegistry::instance()->mapLayer( layerId );
- overlayManager->addLayer( vl, thisLayerOverlayList );
- }
- }
+ if ( !ml )
+ {
+ QgsDebugMsg( "Layer not found in registry!" );
+ return;
+ }
- // Force render of layers that are being edited
- // or if there's a labeling engine that needs the layer to register features
- if ( ml->type() == QgsMapLayer::VectorLayer )
- {
- QgsVectorLayer* vl = qobject_cast<QgsVectorLayer *>( ml );
- if ( vl->isEditable() ||
- ( mRenderContext.labelingEngine() && mRenderContext.labelingEngine()->willUseLayer( vl ) ) )
- {
- ml->setCacheImage( 0 );
- }
- }
+ QgsDebugMsg( "Rendering layer " + ml->name() );
+ QgsDebugMsg( " Layer minscale " + QString( "%1" ).arg( ml->minimumScale() ) );
+ QgsDebugMsg( " Layer maxscale " + QString( "%1" ).arg( ml->maximumScale() ) );
+ QgsDebugMsg( " Scale dep. visibility enabled? " + QString( "%1" ).arg( ml->hasScaleBasedVisibility() ) );
+ QgsDebugMsg( " Input extent: " + ml->extent().toString() );
- QSettings mySettings;
- if ( ! split )//render caching does not yet cater for split extents
- {
- if ( mySettings.value( "/qgis/enable_render_caching", false ).toBool() )
- {
- if ( !mySameAsLastFlag || ml->cacheImage() == 0 )
- {
- QgsDebugMsg( "\n\n\nCaching enabled but layer redraw forced by extent change or empty cache\n\n\n" );
- QImage * mypImage = new QImage( mRenderContext.painter()->device()->width(),
- mRenderContext.painter()->device()->height(), QImage::Format_ARGB32 );
- mypImage->fill( 0 );
- ml->setCacheImage( mypImage ); //no need to delete the old one, maplayer does it for you
- QPainter * mypPainter = new QPainter( ml->cacheImage() );
- if ( mySettings.value( "/qgis/enable_anti_aliasing", false ).toBool() )
- {
- mypPainter->setRenderHint( QPainter::Antialiasing );
- }
- mRenderContext.setPainter( mypPainter );
- }
- else if ( mySameAsLastFlag )
- {
- //draw from cached image
- QgsDebugMsg( "\n\n\nCaching enabled --- drawing layer from cached image\n\n\n" );
- mypContextPainter->drawImage( 0, 0, *( ml->cacheImage() ) );
- disconnect( ml, SIGNAL( drawingProgress( int, int ) ), this, SLOT( onDrawingProgress( int, int ) ) );
- //short circuit as there is nothing else to do...
- continue;
- }
- }
- }
+ if ( ml->hasScaleBasedVisibility() && ( ml->minimumScale() > mScale || ml->maximumScale() < mScale ) && ! mOverview )
+ {
+ QgsDebugMsg( "Layer not rendered because it is not within the defined "
+ "visibility scale range" );
+ return;
+ }
- if ( scaleRaster )
- {
- bk_mapToPixel = mRenderContext.mapToPixel();
- rasterMapToPixel = mRenderContext.mapToPixel();
- rasterMapToPixel.setMapUnitsPerPixel( mRenderContext.mapToPixel().mapUnitsPerPixel() / rasterScaleFactor );
- rasterMapToPixel.setYMaximum( mSize.height() * rasterScaleFactor );
- mRenderContext.setMapToPixel( rasterMapToPixel );
- mRenderContext.painter()->save();
- mRenderContext.painter()->scale( 1.0 / rasterScaleFactor, 1.0 / rasterScaleFactor );
- }
+ connect( ml, SIGNAL( drawingProgress( int, int ) ), this, SLOT( onDrawingProgress( int, int ) ) );
+ //
+ // Now do the call to the layer that actually does
+ // the rendering work!
+ //
- if ( !ml->draw( mRenderContext ) )
- {
- emit drawError( ml );
- }
- else
- {
- QgsDebugMsg( "Layer rendered without issues" );
- }
+ bool split = false;
+ QgsRectangle r1, r2;
+ QgsCoordinateTransform* ct;
- if ( split )
+ if ( hasCrsTransformEnabled() )
+ {
+ r1 = mExtent;
+ split = splitLayersExtent( ml, r1, r2 );
+ ct = new QgsCoordinateTransform( ml->srs(), *mDestCRS );
+ mRenderContext.setExtent( r1 );
+ }
+ else
+ {
+ ct = NULL;
+ }
+
+ mRenderContext.setCoordinateTransform( ct );
+
+ //decide if we have to scale the raster
+ //this is necessary in case QGraphicsScene is used
+ bool scaleRaster = false;
+ double rasterScaleFactor = mRenderContext.rasterScaleFactor();
+ QgsMapToPixel rasterMapToPixel;
+ QgsMapToPixel bk_mapToPixel;
+
+ if ( ml->type() == QgsMapLayer::RasterLayer && fabs( rasterScaleFactor - 1.0 ) > 0.000001 )
+ {
+ scaleRaster = true;
+ }
+
+
+ //create overlay objects for features within the view extent
+ if ( ml->type() == QgsMapLayer::VectorLayer && overlayManager )
+ {
+ QgsVectorLayer* vl = qobject_cast<QgsVectorLayer *>( ml );
+ if ( vl )
+ {
+ overlayManager->addOverlaysForLayer( vl, mRenderContext );
+ }
+ }
+
+ // Force render of layers that are being edited
+ // or if there's a labeling engine that needs the layer to register features
+ if ( ml->type() == QgsMapLayer::VectorLayer )
+ {
+ QgsVectorLayer* vl = qobject_cast<QgsVectorLayer *>( ml );
+ if ( vl->isEditable() ||
+ ( mRenderContext.labelingEngine() && mRenderContext.labelingEngine()->willUseLayer( vl ) ) )
+ {
+ ml->setCacheImage( 0 );
+ }
+ }
+
+ QSettings mySettings;
+ if ( ! split )//render caching does not yet cater for split extents
+ {
+ if ( mySettings.value( "/qgis/enable_render_caching", false ).toBool() )
+ {
+ if ( !mySameAsLastFlag || ml->cacheImage() == 0 )
{
- mRenderContext.setExtent( r2 );
- if ( !ml->draw( mRenderContext ) )
+ QgsDebugMsg( "\n\n\nCaching enabled but layer redraw forced by extent change or empty cache\n\n\n" );
+ QImage * mypImage = new QImage( mRenderContext.painter()->device()->width(),
+ mRenderContext.painter()->device()->height(), QImage::Format_ARGB32 );
+ mypImage->fill( 0 );
+ ml->setCacheImage( mypImage ); //no need to delete the old one, maplayer does it for you
+ QPainter * mypPainter = new QPainter( ml->cacheImage() );
+ if ( mySettings.value( "/qgis/enable_anti_aliasing", false ).toBool() )
{
- emit drawError( ml );
+ mypPainter->setRenderHint( QPainter::Antialiasing );
}
+ mRenderContext.setPainter( mypPainter );
}
-
- if ( scaleRaster )
+ else if ( mySameAsLastFlag )
{
- mRenderContext.setMapToPixel( bk_mapToPixel );
- mRenderContext.painter()->restore();
+ //draw from cached image
+ QgsDebugMsg( "\n\n\nCaching enabled --- drawing layer from cached image\n\n\n" );
+ mypContextPainter->drawImage( 0, 0, *( ml->cacheImage() ) );
+ disconnect( ml, SIGNAL( drawingProgress( int, int ) ), this, SLOT( onDrawingProgress( int, int ) ) );
+ //short circuit as there is nothing else to do...
+ return;
}
+ }
+ }
- if ( mySettings.value( "/qgis/enable_render_caching", false ).toBool() )
- {
- if ( !split )
- {
- // composite the cached image into our view and then clean up from caching
- // by reinstating the painter as it was swapped out for caching renders
- delete mRenderContext.painter();
- mRenderContext.setPainter( mypContextPainter );
- //draw from cached image that we created further up
- mypContextPainter->drawImage( 0, 0, *( ml->cacheImage() ) );
- }
- }
- disconnect( ml, SIGNAL( drawingProgress( int, int ) ), this, SLOT( onDrawingProgress( int, int ) ) );
+ if ( scaleRaster )
+ {
+ bk_mapToPixel = mRenderContext.mapToPixel();
+ rasterMapToPixel = mRenderContext.mapToPixel();
+ rasterMapToPixel.setMapUnitsPerPixel( mRenderContext.mapToPixel().mapUnitsPerPixel() / rasterScaleFactor );
+ rasterMapToPixel.setYMaximum( mSize.height() * rasterScaleFactor );
+ mRenderContext.setMapToPixel( rasterMapToPixel );
+ mRenderContext.painter()->save();
+ mRenderContext.painter()->scale( 1.0 / rasterScaleFactor, 1.0 / rasterScaleFactor );
+ }
+
+
+ if ( !ml->draw( mRenderContext ) )
+ {
+ emit drawError( ml );
+ }
+ else
+ {
+ QgsDebugMsg( "Layer rendered without issues" );
+ }
+
+ if ( split )
+ {
+ mRenderContext.setExtent( r2 );
+ if ( !ml->draw( mRenderContext ) )
+ {
+ emit drawError( ml );
}
- else // layer not visible due to scale
+ }
+
+ if ( scaleRaster )
+ {
+ mRenderContext.setMapToPixel( bk_mapToPixel );
+ mRenderContext.painter()->restore();
+ }
+
+ if ( mySettings.value( "/qgis/enable_render_caching", false ).toBool() )
+ {
+ if ( !split )
{
- QgsDebugMsg( "Layer not rendered because it is not within the defined "
- "visibility scale range" );
+ // composite the cached image into our view and then clean up from caching
+ // by reinstating the painter as it was swapped out for caching renders
+ delete mRenderContext.painter();
+ mRenderContext.setPainter( mypContextPainter );
+ //draw from cached image that we created further up
+ mypContextPainter->drawImage( 0, 0, *( ml->cacheImage() ) );
}
+ }
+ disconnect( ml, SIGNAL( drawingProgress( int, int ) ), this, SLOT( onDrawingProgress( int, int ) ) );
- } // while (li.hasPrevious())
+}
- QgsDebugMsg( "Done rendering map layers" );
- if ( !mOverview )
+void QgsMapRenderer::renderLabels()
+{
+ QListIterator<QString> li( mLayerSet );
+ QgsCoordinateTransform* ct;
+ QgsRectangle r1, r2;
+
+ // render all labels for vector layers in the stack, starting at the base
+ li.toBack();
+ while ( li.hasPrevious() )
{
- // render all labels for vector layers in the stack, starting at the base
- li.toBack();
- while ( li.hasPrevious() )
+ if ( mRenderContext.renderingStopped() )
{
- if ( mRenderContext.renderingStopped() )
- {
- break;
- }
+ break;
+ }
- QString layerId = li.previous();
+ QString layerId = li.previous();
- // TODO: emit drawingProgress((myRenderCounter++),zOrder.size());
- QgsMapLayer *ml = QgsMapLayerRegistry::instance()->mapLayer( layerId );
+ // TODO: emit drawingProgress((myRenderCounter++),zOrder.size());
+ QgsMapLayer *ml = QgsMapLayerRegistry::instance()->mapLayer( layerId );
- if ( ml && ( ml->type() != QgsMapLayer::RasterLayer ) )
- {
- // only make labels if the layer is visible
- // after scale dep viewing settings are checked
- if ( !ml->hasScaleBasedVisibility() || ( ml->minimumScale() < mScale && mScale < ml->maximumScale() ) )
- {
- bool split = false;
+ if ( !ml || ( ml->type() != QgsMapLayer::VectorLayer ) )
+ continue;
- if ( hasCrsTransformEnabled() )
- {
- QgsRectangle r1 = mExtent;
- split = splitLayersExtent( ml, r1, r2 );
- ct = new QgsCoordinateTransform( ml->srs(), *mDestCRS );
- mRenderContext.setExtent( r1 );
- }
- else
- {
- ct = NULL;
- }
+ // only make labels if the layer is visible
+ // after scale dep viewing settings are checked
+ if ( ml->hasScaleBasedVisibility() && ( ml->minimumScale() > mScale || mScale > ml->maximumScale() ) )
+ continue;
- mRenderContext.setCoordinateTransform( ct );
+ bool split = false;
- ml->drawLabels( mRenderContext );
- if ( split )
- {
- mRenderContext.setExtent( r2 );
- ml->drawLabels( mRenderContext );
- }
- }
- }
+ if ( hasCrsTransformEnabled() )
+ {
+ r1 = mExtent;
+ split = splitLayersExtent( ml, r1, r2 );
+ ct = new QgsCoordinateTransform( ml->srs(), *mDestCRS );
+ mRenderContext.setExtent( r1 );
}
- } // if (!mOverview)
-
- //find overlay positions and draw the vector overlays
- if ( overlayManager && allOverlayList.size() > 0 )
- {
- overlayManager->findObjectPositions( mRenderContext, mScaleCalculator->mapUnits() );
- //draw all the overlays
- QList<QgsVectorOverlay*>::iterator allOverlayIt = allOverlayList.begin();
- for ( ; allOverlayIt != allOverlayList.end(); ++allOverlayIt )
+ else
{
- ( *allOverlayIt )->drawOverlayObjects( mRenderContext );
+ ct = NULL;
}
- overlayManager->removeLayers();
- }
- delete overlayManager;
- // make sure progress bar arrives at 100%!
- emit drawingProgress( 1, 1 );
+ mRenderContext.setCoordinateTransform( ct );
- if ( mLabelingEngine )
- {
- // set correct extent
- mRenderContext.setExtent( mExtent );
- mRenderContext.setCoordinateTransform( NULL );
+ ml->drawLabels( mRenderContext );
+ if ( split )
+ {
+ mRenderContext.setExtent( r2 );
+ ml->drawLabels( mRenderContext );
+ }
- mLabelingEngine->drawLabeling( mRenderContext );
- mLabelingEngine->exit();
}
- QgsDebugMsg( "Rendering completed in (seconds): " + QString( "%1" ).arg( renderTime.elapsed() / 1000.0 ) );
-
- mDrawing = false;
-
}
+
void QgsMapRenderer::setMapUnits( QGis::UnitType u )
{
mScaleCalculator->setMapUnits( u );
Modified: branches/threading-branch/src/core/qgsmaprenderer.h
===================================================================
--- branches/threading-branch/src/core/qgsmaprenderer.h 2010-06-04 13:47:11 UTC (rev 13646)
+++ branches/threading-branch/src/core/qgsmaprenderer.h 2010-06-04 14:32:27 UTC (rev 13647)
@@ -185,6 +185,14 @@
//! Added in QGIS v1.4
void setLabelingEngine( QgsLabelingEngineInterface* iface );
+ //! Enable or disable rendering in multiple threads on multiprocessor computers
+ //! Added in QGIS v1.6
+ void setUsingThreadedRendering( bool use ) { mUsingThreadedRendering = use; }
+
+ //! Determine whether we are using threaded rendering
+ //! Added in QGIS v1.6
+ bool isUsingThreadedRendering() const { return mUsingThreadedRendering; }
+
signals:
void drawingProgress( int current, int total );
@@ -218,6 +226,12 @@
*/
bool splitLayersExtent( QgsMapLayer* layer, QgsRectangle& extent, QgsRectangle& r2 );
+ //! render one layer
+ void renderLayer( QString layerId, bool mySameAsLastFlag, QgsOverlayObjectPositionManager* overlayManager );
+
+ //! render labels for vector layers (not using PAL)
+ void renderLabels();
+
/**Creates an overlay object position manager subclass according to the current settings
@note this method was added in version 1.1*/
QgsOverlayObjectPositionManager* overlayManagerFromSettings();
@@ -274,6 +288,9 @@
//! Labeling engine (NULL by default)
QgsLabelingEngineInterface* mLabelingEngine;
+
+ //! Multithreaded rendering
+ bool mUsingThreadedRendering;
};
#endif
Added: branches/threading-branch/src/core/qgsoverlayobjectpositionmanager.cpp
===================================================================
--- branches/threading-branch/src/core/qgsoverlayobjectpositionmanager.cpp (rev 0)
+++ branches/threading-branch/src/core/qgsoverlayobjectpositionmanager.cpp 2010-06-04 14:32:27 UTC (rev 13647)
@@ -0,0 +1,42 @@
+
+#include "qgsoverlayobjectpositionmanager.h"
+
+#include "qgsvectorlayer.h"
+#include "qgsvectoroverlay.h"
+
+void QgsOverlayObjectPositionManager::addOverlaysForLayer( QgsVectorLayer* vl, QgsRenderContext& context )
+{
+ QList<QgsVectorOverlay*> thisLayerOverlayList;
+ vl->vectorOverlays( thisLayerOverlayList );
+
+ QList<QgsVectorOverlay*>::iterator overlayIt = thisLayerOverlayList.begin();
+ for ( ; overlayIt != thisLayerOverlayList.end(); ++overlayIt )
+ {
+ if (( *overlayIt )->displayFlag() )
+ {
+ ( *overlayIt )->createOverlayObjects( context );
+ allOverlayList.push_back( *overlayIt );
+ }
+ }
+
+ addLayer( vl, thisLayerOverlayList );
+}
+
+void QgsOverlayObjectPositionManager::drawOverlays( QgsRenderContext& context, QGis::UnitType unitType )
+{
+ if ( allOverlayList.isEmpty() )
+ return;
+
+ findObjectPositions( context, unitType );
+
+ // draw all the overlays
+ QList<QgsVectorOverlay*>::iterator allOverlayIt = allOverlayList.begin();
+ for ( ; allOverlayIt != allOverlayList.end(); ++allOverlayIt )
+ {
+ ( *allOverlayIt )->drawOverlayObjects( context );
+ }
+
+ removeLayers();
+
+ allOverlayList.clear();
+}
Modified: branches/threading-branch/src/core/qgsoverlayobjectpositionmanager.h
===================================================================
--- branches/threading-branch/src/core/qgsoverlayobjectpositionmanager.h 2010-06-04 13:47:11 UTC (rev 13646)
+++ branches/threading-branch/src/core/qgsoverlayobjectpositionmanager.h 2010-06-04 14:32:27 UTC (rev 13647)
@@ -42,6 +42,18 @@
@param context Context of rendering operation (Painter, scale factor)
@param unitType meters, feet, degrees*/
virtual void findObjectPositions( const QgsRenderContext& context, QGis::UnitType unitType ) = 0;
+
+ //! add overlays assigned with the layer.
+ //! Added in QGIS 1.6
+ virtual void addOverlaysForLayer( QgsVectorLayer* vl, QgsRenderContext& context );
+
+ //! find overlay positions and draw the vector overlays.
+ //! Added in QGIS 1.6
+ virtual void drawOverlays( QgsRenderContext& context, QGis::UnitType unitType );
+
+ protected:
+ //list of all overlays, used to draw them after layers have been rendered
+ QList<QgsVectorOverlay*> allOverlayList;
};
#endif
More information about the QGIS-commit
mailing list