1616 ***************************************************************************/
1717
1818#include " qgsmultibandcolorrenderer.h"
19+ #include " qgscontrastenhancement.h"
1920#include " qgsrastertransparency.h"
2021#include < QImage>
2122#include < QSet>
2223
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 )
2530{
2631}
2732
@@ -36,9 +41,21 @@ void QgsMultiBandColorRenderer::draw( QPainter* p, QgsRasterViewPort* viewPort,
3641 return ;
3742 }
3843
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+ }
4259 QgsRasterDataProvider::DataType transparencyType = QgsRasterDataProvider::UnknownDataType;
4360 if ( mAlphaBand > 0 )
4461 {
@@ -47,7 +64,23 @@ void QgsMultiBandColorRenderer::draw( QPainter* p, QgsRasterViewPort* viewPort,
4764
4865 double oversamplingX, oversamplingY;
4966 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+
5184 if ( mAlphaBand > 0 )
5285 {
5386 bands << mAlphaBand ;
@@ -91,9 +124,18 @@ void QgsMultiBandColorRenderer::draw( QPainter* p, QgsRasterViewPort* viewPort,
91124 break ;
92125 }
93126
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+ }
97139 if ( mAlphaBand > 0 )
98140 {
99141 alphaData = bandData[mAlphaBand ];
@@ -102,17 +144,53 @@ void QgsMultiBandColorRenderer::draw( QPainter* p, QgsRasterViewPort* viewPort,
102144 QImage img ( nRasterCols, nRasterRows, QImage::Format_ARGB32_Premultiplied );
103145 QRgb* imageScanLine = 0 ;
104146 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 );
106151 double currentOpacity = mOpacity ; // opacity (between 0 and 1)
107152
108153 for ( int i = 0 ; i < nRasterRows; ++i )
109154 {
110155 imageScanLine = ( QRgb* )( img.scanLine ( i ) );
111156 for ( int j = 0 ; j < nRasterCols; ++j )
112157 {
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+ }
116194
117195 if ( mInvertColor )
118196 {
0 commit comments