29#include <QDomDocument>
35#include <QRegularExpression>
38const int QgsPalettedRasterRenderer::MAX_FLOAT_CLASSES = 65536;
45 QHash<QString, QHash<QColor, QVector<QVariant>>> classData;
47 classData.reserve(
classes.size() );
49 QVector<QString> labels;
50 labels.reserve(
classes.size() );
54 if ( !classData.contains( klass.label ) )
56 labels.push_back( klass.label );
58 classData[klass.label][klass.color].push_back( klass.value );
61 mMultiValueClassData.reserve( classData.size() );
63 for (
auto labelIt = labels.constBegin(); labelIt != labels.constEnd(); ++labelIt )
65 for (
auto colorIt = classData[*labelIt].constBegin(); colorIt != classData[*labelIt].constEnd(); ++colorIt )
67 mMultiValueClassData.push_back(
MultiValueClass{ colorIt.value(), colorIt.key(), *labelIt } );
77 , mMultiValueClassData( classes )
85 std::unique_ptr< QgsPalettedRasterRenderer > renderer = std::make_unique< QgsPalettedRasterRenderer >(
nullptr, mBand, mMultiValueClassData );
87 if ( mSourceColorRamp )
88 renderer->setSourceColorRamp( mSourceColorRamp->clone() );
90 renderer->copyCommonProperties(
this );
92 return renderer.release();
107 const int bandNumber = elem.attribute( QStringLiteral(
"band" ), QStringLiteral(
"-1" ) ).toInt();
110 const QDomElement paletteElem = elem.firstChildElement( QStringLiteral(
"colorPalette" ) );
111 if ( !paletteElem.isNull() )
113 const QDomNodeList paletteEntries = paletteElem.elementsByTagName( QStringLiteral(
"paletteEntry" ) );
115 QDomElement entryElem;
118 for (
int i = 0; i < paletteEntries.size(); ++i )
122 entryElem = paletteEntries.at( i ).toElement();
123 value = entryElem.attribute( QStringLiteral(
"value" ), QStringLiteral(
"0" ) ).toDouble();
124 color = QColor( entryElem.attribute( QStringLiteral(
"color" ), QStringLiteral(
"#000000" ) ) );
125 color.setAlpha( entryElem.attribute( QStringLiteral(
"alpha" ), QStringLiteral(
"255" ) ).toInt() );
126 label = entryElem.attribute( QStringLiteral(
"label" ) );
127 QgsDebugMsgLevel( QStringLiteral(
"Value: %1, label: %2, color: %3" ).arg( value ).arg(
label, entryElem.attribute( QStringLiteral(
"color" ) ) ), 4 );
136 QDomElement sourceColorRampElem = elem.firstChildElement( QStringLiteral(
"colorramp" ) );
137 if ( !sourceColorRampElem.isNull() && sourceColorRampElem.attribute( QStringLiteral(
"name" ) ) == QLatin1String(
"[source]" ) )
152 return mMultiValueClassData;
157 mMultiValueClassData =
classes;
163 if ( ! mMultiValueClassData.isEmpty() )
165 const auto constMClassData = mMultiValueClassData;
168 if (
c.values.contains( idx ) )
178 MultiValueClassData::iterator cMvIt = mMultiValueClassData.begin();
179 for ( ; cMvIt != mMultiValueClassData.end(); ++cMvIt )
181 if ( cMvIt->values.contains( idx ) )
183 cMvIt->label =
label;
211 std::unique_ptr< QgsRasterBlock > outputBlock(
new QgsRasterBlock() );
212 if ( !
mInput || mMultiValueClassData.isEmpty() )
214 return outputBlock.release();
217 const std::shared_ptr< QgsRasterBlock > inputBlock(
mInput->
block( mBand,
extent, width, height, feedback ) );
219 if ( !inputBlock || inputBlock->isEmpty() )
222 return outputBlock.release();
228 std::shared_ptr< QgsRasterBlock > alphaBlock;
233 if ( !alphaBlock || alphaBlock->isEmpty() )
235 return outputBlock.release();
240 alphaBlock = inputBlock;
245 return outputBlock.release();
252 Q_ASSERT( outputBlock );
253 unsigned int *outputData = (
unsigned int * )( outputBlock->bits() );
256 bool isNoData =
false;
257 for (
qgssize i = 0; i < rasterSize; ++i )
259 const double value = inputBlock->valueAndNoData( i, isNoData );
262 outputData[i] = myDefaultColor;
265 if ( !mColors.contains( value ) )
267 outputData[i] = myDefaultColor;
271 if ( !hasTransparency )
273 outputData[i] = mColors.value( value );
284 const double alpha = alphaBlock->value( i );
287 outputBlock->setColor( i, myDefaultColor );
292 currentOpacity *= alpha / 255.0;
296 const QRgb
c = mColors.value( value );
297 outputData[i] = qRgba( currentOpacity * qRed(
c ), currentOpacity * qGreen(
c ), currentOpacity * qBlue(
c ), currentOpacity * qAlpha(
c ) );
301 return outputBlock.release();
306 return mMultiValueClassData.size();
311 if ( parentElem.isNull() )
316 QDomElement rasterRendererElem = doc.createElement( QStringLiteral(
"rasterrenderer" ) );
319 rasterRendererElem.setAttribute( QStringLiteral(
"band" ), mBand );
320 QDomElement colorPaletteElem = doc.createElement( QStringLiteral(
"colorPalette" ) );
321 const ClassData klassData { classData() };
322 ClassData::const_iterator it = klassData.constBegin();
323 for ( ; it != klassData.constEnd(); ++it )
325 const QColor color = it->color;
326 QDomElement colorElem = doc.createElement( QStringLiteral(
"paletteEntry" ) );
327 colorElem.setAttribute( QStringLiteral(
"value" ), it->value );
328 colorElem.setAttribute( QStringLiteral(
"color" ), color.name() );
329 colorElem.setAttribute( QStringLiteral(
"alpha" ), color.alpha() );
330 if ( !it->label.isEmpty() )
332 colorElem.setAttribute( QStringLiteral(
"label" ), it->label );
334 colorPaletteElem.appendChild( colorElem );
336 rasterRendererElem.appendChild( colorPaletteElem );
339 if ( mSourceColorRamp )
342 rasterRendererElem.appendChild( colorRampElem );
345 parentElem.appendChild( rasterRendererElem );
354 const QDomNodeList elements = element.elementsByTagName( QStringLiteral(
"sld:RasterSymbolizer" ) );
355 if ( elements.size() == 0 )
359 QDomElement rasterSymbolizerElem = elements.at( 0 ).toElement();
362 QDomElement channelSelectionElem = doc.createElement( QStringLiteral(
"sld:ChannelSelection" ) );
363 rasterSymbolizerElem.appendChild( channelSelectionElem );
366 QDomElement channelElem = doc.createElement( QStringLiteral(
"sld:GrayChannel" ) );
367 channelSelectionElem.appendChild( channelElem );
370 QDomElement sourceChannelNameElem = doc.createElement( QStringLiteral(
"sld:SourceChannelName" ) );
371 sourceChannelNameElem.appendChild( doc.createTextNode( QString::number( mBand ) ) );
372 channelElem.appendChild( sourceChannelNameElem );
375 QDomElement colorMapElem = doc.createElement( QStringLiteral(
"sld:ColorMap" ) );
376 colorMapElem.setAttribute( QStringLiteral(
"type" ), QStringLiteral(
"values" ) );
377 if ( this->
classes().size() >= 255 )
378 colorMapElem.setAttribute( QStringLiteral(
"extended" ), QStringLiteral(
"true" ) );
379 rasterSymbolizerElem.appendChild( colorMapElem );
383 const QList<QgsPalettedRasterRenderer::Class>
classes = this->
classes();
384 QList<QgsPalettedRasterRenderer::Class>::const_iterator classDataIt =
classes.constBegin();
385 for ( ; classDataIt !=
classes.constEnd(); ++classDataIt )
387 QDomElement colorMapEntryElem = doc.createElement( QStringLiteral(
"sld:ColorMapEntry" ) );
388 colorMapElem.appendChild( colorMapEntryElem );
391 colorMapEntryElem.setAttribute( QStringLiteral(
"color" ), classDataIt->color.name() );
392 colorMapEntryElem.setAttribute( QStringLiteral(
"quantity" ), QString::number( classDataIt->value ) );
393 colorMapEntryElem.setAttribute( QStringLiteral(
"label" ), classDataIt->label );
394 if ( classDataIt->color.alphaF() != 1.0 )
396 colorMapEntryElem.setAttribute( QStringLiteral(
"opacity" ), QString::number( classDataIt->color.alphaF() ) );
403 if ( mSourceColorRamp )
415 QList< QPair< QString, QColor > > symbolItems;
418 QString lab { classData.label };
422 for (
const QVariant &val : std::as_const( classData.values ) )
426 const double numericValue { val.toDouble( &ok ) };
429 values.push_back( QLocale().toString( numericValue ) );
433 values.push_back( val.toString() );
436 lab = values.join( QChar(
' ' ) );
438 symbolItems << qMakePair( lab, classData.color );
446 QList<QgsLayerTreeModelLegendNode *> res;
449 if ( !name.isEmpty() )
455 res.reserve( res.size() + items.size() );
456 for (
const QPair< QString, QColor > &item : items )
477 mSourceColorRamp.reset( ramp );
482 return mSourceColorRamp.get();
487 QList<QgsColorRampShader::ColorRampItem>::const_iterator colorIt = table.constBegin();
489 for ( ; colorIt != table.constEnd(); ++colorIt )
498 if ( ! attributeTable || ! attributeTable->
isValid() )
505 const QList<QgsRasterAttributeTable::MinMaxClass> minMaxClasses { attributeTable->
minMaxClasses( classificationColumn ) };
506 if ( minMaxClasses.empty() )
511 QVector<QVariant> values;
512 for (
const double val : std::as_const( minMaxClass.minMaxValues ) )
514 values.push_back( QVariant( val ) );
516 classData.push_back( { values, minMaxClass.color, minMaxClass.name } );
519 int numClasses {
static_cast<int>( classData.count( ) ) };
522 if ( ramp && numClasses > 0 )
530 randomRamp->setTotalColorCount( numClasses );
533 if ( numClasses > 1 )
536 QgsPalettedRasterRenderer::MultiValueClassData::iterator cIt = classData.begin();
537 for ( ; cIt != classData.end(); ++cIt )
539 cIt->color = ramp->
color( i /
static_cast<double>( numClasses ) );
551 const thread_local QRegularExpression linePartRx( QStringLiteral(
"[\\s,:]+" ) );
553 const QStringList parts =
string.split(
'\n', Qt::SkipEmptyParts );
554 for (
const QString &part : parts )
556 const QStringList lineParts = part.split( linePartRx, Qt::SkipEmptyParts );
558 switch ( lineParts.count() )
562 const int value = lineParts.at( 0 ).toInt( &ok );
572 const int value = lineParts.at( 0 ).toInt( &ok );
576 const QColor
c( lineParts.at( 1 ) );
584 if ( lineParts.count() < 4 )
587 const int value = lineParts.at( 0 ).toInt( &ok );
592 const double r = lineParts.at( 1 ).toDouble( &rOk );
594 const double g = lineParts.at( 2 ).toDouble( &gOk );
596 const double b = lineParts.at( 3 ).toDouble( &bOk );
599 if ( rOk && gOk && bOk )
601 c = QColor( r, g, b );
604 if ( lineParts.count() >= 5 )
606 const double alpha = lineParts.at( 4 ).toDouble( &ok );
612 if ( lineParts.count() > 5 )
614 label = lineParts.mid( 5 ).join(
' ' );
628 QFile inputFile( path );
630 if ( inputFile.open( QIODevice::ReadOnly ) )
632 QTextStream in( &inputFile );
633 input = in.readAll();
644 std::sort( cd.begin(), cd.end(), [](
const Class & a,
const Class & b ) ->
bool
646 return a.value < b.value;
649 const auto constCd = cd;
650 for (
const Class &
c : constCd )
652 out << QStringLiteral(
"%1 %2 %3 %4 %5 %6" ).arg(
c.value ).arg(
c.color.red() )
653 .arg(
c.color.green() ).arg(
c.color.blue() ).arg(
c.color.alpha() ).arg(
c.label );
655 return out.join(
'\n' );
665 if ( bandNumber > 0 && bandNumber <= raster->
bandCount() )
667 qlonglong numClasses = 0;
681 std::set<double> values;
689 const int nbBlocksWidth =
static_cast< int >( std::ceil( 1.0 * raster->
xSize() / maxWidth ) );
690 const int nbBlocksHeight =
static_cast< int >( std::ceil( 1.0 * raster->
ySize() / maxHeight ) );
691 const int nbBlocks = nbBlocksWidth * nbBlocksHeight;
697 std::unique_ptr< QgsRasterBlock > rasterBlock;
699 bool isNoData =
false;
700 while ( iter.
readNextRasterPart( bandNumber, iterCols, iterRows, rasterBlock, iterLeft, iterTop, &blockExtent ) )
703 feedback->
setProgress( 100 * ( ( iterTop / maxHeight * nbBlocksWidth ) + iterLeft / maxWidth ) / nbBlocks );
708 for (
int row = 0; row < iterRows; row++ )
713 for (
int column = 0; column < iterCols; column++ )
718 const double currentValue = rasterBlock->valueAndNoData( row, column, isNoData );
719 if ( numClasses >= MAX_FLOAT_CLASSES )
721 QgsMessageLog::logMessage( QStringLiteral(
"Number of classes exceeded maximum (%1)." ).arg( MAX_FLOAT_CLASSES ), QStringLiteral(
"Raster" ) );
724 if ( !isNoData && values.find( currentValue ) == values.end() )
726 values.insert( currentValue );
727 data.push_back(
Class( currentValue, QColor(), QLocale().toString( currentValue ) ) );
734 std::sort( data.begin(), data.end(), [](
const Class & a,
const Class & b ) ->
bool
736 return a.value < b.value;
749 const int bins = std::ceil( max - min ) + 1;
767 data <<
Class( currentValue, QColor(), QLocale().toString( currentValue ) );
770 currentValue += interval;
781 if ( ramp && numClasses > 0 )
789 randomRamp->setTotalColorCount( data.count() );
792 if ( numClasses > 1 )
795 QgsPalettedRasterRenderer::ClassData::iterator cIt = data.begin();
796 for ( ; cIt != data.end(); ++cIt )
801 feedback->
setProgress( std::max<int>( 1, 100 * ( i + 1 ) / numClasses ) );
803 cIt->color = ramp->
color( i /
static_cast<double>( numClasses ) );
814 for (
const MultiValueClass &klass : std::as_const( mMultiValueClassData ) )
816 for (
const QVariant &entry : std::as_const( klass.values ) )
819 const double value { entry.toDouble( &ok )};
822 data.push_back( { value, klass.color, klass.label } );
826 QgsDebugMsgLevel( QStringLiteral(
"Could not convert class value '%1' to double when creating classes." ).arg( entry.toString() ), 2 );
833void QgsPalettedRasterRenderer::updateArrays()
837 MultiValueClassData::const_iterator it = mMultiValueClassData.constBegin();
838 for ( ; it != mMultiValueClassData.constEnd(); ++it )
840 for (
const QVariant &entry : std::as_const( it->values ) )
843 const double value { entry.toDouble( &ok )};
846 mColors[value] = qPremultiply( it->color.rgba() );
850 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)
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.
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.
Totally random color ramp.
The Field class represents a Raster Attribute Table classification entry for a thematic Raster Attrib...
The QgsRasterAttributeTable class 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.
The QgsRasterHistogram is a container for 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.
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.
QgsRasterTransparency * mRasterTransparency
Raster transparency per color or value. Overwrites global alpha value.
bool usesTransparency() const
virtual 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.
double opacityForValue(double value) const
Returns the opacity (as a value from 0 to 1) for a single value pixel.
A rectangle specified with double values.
Implementation of legend node interface for displaying arbitrary label with icon.
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 QgsColorRamp * loadColorRamp(QDomElement &element)
Creates a color ramp from the settings encoded in an XML element.
static QDomElement saveColorRamp(const QString &name, 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.