25 #include <QDomDocument> 26 #include <QDomElement> 33 , mClassificationMin( std::numeric_limits<double>::quiet_NaN() )
34 , mClassificationMax( std::numeric_limits<double>::quiet_NaN() )
49 mClassificationMin = min;
53 if ( colorRampShader )
62 mClassificationMax = max;
66 if ( colorRampShader )
79 shader =
new QgsRasterShader( mShader->minimumValue(), mShader->maximumValue() );
84 if ( origColorRampShader )
88 if ( origColorRampShader->sourceColorRamp() )
90 colorRampShader->
setSourceColorRamp( origColorRampShader->sourceColorRamp()->clone() );
94 colorRampShader->
setClip( origColorRampShader->clip() );
107 mShader.reset( shader );
119 colorRampShader->
setClip( clip );
133 int band = elem.attribute( QStringLiteral(
"band" ), QStringLiteral(
"-1" ) ).toInt();
135 QDomElement rasterShaderElem = elem.firstChildElement( QStringLiteral(
"rastershader" ) );
136 if ( !rasterShaderElem.isNull() )
139 shader->
readXml( rasterShaderElem );
146 r->
setClassificationMin( elem.attribute( QStringLiteral(
"classificationMin" ), QStringLiteral(
"NaN" ) ).toDouble() );
147 r->
setClassificationMax( elem.attribute( QStringLiteral(
"classificationMax" ), QStringLiteral(
"NaN" ) ).toDouble() );
150 QString
minMaxOrigin = elem.attribute( QStringLiteral(
"classificationMinMaxOrigin" ) );
151 if ( !minMaxOrigin.isEmpty() )
153 if ( minMaxOrigin.contains( QLatin1String(
"MinMax" ) ) )
157 else if ( minMaxOrigin.contains( QLatin1String(
"CumulativeCut" ) ) )
161 else if ( minMaxOrigin.contains( QLatin1String(
"StdDev" ) ) )
170 if ( minMaxOrigin.contains( QLatin1String(
"FullExtent" ) ) )
174 else if ( minMaxOrigin.contains( QLatin1String(
"SubExtent" ) ) )
183 if ( minMaxOrigin.contains( QLatin1String(
"Estimated" ) ) )
200 std::unique_ptr< QgsRasterBlock > outputBlock(
new QgsRasterBlock() );
201 if ( !
mInput || !mShader )
203 return outputBlock.release();
207 std::shared_ptr< QgsRasterBlock > inputBlock(
mInput->
block( mBand, extent, width, height, feedback ) );
208 if ( !inputBlock || inputBlock->isEmpty() )
211 return outputBlock.release();
217 std::shared_ptr< QgsRasterBlock > alphaBlock;
221 if ( !alphaBlock || alphaBlock->isEmpty() )
223 return outputBlock.release();
228 alphaBlock = inputBlock;
233 return outputBlock.release();
240 if ( inputBlock->isNoData( i ) )
242 outputBlock->setColor( i, myDefaultColor );
245 double val = inputBlock->value( i );
246 int red, green, blue, alpha;
247 if ( !mShader->shade( val, &red, &green, &blue, &alpha ) )
249 outputBlock->setColor( i, myDefaultColor );
256 red *= ( alpha / 255.0 );
257 blue *= ( alpha / 255.0 );
258 green *= ( alpha / 255.0 );
261 if ( !hasTransparency )
263 outputBlock->setColor( i, qRgba( red, green, blue, alpha ) );
275 currentOpacity *= alphaBlock->value( i ) / 255.0;
278 outputBlock->setColor( i, qRgba( currentOpacity * red, currentOpacity * green, currentOpacity * blue, currentOpacity * alpha ) );
282 return outputBlock.release();
287 if ( parentElem.isNull() )
292 QDomElement rasterRendererElem = doc.createElement( QStringLiteral(
"rasterrenderer" ) );
294 rasterRendererElem.setAttribute( QStringLiteral(
"band" ), mBand );
297 mShader->writeXml( doc, rasterRendererElem );
302 parentElem.appendChild( rasterRendererElem );
310 if ( shaderFunction )
virtual int bandCount() const =0
Get number of bands.
int alphaValue(double, int globalTransparency=255) const
Returns the transparency value for a single value Pixel.
A rectangle specified with double values.
double classificationMin() const
Interface for all raster shaders.
void setColorRampItemList(const QList< QgsColorRampShader::ColorRampItem > &list)
Set custom colormap.
static QString printValue(double value)
Print double value with all necessary significant digits.
void legendSymbologyItems(QList< QPair< QString, QColor > > &symbolItems) const override
Get symbology items if provided by renderer.
QgsSingleBandPseudoColorRenderer * clone() const override
Clone itself, create deep copy.
virtual QgsRectangle extent() const
Get the extent of the interface.
static QgsRasterRenderer * create(const QDomElement &elem, QgsRasterInterface *input)
A ramp shader will color a raster pixel based on a list of values ranges in a ramp.
Abstract base class for color ramps.
virtual QgsRasterInterface * input() const
Current input.
QgsRasterMinMaxOrigin mMinMaxOrigin
Origin of min/max values.
const QgsRasterMinMaxOrigin & minMaxOrigin() const
Returns const reference to origin of min/max values.
void setClip(bool clip)
Sets whether the shader should not render values out of range.
virtual void legendSymbologyItems(QList< QPair< QString, QColor > > &symbolItems) const
QgsRasterShader * shader()
Returns the raster shader.
void setClassificationMax(double max)
void setShader(QgsRasterShader *shader)
Takes ownership of the shader.
Type
Supported methods for color interpolation.
Current extent of the canvas (at the time of computation) is used to compute statistics.
void setExtent(QgsRasterMinMaxOrigin::Extent extent)
Set extent.
QgsRasterTransparency * mRasterTransparency
Raster transparency per color or value. Overwrites global alpha value.
static const QRgb NODATA_COLOR
Color, alpha, red, green, blue, 4 bytes the same as QImage::Format_ARGB32_Premultiplied.
void setColorRampType(QgsColorRampShader::Type colorRampType)
Set the color ramp type.
virtual QgsRasterBlock * block(int bandNo, const QgsRectangle &extent, int width, int height, QgsRasterBlockFeedback *feedback=nullptr)=0
Read block of data using given extent and size.
QgsRasterShaderFunction * rasterShaderFunction()
void _writeXml(QDomDocument &doc, QDomElement &rasterRendererElem) const
Write upper class info into rasterrenderer element (called by writeXml method of subclasses) ...
double classificationMax() const
The raster shade function applies a shader to a pixel at render time - typically used to render grays...
void copyCommonProperties(const QgsRasterRenderer *other, bool copyMinMaxOrigin=true)
Copies common properties like opacity / transparency data from other renderer.
Raster renderer pipe for single band pseudocolor.
void setRasterShaderFunction(QgsRasterShaderFunction *function)
A public method that allows the user to set their own shader function.
Range is [ mean - stdDevFactor() * stddev, mean + stdDevFactor() * stddev ].
bool usesTransparency() const
int mAlphaBand
Read alpha value from band.
void readXml(const QDomElement &rendererElem) override
Sets base class members from xml. Usually called from create() methods of subclasses.
void setSourceColorRamp(QgsColorRamp *colorramp)
Set the source color ramp.
QList< int > usesBands() const override
Returns a list of band numbers used by the renderer.
Range is [ min + cumulativeCutLower() * (max - min), min + cumulativeCutUpper() * (max - min) ]...
Base class for processing filters like renderers, reprojector, resampler etc.
unsigned long long qgssize
Qgssize is used instead of size_t, because size_t is stdlib type, unknown by SIP, and it would be har...
void setLimits(QgsRasterMinMaxOrigin::Limits limits)
Set limits.
void setClassificationMin(double min)
void classifyColorRamp(const int classes=0, const int band=-1, const QgsRectangle &extent=QgsRectangle(), QgsRasterInterface *input=nullptr)
Classify color ramp shader.
void setStatAccuracy(QgsRasterMinMaxOrigin::StatAccuracy accuracy)
Set statistics accuracy.
Whole raster is used to compute statistics.
void setClassificationMode(ClassificationMode classificationMode)
Sets classification mode.
virtual void setMinimumValue(double)
Return the minimum value.
void setBand(int bandNo)
Sets the band used by the renderer.
double mOpacity
Global alpha value (0-1)
void createShader(QgsColorRamp *colorRamp=nullptr, QgsColorRampShader::Type colorRampType=QgsColorRampShader::Interpolated, QgsColorRampShader::ClassificationMode classificationMode=QgsColorRampShader::Continuous, int classes=0, bool clip=false, const QgsRectangle &extent=QgsRectangle())
Creates a color ramp shader.
ClassificationMode
Classification modes used to create the color ramp shader.
QgsRasterInterface * mInput
QgsSingleBandPseudoColorRenderer(QgsRasterInterface *input, int band=-1, QgsRasterShader *shader=nullptr)
Note: takes ownership of QgsRasterShader.
Feedback object tailored for raster block reading.
virtual void setMaximumValue(double)
Set the maximum value.
QgsRasterBlock * block(int bandNo, const QgsRectangle &extent, int width, int height, QgsRasterBlockFeedback *feedback=nullptr) override
Read block of data using given extent and size.
Raster renderer pipe that applies colors to a raster.
int band() const
Returns the band used by the renderer.
void writeXml(QDomDocument &doc, QDomElement &parentElem) const override
Write base class members to xml.
void readXml(const QDomElement &elem)
Reads shader state from an XML element.