22 #include <QDomDocument>    23 #include <QDomElement>    33   , mGreenBand( greenBand )
    34   , mBlueBand( blueBand )
    35   , mRedContrastEnhancement( redEnhancement )
    36   , mGreenContrastEnhancement( greenEnhancement )
    37   , mBlueContrastEnhancement( blueEnhancement )
    43   delete mRedContrastEnhancement;
    44   delete mGreenContrastEnhancement;
    45   delete mBlueContrastEnhancement;
    53   if ( mRedContrastEnhancement )
    57   if ( mGreenContrastEnhancement )
    61   if ( mBlueContrastEnhancement )
    71   delete mRedContrastEnhancement;
    72   mRedContrastEnhancement = ce;
    77   delete mGreenContrastEnhancement;
    78   mGreenContrastEnhancement = ce;
    83   delete mBlueContrastEnhancement;
    84   mBlueContrastEnhancement = ce;
    95   int redBand = elem.attribute( QStringLiteral( 
"redBand" ), QStringLiteral( 
"-1" ) ).toInt();
    96   int greenBand = elem.attribute( QStringLiteral( 
"greenBand" ), QStringLiteral( 
"-1" ) ).toInt();
    97   int blueBand = elem.attribute( QStringLiteral( 
"blueBand" ), QStringLiteral( 
"-1" ) ).toInt();
   101   QDomElement redContrastElem = elem.firstChildElement( QStringLiteral( 
"redContrastEnhancement" ) );
   102   if ( !redContrastElem.isNull() )
   106     redContrastEnhancement->
readXml( redContrastElem );
   110   QDomElement greenContrastElem = elem.firstChildElement( QStringLiteral( 
"greenContrastEnhancement" ) );
   111   if ( !greenContrastElem.isNull() )
   115     greenContrastEnhancement->
readXml( greenContrastElem );
   119   QDomElement blueContrastElem = elem.firstChildElement( QStringLiteral( 
"blueContrastEnhancement" ) );
   120   if ( !blueContrastElem.isNull() )
   124     blueContrastEnhancement->
readXml( blueContrastElem );
   128       greenContrastEnhancement, blueContrastEnhancement );
   136   std::unique_ptr< QgsRasterBlock > outputBlock( 
new QgsRasterBlock() );
   139     return outputBlock.release();
   144                     && mRedBand > 0 && mGreenBand > 0 && mBlueBand > 0
   145                     && 
mAlphaBand < 1 && !mRedContrastEnhancement && !mGreenContrastEnhancement && !mBlueContrastEnhancement );
   152   if ( mGreenBand > 0 )
   164     return outputBlock.release();
   172   QMap<int, QgsRasterBlock *> bandBlocks;
   174   QSet<int>::const_iterator bandIt = bands.constBegin();
   175   for ( ; bandIt != bands.constEnd(); ++bandIt )
   177     bandBlocks.insert( *bandIt, defaultPointer );
   185   bandIt = bands.constBegin();
   186   for ( ; bandIt != bands.constEnd(); ++bandIt )
   188     bandBlocks[*bandIt] = 
mInput->
block( *bandIt, extent, width, height, feedback );
   189     if ( !bandBlocks[*bandIt] )
   194       for ( ; bandIt != bands.constBegin(); --bandIt )
   196         delete bandBlocks[*bandIt];
   198       return outputBlock.release();
   204     redBlock = bandBlocks[mRedBand];
   206   if ( mGreenBand > 0 )
   208     greenBlock = bandBlocks[mGreenBand];
   212     blueBlock = bandBlocks[mBlueBand];
   221     for ( 
int i = 0; i < bandBlocks.size(); i++ )
   223       delete bandBlocks.
value( i );
   225     return outputBlock.release();
   238         outputBlock->setColor( i, myDefaultColor );
   242         int redVal = ( int )redBlock->
value( i );
   243         int greenVal = ( int )greenBlock->
value( i );
   244         int blueVal = ( int )blueBlock->
value( i );
   245         outputBlock->setColor( i, qRgba( redVal, greenVal, blueVal, 255 ) );
   250     bool isNoData = 
false;
   256       redVal = redBlock->
value( i );
   257       if ( redBlock->
isNoData( i ) ) isNoData = 
true;
   259     if ( !isNoData && mGreenBand > 0 )
   261       greenVal = greenBlock->
value( i );
   262       if ( greenBlock->
isNoData( i ) ) isNoData = 
true;
   264     if ( !isNoData && mBlueBand > 0 )
   266       blueVal = blueBlock->
value( i );
   267       if ( blueBlock->
isNoData( i ) ) isNoData = 
true;
   271       outputBlock->setColor( i, myDefaultColor );
   280       outputBlock->setColor( i, myDefaultColor );
   285     if ( mRedContrastEnhancement )
   289     if ( mGreenContrastEnhancement )
   293     if ( mBlueContrastEnhancement )
   306       currentOpacity *= alphaBlock->
value( i ) / 255.0;
   311       outputBlock->setColor( i, qRgba( redVal, greenVal, blueVal, 255 ) );
   315       outputBlock->setColor( i, qRgba( currentOpacity * redVal, currentOpacity * greenVal, currentOpacity * blueVal, currentOpacity * 255 ) );
   320   QMap<int, QgsRasterBlock *>::const_iterator bandDelIt = bandBlocks.constBegin();
   321   for ( ; bandDelIt != bandBlocks.constEnd(); ++bandDelIt )
   323     delete bandDelIt.value();
   326   return outputBlock.release();
   331   if ( parentElem.isNull() )
   336   QDomElement rasterRendererElem = doc.createElement( QStringLiteral( 
"rasterrenderer" ) );
   338   rasterRendererElem.setAttribute( QStringLiteral( 
"redBand" ), mRedBand );
   339   rasterRendererElem.setAttribute( QStringLiteral( 
"greenBand" ), mGreenBand );
   340   rasterRendererElem.setAttribute( QStringLiteral( 
"blueBand" ), mBlueBand );
   343   if ( mRedContrastEnhancement )
   345     QDomElement redContrastElem = doc.createElement( QStringLiteral( 
"redContrastEnhancement" ) );
   346     mRedContrastEnhancement->
writeXml( doc, redContrastElem );
   347     rasterRendererElem.appendChild( redContrastElem );
   349   if ( mGreenContrastEnhancement )
   351     QDomElement greenContrastElem = doc.createElement( QStringLiteral( 
"greenContrastEnhancement" ) );
   352     mGreenContrastEnhancement->
writeXml( doc, greenContrastElem );
   353     rasterRendererElem.appendChild( greenContrastElem );
   355   if ( mBlueContrastEnhancement )
   357     QDomElement blueContrastElem = doc.createElement( QStringLiteral( 
"blueContrastEnhancement" ) );
   358     mBlueContrastEnhancement->
writeXml( doc, blueContrastElem );
   359     rasterRendererElem.appendChild( blueContrastElem );
   361   parentElem.appendChild( rasterRendererElem );
   367   if ( mRedBand != -1 )
   369     bandList << mRedBand;
   371   if ( mGreenBand != -1 )
   373     bandList << mGreenBand;
   375   if ( mBlueBand != -1 )
   377     bandList << mBlueBand;
 A rectangle specified with double values. 
 
static QgsRasterRenderer * create(const QDomElement &elem, QgsRasterInterface *input)
 
~QgsMultiBandColorRenderer() override
 
const QgsContrastEnhancement * blueContrastEnhancement() const
 
void writeXml(QDomDocument &doc, QDomElement &parentElem) const override
Write base class members to xml. 
 
virtual QgsRectangle extent() const
Gets the extent of the interface. 
 
bool qgsDoubleNear(double a, double b, double epsilon=4 *std::numeric_limits< double >::epsilon())
Compare two doubles (but allow some difference) 
 
virtual QgsRasterInterface * input() const
Current input. 
 
DataType
Raster data types. 
 
virtual Qgis::DataType dataType(int bandNo) const =0
Returns data type for the band specified by number. 
 
QgsMultiBandColorRenderer * clone() const override
Clone itself, create deep copy. 
 
bool isNoData(int row, int column)
Check if value at position is no data. 
 
void setGreenContrastEnhancement(QgsContrastEnhancement *ce)
Takes ownership. 
 
QList< int > usesBands() const override
Returns a list of band numbers used by 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. 
 
QgsRasterTransparency * mRasterTransparency
Raster transparency per color or value. Overwrites global alpha value. 
 
static const QRgb NODATA_COLOR
 
Color, alpha, red, green, blue, 4 bytes the same as QImage::Format_ARGB32_Premultiplied. 
 
void setRedContrastEnhancement(QgsContrastEnhancement *ce)
Takes ownership. 
 
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. 
 
void _writeXml(QDomDocument &doc, QDomElement &rasterRendererElem) const
Write upper class info into rasterrenderer element (called by writeXml method of subclasses) ...
 
void copyCommonProperties(const QgsRasterRenderer *other, bool copyMinMaxOrigin=true)
Copies common properties like opacity / transparency data from other renderer. 
 
bool isValueInDisplayableRange(double value)
Returns true if a pixel value is in displayable range, false if pixel is outside of range (i...
 
bool usesTransparency() const
 
void readXml(const QDomElement &elem)
 
int mAlphaBand
Read alpha value from band. 
 
void readXml(const QDomElement &rendererElem) override
Sets base class members from xml. Usually called from create() methods of subclasses. 
 
Base class for processing filters like renderers, reprojector, resampler etc. 
 
int alphaValue(double value, int globalTransparency=255) const
Returns the transparency value for a single value pixel. 
 
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...
 
const QgsContrastEnhancement * redContrastEnhancement() const
 
const QgsContrastEnhancement * greenContrastEnhancement() const
 
void setBlueContrastEnhancement(QgsContrastEnhancement *ce)
Takes ownership. 
 
double value(int row, int column) const
Read a single value if type of block is numeric. 
 
Renderer for multiband images with the color components. 
 
void writeXml(QDomDocument &doc, QDomElement &parentElem) const
 
double mOpacity
Global alpha value (0-1) 
 
Manipulates raster pixel values so that they enhanceContrast or clip into a specified numerical range...
 
QgsMultiBandColorRenderer(QgsRasterInterface *input, int redBand, int greenBand, int blueBand, QgsContrastEnhancement *redEnhancement=nullptr, QgsContrastEnhancement *greenEnhancement=nullptr, QgsContrastEnhancement *blueEnhancement=nullptr)
 
QgsRasterInterface * mInput
 
Feedback object tailored for raster block reading. 
 
Raster renderer pipe that applies colors to a raster. 
 
int enhanceContrast(double value)
Applies the contrast enhancement to a value.