QGIS API Documentation  3.2.0-Bonn (bc43194)
qgsrastershader.cpp
Go to the documentation of this file.
1 /* **************************************************************************
2  qgsrastershader.cpp - description
3  -------------------
4 begin : Fri Dec 28 2007
5 copyright : (C) 2007 by Peter J. Ersts
6 email : [email protected]
7 
8 ****************************************************************************/
9 
10 /* **************************************************************************
11  * *
12  * This program is free software; you can redistribute it and/or modify *
13  * it under the terms of the GNU General Public License as published by *
14  * the Free Software Foundation; either version 2 of the License, or *
15  * (at your option) any later version. *
16  * *
17  ***************************************************************************/
18 
19 #include "qgslogger.h"
20 #include "qgscolorrampshader.h"
21 #include "qgsrastershader.h"
22 #include "qgsrasterblock.h"
23 #include "qgssymbollayerutils.h"
24 
25 #include <QDomDocument>
26 #include <QDomElement>
27 
28 QgsRasterShader::QgsRasterShader( double minimumValue, double maximumValue )
29  : mMinimumValue( minimumValue )
30  , mMaximumValue( maximumValue )
31  , mRasterShaderFunction( new QgsRasterShaderFunction( mMinimumValue, mMaximumValue ) )
32 {
33  QgsDebugMsgLevel( "called.", 4 );
34 }
35 
36 bool QgsRasterShader::shade( double value, int *returnRedValue, int *returnGreenValue, int *returnBlueValue, int *returnAlpha )
37 {
38  if ( mRasterShaderFunction )
39  {
40  return mRasterShaderFunction->shade( value, returnRedValue, returnGreenValue, returnBlueValue, returnAlpha );
41  }
42 
43  return false;
44 }
45 
46 bool QgsRasterShader::shade( double redValue, double greenValue, double blueValue, double alphaValue, int *returnRedValue, int *returnGreenValue, int *returnBlueValue, int *returnAlphaValue )
47 {
48  if ( mRasterShaderFunction )
49  {
50  return mRasterShaderFunction->shade( redValue, greenValue, blueValue, alphaValue, returnRedValue, returnGreenValue, returnBlueValue, returnAlphaValue );
51  }
52 
53  return false;
54 }
55 
57 {
58  QgsDebugMsgLevel( "called.", 4 );
59 
60  if ( mRasterShaderFunction.get() == function )
61  return;
62 
63  if ( function )
64  {
65  mRasterShaderFunction.reset( function );
66  }
67 }
68 
70 {
71  QgsDebugMsgLevel( "Value = " + QString::number( value ), 4 );
72 
73  mMaximumValue = value;
74  if ( mRasterShaderFunction )
75  {
76  mRasterShaderFunction->setMaximumValue( value );
77  }
78 }
79 
81 {
82  QgsDebugMsgLevel( "Value = " + QString::number( value ), 4 );
83 
84  mMinimumValue = value;
85  if ( mRasterShaderFunction )
86  {
87  mRasterShaderFunction->setMinimumValue( value );
88  }
89 }
90 
91 void QgsRasterShader::writeXml( QDomDocument &doc, QDomElement &parent ) const
92 {
93  if ( parent.isNull() || !mRasterShaderFunction )
94  {
95  return;
96  }
97 
98  QDomElement rasterShaderElem = doc.createElement( QStringLiteral( "rastershader" ) );
99  QgsColorRampShader *colorRampShader = dynamic_cast<QgsColorRampShader *>( mRasterShaderFunction.get() );
100  if ( colorRampShader )
101  {
102  QDomElement colorRampShaderElem = doc.createElement( QStringLiteral( "colorrampshader" ) );
103  colorRampShaderElem.setAttribute( QStringLiteral( "colorRampType" ), colorRampShader->colorRampTypeAsQString() );
104  colorRampShaderElem.setAttribute( QStringLiteral( "classificationMode" ), colorRampShader->classificationMode() );
105  colorRampShaderElem.setAttribute( QStringLiteral( "clip" ), colorRampShader->clip() );
106 
107  // save source color ramp
108  if ( colorRampShader->sourceColorRamp() )
109  {
110  QDomElement colorRampElem = QgsSymbolLayerUtils::saveColorRamp( QStringLiteral( "[source]" ), colorRampShader->sourceColorRamp(), doc );
111  colorRampShaderElem.appendChild( colorRampElem );
112  }
113 
114  //items
115  QList<QgsColorRampShader::ColorRampItem> itemList = colorRampShader->colorRampItemList();
116  QList<QgsColorRampShader::ColorRampItem>::const_iterator itemIt = itemList.constBegin();
117  for ( ; itemIt != itemList.constEnd(); ++itemIt )
118  {
119  QDomElement itemElem = doc.createElement( QStringLiteral( "item" ) );
120  itemElem.setAttribute( QStringLiteral( "label" ), itemIt->label );
121  itemElem.setAttribute( QStringLiteral( "value" ), QgsRasterBlock::printValue( itemIt->value ) );
122  itemElem.setAttribute( QStringLiteral( "color" ), itemIt->color.name() );
123  itemElem.setAttribute( QStringLiteral( "alpha" ), itemIt->color.alpha() );
124  colorRampShaderElem.appendChild( itemElem );
125  }
126  rasterShaderElem.appendChild( colorRampShaderElem );
127  }
128  parent.appendChild( rasterShaderElem );
129 }
130 
131 void QgsRasterShader::readXml( const QDomElement &elem )
132 {
133  //only colorrampshader
134  QDomElement colorRampShaderElem = elem.firstChildElement( QStringLiteral( "colorrampshader" ) );
135  if ( !colorRampShaderElem.isNull() )
136  {
137  QgsColorRampShader *colorRampShader = new QgsColorRampShader();
138 
139  // try to load color ramp (optional)
140  QDomElement sourceColorRampElem = colorRampShaderElem.firstChildElement( QStringLiteral( "colorramp" ) );
141  if ( !sourceColorRampElem.isNull() && sourceColorRampElem.attribute( QStringLiteral( "name" ) ) == QLatin1String( "[source]" ) )
142  {
143  colorRampShader->setSourceColorRamp( QgsSymbolLayerUtils::loadColorRamp( sourceColorRampElem ) );
144  }
145 
146  colorRampShader->setColorRampType( colorRampShaderElem.attribute( QStringLiteral( "colorRampType" ), QStringLiteral( "INTERPOLATED" ) ) );
147  colorRampShader->setClassificationMode( static_cast< QgsColorRampShader::ClassificationMode >( colorRampShaderElem.attribute( QStringLiteral( "classificationMode" ), QStringLiteral( "1" ) ).toInt() ) );
148  colorRampShader->setClip( colorRampShaderElem.attribute( QStringLiteral( "clip" ), QStringLiteral( "0" ) ) == QLatin1String( "1" ) );
149 
150  QList<QgsColorRampShader::ColorRampItem> itemList;
151  QDomElement itemElem;
152  QString itemLabel;
153  double itemValue;
154  QColor itemColor;
155 
156  QDomNodeList itemNodeList = colorRampShaderElem.elementsByTagName( QStringLiteral( "item" ) );
157  itemList.reserve( itemNodeList.size() );
158  for ( int i = 0; i < itemNodeList.size(); ++i )
159  {
160  itemElem = itemNodeList.at( i ).toElement();
161  itemValue = itemElem.attribute( QStringLiteral( "value" ) ).toDouble();
162  itemLabel = itemElem.attribute( QStringLiteral( "label" ) );
163  itemColor.setNamedColor( itemElem.attribute( QStringLiteral( "color" ) ) );
164  itemColor.setAlpha( itemElem.attribute( QStringLiteral( "alpha" ), QStringLiteral( "255" ) ).toInt() );
165 
166  itemList.push_back( QgsColorRampShader::ColorRampItem( itemValue, itemColor, itemLabel ) );
167  }
168  colorRampShader->setColorRampItemList( itemList );
169  setRasterShaderFunction( colorRampShader );
170  }
171 }
void setColorRampItemList(const QList< QgsColorRampShader::ColorRampItem > &list)
Sets a custom colormap.
static QString printValue(double value)
Print double value with all necessary significant digits.
A ramp shader will color a raster pixel based on a list of values ranges in a ramp.
static QDomElement saveColorRamp(const QString &name, QgsColorRamp *ramp, QDomDocument &doc)
Encodes a color ramp&#39;s settings to an XML element.
QList< QgsColorRampShader::ColorRampItem > colorRampItemList() const
Returns the custom colormap.
void setClip(bool clip)
Sets whether the shader should not render values out of range.
void setColorRampType(QgsColorRampShader::Type colorRampType)
Sets the color ramp type.
#define QgsDebugMsgLevel(str, level)
Definition: qgslogger.h:39
The raster shade function applies a shader to a pixel at render time - typically used to render grays...
void setRasterShaderFunction(QgsRasterShaderFunction *function)
A public method that allows the user to set their own shader function.
static QgsColorRamp * loadColorRamp(QDomElement &element)
Creates a color ramp from the settings encoded in an XML element.
void setSourceColorRamp(QgsColorRamp *colorramp)
Set the source color ramp.
bool shade(double value, int *returnRedValue, int *returnGreenValue, int *returnBlueValue, int *returnAlpha)
Generates a new RGBA value based on one input value.
QString colorRampTypeAsQString()
Returns the color ramp type as a string.
QgsRasterShader(double minimumValue=0.0, double maximumValue=255.0)
void writeXml(QDomDocument &doc, QDomElement &parent) const
Writes shader state to an XML element.
void setMinimumValue(double value)
Sets the minimum value for the raster shader.
void setMaximumValue(double value)
Sets the maximum value for the raster shader.
void setClassificationMode(ClassificationMode classificationMode)
Sets classification mode.
bool clip() const
Returns whether the shader will clip values which are out of range.
ClassificationMode classificationMode() const
Returns the classification mode.
QgsColorRamp * sourceColorRamp() const
Gets the source color ramp.
void readXml(const QDomElement &elem)
Reads shader state from an XML element.