Branch data Line data Source code
1 : : /*************************************************************************** 2 : : qgsmaprenderertask.h 3 : : ------------------------- 4 : : begin : Apr 2017 5 : : copyright : (C) 2017 by Mathieu Pellerin 6 : : email : nirvn dot asia at gmail 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 : : #ifndef QGSMAPRENDERERTASK_H 19 : : #define QGSMAPRENDERERTASK_H 20 : : 21 : : #include "qgis_sip.h" 22 : : #include "qgis_core.h" 23 : : #include "qgsannotation.h" 24 : : #include "qgsannotationmanager.h" 25 : : #include "qgsmapsettings.h" 26 : : #include "qgsmapdecoration.h" 27 : : #include "qgstaskmanager.h" 28 : : #include "qgsmaprenderercustompainterjob.h" 29 : : #include "qgsabstractgeopdfexporter.h" 30 : : 31 : : #include <QPainter> 32 : : #ifndef QT_NO_PRINTER 33 : : #include <QPrinter> 34 : : #endif 35 : : 36 : : class QgsMapRendererCustomPainterJob; 37 : : class QgsAbstractGeoPdfExporter; 38 : : 39 : : /** 40 : : * \class QgsMapRendererTask 41 : : * \ingroup core 42 : : * \brief QgsTask task which draws a map to an image file or a painter as a background 43 : : * task. This can be used to draw maps without blocking the QGIS interface. 44 : : * \since QGIS 3.0 45 : : */ 46 : : class CORE_EXPORT QgsMapRendererTask : public QgsTask 47 : : { 48 : 0 : Q_OBJECT 49 : : 50 : : public: 51 : : 52 : : //! \brief Error type 53 : : enum ErrorType 54 : : { 55 : : ImageAllocationFail = 1, //!< Image allocation failure 56 : : ImageSaveFail, //!< Image save failure 57 : : ImageUnsupportedFormat //!< Format is unsupported on the platform \since QGIS 3.4 58 : : }; 59 : : 60 : : /** 61 : : * Constructor for QgsMapRendererTask to render a map to an image file. 62 : : * 63 : : * If the output \a fileFormat is set to PDF, the \a geoPdf argument controls whether a GeoPDF file is created. 64 : : * See QgsAbstractGeoPdfExporter::geoPDFCreationAvailable() for conditions on GeoPDF creation availability. 65 : : */ 66 : : #ifndef SIP_RUN 67 : : QgsMapRendererTask( const QgsMapSettings &ms, 68 : : const QString &fileName, 69 : : const QString &fileFormat = QString( "PNG" ), 70 : : bool forceRaster = false, 71 : : bool geoPdf = false, const QgsAbstractGeoPdfExporter::ExportDetails &geoPdfExportDetails = QgsAbstractGeoPdfExporter::ExportDetails() ); 72 : : #else 73 : : QgsMapRendererTask( const QgsMapSettings &ms, 74 : : const QString &fileName, 75 : : const QString &fileFormat = QString( "PNG" ), 76 : : bool forceRaster = false ); 77 : : #endif 78 : : 79 : : /** 80 : : * Constructor for QgsMapRendererTask to render a map to a QPainter object. 81 : : */ 82 : : QgsMapRendererTask( const QgsMapSettings &ms, 83 : : QPainter *p ); 84 : : 85 : : ~QgsMapRendererTask() override; 86 : : 87 : : /** 88 : : * Adds \a annotations to be rendered on the map. 89 : : */ 90 : : void addAnnotations( const QList<QgsAnnotation *> &annotations ); 91 : : 92 : : /** 93 : : * Adds \a decorations to be rendered on the map. 94 : : */ 95 : : void addDecorations( const QList<QgsMapDecoration *> &decorations ); 96 : : 97 : : /** 98 : : * Sets whether the image file will be georeferenced (embedded or via a world file). 99 : : */ 100 : : void setSaveWorldFile( bool save ) { mSaveWorldFile = save; } 101 : : 102 : : /** 103 : : * Sets whether metadata such as title and subject will be exported whenever possible. 104 : : */ 105 : : void setExportMetadata( bool exportMetadata ) { mExportMetadata = exportMetadata; } 106 : : 107 : : void cancel() override; 108 : : 109 : : signals: 110 : : 111 : : /** 112 : : * Emitted when the map rendering is successfully completed. 113 : : */ 114 : : void renderingComplete(); 115 : : 116 : : /** 117 : : * Emitted when map rendering failed. 118 : : */ 119 : : void errorOccurred( int error ); 120 : : 121 : : protected: 122 : : 123 : : bool run() override; 124 : : void finished( bool result ) override; 125 : : 126 : : private: 127 : : 128 : : //! Prepares the job, doing the work which HAS to be done on the main thread in advance 129 : : void prepare(); 130 : : bool mErrored = false; 131 : : 132 : : QgsMapSettings mMapSettings; 133 : : 134 : : QMutex mJobMutex; 135 : : std::unique_ptr< QgsMapRendererJob > mJob; 136 : : 137 : : std::unique_ptr< QgsAbstractGeoPdfExporter > mGeoPdfExporter; 138 : : std::unique_ptr< QgsRenderedFeatureHandlerInterface > mRenderedFeatureHandler; 139 : : 140 : : QPainter *mPainter = nullptr; 141 : : QPainter *mDestPainter = nullptr; 142 : : QImage mImage; 143 : : #ifndef QT_NO_PRINTER 144 : : std::unique_ptr< QPrinter > mPrinter; 145 : : #endif // ! QT_NO_PRINTER 146 : : 147 : : std::unique_ptr< QPainter > mTempPainter; 148 : : 149 : : QString mFileName; 150 : : QString mFileFormat; 151 : : bool mForceRaster = false; 152 : : bool mSaveWorldFile = false; 153 : : bool mExportMetadata = false; 154 : : bool mGeoPDF = false; 155 : : QgsAbstractGeoPdfExporter::ExportDetails mGeoPdfExportDetails; 156 : : 157 : : QList< QgsAnnotation * > mAnnotations; 158 : : QList< QgsMapDecoration * > mDecorations; 159 : : QMap< QString, QString> mLayerIdToLayerNameMap; 160 : : QStringList mMapLayerOrder; 161 : : 162 : : int mError = 0; 163 : : 164 : : 165 : : }; 166 : : 167 : : // clazy:excludeall=qstring-allocations 168 : : 169 : : #endif