Skip to content

Commit ba0f5da

Browse files
committed
More fixes for raster transparency
1 parent 7a8b9b7 commit ba0f5da

4 files changed

+73
-18
lines changed

src/app/qgsrasterlayerproperties.cpp

+41-16
Original file line numberDiff line numberDiff line change
@@ -178,9 +178,6 @@ QgsRasterLayerProperties::QgsRasterLayerProperties( QgsMapLayer* lyr, QgsMapCanv
178178
.arg( pyramidSentence2 ).arg( pyramidSentence3 )
179179
.arg( pyramidSentence4 ).arg( pyramidSentence5 ) );
180180

181-
// update based on lyr's current state
182-
sync();
183-
184181
QSettings settings;
185182
restoreGeometry( settings.value( "/Windows/RasterLayerProperties/geometry" ).toByteArray() );
186183
tabBar->setCurrentIndex( settings.value( "/Windows/RasterLayerProperties/row" ).toInt() );
@@ -292,6 +289,9 @@ QgsRasterLayerProperties::QgsRasterLayerProperties( QgsMapLayer* lyr, QgsMapCanv
292289
}
293290
}
294291
on_mRenderTypeComboBox_currentIndexChanged( mRenderTypeComboBox->currentIndex() );
292+
293+
// update based on lyr's current state
294+
sync();
295295
} // QgsRasterLayerProperties ctor
296296

297297

@@ -306,20 +306,22 @@ QgsRasterLayerProperties::~QgsRasterLayerProperties()
306306
}
307307
}
308308

309-
void QgsRasterLayerProperties::populateTransparencyTable()
309+
void QgsRasterLayerProperties::populateTransparencyTable( QgsRasterRenderer* renderer )
310310
{
311311
QgsDebugMsg( "entering." );
312312
if ( !mRasterLayer )
313313
{
314314
return;
315315
}
316-
QgsRasterRenderer* renderer = mRasterLayer->renderer();
316+
317317
if ( !renderer )
318318
{
319319
return;
320320
}
321321

322322
tableTransparency->clear();
323+
tableTransparency->setColumnCount( 0 );
324+
tableTransparency->setRowCount( 0 );
323325

324326
QList<int> bandList = renderer->usesBands();
325327
tableTransparency->setColumnCount( bandList.size() + 1 );
@@ -371,20 +373,32 @@ void QgsRasterLayerProperties::populateTransparencyTable()
371373

372374
void QgsRasterLayerProperties::setRendererWidget( const QString& rendererName )
373375
{
374-
delete mRendererWidget;
375-
mRendererWidget = 0;
376+
QgsRasterRendererWidget* oldWidget = mRendererWidget;
376377

377378
QgsRasterRendererRegistryEntry rendererEntry;
378379
if ( QgsRasterRendererRegistry::instance()->rendererData( rendererName, rendererEntry ) )
379380
{
380381
if ( rendererEntry.widgetCreateFunction ) //single band color data renderer e.g. has no widget
381382
{
382383
mRendererWidget = ( *rendererEntry.widgetCreateFunction )( mRasterLayer );
383-
QWidget* oldWidget = mRendererStackedWidget->currentWidget();
384384
mRendererStackedWidget->addWidget( mRendererWidget );
385-
delete oldWidget;
385+
if ( oldWidget )
386+
{
387+
//compare used bands in new and old renderer and reset transparency dialog if different
388+
QgsRasterRenderer* oldRenderer = oldWidget->renderer();
389+
QgsRasterRenderer* newRenderer = mRendererWidget->renderer();
390+
QList<int> oldBands = oldRenderer->usesBands();
391+
QList<int> newBands = newRenderer->usesBands();
392+
if ( oldBands != newBands )
393+
{
394+
populateTransparencyTable( newRenderer );
395+
}
396+
delete oldRenderer;
397+
delete newRenderer;
398+
}
386399
}
387400
}
401+
delete oldWidget;
388402
}
389403

390404
/**
@@ -460,7 +474,7 @@ void QgsRasterLayerProperties::sync()
460474
leNoDataValue->insert( "" );
461475
}
462476

463-
populateTransparencyTable();
477+
populateTransparencyTable( mRasterLayer->renderer() );
464478

465479
QgsDebugMsg( "populate colormap tab" );
466480
/*
@@ -578,7 +592,7 @@ void QgsRasterLayerProperties::apply()
578592

579593
//Walk through each row in table and test value. If not valid set to 0.0 and continue building transparency list
580594
QgsRasterTransparency* rasterTransparency = new QgsRasterTransparency();
581-
if ( mRasterLayer->bandCount() == 3 )
595+
if ( tableTransparency->columnCount() == 4 )
582596
{
583597
double myTransparentValue;
584598
double myPercentTransparent;
@@ -678,7 +692,7 @@ void QgsRasterLayerProperties::apply()
678692
}
679693
rasterTransparency->setTransparentThreeValuePixelList( myTransparentThreeValuePixelList );
680694
}
681-
else if ( mRasterLayer->bandCount() == 1 )
695+
else if ( tableTransparency->columnCount() == 2 )
682696
{
683697
double myTransparentValue;
684698
double myPercentTransparent;
@@ -967,9 +981,21 @@ void QgsRasterLayerProperties::on_pbnChangeSpatialRefSys_clicked()
967981

968982
void QgsRasterLayerProperties::on_pbnDefaultValues_clicked()
969983
{
984+
if ( !mRendererWidget )
985+
{
986+
return;
987+
}
970988

971-
if ( /*rbtnThreeBand->isChecked() &&*/ QgsRasterLayer::PalettedColor != mRasterLayer->drawingStyle() &&
972-
QgsRasterLayer::PalettedMultiBandColor != mRasterLayer->drawingStyle() )
989+
QgsRasterRenderer* r = mRendererWidget->renderer();
990+
if ( !r )
991+
{
992+
return;
993+
}
994+
995+
int nBands = r->usesBands().size();
996+
delete r;
997+
998+
if ( nBands == 3 )
973999
{
9741000
tableTransparency->clear();
9751001
tableTransparency->setColumnCount( 4 );
@@ -986,7 +1012,7 @@ void QgsRasterLayerProperties::on_pbnDefaultValues_clicked()
9861012
tableTransparency->setItem( 0, 3, new QTableWidgetItem( "100.0" ) );
9871013
}
9881014
}
989-
else
1015+
else //1 band
9901016
{
9911017
tableTransparency->clear();
9921018
tableTransparency->setColumnCount( 2 );
@@ -1009,7 +1035,6 @@ void QgsRasterLayerProperties::on_pbnDefaultValues_clicked()
10091035
tableTransparency->setItem( 0, 0, new QTableWidgetItem( QString::number( mRasterLayer->noDataValue(), 'f' ) ) );
10101036
tableTransparency->setItem( 0, 1, new QTableWidgetItem( "100.0" ) );
10111037
}
1012-
10131038
}
10141039
}
10151040

src/app/qgsrasterlayerproperties.h

+2-1
Original file line numberDiff line numberDiff line change
@@ -29,6 +29,7 @@ class QgsMapLayer;
2929
class QgsMapCanvas;
3030
class QgsRasterLayer;
3131
class QgsMapToolEmitPoint;
32+
class QgsRasterRenderer;
3233
class QgsRasterRendererWidget;
3334

3435
/**Property sheet for a raster map layer
@@ -137,7 +138,7 @@ class QgsRasterLayerProperties : public QDialog, private Ui::QgsRasterLayerPrope
137138
QgsRasterRendererWidget* mRendererWidget;
138139

139140
/** \brief Clear the current transparency table and populate the table with the correct types for current drawing mode and data type*/
140-
void populateTransparencyTable();
141+
void populateTransparencyTable( QgsRasterRenderer* renderer );
141142

142143
void setRendererWidget( const QString& rendererName );
143144

src/core/raster/qgsmultibandcolorrenderer.cpp

+7-1
Original file line numberDiff line numberDiff line change
@@ -221,6 +221,9 @@ void QgsMultiBandColorRenderer::draw( QPainter* p, QgsRasterViewPort* viewPort,
221221
int redVal = 0;
222222
int greenVal = 0;
223223
int blueVal = 0;
224+
int redDataVal = 0;
225+
int greenDataVal = 0;
226+
int blueDataVal = 0;
224227
QRgb defaultColor = qRgba( 255, 255, 255, 0 );
225228
double currentOpacity = mOpacity; //opacity (between 0 and 1)
226229

@@ -243,14 +246,17 @@ void QgsMultiBandColorRenderer::draw( QPainter* p, QgsRasterViewPort* viewPort,
243246
if ( mRedBand > 0 )
244247
{
245248
redVal = readValue( redData, redType, currentRasterPos );
249+
redDataVal = redVal;
246250
}
247251
if ( mGreenBand > 0 )
248252
{
249253
greenVal = readValue( greenData, greenType, currentRasterPos );
254+
greenDataVal = greenVal;
250255
}
251256
if ( mBlueBand > 0 )
252257
{
253258
blueVal = readValue( blueData, blueType, currentRasterPos );
259+
blueDataVal = blueVal;
254260
}
255261

256262
//apply default color if red, green or blue not in displayable range
@@ -288,7 +294,7 @@ void QgsMultiBandColorRenderer::draw( QPainter* p, QgsRasterViewPort* viewPort,
288294
currentOpacity = mOpacity;
289295
if ( mRasterTransparency )
290296
{
291-
currentOpacity = mRasterTransparency->alphaValue( redVal, greenVal, blueVal, mOpacity * 255 ) / 255.0;
297+
currentOpacity = mRasterTransparency->alphaValue( redDataVal, greenDataVal, blueDataVal, mOpacity * 255 ) / 255.0;
292298
}
293299
if ( mAlphaBand > 0 )
294300
{

src/core/raster/qgsrasterrendererregistry.cpp

+23
Original file line numberDiff line numberDiff line change
@@ -256,6 +256,29 @@ QgsRasterRenderer* QgsRasterRendererRegistry::defaultRendererForDrawingStyle( co
256256
break;
257257
}
258258

259+
QgsRasterTransparency* tr = new QgsRasterTransparency(); //renderer takes ownership
260+
int bandCount = renderer->usesBands().size();
261+
if ( bandCount == 1 )
262+
{
263+
QList<QgsRasterTransparency::TransparentSingleValuePixel> transparentSingleList;
264+
QgsRasterTransparency::TransparentSingleValuePixel singleEntry;
265+
singleEntry.pixelValue = provider->noDataValue();
266+
singleEntry.percentTransparent = 100;
267+
transparentSingleList.push_back( singleEntry );
268+
tr->setTransparentSingleValuePixelList( transparentSingleList );
269+
}
270+
else if ( bandCount == 3 )
271+
{
272+
QList<QgsRasterTransparency::TransparentThreeValuePixel> transparentThreeValueList;
273+
QgsRasterTransparency::TransparentThreeValuePixel threeValueEntry;
274+
threeValueEntry.red = provider->noDataValue();
275+
threeValueEntry.green = provider->noDataValue();
276+
threeValueEntry.blue = provider->noDataValue();
277+
threeValueEntry.percentTransparent = 100;
278+
transparentThreeValueList.push_back( threeValueEntry );
279+
tr->setTransparentThreeValuePixelList( transparentThreeValueList );
280+
}
281+
renderer->setRasterTransparency( tr );
259282
#if 0
260283
if ( !renderer )
261284
{

0 commit comments

Comments
 (0)