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
+
+