From 8b9e4922fc69b97086f3d54f3ddefc722497ee01 Mon Sep 17 00:00:00 2001 From: Nyall Dawson Date: Sun, 26 Mar 2017 17:33:43 +1000 Subject: [PATCH] Don't try to compose images before they have been initialized --- src/core/qgsmaprenderercustompainterjob.cpp | 3 +++ src/core/qgsmaprendererjob.cpp | 6 ++++++ src/core/qgsmaprendererjob.h | 2 ++ src/core/qgsmaprendererparalleljob.cpp | 3 +++ 4 files changed, 14 insertions(+) diff --git a/src/core/qgsmaprenderercustompainterjob.cpp b/src/core/qgsmaprenderercustompainterjob.cpp index feaff46a567..83aed3789f8 100644 --- a/src/core/qgsmaprenderercustompainterjob.cpp +++ b/src/core/qgsmaprenderercustompainterjob.cpp @@ -257,7 +257,10 @@ void QgsMapRendererCustomPainterJob::doRender() layerTime.start(); if ( job.img ) + { job.img->fill( 0 ); + job.imageInitialized = true; + } job.renderer->render(); diff --git a/src/core/qgsmaprendererjob.cpp b/src/core/qgsmaprendererjob.cpp index c7a1a5899f4..70668f0f627 100644 --- a/src/core/qgsmaprendererjob.cpp +++ b/src/core/qgsmaprendererjob.cpp @@ -462,6 +462,9 @@ QImage QgsMapRendererJob::composeImage( const QgsMapSettings &settings, const La if ( job.layer && job.layer->customProperty( QStringLiteral( "rendering/renderAboveLabels" ) ).toBool() ) continue; // skip layer for now, it will be rendered after labels + if ( !job.imageInitialized ) + continue; // img not safe to compose + painter.setCompositionMode( job.blendMode ); painter.setOpacity( job.opacity ); @@ -488,6 +491,9 @@ QImage QgsMapRendererJob::composeImage( const QgsMapSettings &settings, const La if ( !job.layer || !job.layer->customProperty( QStringLiteral( "rendering/renderAboveLabels" ) ).toBool() ) continue; + if ( !job.imageInitialized ) + continue; // img not safe to compose + painter.setCompositionMode( job.blendMode ); painter.setOpacity( job.opacity ); diff --git a/src/core/qgsmaprendererjob.h b/src/core/qgsmaprendererjob.h index 8ff038c893a..652fc6072b1 100644 --- a/src/core/qgsmaprendererjob.h +++ b/src/core/qgsmaprendererjob.h @@ -46,6 +46,8 @@ struct LayerRenderJob { QgsRenderContext context; QImage *img; // may be null if it is not necessary to draw to separate image (e.g. sequential rendering) + //! True when img has been initialized (filled with transparent pixels) and is safe to compose + bool imageInitialized = false; QgsMapLayerRenderer *renderer; // must be deleted QPainter::CompositionMode blendMode; double opacity; diff --git a/src/core/qgsmaprendererparalleljob.cpp b/src/core/qgsmaprendererparalleljob.cpp index 45fae4ef29e..cab41ddbb80 100644 --- a/src/core/qgsmaprendererparalleljob.cpp +++ b/src/core/qgsmaprendererparalleljob.cpp @@ -244,7 +244,10 @@ void QgsMapRendererParallelJob::renderLayerStatic( LayerRenderJob &job ) return; if ( job.img ) + { job.img->fill( 0 ); + job.imageInitialized = true; + } QTime t; t.start();