From d2b01bc5eb2ea268b2187f3721e64a11b0ebc117 Mon Sep 17 00:00:00 2001 From: Radim Blazek Date: Fri, 29 Jun 2012 18:37:10 +0200 Subject: [PATCH] Role removed from QgsRasterInterface, the logic moved to QgsRasterPipe --- src/core/qgsrasterdataprovider.cpp | 4 +- src/core/qgsrasterprojector.cpp | 6 +- src/core/raster/qgsrasterinterface.cpp | 7 +- src/core/raster/qgsrasterinterface.h | 20 +-- src/core/raster/qgsrasterlayer.cpp | 36 ++---- src/core/raster/qgsrasterlayer.h | 12 +- src/core/raster/qgsrasterpipe.cpp | 136 +++++++++++--------- src/core/raster/qgsrasterpipe.h | 41 ++++-- src/core/raster/qgsrasterrenderer.cpp | 2 +- src/core/raster/qgsrasterresamplefilter.cpp | 2 +- 10 files changed, 131 insertions(+), 135 deletions(-) diff --git a/src/core/qgsrasterdataprovider.cpp b/src/core/qgsrasterdataprovider.cpp index 90358e12c1f9..86f6138883e1 100644 --- a/src/core/qgsrasterdataprovider.cpp +++ b/src/core/qgsrasterdataprovider.cpp @@ -105,14 +105,14 @@ void * QgsRasterDataProvider::readBlock( int bandNo, QgsRectangle const & exten } QgsRasterDataProvider::QgsRasterDataProvider() - : QgsRasterInterface( 0, QgsRasterInterface::ProviderRole ) + : QgsRasterInterface( 0 ) , mDpi( -1 ) { } QgsRasterDataProvider::QgsRasterDataProvider( QString const & uri ) : QgsDataProvider( uri ) - , QgsRasterInterface( 0, QgsRasterInterface::ProviderRole ) + , QgsRasterInterface( 0 ) , mDpi( -1 ) { } diff --git a/src/core/qgsrasterprojector.cpp b/src/core/qgsrasterprojector.cpp index 9b81f6fe3b91..3d882365d390 100644 --- a/src/core/qgsrasterprojector.cpp +++ b/src/core/qgsrasterprojector.cpp @@ -26,7 +26,7 @@ QgsRasterProjector::QgsRasterProjector( int theDestRows, int theDestCols, double theMaxSrcXRes, double theMaxSrcYRes, QgsRectangle theExtent ) - : QgsRasterInterface( 0, QgsRasterInterface::ProjectorRole ) + : QgsRasterInterface( 0 ) , mSrcCRS( theSrcCRS ) , mDestCRS( theDestCRS ) , mCoordinateTransform( theDestCRS, theSrcCRS ) @@ -47,7 +47,7 @@ QgsRasterProjector::QgsRasterProjector( QgsCoordinateReferenceSystem theDestCRS, double theMaxSrcXRes, double theMaxSrcYRes, QgsRectangle theExtent ) - : QgsRasterInterface( 0, QgsRasterInterface::ProjectorRole ) + : QgsRasterInterface( 0 ) , mSrcCRS( theSrcCRS ) , mDestCRS( theDestCRS ) , mCoordinateTransform( theDestCRS, theSrcCRS ) @@ -59,7 +59,7 @@ QgsRasterProjector::QgsRasterProjector( } QgsRasterProjector::QgsRasterProjector() - : QgsRasterInterface( 0, QgsRasterInterface::ProjectorRole ) + : QgsRasterInterface( 0) , pHelperTop( 0 ), pHelperBottom( 0 ) { QgsDebugMsg( "Entered" ); diff --git a/src/core/raster/qgsrasterinterface.cpp b/src/core/raster/qgsrasterinterface.cpp index b237d87a9a76..9d79771a709d 100644 --- a/src/core/raster/qgsrasterinterface.cpp +++ b/src/core/raster/qgsrasterinterface.cpp @@ -21,9 +21,8 @@ #include "qgslogger.h" #include "qgsrasterinterface.h" -QgsRasterInterface::QgsRasterInterface( QgsRasterInterface * input, Role role ) +QgsRasterInterface::QgsRasterInterface( QgsRasterInterface * input ) : mInput( input ) - , mRole( role ) , mTimeMinSize( 150 ) { } @@ -60,7 +59,7 @@ void * QgsRasterInterface::block( int bandNo, QgsRectangle const & extent, int } // QTime counts only in miliseconds mTime[bandNo] = time.elapsed(); - QgsDebugMsg( QString( "mRole = %1 bandNo = %2 time = %3" ).arg( mRole ).arg( bandNo ).arg( mTime[bandNo] ) ); + QgsDebugMsg( QString( "bandNo = %2 time = %3" ).arg( bandNo ).arg( mTime[bandNo] ) ); } return b; } @@ -79,7 +78,7 @@ double QgsRasterInterface::time( int bandNo ) { t = mTime.value( bandNo ); } - QgsDebugMsg( QString( "mRole = %1 bandNo = %2 time = %3" ).arg( mRole ).arg( bandNo ).arg( t ) ); + QgsDebugMsg( QString( "bandNo = %2 time = %3" ).arg( bandNo ).arg( t ) ); return t; } diff --git a/src/core/raster/qgsrasterinterface.h b/src/core/raster/qgsrasterinterface.h index 512c676d5781..29cd8b96bc9f 100644 --- a/src/core/raster/qgsrasterinterface.h +++ b/src/core/raster/qgsrasterinterface.h @@ -30,18 +30,6 @@ class CORE_EXPORT QgsRasterInterface { public: - /** Role is used to identify certain type of interface in pipe and replace - * it with another of the same Role for example - */ - enum Role - { - UnknownRole = 0, - ProviderRole = 1, - RendererRole = 2, - ResamplerRole = 3, - ProjectorRole = 4 - }; - /** Data types. * This is modified and extended copy of GDALDataType. */ @@ -67,13 +55,10 @@ class CORE_EXPORT QgsRasterInterface TypeCount = 14 /* maximum type # + 1 */ }; - QgsRasterInterface( QgsRasterInterface * input = 0, Role role = UnknownRole ); + QgsRasterInterface( QgsRasterInterface * input = 0 ); virtual ~QgsRasterInterface(); - /** Interface role */ - Role role() { return mRole; } - int typeSize( int dataType ) const { // Modified and extended copy from GDAL @@ -174,9 +159,6 @@ class CORE_EXPORT QgsRasterInterface double avgTime(); protected: - // Role of interface - Role mRole; - // QgsRasterInterface used as input QgsRasterInterface* mInput; diff --git a/src/core/raster/qgsrasterlayer.cpp b/src/core/raster/qgsrasterlayer.cpp index ef676d17ffbe..bdeb43315f89 100644 --- a/src/core/raster/qgsrasterlayer.cpp +++ b/src/core/raster/qgsrasterlayer.cpp @@ -853,12 +853,12 @@ void QgsRasterLayer::draw( QPainter * theQPainter, } */ - QgsRasterProjector *projector = dynamic_cast( mPipe.filter( QgsRasterInterface::ProjectorRole ) ); + QgsRasterProjector *projector = mPipe.projector(); // TODO: add in init? if ( !projector ) { projector = new QgsRasterProjector; - mPipe.insertOrReplace( projector ); + mPipe.setFilter( projector ); } // TODO add a method to interface to get provider and get provider @@ -1022,7 +1022,7 @@ QList< QPair< QString, QColor > > QgsRasterLayer::legendSymbologyItems() const //{ // mRenderer->legendSymbologyItems( symbolList ); //} - QgsRasterRenderer *renderer = dynamic_cast( mPipe.filter( QgsRasterInterface::RendererRole ) ); + QgsRasterRenderer *renderer = mPipe.renderer(); if ( renderer ) { renderer->legendSymbologyItems( symbolList ); @@ -1671,7 +1671,7 @@ void QgsRasterLayer::setDataProvider( QString const & provider ) { return; } - mPipe.insertOrReplace( mDataProvider ); + mPipe.setFilter( mDataProvider ); if ( provider == "gdal" ) { @@ -2116,30 +2116,14 @@ void QgsRasterLayer::setTransparentBandName( QString const & ) void QgsRasterLayer::setRenderer( QgsRasterRenderer* theRenderer ) { QgsDebugMsg( "Entered" ); - //delete mRenderer; - //mRenderer = renderer; - mPipe.insertOrReplace( theRenderer ); - - /* - if ( !mResampleFilter ) - { - mResampleFilter = new QgsRasterResampleFilter( mRenderer ); - } - else - { - mResampleFilter->setInput( mRenderer ); - } - */ + mPipe.setFilter( theRenderer ); } // not sure if we want it void QgsRasterLayer::setResampleFilter( QgsRasterResampleFilter* resampleFilter ) { QgsDebugMsg( "Entered" ); - //delete mResampleFilter; - //mResampleFilter = resampleFilter; - //mResampleFilter->setInput( mRenderer ); - mPipe.insertOrReplace( resampleFilter ); + mPipe.setFilter( resampleFilter ); } void QgsRasterLayer::showProgress( int theValue ) @@ -2307,7 +2291,7 @@ bool QgsRasterLayer::readSymbology( const QDomNode& layer_node, QString& errorMe { //mRenderer = rendererEntry.rendererCreateFunction( rasterRendererElem, dataProvider() ); QgsRasterRenderer *renderer = rendererEntry.rendererCreateFunction( rasterRendererElem, dataProvider() ); - mPipe.insertOrReplace( renderer ); + mPipe.setFilter( renderer ); } } } @@ -2317,7 +2301,7 @@ bool QgsRasterLayer::readSymbology( const QDomNode& layer_node, QString& errorMe //mResampleFilter = new QgsRasterResampleFilter( mRenderer ); QgsRasterResampleFilter * resampleFilter = new QgsRasterResampleFilter(); - mPipe.insertOrReplace( resampleFilter ); + mPipe.setFilter( resampleFilter ); //max oversampling QDomElement resampleElem = layer_node.firstChildElement( "rasterresampler" ); @@ -2506,13 +2490,13 @@ bool QgsRasterLayer::writeSymbology( QDomNode & layer_node, QDomDocument & docum //{ //mRenderer->writeXML( document, layerElem ); //} - QgsRasterRenderer *renderer = dynamic_cast( mPipe.filter( QgsRasterInterface::RendererRole ) ); + QgsRasterRenderer *renderer = mPipe.renderer(); if ( renderer ) { renderer->writeXML( document, layerElem ); } - QgsRasterResampleFilter *resampleFilter = dynamic_cast( mPipe.filter( QgsRasterInterface::ResamplerRole ) ); + QgsRasterResampleFilter *resampleFilter = mPipe.resampleFilter(); if ( resampleFilter ) { QDomElement layerElem = layer_node.toElement(); diff --git a/src/core/raster/qgsrasterlayer.h b/src/core/raster/qgsrasterlayer.h index 64351d63a88c..f782d1e49d2e 100644 --- a/src/core/raster/qgsrasterlayer.h +++ b/src/core/raster/qgsrasterlayer.h @@ -352,17 +352,13 @@ class CORE_EXPORT QgsRasterLayer : public QgsMapLayer /**Set raster renderer. Takes ownership of the renderer object*/ void setRenderer( QgsRasterRenderer* theRenderer ); - //const QgsRasterRenderer* renderer() const { return mRenderer; } - //QgsRasterRenderer* renderer() { return mRenderer; } - const QgsRasterRenderer* renderer() const { return dynamic_cast( mPipe.filter( QgsRasterInterface::RendererRole ) ); } - QgsRasterRenderer* renderer() { return dynamic_cast( mPipe.filter( QgsRasterInterface::RendererRole ) ); } + //const QgsRasterRenderer* renderer() const { return mPipe.renderer(); } + QgsRasterRenderer* renderer() const { return mPipe.renderer(); } /**Set raster resample filter. Takes ownership of the resample filter object*/ void setResampleFilter( QgsRasterResampleFilter* resampleFilter ); - //const QgsRasterResampleFilter* resampleFilter() const { return mResampleFilter; } - //QgsRasterResampleFilter * resampleFilter() { return mResampleFilter; } - const QgsRasterResampleFilter* resampleFilter() const { return dynamic_cast( mPipe.filter( QgsRasterInterface::ResamplerRole ) ); } - QgsRasterResampleFilter * resampleFilter() { return dynamic_cast( mPipe.filter( QgsRasterInterface::ResamplerRole ) ); } + //const QgsRasterResampleFilter* resampleFilter() const { return mPipe.resampleFilter(); } + QgsRasterResampleFilter * resampleFilter() const { return mPipe.resampleFilter(); } /** Get raster pipe */ QgsRasterPipe * pipe() { return &mPipe; } diff --git a/src/core/raster/qgsrasterpipe.cpp b/src/core/raster/qgsrasterpipe.cpp index dd9f463e0f0f..e060e4d9ec20 100644 --- a/src/core/raster/qgsrasterpipe.cpp +++ b/src/core/raster/qgsrasterpipe.cpp @@ -23,6 +23,10 @@ #include QgsRasterPipe::QgsRasterPipe() + : mProvider(0) + , mRenderer(0) + , mResampleFilter(0) + , mProjector(0) { } @@ -30,7 +34,7 @@ QgsRasterPipe::~QgsRasterPipe() { foreach ( QgsRasterInterface* filter, mFilters ) { - //delete filter; // TODO enable + delete filter; } } @@ -48,16 +52,6 @@ bool QgsRasterPipe::connectFilters ( QVector theFilters ) return true; } -/* -bool QgsRasterPipe::addFilter ( QgsRasterInterface * theFilter ) -{ - mFilters.append ( theFilter ); - if ( mFilters.size() < 2 ) { - return true; - } - return theFilter->setInput ( mFilters[ mFilters.size()-2 ] ); -} -*/ bool QgsRasterPipe::insert ( int idx, QgsRasterInterface* theFilter ) { QgsDebugMsg( QString ( "insert %1 at %2" ).arg( typeid(*theFilter).name() ).arg ( idx ) ); @@ -75,6 +69,7 @@ bool QgsRasterPipe::insert ( int idx, QgsRasterInterface* theFilter ) { success = true; mFilters.insert ( idx, theFilter ); + setRole ( theFilter, idx ); QgsDebugMsg( "inserted ok" ); } @@ -103,6 +98,7 @@ bool QgsRasterPipe::replace ( int idx, QgsRasterInterface* theFilter ) success = true; delete mFilters[idx]; mFilters[idx] = theFilter; + setRole ( theFilter, idx ); QgsDebugMsg( "replaced ok" ); } @@ -111,85 +107,105 @@ bool QgsRasterPipe::replace ( int idx, QgsRasterInterface* theFilter ) return success; } -bool QgsRasterPipe::insertOrReplace( QgsRasterInterface* theFilter ) +QgsRasterPipe::Role QgsRasterPipe::filterRole ( QgsRasterInterface * filter ) const +{ + if ( dynamic_cast( filter ) ) return ProviderRole; + if ( dynamic_cast( filter ) ) return RendererRole; + if ( dynamic_cast( filter ) ) return ResamplerRole; + if ( dynamic_cast( filter ) ) return ProjectorRole; + return UnknownRole; +} + +void QgsRasterPipe::setRole ( QgsRasterInterface * theFilter, int idx ) +{ + Role role = filterRole ( theFilter ); + if ( role == UnknownRole ) return; + mRoleMap.insert ( role, idx ); +} + +bool QgsRasterPipe::setFilter( QgsRasterInterface* theFilter ) { QgsDebugMsg( QString ( "%1" ).arg( typeid(*theFilter).name() ) ); + if ( !theFilter ) return false; - int idx = indexOf ( theFilter->role() ); - if ( idx >= 0 ) + + QgsRasterDataProvider * provider = dynamic_cast( theFilter ); + QgsRasterRenderer * renderer; + QgsRasterResampleFilter * resampleFilter; + QgsRasterProjector * projector; + + Role role = filterRole ( theFilter ); + + // We dont know where to place unknown filter + if ( role == UnknownRole ) return false; + + //if ( mFiltersMap.value ( role ) ) + if ( mRoleMap.contains ( role ) ) { - return replace ( idx, theFilter ); // replace may still fail and return false + // An old filter of the same role exists -> replace + // replace may still fail and return false + return replace ( mRoleMap.value(role), theFilter ); } + int idx = 0; + // Not found, find the best default position for this kind of filter - // The default order is: // QgsRasterDataProvider - ProviderRole // QgsRasterRenderer - RendererRole // QgsRasterResampler - ResamplerRole // QgsRasterProjector - ProjectorRole - int providerIdx = indexOf ( QgsRasterInterface::ProviderRole ); - int rendererIdx = indexOf ( QgsRasterInterface::RendererRole ); - int resamplerIdx = indexOf ( QgsRasterInterface::ResamplerRole ); - if ( theFilter->role() == QgsRasterInterface::ProviderRole ) + + int providerIdx = mRoleMap.value( ProviderRole,-1); + int rendererIdx = mRoleMap.value( RendererRole, -1 ); + int resamplerIdx = mRoleMap.value( ResamplerRole, -1 ); + + if ( role == ProviderRole ) { idx = 0; } - else if ( theFilter->role() == QgsRasterInterface::RendererRole ) + else if ( role == RendererRole ) { idx = providerIdx + 1; } - else if ( theFilter->role() == QgsRasterInterface::ResamplerRole ) + else if ( role == ResamplerRole ) { idx = qMax ( providerIdx, rendererIdx ) + 1; } - else if ( theFilter->role() == QgsRasterInterface::ProjectorRole ) + else if ( role == ProjectorRole ) { idx = qMax ( qMax( providerIdx,rendererIdx ), resamplerIdx ) + 1; } + return insert ( idx, theFilter ); // insert may still fail and return false } -int QgsRasterPipe::indexOf ( QgsRasterInterface::Role theRole ) const -{ - QgsDebugMsg( QString ( "role = %1" ).arg( theRole ) ); - //foreach ( QgsRasterInterface * filter, mFilters ) - - for ( int i = 0; i < mFilters.size(); i++ ) - { - if ( !mFilters[i] ) continue; - - if ( mFilters[i]->role() == theRole ) - { - return i; - } - /* - if ( typeid ( *theFilter ) == typeid ( *(mFilters[i]) ) ) - { - - QgsDebugMsg( QString ( "%1 found at %2" ).arg( typeid(*(mFilters[i])).name() ).arg(i) ); - return i; - } - - // known ancestor - if ( ( dynamic_cast( theFilter ) && dynamic_cast( mFilters[i] ) ) - || ( dynamic_cast( theFilter ) && dynamic_cast( mFilters[i] ) ) ) - { - QgsDebugMsg( QString ( "%1 found at %2" ).arg( typeid(*(mFilters[i])).name() ).arg(i) ); - return i; - } - */ - } - QgsDebugMsg( "role not found"); - return -1; -} -QgsRasterInterface * QgsRasterPipe::filter ( QgsRasterInterface::Role role ) const +QgsRasterInterface * QgsRasterPipe::filter ( Role role ) const { QgsDebugMsg( QString ( "role = %1" ).arg ( role ) ); - int idx = indexOf ( role ); - if ( idx >= 0 ) + if ( mRoleMap.contains ( role ) ) { - return mFilters[idx]; + return mFilters.value( mRoleMap.value( role) ); } return 0; } +QgsRasterDataProvider * QgsRasterPipe::provider() const +{ + return dynamic_cast(filter( ProviderRole)); +} + +QgsRasterRenderer * QgsRasterPipe::renderer() const +{ + return dynamic_cast(filter( RendererRole )); +} + +QgsRasterResampleFilter * QgsRasterPipe::resampleFilter() const +{ + return dynamic_cast(filter( ResamplerRole )); +} + +QgsRasterProjector * QgsRasterPipe::projector() const +{ + return dynamic_cast(filter ( ProjectorRole )); +} + diff --git a/src/core/raster/qgsrasterpipe.h b/src/core/raster/qgsrasterpipe.h index dae1236e7992..070ae3973cbf 100644 --- a/src/core/raster/qgsrasterpipe.h +++ b/src/core/raster/qgsrasterpipe.h @@ -36,6 +36,16 @@ class CORE_EXPORT QgsRasterPipe //: public QObject //Q_OBJECT public: + // Role of known filters + enum Role + { + UnknownRole = 0, + ProviderRole = 1, + RendererRole = 2, + ResamplerRole = 3, + ProjectorRole = 4 + }; + QgsRasterPipe( ); virtual ~QgsRasterPipe(); @@ -45,10 +55,6 @@ class CORE_EXPORT QgsRasterPipe //: public QObject bool connectFilters ( QVector theFilters ); - /** Add filter at the end of pipe and connect. - Returns true if connected or false if connection failed */ - //bool addFilter ( QgsRasterInterface * theFilter ); - /** Try to insert filter at specified index and connect * if connection would fail, the filter is not inserted and false is returned */ bool insert ( int idx, QgsRasterInterface* theFilter ); @@ -59,24 +65,37 @@ class CORE_EXPORT QgsRasterPipe //: public QObject /** Insert a new filter in prefered place or replace similar filter if it * already exists */ - bool insertOrReplace ( QgsRasterInterface * theFilter ); + bool setFilter ( QgsRasterInterface * theFilter ); - //QgsRasterInterface * filter ( QgsRasterInterface::Role role ); - QgsRasterInterface * filter ( QgsRasterInterface::Role role ) const; + QgsRasterInterface * filter ( Role role ) const; int size() { return mFilters.size(); } QgsRasterInterface * at( int idx ) { return mFilters.at(idx); } QgsRasterInterface * last() { return mFilters.last(); } - /** Delete all filters */ - //void clear(); + // Getters for special types of interfaces + QgsRasterDataProvider * provider() const; + QgsRasterRenderer * renderer() const; + QgsRasterResampleFilter * resampleFilter() const; + QgsRasterProjector * projector() const; private: - /** \brief Find index of existing filter of the given role */ - int indexOf ( QgsRasterInterface::Role role ) const; + /** Get known parent type_info of interface parent */ + Role filterRole ( QgsRasterInterface * filter ) const; // Filters in pipe, the first is always provider QVector mFilters; + + // Special types of interfaces + QgsRasterDataProvider * mProvider; + QgsRasterRenderer * mRenderer; + QgsRasterResampleFilter * mResampleFilter; + QgsRasterProjector * mProjector; + + QMap mRoleMap; + + // Set role in mFiltersMap + void setRole ( QgsRasterInterface * theFilter, int idx ); }; #endif diff --git a/src/core/raster/qgsrasterrenderer.cpp b/src/core/raster/qgsrasterrenderer.cpp index 48e56671b0ce..96b5ba62d65f 100644 --- a/src/core/raster/qgsrasterrenderer.cpp +++ b/src/core/raster/qgsrasterrenderer.cpp @@ -32,7 +32,7 @@ #include QgsRasterRenderer::QgsRasterRenderer( QgsRasterInterface* input, const QString& type ) - : QgsRasterInterface( input, QgsRasterInterface::RendererRole ), + : QgsRasterInterface( input ), mType( type ), mOpacity( 1.0 ), mRasterTransparency( 0 ), mAlphaBand( -1 ), mInvertColor( false ), mMaxOversampling( 2.0 ) { diff --git a/src/core/raster/qgsrasterresamplefilter.cpp b/src/core/raster/qgsrasterresamplefilter.cpp index d52ea91f478c..58076db2e14c 100644 --- a/src/core/raster/qgsrasterresamplefilter.cpp +++ b/src/core/raster/qgsrasterresamplefilter.cpp @@ -33,7 +33,7 @@ #include QgsRasterResampleFilter::QgsRasterResampleFilter( QgsRasterInterface* input ) - : QgsRasterInterface( input, QgsRasterInterface::ResamplerRole ), + : QgsRasterInterface( input ), mZoomedInResampler( 0 ), mZoomedOutResampler( 0 ), mMaxOversampling( 2.0 ) {