34#include <QDomDocument>
37#include <QRegularExpression>
41const int QgsPalettedRasterRenderer::MAX_FLOAT_CLASSES = 65536;
48 QHash<QString, QHash<QColor, QVector<QVariant>>> classData;
50 classData.reserve(
classes.size() );
52 QVector<QString> labels;
53 labels.reserve(
classes.size() );
57 if ( !classData.contains( klass.label ) )
59 labels.push_back( klass.label );
61 classData[klass.label][klass.color].push_back( klass.value );
64 mMultiValueClassData.reserve( classData.size() );
66 for (
auto labelIt = labels.constBegin(); labelIt != labels.constEnd(); ++labelIt )
68 for ( auto colorIt = classData[*labelIt].constBegin(); colorIt != classData[*labelIt].constEnd(); ++colorIt )
70 mMultiValueClassData.push_back( MultiValueClass{ colorIt.value(), colorIt.key(), *labelIt } );
80 , mMultiValueClassData( classes )
88 auto renderer = std::make_unique< QgsPalettedRasterRenderer >(
nullptr, mBand, mMultiValueClassData );
90 if ( mSourceColorRamp )
91 renderer->setSourceColorRamp( mSourceColorRamp->clone() );
93 renderer->copyCommonProperties(
this );
95 return renderer.release();
110 const int bandNumber = elem.attribute( QStringLiteral(
"band" ), QStringLiteral(
"-1" ) ).toInt();
113 const QDomElement paletteElem = elem.firstChildElement( QStringLiteral(
"colorPalette" ) );
114 if ( !paletteElem.isNull() )
116 const QDomNodeList paletteEntries = paletteElem.elementsByTagName( QStringLiteral(
"paletteEntry" ) );
118 QDomElement entryElem;
121 for (
int i = 0; i < paletteEntries.size(); ++i )
125 entryElem = paletteEntries.at( i ).toElement();
126 value = entryElem.attribute( QStringLiteral(
"value" ), QStringLiteral(
"0" ) ).toDouble();
127 color = QColor( entryElem.attribute( QStringLiteral(
"color" ), QStringLiteral(
"#000000" ) ) );
128 color.setAlpha( entryElem.attribute( QStringLiteral(
"alpha" ), QStringLiteral(
"255" ) ).toInt() );
129 label = entryElem.attribute( QStringLiteral(
"label" ) );
130 QgsDebugMsgLevel( QStringLiteral(
"Value: %1, label: %2, color: %3" ).arg( value ).arg(
label, entryElem.attribute( QStringLiteral(
"color" ) ) ), 4 );
139 QDomElement sourceColorRampElem = elem.firstChildElement( QStringLiteral(
"colorramp" ) );
140 if ( !sourceColorRampElem.isNull() && sourceColorRampElem.attribute( QStringLiteral(
"name" ) ) == QLatin1String(
"[source]" ) )
155 return mMultiValueClassData;
160 mMultiValueClassData =
classes;
166 if ( ! mMultiValueClassData.isEmpty() )
168 const auto constMClassData = mMultiValueClassData;
171 if (
c.values.contains( idx ) )
181 MultiValueClassData::iterator cMvIt = mMultiValueClassData.begin();
182 for ( ; cMvIt != mMultiValueClassData.end(); ++cMvIt )
184 if ( cMvIt->values.contains( idx ) )
186 cMvIt->label =
label;
214 auto outputBlock = std::make_unique<QgsRasterBlock>();
215 if ( !
mInput || mMultiValueClassData.isEmpty() )
217 return outputBlock.release();
220 const std::shared_ptr< QgsRasterBlock > inputBlock(
mInput->block( mBand,
extent, width, height, feedback ) );
222 if ( !inputBlock || inputBlock->isEmpty() )
225 return outputBlock.release();
231 std::shared_ptr< QgsRasterBlock > alphaBlock;
236 if ( !alphaBlock || alphaBlock->isEmpty() )
238 return outputBlock.release();
243 alphaBlock = inputBlock;
248 return outputBlock.release();
255 Q_ASSERT( outputBlock );
256 unsigned int *outputData = (
unsigned int * )( outputBlock->bits() );
259 bool isNoData =
false;
260 for (
qgssize i = 0; i < rasterSize; ++i )
262 const double value = inputBlock->valueAndNoData( i, isNoData );
265 outputData[i] = myDefaultColor;
268 if ( !mColors.contains( value ) )
270 outputData[i] = myDefaultColor;
274 if ( !hasTransparency )
276 outputData[i] = mColors.value( value );
287 const double alpha = alphaBlock->value( i );
290 outputBlock->setColor( i, myDefaultColor );
295 currentOpacity *= alpha / 255.0;
299 const QRgb
c = mColors.value( value );
300 outputData[i] = qRgba( currentOpacity * qRed(
c ), currentOpacity * qGreen(
c ), currentOpacity * qBlue(
c ), currentOpacity * qAlpha(
c ) );
304 return outputBlock.release();
309 return mMultiValueClassData.size();
314 if ( parentElem.isNull() )
319 QDomElement rasterRendererElem = doc.createElement( QStringLiteral(
"rasterrenderer" ) );
322 rasterRendererElem.setAttribute( QStringLiteral(
"band" ), mBand );
323 QDomElement colorPaletteElem = doc.createElement( QStringLiteral(
"colorPalette" ) );
324 const ClassData klassData { classData() };
325 ClassData::const_iterator it = klassData.constBegin();
326 for ( ; it != klassData.constEnd(); ++it )
328 const QColor color = it->color;
329 QDomElement colorElem = doc.createElement( QStringLiteral(
"paletteEntry" ) );
330 colorElem.setAttribute( QStringLiteral(
"value" ), it->value );
331 colorElem.setAttribute( QStringLiteral(
"color" ), color.name() );
332 colorElem.setAttribute( QStringLiteral(
"alpha" ), color.alpha() );
333 if ( !it->label.isEmpty() )
335 colorElem.setAttribute( QStringLiteral(
"label" ), it->label );
337 colorPaletteElem.appendChild( colorElem );
339 rasterRendererElem.appendChild( colorPaletteElem );
342 if ( mSourceColorRamp )
345 rasterRendererElem.appendChild( colorRampElem );
348 parentElem.appendChild( rasterRendererElem );
355 toSld( doc, element, context );
364 const QDomNodeList elements = element.elementsByTagName( QStringLiteral(
"sld:RasterSymbolizer" ) );
365 if ( elements.size() == 0 )
369 QDomElement rasterSymbolizerElem = elements.at( 0 ).toElement();
372 QDomElement channelSelectionElem = doc.createElement( QStringLiteral(
"sld:ChannelSelection" ) );
373 rasterSymbolizerElem.appendChild( channelSelectionElem );
376 QDomElement channelElem = doc.createElement( QStringLiteral(
"sld:GrayChannel" ) );
377 channelSelectionElem.appendChild( channelElem );
380 QDomElement sourceChannelNameElem = doc.createElement( QStringLiteral(
"sld:SourceChannelName" ) );
381 sourceChannelNameElem.appendChild( doc.createTextNode( QString::number( mBand ) ) );
382 channelElem.appendChild( sourceChannelNameElem );
385 QDomElement colorMapElem = doc.createElement( QStringLiteral(
"sld:ColorMap" ) );
386 colorMapElem.setAttribute( QStringLiteral(
"type" ), QStringLiteral(
"values" ) );
387 if ( this->
classes().size() >= 255 )
388 colorMapElem.setAttribute( QStringLiteral(
"extended" ), QStringLiteral(
"true" ) );
389 rasterSymbolizerElem.appendChild( colorMapElem );
393 const QList<QgsPalettedRasterRenderer::Class>
classes = this->
classes();
394 QList<QgsPalettedRasterRenderer::Class>::const_iterator classDataIt =
classes.constBegin();
395 for ( ; classDataIt !=
classes.constEnd(); ++classDataIt )
397 QDomElement colorMapEntryElem = doc.createElement( QStringLiteral(
"sld:ColorMapEntry" ) );
398 colorMapElem.appendChild( colorMapEntryElem );
401 colorMapEntryElem.setAttribute( QStringLiteral(
"color" ), classDataIt->color.name() );
402 colorMapEntryElem.setAttribute( QStringLiteral(
"quantity" ), QString::number( classDataIt->value ) );
403 colorMapEntryElem.setAttribute( QStringLiteral(
"label" ), classDataIt->label );
404 if ( classDataIt->color.alphaF() != 1.0 )
406 colorMapEntryElem.setAttribute( QStringLiteral(
"opacity" ), QString::number( classDataIt->color.alphaF() ) );
414 if ( mSourceColorRamp )
426 QList< QPair< QString, QColor > > symbolItems;
429 QString lab { classData.label };
433 for (
const QVariant &val : std::as_const( classData.values ) )
437 const double numericValue { val.toDouble( &ok ) };
440 values.push_back( QLocale().toString( numericValue ) );
444 values.push_back( val.toString() );
447 lab = values.join( QChar(
' ' ) );
449 symbolItems << qMakePair( lab, classData.color );
457 QList<QgsLayerTreeModelLegendNode *> res;
460 if ( !name.isEmpty() )
466 res.reserve( res.size() + items.size() );
467 for (
const QPair< QString, QColor > &item : items )
488 mSourceColorRamp.reset( ramp );
493 return mSourceColorRamp.get();
498 QList<QgsColorRampShader::ColorRampItem>::const_iterator colorIt = table.constBegin();
500 for ( ; colorIt != table.constEnd(); ++colorIt )
509 if ( ! attributeTable || ! attributeTable->
isValid() )
516 const QList<QgsRasterAttributeTable::MinMaxClass> minMaxClasses { attributeTable->
minMaxClasses( classificationColumn ) };
517 if ( minMaxClasses.empty() )
522 QVector<QVariant> values;
523 for (
const double val : std::as_const( minMaxClass.minMaxValues ) )
525 values.push_back( QVariant( val ) );
527 classData.push_back( { values, minMaxClass.color, minMaxClass.name } );
530 int numClasses {
static_cast<int>( classData.count( ) ) };
533 if ( ramp && numClasses > 0 )
541 randomRamp->setTotalColorCount( numClasses );
544 if ( numClasses > 1 )
547 QgsPalettedRasterRenderer::MultiValueClassData::iterator cIt = classData.begin();
548 for ( ; cIt != classData.end(); ++cIt )
550 cIt->color = ramp->
color( i /
static_cast<double>( numClasses ) );
562 const thread_local QRegularExpression linePartRx( QStringLiteral(
"[\\s,:]+" ) );
564 const QStringList parts =
string.split(
'\n', Qt::SkipEmptyParts );
565 for (
const QString &part : parts )
567 const QStringList lineParts = part.split( linePartRx, Qt::SkipEmptyParts );
569 switch ( lineParts.count() )
573 const int value = lineParts.at( 0 ).toInt( &ok );
583 const int value = lineParts.at( 0 ).toInt( &ok );
587 const QColor
c( lineParts.at( 1 ) );
595 if ( lineParts.count() < 4 )
598 const int value = lineParts.at( 0 ).toInt( &ok );
603 const double r = lineParts.at( 1 ).toDouble( &rOk );
605 const double g = lineParts.at( 2 ).toDouble( &gOk );
607 const double b = lineParts.at( 3 ).toDouble( &bOk );
610 if ( rOk && gOk && bOk )
612 c = QColor( r, g, b );
615 if ( lineParts.count() >= 5 )
617 const double alpha = lineParts.at( 4 ).toDouble( &ok );
623 if ( lineParts.count() > 5 )
625 label = lineParts.mid( 5 ).join(
' ' );
639 QFile inputFile( path );
641 if ( inputFile.open( QIODevice::ReadOnly ) )
643 QTextStream in( &inputFile );
644 input = in.readAll();
655 std::sort( cd.begin(), cd.end(), [](
const Class & a,
const Class & b ) ->
bool
657 return a.value < b.value;
660 const auto constCd = cd;
661 for (
const Class &
c : constCd )
663 out << QStringLiteral(
"%1 %2 %3 %4 %5 %6" ).arg(
c.value ).arg(
c.color.red() )
664 .arg(
c.color.green() ).arg(
c.color.blue() ).arg(
c.color.alpha() ).arg(
c.label );
666 return out.join(
'\n' );
676 if ( bandNumber > 0 && bandNumber <= raster->
bandCount() )
678 qlonglong numClasses = 0;
692 std::set<double> values;
700 const int nbBlocksWidth =
static_cast< int >( std::ceil( 1.0 * raster->
xSize() / maxWidth ) );
701 const int nbBlocksHeight =
static_cast< int >( std::ceil( 1.0 * raster->
ySize() / maxHeight ) );
702 const int nbBlocks = nbBlocksWidth * nbBlocksHeight;
708 std::unique_ptr< QgsRasterBlock > rasterBlock;
710 bool isNoData =
false;
711 while ( iter.
readNextRasterPart( bandNumber, iterCols, iterRows, rasterBlock, iterLeft, iterTop, &blockExtent ) )
714 feedback->
setProgress( 100 * ( ( iterTop / maxHeight * nbBlocksWidth ) + iterLeft / maxWidth ) / nbBlocks );
719 for (
int row = 0; row < iterRows; row++ )
724 for (
int column = 0; column < iterCols; column++ )
729 const double currentValue = rasterBlock->valueAndNoData( row, column, isNoData );
730 if ( numClasses >= MAX_FLOAT_CLASSES )
732 QgsMessageLog::logMessage( QStringLiteral(
"Number of classes exceeded maximum (%1)." ).arg( MAX_FLOAT_CLASSES ), QStringLiteral(
"Raster" ) );
735 if ( !isNoData && values.find( currentValue ) == values.end() )
737 values.insert( currentValue );
738 data.push_back(
Class( currentValue, QColor(), QLocale().toString( currentValue ) ) );
745 std::sort( data.begin(), data.end(), [](
const Class & a,
const Class & b ) ->
bool
747 return a.value < b.value;
760 const int bins = std::ceil( max - min ) + 1;
773 for (
int idx = 0; idx <
histogram.binCount; ++idx )
775 const int count =
histogram.histogramVector.at( idx );
778 data <<
Class( currentValue, QColor(), QLocale().toString( currentValue ) );
781 currentValue += interval;
792 if ( ramp && numClasses > 0 )
800 randomRamp->setTotalColorCount( data.count() );
803 if ( numClasses > 1 )
806 QgsPalettedRasterRenderer::ClassData::iterator cIt = data.begin();
807 for ( ; cIt != data.end(); ++cIt )
812 feedback->
setProgress( std::max<int>( 1, 100 * ( i + 1 ) / numClasses ) );
814 cIt->color = ramp->
color( i /
static_cast<double>( numClasses ) );
825 for (
const MultiValueClass &klass : std::as_const( mMultiValueClassData ) )
827 for (
const QVariant &entry : std::as_const( klass.values ) )
830 const double value { entry.toDouble( &ok )};
833 data.push_back( { value, klass.color, klass.label } );
837 QgsDebugMsgLevel( QStringLiteral(
"Could not convert class value '%1' to double when creating classes." ).arg( entry.toString() ), 2 );
844void QgsPalettedRasterRenderer::updateArrays()
848 MultiValueClassData::const_iterator it = mMultiValueClassData.constBegin();
849 for ( ; it != mMultiValueClassData.constEnd(); ++it )
851 for (
const QVariant &entry : std::as_const( it->values ) )
854 const double value { entry.toDouble( &ok )};
857 mColors[value] = qPremultiply( it->color.rgba() );
861 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.
QColor color
Color to render values.
MultiValueClass(const QVector< QVariant > &values, const QColor &color=QColor(), const QString &label=QString())
Constructor for MultiValueClass from a list of values.
QVector< QVariant > values
Values.
QString label
Label for values.
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.
Base class for processing filters like renderers, reprojector, resampler etc.
virtual Qgis::DataType dataType(int bandNo) const =0
Returns data type for the band specified by number.
virtual int xSize() const
Gets raster size.
QgsRasterInterface(QgsRasterInterface *input=nullptr)
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.
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.
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.