QGIS API Documentation  3.0.2-Girona (307d082)
qgsrasterrenderer.cpp
Go to the documentation of this file.
1 /***************************************************************************
2  qgsrasterrenderer.cpp
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 #include "qgsrasterrenderer.h"
19 #include "qgsrastertransparency.h"
20 
21 #include <QCoreApplication>
22 #include <QDomDocument>
23 #include <QDomElement>
24 #include <QImage>
25 #include <QPainter>
26 
27 // See #9101 before any change of NODATA_COLOR!
28 const QRgb QgsRasterRenderer::NODATA_COLOR = qRgba( 0, 0, 0, 0 );
29 
31  : QgsRasterInterface( input )
32  , mType( type )
33 {
34 }
35 
37 {
38  delete mRasterTransparency;
39 }
40 
42 {
43  if ( mOn ) return 1;
44 
45  if ( mInput ) return mInput->bandCount();
46 
47  return 0;
48 }
49 
51 {
52  QgsDebugMsgLevel( "Entered", 4 );
53 
54  if ( mOn ) return Qgis::ARGB32_Premultiplied;
55 
56  if ( mInput ) return mInput->dataType( bandNo );
57 
58  return Qgis::UnknownDataType;
59 }
60 
62 {
63  // Renderer can only work with numerical values in at least 1 band
64  if ( !input ) return false;
65 
66  if ( !mOn )
67  {
68  // In off mode we can connect to anything
69  mInput = input;
70  return true;
71  }
72 
73  for ( int i = 1; i <= input->bandCount(); i++ )
74  {
75  if ( !QgsRasterBlock::typeIsNumeric( input->dataType( i ) ) )
76  {
77  return false;
78  }
79  }
80  mInput = input;
81  return true;
82 }
83 
85 {
86  if ( !mInput )
87  {
88  return true;
89  }
90  return ( mAlphaBand > 0 || ( mRasterTransparency && !mRasterTransparency->isEmpty() ) || !qgsDoubleNear( mOpacity, 1.0 ) );
91 }
92 
94 {
95  delete mRasterTransparency;
97 }
98 
99 void QgsRasterRenderer::_writeXml( QDomDocument &doc, QDomElement &rasterRendererElem ) const
100 {
101  if ( rasterRendererElem.isNull() )
102  {
103  return;
104  }
105 
106  rasterRendererElem.setAttribute( QStringLiteral( "type" ), mType );
107  rasterRendererElem.setAttribute( QStringLiteral( "opacity" ), QString::number( mOpacity ) );
108  rasterRendererElem.setAttribute( QStringLiteral( "alphaBand" ), mAlphaBand );
109 
110  if ( mRasterTransparency )
111  {
112  mRasterTransparency->writeXml( doc, rasterRendererElem );
113  }
114 
115  QDomElement minMaxOriginElem = doc.createElement( QStringLiteral( "minMaxOrigin" ) );
116  mMinMaxOrigin.writeXml( doc, minMaxOriginElem );
117  rasterRendererElem.appendChild( minMaxOriginElem );
118 }
119 
120 void QgsRasterRenderer::readXml( const QDomElement &rendererElem )
121 {
122  if ( rendererElem.isNull() )
123  {
124  return;
125  }
126 
127  mType = rendererElem.attribute( QStringLiteral( "type" ) );
128  mOpacity = rendererElem.attribute( QStringLiteral( "opacity" ), QStringLiteral( "1.0" ) ).toDouble();
129  mAlphaBand = rendererElem.attribute( QStringLiteral( "alphaBand" ), QStringLiteral( "-1" ) ).toInt();
130 
131  QDomElement rasterTransparencyElem = rendererElem.firstChildElement( QStringLiteral( "rasterTransparency" ) );
132  if ( !rasterTransparencyElem.isNull() )
133  {
134  delete mRasterTransparency;
136  mRasterTransparency->readXml( rasterTransparencyElem );
137  }
138 
139  QDomElement minMaxOriginElem = rendererElem.firstChildElement( QStringLiteral( "minMaxOrigin" ) );
140  if ( !minMaxOriginElem.isNull() )
141  {
142  mMinMaxOrigin.readXml( minMaxOriginElem );
143  }
144 }
145 
146 void QgsRasterRenderer::copyCommonProperties( const QgsRasterRenderer *other, bool copyMinMaxOrigin )
147 {
148  if ( !other )
149  return;
150 
151  setOpacity( other->opacity() );
152  setAlphaBand( other->alphaBand() );
153  setRasterTransparency( other->rasterTransparency() ? new QgsRasterTransparency( *other->rasterTransparency() ) : nullptr );
154  if ( copyMinMaxOrigin )
155  setMinMaxOrigin( other->minMaxOrigin() );
156 }
virtual int bandCount() const =0
Get number of bands.
bool isEmpty() const
True if there are no entries in the pixel lists except the nodata value.
double opacity() const
Returns the opacity for the renderer, where opacity is a value between 0 (totally transparent) and 1...
static bool typeIsNumeric(Qgis::DataType type)
Returns true if data type is numeric.
virtual QgsRasterInterface * input() const
Current input.
QgsRasterRenderer(QgsRasterInterface *input=nullptr, const QString &type=QString())
Constructor for QgsRasterRenderer.
DataType
Raster data types.
Definition: qgis.h:91
QgsRasterMinMaxOrigin mMinMaxOrigin
Origin of min/max values.
const QgsRasterMinMaxOrigin & minMaxOrigin() const
Returns const reference to origin of min/max values.
virtual Qgis::DataType dataType(int bandNo) const =0
Returns data type for the band specified by number.
bool qgsDoubleNear(double a, double b, double epsilon=4 *DBL_EPSILON)
Compare two doubles (but allow some difference)
Definition: qgis.h:251
const QgsRasterTransparency * rasterTransparency() const
QgsRasterTransparency * mRasterTransparency
Raster transparency per color or value. Overwrites global alpha value.
Color, alpha, red, green, blue, 4 bytes the same as QImage::Format_ARGB32_Premultiplied.
Definition: qgis.h:106
static const QRgb NODATA_COLOR
bool setInput(QgsRasterInterface *input) override
Set input.
#define QgsDebugMsgLevel(str, level)
Definition: qgslogger.h:39
void _writeXml(QDomDocument &doc, QDomElement &rasterRendererElem) const
Write upper class info into rasterrenderer element (called by writeXml method of subclasses) ...
void copyCommonProperties(const QgsRasterRenderer *other, bool copyMinMaxOrigin=true)
Copies common properties like opacity / transparency data from other renderer.
void readXml(const QDomElement &elem)
Deserialize object.
bool usesTransparency() const
Unknown or unspecified type.
Definition: qgis.h:93
void readXml(const QDomElement &elem)
Reads the transparency information from an XML document.
int mAlphaBand
Read alpha value from band.
void setAlphaBand(int band)
void readXml(const QDomElement &rendererElem) override
Sets base class members from xml. Usually called from create() methods of subclasses.
int bandCount() const override
Get number of bands.
Qgis::DataType dataType(int bandNo) const override
Returns data type for the band specified by number.
Base class for processing filters like renderers, reprojector, resampler etc.
void setMinMaxOrigin(const QgsRasterMinMaxOrigin &origin)
Sets origin of min/max values.
~QgsRasterRenderer() override
void writeXml(QDomDocument &doc, QDomElement &parentElem) const
Writes the transparency information to an XML document.
double mOpacity
Global alpha value (0-1)
Defines the list of pixel values to be considered as transparent or semi transparent when rendering r...
void setOpacity(double opacity)
Sets the opacity for the renderer, where opacity is a value between 0 (totally transparent) and 1...
QgsRasterInterface * mInput
void setRasterTransparency(QgsRasterTransparency *t)
Raster renderer pipe that applies colors to a raster.
void writeXml(QDomDocument &doc, QDomElement &parentElem) const
Serialize object.