QgsHillshadeRenderer *QgsHillshadeRenderer::clone() const
{
    QgsHillshadeRenderer* r = new QgsHillshadeRenderer( nullptr, mBand, mLightAzimuth, mLightAngle );
    r->copyCommonProperties( this );

    r->setZFactor( mZFactor );
    r->setMultiDirectional( mMultiDirectional );
    return r;
}
QgsRasterRenderer *QgsHillshadeRenderer::create( const QDomElement &elem, QgsRasterInterface *input )
{
    if ( elem.isNull() )
    {
        return nullptr;
    }

    int band = elem.attribute( "band", "0" ).toInt();
    double azimuth = elem.attribute( "azimuth", "315" ).toDouble();
    double angle = elem.attribute( "angle", "45" ).toDouble();
    double zFactor = elem.attribute( "zfactor", "1" ).toDouble();
    bool multiDirectional = elem.attribute( "multidirection", "0" ).toInt();
    QgsHillshadeRenderer* r = new QgsHillshadeRenderer( input, band, azimuth , angle );
    r->readXml( elem );

    r->setZFactor( zFactor );
    r->setMultiDirectional( multiDirectional );
    return r;
}
QgsRasterRenderer *QgsHillshadeRendererWidget::renderer()
{
  if ( !mRasterLayer )
  {
    return nullptr;
  }

  QgsRasterDataProvider* provider = mRasterLayer->dataProvider();
  if ( !provider )
  {
    return nullptr;
  }

  int band = mBandsCombo->currentData().toInt();
  QgsHillshadeRenderer* renderer = new QgsHillshadeRenderer( provider, band, mLightAzimuth->value(), mLightAngle->value() );
  double value = mZFactor->value();
  renderer->setZFactor( value );
  renderer->setMultiDirectional( mMultiDirection->checkState() );
  return renderer;
}