diff --git a/src/core/raster/qgsmultibandcolorrenderer.cpp b/src/core/raster/qgsmultibandcolorrenderer.cpp index d03ad2a9d68d..89d23bf1b812 100644 --- a/src/core/raster/qgsmultibandcolorrenderer.cpp +++ b/src/core/raster/qgsmultibandcolorrenderer.cpp @@ -33,6 +33,24 @@ QgsMultiBandColorRenderer::QgsMultiBandColorRenderer( QgsRasterDataProvider* pro QgsMultiBandColorRenderer::~QgsMultiBandColorRenderer() { + delete mRedContrastEnhancement; + delete mGreenContrastEnhancement; + delete mBlueContrastEnhancement; +} + +void QgsMultiBandColorRenderer::setRedContrastEnhancement( QgsContrastEnhancement* ce ) +{ + delete mRedContrastEnhancement; mRedContrastEnhancement = ce; +} + +void QgsMultiBandColorRenderer::setGreenContrastEnhancement( QgsContrastEnhancement* ce ) +{ + delete mGreenContrastEnhancement; mGreenContrastEnhancement = ce; +} + +void QgsMultiBandColorRenderer::setBlueContrastEnhancement( QgsContrastEnhancement* ce ) +{ + delete mBlueContrastEnhancement; mBlueContrastEnhancement = ce; } QgsRasterRenderer* QgsMultiBandColorRenderer::create( const QDomElement& elem ) diff --git a/src/core/raster/qgsmultibandcolorrenderer.h b/src/core/raster/qgsmultibandcolorrenderer.h index 4e404753f40d..79d0a9160047 100644 --- a/src/core/raster/qgsmultibandcolorrenderer.h +++ b/src/core/raster/qgsmultibandcolorrenderer.h @@ -44,13 +44,16 @@ class QgsMultiBandColorRenderer: public QgsRasterRenderer void setBlueBand( int band ) { mBlueBand = band; } const QgsContrastEnhancement* redContrastEnhancement() const { return mRedContrastEnhancement; } - void setRedContrastEnhancement( QgsContrastEnhancement* ce ) { mRedContrastEnhancement = ce; } + /**Takes ownership*/ + void setRedContrastEnhancement( QgsContrastEnhancement* ce ); const QgsContrastEnhancement* greenContrastEnhancement() const { return mGreenContrastEnhancement; } - void setGreenContrastEnhancement( QgsContrastEnhancement* ce ) { mGreenContrastEnhancement = ce; } + /**Takes ownership*/ + void setGreenContrastEnhancement( QgsContrastEnhancement* ce ); const QgsContrastEnhancement* blueContrastEnhancement() const { return mBlueContrastEnhancement; } - void setBlueContrastEnhancement( QgsContrastEnhancement* ce ) { mBlueContrastEnhancement = ce; } + /**Takes ownership*/ + void setBlueContrastEnhancement( QgsContrastEnhancement* ce ); private: int mRedBand; diff --git a/src/core/raster/qgsrasterlayer.cpp b/src/core/raster/qgsrasterlayer.cpp index 33cfe4b2b24f..b991d2966967 100644 --- a/src/core/raster/qgsrasterlayer.cpp +++ b/src/core/raster/qgsrasterlayer.cpp @@ -696,7 +696,15 @@ void QgsRasterLayer::setRendererForDrawingStyle( const DrawingStyle & theDrawin red = bandNumber( mRedBandName ); if ( contrastEnhancementAlgorithm() != QgsContrastEnhancement::NoEnhancement ) { - redEnhancement = contrastEnhancement( red ); + QgsContrastEnhancement* bkRedEnhancement = contrastEnhancement( red ); + if ( bkRedEnhancement ) + { + redEnhancement = new QgsContrastEnhancement(( QgsContrastEnhancement::QgsRasterDataType )( + mDataProvider->dataType( red ) ) ); + redEnhancement->setMinimumValue( bkRedEnhancement->minimumValue() ); + redEnhancement->setMaximumValue( bkRedEnhancement->maximumValue() ); + redEnhancement->setContrastEnhancementAlgorithm( contrastEnhancementAlgorithm() ); + } } } int green = -1; @@ -706,7 +714,15 @@ void QgsRasterLayer::setRendererForDrawingStyle( const DrawingStyle & theDrawin green = bandNumber( mGreenBandName ); if ( contrastEnhancementAlgorithm() != QgsContrastEnhancement::NoEnhancement ) { - greenEnhancement = contrastEnhancement( green ); + QgsContrastEnhancement* bkGreenEnhancement = contrastEnhancement( green ); + if ( bkGreenEnhancement ) + { + greenEnhancement = new QgsContrastEnhancement(( QgsContrastEnhancement::QgsRasterDataType )( + mDataProvider->dataType( green ) ) ); + greenEnhancement->setMinimumValue( bkGreenEnhancement->minimumValue() ); + greenEnhancement->setMaximumValue( bkGreenEnhancement->maximumValue() ); + greenEnhancement->setContrastEnhancementAlgorithm( contrastEnhancementAlgorithm() ); + } } } int blue = -1; @@ -716,7 +732,15 @@ void QgsRasterLayer::setRendererForDrawingStyle( const DrawingStyle & theDrawin blue = bandNumber( mBlueBandName ); if ( contrastEnhancementAlgorithm() != QgsContrastEnhancement::NoEnhancement ) { - blueEnhancement = contrastEnhancement( blue ); + QgsContrastEnhancement* bkBlueEnhancement = contrastEnhancement( blue ); + if ( bkBlueEnhancement ) + { + blueEnhancement = new QgsContrastEnhancement(( QgsContrastEnhancement::QgsRasterDataType )( + mDataProvider->dataType( blue ) ) ); + blueEnhancement->setMinimumValue( bkBlueEnhancement->minimumValue() ); + blueEnhancement->setMaximumValue( bkBlueEnhancement->maximumValue() ); + blueEnhancement->setContrastEnhancementAlgorithm( contrastEnhancementAlgorithm() ); + } } } renderer = new QgsMultiBandColorRenderer( mDataProvider, red, green, blue, diff --git a/src/gui/raster/qgsmultibandcolorrendererwidget.cpp b/src/gui/raster/qgsmultibandcolorrendererwidget.cpp index 3b02acf015d4..13ceb0efb7df 100644 --- a/src/gui/raster/qgsmultibandcolorrendererwidget.cpp +++ b/src/gui/raster/qgsmultibandcolorrendererwidget.cpp @@ -22,6 +22,7 @@ QgsMultiBandColorRendererWidget::QgsMultiBandColorRendererWidget( QgsRasterLayer* layer ): QgsRasterRendererWidget( layer ) { setupUi( this ); + createValidators(); if ( mRasterLayer ) { @@ -36,6 +37,12 @@ QgsMultiBandColorRendererWidget::QgsMultiBandColorRendererWidget( QgsRasterLayer mGreenBandComboBox->addItem( tr( "Not set" ), -1 ); mBlueBandComboBox->addItem( tr( "Not set" ), -1 ); + //contrast enhancement algorithms + mContrastEnhancementAlgorithmComboBox->addItem( tr( "No enhancement" ), 0 ); + mContrastEnhancementAlgorithmComboBox->addItem( tr( "Stretch to MinMax" ), 1 ); + mContrastEnhancementAlgorithmComboBox->addItem( tr( "Stretch and clip to MinMax" ), 2 ); + mContrastEnhancementAlgorithmComboBox->addItem( tr( "Clip to MinMax" ), 3 ); + int nBands = provider->bandCount(); for ( int i = 1; i <= nBands; ++i ) //band numbering seem to start at 1 { @@ -66,9 +73,106 @@ QgsMultiBandColorRendererWidget::~QgsMultiBandColorRendererWidget() QgsRasterRenderer* QgsMultiBandColorRendererWidget::renderer() { - return new QgsMultiBandColorRenderer( mRasterLayer->dataProvider(), - mRedBandComboBox->itemData( mRedBandComboBox->currentIndex() ).toInt(), - mGreenBandComboBox->itemData( mGreenBandComboBox->currentIndex() ).toInt(), - mBlueBandComboBox->itemData( mBlueBandComboBox->currentIndex() ).toInt() - ); + if ( !mRasterLayer ) + { + return 0; + } + QgsRasterDataProvider* provider = mRasterLayer->dataProvider(); + if ( !provider ) + { + return 0; + } + + int redBand = mRedBandComboBox->itemData( mRedBandComboBox->currentIndex() ).toInt(); + int greenBand = mGreenBandComboBox->itemData( mGreenBandComboBox->currentIndex() ).toInt(); + int blueBand = mBlueBandComboBox->itemData( mBlueBandComboBox->currentIndex() ).toInt(); + + QgsMultiBandColorRenderer* r = new QgsMultiBandColorRenderer( provider, redBand, greenBand, blueBand ); + setCustomMinMaxValues( r, provider, redBand, greenBand, blueBand ); + return r; +} + +void QgsMultiBandColorRendererWidget::createValidators() +{ + mRedMinLineEdit->setValidator( new QDoubleValidator( mRedMinLineEdit ) ); + mRedMaxLineEdit->setValidator( new QDoubleValidator( mRedMinLineEdit ) ); + mGreenMinLineEdit->setValidator( new QDoubleValidator( mGreenMinLineEdit ) ); + mGreenMaxLineEdit->setValidator( new QDoubleValidator( mGreenMinLineEdit ) ); + mBlueMinLineEdit->setValidator( new QDoubleValidator( mBlueMinLineEdit ) ); + mBlueMaxLineEdit->setValidator( new QDoubleValidator( mBlueMinLineEdit ) ); +} + +void QgsMultiBandColorRendererWidget::setCustomMinMaxValues( QgsMultiBandColorRenderer* r, + const QgsRasterDataProvider* provider, + int redBand, int greenBand, int blueBand ) +{ + if ( !r || !provider ) + { + return; + } + + if ( mContrastEnhancementAlgorithmComboBox->itemData( mContrastEnhancementAlgorithmComboBox->currentIndex() ).toInt() == + QgsContrastEnhancement::NoEnhancement ) + { + r->setRedContrastEnhancement( 0 ); + r->setGreenContrastEnhancement( 0 ); + r->setBlueContrastEnhancement( 0 ); + return; + } + + QgsContrastEnhancement* redEnhancement = 0; + QgsContrastEnhancement* greenEnhancement = 0; + QgsContrastEnhancement* blueEnhancement = 0; + + bool redMinOk, redMaxOk; + double redMin = mRedMinLineEdit->text().toDouble( &redMinOk ); + double redMax = mRedMaxLineEdit->text().toDouble( &redMaxOk ); + if ( redMinOk && redMaxOk ) + { + redEnhancement = new QgsContrastEnhancement(( QgsContrastEnhancement::QgsRasterDataType )( + provider->dataType( redBand ) ) ); + redEnhancement->setMinimumValue( redMin ); + redEnhancement->setMaximumValue( redMax ); + } + + bool greenMinOk, greenMaxOk; + double greenMin = mGreenMinLineEdit->text().toDouble( &greenMinOk ); + double greenMax = mGreenMaxLineEdit->text().toDouble( &greenMaxOk ); + if ( greenMinOk && greenMaxOk ) + { + greenEnhancement = new QgsContrastEnhancement(( QgsContrastEnhancement::QgsRasterDataType )( + provider->dataType( greenBand ) ) ); + greenEnhancement->setMinimumValue( greenMin ); + greenEnhancement->setMaximumValue( greenMax ); + } + + bool blueMinOk, blueMaxOk; + double blueMin = mBlueMinLineEdit->text().toDouble( &blueMinOk ); + double blueMax = mBlueMaxLineEdit->text().toDouble( &blueMaxOk ); + if ( blueMinOk && blueMaxOk ) + { + blueEnhancement = new QgsContrastEnhancement(( QgsContrastEnhancement::QgsRasterDataType )( + provider->dataType( blueBand ) ) ); + blueEnhancement->setMinimumValue( blueMin ); + blueEnhancement->setMaximumValue( blueMax ); + } + + if ( redEnhancement ) + { + redEnhancement->setContrastEnhancementAlgorithm(( QgsContrastEnhancement::ContrastEnhancementAlgorithm ) + ( mContrastEnhancementAlgorithmComboBox->itemData( mContrastEnhancementAlgorithmComboBox->currentIndex() ).toInt() ) ); + } + if ( greenEnhancement ) + { + greenEnhancement->setContrastEnhancementAlgorithm(( QgsContrastEnhancement::ContrastEnhancementAlgorithm ) + ( mContrastEnhancementAlgorithmComboBox->itemData( mContrastEnhancementAlgorithmComboBox->currentIndex() ).toInt() ) ); + } + if ( blueEnhancement ) + { + blueEnhancement->setContrastEnhancementAlgorithm(( QgsContrastEnhancement::ContrastEnhancementAlgorithm ) + ( mContrastEnhancementAlgorithmComboBox->itemData( mContrastEnhancementAlgorithmComboBox->currentIndex() ).toInt() ) ); + } + r->setRedContrastEnhancement( redEnhancement ); + r->setGreenContrastEnhancement( greenEnhancement ); + r->setBlueContrastEnhancement( blueEnhancement ); } diff --git a/src/gui/raster/qgsmultibandcolorrendererwidget.h b/src/gui/raster/qgsmultibandcolorrendererwidget.h index 5c7dbdad7c2c..92ecf508f61c 100644 --- a/src/gui/raster/qgsmultibandcolorrendererwidget.h +++ b/src/gui/raster/qgsmultibandcolorrendererwidget.h @@ -21,7 +21,9 @@ #include "qgsrasterrendererwidget.h" #include "ui_qgsmultibandcolorrendererwidgetbase.h" +class QgsRasterDataProvider; class QgsRasterLayer; +class QgsMultiBandColorRenderer; class QgsMultiBandColorRendererWidget: public QgsRasterRendererWidget, private Ui::QgsMultiBandColorRendererWidgetBase { @@ -33,6 +35,11 @@ class QgsMultiBandColorRendererWidget: public QgsRasterRendererWidget, private U ~QgsMultiBandColorRendererWidget(); QgsRasterRenderer* renderer(); + + private: + void createValidators(); + void setCustomMinMaxValues( QgsMultiBandColorRenderer* r, const QgsRasterDataProvider* provider, int redBand, int GreenBand, + int blueBand ); }; #endif // QGSMULTIBANDCOLORRENDERERWIDGET_H diff --git a/src/gui/raster/qgssinglebandgrayrendererwidget.cpp b/src/gui/raster/qgssinglebandgrayrendererwidget.cpp index 89c9d1ec2449..09fa2d4473fe 100644 --- a/src/gui/raster/qgssinglebandgrayrendererwidget.cpp +++ b/src/gui/raster/qgssinglebandgrayrendererwidget.cpp @@ -22,6 +22,8 @@ QgsSingleBandGrayRendererWidget::QgsSingleBandGrayRendererWidget( QgsRasterLayer* layer ): QgsRasterRendererWidget( layer ) { setupUi( this ); + mMinLineEdit->setValidator( new QDoubleValidator( mMinLineEdit ) ); + mMaxLineEdit->setValidator( new QDoubleValidator( mMaxLineEdit ) ); if ( mRasterLayer ) { diff --git a/src/ui/qgsmultibandcolorrendererwidgetbase.ui b/src/ui/qgsmultibandcolorrendererwidgetbase.ui index bd460dd28d4c..0cfbef7a89fd 100644 --- a/src/ui/qgsmultibandcolorrendererwidgetbase.ui +++ b/src/ui/qgsmultibandcolorrendererwidgetbase.ui @@ -6,14 +6,14 @@ 0 0 - 304 - 305 + 320 + 452 Form - + @@ -46,36 +46,25 @@ - - - - - + Contrast enhancement - + - + Min/Max values - - - Custom min / max values - - - - @@ -307,41 +296,84 @@ + + + + + + + Load min-/max values + + + + + + Estimate (faster) + + + true + + + + + + + Qt::Horizontal + + + + 254 + 20 + + + + + + + + Actual (slower) + + + + + + + Qt::Horizontal + + + + 254 + 20 + + + + - - - - - Use standard deviation - - - - - - - - 0 - 0 - - - - - 75 - 16777215 - - - - 10.000000000000000 - - - 0.100000000000000 - - - 0.000000000000000 - - - - + + + CurrentExtent + + + + + + + Qt::Horizontal + + + + 197 + 20 + + + + + + + + Load + +