QGIS API Documentation 3.99.0-Master (26c88405ac0)
Loading...
Searching...
No Matches
qgsmaprenderersequentialjob.cpp
Go to the documentation of this file.
1/***************************************************************************
2 qgsmaprenderersequentialjob.cpp
3 --------------------------------------
4 Date : December 2013
5 Copyright : (C) 2013 by Martin Dobias
6 Email : wonder dot sk at gmail dot com
7 ***************************************************************************
8 * *
9 * This program is free software; you can redistribute it and/or modify *
10 * it under the terms of the GNU General Public License as published by *
11 * the Free Software Foundation; either version 2 of the License, or *
12 * (at your option) any later version. *
13 * *
14 ***************************************************************************/
15
17
18#include "qgslabelingresults.h"
19#include "qgslogger.h"
21#include "qgspallabeling.h"
23
24#include "moc_qgsmaprenderersequentialjob.cpp"
25
27 : QgsMapRendererQImageJob( settings )
28
29{
30 QgsDebugMsgLevel( QStringLiteral( "SEQUENTIAL construct" ), 5 );
31
32 mImage = QImage( mSettings.deviceOutputSize(), mSettings.outputImageFormat() );
33 mImage.setDevicePixelRatio( mSettings.devicePixelRatio() );
34 mImage.setDotsPerMeterX( 1000 * settings.outputDpi() / 25.4 );
35 mImage.setDotsPerMeterY( 1000 * settings.outputDpi() / 25.4 );
36 mImage.fill( Qt::transparent );
37}
38
40{
41 QgsDebugMsgLevel( QStringLiteral( "SEQUENTIAL destruct" ), 5 );
42 if ( isActive() )
43 {
44 // still running!
45 QgsDebugMsgLevel( QStringLiteral( "SEQUENTIAL destruct -- still running! (canceling)" ), 5 );
46 cancel();
47 }
48
49 Q_ASSERT( !mInternalJob && !mPainter );
50}
51
52
53void QgsMapRendererSequentialJob::startPrivate()
54{
55 if ( isActive() )
56 return; // do nothing if we are already running
57
58 mLabelingResults.reset();
59
60 mRenderingStart.start();
61
62 mErrors.clear();
63
64 QgsDebugMsgLevel( QStringLiteral( "SEQUENTIAL START" ), 5 );
65
66 Q_ASSERT( !mInternalJob && !mPainter );
67
68 mPainter = new QPainter( &mImage );
69
70 mInternalJob = new QgsMapRendererCustomPainterJob( mSettings, mPainter );
71 mInternalJob->setLabelSink( labelSink() );
72 mInternalJob->setCache( mCache );
73
77
78 mInternalJob->start();
79}
80
81
83{
84 if ( !isActive() )
85 return;
86
87 QgsDebugMsgLevel( QStringLiteral( "sequential - cancel internal" ), 5 );
88 // cppcheck-suppress nullPointerRedundantCheck
89 mInternalJob->cancel();
90
91 Q_ASSERT( !mInternalJob && !mPainter );
92}
93
95{
96 if ( !isActive() )
97 return;
98
99 QgsDebugMsgLevel( QStringLiteral( "sequential - cancel internal" ), 5 );
100 mInternalJob->cancelWithoutBlocking();
101}
102
104{
105 if ( !isActive() )
106 return;
107
108 mInternalJob->waitForFinished();
109}
110
112{
113 return nullptr != mInternalJob;
114}
115
117{
118 return mUsedCachedLabels;
119}
120
122{
123 return mLabelingResults.release();
124}
125
126
128{
129 if ( isActive() && mCache )
130 // this will allow immediate display of cached layers and at the same time updates of the layer being rendered
131 return composeImage( mSettings, mInternalJob->jobs(), LabelRenderJob() );
132 else
133 return mImage;
134}
135
136
138{
139 QgsDebugMsgLevel( QStringLiteral( "SEQUENTIAL finished" ), 5 );
140
141 mPainter->end();
142 delete mPainter;
143 mPainter = nullptr;
144
145 mLabelingResults.reset( mInternalJob->takeLabelingResults() );
146 mUsedCachedLabels = mInternalJob->usedCachedLabels();
147 mLayersRedrawnFromCache = mInternalJob->layersRedrawnFromCache();
148
149 mRenderedItemResults.reset( mInternalJob->takeRenderedItemResults() );
150
151 mErrors = mInternalJob->errors();
152
153 // now we are in a slot called from mInternalJob - do not delete it immediately
154 // so the class is still valid when the execution returns to the class
155 mInternalJob->deleteLater();
156 mInternalJob = nullptr;
157
159
160 emit finished();
161}
Stores computed placement from labeling engine.
Job implementation that renders everything sequentially using a custom painter.
static QImage composeImage(const QgsMapSettings &settings, const std::vector< LayerRenderJob > &jobs, const LabelRenderJob &labelJob, const QgsMapRendererCache *cache=nullptr)
void setCache(QgsMapRendererCache *cache)
Assign a cache to be used for reading and storing rendered images of individual layers.
void setLabelSink(QgsLabelSink *sink)
Assigns the label sink which will take over responsibility for handling labels during the rendering j...
std::unique_ptr< QgsRenderedItemResults > mRenderedItemResults
void layerRendered(const QString &layerId)
Emitted when a layer has completed rendering.
QElapsedTimer mRenderingStart
QgsMapRendererCache * mCache
void finished()
emitted when asynchronous rendering is finished (or canceled).
QgsMapSettings mSettings
void start()
Start the rendering job and immediately return.
void layerRenderingStarted(const QString &layerId)
Emitted just before rendering starts for a particular layer.
QStringList mLayersRedrawnFromCache
QgsLabelSink * labelSink() const
Returns the label sink associated to this rendering job.
QgsMapRendererQImageJob(const QgsMapSettings &settings)
bool usedCachedLabels() const override
Returns true if the render job was able to use a cached labeling solution.
void cancelWithoutBlocking() override
Triggers cancellation of the rendering job without blocking.
QImage renderedImage() override
Gets a preview/resulting image.
void waitForFinished() override
Block until the job has finished.
void cancel() override
Stop the rendering job - does not return until the job has terminated.
QgsLabelingResults * takeLabelingResults() override
Gets pointer to internal labeling engine (in order to get access to the results).
QgsMapRendererSequentialJob(const QgsMapSettings &settings)
bool isActive() const override
Tell whether the rendering job is currently running in background.
Contains configuration for rendering maps.
double outputDpi() const
Returns the DPI (dots per inch) used for conversion between real world units (e.g.
#define QgsDebugMsgLevel(str, level)
Definition qgslogger.h:61