Skip to content

Commit a8934a2

Browse files
committed
invert raster colors better
1 parent ff1431c commit a8934a2

15 files changed

+665
-566
lines changed

python/core/raster/qgsrasterrenderer.sip

Lines changed: 0 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -52,9 +52,6 @@ class QgsRasterRenderer : QgsRasterInterface
5252
void setAlphaBand( int band );
5353
int alphaBand() const;
5454

55-
void setInvertColor( bool invert );
56-
bool invertColor() const;
57-
5855
/**Get symbology items if provided by renderer*/
5956
virtual void legendSymbologyItems( QList< QPair< QString, QColor > >& symbolItems ) const;
6057

src/app/qgsrasterlayerproperties.cpp

Lines changed: 1 addition & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -195,6 +195,7 @@ QgsRasterLayerProperties::QgsRasterLayerProperties( QgsMapLayer* lyr, QgsMapCanv
195195
tableTransparency->horizontalHeader()->setResizeMode( 1, QHeaderView::Stretch );
196196

197197
//resampling
198+
mResamplingGroupBox->setSaveCheckedState( true );
198199
const QgsRasterRenderer* renderer = mRasterLayer->renderer();
199200
mZoomedInResamplingComboBox->insertItem( 0, tr( "Nearest neighbour" ) );
200201
mZoomedInResamplingComboBox->insertItem( 1, tr( "Bilinear" ) );
@@ -206,12 +207,6 @@ QgsRasterLayerProperties::QgsRasterLayerProperties( QgsMapLayer* lyr, QgsMapCanv
206207
//set combo boxes to current resampling types
207208
if ( resampleFilter )
208209
{
209-
//invert color map
210-
if ( renderer->invertColor() )
211-
{
212-
mInvertColorMapCheckBox->setCheckState( Qt::Checked );
213-
}
214-
215210
const QgsRasterResampler* zoomedInResampler = resampleFilter->zoomedInResampler();
216211
if ( zoomedInResampler )
217212
{
@@ -744,9 +739,6 @@ void QgsRasterLayerProperties::apply()
744739

745740
//set global transparency
746741
rasterRenderer->setOpacity(( 255 - sliderTransparency->value() ) / 255.0 );
747-
748-
//invert color map
749-
rasterRenderer->setInvertColor( mInvertColorMapCheckBox->isChecked() );
750742
}
751743

752744
QgsDebugMsg( "processing general tab" );

src/core/raster/qgsmultibandcolorrenderer.cpp

Lines changed: 1 addition & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -57,7 +57,6 @@ QgsRasterInterface * QgsMultiBandColorRenderer::clone() const
5757
}
5858
renderer->setOpacity( mOpacity );
5959
renderer->setAlphaBand( mAlphaBand );
60-
renderer->setInvertColor( mInvertColor );
6160
renderer->setRasterTransparency( mRasterTransparency );
6261

6362
return renderer;
@@ -136,8 +135,7 @@ QgsRasterBlock* QgsMultiBandColorRenderer::block( int bandNo, QgsRectangle cons
136135
//In some (common) cases, we can simplify the drawing loop considerably and save render time
137136
bool fastDraw = ( !usesTransparency()
138137
&& mRedBand > 0 && mGreenBand > 0 && mBlueBand > 0
139-
&& mAlphaBand < 1 && !mRedContrastEnhancement && !mGreenContrastEnhancement && !mBlueContrastEnhancement
140-
&& !mInvertColor );
138+
&& mAlphaBand < 1 && !mRedContrastEnhancement && !mGreenContrastEnhancement && !mBlueContrastEnhancement );
141139

142140
QSet<int> bands;
143141
if ( mRedBand > 0 )
@@ -290,13 +288,6 @@ QgsRasterBlock* QgsMultiBandColorRenderer::block( int bandNo, QgsRectangle cons
290288
blueVal = mBlueContrastEnhancement->enhanceContrast( blueVal );
291289
}
292290

293-
if ( mInvertColor )
294-
{
295-
redVal = 255 - redVal;
296-
greenVal = 255 - greenVal;
297-
blueVal = 255 - blueVal;
298-
}
299-
300291
//opacity
301292
double currentOpacity = mOpacity;
302293
if ( mRasterTransparency )

src/core/raster/qgspalettedrasterrenderer.cpp

Lines changed: 1 addition & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -39,7 +39,6 @@ QgsRasterInterface * QgsPalettedRasterRenderer::clone() const
3939
QgsPalettedRasterRenderer * renderer = new QgsPalettedRasterRenderer( 0, mBand, colors(), mNColors );
4040
renderer->setOpacity( mOpacity );
4141
renderer->setAlphaBand( mAlphaBand );
42-
renderer->setInvertColor( mInvertColor );
4342
renderer->setRasterTransparency( mRasterTransparency );
4443
return renderer;
4544
}
@@ -179,14 +178,7 @@ QgsRasterBlock * QgsPalettedRasterRenderer::block( int bandNo, QgsRectangle con
179178
}
180179
QColor& currentColor = mColors[val];
181180

182-
if ( mInvertColor )
183-
{
184-
outputBlock->setColor( i, qRgba( currentOpacity * currentColor.blue(), currentOpacity * currentColor.green(), currentOpacity * currentColor.red(), currentOpacity * 255 ) );
185-
}
186-
else
187-
{
188-
outputBlock->setColor( i, qRgba( currentOpacity * currentColor.red(), currentOpacity * currentColor.green(), currentOpacity * currentColor.blue(), currentOpacity * 255 ) );
189-
}
181+
outputBlock->setColor( i, qRgba( currentOpacity * currentColor.red(), currentOpacity * currentColor.green(), currentOpacity * currentColor.blue(), currentOpacity * 255 ) );
190182
}
191183
}
192184

src/core/raster/qgsrasterrenderer.cpp

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -40,7 +40,7 @@ const QRgb QgsRasterRenderer::NODATA_COLOR = qRgba( 0, 0, 0, 0 );
4040
QgsRasterRenderer::QgsRasterRenderer( QgsRasterInterface* input, const QString& type )
4141
: QgsRasterInterface( input )
4242
, mType( type ), mOpacity( 1.0 ), mRasterTransparency( 0 )
43-
, mAlphaBand( -1 ), mInvertColor( false )
43+
, mAlphaBand( -1 ) //, mInvertColor( false )
4444
{
4545
}
4646

@@ -117,7 +117,7 @@ void QgsRasterRenderer::_writeXML( QDomDocument& doc, QDomElement& rasterRendere
117117
rasterRendererElem.setAttribute( "type", mType );
118118
rasterRendererElem.setAttribute( "opacity", QString::number( mOpacity ) );
119119
rasterRendererElem.setAttribute( "alphaBand", mAlphaBand );
120-
rasterRendererElem.setAttribute( "invertColor", mInvertColor );
120+
//rasterRendererElem.setAttribute( "invertColor", mInvertColor );
121121

122122
if ( mRasterTransparency )
123123
{
@@ -135,7 +135,7 @@ void QgsRasterRenderer::readXML( const QDomElement& rendererElem )
135135
mType = rendererElem.attribute( "type" );
136136
mOpacity = rendererElem.attribute( "opacity", "1.0" ).toDouble();
137137
mAlphaBand = rendererElem.attribute( "alphaBand", "-1" ).toInt();
138-
mInvertColor = rendererElem.attribute( "invertColor", "0" ).toInt();
138+
//mInvertColor = rendererElem.attribute( "invertColor", "0" ).toInt();
139139

140140
//todo: read mRasterTransparency
141141
QDomElement rasterTransparencyElem = rendererElem.firstChildElement( "rasterTransparency" );

src/core/raster/qgsrasterrenderer.h

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -92,8 +92,8 @@ class CORE_EXPORT QgsRasterRenderer : public QgsRasterInterface
9292
void setAlphaBand( int band ) { mAlphaBand = band; }
9393
int alphaBand() const { return mAlphaBand; }
9494

95-
void setInvertColor( bool invert ) { mInvertColor = invert; }
96-
bool invertColor() const { return mInvertColor; }
95+
//void setInvertColor( bool invert ) { mInvertColor = invert; }
96+
//bool invertColor() const { return mInvertColor; }
9797

9898
/**Get symbology items if provided by renderer*/
9999
virtual void legendSymbologyItems( QList< QPair< QString, QColor > >& symbolItems ) const { Q_UNUSED( symbolItems ); }
@@ -124,7 +124,7 @@ class CORE_EXPORT QgsRasterRenderer : public QgsRasterInterface
124124
Default: -1 (not set)*/
125125
int mAlphaBand;
126126

127-
bool mInvertColor;
127+
//bool mInvertColor;
128128
};
129129

130130
#endif // QGSRASTERRENDERER_H

src/core/raster/qgssinglebandcolordatarenderer.cpp

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -36,7 +36,6 @@ QgsRasterInterface * QgsSingleBandColorDataRenderer::clone() const
3636
QgsSingleBandColorDataRenderer * renderer = new QgsSingleBandColorDataRenderer( 0, mBand );
3737
renderer->setOpacity( mOpacity );
3838
renderer->setAlphaBand( mAlphaBand );
39-
renderer->setInvertColor( mInvertColor );
4039
renderer->setRasterTransparency( mRasterTransparency );
4140
return renderer;
4241
}

src/core/raster/qgssinglebandgrayrenderer.cpp

Lines changed: 19 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -23,7 +23,7 @@
2323
#include <QImage>
2424

2525
QgsSingleBandGrayRenderer::QgsSingleBandGrayRenderer( QgsRasterInterface* input, int grayBand ):
26-
QgsRasterRenderer( input, "singlebandgray" ), mGrayBand( grayBand ), mContrastEnhancement( 0 )
26+
QgsRasterRenderer( input, "singlebandgray" ), mGrayBand( grayBand ), mGradient( BlackToWhite ), mContrastEnhancement( 0 )
2727
{
2828
}
2929

@@ -37,7 +37,6 @@ QgsRasterInterface * QgsSingleBandGrayRenderer::clone() const
3737
QgsSingleBandGrayRenderer * renderer = new QgsSingleBandGrayRenderer( 0, mGrayBand );
3838
renderer->setOpacity( mOpacity );
3939
renderer->setAlphaBand( mAlphaBand );
40-
renderer->setInvertColor( mInvertColor );
4140
renderer->setRasterTransparency( mRasterTransparency );
4241
if ( mContrastEnhancement )
4342
{
@@ -57,6 +56,11 @@ QgsRasterRenderer* QgsSingleBandGrayRenderer::create( const QDomElement& elem, Q
5756
QgsSingleBandGrayRenderer* r = new QgsSingleBandGrayRenderer( input, grayBand );
5857
r->readXML( elem );
5958

59+
if ( elem.attribute( "gradient" ) == "WhiteToBlack" )
60+
{
61+
r->setGradient( WhiteToBlack ); // BlackToWhite is default
62+
}
63+
6064
QDomElement contrastEnhancementElem = elem.firstChildElement( "contrastEnhancement" );
6165
if ( !contrastEnhancementElem.isNull() )
6266
{
@@ -149,7 +153,7 @@ QgsRasterBlock* QgsSingleBandGrayRenderer::block( int bandNo, QgsRectangle cons
149153
grayVal = mContrastEnhancement->enhanceContrast( grayVal );
150154
}
151155

152-
if ( mInvertColor )
156+
if ( mGradient == WhiteToBlack )
153157
{
154158
grayVal = 255 - grayVal;
155159
}
@@ -184,6 +188,18 @@ void QgsSingleBandGrayRenderer::writeXML( QDomDocument& doc, QDomElement& parent
184188
_writeXML( doc, rasterRendererElem );
185189

186190
rasterRendererElem.setAttribute( "grayBand", mGrayBand );
191+
192+
QString gradient;
193+
if ( mGradient == BlackToWhite )
194+
{
195+
gradient = "BlackToWhite";
196+
}
197+
else
198+
{
199+
gradient = "WhiteToBlack";
200+
}
201+
rasterRendererElem.setAttribute( "gradient", gradient );
202+
187203
if ( mContrastEnhancement )
188204
{
189205
QDomElement contrastElem = doc.createElement( "contrastEnhancement" );

src/core/raster/qgssinglebandgrayrenderer.h

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -29,6 +29,12 @@ class QDomElement;
2929
class CORE_EXPORT QgsSingleBandGrayRenderer: public QgsRasterRenderer
3030
{
3131
public:
32+
enum Gradient
33+
{
34+
BlackToWhite,
35+
WhiteToBlack
36+
};
37+
3238
QgsSingleBandGrayRenderer( QgsRasterInterface* input, int grayBand );
3339
~QgsSingleBandGrayRenderer();
3440
QgsRasterInterface * clone() const;
@@ -43,6 +49,9 @@ class CORE_EXPORT QgsSingleBandGrayRenderer: public QgsRasterRenderer
4349
/**Takes ownership*/
4450
void setContrastEnhancement( QgsContrastEnhancement* ce );
4551

52+
void setGradient( Gradient theGradient ) { mGradient = theGradient; }
53+
Gradient gradient() const { return mGradient; }
54+
4655
void writeXML( QDomDocument& doc, QDomElement& parentElem ) const;
4756

4857
void legendSymbologyItems( QList< QPair< QString, QColor > >& symbolItems ) const;
@@ -51,6 +60,7 @@ class CORE_EXPORT QgsSingleBandGrayRenderer: public QgsRasterRenderer
5160

5261
private:
5362
int mGrayBand;
63+
Gradient mGradient;
5464
QgsContrastEnhancement* mContrastEnhancement;
5565
};
5666

src/core/raster/qgssinglebandpseudocolorrenderer.cpp

Lines changed: 0 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -63,7 +63,6 @@ QgsRasterInterface * QgsSingleBandPseudoColorRenderer::clone() const
6363

6464
renderer->setOpacity( mOpacity );
6565
renderer->setAlphaBand( mAlphaBand );
66-
renderer->setInvertColor( mInvertColor );
6766
renderer->setRasterTransparency( mRasterTransparency );
6867

6968
return renderer;
@@ -165,14 +164,6 @@ QgsRasterBlock* QgsSingleBandPseudoColorRenderer::block( int bandNo, QgsRectangl
165164
continue;
166165
}
167166

168-
if ( mInvertColor )
169-
{
170-
// 1.8 was flipping blue and red
171-
red = 255 - red;
172-
green = 255 - green;
173-
blue = 255 - blue;
174-
}
175-
176167
if ( !hasTransparency )
177168
{
178169
outputBlock->setColor( i, qRgba( red, green, blue, 255 ) );

src/gui/raster/qgssinglebandgrayrendererwidget.cpp

Lines changed: 14 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,9 @@ QgsSingleBandGrayRendererWidget::QgsSingleBandGrayRendererWidget( QgsRasterLayer
2323
{
2424
setupUi( this );
2525

26+
mGradientComboBox->insertItem( 0, tr( "Black to white" ), QgsSingleBandGrayRenderer::BlackToWhite );
27+
mGradientComboBox->insertItem( 1, tr( "White to black" ), QgsSingleBandGrayRenderer::WhiteToBlack );
28+
2629
mMinLineEdit->setValidator( new QDoubleValidator( mMinLineEdit ) );
2730
mMaxLineEdit->setValidator( new QDoubleValidator( mMaxLineEdit ) );
2831

@@ -36,7 +39,12 @@ QgsSingleBandGrayRendererWidget::QgsSingleBandGrayRendererWidget( QgsRasterLayer
3639

3740
mMinMaxWidget = new QgsRasterMinMaxWidget( layer, this );
3841
mMinMaxWidget->setExtent( extent );
39-
layout()->addWidget( mMinMaxWidget );
42+
43+
QHBoxLayout *layout = new QHBoxLayout();
44+
layout->setContentsMargins( 0, 0, 0, 0 );
45+
mMinMaxContainerWidget->setLayout( layout );
46+
layout->addWidget( mMinMaxWidget );
47+
4048
connect( mMinMaxWidget, SIGNAL( load( int, double, double, int ) ),
4149
this, SLOT( loadMinMax( int, double, double, int ) ) );
4250

@@ -84,6 +92,9 @@ QgsRasterRenderer* QgsSingleBandGrayRendererWidget::renderer()
8492

8593
QgsSingleBandGrayRenderer* renderer = new QgsSingleBandGrayRenderer( provider, band );
8694
renderer->setContrastEnhancement( e );
95+
96+
renderer->setGradient(( QgsSingleBandGrayRenderer::Gradient ) mGradientComboBox->itemData( mGradientComboBox->currentIndex() ).toInt() );
97+
8798
return renderer;
8899
}
89100

@@ -127,6 +138,8 @@ void QgsSingleBandGrayRendererWidget::setFromRenderer( const QgsRasterRenderer*
127138
//band
128139
mGrayBandComboBox->setCurrentIndex( mGrayBandComboBox->findData( gr->grayBand() ) );
129140
const QgsContrastEnhancement* ce = gr->contrastEnhancement();
141+
142+
mGradientComboBox->setCurrentIndex( mGradientComboBox->findData( gr->gradient() ) );
130143
//minmax
131144
mMinLineEdit->setText( QString::number( ce->minimumValue() ) );
132145
mMaxLineEdit->setText( QString::number( ce->maximumValue() ) );

src/gui/raster/qgssinglebandpseudocolorrendererwidget.cpp

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -278,15 +278,17 @@ void QgsSingleBandPseudoColorRendererWidget::on_mClassifyButton_clicked()
278278
for ( int i = 0; i < numberOfEntries; ++i )
279279
{
280280
QColor currentColor;
281-
currentColor.setRgb( colorDiff*i, 0, 255 - colorDiff * i );
281+
int idx = mInvertCheckBox->isChecked() ? numberOfEntries - i - 1 : i;
282+
currentColor.setRgb( colorDiff*idx, 0, 255 - colorDiff * idx );
282283
entryColors.push_back( currentColor );
283284
}
284285
}
285286
else
286287
{
287288
for ( int i = 0; i < numberOfEntries; ++i )
288289
{
289-
entryColors.push_back( colorRamp->color((( double ) i ) / numberOfEntries ) );
290+
int idx = mInvertCheckBox->isChecked() ? numberOfEntries - i - 1 : i;
291+
entryColors.push_back( colorRamp->color((( double ) idx ) / numberOfEntries ) );
290292
}
291293
}
292294

0 commit comments

Comments
 (0)