From 79b8a762f54a8912060db3e2ee10dc886b4f680b Mon Sep 17 00:00:00 2001 From: Marco Hugentobler Date: Sun, 18 Dec 2011 13:29:45 +0100 Subject: [PATCH] Added raster renderer interface and test implementation for paletted rasters --- src/core/raster/qgspalettedrasterrenderer.cpp | 48 ++++++++++++++ src/core/raster/qgspalettedrasterrenderer.h | 24 +++++++ src/core/raster/qgsrasterrenderer.cpp | 9 +++ src/core/raster/qgsrasterrenderer.h | 66 +++++++++++++++++++ 4 files changed, 147 insertions(+) create mode 100644 src/core/raster/qgspalettedrasterrenderer.cpp create mode 100644 src/core/raster/qgspalettedrasterrenderer.h create mode 100644 src/core/raster/qgsrasterrenderer.cpp create mode 100644 src/core/raster/qgsrasterrenderer.h diff --git a/src/core/raster/qgspalettedrasterrenderer.cpp b/src/core/raster/qgspalettedrasterrenderer.cpp new file mode 100644 index 000000000000..bf197261c799 --- /dev/null +++ b/src/core/raster/qgspalettedrasterrenderer.cpp @@ -0,0 +1,48 @@ +#include "qgspalettedrasterrenderer.h" +#include "qgsrasterviewport.h" +#include +#include +#include + +QgsPalettedRasterRenderer::QgsPalettedRasterRenderer( QgsRasterDataProvider* provider, int bandNumber, QColor* colorArray, int nColors ): + QgsRasterRenderer( provider ), mBandNumber( bandNumber), mColors( colorArray ), mNColors( nColors ) +{ +} + +QgsPalettedRasterRenderer::~QgsPalettedRasterRenderer() +{ + delete[] mColors; +} + +void QgsPalettedRasterRenderer::draw( QPainter* p, QgsRasterViewPort* viewPort, const QgsMapToPixel* theQgsMapToPixel ) +{ + if( !p || !mProvider || !viewPort || !theQgsMapToPixel ) + { + return; + } + + //read data from provider + int typeSize = mProvider->dataTypeSize( mBandNumber ) / 8; + QgsRasterDataProvider::DataType rasterType = (QgsRasterDataProvider::DataType)mProvider->dataType( mBandNumber ); + void* rasterData = VSIMalloc( typeSize * viewPort->drawableAreaXDim * viewPort->drawableAreaYDim); + mProvider->readBlock( mBandNumber, viewPort->mDrawnExtent, viewPort->drawableAreaXDim, viewPort->drawableAreaYDim, + viewPort->mSrcCRS, viewPort->mDestCRS, rasterData ); + int currentRasterPos = 0; + + //raster image + QImage img( viewPort->drawableAreaXDim, viewPort->drawableAreaYDim, QImage::Format_ARGB32_Premultiplied ); + QRgb* imageScanLine = 0; + + for( int i = 0; i < viewPort->drawableAreaYDim; ++i ) + { + imageScanLine = ( QRgb* )( img.scanLine( i ) ); + for( int j = 0; j < viewPort->drawableAreaXDim; ++j ) + { + int val = readValue( rasterData, rasterType, currentRasterPos ); + imageScanLine[j] = mColors[ val ].rgba(); + ++currentRasterPos; + } + } + CPLFree( rasterData ); + p->drawImage( QPointF( viewPort->topLeftPoint.x(), viewPort->topLeftPoint.y() ), img ); +} diff --git a/src/core/raster/qgspalettedrasterrenderer.h b/src/core/raster/qgspalettedrasterrenderer.h new file mode 100644 index 000000000000..f43204ad37a7 --- /dev/null +++ b/src/core/raster/qgspalettedrasterrenderer.h @@ -0,0 +1,24 @@ +#ifndef QGSPALETTEDRASTERRENDERER_H +#define QGSPALETTEDRASTERRENDERER_H + +#include "qgsrasterrenderer.h" + +class QColor; + +class QgsPalettedRasterRenderer: public QgsRasterRenderer +{ + public: + /**Renderer owns color array*/ + QgsPalettedRasterRenderer( QgsRasterDataProvider* provider, int bandNumber, QColor* colorArray, int nColors ); + ~QgsPalettedRasterRenderer(); + void draw( QPainter* p, QgsRasterViewPort* viewPort, const QgsMapToPixel* theQgsMapToPixel ); + + private: + int mBandNumber; + /**Color array*/ + QColor* mColors; + /**Number of colors*/ + int mNColors; +}; + +#endif // QGSPALETTEDRASTERRENDERER_H diff --git a/src/core/raster/qgsrasterrenderer.cpp b/src/core/raster/qgsrasterrenderer.cpp new file mode 100644 index 000000000000..df2c9fe9f463 --- /dev/null +++ b/src/core/raster/qgsrasterrenderer.cpp @@ -0,0 +1,9 @@ +#include "qgsrasterrenderer.h" + +QgsRasterRenderer::QgsRasterRenderer( QgsRasterDataProvider* provider ): mProvider( provider ) +{ +} + +QgsRasterRenderer::~QgsRasterRenderer() +{ +} diff --git a/src/core/raster/qgsrasterrenderer.h b/src/core/raster/qgsrasterrenderer.h new file mode 100644 index 000000000000..45bfd169fc27 --- /dev/null +++ b/src/core/raster/qgsrasterrenderer.h @@ -0,0 +1,66 @@ +#ifndef QGSRASTERRENDERER_H +#define QGSRASTERRENDERER_H + +#include "qgsrasterdataprovider.h" + +class QPainter; +class QgsMapToPixel; +class QgsRasterViewPort; + +class QgsRasterRenderer +{ + public: + QgsRasterRenderer( QgsRasterDataProvider* provider ); + virtual ~QgsRasterRenderer(); + virtual void draw( QPainter* p, QgsRasterViewPort* viewPort, const QgsMapToPixel* theQgsMapToPixel ) = 0; + + protected: + inline double readValue( void *data, QgsRasterDataProvider::DataType type, int index ); + + QgsRasterDataProvider* mProvider; +}; + +inline double QgsRasterRenderer::readValue( void *data, QgsRasterDataProvider::DataType type, int index ) +{ + if( !mProvider ) + { + return 0; + } + + if( !data ) + { + return mProvider->noDataValue(); + } + + switch ( type ) + { + case QgsRasterDataProvider::Byte: + return ( double )(( GByte * )data )[index]; + break; + case QgsRasterDataProvider::UInt16: + return ( double )(( GUInt16 * )data )[index]; + break; + case QgsRasterDataProvider::Int16: + return ( double )(( GInt16 * )data )[index]; + break; + case QgsRasterDataProvider::UInt32: + return ( double )(( GUInt32 * )data )[index]; + break; + case QgsRasterDataProvider::Int32: + return ( double )(( GInt32 * )data )[index]; + break; + case QgsRasterDataProvider::Float32: + return ( double )(( float * )data )[index]; + break; + case QgsRasterDataProvider::Float64: + return ( double )(( double * )data )[index]; + break; + default: + //QgsMessageLog::logMessage( tr( "GDAL data type %1 is not supported" ).arg( type ), tr( "Raster" ) ); + break; + } + + return mProvider->noDataValue(); +} + +#endif // QGSRASTERRENDERER_H