1919#include " qgscoordinatetransform.h"
2020#include " qgsmaptopixel.h"
2121#include " qgsrasterresampler.h"
22+ #include " qgsrastertransparency.h"
2223#include " qgsrasterviewport.h"
2324#include < QColor>
2425#include < QImage>
@@ -43,18 +44,42 @@ void QgsPalettedRasterRenderer::draw( QPainter* p, QgsRasterViewPort* viewPort,
4344 }
4445
4546 double oversampling;
47+ QgsRasterDataProvider::DataType transparencyType;
48+ if ( mAlphaBand > 0 )
49+ {
50+ transparencyType = ( QgsRasterDataProvider::DataType )mProvider ->dataType ( mAlphaBand );
51+ }
4652 startRasterRead ( mBandNumber , viewPort, theQgsMapToPixel, oversampling );
4753
54+ // Read alpha band if necessary
55+ if ( mAlphaBand > 0 && mAlphaBand != mBandNumber )
56+ {
57+ startRasterRead ( mAlphaBand , viewPort, theQgsMapToPixel, oversampling );
58+ }
59+
4860 int nCols = 0 ;
4961 int nRows = 0 ;
5062 int topLeftCol = 0 ;
5163 int topLeftRow = 0 ;
5264 int currentRasterPos = 0 ;
5365 QgsRasterDataProvider::DataType rasterType = ( QgsRasterDataProvider::DataType )mProvider ->dataType ( mBandNumber );
5466 void * rasterData;
67+ double currentOpacity = mOpacity ;
68+
69+ bool hasTransparency = usesTransparency ();
70+ void * transparencyData;
5571
5672 while ( readNextRasterPart ( mBandNumber , viewPort, nCols, nRows, &rasterData, topLeftCol, topLeftRow ) )
5773 {
74+ if ( mAlphaBand > 0 && mAlphaBand != mBandNumber )
75+ {
76+ readNextRasterPart ( mAlphaBand , viewPort, nCols, nRows, &transparencyData, topLeftCol, topLeftRow );
77+ }
78+ else if ( mAlphaBand == mBandNumber )
79+ {
80+ transparencyData = rasterData;
81+ }
82+
5883 // create image
5984 QImage img ( nCols, nRows, QImage::Format_ARGB32_Premultiplied );
6085 QRgb* imageScanLine = 0 ;
@@ -67,9 +92,24 @@ void QgsPalettedRasterRenderer::draw( QPainter* p, QgsRasterViewPort* viewPort,
6792 for ( int j = 0 ; j < nCols; ++j )
6893 {
6994 val = readValue ( rasterData, rasterType, currentRasterPos );
70- // imageScanLine[j] = mColors[ val ].rgba();
71- QColor& currentColor = mColors [val];
72- imageScanLine[j] = qRgba ( mOpacity * currentColor.red (), mOpacity * currentColor.green (), mOpacity * currentColor.blue (), mOpacity * 255 );
95+ if ( !hasTransparency )
96+ {
97+ imageScanLine[j] = mColors [ val ].rgba ();
98+ }
99+ else
100+ {
101+ currentOpacity = mOpacity ;
102+ if ( mRasterTransparency )
103+ {
104+ currentOpacity = mRasterTransparency ->alphaValue ( val, mOpacity * 255 ) / 255.0 ;
105+ }
106+ if ( mAlphaBand >= 0 )
107+ {
108+ currentOpacity *= ( readValue ( transparencyData, transparencyType, currentRasterPos ) / 255.0 );
109+ }
110+ QColor& currentColor = mColors [val];
111+ imageScanLine[j] = qRgba ( currentOpacity * currentColor.red (), currentOpacity * currentColor.green (), currentOpacity * currentColor.blue (), currentOpacity * 255 );
112+ }
73113 ++currentRasterPos;
74114 }
75115 }
@@ -90,5 +130,11 @@ void QgsPalettedRasterRenderer::draw( QPainter* p, QgsRasterViewPort* viewPort,
90130 p->drawImage ( tlPoint, img );
91131 }
92132 }
133+
134+ // stop raster reading
93135 stopRasterRead ( mBandNumber );
136+ if ( mAlphaBand > 0 && mAlphaBand != mBandNumber )
137+ {
138+ stopRasterRead ( mAlphaBand );
139+ }
94140}
0 commit comments