Skip to content

Commit

Permalink
Fix handling of blend modes for nested group layers
Browse files Browse the repository at this point in the history
  • Loading branch information
nyalldawson committed Nov 25, 2021
1 parent 01ca203 commit e04e20c
Show file tree
Hide file tree
Showing 2 changed files with 8 additions and 4 deletions.
11 changes: 7 additions & 4 deletions src/core/qgsgrouplayerrenderer.cpp
Expand Up @@ -55,6 +55,8 @@ QgsGroupLayerRenderer::QgsGroupLayerRenderer( QgsGroupLayer *layer, QgsRenderCon
}

mPaintEffect.reset( layer->paintEffect() ? layer->paintEffect()->clone() : nullptr );

mForceRasterRender = layer->blendMode() != QPainter::CompositionMode_SourceOver;
}

QgsGroupLayerRenderer::~QgsGroupLayerRenderer() = default;
Expand Down Expand Up @@ -92,6 +94,9 @@ bool QgsGroupLayerRenderer::render()
context.setExtent( extentInChildLayerCrs );

QImage image;
if ( context.useAdvancedEffects() )
context.painter()->setCompositionMode( mRendererCompositionModes[i] );

QPainter *prevPainter = context.painter();
std::unique_ptr< QPainter > imagePainter;
if ( renderer->forceRasterRender() )
Expand All @@ -110,14 +115,12 @@ bool QgsGroupLayerRenderer::render()
{
imagePainter->end();
context.setPainter( prevPainter );
if ( context.useAdvancedEffects() )
context.painter()->setCompositionMode( mRendererCompositionModes[i] );

context.painter()->setOpacity( mRendererOpacity[i] );
context.painter()->drawImage( 0, 0, image );
context.painter()->setOpacity( 1.0 );
context.painter()->setCompositionMode( QPainter::CompositionMode_SourceOver );
}
context.painter()->setCompositionMode( QPainter::CompositionMode_SourceOver );
i++;
}

Expand All @@ -136,7 +139,7 @@ bool QgsGroupLayerRenderer::forceRasterRender() const
if ( !renderContext()->testFlag( Qgis::RenderContextFlag::UseAdvancedEffects ) )
return false;

if ( !qgsDoubleNear( mLayerOpacity, 1.0 ) )
if ( mForceRasterRender || !qgsDoubleNear( mLayerOpacity, 1.0 ) )
return true;

for ( QPainter::CompositionMode mode : mRendererCompositionModes )
Expand Down
1 change: 1 addition & 0 deletions src/core/qgsgrouplayerrenderer.h
Expand Up @@ -55,6 +55,7 @@ class CORE_EXPORT QgsGroupLayerRenderer : public QgsMapLayerRenderer

private:
std::unique_ptr< QgsFeedback > mFeedback;
bool mForceRasterRender = false;
std::vector< std::unique_ptr< QgsMapLayerRenderer > > mChildRenderers;
std::vector< QPainter::CompositionMode > mRendererCompositionModes;
std::vector< double > mRendererOpacity;
Expand Down

0 comments on commit e04e20c

Please sign in to comment.