30#include <QDomDocument>
36#include <QRegularExpression>
39const int QgsPalettedRasterRenderer::MAX_FLOAT_CLASSES = 65536;
46 QHash<QString, QHash<QColor, QVector<QVariant>>> classData;
48 classData.reserve(
classes.size() );
50 QVector<QString> labels;
51 labels.reserve(
classes.size() );
55 if ( !classData.contains( klass.label ) )
57 labels.push_back( klass.label );
59 classData[klass.label][klass.color].push_back( klass.value );
62 mMultiValueClassData.reserve( classData.size() );
64 for (
auto labelIt = labels.constBegin(); labelIt != labels.constEnd(); ++labelIt )
66 for (
auto colorIt = classData[*labelIt].constBegin(); colorIt != classData[*labelIt].constEnd(); ++colorIt )
68 mMultiValueClassData.push_back(
MultiValueClass{ colorIt.value(), colorIt.key(), *labelIt } );
78 , mMultiValueClassData( classes )
86 auto renderer = std::make_unique< QgsPalettedRasterRenderer >(
nullptr, mBand, mMultiValueClassData );
88 if ( mSourceColorRamp )
89 renderer->setSourceColorRamp( mSourceColorRamp->clone() );
91 renderer->copyCommonProperties(
this );
93 return renderer.release();
108 const int bandNumber = elem.attribute( QStringLiteral(
"band" ), QStringLiteral(
"-1" ) ).toInt();
111 const QDomElement paletteElem = elem.firstChildElement( QStringLiteral(
"colorPalette" ) );
112 if ( !paletteElem.isNull() )
114 const QDomNodeList paletteEntries = paletteElem.elementsByTagName( QStringLiteral(
"paletteEntry" ) );
116 QDomElement entryElem;
119 for (
int i = 0; i < paletteEntries.size(); ++i )
123 entryElem = paletteEntries.at( i ).toElement();
124 value = entryElem.attribute( QStringLiteral(
"value" ), QStringLiteral(
"0" ) ).toDouble();
125 color = QColor( entryElem.attribute( QStringLiteral(
"color" ), QStringLiteral(
"#000000" ) ) );
126 color.setAlpha( entryElem.attribute( QStringLiteral(
"alpha" ), QStringLiteral(
"255" ) ).toInt() );
127 label = entryElem.attribute( QStringLiteral(
"label" ) );
128 QgsDebugMsgLevel( QStringLiteral(
"Value: %1, label: %2, color: %3" ).arg( value ).arg(
label, entryElem.attribute( QStringLiteral(
"color" ) ) ), 4 );
137 QDomElement sourceColorRampElem = elem.firstChildElement( QStringLiteral(
"colorramp" ) );
138 if ( !sourceColorRampElem.isNull() && sourceColorRampElem.attribute( QStringLiteral(
"name" ) ) == QLatin1String(
"[source]" ) )
153 return mMultiValueClassData;
158 mMultiValueClassData =
classes;
164 if ( ! mMultiValueClassData.isEmpty() )
166 const auto constMClassData = mMultiValueClassData;
169 if (
c.values.contains( idx ) )
179 MultiValueClassData::iterator cMvIt = mMultiValueClassData.begin();
180 for ( ; cMvIt != mMultiValueClassData.end(); ++cMvIt )
182 if ( cMvIt->values.contains( idx ) )
184 cMvIt->label =
label;
212 auto outputBlock = std::make_unique<QgsRasterBlock>();
213 if ( !
mInput || mMultiValueClassData.isEmpty() )
215 return outputBlock.release();
218 const std::shared_ptr< QgsRasterBlock > inputBlock(
mInput->
block( mBand,
extent, width, height, feedback ) );
220 if ( !inputBlock || inputBlock->isEmpty() )
223 return outputBlock.release();
229 std::shared_ptr< QgsRasterBlock > alphaBlock;
234 if ( !alphaBlock || alphaBlock->isEmpty() )
236 return outputBlock.release();
241 alphaBlock = inputBlock;
246 return outputBlock.release();
253 Q_ASSERT( outputBlock );
254 unsigned int *outputData = (
unsigned int * )( outputBlock->bits() );
257 bool isNoData =
false;
258 for (
qgssize i = 0; i < rasterSize; ++i )
260 const double value = inputBlock->valueAndNoData( i, isNoData );
263 outputData[i] = myDefaultColor;
266 if ( !mColors.contains( value ) )
268 outputData[i] = myDefaultColor;
272 if ( !hasTransparency )
274 outputData[i] = mColors.value( value );
285 const double alpha = alphaBlock->value( i );
288 outputBlock->setColor( i, myDefaultColor );
293 currentOpacity *= alpha / 255.0;
297 const QRgb
c = mColors.value( value );
298 outputData[i] = qRgba( currentOpacity * qRed(
c ), currentOpacity * qGreen(
c ), currentOpacity * qBlue(
c ), currentOpacity * qAlpha(
c ) );
302 return outputBlock.release();
307 return mMultiValueClassData.size();
312 if ( parentElem.isNull() )
317 QDomElement rasterRendererElem = doc.createElement( QStringLiteral(
"rasterrenderer" ) );
320 rasterRendererElem.setAttribute( QStringLiteral(
"band" ), mBand );
321 QDomElement colorPaletteElem = doc.createElement( QStringLiteral(
"colorPalette" ) );
322 const ClassData klassData { classData() };
323 ClassData::const_iterator it = klassData.constBegin();
324 for ( ; it != klassData.constEnd(); ++it )
326 const QColor color = it->color;
327 QDomElement colorElem = doc.createElement( QStringLiteral(
"paletteEntry" ) );
328 colorElem.setAttribute( QStringLiteral(
"value" ), it->value );
329 colorElem.setAttribute( QStringLiteral(
"color" ), color.name() );
330 colorElem.setAttribute( QStringLiteral(
"alpha" ), color.alpha() );
331 if ( !it->label.isEmpty() )
333 colorElem.setAttribute( QStringLiteral(
"label" ), it->label );
335 colorPaletteElem.appendChild( colorElem );
337 rasterRendererElem.appendChild( colorPaletteElem );
340 if ( mSourceColorRamp )
343 rasterRendererElem.appendChild( colorRampElem );
346 parentElem.appendChild( rasterRendererElem );
353 toSld( doc, element, context );
362 const QDomNodeList elements = element.elementsByTagName( QStringLiteral(
"sld:RasterSymbolizer" ) );
363 if ( elements.size() == 0 )
367 QDomElement rasterSymbolizerElem = elements.at( 0 ).toElement();
370 QDomElement channelSelectionElem = doc.createElement( QStringLiteral(
"sld:ChannelSelection" ) );
371 rasterSymbolizerElem.appendChild( channelSelectionElem );
374 QDomElement channelElem = doc.createElement( QStringLiteral(
"sld:GrayChannel" ) );
375 channelSelectionElem.appendChild( channelElem );
378 QDomElement sourceChannelNameElem = doc.createElement( QStringLiteral(
"sld:SourceChannelName" ) );
379 sourceChannelNameElem.appendChild( doc.createTextNode( QString::number( mBand ) ) );
380 channelElem.appendChild( sourceChannelNameElem );
383 QDomElement colorMapElem = doc.createElement( QStringLiteral(
"sld:ColorMap" ) );
384 colorMapElem.setAttribute( QStringLiteral(
"type" ), QStringLiteral(
"values" ) );
385 if ( this->
classes().size() >= 255 )
386 colorMapElem.setAttribute( QStringLiteral(
"extended" ), QStringLiteral(
"true" ) );
387 rasterSymbolizerElem.appendChild( colorMapElem );
391 const QList<QgsPalettedRasterRenderer::Class>
classes = this->
classes();
392 QList<QgsPalettedRasterRenderer::Class>::const_iterator classDataIt =
classes.constBegin();
393 for ( ; classDataIt !=
classes.constEnd(); ++classDataIt )
395 QDomElement colorMapEntryElem = doc.createElement( QStringLiteral(
"sld:ColorMapEntry" ) );
396 colorMapElem.appendChild( colorMapEntryElem );
399 colorMapEntryElem.setAttribute( QStringLiteral(
"color" ), classDataIt->color.name() );
400 colorMapEntryElem.setAttribute( QStringLiteral(
"quantity" ), QString::number( classDataIt->value ) );
401 colorMapEntryElem.setAttribute( QStringLiteral(
"label" ), classDataIt->label );
402 if ( classDataIt->color.alphaF() != 1.0 )
404 colorMapEntryElem.setAttribute( QStringLiteral(
"opacity" ), QString::number( classDataIt->color.alphaF() ) );
412 if ( mSourceColorRamp )
424 QList< QPair< QString, QColor > > symbolItems;
427 QString lab { classData.label };
431 for (
const QVariant &val : std::as_const( classData.values ) )
435 const double numericValue { val.toDouble( &ok ) };
438 values.push_back( QLocale().toString( numericValue ) );
442 values.push_back( val.toString() );
445 lab = values.join( QChar(
' ' ) );
447 symbolItems << qMakePair( lab, classData.color );
455 QList<QgsLayerTreeModelLegendNode *> res;
458 if ( !name.isEmpty() )
464 res.reserve( res.size() + items.size() );
465 for (
const QPair< QString, QColor > &item : items )
486 mSourceColorRamp.reset( ramp );
491 return mSourceColorRamp.get();
496 QList<QgsColorRampShader::ColorRampItem>::const_iterator colorIt = table.constBegin();
498 for ( ; colorIt != table.constEnd(); ++colorIt )
507 if ( ! attributeTable || ! attributeTable->
isValid() )
514 const QList<QgsRasterAttributeTable::MinMaxClass> minMaxClasses { attributeTable->
minMaxClasses( classificationColumn ) };
515 if ( minMaxClasses.empty() )
520 QVector<QVariant> values;
521 for (
const double val : std::as_const( minMaxClass.minMaxValues ) )
523 values.push_back( QVariant( val ) );
525 classData.push_back( { values, minMaxClass.color, minMaxClass.name } );
528 int numClasses {
static_cast<int>( classData.count( ) ) };
531 if ( ramp && numClasses > 0 )
539 randomRamp->setTotalColorCount( numClasses );
542 if ( numClasses > 1 )
545 QgsPalettedRasterRenderer::MultiValueClassData::iterator cIt = classData.begin();
546 for ( ; cIt != classData.end(); ++cIt )
548 cIt->color = ramp->
color( i /
static_cast<double>( numClasses ) );
560 const thread_local QRegularExpression linePartRx( QStringLiteral(
"[\\s,:]+" ) );
562 const QStringList parts =
string.split(
'\n', Qt::SkipEmptyParts );
563 for (
const QString &part : parts )
565 const QStringList lineParts = part.split( linePartRx, Qt::SkipEmptyParts );
567 switch ( lineParts.count() )
571 const int value = lineParts.at( 0 ).toInt( &ok );
581 const int value = lineParts.at( 0 ).toInt( &ok );
585 const QColor
c( lineParts.at( 1 ) );
593 if ( lineParts.count() < 4 )
596 const int value = lineParts.at( 0 ).toInt( &ok );
601 const double r = lineParts.at( 1 ).toDouble( &rOk );
603 const double g = lineParts.at( 2 ).toDouble( &gOk );
605 const double b = lineParts.at( 3 ).toDouble( &bOk );
608 if ( rOk && gOk && bOk )
610 c = QColor( r, g, b );
613 if ( lineParts.count() >= 5 )
615 const double alpha = lineParts.at( 4 ).toDouble( &ok );
621 if ( lineParts.count() > 5 )
623 label = lineParts.mid( 5 ).join(
' ' );
637 QFile inputFile( path );
639 if ( inputFile.open( QIODevice::ReadOnly ) )
641 QTextStream in( &inputFile );
642 input = in.readAll();
653 std::sort( cd.begin(), cd.end(), [](
const Class & a,
const Class & b ) ->
bool
655 return a.value < b.value;
658 const auto constCd = cd;
659 for (
const Class &
c : constCd )
661 out << QStringLiteral(
"%1 %2 %3 %4 %5 %6" ).arg(
c.value ).arg(
c.color.red() )
662 .arg(
c.color.green() ).arg(
c.color.blue() ).arg(
c.color.alpha() ).arg(
c.label );
664 return out.join(
'\n' );
674 if ( bandNumber > 0 && bandNumber <= raster->
bandCount() )
676 qlonglong numClasses = 0;
690 std::set<double> values;
698 const int nbBlocksWidth =
static_cast< int >( std::ceil( 1.0 * raster->
xSize() / maxWidth ) );
699 const int nbBlocksHeight =
static_cast< int >( std::ceil( 1.0 * raster->
ySize() / maxHeight ) );
700 const int nbBlocks = nbBlocksWidth * nbBlocksHeight;
706 std::unique_ptr< QgsRasterBlock > rasterBlock;
708 bool isNoData =
false;
709 while ( iter.
readNextRasterPart( bandNumber, iterCols, iterRows, rasterBlock, iterLeft, iterTop, &blockExtent ) )
712 feedback->
setProgress( 100 * ( ( iterTop / maxHeight * nbBlocksWidth ) + iterLeft / maxWidth ) / nbBlocks );
717 for (
int row = 0; row < iterRows; row++ )
722 for (
int column = 0; column < iterCols; column++ )
727 const double currentValue = rasterBlock->valueAndNoData( row, column, isNoData );
728 if ( numClasses >= MAX_FLOAT_CLASSES )
730 QgsMessageLog::logMessage( QStringLiteral(
"Number of classes exceeded maximum (%1)." ).arg( MAX_FLOAT_CLASSES ), QStringLiteral(
"Raster" ) );
733 if ( !isNoData && values.find( currentValue ) == values.end() )
735 values.insert( currentValue );
736 data.push_back(
Class( currentValue, QColor(), QLocale().toString( currentValue ) ) );
743 std::sort( data.begin(), data.end(), [](
const Class & a,
const Class & b ) ->
bool
745 return a.value < b.value;
758 const int bins = std::ceil( max - min ) + 1;
776 data <<
Class( currentValue, QColor(), QLocale().toString( currentValue ) );
779 currentValue += interval;
790 if ( ramp && numClasses > 0 )
798 randomRamp->setTotalColorCount( data.count() );
801 if ( numClasses > 1 )
804 QgsPalettedRasterRenderer::ClassData::iterator cIt = data.begin();
805 for ( ; cIt != data.end(); ++cIt )
810 feedback->
setProgress( std::max<int>( 1, 100 * ( i + 1 ) / numClasses ) );
812 cIt->color = ramp->
color( i /
static_cast<double>( numClasses ) );
823 for (
const MultiValueClass &klass : std::as_const( mMultiValueClassData ) )
825 for (
const QVariant &entry : std::as_const( klass.values ) )
828 const double value { entry.toDouble( &ok )};
831 data.push_back( { value, klass.color, klass.label } );
835 QgsDebugMsgLevel( QStringLiteral(
"Could not convert class value '%1' to double when creating classes." ).arg( entry.toString() ), 2 );
842void QgsPalettedRasterRenderer::updateArrays()
846 MultiValueClassData::const_iterator it = mMultiValueClassData.constBegin();
847 for ( ; it != mMultiValueClassData.constEnd(); ++it )
849 for (
const QVariant &entry : std::as_const( it->values ) )
852 const double value { entry.toDouble( &ok )};
855 mColors[value] = qPremultiply( it->color.rgba() );
859 QgsDebugMsgLevel( QStringLiteral(
"Could not convert class value '%1' to double for color lookup." ).arg( entry.toString() ), 2 );
QFlags< RasterRendererFlag > RasterRendererFlags
Flags which control behavior of raster renderers.
@ InternalLayerOpacityHandling
The renderer internally handles the raster layer's opacity, so the default layer level opacity handli...
@ Float32
Thirty two bit floating point (float)
@ ARGB32_Premultiplied
Color, alpha, red, green, blue, 4 bytes the same as QImage::Format_ARGB32_Premultiplied.
@ Float64
Sixty four bit floating point (double)
Abstract base class for color ramps.
virtual QColor color(double value) const =0
Returns the color corresponding to a specified value.
bool isCanceled() const
Tells whether the operation has been canceled already.
void setProgress(double progress)
Sets the current progress for the feedback object.
Layer tree node points to a map layer.
static void logMessage(const QString &message, const QString &tag=QString(), Qgis::MessageLevel level=Qgis::MessageLevel::Warning, bool notifyUser=true, const char *file=__builtin_FILE(), const char *function=__builtin_FUNCTION(), int line=__builtin_LINE())
Adds a message to the log instance (and creates it if necessary).
Properties of a multi value class: a class that contains multiple values.
MultiValueClass(const QVector< QVariant > &values, const QColor &color=QColor(), const QString &label=QString())
Constructor for MultiValueClass from a list of values.
Renderer for paletted raster images.
QgsRasterBlock * block(int bandNo, const QgsRectangle &extent, int width, int height, QgsRasterBlockFeedback *feedback=nullptr) override
Read block of data using given extent and size.
QList< QgsLayerTreeModelLegendNode * > createLegendNodes(QgsLayerTreeLayer *nodeLayer) override
Creates a set of legend nodes representing the renderer.
static QgsPalettedRasterRenderer::MultiValueClassData rasterAttributeTableToClassData(const QgsRasterAttributeTable *attributeTable, int classificationColumn=-1, QgsColorRamp *ramp=nullptr)
Reads and returns classes from the Raster Attribute Table attributeTable, optionally classifying the ...
QgsColorRamp * sourceColorRamp() const
Gets the source color ramp.
static QgsPalettedRasterRenderer::ClassData classDataFromString(const QString &string)
Converts a string containing a color table or class data to to paletted renderer class data.
QString label(double idx) const
Returns optional category label.
void setSourceColorRamp(QgsColorRamp *ramp)
Set the source color ramp.
QList< int > usesBands() const override
Returns a list of band numbers used by the renderer.
bool canCreateRasterAttributeTable() const override
Returns true if the renderer is suitable for attribute table creation.
void writeXml(QDomDocument &doc, QDomElement &parentElem) const override
Write base class members to xml.
Q_DECL_DEPRECATED int band() const
Returns the raster band used for rendering the raster.
QList< QgsPalettedRasterRenderer::Class > ClassData
Map of value to class properties.
bool accept(QgsStyleEntityVisitorInterface *visitor) const override
Accepts the specified symbology visitor, causing it to visit all symbols associated with the renderer...
Qgis::RasterRendererFlags flags() const override
Returns flags which dictate renderer behavior.
int nColors() const
Returns number of colors.
QList< QgsPalettedRasterRenderer::MultiValueClass > MultiValueClassData
Map of multi value to class properties.
static QgsPalettedRasterRenderer::ClassData classDataFromFile(const QString &path)
Opens a color table file and returns corresponding paletted renderer class data.
bool setInputBand(int band) override
Attempts to set the input band for the renderer.
static QgsRasterRenderer * create(const QDomElement &elem, QgsRasterInterface *input)
void setMultiValueClasses(const MultiValueClassData &classes)
Sets the multi value classes to setMultiValueClasses.
static QgsPalettedRasterRenderer::ClassData colorTableToClassData(const QList< QgsColorRampShader::ColorRampItem > &table)
Converts a raster color table to paletted renderer class data.
ClassData classes() const
Returns a map of value to classes (colors) used by the renderer.
QList< QPair< QString, QColor > > legendSymbologyItems() const override
Returns symbology items if provided by renderer.
QgsPalettedRasterRenderer * clone() const override
Clone itself, create deep copy.
void setLabel(double idx, const QString &label)
Set category label.
static QgsPalettedRasterRenderer::ClassData classDataFromRaster(QgsRasterInterface *raster, int bandNumber, QgsColorRamp *ramp=nullptr, QgsRasterBlockFeedback *feedback=nullptr)
Generates class data from a raster, for the specified bandNumber.
int inputBand() const override
Returns the input band for the renderer, or -1 if no input band is available.
static QString classDataToString(const QgsPalettedRasterRenderer::ClassData &classes)
Converts classes to a string representation, using the .clr/gdal color table file format.
MultiValueClassData multiValueClasses() const
Returns a map of multi value to classes (colors) 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.
QgsPalettedRasterRenderer(QgsRasterInterface *input, int bandNumber, const ClassData &classes)
Constructor for QgsPalettedRasterRenderer.
A color ramp consisting of random colors, constrained within component ranges.
The Field class represents a Raster Attribute Table classification entry for a thematic Raster Attrib...
Represents a Raster Attribute Table (RAT).
QList< QgsRasterAttributeTable::MinMaxClass > minMaxClasses(const int classificationColumn=-1) const
Returns the classes for a thematic Raster Attribute Table, classified by classificationColumn,...
bool isValid(QString *errorMessage=nullptr) const
Returns true if the Raster Attribute Table is valid, optionally reporting validity checks results in ...
The RasterBandStats struct is a container for statistics about a single raster band.
double minimumValue
The minimum cell value in the raster band.
double maximumValue
The maximum cell value in the raster band.
Feedback object tailored for raster block reading.
A container for a histogram of a single raster band.
double minimum
The minimum histogram value.
double maximum
The maximum histogram value.
QgsRasterHistogram::HistogramVector histogramVector
Stores the histogram for a given layer.
bool valid
Histogram is valid.
int binCount
Number of bins (intervals,buckets) in histogram.
Base class for processing filters like renderers, reprojector, resampler etc.
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.
virtual Qgis::DataType dataType(int bandNo) const =0
Returns data type for the band specified by number.
virtual int xSize() const
Gets raster size.
Q_DECL_DEPRECATED QgsRasterBandStats bandStatistics(int bandNo, int stats, const QgsRectangle &extent=QgsRectangle(), int sampleSize=0, QgsRasterBlockFeedback *feedback=nullptr)
Returns the band statistics.
QString displayBandName(int bandNumber) const
Generates a friendly, descriptive name for the specified bandNumber.
QgsRasterInterface * mInput
virtual int ySize() const
virtual QgsRectangle extent() const
Gets the extent of the interface.
virtual QgsRasterInterface * input() const
Current input.
virtual QgsRasterHistogram histogram(int bandNo, int binCount=0, double minimum=std::numeric_limits< double >::quiet_NaN(), double maximum=std::numeric_limits< double >::quiet_NaN(), const QgsRectangle &extent=QgsRectangle(), int sampleSize=0, bool includeOutOfRange=false, QgsRasterBlockFeedback *feedback=nullptr)
Returns a band histogram.
Iterator for sequentially processing raster cells.
static const int DEFAULT_MAXIMUM_TILE_WIDTH
Default maximum tile width.
bool readNextRasterPart(int bandNumber, int &nCols, int &nRows, QgsRasterBlock **block, int &topLeftCol, int &topLeftRow)
Fetches next part of raster data, caller takes ownership of the block and caller should delete the bl...
static const int DEFAULT_MAXIMUM_TILE_HEIGHT
Default maximum tile height.
void startRasterRead(int bandNumber, qgssize nCols, qgssize nRows, const QgsRectangle &extent, QgsRasterBlockFeedback *feedback=nullptr)
Start reading of raster band.
Raster renderer pipe that applies colors to a raster.
double mOpacity
Global alpha value (0-1)
int mAlphaBand
Read alpha value from band.
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.
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.
bool usesTransparency() const
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.
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.
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.
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.
static std::unique_ptr< QgsColorRamp > loadColorRamp(QDomElement &element)
Creates a color ramp from the settings encoded in an XML element.
static QDomElement saveColorRamp(const QString &name, const QgsColorRamp *ramp, QDomDocument &doc)
Encodes a color ramp's settings to an XML element.
As part of the API refactoring and improvements which landed in the Processing API was substantially reworked from the x version This was done in order to allow much of the underlying Processing framework to be ported into c
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...
#define QgsDebugMsgLevel(str, level)
#define QgsDebugError(str)
Properties of a single value class.
Contains information relating to the style entity currently being visited.