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