Showing with 188 additions and 1 deletion.
  1. +187 −0 python/core/qgsrasterrenderer.sip
  2. +1 −1 src/core/raster/qgsrasterfilewriter.cpp
187 changes: 187 additions & 0 deletions python/core/qgsrasterrenderer.sip
Original file line number Diff line number Diff line change
@@ -0,0 +1,187 @@
class QgsRasterRenderer : QgsRasterInterface
{
%TypeHeaderCode
#include "qgsrasterrenderer.h"
#include "qgspalettedrasterrenderer.h"
#include "qgsmultibandcolorrenderer.h"
#include "qgssinglebandpseudocolorrenderer.h"
#include "qgssinglebandgrayrenderer.h"
#include "qgssinglebandcolordatarenderer.h"
#include "qgsrasterinterface.h"
%End

%ConvertToSubClassCode
if (dynamic_cast<QgsPalettedRasterRenderer*>(sipCpp) != NULL)
sipClass = sipClass_QgsPalettedRasterRenderer;
else if (dynamic_cast<QgsMultiBandColorRenderer*>(sipCpp) != NULL)
sipClass = sipClass_QgsMultiBandColorRenderer;
else if (dynamic_cast<QgsSingleBandPseudoColorRenderer*>(sipCpp) != NULL)
sipClass = sipClass_QgsSingleBandPseudoColorRenderer;
else if (dynamic_cast<QgsSingleBandGrayRenderer*>(sipCpp) != NULL)
sipClass = sipClass_QgsSingleBandGrayRenderer;
else if (dynamic_cast<QgsSingleBandGrayRenderer*>(sipCpp) != NULL)
sipClass = sipClass_QgsSingleBandGrayRenderer;
else
sipClass = 0;
%End

public:
QgsRasterRenderer( QgsRasterDataProvider* provider, const QString& type );
virtual ~QgsRasterRenderer();
virtual QgsRasterInterface * clone() const = 0;

virtual QString type() const;
virtual void * readBlock( int bandNo, const QgsRectangle & extent, int width, int height );

QgsRasterInterface::DataType dataType( int bandNo ) const;

bool usesTransparency() const;

void setOpacity( double opacity );
double opacity() const;

void setRasterTransparency( QgsRasterTransparency* t /Transfer/ );
const QgsRasterTransparency* rasterTransparency() const;

void setAlphaBand( int band );
int alphaBand() const;

void setInvertColor( bool invert );
bool invertColor() const;

/**Get symbology items if provided by renderer*/
virtual void legendSymbologyItems( QList< QPair< QString, QColor > >& symbolItems ) const;

virtual void writeXML( QDomDocument& doc, QDomElement& parentElem ) const = 0;

/**Sets base class members from xml. Usually called from create() methods of subclasses*/
void readXML( const QDomElement& rendererElem );
};

class QgsPalettedRasterRenderer: QgsRasterRenderer
{
%TypeHeaderCode
#include "qgspalettedrasterrenderer.h"
%End
public:
/**Renderer owns color array*/
QgsPalettedRasterRenderer( QgsRasterDataProvider* provider, int bandNumber, QColor* colorArray, int nColors );
~QgsPalettedRasterRenderer();
QgsRasterInterface * clone();
static QgsRasterRenderer* create( const QDomElement& elem, QgsRasterDataProvider* provider );

void * readBlock( int bandNo, const QgsRectangle & extent, int width, int height );

/**Returns number of colors*/
int nColors() const;
/**Returns copy of color array (caller takes ownership)*/
QColor* colors() const;

void writeXML( QDomDocument& doc, QDomElement& parentElem ) const;

void legendSymbologyItems( QList< QPair< QString, QColor > >& symbolItems ) const;
};

class QgsMultiBandColorRenderer: QgsRasterRenderer
{
%TypeHeaderCode
#include "qgsmultibandcolorrenderer.h"
%End
public:
QgsMultiBandColorRenderer( QgsRasterDataProvider* provider, int redBand, int greenBand, int blueBand,
QgsContrastEnhancement* redEnhancement = 0, QgsContrastEnhancement* greenEnhancement = 0,
QgsContrastEnhancement* blueEnhancement = 0 );
~QgsMultiBandColorRenderer();
QgsRasterInterface * clone();

static QgsRasterRenderer* create( const QDomElement& elem, QgsRasterDataProvider* provider );

void * readBlock( int bandNo, const QgsRectangle & extent, int width, int height );

int redBand() const;
void setRedBand( int band );
int greenBand() const;
void setGreenBand( int band );
int blueBand() const;
void setBlueBand( int band );

const QgsContrastEnhancement* redContrastEnhancement() const;
/**Takes ownership*/
void setRedContrastEnhancement( QgsContrastEnhancement* ce );

const QgsContrastEnhancement* greenContrastEnhancement() const;
/**Takes ownership*/
void setGreenContrastEnhancement( QgsContrastEnhancement* ce );

const QgsContrastEnhancement* blueContrastEnhancement() const;
/**Takes ownership*/
void setBlueContrastEnhancement( QgsContrastEnhancement* ce );

void writeXML( QDomDocument& doc, QDomElement& parentElem ) const;
};

class QgsSingleBandPseudoColorRenderer: QgsRasterRenderer
{
%TypeHeaderCode
#include "qgssinglebandpseudocolorrenderer.h"
%End
public:
/**Note: takes ownership of QgsRasterShader*/
QgsSingleBandPseudoColorRenderer( QgsRasterDataProvider* provider, int band, QgsRasterShader* shader /Transfer/ );
~QgsSingleBandPseudoColorRenderer();
QgsRasterInterface * clone();

static QgsRasterRenderer* create( const QDomElement& elem, QgsRasterDataProvider* provider );

void * readBlock( int bandNo, const QgsRectangle & extent, int width, int height );

/**Takes ownership of the shader*/
void setShader( QgsRasterShader* shader );
QgsRasterShader* shader();

void writeXML( QDomDocument& doc, QDomElement& parentElem ) const;

void legendSymbologyItems( QList< QPair< QString, QColor > >& symbolItems ) const;
};

class QgsSingleBandGrayRenderer: QgsRasterRenderer
{
%TypeHeaderCode
#include "qgssinglebandgrayrenderer.h"
%End
public:
QgsSingleBandGrayRenderer( QgsRasterDataProvider* provider, int grayBand );
~QgsSingleBandGrayRenderer();
QgsRasterInterface * clone();

static QgsRasterRenderer* create( const QDomElement& elem, QgsRasterDataProvider* provider );

void * readBlock( int bandNo, const QgsRectangle & extent, int width, int height );

int grayBand() const;
void setGrayBand( int band );
const QgsContrastEnhancement* contrastEnhancement() const;
/**Takes ownership*/
void setContrastEnhancement( QgsContrastEnhancement* ce );

void writeXML( QDomDocument& doc, QDomElement& parentElem ) const;

void legendSymbologyItems( QList< QPair< QString, QColor > >& symbolItems ) const;
};

class QgsSingleBandColorDataRenderer: QgsRasterRenderer
{
%TypeHeaderCode
#include "qgssinglebandcolordatarenderer.h"
%End
public:
QgsSingleBandColorDataRenderer( QgsRasterDataProvider* provider, int band );
~QgsSingleBandColorDataRenderer();
QgsRasterInterface * clone();

static QgsRasterRenderer* create( const QDomElement& elem, QgsRasterDataProvider* provider );

void * readBlock( int bandNo, const QgsRectangle & extent, int width, int height );

void writeXML( QDomDocument& doc, QDomElement& parentElem ) const;
};
2 changes: 1 addition & 1 deletion src/core/raster/qgsrasterfilewriter.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -166,7 +166,7 @@ QgsRasterFileWriter::WriterError QgsRasterFileWriter::writeDataRaster( const Qgs

bool srcHasNoDataValue = srcProvider->srcHasNoDataValue( bandNo );
bool destHasNoDataValue = false;
double destNoDataValue = std::numeric_limits::quiet_NaN();
double destNoDataValue = std::numeric_limits<double>::quiet_NaN();
QgsRasterInterface::DataType destDataType = srcProvider->srcDataType( bandNo );
//QgsRasterInterface::DataType destDataType = srcProvider->dataType( bandNo );
// TODO: verify what happens/should happen if srcNoDataValue is disabled by setUseSrcNoDataValue
Expand Down