QGIS API Documentation  3.18.1-Zürich (202f1bf7e5)
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::Info );
44  }
45  else
46  {
47  QgsMessageLog::logMessage( QStringLiteral( "Parallel rendering deactivated" ), QStringLiteral( "server" ), Qgis::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  renderJob.start();
60 
61  // Allows the main thread to manage blocking call coming from rendering
62  // threads (see discussion in https://github.com/qgis/QGIS/issues/26819).
63  QEventLoop loop;
64  QObject::connect( &renderJob, &QgsMapRendererParallelJob::finished, &loop, &QEventLoop::quit );
65  loop.exec();
66 
67  renderJob.waitForFinished();
68  *image = renderJob.renderedImage();
69  mPainter.reset( new QPainter( image ) );
70 
71  mErrors = renderJob.errors();
72  }
73  else
74  {
75  mPainter.reset( new QPainter( image ) );
76  QgsMapRendererCustomPainterJob renderJob( mapSettings, mPainter.get() );
77 #ifdef HAVE_SERVER_PYTHON_PLUGINS
78  renderJob.setFeatureFilterProvider( mFeatureFilterProvider );
79 #endif
80  renderJob.renderSynchronously();
81  mErrors = renderJob.errors();
82  }
83  }
84 
86  {
87  return mPainter.release();
88  }
89 } // namespace qgsws
@ Info
Definition: qgis.h:90
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 setFeatureFilterProvider(const QgsFeatureFilterProvider *f)
Set the feature filter provider used by the QgsRenderContext of each LayerRenderJob.
Job implementation that renders all layers in parallel.
void start() override
Start the rendering job and immediately return.
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::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.