Skip to content

Commit

Permalink
Fix thread unsafe method used in labeling rendering
Browse files Browse the repository at this point in the history
  • Loading branch information
nyalldawson committed Dec 14, 2022
1 parent 6fe856c commit dcfb73e
Show file tree
Hide file tree
Showing 2 changed files with 11 additions and 7 deletions.
14 changes: 7 additions & 7 deletions src/core/labeling/qgslabelingengine.cpp
Expand Up @@ -46,8 +46,8 @@ class QgsLabelSorter
{
public:

explicit QgsLabelSorter( const QgsMapSettings &mapSettings )
: mMapSettings( mapSettings )
explicit QgsLabelSorter( const QStringList &layerRenderingOrderIds )
: mLayerRenderingOrderIds( layerRenderingOrderIds )
{}

bool operator()( pal::LabelPosition *lp1, pal::LabelPosition *lp2 ) const
Expand All @@ -59,9 +59,8 @@ class QgsLabelSorter
return lf1->zIndex() < lf2->zIndex();

//equal z-index, so fallback to respecting layer render order
QStringList layerIds = mMapSettings.layerIds();
int layer1Pos = layerIds.indexOf( lf1->provider()->layerId() );
int layer2Pos = layerIds.indexOf( lf2->provider()->layerId() );
int layer1Pos = mLayerRenderingOrderIds.indexOf( lf1->provider()->layerId() );
int layer2Pos = mLayerRenderingOrderIds.indexOf( lf2->provider()->layerId() );
if ( layer1Pos != layer2Pos && layer1Pos >= 0 && layer2Pos >= 0 )
return layer1Pos > layer2Pos; //higher positions are rendered first

Expand All @@ -71,7 +70,7 @@ class QgsLabelSorter

private:

const QgsMapSettings &mMapSettings;
const QStringList mLayerRenderingOrderIds;
};

//
Expand All @@ -91,6 +90,7 @@ QgsLabelingEngine::~QgsLabelingEngine()
void QgsLabelingEngine::setMapSettings( const QgsMapSettings &mapSettings )
{
mMapSettings = mapSettings;
mLayerRenderingOrderIds = mMapSettings.layerIds();
if ( mResults )
mResults->setMapSettings( mapSettings );
}
Expand Down Expand Up @@ -400,7 +400,7 @@ void QgsLabelingEngine::solve( QgsRenderContext &context )
settings.testFlag( QgsLabelingEngineSettings::DrawUnplacedLabels ) || settings.testFlag( QgsLabelingEngineSettings::CollectUnplacedLabels ) ? &mUnlabeled : nullptr );

// sort labels
std::sort( mLabels.begin(), mLabels.end(), QgsLabelSorter( mMapSettings ) );
std::sort( mLabels.begin(), mLabels.end(), QgsLabelSorter( mLayerRenderingOrderIds ) );

QgsDebugMsgLevel( QStringLiteral( "LABELING work: %1 ms ... labels# %2" ).arg( t.elapsed() ).arg( mLabels.size() ), 4 );
}
Expand Down
4 changes: 4 additions & 0 deletions src/core/labeling/qgslabelingengine.h
Expand Up @@ -346,6 +346,10 @@ class CORE_EXPORT QgsLabelingEngine
QList<pal::LabelPosition *> mUnlabeled;
QList<pal::LabelPosition *> mLabels;

private:

QStringList mLayerRenderingOrderIds;

};

/**
Expand Down

0 comments on commit dcfb73e

Please sign in to comment.