Skip to content

Commit

Permalink
Fix thread unsafe custom layer property access in layer rendering
Browse files Browse the repository at this point in the history
  • Loading branch information
nyalldawson authored and github-actions[bot] committed Dec 14, 2022
1 parent 427a1fd commit a86559e
Show file tree
Hide file tree
Showing 2 changed files with 9 additions and 2 deletions.
8 changes: 6 additions & 2 deletions src/core/maprenderer/qgsmaprendererjob.cpp
Expand Up @@ -66,6 +66,7 @@ LayerRenderJob &LayerRenderJob::operator=( LayerRenderJob &&other )
opacity = other.opacity;
cached = other.cached;
layer = other.layer;
renderAboveLabels = other.renderAboveLabels;
completed = other.completed;
renderingTime = other.renderingTime;
estimatedRenderingTime = other.estimatedRenderingTime ;
Expand All @@ -91,6 +92,7 @@ LayerRenderJob::LayerRenderJob( LayerRenderJob &&other )
, blendMode( other.blendMode )
, opacity( other.opacity )
, cached( other.cached )
, renderAboveLabels( other.renderAboveLabels )
, layer( other.layer )
, completed( other.completed )
, renderingTime( other.renderingTime )
Expand Down Expand Up @@ -506,6 +508,7 @@ std::vector<LayerRenderJob> QgsMapRendererJob::prepareJobs( QPainter *painter, Q
LayerRenderJob &job = layerJobs.back();
job.layer = ml;
job.layerId = ml->id();
job.renderAboveLabels = ml->customProperty( QStringLiteral( "rendering/renderAboveLabels" ) ).toBool();
job.estimatedRenderingTime = mLayerRenderingTimeHints.value( ml->id(), 0 );

job.setContext( std::make_unique< QgsRenderContext >( QgsRenderContext::fromMapSettings( mSettings ) ) );
Expand Down Expand Up @@ -846,6 +849,7 @@ std::vector< LayerRenderJob > QgsMapRendererJob::prepareSecondPassJobs( std::vec
job2.setContext( std::make_unique< QgsRenderContext >( *job.context() ) );
// also assign layer to match initial job
job2.layer = job.layer;
job2.renderAboveLabels = job.renderAboveLabels;
job2.layerId = job.layerId;

// associate first pass job with second pass job
Expand Down Expand Up @@ -1078,7 +1082,7 @@ QImage QgsMapRendererJob::composeImage( const QgsMapSettings &settings,
#endif
for ( const LayerRenderJob &job : jobs )
{
if ( job.layer && job.layer->customProperty( QStringLiteral( "rendering/renderAboveLabels" ) ).toBool() )
if ( job.renderAboveLabels )
continue; // skip layer for now, it will be rendered after labels

QImage img = layerImageToBeComposed( settings, job, cache );
Expand Down Expand Up @@ -1119,7 +1123,7 @@ QImage QgsMapRendererJob::composeImage( const QgsMapSettings &settings,
// render any layers with the renderAboveLabels flag now
for ( const LayerRenderJob &job : jobs )
{
if ( !job.layer || !job.layer->customProperty( QStringLiteral( "rendering/renderAboveLabels" ) ).toBool() )
if ( !job.renderAboveLabels )
continue;

QImage img = layerImageToBeComposed( settings, job, cache );
Expand Down
3 changes: 3 additions & 0 deletions src/core/maprenderer/qgsmaprendererjob.h
Expand Up @@ -99,6 +99,9 @@ class LayerRenderJob
//! If TRUE, img already contains cached image from previous rendering
bool cached = false;

//! Whether layer should be rendered above labels
bool renderAboveLabels = false;

QgsWeakMapLayerPointer layer;

/**
Expand Down

0 comments on commit a86559e

Please sign in to comment.