1717
1818#include " qgssinglebandgrayrenderer.h"
1919#include " qgscontrastenhancement.h"
20+ #include " qgsrastertransparency.h"
2021#include < QImage>
2122
2223QgsSingleBandGrayRenderer::QgsSingleBandGrayRenderer ( QgsRasterDataProvider* provider, int grayBand, QgsRasterResampler* resampler ):
@@ -37,20 +38,40 @@ void QgsSingleBandGrayRenderer::draw( QPainter* p, QgsRasterViewPort* viewPort,
3738
3839 double oversamplingX, oversamplingY;
3940 startRasterRead ( mGrayBand , viewPort, theQgsMapToPixel, oversamplingX, oversamplingY );
41+ if ( mAlphaBand > 0 && mGrayBand != mAlphaBand )
42+ {
43+ startRasterRead ( mAlphaBand , viewPort, theQgsMapToPixel, oversamplingX, oversamplingY );
44+ }
4045
4146 int nCols = 0 ;
4247 int nRows = 0 ;
4348 int topLeftCol = 0 ;
4449 int topLeftRow = 0 ;
4550 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+ }
4656 void * rasterData;
47- // double currentOpacity = mOpacity;
57+ void * alphaData;
58+ double currentAlpha = mOpacity ;
4859 int grayVal;
4960 QRgb myDefaultColor = qRgba ( 0 , 0 , 0 , 0 );
5061
5162
5263 while ( readNextRasterPart ( mGrayBand , viewPort, nCols, nRows, &rasterData, topLeftCol, topLeftRow ) )
5364 {
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+
5475 // create image
5576 QImage img ( nCols, nRows, QImage::Format_ARGB32_Premultiplied );
5677 QRgb* imageScanLine = 0 ;
@@ -79,7 +100,25 @@ void QgsSingleBandGrayRenderer::draw( QPainter* p, QgsRasterViewPort* viewPort,
79100 grayVal = 255 - grayVal;
80101 }
81102
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+ }
83122 ++currentRasterPos;
84123 }
85124 }
@@ -88,4 +127,9 @@ void QgsSingleBandGrayRenderer::draw( QPainter* p, QgsRasterViewPort* viewPort,
88127 }
89128
90129 stopRasterRead ( mGrayBand );
130+ if ( mAlphaBand > 0 && mGrayBand != mAlphaBand )
131+ {
132+ stopRasterRead ( mAlphaBand );
133+ }
134+
91135}
0 commit comments