void QgsRasterTransparencyWidget::apply() { //set NoDataValue QgsRasterRangeList myNoDataRangeList; if ( "" != leNoDataValue->text() ) { bool myDoubleOk = false; double myNoDataValue = leNoDataValue->text().toDouble( &myDoubleOk ); if ( myDoubleOk ) { QgsRasterRange myNoDataRange( myNoDataValue, myNoDataValue ); myNoDataRangeList << myNoDataRange; } } for ( int bandNo = 1; bandNo <= mRasterLayer->dataProvider()->bandCount(); bandNo++ ) { mRasterLayer->dataProvider()->setUserNoDataValue( bandNo, myNoDataRangeList ); mRasterLayer->dataProvider()->setUseSourceNoDataValue( bandNo, mSrcNoDataValueCheckBox->isChecked() ); } //transparency settings QgsRasterRenderer *rasterRenderer = mRasterLayer->renderer(); if ( rasterRenderer ) { rasterRenderer->setAlphaBand( cboxTransparencyBand->currentBand() ); //Walk through each row in table and test value. If not valid set to 0.0 and continue building transparency list QgsRasterTransparency *rasterTransparency = new QgsRasterTransparency(); if ( tableTransparency->columnCount() == 4 ) { QgsRasterTransparency::TransparentThreeValuePixel myTransparentPixel; QList<QgsRasterTransparency::TransparentThreeValuePixel> myTransparentThreeValuePixelList; myTransparentThreeValuePixelList.reserve( tableTransparency->rowCount() ); for ( int myListRunner = 0; myListRunner < tableTransparency->rowCount(); myListRunner++ ) { myTransparentPixel.red = transparencyCellValue( myListRunner, 0 ); myTransparentPixel.green = transparencyCellValue( myListRunner, 1 ); myTransparentPixel.blue = transparencyCellValue( myListRunner, 2 ); myTransparentPixel.percentTransparent = transparencyCellValue( myListRunner, 3 ); myTransparentThreeValuePixelList.append( myTransparentPixel ); } rasterTransparency->setTransparentThreeValuePixelList( myTransparentThreeValuePixelList ); } else if ( tableTransparency->columnCount() == 3 ) { QgsRasterTransparency::TransparentSingleValuePixel myTransparentPixel; QList<QgsRasterTransparency::TransparentSingleValuePixel> myTransparentSingleValuePixelList; myTransparentSingleValuePixelList.reserve( tableTransparency->rowCount() ); for ( int myListRunner = 0; myListRunner < tableTransparency->rowCount(); myListRunner++ ) { myTransparentPixel.min = transparencyCellValue( myListRunner, 0 ); myTransparentPixel.max = transparencyCellValue( myListRunner, 1 ); myTransparentPixel.percentTransparent = transparencyCellValue( myListRunner, 2 ); myTransparentSingleValuePixelList.append( myTransparentPixel ); } rasterTransparency->setTransparentSingleValuePixelList( myTransparentSingleValuePixelList ); } rasterRenderer->setRasterTransparency( rasterTransparency ); //set global transparency rasterRenderer->setOpacity( mOpacityWidget->opacity() ); } }
QgsRasterRenderer* QgsRasterRendererRegistry::defaultRendererForDrawingStyle( QgsRaster::DrawingStyle theDrawingStyle, QgsRasterDataProvider* provider ) const { if ( !provider || provider->bandCount() < 1 ) { return nullptr; } QgsRasterRenderer* renderer = nullptr; switch ( theDrawingStyle ) { case QgsRaster::PalettedColor: { int grayBand = 1; //reasonable default QList<QgsColorRampShader::ColorRampItem> 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<QgsColorRampShader::ColorRampItem>::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(); QVector<QString> labels; for ( ; colorIt != colorEntries.constEnd(); ++colorIt ) { int idx = ( int )( colorIt->value ); colorArray[idx] = colorIt->color; if ( !colorIt->label.isEmpty() ) { if ( labels.size() <= idx ) labels.resize( idx + 1 ); labels[idx] = colorIt->label; } } renderer = new QgsPalettedRasterRenderer( provider, grayBand, colorArray, colorArraySize, labels ); } break; case QgsRaster::MultiBandSingleBandGray: case QgsRaster::SingleBandGray: { int grayBand = 1; renderer = new QgsSingleBandGrayRenderer( provider, grayBand ); QgsContrastEnhancement* ce = new QgsContrastEnhancement(( QGis::DataType )( provider->dataType( grayBand ) ) ); // Default contrast enhancement is set from QgsRasterLayer, it has already setContrastEnhancementAlgorithm(). Default enhancement must only be set if default style was not loaded (to avoid stats calculation). (( QgsSingleBandGrayRenderer* )renderer )->setContrastEnhancement( ce ); break; } case QgsRaster::SingleBandPseudoColor: { int bandNo = 1; double minValue = 0; double maxValue = 0; // TODO: avoid calculating statistics if not necessary (default style loaded) minMaxValuesForBand( bandNo, provider, minValue, maxValue ); QgsRasterShader* shader = new QgsRasterShader( minValue, maxValue ); renderer = new QgsSingleBandPseudoColorRenderer( provider, bandNo, shader ); break; } case QgsRaster::MultiBandColor: { QSettings s; 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; } renderer = new QgsMultiBandColorRenderer( provider, redBand, greenBand, blueBand ); break; } case QgsRaster::SingleBandColorDataStyle: { renderer = new QgsSingleBandColorDataRenderer( provider, 1 ); break; } default: return nullptr; } QgsRasterTransparency* tr = new QgsRasterTransparency(); //renderer takes ownership int bandCount = renderer->usesBands().size(); if ( bandCount == 1 ) { QList<QgsRasterTransparency::TransparentSingleValuePixel> transparentSingleList; tr->setTransparentSingleValuePixelList( transparentSingleList ); } else if ( bandCount == 3 ) { QList<QgsRasterTransparency::TransparentThreeValuePixel> transparentThreeValueList; tr->setTransparentThreeValuePixelList( transparentThreeValueList ); } renderer->setRasterTransparency( tr ); return renderer; }
QgsRasterRenderer *QgsRasterRendererRegistry::defaultRendererForDrawingStyle( QgsRaster::DrawingStyle drawingStyle, QgsRasterDataProvider *provider ) const { if ( !provider || provider->bandCount() < 1 ) { return nullptr; } QgsRasterRenderer *renderer = nullptr; switch ( drawingStyle ) { case QgsRaster::PalettedColor: { int grayBand = 1; //reasonable default QgsPalettedRasterRenderer::ClassData classes = QgsPalettedRasterRenderer::colorTableToClassData( provider->colorTable( grayBand ) ); renderer = new QgsPalettedRasterRenderer( provider, grayBand, classes ); } break; case QgsRaster::MultiBandSingleBandGray: case QgsRaster::SingleBandGray: { int grayBand = 1; renderer = new QgsSingleBandGrayRenderer( provider, grayBand ); QgsContrastEnhancement *ce = new QgsContrastEnhancement( ( Qgis::DataType )( provider->dataType( grayBand ) ) ); // Default contrast enhancement is set from QgsRasterLayer, it has already setContrastEnhancementAlgorithm(). Default enhancement must only be set if default style was not loaded (to avoid stats calculation). ( ( QgsSingleBandGrayRenderer * )renderer )->setContrastEnhancement( ce ); break; } case QgsRaster::SingleBandPseudoColor: { int bandNo = 1; double minValue = 0; double maxValue = 0; // TODO: avoid calculating statistics if not necessary (default style loaded) minMaxValuesForBand( bandNo, provider, minValue, maxValue ); QgsRasterShader *shader = new QgsRasterShader( minValue, maxValue ); renderer = new QgsSingleBandPseudoColorRenderer( provider, bandNo, shader ); break; } case QgsRaster::MultiBandColor: { QgsSettings s; int redBand = s.value( QStringLiteral( "/Raster/defaultRedBand" ), 1 ).toInt(); if ( redBand < 0 || redBand > provider->bandCount() ) { redBand = -1; } int greenBand = s.value( QStringLiteral( "/Raster/defaultGreenBand" ), 2 ).toInt(); if ( greenBand < 0 || greenBand > provider->bandCount() ) { greenBand = -1; } int blueBand = s.value( QStringLiteral( "/Raster/defaultBlueBand" ), 3 ).toInt(); if ( blueBand < 0 || blueBand > provider->bandCount() ) { blueBand = -1; } renderer = new QgsMultiBandColorRenderer( provider, redBand, greenBand, blueBand ); break; } case QgsRaster::SingleBandColorDataStyle: { renderer = new QgsSingleBandColorDataRenderer( provider, 1 ); break; } default: return nullptr; } QgsRasterTransparency *tr = new QgsRasterTransparency(); //renderer takes ownership int bandCount = renderer->usesBands().size(); if ( bandCount == 1 ) { QList<QgsRasterTransparency::TransparentSingleValuePixel> transparentSingleList; tr->setTransparentSingleValuePixelList( transparentSingleList ); } else if ( bandCount == 3 ) { QList<QgsRasterTransparency::TransparentThreeValuePixel> transparentThreeValueList; tr->setTransparentThreeValuePixelList( transparentThreeValueList ); } renderer->setRasterTransparency( tr ); return renderer; }