diff --git a/src/core/raster/qgsrasterlayer.cpp b/src/core/raster/qgsrasterlayer.cpp index 8658f37adf3..e0ec2b641fd 100644 --- a/src/core/raster/qgsrasterlayer.cpp +++ b/src/core/raster/qgsrasterlayer.cpp @@ -594,6 +594,8 @@ QString QgsRasterLayer::contrastEnhancementAlgorithmAsString() const void QgsRasterLayer::setRendererForDrawingStyle( const DrawingStyle & theDrawingStyle ) { + setRenderer( QgsRasterRendererRegistry::instance()->defaultRendererForDrawingStyle( theDrawingStyle, mDataProvider ) ); +#if 0 QgsRasterRenderer* renderer = 0; switch ( theDrawingStyle ) @@ -787,6 +789,7 @@ void QgsRasterLayer::setRendererForDrawingStyle( const DrawingStyle & theDrawin } renderer->setInvertColor( mInvertColor ); setRenderer( renderer ); +#endif //0 } /** @@ -2387,7 +2390,7 @@ void QgsRasterLayer::setDataProvider( QString const & provider ) //Try to read the default contrast enhancement from the config file QSettings myQSettings; - setContrastEnhancementAlgorithm( myQSettings.value( "/Raster/defaultContrastEnhancementAlgorithm", "NoEnhancement" ).toString() ); + //setContrastEnhancementAlgorithm( myQSettings.value( "/Raster/defaultContrastEnhancementAlgorithm", "NoEnhancement" ).toString() ); //decide what type of layer this is... //TODO Change this to look at the color interp and palette interp to decide which type of layer it is diff --git a/src/core/raster/qgsrasterrendererregistry.cpp b/src/core/raster/qgsrasterrendererregistry.cpp index 433aeff34b1..fb39a496356 100644 --- a/src/core/raster/qgsrasterrendererregistry.cpp +++ b/src/core/raster/qgsrasterrendererregistry.cpp @@ -21,6 +21,7 @@ #include "qgssinglebandcolordatarenderer.h" #include "qgssinglebandgrayrenderer.h" #include "qgssinglebandpseudocolorrenderer.h" +#include QgsRasterRendererRegistryEntry::QgsRasterRendererRegistryEntry( const QString& theName, const QString& theVisibleName, QgsRasterRendererCreateFunc rendererFunction, @@ -104,4 +105,235 @@ QList< QgsRasterRendererRegistryEntry > QgsRasterRendererRegistry::entries() con return result; } +QgsRasterRenderer* QgsRasterRendererRegistry::defaultRendererForDrawingStyle( const QgsRasterLayer::DrawingStyle& theDrawingStyle, QgsRasterDataProvider* provider ) const +{ + if ( !provider || provider->bandCount() < 1 ) + { + return 0; + } + + + QgsRasterRenderer* renderer = 0; + switch ( theDrawingStyle ) + { + case QgsRasterLayer::PalettedColor: + { + int grayBand = 1; //reasonable default + QList colorEntries = provider->colorTable( grayBand ); + + //go through list and take maximum value (it could be that entries don't start at 0 or indices are not contiguous) + int colorArraySize = 0; + QList::const_iterator colorIt = colorEntries.constBegin(); + for ( ; colorIt != colorEntries.constEnd(); ++colorIt ) + { + if ( colorIt->value > colorArraySize ) + { + colorArraySize = ( int )( colorIt->value ); + } + } + + colorArraySize += 1; //usually starts at 0 + QColor* colorArray = new QColor[ colorArraySize ]; + colorIt = colorEntries.constBegin(); + for ( ; colorIt != colorEntries.constEnd(); ++colorIt ) + { + colorArray[( int )( colorIt->value )] = colorIt->color; + } + + renderer = new QgsPalettedRasterRenderer( provider, + grayBand, + colorArray, + colorArraySize ); + } + break; + case QgsRasterLayer::MultiBandSingleBandGray: + case QgsRasterLayer::SingleBandGray: + { + int grayBand = 1; + renderer = new QgsSingleBandGrayRenderer( provider, grayBand ); + QgsContrastEnhancement* ce = new QgsContrastEnhancement(( QgsContrastEnhancement::QgsRasterDataType )( + provider->dataType( grayBand ) ) ); + + QSettings s; + QgsContrastEnhancement::ContrastEnhancementAlgorithm ceAlgorithm; + ceAlgorithm = ( QgsContrastEnhancement::ContrastEnhancementAlgorithm )QgsRasterRendererRegistry::contrastEnhancementFromString( + s.value( "/Raster/defaultContrastEnhancementAlgorithm", "NoEnhancement" ).toString() ); + ce->setContrastEnhancementAlgorithm( ceAlgorithm ); + + if ( ceAlgorithm != QgsContrastEnhancement::NoEnhancement ) + { + double minValue = 0; + double maxValue = 0; + minMaxValuesForBand( grayBand, provider, minValue, maxValue ); + ce->setMinimumValue( minValue ); + ce->setMaximumValue( maxValue ); + } + (( QgsSingleBandGrayRenderer* )renderer )->setContrastEnhancement( ce ); + break; + } + case QgsRasterLayer::SingleBandPseudoColor: + { + int bandNo = 1; + double minValue = 0; + double maxValue = 0; + minMaxValuesForBand( bandNo, provider, minValue, maxValue ); + QgsRasterShader* shader = new QgsRasterShader( minValue, maxValue ); + renderer = new QgsSingleBandPseudoColorRenderer( provider, bandNo, shader ); + break; + } + case QgsRasterLayer::MultiBandColor: + { + QSettings s; + QgsContrastEnhancement::ContrastEnhancementAlgorithm ceAlgorithm; + ceAlgorithm = ( QgsContrastEnhancement::ContrastEnhancementAlgorithm )QgsRasterRendererRegistry::contrastEnhancementFromString( + s.value( "/Raster/defaultContrastEnhancementAlgorithm", "NoEnhancement" ).toString() ); + + QgsContrastEnhancement* redEnhancement = 0; + QgsContrastEnhancement* greenEnhancement = 0; + QgsContrastEnhancement* blueEnhancement = 0; + + int redBand = s.value( "/Raster/defaultRedBand", 1 ).toInt(); + if ( redBand < 0 || redBand > provider->bandCount() ) + { + redBand = -1; + } + int greenBand = s.value( "/Raster/defaultGreenBand", 2 ).toInt(); + if ( greenBand < 0 || greenBand > provider->bandCount() ) + { + greenBand = -1; + } + int blueBand = s.value( "/Raster/defaultBlueBand", 3 ).toInt(); + if ( blueBand < 0 || blueBand > provider->bandCount() ) + { + blueBand = -1; + } + + double minValue = 0; + double maxValue = 0; + if ( ceAlgorithm != QgsContrastEnhancement::NoEnhancement ) + { + if ( redBand > 0 ) + { + redEnhancement = new QgsContrastEnhancement(( QgsContrastEnhancement::QgsRasterDataType )( + provider->dataType( redBand ) ) ); + minMaxValuesForBand( redBand, provider, minValue, maxValue ); + redEnhancement->setMinimumValue( minValue ); + redEnhancement->setMaximumValue( maxValue ); + redEnhancement->setContrastEnhancementAlgorithm( ceAlgorithm ); + } + + if ( greenBand > 0 ) + { + greenEnhancement = new QgsContrastEnhancement(( QgsContrastEnhancement::QgsRasterDataType )( + provider->dataType( greenBand ) ) ); + minMaxValuesForBand( greenBand, provider, minValue, maxValue ); + greenEnhancement->setMinimumValue( minValue ); + greenEnhancement->setMaximumValue( maxValue ); + greenEnhancement->setContrastEnhancementAlgorithm( ceAlgorithm ); + } + + if ( blueBand > 0 ) + { + blueEnhancement = new QgsContrastEnhancement(( QgsContrastEnhancement::QgsRasterDataType )( + provider->dataType( blueBand ) ) ); + minMaxValuesForBand( blueBand, provider, minValue, maxValue ); + blueEnhancement->setMinimumValue( minValue ); + blueEnhancement->setMaximumValue( maxValue ); + blueEnhancement->setContrastEnhancementAlgorithm( ceAlgorithm ); + } + } + + renderer = new QgsMultiBandColorRenderer( provider, redBand, greenBand, blueBand, + redEnhancement, greenEnhancement, blueEnhancement ); + break; + } + case QgsRasterLayer::SingleBandColorDataStyle: + { + renderer = new QgsSingleBandColorDataRenderer( provider, 1 ); + break; + } + default: + break; + } + +#if 0 + if ( !renderer ) + { + return; + } + + renderer->setOpacity( mTransparencyLevel / 255.0 ); + + QgsRasterTransparency* tr = new QgsRasterTransparency(); //renderer takes ownership + if ( mDataProvider->bandCount() == 1 ) + { + tr->setTransparentSingleValuePixelList( mRasterTransparency.transparentSingleValuePixelList() ); + } + else if ( mDataProvider->bandCount() == 3 ) + { + tr->setTransparentThreeValuePixelList( mRasterTransparency.transparentThreeValuePixelList() ); + } + renderer->setRasterTransparency( tr ); + + if ( mTransparencyBandName != TRSTRING_NOT_SET ) + { + int tBand = bandNumber( mTransparencyBandName ); + if ( tBand > 0 ) + { + renderer->setAlphaBand( tBand ); + } + } + renderer->setInvertColor( mInvertColor ); +#endif //0 + return renderer; +} + +bool QgsRasterRendererRegistry::minMaxValuesForBand( int band, QgsRasterDataProvider* provider, double& minValue, double& maxValue ) const +{ + if ( !provider ) + { + return false; + } + + + minValue = 0; + maxValue = 0; + + QSettings s; + if ( s.value( "/Raster/useStandardDeviation", false ).toBool() ) + { + double stdDevFactor = s.value( "/Raster/defaultStandardDeviation", 2.0 ).toDouble(); + QgsRasterBandStats stats = provider->bandStatistics( band ); + double diff = stdDevFactor * stats.stdDev; + minValue = stats.mean - diff; + maxValue = stats.mean + diff; + } + else + { + minValue = provider->minimumValue( band ); + maxValue = provider->maximumValue( band ); + } + return true; +} + +int QgsRasterRendererRegistry::contrastEnhancementFromString( const QString& contrastEnhancementString ) +{ + if ( contrastEnhancementString == "StretchToMinimumMaximum" ) + { + return ( int )QgsContrastEnhancement::StretchToMinimumMaximum; + } + else if ( contrastEnhancementString == "StretchAndClipToMinimumMaximum" ) + { + return ( int )QgsContrastEnhancement::StretchAndClipToMinimumMaximum; + } + else if ( contrastEnhancementString == "ClipToMinimumMaximum" ) + { + return ( int )QgsContrastEnhancement::ClipToMinimumMaximum; + } + else + { + return ( int )QgsContrastEnhancement::NoEnhancement; + } +} + diff --git a/src/core/raster/qgsrasterrendererregistry.h b/src/core/raster/qgsrasterrendererregistry.h index d63af0d9173..86d22f65fba 100644 --- a/src/core/raster/qgsrasterrendererregistry.h +++ b/src/core/raster/qgsrasterrendererregistry.h @@ -18,6 +18,7 @@ #ifndef QGSRASTERRENDERERREGISTRY_H #define QGSRASTERRENDERERREGISTRY_H +#include "qgsrasterlayer.h" //for DrawingStyle enum #include #include @@ -53,12 +54,20 @@ class CORE_EXPORT QgsRasterRendererRegistry QStringList renderersList() const; QList< QgsRasterRendererRegistryEntry > entries() const; + /**Creates a default renderer for a raster drawing style (considering user options such as default contrast enhancement). + Caller takes ownership*/ + QgsRasterRenderer* defaultRendererForDrawingStyle( const QgsRasterLayer::DrawingStyle& theDrawingStyle, QgsRasterDataProvider* provider ) const; + protected: QgsRasterRendererRegistry(); private: static QgsRasterRendererRegistry* mInstance; QHash< QString, QgsRasterRendererRegistryEntry > mEntries; + + //read min/max values from + bool minMaxValuesForBand( int band, QgsRasterDataProvider* provider, double& minValue, double& maxValue ) const; + static int contrastEnhancementFromString( const QString& contrastEnhancementString ); }; #endif // QGSRASTERRENDERERREGISTRY_H