Skip to content

Commit 971b413

Browse files
committed
Fix layers with layer wide opacity "flashing" by rendering
intermediate states without opacity (cherry-picked from 19f6b62)
1 parent 61c0f18 commit 971b413

File tree

6 files changed

+10
-15
lines changed

6 files changed

+10
-15
lines changed

src/core/qgsmaprenderercustompainterjob.cpp

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -273,7 +273,9 @@ void QgsMapRendererCustomPainterJob::doRender()
273273
if ( job.img )
274274
{
275275
// If we flattened this layer for alternate blend modes, composite it now
276+
mPainter->setOpacity( job.opacity );
276277
mPainter->drawImage( 0, 0, *job.img );
278+
mPainter->setOpacity( 1.0 );
277279
}
278280

279281
}

src/core/qgsmaprendererjob.cpp

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -245,6 +245,11 @@ LayerRenderJobs QgsMapRendererJob::prepareJobs( QPainter* painter, QgsPalLabelin
245245
job.cached = false;
246246
job.img = nullptr;
247247
job.blendMode = ml->blendMode();
248+
job.opacity = 1.0;
249+
if ( QgsVectorLayer* vl = qobject_cast<QgsVectorLayer *>( ml ) )
250+
{
251+
job.opacity = 1.0 - vl->layerTransparency() / 100.0;
252+
}
248253
job.layerId = ml->id();
249254
job.renderingTime = -1;
250255

@@ -361,8 +366,10 @@ QImage QgsMapRendererJob::composeImage( const QgsMapSettings& settings, const La
361366
const LayerRenderJob& job = *it;
362367

363368
painter.setCompositionMode( job.blendMode );
369+
painter.setOpacity( job.opacity );
364370

365371
Q_ASSERT( job.img );
372+
366373
painter.drawImage( 0, 0, *job.img );
367374
}
368375

src/core/qgsmaprendererjob.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -46,6 +46,7 @@ struct LayerRenderJob
4646
QImage* img; // may be null if it is not necessary to draw to separate image (e.g. sequential rendering)
4747
QgsMapLayerRenderer* renderer; // must be deleted
4848
QPainter::CompositionMode blendMode;
49+
double opacity;
4950
bool cached; // if true, img already contains cached image from previous rendering
5051
QString layerId;
5152
int renderingTime; //!< time it took to render the layer in ms (it is -1 if not rendered or still rendering)

src/core/qgsvectorlayerrenderer.cpp

Lines changed: 0 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -53,7 +53,6 @@ QgsVectorLayerRenderer::QgsVectorLayerRenderer( QgsVectorLayer* layer, QgsRender
5353
, mDiagrams( false )
5454
, mLabelProvider( nullptr )
5555
, mDiagramProvider( nullptr )
56-
, mLayerTransparency( 0 )
5756
{
5857
mSource = new QgsVectorLayerFeatureSource( layer );
5958

@@ -64,7 +63,6 @@ QgsVectorLayerRenderer::QgsVectorLayerRenderer( QgsVectorLayer* layer, QgsRender
6463

6564
mGeometryType = layer->geometryType();
6665

67-
mLayerTransparency = layer->layerTransparency();
6866
mFeatureBlendMode = layer->featureBlendMode();
6967

7068
mSimplifyMethod = layer->simplifyMethod();
@@ -262,18 +260,6 @@ bool QgsVectorLayerRenderer::render()
262260
mRendererV2->paintEffect()->end( mContext );
263261
}
264262

265-
//apply layer transparency for vector layers
266-
if ( mContext.useAdvancedEffects() && mLayerTransparency != 0 )
267-
{
268-
// a layer transparency has been set, so update the alpha for the flattened layer
269-
// by combining it with the layer transparency
270-
QColor transparentFillColor = QColor( 0, 0, 0, 255 - ( 255 * mLayerTransparency / 100 ) );
271-
// use destination in composition mode to merge source's alpha with destination
272-
mContext.painter()->setCompositionMode( QPainter::CompositionMode_DestinationIn );
273-
mContext.painter()->fillRect( 0, 0, mContext.painter()->device()->width(),
274-
mContext.painter()->device()->height(), transparentFillColor );
275-
}
276-
277263
return true;
278264
}
279265

src/core/qgsvectorlayerrenderer.h

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -136,7 +136,6 @@ class QgsVectorLayerRenderer : public QgsMapLayerRenderer
136136
//! may be null. no need to delete: if exists it is owned by labeling engine
137137
QgsVectorLayerDiagramProvider* mDiagramProvider;
138138

139-
int mLayerTransparency;
140139
QPainter::CompositionMode mFeatureBlendMode;
141140

142141
QgsVectorSimplifyMethod mSimplifyMethod;

0 commit comments

Comments
 (0)