Branch data Line data Source code
1 : : /*************************************************************************** 2 : : qgsrasterrenderer.h 3 : : ------------------- 4 : : begin : December 2011 5 : : copyright : (C) 2011 by Marco Hugentobler 6 : : email : marco at sourcepole dot ch 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 QGSRASTERRENDERER_H 19 : : #define QGSRASTERRENDERER_H 20 : : 21 : : #include "qgis_core.h" 22 : : #include "qgis_sip.h" 23 : : #include <QPair> 24 : : 25 : : #include "qgsrasterinterface.h" 26 : : #include "qgsrasterminmaxorigin.h" 27 : : 28 : : class QDomElement; 29 : : 30 : : class QPainter; 31 : : class QgsRasterTransparency; 32 : : class QgsStyleEntityVisitorInterface; 33 : : class QgsLayerTreeModelLegendNode; 34 : : class QgsLayerTreeLayer; 35 : : 36 : : /** 37 : : * \ingroup core 38 : : * \brief Raster renderer pipe that applies colors to a raster. 39 : : */ 40 : : class CORE_EXPORT QgsRasterRenderer : public QgsRasterInterface 41 : : { 42 : : 43 : 0 : Q_DECLARE_TR_FUNCTIONS( QgsRasterRenderer ) 44 : : 45 : : public: 46 : : 47 : : static const QRgb NODATA_COLOR; 48 : : 49 : : /** 50 : : * Constructor for QgsRasterRenderer. 51 : : */ 52 : : QgsRasterRenderer( QgsRasterInterface *input = nullptr, const QString &type = QString() ); 53 : : ~QgsRasterRenderer() override; 54 : : 55 : : //! QgsRasterRenderer cannot be copied. Use clone() instead. 56 : : QgsRasterRenderer( const QgsRasterRenderer & ) = delete; 57 : : //! QgsRasterRenderer cannot be copied. Use clone() instead. 58 : : const QgsRasterRenderer &operator=( const QgsRasterRenderer & ) = delete; 59 : : 60 : : QgsRasterRenderer *clone() const override = 0 SIP_FACTORY; 61 : : 62 : : int bandCount() const override; 63 : : 64 : : Qgis::DataType dataType( int bandNo ) const override; 65 : : 66 : 0 : virtual QString type() const { return mType; } 67 : : 68 : : bool setInput( QgsRasterInterface *input ) override; 69 : : 70 : : QgsRasterBlock *block( int bandNo, 71 : : const QgsRectangle &extent, 72 : : int width, 73 : : int height, 74 : : QgsRasterBlockFeedback *feedback = nullptr ) override = 0 SIP_FACTORY; 75 : : 76 : : bool usesTransparency() const; 77 : : 78 : : /** 79 : : * Sets the \a opacity for the renderer, where \a opacity is a value between 0 (totally transparent) 80 : : * and 1.0 (fully opaque). 81 : : * \see opacity() 82 : : */ 83 : 0 : void setOpacity( double opacity ) { mOpacity = opacity; } 84 : : 85 : : /** 86 : : * Returns the opacity for the renderer, where opacity is a value between 0 (totally transparent) 87 : : * and 1.0 (fully opaque). 88 : : * \see setOpacity() 89 : : */ 90 : 0 : double opacity() const { return mOpacity; } 91 : : 92 : : /** 93 : : * Returns the color to use for shading nodata pixels. 94 : : * 95 : : * If the returned value is an invalid color then the default transparent rendering of 96 : : * nodata values will be used. 97 : : * 98 : : * \see renderColorForNodataPixel() 99 : : * \see setNodataColor() 100 : : * \since QGIS 3.12 101 : : */ 102 : 0 : QColor nodataColor() const { return mNodataColor; } 103 : : 104 : : /** 105 : : * Sets the \a color to use for shading nodata pixels. 106 : : * 107 : : * If \a color is an invalid color then the default transparent rendering of 108 : : * nodata values will be used. 109 : : * 110 : : * \see nodataColor() 111 : : * \since QGIS 3.12 112 : : */ 113 : 0 : void setNodataColor( const QColor &color ) { mNodataColor = color; } 114 : : 115 : : void setRasterTransparency( QgsRasterTransparency *t SIP_TRANSFER ); 116 : 0 : const QgsRasterTransparency *rasterTransparency() const { return mRasterTransparency; } 117 : : 118 : 0 : void setAlphaBand( int band ) { mAlphaBand = band; } 119 : 0 : int alphaBand() const { return mAlphaBand; } 120 : : 121 : : /** 122 : : * Returns symbology items if provided by renderer. 123 : : * 124 : : * \see createLegendNodes() 125 : : */ 126 : : virtual QList< QPair< QString, QColor > > legendSymbologyItems() const; 127 : : 128 : : /** 129 : : * Creates a set of legend nodes representing the renderer. 130 : : * 131 : : * The default implementation calls legendSymbologyItems() and creates corresponding legend nodes for each returned 132 : : * symbology item. 133 : : * 134 : : * Subclasses can override this to return more legend nodes which better represent the renderer. 135 : : * 136 : : * \since QGIS 3.18 137 : : */ 138 : : virtual QList<QgsLayerTreeModelLegendNode *> createLegendNodes( QgsLayerTreeLayer *nodeLayer ) SIP_FACTORY; 139 : : 140 : : //! Sets base class members from xml. Usually called from create() methods of subclasses 141 : : void readXml( const QDomElement &rendererElem ) override; 142 : : 143 : : /** 144 : : * Copies common properties like opacity / transparency data from other renderer. 145 : : * Useful when cloning renderers. 146 : : * \since QGIS 2.16 147 : : */ 148 : : void copyCommonProperties( const QgsRasterRenderer *other, bool copyMinMaxOrigin = true ); 149 : : 150 : : //! Returns a list of band numbers used by the renderer 151 : 0 : virtual QList<int> usesBands() const { return QList<int>(); } 152 : : 153 : : //! Returns const reference to origin of min/max values 154 : 0 : const QgsRasterMinMaxOrigin &minMaxOrigin() const { return mMinMaxOrigin; } 155 : : 156 : : //! Sets origin of min/max values 157 : 0 : void setMinMaxOrigin( const QgsRasterMinMaxOrigin &origin ) { mMinMaxOrigin = origin; } 158 : : 159 : : /** 160 : : * Used from subclasses to create SLD Rule elements following SLD v1.0 specs 161 : : * \since QGIS 3.6 162 : : */ 163 : : virtual void toSld( QDomDocument &doc, QDomElement &element, const QVariantMap &props = QVariantMap() ) const; 164 : : 165 : : /** 166 : : * Accepts the specified symbology \a visitor, causing it to visit all symbols associated 167 : : * with the renderer. 168 : : * 169 : : * Returns TRUE if the visitor should continue visiting other objects, or FALSE if visiting 170 : : * should be canceled. 171 : : * 172 : : * \since QGIS 3.10 173 : : */ 174 : : virtual bool accept( QgsStyleEntityVisitorInterface *visitor ) const; 175 : : 176 : : protected: 177 : : 178 : : //! Write upper class info into rasterrenderer element (called by writeXml method of subclasses) 179 : : void _writeXml( QDomDocument &doc, QDomElement &rasterRendererElem ) const; 180 : : 181 : : QString mType; 182 : : 183 : : //! Global alpha value (0-1) 184 : : double mOpacity = 1.0; 185 : : //! Raster transparency per color or value. Overwrites global alpha value 186 : : QgsRasterTransparency *mRasterTransparency = nullptr; 187 : : 188 : : /** 189 : : * Read alpha value from band. Is combined with value from raster transparency / global alpha value. 190 : : * Default: -1 (not set) 191 : : */ 192 : : int mAlphaBand = -1; 193 : : 194 : : //! Origin of min/max values 195 : : QgsRasterMinMaxOrigin mMinMaxOrigin; 196 : : 197 : : /** 198 : : * Returns the color for the renderer to use to represent nodata pixels. 199 : : * 200 : : * Subclasses should use this rather then nodataColor() to determine the color to use for nodata pixels 201 : : * during an actual rendering operation. 202 : : * 203 : : * \since QGIS 3.10 204 : : */ 205 : : QRgb renderColorForNodataPixel() const; 206 : : 207 : : private: 208 : : 209 : : QColor mNodataColor; 210 : : 211 : : #ifdef SIP_RUN 212 : : QgsRasterRenderer( const QgsRasterRenderer & ); 213 : : const QgsRasterRenderer &operator=( const QgsRasterRenderer & ); 214 : : #endif 215 : : 216 : : }; 217 : : 218 : : #endif // QGSRASTERRENDERER_H