26 changes: 13 additions & 13 deletions src/core/raster/qgsrasterrenderer.h
Original file line number Diff line number Diff line change
Expand Up @@ -18,7 +18,7 @@
#ifndef QGSRASTERRENDERER_H
#define QGSRASTERRENDERER_H

#include "qgsrasterface.h"
#include "qgsrasterinterface.h"
#include "qgsrasterdataprovider.h"
#include <QPair>

Expand All @@ -31,10 +31,10 @@ struct QgsRasterViewPort;

class QDomElement;

class CORE_EXPORT QgsRasterRenderer : public QgsRasterFace
class CORE_EXPORT QgsRasterRenderer : public QgsRasterInterface
{
public:
QgsRasterRenderer( QgsRasterFace* input, const QString& type );
QgsRasterRenderer( QgsRasterInterface* input, const QString& type );
virtual ~QgsRasterRenderer();

virtual QString type() const { return mType; }
Expand Down Expand Up @@ -69,13 +69,13 @@ class CORE_EXPORT QgsRasterRenderer : public QgsRasterFace
void readXML( const QDomElement& rendererElem );

protected:
inline double readValue( void *data, QgsRasterFace::DataType type, int index );
inline double readValue( void *data, QgsRasterInterface::DataType type, int index );

/**Write upper class info into rasterrenderer element (called by writeXML method of subclasses)*/
void _writeXML( QDomDocument& doc, QDomElement& rasterRendererElem ) const;


QgsRasterFace* mProvider;
QgsRasterInterface* mProvider;
QString mType;
/**Resampler used if screen resolution is higher than raster resolution (zoomed in). 0 means no resampling (nearest neighbour)*/
QgsRasterResampler* mZoomedInResampler;
Expand All @@ -102,7 +102,7 @@ class CORE_EXPORT QgsRasterRenderer : public QgsRasterFace
void projectImage( const QImage& srcImg, QImage& dstImage, QgsRasterProjector* prj ) const;
};

inline double QgsRasterRenderer::readValue( void *data, QgsRasterFace::DataType type, int index )
inline double QgsRasterRenderer::readValue( void *data, QgsRasterInterface::DataType type, int index )
{
if ( !mInput )
{
Expand All @@ -118,25 +118,25 @@ inline double QgsRasterRenderer::readValue( void *data, QgsRasterFace::DataType

switch ( type )
{
case QgsRasterFace::Byte:
case QgsRasterInterface::Byte:
return ( double )(( GByte * )data )[index];
break;
case QgsRasterFace::UInt16:
case QgsRasterInterface::UInt16:
return ( double )(( GUInt16 * )data )[index];
break;
case QgsRasterFace::Int16:
case QgsRasterInterface::Int16:
return ( double )(( GInt16 * )data )[index];
break;
case QgsRasterFace::UInt32:
case QgsRasterInterface::UInt32:
return ( double )(( GUInt32 * )data )[index];
break;
case QgsRasterFace::Int32:
case QgsRasterInterface::Int32:
return ( double )(( GInt32 * )data )[index];
break;
case QgsRasterFace::Float32:
case QgsRasterInterface::Float32:
return ( double )(( float * )data )[index];
break;
case QgsRasterFace::Float64:
case QgsRasterInterface::Float64:
return ( double )(( double * )data )[index];
break;
default:
Expand Down
4 changes: 2 additions & 2 deletions src/core/raster/qgsrasterrendererregistry.h
Original file line number Diff line number Diff line change
Expand Up @@ -24,12 +24,12 @@

class QDomElement;
//class QgsRasterDataProvider;
class QgsRasterFace;
class QgsRasterInterface;
class QgsRasterLayer;
class QgsRasterRenderer;
class QgsRasterRendererWidget;

typedef QgsRasterRenderer*( *QgsRasterRendererCreateFunc )( const QDomElement&, QgsRasterFace* input );
typedef QgsRasterRenderer*( *QgsRasterRendererCreateFunc )( const QDomElement&, QgsRasterInterface* input );
typedef QgsRasterRendererWidget*( *QgsRasterRendererWidgetCreateFunc )( QgsRasterLayer* );

struct CORE_EXPORT QgsRasterRendererRegistryEntry
Expand Down
2 changes: 1 addition & 1 deletion src/core/raster/qgsrasterresamplefilter.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -31,7 +31,7 @@
#include <QImage>
#include <QPainter>

QgsRasterResampleFilter::QgsRasterResampleFilter( QgsRasterFace* input ): QgsRasterFace( input ),
QgsRasterResampleFilter::QgsRasterResampleFilter( QgsRasterInterface* input ): QgsRasterInterface( input ),
mZoomedInResampler( 0 ), mZoomedOutResampler( 0 ),
mMaxOversampling( 2.0 )
{
Expand Down
6 changes: 3 additions & 3 deletions src/core/raster/qgsrasterresamplefilter.h
Original file line number Diff line number Diff line change
Expand Up @@ -19,7 +19,7 @@
#define QGSRASTERRESAMPLEFILTER_H

#include "qgsrasterdataprovider.h"
#include "qgsrasterface.h"
#include "qgsrasterinterface.h"

class QPainter;
class QgsMapToPixel;
Expand All @@ -30,10 +30,10 @@ class QgsRasterViewPort;

class QDomElement;

class QgsRasterResampleFilter : public QgsRasterFace
class QgsRasterResampleFilter : public QgsRasterInterface
{
public:
QgsRasterResampleFilter( QgsRasterFace* input = 0 );
QgsRasterResampleFilter( QgsRasterInterface* input = 0 );
~QgsRasterResampleFilter();

void * readBlock( int bandNo, QgsRectangle const & extent, int width, int height );
Expand Down
1 change: 1 addition & 0 deletions src/core/raster/qgsrastertransparency.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -18,6 +18,7 @@ email : ersts@amnh.org

#include "qgsrastertransparency.h"
#include "qgis.h"
#include "qgslogger.h"

#include <QDomDocument>
#include <QDomElement>
Expand Down
6 changes: 3 additions & 3 deletions src/core/raster/qgssinglebandcolordatarenderer.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -21,7 +21,7 @@
#include <QDomElement>
#include <QImage>

QgsSingleBandColorDataRenderer::QgsSingleBandColorDataRenderer( QgsRasterFace* input, int band ):
QgsSingleBandColorDataRenderer::QgsSingleBandColorDataRenderer( QgsRasterInterface* input, int band ):
QgsRasterRenderer( input, "singlebandcolordata" ), mBand( band )
{

Expand All @@ -31,7 +31,7 @@ QgsSingleBandColorDataRenderer::~QgsSingleBandColorDataRenderer()
{
}

QgsRasterRenderer* QgsSingleBandColorDataRenderer::create( const QDomElement& elem, QgsRasterFace* input )
QgsRasterRenderer* QgsSingleBandColorDataRenderer::create( const QDomElement& elem, QgsRasterInterface* input )
{
if ( elem.isNull() )
{
Expand All @@ -56,7 +56,7 @@ void * QgsSingleBandColorDataRenderer::readBlock( int bandNo, QgsRectangle cons
//bool hasTransparency = usesTransparency( viewPort->mSrcCRS, viewPort->mDestCRS );
bool hasTransparency = false;

QgsRasterFace::DataType rasterType = ( QgsRasterFace::DataType )mInput->dataType( mBand );
QgsRasterInterface::DataType rasterType = ( QgsRasterInterface::DataType )mInput->dataType( mBand );

void* rasterData = mInput->readBlock( bandNo, extent, width, height );

Expand Down
4 changes: 2 additions & 2 deletions src/core/raster/qgssinglebandcolordatarenderer.h
Original file line number Diff line number Diff line change
Expand Up @@ -25,10 +25,10 @@ class QDomElement;
class CORE_EXPORT QgsSingleBandColorDataRenderer: public QgsRasterRenderer
{
public:
QgsSingleBandColorDataRenderer( QgsRasterFace* input, int band );
QgsSingleBandColorDataRenderer( QgsRasterInterface* input, int band );
~QgsSingleBandColorDataRenderer();

static QgsRasterRenderer* create( const QDomElement& elem, QgsRasterFace* input );
static QgsRasterRenderer* create( const QDomElement& elem, QgsRasterInterface* input );

//virtual void draw( QPainter* p, QgsRasterViewPort* viewPort, const QgsMapToPixel* theQgsMapToPixel );

Expand Down
40 changes: 24 additions & 16 deletions src/core/raster/qgssinglebandgrayrenderer.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -22,7 +22,7 @@
#include <QDomElement>
#include <QImage>

QgsSingleBandGrayRenderer::QgsSingleBandGrayRenderer( QgsRasterFace* input, int grayBand ):
QgsSingleBandGrayRenderer::QgsSingleBandGrayRenderer( QgsRasterInterface* input, int grayBand ):
QgsRasterRenderer( input, "singlebandgray" ), mGrayBand( grayBand ), mContrastEnhancement( 0 )
{
}
Expand All @@ -32,7 +32,7 @@ QgsSingleBandGrayRenderer::~QgsSingleBandGrayRenderer()
delete mContrastEnhancement;
}

QgsRasterRenderer* QgsSingleBandGrayRenderer::create( const QDomElement& elem, QgsRasterFace* input )
QgsRasterRenderer* QgsSingleBandGrayRenderer::create( const QDomElement& elem, QgsRasterInterface* input )
{
if ( elem.isNull() )
{
Expand Down Expand Up @@ -60,44 +60,50 @@ void QgsSingleBandGrayRenderer::setContrastEnhancement( QgsContrastEnhancement*
mContrastEnhancement = ce;
}

//void QgsSingleBandGrayRenderer::draw( QPainter* p, QgsRasterViewPort* viewPort, const QgsMapToPixel* theQgsMapToPixel )
void * QgsSingleBandGrayRenderer::readBlock( int bandNo, QgsRectangle const & extent, int width, int height )
{
if ( !mInput )
{
return 0;
}

QgsRasterFace::DataType rasterType = ( QgsRasterFace::DataType )mInput->dataType( mGrayBand );
QgsRasterFace::DataType alphaType = QgsRasterFace::UnknownDataType;
QgsRasterInterface::DataType rasterType = ( QgsRasterInterface::DataType )mInput->dataType( mGrayBand );
QgsRasterInterface::DataType alphaType = QgsRasterInterface::UnknownDataType;
if ( mAlphaBand > 0 )
{
alphaType = ( QgsRasterFace::DataType )mInput->dataType( mAlphaBand );
alphaType = ( QgsRasterInterface::DataType )mInput->dataType( mAlphaBand );
}

void* rasterData = mInput->readBlock( mGrayBand, extent, width, height );
void* alphaData;
if ( !rasterData ) return 0;

void* alphaData = 0;
double currentAlpha = mOpacity;
int grayVal, grayValOrig;
QRgb myDefaultColor = qRgba( 0, 0, 0, 0 );

if ( mAlphaBand > 0 && mGrayBand != mAlphaBand )
{
alphaData = mInput->readBlock( mAlphaBand, extent, width, height );
if ( !alphaData ) {
free ( rasterData );
return 0;
}
}
else if ( mAlphaBand > 0 )
{
alphaData = rasterData;
}

//create image
QImage img( width, height, QImage::Format_ARGB32_Premultiplied );
// To give to image preallocated memory is the only way to avoid memcpy at the end
//QImage img( width, height, QImage::Format_ARGB32_Premultiplied );
QImage *img = createImage ( width, height, QImage::Format_ARGB32_Premultiplied );
QRgb* imageScanLine = 0;
int currentRasterPos = 0;

for ( int i = 0; i < height; ++i )
{
imageScanLine = ( QRgb* )( img.scanLine( i ) );
imageScanLine = ( QRgb* )( img->scanLine( i ) );
for ( int j = 0; j < width; ++j )
{
grayValOrig = grayVal = readValue( rasterData, rasterType, currentRasterPos );
Expand Down Expand Up @@ -141,13 +147,15 @@ void * QgsSingleBandGrayRenderer::readBlock( int bandNo, QgsRectangle const & e
}
}

VSIFree( rasterData );

// TODO: howto get image data without memcpy?
// TODO: byteCount() added in 4.6, QGIS requirement is Qt >= 4.4.0
void * data = VSIMalloc( img.byteCount() );
free ( rasterData );
if ( mAlphaBand > 0 && mGrayBand != mAlphaBand )
{
free ( alphaData );
}

return memcpy( data, img.bits(), img.byteCount() );
void * data = (void *)img->bits();
delete img;
return data; // OK, the image was created with extraneous data
}

void QgsSingleBandGrayRenderer::writeXML( QDomDocument& doc, QDomElement& parentElem ) const
Expand Down
4 changes: 2 additions & 2 deletions src/core/raster/qgssinglebandgrayrenderer.h
Original file line number Diff line number Diff line change
Expand Up @@ -26,11 +26,11 @@ class QDomElement;
class CORE_EXPORT QgsSingleBandGrayRenderer: public QgsRasterRenderer
{
public:
QgsSingleBandGrayRenderer( QgsRasterFace* input, int grayBand );
QgsSingleBandGrayRenderer( QgsRasterInterface* input, int grayBand );
~QgsSingleBandGrayRenderer();

//static QgsRasterRenderer* create( const QDomElement& elem, QgsRasterDataProvider* provider );
static QgsRasterRenderer* create( const QDomElement& elem, QgsRasterFace* input );
static QgsRasterRenderer* create( const QDomElement& elem, QgsRasterInterface* input );

//virtual void draw( QPainter* p, QgsRasterViewPort* viewPort, const QgsMapToPixel* theQgsMapToPixel );

Expand Down
10 changes: 5 additions & 5 deletions src/core/raster/qgssinglebandpseudocolorrenderer.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -23,7 +23,7 @@
#include <QDomElement>
#include <QImage>

QgsSingleBandPseudoColorRenderer::QgsSingleBandPseudoColorRenderer( QgsRasterFace* input, int band, QgsRasterShader* shader ):
QgsSingleBandPseudoColorRenderer::QgsSingleBandPseudoColorRenderer( QgsRasterInterface* input, int band, QgsRasterShader* shader ):
QgsRasterRenderer( input, "singlebandpseudocolor" ), mShader( shader ), mBand( band )
{
}
Expand All @@ -39,7 +39,7 @@ void QgsSingleBandPseudoColorRenderer::setShader( QgsRasterShader* shader )
mShader = shader;
}

QgsRasterRenderer* QgsSingleBandPseudoColorRenderer::create( const QDomElement& elem, QgsRasterFace* input )
QgsRasterRenderer* QgsSingleBandPseudoColorRenderer::create( const QDomElement& elem, QgsRasterInterface* input )
{
if ( elem.isNull() )
{
Expand All @@ -66,15 +66,15 @@ void * QgsSingleBandPseudoColorRenderer::readBlock( int bandNo, QgsRectangle co
return 0;
}

QgsRasterFace::DataType transparencyType = QgsRasterFace::UnknownDataType;
QgsRasterInterface::DataType transparencyType = QgsRasterInterface::UnknownDataType;
if ( mAlphaBand > 0 )
{
transparencyType = ( QgsRasterFace::DataType )mInput->dataType( mAlphaBand );
transparencyType = ( QgsRasterInterface::DataType )mInput->dataType( mAlphaBand );
}

void* transparencyData = 0;
double currentOpacity = mOpacity;
QgsRasterFace::DataType rasterType = ( QgsRasterFace::DataType )mInput->dataType( mBand );
QgsRasterInterface::DataType rasterType = ( QgsRasterInterface::DataType )mInput->dataType( mBand );

void* rasterData = mInput->readBlock( mBand, extent, width, height );

Expand Down
4 changes: 2 additions & 2 deletions src/core/raster/qgssinglebandpseudocolorrenderer.h
Original file line number Diff line number Diff line change
Expand Up @@ -27,10 +27,10 @@ class CORE_EXPORT QgsSingleBandPseudoColorRenderer: public QgsRasterRenderer
{
public:
/**Note: takes ownership of QgsRasterShader*/
QgsSingleBandPseudoColorRenderer( QgsRasterFace* input, int band, QgsRasterShader* shader );
QgsSingleBandPseudoColorRenderer( QgsRasterInterface* input, int band, QgsRasterShader* shader );
~QgsSingleBandPseudoColorRenderer();

static QgsRasterRenderer* create( const QDomElement& elem, QgsRasterFace* input );
static QgsRasterRenderer* create( const QDomElement& elem, QgsRasterInterface* input );

//virtual void draw( QPainter* p, QgsRasterViewPort* viewPort, const QgsMapToPixel* theQgsMapToPixel );

Expand Down