[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