16
16
***************************************************************************/
17
17
18
18
#include " qgsmultibandcolorrenderer.h"
19
+ #include " qgscontrastenhancement.h"
19
20
#include " qgsrastertransparency.h"
20
21
#include < QImage>
21
22
#include < QSet>
22
23
23
- QgsMultiBandColorRenderer::QgsMultiBandColorRenderer ( QgsRasterDataProvider* provider, int redBand, int greenBand, int blueBand ):
24
- QgsRasterRenderer( provider ), mRedBand( redBand ), mGreenBand( greenBand ), mBlueBand( blueBand ), mContrastEnhancement( 0 )
24
+ QgsMultiBandColorRenderer::QgsMultiBandColorRenderer ( QgsRasterDataProvider* provider, int redBand, int greenBand, int blueBand,
25
+ QgsContrastEnhancement* redEnhancement,
26
+ QgsContrastEnhancement* greenEnhancement,
27
+ QgsContrastEnhancement* blueEnhancement ):
28
+ QgsRasterRenderer( provider ), mRedBand( redBand ), mGreenBand( greenBand ), mBlueBand( blueBand ),
29
+ mRedContrastEnhancement( redEnhancement ), mGreenContrastEnhancement( greenEnhancement ), mBlueContrastEnhancement( blueEnhancement )
25
30
{
26
31
}
27
32
@@ -36,9 +41,21 @@ void QgsMultiBandColorRenderer::draw( QPainter* p, QgsRasterViewPort* viewPort,
36
41
return ;
37
42
}
38
43
39
- QgsRasterDataProvider::DataType redType = ( QgsRasterDataProvider::DataType )mProvider ->dataType ( mRedBand );
40
- QgsRasterDataProvider::DataType greenType = ( QgsRasterDataProvider::DataType )mProvider ->dataType ( mGreenBand );
41
- QgsRasterDataProvider::DataType blueType = ( QgsRasterDataProvider::DataType )mProvider ->dataType ( mBlueBand );
44
+ QgsRasterDataProvider::DataType redType;
45
+ if ( mRedBand > 0 )
46
+ {
47
+ redType = ( QgsRasterDataProvider::DataType )mProvider ->dataType ( mRedBand );
48
+ }
49
+ QgsRasterDataProvider::DataType greenType;
50
+ if ( mGreenBand > 0 )
51
+ {
52
+ greenType = ( QgsRasterDataProvider::DataType )mProvider ->dataType ( mGreenBand );
53
+ }
54
+ QgsRasterDataProvider::DataType blueType;
55
+ if ( mBlueBand > 0 )
56
+ {
57
+ blueType = ( QgsRasterDataProvider::DataType )mProvider ->dataType ( mBlueBand );
58
+ }
42
59
QgsRasterDataProvider::DataType transparencyType = QgsRasterDataProvider::UnknownDataType;
43
60
if ( mAlphaBand > 0 )
44
61
{
@@ -47,7 +64,23 @@ void QgsMultiBandColorRenderer::draw( QPainter* p, QgsRasterViewPort* viewPort,
47
64
48
65
double oversamplingX, oversamplingY;
49
66
QSet<int > bands;
50
- bands << mRedBand << mGreenBand << mBlueBand ;
67
+ if ( mRedBand > 0 )
68
+ {
69
+ bands << mRedBand ;
70
+ }
71
+ if ( mGreenBand > 0 )
72
+ {
73
+ bands << mGreenBand ;
74
+ }
75
+ if ( mBlueBand > 0 )
76
+ {
77
+ bands << mBlueBand ;
78
+ }
79
+ if ( bands.size () < 1 )
80
+ {
81
+ return ; // no need to draw anything if no band is set
82
+ }
83
+
51
84
if ( mAlphaBand > 0 )
52
85
{
53
86
bands << mAlphaBand ;
@@ -91,9 +124,18 @@ void QgsMultiBandColorRenderer::draw( QPainter* p, QgsRasterViewPort* viewPort,
91
124
break ;
92
125
}
93
126
94
- redData = bandData[mRedBand ];
95
- greenData = bandData[mGreenBand ];
96
- blueData = bandData[mBlueBand ];
127
+ if ( mRedBand > 0 )
128
+ {
129
+ redData = bandData[mRedBand ];
130
+ }
131
+ if ( mGreenBand > 0 )
132
+ {
133
+ greenData = bandData[mGreenBand ];
134
+ }
135
+ if ( mBlueBand > 0 )
136
+ {
137
+ blueData = bandData[mBlueBand ];
138
+ }
97
139
if ( mAlphaBand > 0 )
98
140
{
99
141
alphaData = bandData[mAlphaBand ];
@@ -102,17 +144,53 @@ void QgsMultiBandColorRenderer::draw( QPainter* p, QgsRasterViewPort* viewPort,
102
144
QImage img ( nRasterCols, nRasterRows, QImage::Format_ARGB32_Premultiplied );
103
145
QRgb* imageScanLine = 0 ;
104
146
int currentRasterPos = 0 ;
105
- int redVal, greenVal, blueVal;
147
+ int redVal = 0 ;
148
+ int greenVal = 0 ;
149
+ int blueVal = 0 ;
150
+ QRgb defaultColor = qRgba ( 255 , 255 , 255 , 0 );
106
151
double currentOpacity = mOpacity ; // opacity (between 0 and 1)
107
152
108
153
for ( int i = 0 ; i < nRasterRows; ++i )
109
154
{
110
155
imageScanLine = ( QRgb* )( img.scanLine ( i ) );
111
156
for ( int j = 0 ; j < nRasterCols; ++j )
112
157
{
113
- redVal = readValue ( redData, redType, currentRasterPos );
114
- greenVal = readValue ( greenData, greenType, currentRasterPos );
115
- blueVal = readValue ( blueData, blueType, currentRasterPos );
158
+ if ( mRedBand )
159
+ {
160
+ redVal = readValue ( redData, redType, currentRasterPos );
161
+ }
162
+ if ( mGreenBand )
163
+ {
164
+ greenVal = readValue ( greenData, greenType, currentRasterPos );
165
+ }
166
+ if ( mBlueBand )
167
+ {
168
+ blueVal = readValue ( blueData, blueType, currentRasterPos );
169
+ }
170
+
171
+ // apply default color if red, green or blue not in displayable range
172
+ if (( mRedContrastEnhancement && !mRedContrastEnhancement ->isValueInDisplayableRange ( redVal ) )
173
+ || ( mGreenContrastEnhancement && !mGreenContrastEnhancement ->isValueInDisplayableRange ( redVal ) )
174
+ || ( mBlueContrastEnhancement && !mBlueContrastEnhancement ->isValueInDisplayableRange ( redVal ) ) )
175
+ {
176
+ imageScanLine[j] = defaultColor;
177
+ ++currentRasterPos;
178
+ continue ;
179
+ }
180
+
181
+ // stretch color values
182
+ if ( mRedContrastEnhancement )
183
+ {
184
+ redVal = mRedContrastEnhancement ->enhanceContrast ( redVal );
185
+ }
186
+ if ( mGreenContrastEnhancement )
187
+ {
188
+ greenVal = mGreenContrastEnhancement ->enhanceContrast ( greenVal );
189
+ }
190
+ if ( mBlueContrastEnhancement )
191
+ {
192
+ blueVal = mBlueContrastEnhancement ->enhanceContrast ( blueVal );
193
+ }
116
194
117
195
if ( mInvertColor )
118
196
{
0 commit comments