QGIS API Documentation 3.99.0-Master (d270888f95f)
Loading...
Searching...
No Matches
qgssinglebandpseudocolorrenderer.cpp
Go to the documentation of this file.
1/***************************************************************************
2 qgssinglebandpseudocolorrenderer.cpp
3 ------------------------------------
4 begin : January 2012
5 copyright : (C) 2012 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
19
20#include "qgscolorramp.h"
22#include "qgscolorrampshader.h"
23#include "qgsrastershader.h"
25#include "qgssldexportcontext.h"
27
28#include <QDomDocument>
29#include <QDomElement>
30#include <QImage>
31#include <QString>
32
33using namespace Qt::StringLiterals;
34
36 : QgsRasterRenderer( input, u"singlebandpseudocolor"_s )
37 , mShader( shader )
38 , mBand( band )
39 , mClassificationMin( std::numeric_limits<double>::quiet_NaN() )
40 , mClassificationMax( std::numeric_limits<double>::quiet_NaN() )
41{
42}
43
45{
46 setInputBand( bandNo );
47}
48
50{
51 return mBand;
52}
53
55{
56 if ( !mInput )
57 {
58 mBand = band;
59 return true;
60 }
61 else if ( band > 0 && band <= mInput->bandCount() )
62 {
63 mBand = band;
64 return true;
65 }
66 return false;
67}
68
70{
71 mClassificationMin = min;
72 if ( auto *lShader = shader() )
73 {
74 QgsColorRampShader *colorRampShader = dynamic_cast<QgsColorRampShader *>( lShader->rasterShaderFunction() );
75 if ( colorRampShader )
76 {
77 colorRampShader->setMinimumValue( min );
78 }
79 }
80}
81
83{
84 mClassificationMax = max;
85 if ( auto *lShader = shader() )
86 {
87 QgsColorRampShader *colorRampShader = dynamic_cast<QgsColorRampShader *>( lShader->rasterShaderFunction() );
88 if ( colorRampShader )
89 {
90 colorRampShader->setMaximumValue( max );
91 }
92 }
93}
94
96{
97 QgsRasterShader *shader = nullptr;
98
99 if ( mShader )
100 {
101 shader = new QgsRasterShader( mShader->minimumValue(), mShader->maximumValue() );
102
103 // Shader function
104 const QgsColorRampShader *origColorRampShader = dynamic_cast<const QgsColorRampShader *>( mShader->rasterShaderFunction() );
105
106 if ( origColorRampShader )
107 {
108 QgsColorRampShader *colorRampShader = new QgsColorRampShader( *origColorRampShader );
109 shader->setRasterShaderFunction( colorRampShader );
110 }
111 }
113 renderer->copyCommonProperties( this );
114
115 return renderer;
116}
117
122
127
129{
130 if ( mBand == -1 || classificationMin() >= classificationMax() )
131 {
132 return;
133 }
134
135 QgsColorRampShader *colorRampShader = new QgsColorRampShader( classificationMin(), classificationMax(), colorRamp, colorRampType, classificationMode );
136 colorRampShader->classifyColorRamp( classes, mBand, extent, input() );
137 colorRampShader->setClip( clip );
138
139 QgsRasterShader *rasterShader = new QgsRasterShader();
140 rasterShader->setRasterShaderFunction( colorRampShader );
141 setShader( rasterShader );
142}
143
145{
146 if ( elem.isNull() )
147 {
148 return nullptr;
149 }
150
151 const int band = elem.attribute( u"band"_s, u"-1"_s ).toInt();
152 QgsRasterShader *shader = nullptr;
153 const QDomElement rasterShaderElem = elem.firstChildElement( u"rastershader"_s );
154 if ( !rasterShaderElem.isNull() )
155 {
156 shader = new QgsRasterShader();
157 shader->readXml( rasterShaderElem );
158 }
159
161 r->readXml( elem );
162
163 // TODO: add _readXML in superclass?
164 r->setClassificationMin( elem.attribute( u"classificationMin"_s, u"NaN"_s ).toDouble() );
165 r->setClassificationMax( elem.attribute( u"classificationMax"_s, u"NaN"_s ).toDouble() );
166
167 // Backward compatibility with serialization of QGIS 2.X era
168 const QString minMaxOrigin = elem.attribute( u"classificationMinMaxOrigin"_s );
169 if ( !minMaxOrigin.isEmpty() )
170 {
171 if ( minMaxOrigin.contains( "MinMax"_L1 ) )
172 {
174 }
175 else if ( minMaxOrigin.contains( "CumulativeCut"_L1 ) )
176 {
178 }
179 else if ( minMaxOrigin.contains( "StdDev"_L1 ) )
180 {
182 }
183 else
184 {
186 }
187
188 if ( minMaxOrigin.contains( "FullExtent"_L1 ) )
189 {
191 }
192 else if ( minMaxOrigin.contains( "SubExtent"_L1 ) )
193 {
195 }
196 else
197 {
199 }
200
201 if ( minMaxOrigin.contains( "Estimated"_L1 ) )
202 {
204 }
205 else // if ( minMaxOrigin.contains( "Exact"_L1 ) )
206 {
208 }
209 }
210
211 return r;
212}
213
215{
216 Q_UNUSED( bandNo )
217
218 auto outputBlock = std::make_unique<QgsRasterBlock>();
219 if ( !mInput || !mShader || !mShader->rasterShaderFunction() )
220 {
221 return outputBlock.release();
222 }
223
224
225 const std::shared_ptr< QgsRasterBlock > inputBlock( mInput->block( mBand, extent, width, height, feedback ) );
226 if ( !inputBlock || inputBlock->isEmpty() )
227 {
228 QgsDebugError( u"No raster data!"_s );
229 return outputBlock.release();
230 }
231
232 //rendering is faster without considering user-defined transparency
233 const bool hasTransparency = usesTransparency();
234
235 std::shared_ptr< QgsRasterBlock > alphaBlock;
236 if ( mAlphaBand > 0 && mAlphaBand != mBand )
237 {
238 alphaBlock.reset( mInput->block( mAlphaBand, extent, width, height, feedback ) );
239 if ( !alphaBlock || alphaBlock->isEmpty() )
240 {
241 return outputBlock.release();
242 }
243 }
244 else if ( mAlphaBand == mBand )
245 {
246 alphaBlock = inputBlock;
247 }
248
249 if ( !outputBlock->reset( Qgis::DataType::ARGB32_Premultiplied, width, height ) )
250 {
251 return outputBlock.release();
252 }
253
254 const QRgb myDefaultColor = renderColorForNodataPixel();
255 QRgb *outputBlockData = outputBlock->colorData();
256 const QgsRasterShaderFunction *fcn = mShader->rasterShaderFunction();
257
258 const qgssize count = ( qgssize )width * height;
259 bool isNoData = false;
260 for ( qgssize i = 0; i < count; i++ )
261 {
262 const double val = inputBlock->valueAndNoData( i, isNoData );
263 if ( isNoData )
264 {
265 outputBlockData[i] = myDefaultColor;
266 continue;
267 }
268
269 int red, green, blue, alpha;
270 if ( !fcn->shade( val, &red, &green, &blue, &alpha ) )
271 {
272 outputBlockData[i] = myDefaultColor;
273 continue;
274 }
275
276 if ( alpha < 255 )
277 {
278 // Working with premultiplied colors, so multiply values by alpha
279 red *= ( alpha / 255.0 );
280 blue *= ( alpha / 255.0 );
281 green *= ( alpha / 255.0 );
282 }
283
284 if ( !hasTransparency )
285 {
286 outputBlockData[i] = qRgba( red, green, blue, alpha );
287 }
288 else
289 {
290 //opacity
291 double currentOpacity = mOpacity;
293 {
294 currentOpacity *= mRasterTransparency->opacityForValue( val );
295 }
296 if ( mAlphaBand > 0 )
297 {
298 const double alpha = alphaBlock->value( i );
299 if ( alpha == 0 )
300 {
301 outputBlock->setColor( i, myDefaultColor );
302 continue;
303 }
304 else
305 {
306 currentOpacity *= alpha / 255.0;
307 }
308 }
309
310 outputBlockData[i] = qRgba( currentOpacity * red, currentOpacity * green, currentOpacity * blue, currentOpacity * alpha );
311 }
312 }
313
314 return outputBlock.release();
315}
316
317void QgsSingleBandPseudoColorRenderer::writeXml( QDomDocument &doc, QDomElement &parentElem ) const
318{
319 if ( parentElem.isNull() )
320 {
321 return;
322 }
323
324 QDomElement rasterRendererElem = doc.createElement( u"rasterrenderer"_s );
325 _writeXml( doc, rasterRendererElem );
326 rasterRendererElem.setAttribute( u"band"_s, mBand );
327 if ( mShader )
328 {
329 mShader->writeXml( doc, rasterRendererElem ); //todo: include color ramp items directly in this renderer
330 }
331 rasterRendererElem.setAttribute( u"classificationMin"_s, QgsRasterBlock::printValue( mClassificationMin ) );
332 rasterRendererElem.setAttribute( u"classificationMax"_s, QgsRasterBlock::printValue( mClassificationMax ) );
333
334 parentElem.appendChild( rasterRendererElem );
335}
336
337QList< QPair< QString, QColor > > QgsSingleBandPseudoColorRenderer::legendSymbologyItems() const
338{
339 QList< QPair< QString, QColor > > symbolItems;
340 if ( mShader )
341 {
342 QgsRasterShaderFunction *shaderFunction = mShader->rasterShaderFunction();
343 if ( shaderFunction )
344 {
345 shaderFunction->legendSymbologyItems( symbolItems );
346 }
347 }
348 return symbolItems;
349}
350
352{
353 QList<int> bandList;
354 if ( mBand != -1 )
355 {
356 bandList << mBand;
357 }
358 return bandList;
359}
360
361void QgsSingleBandPseudoColorRenderer::toSld( QDomDocument &doc, QDomElement &element, const QVariantMap &props ) const
362{
363 QgsSldExportContext context;
364 context.setExtraProperties( props );
365 toSld( doc, element, context );
366}
367
368bool QgsSingleBandPseudoColorRenderer::toSld( QDomDocument &doc, QDomElement &element, QgsSldExportContext &context ) const
369{
370 // create base structure
371 QgsRasterRenderer::toSld( doc, element, context );
372
373 // look for RasterSymbolizer tag
374 const QDomNodeList elements = element.elementsByTagName( u"sld:RasterSymbolizer"_s );
375 if ( elements.size() == 0 )
376 return false;
377
378 // there SHOULD be only one
379 QDomElement rasterSymbolizerElem = elements.at( 0 ).toElement();
380
381 // add Channel Selection tags
382 QDomElement channelSelectionElem = doc.createElement( u"sld:ChannelSelection"_s );
383 rasterSymbolizerElem.appendChild( channelSelectionElem );
384
385 // for the mapped band
386 QDomElement channelElem = doc.createElement( u"sld:GrayChannel"_s );
387 channelSelectionElem.appendChild( channelElem );
388
389 // set band
390 QDomElement sourceChannelNameElem = doc.createElement( u"sld:SourceChannelName"_s );
391 sourceChannelNameElem.appendChild( doc.createTextNode( QString::number( mBand ) ) );
392 channelElem.appendChild( sourceChannelNameElem );
393
394 // add ColorMap tag
395 QDomElement colorMapElem = doc.createElement( u"sld:ColorMap"_s );
396
397 // set type of ColorMap ramp [ramp, intervals, values]
398 // basing on interpolation algorithm of the raster shader
399 QString rampType = u"ramp"_s;
400 const QgsColorRampShader *rampShader = dynamic_cast<const QgsColorRampShader *>( mShader->rasterShaderFunction() );
401 if ( !rampShader )
402 return false;
403
404 switch ( rampShader->colorRampType() )
405 {
407 rampType = u"values"_s;
408 break;
410 rampType = u"intervals"_s;
411 break;
413 rampType = u"ramp"_s;
414 break;
415 }
416
417 colorMapElem.setAttribute( u"type"_s, rampType );
418 if ( rampShader->colorRampItemList().size() >= 255 )
419 colorMapElem.setAttribute( u"extended"_s, u"true"_s );
420 rasterSymbolizerElem.appendChild( colorMapElem );
421
422 // for each color set a ColorMapEntry tag nested into "sld:ColorMap" tag
423 // e.g. <ColorMapEntry color="#EEBE2F" quantity="-300" label="label" opacity="0"/>
424 const QList<QgsColorRampShader::ColorRampItem> classes = rampShader->colorRampItemList();
425 QList<QgsColorRampShader::ColorRampItem>::const_iterator classDataIt = classes.constBegin();
426 for ( ; classDataIt != classes.constEnd(); ++classDataIt )
427 {
428 QDomElement colorMapEntryElem = doc.createElement( u"sld:ColorMapEntry"_s );
429 colorMapElem.appendChild( colorMapEntryElem );
430
431 // set colorMapEntryElem attributes
432 colorMapEntryElem.setAttribute( u"color"_s, classDataIt->color.name() );
433 colorMapEntryElem.setAttribute( u"quantity"_s, classDataIt->value );
434 colorMapEntryElem.setAttribute( u"label"_s, classDataIt->label );
435 if ( classDataIt->color.alphaF() != 1.0 )
436 {
437 colorMapEntryElem.setAttribute( u"opacity"_s, QString::number( classDataIt->color.alphaF() ) );
438 }
439 }
440 return true;
441}
442
444{
445 if ( const QgsColorRampShader *shader = dynamic_cast< const QgsColorRampShader * >( mShader->rasterShaderFunction() ) )
446 {
447 QgsStyleColorRampEntity entity( shader->sourceColorRamp() );
448 if ( !visitor->visit( QgsStyleEntityVisitorInterface::StyleLeaf( &entity ) ) )
449 return false;
450 }
451
452 return true;
453}
454
455QList<QgsLayerTreeModelLegendNode *> QgsSingleBandPseudoColorRenderer::createLegendNodes( QgsLayerTreeLayer *nodeLayer )
456{
457 if ( !mShader )
458 return QList<QgsLayerTreeModelLegendNode *>();
459
460 const QgsColorRampShader *rampShader = dynamic_cast<const QgsColorRampShader *>( mShader->rasterShaderFunction() );
461 if ( !rampShader )
462 return QList<QgsLayerTreeModelLegendNode *>();
463
464 QList<QgsLayerTreeModelLegendNode *> res;
465
466 const QString name = displayBandName( mBand );
467 if ( !name.isEmpty() )
468 {
469 res << new QgsSimpleLegendNode( nodeLayer, name );
470 }
471
472 switch ( rampShader->colorRampType() )
473 {
475 // for interpolated shaders we use a ramp legend node unless the settings flag
476 // to use the continuous legend is not set, in that case we fall through
477 if ( ! rampShader->legendSettings() || rampShader->legendSettings()->useContinuousLegend() )
478 {
479 if ( !rampShader->colorRampItemList().isEmpty() )
480 {
481 res << new QgsColorRampLegendNode( nodeLayer, rampShader->createColorRamp(),
482 rampShader->legendSettings() ? *rampShader->legendSettings() : QgsColorRampLegendNodeSettings(),
483 rampShader->minimumValue(), rampShader->maximumValue() );
484 }
485 break;
486 }
487 [[fallthrough]];
490 {
491 // for all others we use itemised lists
492 const QList< QPair< QString, QColor > > items = legendSymbologyItems();
493 res.reserve( items.size() );
494 for ( const QPair< QString, QColor > &item : items )
495 {
496 res << new QgsRasterSymbolLegendNode( nodeLayer, item.second, item.first );
497 }
498 break;
499 }
500 }
501 return res;
502}
503
508
509bool QgsSingleBandPseudoColorRenderer::refresh( const QgsRectangle &extent, const QList<double> &min, const QList<double> &max, bool force )
510{
511 if ( !needsRefresh( extent ) && !force )
512 {
513 return false;
514 }
515
516 bool refreshed = false;
517 if ( min.size() >= 1 && max.size() >= 1 )
518 {
520
521 // Do not overwrite min/max with NaN if they were already set,
522 // for example when the style was already loaded from a raster attribute table
523 // in that case we need to respect the style from the attribute table and do
524 // not perform any reclassification.
525 bool refreshed = false;
526
527 if ( !std::isnan( min[0] ) )
528 {
529 setClassificationMin( min[0] );
530 refreshed = true;
531 }
532
533 if ( !std::isnan( max[0] ) )
534 {
535 setClassificationMax( max[0] );
536 refreshed = true;
537 }
538
539 QgsColorRampShader *rampShader = dynamic_cast<QgsColorRampShader *>( mShader->rasterShaderFunction() );
540 if ( rampShader && refreshed )
541 {
542 rampShader->classifyColorRamp( mBand, extent, input() );
543 }
544 }
545
546 return refreshed;
547}
548
QFlags< RasterRendererFlag > RasterRendererFlags
Flags which control behavior of raster renderers.
Definition qgis.h:1570
@ CumulativeCut
Range is [ min + cumulativeCutLower() * (max - min), min + cumulativeCutUpper() * (max - min) ].
Definition qgis.h:1606
@ StdDev
Range is [ mean - stdDevFactor() * stddev, mean + stdDevFactor() * stddev ].
Definition qgis.h:1605
@ MinimumMaximum
Real min-max values.
Definition qgis.h:1604
@ NotSet
User defined.
Definition qgis.h:1603
ShaderInterpolationMethod
Color ramp shader interpolation methods.
Definition qgis.h:1483
@ Exact
Assigns the color of the exact matching value in the color ramp item list.
Definition qgis.h:1486
@ Linear
Interpolates the color between two class breaks linearly.
Definition qgis.h:1484
@ Discrete
Assigns the color of the higher class for every pixel between two class breaks.
Definition qgis.h:1485
@ InternalLayerOpacityHandling
The renderer internally handles the raster layer's opacity, so the default layer level opacity handli...
Definition qgis.h:1561
@ Exact
Exact statistics.
Definition qgis.h:1634
@ Estimated
Approximated statistics.
Definition qgis.h:1635
ShaderClassificationMethod
Color ramp shader classification methods.
Definition qgis.h:1498
@ ARGB32_Premultiplied
Color, alpha, red, green, blue, 4 bytes the same as QImage::Format_ARGB32_Premultiplied.
Definition qgis.h:394
@ WholeRaster
Whole raster is used to compute statistics.
Definition qgis.h:1619
@ FixedCanvas
Current extent of the canvas (at the time of computation) is used to compute statistics.
Definition qgis.h:1620
Settings for a color ramp legend node.
bool useContinuousLegend() const
Returns true if a continuous gradient legend will be used.
A legend node which renders a color ramp.
A ramp shader will color a raster pixel based on a list of values ranges in a ramp.
Qgis::ShaderInterpolationMethod colorRampType() const
Returns the color ramp interpolation method.
const QgsColorRampLegendNodeSettings * legendSettings() const
Returns the color ramp shader legend settings.
QList< QgsColorRampShader::ColorRampItem > colorRampItemList() const
Returns the custom color map.
void setClip(bool clip)
Sets whether the shader should not render values out of range.
QgsColorRamp * createColorRamp() const
Creates a gradient color ramp from shader settings.
void classifyColorRamp(int classes=0, int band=-1, const QgsRectangle &extent=QgsRectangle(), QgsRasterInterface *input=nullptr)
Classify color ramp shader.
Abstract base class for color ramps.
Layer tree node points to a map layer.
Feedback object tailored for raster block reading.
Raster data container.
static QString printValue(double value, bool localized=false)
Print double value with all necessary significant digits.
QgsRasterInterface(QgsRasterInterface *input=nullptr)
QString displayBandName(int bandNumber) const
Generates a friendly, descriptive name for the specified bandNumber.
QgsRasterInterface * mInput
virtual QgsRectangle extent() const
Gets the extent of the interface.
virtual QgsRasterInterface * input() const
Current input.
void setLimits(Qgis::RasterRangeLimit limits)
Sets the limits.
void setExtent(Qgis::RasterRangeExtent extent)
Sets the extent.
void setStatAccuracy(Qgis::RasterRangeAccuracy accuracy)
Sets the statistics accuracy.
QgsRasterRenderer(QgsRasterInterface *input=nullptr, const QString &type=QString())
Constructor for QgsRasterRenderer.
double mOpacity
Global alpha value (0-1).
int mAlphaBand
Read alpha value from band.
QgsRectangle mLastRectangleUsedByRefreshContrastEnhancementIfNeeded
To save computations and possible infinite cycle of notifications.
QRgb renderColorForNodataPixel() const
Returns the color for the renderer to use to represent nodata pixels.
std::unique_ptr< QgsRasterTransparency > mRasterTransparency
Raster transparency per color or value. Overwrites global alpha value.
const QgsRasterMinMaxOrigin & minMaxOrigin() const
Returns const reference to origin of min/max values.
void _writeXml(QDomDocument &doc, QDomElement &rasterRendererElem) const
Write upper class info into rasterrenderer element (called by writeXml method of subclasses).
int bandCount() const override
Gets number of bands.
QgsRasterMinMaxOrigin mMinMaxOrigin
Origin of min/max values.
bool usesTransparency() const
void copyCommonProperties(const QgsRasterRenderer *other, bool copyMinMaxOrigin=true)
Copies common properties like opacity / transparency data from other renderer.
bool needsRefresh(const QgsRectangle &extent) const
Checks if the renderer needs to be refreshed according to extent.
virtual Q_DECL_DEPRECATED void toSld(QDomDocument &doc, QDomElement &element, const QVariantMap &props=QVariantMap()) const
Used from subclasses to create SLD Rule elements following SLD v1.0 specs.
void readXml(const QDomElement &rendererElem) override
Sets base class members from xml. Usually called from create() methods of subclasses.
The raster shade function applies a shader to a pixel at render time - typically used to render grays...
virtual void legendSymbologyItems(QList< QPair< QString, QColor > > &symbolItems) const
Returns legend symbology items if provided by renderer.
double maximumValue() const
Returns the minimum value for the raster shader.
virtual bool shade(double value, int *returnRedValue, int *returnGreenValue, int *returnBlueValue, int *returnAlpha) const
Generates an new RGBA value based on one input value.
virtual void setMaximumValue(double value)
Sets the maximum value for the raster shader.
virtual void setMinimumValue(double value)
Sets the minimum value for the raster shader.
double minimumValue() const
Returns the maximum value for the raster shader.
Interface for all raster shaders.
void setRasterShaderFunction(QgsRasterShaderFunction *function)
A public method that allows the user to set their own shader function.
Implementation of legend node interface for displaying raster legend entries.
A rectangle specified with double values.
Implementation of legend node interface for displaying arbitrary labels with icons.
QgsSingleBandPseudoColorRenderer * clone() const override
Clone itself, create deep copy.
QList< QPair< QString, QColor > > legendSymbologyItems() const override
Returns symbology items if provided by renderer.
void writeXml(QDomDocument &doc, QDomElement &parentElem) const override
Write base class members to xml.
Q_DECL_DEPRECATED void setBand(int bandNo)
Sets the band used by the renderer.
void setShader(QgsRasterShader *shader)
Takes ownership of the shader.
QList< QgsLayerTreeModelLegendNode * > createLegendNodes(QgsLayerTreeLayer *nodeLayer) override
Creates a set of legend nodes representing the renderer.
QgsRasterShader * shader()
Returns the raster shader.
QList< int > usesBands() const override
Returns a list of band numbers used by the renderer.
bool refresh(const QgsRectangle &extent, const QList< double > &min, const QList< double > &max, bool forceRefresh=false) override
Refreshes the renderer according to the min and max values associated with the extent.
bool setInputBand(int band) override
Attempts to set the input band for the renderer.
QgsRasterBlock * block(int bandNo, const QgsRectangle &extent, int width, int height, QgsRasterBlockFeedback *feedback=nullptr) override
Read block of data using given extent and size.
Qgis::RasterRendererFlags flags() const override
Returns flags which dictate renderer behavior.
QgsSingleBandPseudoColorRenderer(QgsRasterInterface *input, int band=-1, QgsRasterShader *shader=nullptr)
Note: takes ownership of QgsRasterShader.
int inputBand() const override
Returns the input band for the renderer, or -1 if no input band is available.
static QgsRasterRenderer * create(const QDomElement &elem, QgsRasterInterface *input)
void createShader(QgsColorRamp *colorRamp=nullptr, Qgis::ShaderInterpolationMethod colorRampType=Qgis::ShaderInterpolationMethod::Linear, Qgis::ShaderClassificationMethod classificationMode=Qgis::ShaderClassificationMethod::Continuous, int classes=0, bool clip=false, const QgsRectangle &extent=QgsRectangle())
Creates a color ramp shader.
bool accept(QgsStyleEntityVisitorInterface *visitor) const override
Accepts the specified symbology visitor, causing it to visit all symbols associated with the renderer...
bool canCreateRasterAttributeTable() const override
Returns true if the renderer is suitable for attribute table creation.
Q_DECL_DEPRECATED int band() const
Returns the band used by the renderer.
Q_DECL_DEPRECATED void toSld(QDomDocument &doc, QDomElement &element, const QVariantMap &props=QVariantMap()) const override
Used from subclasses to create SLD Rule elements following SLD v1.0 specs.
Holds SLD export options and other information related to SLD export of a QGIS layer style.
void setExtraProperties(const QVariantMap &properties)
Sets the open ended set of properties that can drive/inform the SLD encoding.
A color ramp entity for QgsStyle databases.
Definition qgsstyle.h:1430
An interface for classes which can visit style entity (e.g.
virtual bool visit(const QgsStyleEntityVisitorInterface::StyleLeaf &entity)
Called when the visitor will visit a style entity.
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...
Definition qgis.h:7423
#define QgsDebugError(str)
Definition qgslogger.h:59
Contains information relating to the style entity currently being visited.