22 #include <QDomDocument>
23 #include <QDomElement>
31 QgsRasterRenderer( input,
"multibandcolor" ), mRedBand( redBand ), mGreenBand( greenBand ), mBlueBand( blueBand ),
32 mRedContrastEnhancement( redEnhancement ), mGreenContrastEnhancement( greenEnhancement ), mBlueContrastEnhancement( blueEnhancement )
88 int redBand = elem.attribute(
"redBand",
"-1" ).toInt();
89 int greenBand = elem.attribute(
"greenBand",
"-1" ).toInt();
90 int blueBand = elem.attribute(
"blueBand",
"-1" ).toInt();
94 QDomElement redContrastElem = elem.firstChildElement(
"redContrastEnhancement" );
95 if ( !redContrastElem.isNull() )
99 redContrastEnhancement->
readXML( redContrastElem );
103 QDomElement greenContrastElem = elem.firstChildElement(
"greenContrastEnhancement" );
104 if ( !greenContrastElem.isNull() )
108 greenContrastEnhancement->
readXML( greenContrastElem );
112 QDomElement blueContrastElem = elem.firstChildElement(
"blueContrastEnhancement" );
113 if ( !blueContrastElem.isNull() )
117 blueContrastEnhancement->
readXML( blueContrastElem );
121 greenContrastEnhancement, blueContrastEnhancement );
153 if ( bands.size() < 1 )
165 QMap<int, QgsRasterBlock*> bandBlocks;
167 QSet<int>::const_iterator bandIt = bands.constBegin();
168 for ( ; bandIt != bands.constEnd(); ++bandIt )
170 bandBlocks.insert( *bandIt, defaultPointer );
178 bandIt = bands.constBegin();
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];
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;
254 greenVal = greenBlock->
value( i );
255 if ( greenBlock->
isNoData( i ) ) isNoData =
true;
259 blueVal = blueBlock->
value( i );
260 if ( blueBlock->
isNoData( i ) ) isNoData =
true;
264 outputBlock->
setColor( i, myDefaultColor );
273 outputBlock->
setColor( i, myDefaultColor );
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 ) );
313 QMap<int, QgsRasterBlock*>::const_iterator bandDelIt = bandBlocks.constBegin();
314 for ( ; bandDelIt != bandBlocks.constEnd(); ++bandDelIt )
316 delete bandDelIt.value();
324 if ( parentElem.isNull() )
329 QDomElement rasterRendererElem = doc.createElement(
"rasterrenderer" );
331 rasterRendererElem.setAttribute(
"redBand",
mRedBand );
332 rasterRendererElem.setAttribute(
"greenBand",
mGreenBand );
333 rasterRendererElem.setAttribute(
"blueBand",
mBlueBand );
338 QDomElement redContrastElem = doc.createElement(
"redContrastEnhancement" );
340 rasterRendererElem.appendChild( redContrastElem );
344 QDomElement greenContrastElem = doc.createElement(
"greenContrastEnhancement" );
346 rasterRendererElem.appendChild( greenContrastElem );
350 QDomElement blueContrastElem = doc.createElement(
"blueContrastEnhancement" );
352 rasterRendererElem.appendChild( blueContrastElem );
354 parentElem.appendChild( rasterRendererElem );
void writeXML(QDomDocument &doc, QDomElement &parentElem) const
A rectangle specified with double values.
QList< int > usesBands() const
Returns a list of band numbers used by the renderer.
static QgsRasterRenderer * create(const QDomElement &elem, QgsRasterInterface *input)
const QgsContrastEnhancement * greenContrastEnhancement() const
void readXML(const QDomElement &elem)
bool isValueInDisplayableRange(double)
Return true if pixel is in stretable range, false if pixel is outside of range (i.e., clipped)
const QgsContrastEnhancement * redContrastEnhancement() const
QgsContrastEnhancement * mRedContrastEnhancement
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)
QgsContrastEnhancement * mGreenContrastEnhancement
QgsContrastEnhancement * mBlueContrastEnhancement
void setGreenContrastEnhancement(QgsContrastEnhancement *ce)
Takes ownership.
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.
QgsRasterBlock * block(int bandNo, const QgsRectangle &extent, int width, int height)
Read block of data using given extent and size.
int mAlphaBand
Read alpha value from band.
void writeXML(QDomDocument &doc, QDomElement &parentElem) const
Write base class members to xml.
virtual QGis::DataType dataType(int bandNo) const =0
Returns data type for the band specified by number.
QgsRasterInterface * clone() const
Clone itself, create deep copy.
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...
void readXML(const QDomElement &rendererElem)
Sets base class members from xml.
const QgsContrastEnhancement * blueContrastEnhancement() const
bool reset(QGis::DataType theDataType, int theWidth, int theHeight)
Reset block.
int enhanceContrast(double)
Apply the contrast enhancement to a value.
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...
void setOpacity(double opacity)
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)
Raster renderer pipe that applies colors to a raster.