-
-
Notifications
You must be signed in to change notification settings - Fork 2.9k
/
qgsrasterrenderer.h
133 lines (109 loc) · 4.36 KB
/
qgsrasterrenderer.h
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
/***************************************************************************
qgsrasterrenderer.h
-------------------
begin : December 2011
copyright : (C) 2011 by Marco Hugentobler
email : marco at sourcepole dot ch
***************************************************************************/
/***************************************************************************
* *
* This program is free software; you can redistribute it and/or modify *
* it under the terms of the GNU General Public License as published by *
* the Free Software Foundation; either version 2 of the License, or *
* (at your option) any later version. *
* *
***************************************************************************/
#ifndef QGSRASTERRENDERER_H
#define QGSRASTERRENDERER_H
#include "qgsrasterdataprovider.h"
class QPainter;
class QgsMapToPixel;
class QgsRasterResampler;
class QgsRasterTransparency;
class QgsRasterViewPort;
class QgsRasterRenderer
{
public:
struct RasterPartInfo
{
int currentCol;
int currentRow;
int nCols;
int nRows;
int nColsPerPart;
int nRowsPerPart;
int nPartsPerDimension;
void* data;
};
QgsRasterRenderer( QgsRasterDataProvider* provider, QgsRasterResampler* resampler = 0 );
virtual ~QgsRasterRenderer();
virtual void draw( QPainter* p, QgsRasterViewPort* viewPort, const QgsMapToPixel* theQgsMapToPixel ) = 0;
bool usesTransparency() const;
void setOpacity( double opacity ) { mOpacity = opacity; }
double opacity() const { return mOpacity; }
void setRasterTransparency( QgsRasterTransparency* t ) { mRasterTransparency = t; }
const QgsRasterTransparency* rasterTransparency() const { return mRasterTransparency; }
void setAlphaBand( int band ) { mAlphaBand = band; }
int alphaBand() const { return mAlphaBand; }
void setInvertColor( bool invert ){ mInvertColor = invert; }
bool invertColor() const { return mInvertColor; }
protected:
inline double readValue( void *data, QgsRasterDataProvider::DataType type, int index );
void startRasterRead( int bandNumber, QgsRasterViewPort* viewPort, const QgsMapToPixel* mapToPixel, double& oversampling );
bool readNextRasterPart( int bandNumber, QgsRasterViewPort* viewPort, int& nCols, int& nRows, void** rasterData, int& topLeftCol, int& topLeftRow );
void stopRasterRead( int bandNumber );
QgsRasterDataProvider* mProvider;
QgsRasterResampler* mResampler;
QMap<int, RasterPartInfo> mRasterPartInfos;
/**Global alpha value (0-1)*/
double mOpacity;
/**Raster transparency per color or value. Overwrites global alpha value*/
QgsRasterTransparency* mRasterTransparency;
/**Read alpha value from band. Is combined with value from raster transparency / global alpha value.
Default: -1 (not set)*/
int mAlphaBand;
bool mInvertColor;
private:
/**Remove part into and release memory*/
void removePartInfo( int bandNumer );
};
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