22 #include <QDomDocument>
23 #include <QDomElement>
31 QgsRasterRenderer( input,
"multibandcolor" ), mRedBand( redBand ), mGreenBand( greenBand ), mBlueBand( blueBand ),
32 mRedContrastEnhancement( redEnhancement ), mGreenContrastEnhancement( greenEnhancement ), mBlueContrastEnhancement( blueEnhancement )
38 delete mRedContrastEnhancement;
39 delete mGreenContrastEnhancement;
40 delete mBlueContrastEnhancement;
46 if ( mRedContrastEnhancement )
50 if ( mGreenContrastEnhancement )
54 if ( mBlueContrastEnhancement )
67 delete mRedContrastEnhancement; mRedContrastEnhancement = ce;
72 delete mGreenContrastEnhancement; mGreenContrastEnhancement = ce;
77 delete mBlueContrastEnhancement; mBlueContrastEnhancement = ce;
95 if ( !redContrastElem.
isNull() )
99 redContrastEnhancement->
readXML( redContrastElem );
104 if ( !greenContrastElem.
isNull() )
108 greenContrastEnhancement->
readXML( greenContrastElem );
113 if ( !blueContrastElem.
isNull() )
117 blueContrastEnhancement->
readXML( blueContrastElem );
121 greenContrastEnhancement, blueContrastEnhancement );
137 && mRedBand > 0 && mGreenBand > 0 && mBlueBand > 0
138 &&
mAlphaBand < 1 && !mRedContrastEnhancement && !mGreenContrastEnhancement && !mBlueContrastEnhancement );
145 if ( mGreenBand > 0 )
153 if ( bands.
size() < 1 )
168 for ( ; bandIt != bands.
constEnd(); ++bandIt )
170 bandBlocks.
insert( *bandIt, defaultPointer );
179 for ( ; bandIt != bands.
constEnd(); ++bandIt )
181 bandBlocks[*bandIt] =
mInput->
block( *bandIt, extent, width, height );
182 if ( !bandBlocks[*bandIt] )
187 for ( ; bandIt != bands.
constBegin(); --bandIt )
189 delete bandBlocks[*bandIt];
197 redBlock = bandBlocks[mRedBand];
199 if ( mGreenBand > 0 )
201 greenBlock = bandBlocks[mGreenBand];
205 blueBlock = bandBlocks[mBlueBand];
214 for (
int i = 0; i < bandBlocks.
size(); i++ )
216 delete bandBlocks.
value( i );
231 outputBlock->
setColor( i, myDefaultColor );
235 int redVal = ( int )redBlock->
value( i );
236 int greenVal = ( int )greenBlock->
value( i );
237 int blueVal = ( int )blueBlock->
value( i );
238 outputBlock->
setColor( i, qRgba( redVal, greenVal, blueVal, 255 ) );
243 bool isNoData =
false;
249 redVal = redBlock->
value( i );
250 if ( redBlock->
isNoData( i ) ) isNoData =
true;
252 if ( !isNoData && mGreenBand > 0 )
254 greenVal = greenBlock->
value( i );
255 if ( greenBlock->
isNoData( i ) ) isNoData =
true;
257 if ( !isNoData && mBlueBand > 0 )
259 blueVal = blueBlock->
value( i );
260 if ( blueBlock->
isNoData( i ) ) isNoData =
true;
264 outputBlock->
setColor( i, myDefaultColor );
273 outputBlock->
setColor( i, myDefaultColor );
278 if ( mRedContrastEnhancement )
282 if ( mGreenContrastEnhancement )
286 if ( mBlueContrastEnhancement )
299 currentOpacity *= alphaBlock->
value( i ) / 255.0;
304 outputBlock->
setColor( i, qRgba( redVal, greenVal, blueVal, 255 ) );
308 outputBlock->
setColor( i, qRgba( currentOpacity * redVal, currentOpacity * greenVal, currentOpacity * blueVal, currentOpacity * 255 ) );
314 for ( ; bandDelIt != bandBlocks.
constEnd(); ++bandDelIt )
316 delete bandDelIt.
value();
324 if ( parentElem.
isNull() )
332 rasterRendererElem.
setAttribute(
"greenBand", mGreenBand );
333 rasterRendererElem.
setAttribute(
"blueBand", mBlueBand );
336 if ( mRedContrastEnhancement )
339 mRedContrastEnhancement->
writeXML( doc, redContrastElem );
342 if ( mGreenContrastEnhancement )
345 mGreenContrastEnhancement->
writeXML( doc, greenContrastElem );
346 rasterRendererElem.
appendChild( greenContrastElem );
348 if ( mBlueContrastEnhancement )
351 mBlueContrastEnhancement->
writeXML( doc, blueContrastElem );
352 rasterRendererElem.
appendChild( blueContrastElem );
360 if ( mRedBand != -1 )
362 bandList << mRedBand;
364 if ( mGreenBand != -1 )
366 bandList << mGreenBand;
368 if ( mBlueBand != -1 )
370 bandList << mBlueBand;
void writeXML(QDomDocument &doc, QDomElement &parentElem) const
A rectangle specified with double values.
static QgsRasterRenderer * create(const QDomElement &elem, QgsRasterInterface *input)
const QgsContrastEnhancement * greenContrastEnhancement() const
void readXML(const QDomElement &elem)
QDomNode appendChild(const QDomNode &newChild)
QString attribute(const QString &name, const QString &defValue) const
bool isValueInDisplayableRange(double)
Return true if pixel is in stretable range, false if pixel is outside of range (i.e., clipped)
const_iterator constBegin() const
void writeXML(QDomDocument &doc, QDomElement &parentElem) const override
Write base class members to xml.
const QgsContrastEnhancement * redContrastEnhancement() const
bool isNoData(int row, int column)
Check if value at position is no data.
bool qgsDoubleNear(double a, double b, double epsilon=4 *DBL_EPSILON)
void setGreenContrastEnhancement(QgsContrastEnhancement *ce)
Takes ownership.
void readXML(const QDomElement &rendererElem) override
Sets base class members from xml.
QList< int > usesBands() const override
Returns a list of band numbers used by the renderer.
bool usesTransparency() const
QgsRasterTransparency * mRasterTransparency
Raster transparency per color or value.
bool setColor(int row, int column, QRgb color)
Set color on position.
static const QRgb NODATA_COLOR
int alphaValue(double, int theGlobalTransparency=255) const
Returns the transparency value for a single value Pixel.
void setRedContrastEnhancement(QgsContrastEnhancement *ce)
Takes ownership.
double value(int row, int column) const
Read a single value if type of block is numeric.
void setAttribute(const QString &name, const QString &value)
int toInt(bool *ok, int base) const
const_iterator constEnd() const
const_iterator constEnd() const
int mAlphaBand
Read alpha value from band.
virtual QGis::DataType dataType(int bandNo) const =0
Returns data type for the band specified by number.
void setAlphaBand(int band)
Base class for processing filters like renderers, reprojector, resampler etc.
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 * blueContrastEnhancement() const
bool reset(QGis::DataType theDataType, int theWidth, int theHeight)
Reset block.
const_iterator constBegin() const
int enhanceContrast(double)
Apply the contrast enhancement to a value.
QDomElement firstChildElement(const QString &tagName) const
DataType
Raster data types.
void setBlueContrastEnhancement(QgsContrastEnhancement *ce)
Takes ownership.
virtual QgsRasterBlock * block(int bandNo, const QgsRectangle &extent, int width, int height)=0
Read block of data using given extent and size.
QgsMultiBandColorRenderer(QgsRasterInterface *input, int redBand, int greenBand, int blueBand, QgsContrastEnhancement *redEnhancement=0, QgsContrastEnhancement *greenEnhancement=0, QgsContrastEnhancement *blueEnhancement=0)
Renderer for multiband images with the color components.
double mOpacity
Global alpha value (0-1)
Manipulates raster pixel values so that they enhanceContrast or clip into a specified numerical range...
iterator insert(const Key &key, const T &value)
Defines the list of pixel values to be considered as transparent or semi transparent when rendering r...
void setOpacity(double opacity)
QgsRasterInterface * clone() const override
Clone itself, create deep copy.
QDomElement createElement(const QString &tagName)
void _writeXML(QDomDocument &doc, QDomElement &rasterRendererElem) const
Write upper class info into rasterrenderer element (called by writeXML method of subclasses) ...
~QgsMultiBandColorRenderer()
QgsRasterInterface * mInput
void setRasterTransparency(QgsRasterTransparency *t)
QgsRasterBlock * block(int bandNo, const QgsRectangle &extent, int width, int height) override
Read block of data using given extent and size.
Raster renderer pipe that applies colors to a raster.
const T value(const Key &key) const