Skip to content

Commit 06836fb

Browse files
committedMay 24, 2013
Fix crash with render caching and feature blending combination
1 parent 260b617 commit 06836fb

File tree

1 file changed

+35
-23
lines changed

1 file changed

+35
-23
lines changed
 

‎src/core/qgsmaprenderer.cpp

Lines changed: 35 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -483,10 +483,12 @@ void QgsMapRenderer::render( QPainter* painter, double* forceWidthScale )
483483
}
484484

485485
QSettings mySettings;
486+
bool useRenderCaching = false;
486487
if ( ! split )//render caching does not yet cater for split extents
487488
{
488489
if ( mySettings.value( "/qgis/enable_render_caching", false ).toBool() )
489490
{
491+
useRenderCaching = true;
490492
if ( !mySameAsLastFlag || ml->cacheImage() == 0 )
491493
{
492494
QgsDebugMsg( "Caching enabled but layer redraw forced by extent change or empty cache" );
@@ -522,10 +524,10 @@ void QgsMapRenderer::render( QPainter* painter, double* forceWidthScale )
522524
if (( mRenderContext.useAdvancedEffects() ) && ( ml->type() == QgsMapLayer::VectorLayer ) )
523525
{
524526
QgsVectorLayer* vl = qobject_cast<QgsVectorLayer *>( ml );
525-
if (( vl->blendMode() != QPainter::CompositionMode_SourceOver && ( split || !mySettings.value( "/qgis/enable_render_caching", false ).toBool() ) )
526-
|| ( vl->featureBlendMode() != QPainter::CompositionMode_SourceOver )
527-
|| ( vl->layerTransparency() != 0 ) )
528-
527+
if (( !useRenderCaching )
528+
&& (( vl->blendMode() != QPainter::CompositionMode_SourceOver )
529+
|| ( vl->featureBlendMode() != QPainter::CompositionMode_SourceOver )
530+
|| ( vl->layerTransparency() != 0 ) ) )
529531
{
530532
flattenedLayer = true;
531533
mypFlattenedImage = new QImage( mRenderContext.painter()->device()->width(),
@@ -538,9 +540,18 @@ void QgsMapRenderer::render( QPainter* painter, double* forceWidthScale )
538540
}
539541
mypPainter->scale( rasterScaleFactor, rasterScaleFactor );
540542
mRenderContext.setPainter( mypPainter );
543+
}
544+
}
541545

542-
// set the painter to the feature blend mode
543-
mypPainter->setCompositionMode( vl->featureBlendMode() );
546+
// Per feature blending mode
547+
if (( mRenderContext.useAdvancedEffects() ) && ( ml->type() == QgsMapLayer::VectorLayer ) )
548+
{
549+
QgsVectorLayer* vl = qobject_cast<QgsVectorLayer *>( ml );
550+
if ( vl->featureBlendMode() != QPainter::CompositionMode_SourceOver )
551+
{
552+
// set the painter to the feature blend mode, so that features drawn
553+
// on this layer will interact and blend with each other
554+
mRenderContext.painter()->setCompositionMode( vl->featureBlendMode() );
544555
}
545556
}
546557

@@ -579,22 +590,8 @@ void QgsMapRenderer::render( QPainter* painter, double* forceWidthScale )
579590
mRenderContext.painter()->restore();
580591
}
581592

582-
if ( mySettings.value( "/qgis/enable_render_caching", false ).toBool() )
583-
{
584-
if ( !split )
585-
{
586-
// composite the cached image into our view and then clean up from caching
587-
// by reinstating the painter as it was swapped out for caching renders
588-
delete mRenderContext.painter();
589-
mRenderContext.setPainter( mypContextPainter );
590-
//draw from cached image that we created further up
591-
if ( ml->cacheImage() )
592-
mypContextPainter->drawImage( 0, 0, *( ml->cacheImage() ) );
593-
}
594-
}
595-
596-
// If we flattened this layer for alternate blend modes, composite it now
597-
if ( flattenedLayer )
593+
//apply layer transparency for vector layers
594+
if (( mRenderContext.useAdvancedEffects() ) && ( ml->type() == QgsMapLayer::VectorLayer ) )
598595
{
599596
QgsVectorLayer* vl = qobject_cast<QgsVectorLayer *>( ml );
600597
if ( vl->layerTransparency() != 0 )
@@ -604,9 +601,24 @@ void QgsMapRenderer::render( QPainter* painter, double* forceWidthScale )
604601
QColor transparentFillColor = QColor( 0, 0, 0, 255 - ( 255 * vl->layerTransparency() / 100 ) );
605602
// use destination in composition mode to merge source's alpha with destination
606603
mRenderContext.painter()->setCompositionMode( QPainter::CompositionMode_DestinationIn );
607-
mRenderContext.painter()->fillRect( mypFlattenedImage->rect(), transparentFillColor );
604+
mRenderContext.painter()->fillRect( 0, 0, mRenderContext.painter()->device()->width(),
605+
mRenderContext.painter()->device()->height(), transparentFillColor );
608606
}
607+
}
609608

609+
if ( useRenderCaching )
610+
{
611+
// composite the cached image into our view and then clean up from caching
612+
// by reinstating the painter as it was swapped out for caching renders
613+
delete mRenderContext.painter();
614+
mRenderContext.setPainter( mypContextPainter );
615+
//draw from cached image that we created further up
616+
if ( ml->cacheImage() )
617+
mypContextPainter->drawImage( 0, 0, *( ml->cacheImage() ) );
618+
}
619+
else if ( flattenedLayer )
620+
{
621+
// If we flattened this layer for alternate blend modes, composite it now
610622
delete mRenderContext.painter();
611623
mRenderContext.setPainter( mypContextPainter );
612624
mypContextPainter->save();

0 commit comments

Comments
 (0)
Please sign in to comment.