30#include "moc_qgsmaprendererstagedrenderjob.cpp"
32using namespace Qt::StringLiterals;
48void QgsMapRendererStagedRenderJob::startPrivate()
54 QElapsedTimer prepareTime;
57 mLabelingEngineV2.reset();
62 mLabelingEngineV2 = std::make_unique<QgsStagedRenderLabelingEngine>( );
64 mLabelingEngineV2 = std::make_unique<QgsDefaultLabelingEngine>( );
65 mLabelingEngineV2->setMapSettings(
mSettings );
68 mLayerJobs =
prepareJobs(
nullptr, mLabelingEngineV2.get(),
true );
71 mJobIt = mLayerJobs.begin();
98 if ( mLabelingEngineV2 )
99 return mLabelingEngineV2->takeResults();
111 if ( mJobIt != mLayerJobs.end() )
113 LayerRenderJob &job = *mJobIt;
115 job.renderer->renderContext()->setPainter( painter );
121 painter->setCompositionMode( job.blendMode );
124 if ( job.previewRenderImage && !job.previewRenderImageInitialized )
126 job.previewRenderImage->fill( 0 );
127 job.previewRenderImageInitialized =
true;
133 job.imageInitialized =
true;
136 job.completed = job.renderer->render();
141 painter->setOpacity( job.opacity );
142 painter->drawImage( 0, 0, *job.img );
143 painter->setOpacity( 1.0 );
145 job.context()->setPainter(
nullptr );
151 if ( !mLabelingEngineV2 )
156 if ( !mPreparedStagedLabelJob || mLabelLayerIt == mLabelingLayers.end() )
159 mLabelJob.context.setPainter( painter );
162 painter->setCompositionMode( QPainter::CompositionMode_SourceOver );
167 mLabelJob.context.setPainter(
nullptr );
171 mLabelJob.context.setPainter( painter );
172 drawLabeling( mLabelJob.context, mLabelingEngineV2.get(), painter );
173 mLabelJob.complete =
true;
175 mLabelJob.context.setPainter(
nullptr );
186 if ( mJobIt != mLayerJobs.end() )
189 if ( mJobIt != mLayerJobs.end() )
193 if ( mLabelingEngineV2 )
197 if ( !mPreparedStagedLabelJob )
199 mLabelingEngineV2->run( mLabelJob.context );
200 mPreparedStagedLabelJob =
true;
201 mLabelingLayers = mLabelingEngineV2->participatingLayerIds();
202 mLabelLayerIt = mLabelingLayers.begin();
203 if ( mLabelLayerIt == mLabelingLayers.end() )
213 if ( mLabelLayerIt != mLabelingLayers.end() )
216 if ( mLabelLayerIt != mLabelingLayers.end() )
226 mExportedLabels =
true;
228 else if ( !mExportedLabels )
245 if ( mJobIt != mLayerJobs.end() )
247 const LayerRenderJob &job = *mJobIt;
252 if ( mLabelLayerIt != mLabelingLayers.end() )
253 return *mLabelLayerIt;
260 if ( mJobIt != mLayerJobs.end() )
262 const LayerRenderJob &job = *mJobIt;
270 if ( mJobIt != mLayerJobs.end() )
272 const LayerRenderJob &job = *mJobIt;
273 return job.blendMode;
275 return QPainter::CompositionMode_SourceOver;
280 if ( mJobIt != mLayerJobs.end() )
284 if ( !mPreparedStagedLabelJob )
286 if ( mLabelLayerIt != mLabelingLayers.end() )
289 else if ( mNextIsLabel && !mExportedLabels )
@ ForceVector
Always force vector-based rendering, even when the result will be visually different to a raster-base...
@ DrawLabeling
Enable drawing of labels on top of the map.
Stores computed placement from labeling engine.
void preparePainter(QPainter *painter, const QColor &backgroundColor=Qt::transparent)
Prepares the given painter ready for a map render.
QgsMapRendererAbstractCustomPainterJob(const QgsMapSettings &settings)
Constructor for QgsMapRendererAbstractCustomPainterJob, using the given map settings.
QList< QPointer< QgsMapLayer > > participatingLabelLayers(QgsLabelingEngine *engine)
Returns a list of the layers participating in the map labeling.
static Q_DECL_DEPRECATED void drawLabeling(const QgsMapSettings &settings, QgsRenderContext &renderContext, QgsLabelingEngine *labelingEngine2, QPainter *painter)
void layerRendered(const QString &layerId)
Emitted when a layer has completed rendering.
std::vector< LayerRenderJob > prepareJobs(QPainter *painter, QgsLabelingEngine *labelingEngine2, bool deferredPainterSet=false)
Creates a list of layer rendering jobs and prepares them for later render.
void cleanupJobs(std::vector< LayerRenderJob > &jobs)
QElapsedTimer mRenderingStart
void layerRenderingStarted(const QString &layerId)
Emitted just before rendering starts for a particular layer.
LabelRenderJob prepareLabelingJob(QPainter *painter, QgsLabelingEngine *labelingEngine2, bool canUseLabelCache=true)
Prepares a labeling job.
void cleanupLabelJob(LabelRenderJob &job)
Handles clean up tasks for a label job, including deletion of images and storing cached label results...
double currentLayerOpacity() const
Returns the opacity for the current layer about to be rendered in the next render operation.
void cancel() override
Stop the rendering job - does not return until the job has terminated.
~QgsMapRendererStagedRenderJob() override
@ RenderLabelsByMapLayer
Labels should be rendered in individual stages by map layer. This allows separation of labels belongi...
bool usedCachedLabels() const override
Returns true if the render job was able to use a cached labeling solution.
RenderStage currentStage() const
Returns the current stage which will be rendered in the next render operation.
void waitForFinished() override
Block until the job has finished.
QPainter::CompositionMode currentLayerCompositionMode() const
Returns the composition mode for the current layer about to be rendered in the next render operation.
QString currentLayerId() const
Returns the ID of the current layer about to be rendered in the next render operation.
QgsLabelingResults * takeLabelingResults() override
Gets pointer to internal labeling engine (in order to get access to the results).
bool isActive() const override
Tell whether the rendering job is currently running in background.
QgsMapRendererStagedRenderJob(const QgsMapSettings &settings, Flags flags=Flags())
Constructor for QgsMapRendererStagedRenderJob, using the given map settings.
bool isFinished() const
Returns true if the job is finished, and nothing remains to render.
RenderStage
Represents the stages of a rendering job.
@ Finished
Rendering is finished.
@ Symbology
Rendering layer symbology.
@ Labels
Rendering labels.
bool nextPart()
Iterates to the next part to render.
bool renderCurrentPart(QPainter *painter)
Renders the current part of the map to the specified painter.
void cancelWithoutBlocking() override
Triggers cancellation of the rendering job without blocking.
Contains configuration for rendering maps.
bool testFlag(Qgis::MapSettingsFlag flag) const
Check whether a particular flag is enabled.
A QgsLabelingEngine implementation, which only calculates the labeling solution during its run() meth...
void finalize()
Finalizes and cleans up the engine following the rendering of labels for the last layer to be labeled...
void renderLabelsForLayer(QgsRenderContext &context, const QString &layerId)
Renders all the labels which belong only to the layer with matching layerId to the specified render c...
#define QgsDebugMsgLevel(str, level)