QGIS API Documentation  3.25.0-Master (6b426f5f8a)
qgsmaprendererjobproxy.cpp
Go to the documentation of this file.
1 /***************************************************************************
2  qgsmaprendererjobproxy.cpp
3  --------------------------
4  begin : January 2017
5  copyright : (C) 2017 by Paul Blottiere
6  email : paul dot blottiere at oslandia dot com
7 ***************************************************************************/
8 
9 /***************************************************************************
10  * *
11  * This program is free software; you can redistribute it and/or modify *
12  * it under the terms of the GNU General Public License as published by *
13  * the Free Software Foundation; either version 2 of the License, or *
14  * (at your option) any later version. *
15  * *
16  ***************************************************************************/
17 
18 #include "qgsmaprendererjobproxy.h"
19 
20 #include "qgsmessagelog.h"
23 #include "qgsapplication.h"
24 
25 namespace QgsWms
26 {
27 
29  bool parallelRendering
30  , int maxThreads
31  , QgsFeatureFilterProvider *featureFilterProvider
32  )
33  :
34  mParallelRendering( parallelRendering )
35  , mFeatureFilterProvider( featureFilterProvider )
36  {
37 #ifndef HAVE_SERVER_PYTHON_PLUGINS
38  Q_UNUSED( mFeatureFilterProvider )
39 #endif
40  if ( mParallelRendering )
41  {
42  QgsApplication::setMaxThreads( maxThreads );
43  QgsMessageLog::logMessage( QStringLiteral( "Parallel rendering activated with %1 threads" ).arg( maxThreads ), QStringLiteral( "server" ), Qgis::MessageLevel::Info );
44  }
45  else
46  {
47  QgsMessageLog::logMessage( QStringLiteral( "Parallel rendering deactivated" ), QStringLiteral( "server" ), Qgis::MessageLevel::Info );
48  }
49  }
50 
51  void QgsMapRendererJobProxy::render( const QgsMapSettings &mapSettings, QImage *image )
52  {
53  if ( mParallelRendering )
54  {
55  QgsMapRendererParallelJob renderJob( mapSettings );
56 #ifdef HAVE_SERVER_PYTHON_PLUGINS
57  renderJob.setFeatureFilterProvider( mFeatureFilterProvider );
58 #endif
59 
60  // Allows the main thread to manage blocking call coming from rendering
61  // threads (see discussion in https://github.com/qgis/QGIS/issues/26819).
62  QEventLoop loop;
63  QObject::connect( &renderJob, &QgsMapRendererParallelJob::finished, &loop, &QEventLoop::quit );
64  renderJob.start();
65  if ( renderJob.isActive() )
66  {
67  loop.exec();
68 
69  renderJob.waitForFinished();
70  *image = renderJob.renderedImage();
71  mPainter.reset( new QPainter( image ) );
72  }
73 
74  mErrors = renderJob.errors();
75  }
76  else
77  {
78  mPainter.reset( new QPainter( image ) );
79  QgsMapRendererCustomPainterJob renderJob( mapSettings, mPainter.get() );
80 #ifdef HAVE_SERVER_PYTHON_PLUGINS
81  renderJob.setFeatureFilterProvider( mFeatureFilterProvider );
82 #endif
83  renderJob.renderSynchronously();
84  mErrors = renderJob.errors();
85  }
86  }
87 
89  {
90  return mPainter.release();
91  }
92 } // namespace qgsws
static void setMaxThreads(int maxThreads)
Set maximum concurrent thread count.
Abstract interface for use by classes that filter the features or attributes of a layer.
Job implementation that renders everything sequentially using a custom painter.
void renderSynchronously()
Render the map synchronously in this thread.
Errors errors() const
List of errors that happened during the rendering job - available when the rendering has been finishe...
void finished()
emitted when asynchronous rendering is finished (or canceled).
void start()
Start the rendering job and immediately return.
void setFeatureFilterProvider(const QgsFeatureFilterProvider *f)
Set the feature filter provider used by the QgsRenderContext of each LayerRenderJob.
Job implementation that renders all layers in parallel.
bool isActive() const override
Tell whether the rendering job is currently running in background.
QImage renderedImage() override
Gets a preview/resulting image.
void waitForFinished() override
Block until the job has finished.
The QgsMapSettings class contains configuration for rendering of the map.
static void logMessage(const QString &message, const QString &tag=QString(), Qgis::MessageLevel level=Qgis::MessageLevel::Warning, bool notifyUser=true)
Adds a message to the log instance (and creates it if necessary).
QPainter * takePainter()
Takes ownership of the painter used for rendering.
void render(const QgsMapSettings &mapSettings, QImage *image)
Sequential or parallel map rendering.
QgsMapRendererJobProxy(bool parallelRendering, int maxThreads, QgsFeatureFilterProvider *featureFilterProvider)
Constructor for QgsMapRendererJobProxy.
Median cut implementation.