QGIS API Documentation 3.28.14-Firenze (exported)
Loading...
Searching...
No Matches
qgsmaprendererjob.h
Go to the documentation of this file.
1/***************************************************************************
2 qgsmaprendererjob.h
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
16#ifndef QGSMAPRENDERERJOB_H
17#define QGSMAPRENDERERJOB_H
18
19#include "qgis_core.h"
20#include "qgis_sip.h"
21#include <QFutureWatcher>
22#include <QImage>
23#include <QPainter>
24#include <QObject>
25#include <QTime>
26#include <QElapsedTimer>
27#include <QPicture>
28
29#include "qgsrendercontext.h"
30#include "qgslabelsink.h"
31#include "qgsmapsettings.h"
32#include "qgsmaskidprovider.h"
34
35class QPicture;
36
43
44#ifndef SIP_RUN
46
51class LayerRenderJob
52{
53 public:
54
55 LayerRenderJob() = default;
56
58 LayerRenderJob( const LayerRenderJob & ) = delete;
59
61 LayerRenderJob &operator=( const LayerRenderJob & ) = delete;
62
63 LayerRenderJob( LayerRenderJob && );
64 LayerRenderJob &operator=( LayerRenderJob && );
65
72 void setContext( std::unique_ptr< QgsRenderContext > context ) { mContext = std::move( context ); }
73
79 QgsRenderContext *context() { return mContext.get(); }
80
86 QImage *img = nullptr;
87
89 bool imageInitialized = false;
90
91 bool imageCanBeComposed() const;
92
93 QgsMapLayerRenderer *renderer = nullptr; // must be deleted
94
95 QPainter::CompositionMode blendMode = QPainter::CompositionMode_SourceOver;
96
97 double opacity = 1.0;
98
100 bool cached = false;
101
103 bool renderAboveLabels = false;
104
106
113 bool completed = false;
114
116 int renderingTime = -1;
117
127 int estimatedRenderingTime = 0;
128
129 QStringList errors;
130
139 QString layerId;
140
157 std::unique_ptr<QPainter> maskPainter;
158
159
161 std::unique_ptr<QPaintDevice> maskPaintDevice;
162
167 bool maskRequiresLayerRasterization = false;
168
173 LayerRenderJob *firstPassJob = nullptr;
174
178 std::unique_ptr<QPicture> picture;
179
186 QList<QPair<LayerRenderJob *, int>> maskJobs;
187
188 private:
189 std::unique_ptr< QgsRenderContext > mContext;
190
191};
192
197struct LabelRenderJob
198{
199 QgsRenderContext context;
200
205 QImage *img = nullptr;
206
208 std::unique_ptr<QPicture> picture;
209
211 std::vector< std::unique_ptr<QPainter> > maskPainters;
212
223 std::vector< std::unique_ptr<QPaintDevice> > maskPaintDevices;
224
229 QgsMaskIdProvider maskIdProvider;
230
232 bool cached = false;
234 bool canUseCache = false;
236 bool complete = false;
238 int renderingTime = -1;
240 QList< QPointer< QgsMapLayer > > participatingLayers;
241};
242
244#endif
245
273class CORE_EXPORT QgsMapRendererJob : public QObject SIP_ABSTRACT
274{
275 Q_OBJECT
276 public:
277
279
281
286 void start();
287
292 virtual void cancel() = 0;
293
299 virtual void cancelWithoutBlocking() = 0;
300
302 virtual void waitForFinished() = 0;
303
305 virtual bool isActive() const = 0;
306
314 virtual bool usedCachedLabels() const = 0;
315
324 QStringList layersRedrawnFromCache() const;
325
332
341
349 void setFeatureFilterProvider( const QgsFeatureFilterProvider *f ) { mFeatureFilterProvider = f; }
350
356 const QgsFeatureFilterProvider *featureFilterProvider() const { return mFeatureFilterProvider; }
357
358 struct Error
359 {
360 Error( const QString &lid, const QString &msg )
361 : layerID( lid )
362 , message( msg )
363 {}
364
365 QString layerID;
366 QString message;
367 };
368
369 typedef QList<QgsMapRendererJob::Error> Errors;
370
372 Errors errors() const;
373
374
380
386 QgsLabelSink *labelSink() const { return mLabelSink; } SIP_SKIP
387
395 void setLabelSink( QgsLabelSink *sink ) { mLabelSink = sink; } SIP_SKIP
396
406
411 int renderingTime() const { return mRenderingTime; }
412
418 QHash< QgsMapLayer *, int > perLayerRenderingTime() const SIP_SKIP;
419
432 void setLayerRenderingTimeHints( const QHash< QString, int > &hints ) SIP_SKIP;
433
439 const QgsMapSettings &mapSettings() const;
440
445 static const QString LABEL_CACHE_ID SIP_SKIP;
446
452 static const QString LABEL_PREVIEW_CACHE_ID SIP_SKIP;
453
454#ifndef SIP_RUN
456 static const inline QgsSettingsEntryBool settingsLogCanvasRefreshEvent = QgsSettingsEntryBool( QStringLiteral( "logCanvasRefreshEvent" ), QgsSettings::Prefix::MAP, false );
457#endif
458
459 signals:
460
469
470
478 void layerRenderingStarted( const QString &layerId );
479
487 void layerRendered( const QString &layerId );
488
490 void finished();
491
492 protected:
493
495 QElapsedTimer mRenderingStart;
497
498 QgsMapRendererCache *mCache = nullptr;
499
500 int mRenderingTime = 0;
501
503 QHash< QgsWeakMapLayerPointer, int > mPerLayerRenderingTime;
504
510 QHash< QString, int > mLayerRenderingTimeHints;
511
515 bool mRecordRenderingTime = true;
516
517#ifndef SIP_RUN
518 std::unique_ptr< QgsRenderedItemResults > mRenderedItemResults;
519#endif
520
522
529
541 std::vector< LayerRenderJob > prepareJobs( QPainter *painter, QgsLabelingEngine *labelingEngine2, bool deferredPainterSet = false ) SIP_SKIP;
542
548 LabelRenderJob prepareLabelingJob( QPainter *painter, QgsLabelingEngine *labelingEngine2, bool canUseLabelCache = true ) SIP_SKIP;
549
558 std::vector< LayerRenderJob > prepareSecondPassJobs( std::vector< LayerRenderJob > &firstPassJobs, LabelRenderJob &labelJob ) SIP_SKIP;
559
564 void initSecondPassJobs( std::vector< LayerRenderJob > &secondPassJobs, LabelRenderJob &labelJob ) const SIP_SKIP;
565
567 static QImage composeImage( const QgsMapSettings &settings,
568 const std::vector< LayerRenderJob > &jobs,
569 const LabelRenderJob &labelJob,
570 const QgsMapRendererCache *cache = nullptr ) SIP_SKIP;
571
573 static QImage layerImageToBeComposed( const QgsMapSettings &settings, const LayerRenderJob &job, const QgsMapRendererCache *cache ) SIP_SKIP;
574
581 static void composeSecondPass( std::vector< LayerRenderJob > &secondPassJobs, LabelRenderJob &labelJob, bool forceVector = false ) SIP_SKIP;
582
584 void logRenderingTime( const std::vector< LayerRenderJob > &jobs, const std::vector< LayerRenderJob > &secondPassJobs, const LabelRenderJob &labelJob ) SIP_SKIP;
585
587 void cleanupJobs( std::vector< LayerRenderJob > &jobs ) SIP_SKIP;
588
590 void cleanupSecondPassJobs( std::vector< LayerRenderJob > &jobs ) SIP_SKIP;
591
598 void cleanupLabelJob( LabelRenderJob &job ) SIP_SKIP;
599
604 Q_DECL_DEPRECATED static void drawLabeling( const QgsMapSettings &settings, QgsRenderContext &renderContext, QgsLabelingEngine *labelingEngine2, QPainter *painter ) SIP_SKIP;
605
607 static void drawLabeling( QgsRenderContext &renderContext, QgsLabelingEngine *labelingEngine2, QPainter *painter ) SIP_SKIP;
608
609 private:
610
622 static bool reprojectToLayerExtent( const QgsMapLayer *ml, const QgsCoordinateTransform &ct, QgsRectangle &extent, QgsRectangle &r2 );
623
624 const QgsFeatureFilterProvider *mFeatureFilterProvider = nullptr;
625
627 QImage *allocateImage( QString layerId );
628
630 QPainter *allocateImageAndPainter( QString layerId, QImage *&image, const QgsRenderContext *context );
631
637 virtual void startPrivate() = 0;
638
639 QgsLabelSink *mLabelSink = nullptr;
640 QgsLabelingEngineFeedback *mLabelingEngineFeedback = nullptr;
641
642 typedef std::pair<std::unique_ptr<QPicture>, QPainter * > PictureAndPainter;
643
645 PictureAndPainter allocatePictureAndPainter( const QgsRenderContext *context );
646};
647
648
658{
659 Q_OBJECT
660
661 public:
663
665 virtual QImage renderedImage() = 0;
666
667};
668
669
670#endif // QGSMAPRENDERERJOB_H
Class for doing transforms between two map coordinate systems.
Abstract interface for use by classes that filter the features or attributes of a layer.
Abstract base class that can be used to intercept rendered labels from a labeling / rendering job.
QgsFeedback subclass for granular reporting of labeling engine progress.
The QgsLabelingEngine class provides map labeling functionality.
Class that stores computed placement from labeling engine.
Base class for utility classes that encapsulate information necessary for rendering of map layers.
Base class for all map layer types.
Definition qgsmaplayer.h:73
This class is responsible for keeping cache of rendered images resulting from a map rendering job.
Abstract base class for map rendering implementations.
virtual void waitForFinished()=0
Block until the job has finished.
void setCache(QgsMapRendererCache *cache)
Assign a cache to be used for reading and storing rendered images of individual layers.
QHash< QgsMapLayer *, int > perLayerRenderingTime() const
Returns the render time (in ms) per layer.
virtual bool usedCachedLabels() const =0
Returns true if the render job was able to use a cached labeling solution.
void setLabelSink(QgsLabelSink *sink)
Assigns the label sink which will take over responsibility for handling labels during the rendering j...
QHash< QString, int > mLayerRenderingTimeHints
Approximate expected layer rendering time per layer, by layer ID.
std::unique_ptr< QgsRenderedItemResults > mRenderedItemResults
Errors errors() const
List of errors that happened during the rendering job - available when the rendering has been finishe...
void layerRendered(const QString &layerId)
Emitted when a layer has completed rendering.
void renderingLayersFinished()
Emitted when the layers are rendered.
QElapsedTimer mRenderingStart
void finished()
emitted when asynchronous rendering is finished (or canceled).
QgsMapSettings mSettings
const QgsFeatureFilterProvider * featureFilterProvider() const
Returns the feature filter provider used by the QgsRenderContext of each LayerRenderJob.
QgsMapRendererJob(const QgsMapSettings &settings)
~QgsMapRendererJob() override
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
QStringList layersRedrawnFromCache() const
Returns a list of the layer IDs for all layers which were redrawn from cached images.
QList< QgsMapRendererJob::Error > Errors
QHash< QgsWeakMapLayerPointer, int > mPerLayerRenderingTime
Render time (in ms) per layer, by layer ID.
QgsRenderedItemResults * takeRenderedItemResults()
Takes the rendered item results from the map render job and returns them.
virtual bool isActive() const =0
Tell whether the rendering job is currently running in background.
QgsLabelingEngineFeedback * labelingEngineFeedback()
Returns the associated labeling engine feedback object.
virtual QgsLabelingResults * takeLabelingResults()=0
Gets pointer to internal labeling engine (in order to get access to the results).
virtual void cancel()=0
Stop the rendering job - does not return until the job has terminated.
virtual void cancelWithoutBlocking()=0
Triggers cancellation of the rendering job without blocking.
QgsLabelSink * labelSink() const
Returns the label sink associated to this rendering job.
bool prepareLabelCache() const
Prepares the cache for storing the result of labeling.
Intermediate base class adding functionality that allows client to query the rendered image.
QgsMapRendererQImageJob(const QgsMapSettings &settings)
virtual QImage renderedImage()=0
Gets a preview/resulting image.
The QgsMapSettings class contains configuration for rendering of the map.
This class allows the creation of mask ids based on the different label layers and to give a mask id ...
A rectangle specified with double values.
Contains information about the context of a rendering operation.
Stores collated details of rendered items during a map rendering operation.
A boolean settings entry.
static const char * MAP
Definition qgssettings.h:98
#define SIP_SKIP
Definition qgis_sip.h:126
#define SIP_TRANSFER
Definition qgis_sip.h:36
#define SIP_ABSTRACT
Definition qgis_sip.h:208
QPointer< QgsMapLayer > QgsWeakMapLayerPointer
Weak pointer for QgsMapLayer.
Error(const QString &lid, const QString &msg)