Skip to content

Commit 79b8a76

Browse files
committed
Added raster renderer interface and test implementation for paletted rasters
1 parent 70865e5 commit 79b8a76

File tree

4 files changed

+147
-0
lines changed

4 files changed

+147
-0
lines changed
Lines changed: 48 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,48 @@
1+
#include "qgspalettedrasterrenderer.h"
2+
#include "qgsrasterviewport.h"
3+
#include <QColor>
4+
#include <QImage>
5+
#include <QPainter>
6+
7+
QgsPalettedRasterRenderer::QgsPalettedRasterRenderer( QgsRasterDataProvider* provider, int bandNumber, QColor* colorArray, int nColors ):
8+
QgsRasterRenderer( provider ), mBandNumber( bandNumber), mColors( colorArray ), mNColors( nColors )
9+
{
10+
}
11+
12+
QgsPalettedRasterRenderer::~QgsPalettedRasterRenderer()
13+
{
14+
delete[] mColors;
15+
}
16+
17+
void QgsPalettedRasterRenderer::draw( QPainter* p, QgsRasterViewPort* viewPort, const QgsMapToPixel* theQgsMapToPixel )
18+
{
19+
if( !p || !mProvider || !viewPort || !theQgsMapToPixel )
20+
{
21+
return;
22+
}
23+
24+
//read data from provider
25+
int typeSize = mProvider->dataTypeSize( mBandNumber ) / 8;
26+
QgsRasterDataProvider::DataType rasterType = (QgsRasterDataProvider::DataType)mProvider->dataType( mBandNumber );
27+
void* rasterData = VSIMalloc( typeSize * viewPort->drawableAreaXDim * viewPort->drawableAreaYDim);
28+
mProvider->readBlock( mBandNumber, viewPort->mDrawnExtent, viewPort->drawableAreaXDim, viewPort->drawableAreaYDim,
29+
viewPort->mSrcCRS, viewPort->mDestCRS, rasterData );
30+
int currentRasterPos = 0;
31+
32+
//raster image
33+
QImage img( viewPort->drawableAreaXDim, viewPort->drawableAreaYDim, QImage::Format_ARGB32_Premultiplied );
34+
QRgb* imageScanLine = 0;
35+
36+
for( int i = 0; i < viewPort->drawableAreaYDim; ++i )
37+
{
38+
imageScanLine = ( QRgb* )( img.scanLine( i ) );
39+
for( int j = 0; j < viewPort->drawableAreaXDim; ++j )
40+
{
41+
int val = readValue( rasterData, rasterType, currentRasterPos );
42+
imageScanLine[j] = mColors[ val ].rgba();
43+
++currentRasterPos;
44+
}
45+
}
46+
CPLFree( rasterData );
47+
p->drawImage( QPointF( viewPort->topLeftPoint.x(), viewPort->topLeftPoint.y() ), img );
48+
}
Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,24 @@
1+
#ifndef QGSPALETTEDRASTERRENDERER_H
2+
#define QGSPALETTEDRASTERRENDERER_H
3+
4+
#include "qgsrasterrenderer.h"
5+
6+
class QColor;
7+
8+
class QgsPalettedRasterRenderer: public QgsRasterRenderer
9+
{
10+
public:
11+
/**Renderer owns color array*/
12+
QgsPalettedRasterRenderer( QgsRasterDataProvider* provider, int bandNumber, QColor* colorArray, int nColors );
13+
~QgsPalettedRasterRenderer();
14+
void draw( QPainter* p, QgsRasterViewPort* viewPort, const QgsMapToPixel* theQgsMapToPixel );
15+
16+
private:
17+
int mBandNumber;
18+
/**Color array*/
19+
QColor* mColors;
20+
/**Number of colors*/
21+
int mNColors;
22+
};
23+
24+
#endif // QGSPALETTEDRASTERRENDERER_H
Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
#include "qgsrasterrenderer.h"
2+
3+
QgsRasterRenderer::QgsRasterRenderer( QgsRasterDataProvider* provider ): mProvider( provider )
4+
{
5+
}
6+
7+
QgsRasterRenderer::~QgsRasterRenderer()
8+
{
9+
}
Lines changed: 66 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,66 @@
1+
#ifndef QGSRASTERRENDERER_H
2+
#define QGSRASTERRENDERER_H
3+
4+
#include "qgsrasterdataprovider.h"
5+
6+
class QPainter;
7+
class QgsMapToPixel;
8+
class QgsRasterViewPort;
9+
10+
class QgsRasterRenderer
11+
{
12+
public:
13+
QgsRasterRenderer( QgsRasterDataProvider* provider );
14+
virtual ~QgsRasterRenderer();
15+
virtual void draw( QPainter* p, QgsRasterViewPort* viewPort, const QgsMapToPixel* theQgsMapToPixel ) = 0;
16+
17+
protected:
18+
inline double readValue( void *data, QgsRasterDataProvider::DataType type, int index );
19+
20+
QgsRasterDataProvider* mProvider;
21+
};
22+
23+
inline double QgsRasterRenderer::readValue( void *data, QgsRasterDataProvider::DataType type, int index )
24+
{
25+
if( !mProvider )
26+
{
27+
return 0;
28+
}
29+
30+
if( !data )
31+
{
32+
return mProvider->noDataValue();
33+
}
34+
35+
switch ( type )
36+
{
37+
case QgsRasterDataProvider::Byte:
38+
return ( double )(( GByte * )data )[index];
39+
break;
40+
case QgsRasterDataProvider::UInt16:
41+
return ( double )(( GUInt16 * )data )[index];
42+
break;
43+
case QgsRasterDataProvider::Int16:
44+
return ( double )(( GInt16 * )data )[index];
45+
break;
46+
case QgsRasterDataProvider::UInt32:
47+
return ( double )(( GUInt32 * )data )[index];
48+
break;
49+
case QgsRasterDataProvider::Int32:
50+
return ( double )(( GInt32 * )data )[index];
51+
break;
52+
case QgsRasterDataProvider::Float32:
53+
return ( double )(( float * )data )[index];
54+
break;
55+
case QgsRasterDataProvider::Float64:
56+
return ( double )(( double * )data )[index];
57+
break;
58+
default:
59+
//QgsMessageLog::logMessage( tr( "GDAL data type %1 is not supported" ).arg( type ), tr( "Raster" ) );
60+
break;
61+
}
62+
63+
return mProvider->noDataValue();
64+
}
65+
66+
#endif // QGSRASTERRENDERER_H

0 commit comments

Comments
 (0)