@@ -483,10 +483,12 @@ void QgsMapRenderer::render( QPainter* painter, double* forceWidthScale )
483
483
}
484
484
485
485
QSettings mySettings;
486
+ bool useRenderCaching = false ;
486
487
if ( ! split )// render caching does not yet cater for split extents
487
488
{
488
489
if ( mySettings.value ( " /qgis/enable_render_caching" , false ).toBool () )
489
490
{
491
+ useRenderCaching = true ;
490
492
if ( !mySameAsLastFlag || ml->cacheImage () == 0 )
491
493
{
492
494
QgsDebugMsg ( " Caching enabled but layer redraw forced by extent change or empty cache" );
@@ -522,10 +524,10 @@ void QgsMapRenderer::render( QPainter* painter, double* forceWidthScale )
522
524
if (( mRenderContext .useAdvancedEffects () ) && ( ml->type () == QgsMapLayer::VectorLayer ) )
523
525
{
524
526
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 ) ) )
529
531
{
530
532
flattenedLayer = true ;
531
533
mypFlattenedImage = new QImage ( mRenderContext .painter ()->device ()->width (),
@@ -538,9 +540,18 @@ void QgsMapRenderer::render( QPainter* painter, double* forceWidthScale )
538
540
}
539
541
mypPainter->scale ( rasterScaleFactor, rasterScaleFactor );
540
542
mRenderContext .setPainter ( mypPainter );
543
+ }
544
+ }
541
545
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 () );
544
555
}
545
556
}
546
557
@@ -579,22 +590,8 @@ void QgsMapRenderer::render( QPainter* painter, double* forceWidthScale )
579
590
mRenderContext .painter ()->restore ();
580
591
}
581
592
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 ) )
598
595
{
599
596
QgsVectorLayer* vl = qobject_cast<QgsVectorLayer *>( ml );
600
597
if ( vl->layerTransparency () != 0 )
@@ -604,9 +601,24 @@ void QgsMapRenderer::render( QPainter* painter, double* forceWidthScale )
604
601
QColor transparentFillColor = QColor ( 0 , 0 , 0 , 255 - ( 255 * vl->layerTransparency () / 100 ) );
605
602
// use destination in composition mode to merge source's alpha with destination
606
603
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 );
608
606
}
607
+ }
609
608
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
610
622
delete mRenderContext .painter ();
611
623
mRenderContext .setPainter ( mypContextPainter );
612
624
mypContextPainter->save ();
0 commit comments