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; }