17
17
18
18
#include " qgssinglebandgrayrenderer.h"
19
19
#include " qgscontrastenhancement.h"
20
+ #include " qgsrastertransparency.h"
20
21
#include < QImage>
21
22
22
23
QgsSingleBandGrayRenderer::QgsSingleBandGrayRenderer ( QgsRasterDataProvider* provider, int grayBand, QgsRasterResampler* resampler ):
@@ -37,20 +38,40 @@ void QgsSingleBandGrayRenderer::draw( QPainter* p, QgsRasterViewPort* viewPort,
37
38
38
39
double oversamplingX, oversamplingY;
39
40
startRasterRead ( mGrayBand , viewPort, theQgsMapToPixel, oversamplingX, oversamplingY );
41
+ if ( mAlphaBand > 0 && mGrayBand != mAlphaBand )
42
+ {
43
+ startRasterRead ( mAlphaBand , viewPort, theQgsMapToPixel, oversamplingX, oversamplingY );
44
+ }
40
45
41
46
int nCols = 0 ;
42
47
int nRows = 0 ;
43
48
int topLeftCol = 0 ;
44
49
int topLeftRow = 0 ;
45
50
QgsRasterDataProvider::DataType rasterType = ( QgsRasterDataProvider::DataType )mProvider ->dataType ( mGrayBand );
51
+ QgsRasterDataProvider::DataType alphaType = QgsRasterDataProvider::UnknownDataType;
52
+ if ( mAlphaBand > 0 )
53
+ {
54
+ alphaType = ( QgsRasterDataProvider::DataType )mProvider ->dataType ( mAlphaBand );
55
+ }
46
56
void * rasterData;
47
- // double currentOpacity = mOpacity;
57
+ void * alphaData;
58
+ double currentAlpha = mOpacity ;
48
59
int grayVal;
49
60
QRgb myDefaultColor = qRgba ( 0 , 0 , 0 , 0 );
50
61
51
62
52
63
while ( readNextRasterPart ( mGrayBand , viewPort, nCols, nRows, &rasterData, topLeftCol, topLeftRow ) )
53
64
{
65
+ if ( mAlphaBand > 0 && mGrayBand != mAlphaBand )
66
+ {
67
+ readNextRasterPart ( mAlphaBand , viewPort, nCols, nRows, &alphaData, topLeftCol, topLeftRow );
68
+ }
69
+ else if ( mAlphaBand > 0 )
70
+ {
71
+ alphaData = rasterData;
72
+ }
73
+
74
+
54
75
// create image
55
76
QImage img ( nCols, nRows, QImage::Format_ARGB32_Premultiplied );
56
77
QRgb* imageScanLine = 0 ;
@@ -79,7 +100,25 @@ void QgsSingleBandGrayRenderer::draw( QPainter* p, QgsRasterViewPort* viewPort,
79
100
grayVal = 255 - grayVal;
80
101
}
81
102
82
- imageScanLine[j] = qRgba ( grayVal, grayVal, grayVal, 255 );
103
+ // alpha
104
+ currentAlpha = mOpacity ;
105
+ if ( mRasterTransparency )
106
+ {
107
+ currentAlpha = mRasterTransparency ->alphaValue ( grayVal, mOpacity * 255 ) / 255.0 ;
108
+ }
109
+ if ( mAlphaBand > 0 )
110
+ {
111
+ currentAlpha *= ( readValue ( alphaData, alphaType, currentRasterPos ) / 255.0 );
112
+ }
113
+
114
+ if ( doubleNear ( currentAlpha, 255 ) )
115
+ {
116
+ imageScanLine[j] = qRgba ( grayVal, grayVal, grayVal, 255 );
117
+ }
118
+ else
119
+ {
120
+ imageScanLine[j] = qRgba ( currentAlpha * grayVal, currentAlpha * grayVal, currentAlpha * grayVal, currentAlpha * 255 );
121
+ }
83
122
++currentRasterPos;
84
123
}
85
124
}
@@ -88,4 +127,9 @@ void QgsSingleBandGrayRenderer::draw( QPainter* p, QgsRasterViewPort* viewPort,
88
127
}
89
128
90
129
stopRasterRead ( mGrayBand );
130
+ if ( mAlphaBand > 0 && mGrayBand != mAlphaBand )
131
+ {
132
+ stopRasterRead ( mAlphaBand );
133
+ }
134
+
91
135
}
0 commit comments