Skip to content

Commit

Permalink
Fix loss of transparency information in style dock (fixes #15229)
Browse files Browse the repository at this point in the history
  • Loading branch information
wonder-sk committed Jul 7, 2016
1 parent 5ae7802 commit cca79aa
Show file tree
Hide file tree
Showing 10 changed files with 39 additions and 21 deletions.
5 changes: 5 additions & 0 deletions python/core/raster/qgsrasterrenderer.sip
Expand Up @@ -57,6 +57,11 @@ class QgsRasterRenderer : QgsRasterInterface
/** Sets base class members from xml. Usually called from create() methods of subclasses*/
void readXML( const QDomElement& rendererElem );

/** Copies common properties like opacity / transparency data from other renderer.
* Useful when cloning renderers.
* @note added in 2.16 */
void copyCommonProperties( const QgsRasterRenderer* other );

/** Returns a list of band numbers used by the renderer*/
virtual QList<int> usesBands() const;

Expand Down
6 changes: 2 additions & 4 deletions src/core/raster/qgshillshaderenderer.cpp
Expand Up @@ -38,12 +38,10 @@ QgsHillshadeRenderer::QgsHillshadeRenderer( QgsRasterInterface *input, int band,
QgsHillshadeRenderer *QgsHillshadeRenderer::clone() const
{
QgsHillshadeRenderer* r = new QgsHillshadeRenderer( nullptr, mBand, mLightAzimuth, mLightAngle );
r->copyCommonProperties( this );

r->setZFactor( mZFactor );
r->setMultiDirectional( mMultiDirectional );
// "Effects"
r->setOpacity( mOpacity );
r->setAlphaBand( mAlphaBand );
r->setRasterTransparency( mRasterTransparency ? new QgsRasterTransparency( *mRasterTransparency ) : nullptr );
return r;
}

Expand Down
5 changes: 2 additions & 3 deletions src/core/raster/qgsmultibandcolorrenderer.cpp
Expand Up @@ -48,6 +48,8 @@ QgsMultiBandColorRenderer::~QgsMultiBandColorRenderer()
QgsMultiBandColorRenderer* QgsMultiBandColorRenderer::clone() const
{
QgsMultiBandColorRenderer * renderer = new QgsMultiBandColorRenderer( nullptr, mRedBand, mGreenBand, mBlueBand );
renderer->copyCommonProperties( this );

if ( mRedContrastEnhancement )
{
renderer->setRedContrastEnhancement( new QgsContrastEnhancement( *mRedContrastEnhancement ) );
Expand All @@ -60,9 +62,6 @@ QgsMultiBandColorRenderer* QgsMultiBandColorRenderer::clone() const
{
renderer->setBlueContrastEnhancement( new QgsContrastEnhancement( *mBlueContrastEnhancement ) );
}
renderer->setOpacity( mOpacity );
renderer->setAlphaBand( mAlphaBand );
renderer->setRasterTransparency( mRasterTransparency ? new QgsRasterTransparency( *mRasterTransparency ) : nullptr );

return renderer;
}
Expand Down
5 changes: 2 additions & 3 deletions src/core/raster/qgspalettedrasterrenderer.cpp
Expand Up @@ -49,9 +49,8 @@ QgsPalettedRasterRenderer::~QgsPalettedRasterRenderer()
QgsPalettedRasterRenderer* QgsPalettedRasterRenderer::clone() const
{
QgsPalettedRasterRenderer * renderer = new QgsPalettedRasterRenderer( nullptr, mBand, rgbArray(), mNColors );
renderer->setOpacity( mOpacity );
renderer->setAlphaBand( mAlphaBand );
renderer->setRasterTransparency( mRasterTransparency ? new QgsRasterTransparency( *mRasterTransparency ) : nullptr );
renderer->copyCommonProperties( this );

renderer->mLabels = mLabels;
return renderer;
}
Expand Down
10 changes: 10 additions & 0 deletions src/core/raster/qgsrasterrenderer.cpp
Expand Up @@ -134,6 +134,16 @@ void QgsRasterRenderer::readXML( const QDomElement& rendererElem )
}
}

void QgsRasterRenderer::copyCommonProperties( const QgsRasterRenderer* other )
{
if ( !other )
return;

setOpacity( other->opacity() );
setAlphaBand( other->alphaBand() );
setRasterTransparency( other->rasterTransparency() ? new QgsRasterTransparency( *other->rasterTransparency() ) : nullptr );
}

QString QgsRasterRenderer::minMaxOriginName( int theOrigin )
{
if ( theOrigin == MinMaxUnknown )
Expand Down
5 changes: 5 additions & 0 deletions src/core/raster/qgsrasterrenderer.h
Expand Up @@ -88,6 +88,11 @@ class CORE_EXPORT QgsRasterRenderer : public QgsRasterInterface
/** Sets base class members from xml. Usually called from create() methods of subclasses*/
void readXML( const QDomElement& rendererElem ) override;

/** Copies common properties like opacity / transparency data from other renderer.
* Useful when cloning renderers.
* @note added in 2.16 */
void copyCommonProperties( const QgsRasterRenderer* other );

/** Returns a list of band numbers used by the renderer*/
virtual QList<int> usesBands() const { return QList<int>(); }

Expand Down
4 changes: 1 addition & 3 deletions src/core/raster/qgssinglebandcolordatarenderer.cpp
Expand Up @@ -35,9 +35,7 @@ QgsSingleBandColorDataRenderer::~QgsSingleBandColorDataRenderer()
QgsSingleBandColorDataRenderer* QgsSingleBandColorDataRenderer::clone() const
{
QgsSingleBandColorDataRenderer * renderer = new QgsSingleBandColorDataRenderer( nullptr, mBand );
renderer->setOpacity( mOpacity );
renderer->setAlphaBand( mAlphaBand );
renderer->setRasterTransparency( mRasterTransparency ? new QgsRasterTransparency( *mRasterTransparency ) : nullptr );
renderer->copyCommonProperties( this );
return renderer;
}

Expand Down
5 changes: 2 additions & 3 deletions src/core/raster/qgssinglebandgrayrenderer.cpp
Expand Up @@ -35,9 +35,8 @@ QgsSingleBandGrayRenderer::~QgsSingleBandGrayRenderer()
QgsSingleBandGrayRenderer* QgsSingleBandGrayRenderer::clone() const
{
QgsSingleBandGrayRenderer * renderer = new QgsSingleBandGrayRenderer( nullptr, mGrayBand );
renderer->setOpacity( mOpacity );
renderer->setAlphaBand( mAlphaBand );
renderer->setRasterTransparency( mRasterTransparency ? new QgsRasterTransparency( *mRasterTransparency ) : nullptr );
renderer->copyCommonProperties( this );

renderer->setGradient( mGradient );
if ( mContrastEnhancement )
{
Expand Down
5 changes: 1 addition & 4 deletions src/core/raster/qgssinglebandpseudocolorrenderer.cpp
Expand Up @@ -69,10 +69,7 @@ QgsSingleBandPseudoColorRenderer* QgsSingleBandPseudoColorRenderer::clone() cons
}
}
QgsSingleBandPseudoColorRenderer * renderer = new QgsSingleBandPseudoColorRenderer( nullptr, mBand, shader );

renderer->setOpacity( mOpacity );
renderer->setAlphaBand( mAlphaBand );
renderer->setRasterTransparency( mRasterTransparency ? new QgsRasterTransparency( *mRasterTransparency ) : nullptr );
renderer->copyCommonProperties( this );

return renderer;
}
Expand Down
10 changes: 9 additions & 1 deletion src/gui/raster/qgsrendererrasterpropertieswidget.cpp
Expand Up @@ -133,7 +133,15 @@ void QgsRendererRasterPropertiesWidget::apply()
QgsRasterRendererWidget* rendererWidget = dynamic_cast<QgsRasterRendererWidget*>( stackedWidget->currentWidget() );
if ( rendererWidget )
{
mRasterLayer->setRenderer( rendererWidget->renderer() );
QgsRasterRenderer* newRenderer = rendererWidget->renderer();

// there are transparency related data stored in renderer instances, but they
// are not configured in the widget, so we need to copy them over from existing renderer
QgsRasterRenderer* oldRenderer = mRasterLayer->renderer();
if ( oldRenderer )
newRenderer->copyCommonProperties( oldRenderer );

mRasterLayer->setRenderer( newRenderer );
}

// Hue and saturation controls
Expand Down

0 comments on commit cca79aa

Please sign in to comment.