Skip to content

Commit 76cc219

Browse files
committed
Consider transparency in raster renderer
1 parent 25f8ec5 commit 76cc219

File tree

6 files changed

+105
-6
lines changed

6 files changed

+105
-6
lines changed

src/core/raster/qgspalettedrasterrenderer.cpp

Lines changed: 49 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,7 @@
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
}

src/core/raster/qgsrasterlayer.cpp

Lines changed: 24 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -843,7 +843,7 @@ void QgsRasterLayer::draw( QPainter * theQPainter,
843843
{
844844
QgsDebugMsg( "PalettedColor drawing type detected..." );
845845

846-
//test
846+
//create color array for renderer
847847
int bNumber = bandNumber( mGrayBandName );
848848
QList<QgsColorRampShader::ColorRampItem> itemList = mRasterStatsList[ bNumber - 1].colorTable;
849849
QColor* colorArray = new QColor[itemList.size()];
@@ -854,7 +854,17 @@ void QgsRasterLayer::draw( QPainter * theQPainter,
854854
}
855855

856856
QgsPalettedRasterRenderer renderer( mDataProvider, bNumber, colorArray, itemList.size(), mResampler );
857+
//opacity settings for renderer
857858
renderer.setOpacity( mTransparencyLevel / 255.0 );
859+
renderer.setRasterTransparency( &mRasterTransparency );
860+
if ( mTransparencyBandName != TRSTRING_NOT_SET )
861+
{
862+
int tBandNr = bandNumber( mTransparencyBandName );
863+
if ( tBandNr > 0 )
864+
{
865+
renderer.setAlphaBand( tBandNr );
866+
}
867+
}
858868
renderer.draw( theQPainter, theRasterViewPort, theQgsMapToPixel );
859869
#if 0
860870
drawPalettedSingleBandColor( theQPainter, theRasterViewPort,
@@ -946,6 +956,19 @@ void QgsRasterLayer::draw( QPainter * theQPainter,
946956
int green = bandNumber( mGreenBandName );
947957
int blue = bandNumber( mBlueBandName );
948958
QgsMultiBandColorRenderer r( mDataProvider, red, green, blue, mResampler );
959+
960+
//opacity settings for renderer
961+
r.setOpacity( mTransparencyLevel / 255.0 );
962+
r.setRasterTransparency( &mRasterTransparency );
963+
if ( mTransparencyBandName != TRSTRING_NOT_SET )
964+
{
965+
int tBandNr = bandNumber( mTransparencyBandName );
966+
if ( tBandNr > 0 )
967+
{
968+
r.setAlphaBand( tBandNr );
969+
}
970+
}
971+
949972
r.draw( theQPainter, theRasterViewPort, theQgsMapToPixel );
950973
#if 0
951974
drawMultiBandColor( theQPainter, theRasterViewPort,

src/core/raster/qgsrasterrenderer.cpp

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -16,11 +16,12 @@
1616
***************************************************************************/
1717

1818
#include "qgsrasterrenderer.h"
19+
#include "qgsrastertransparency.h"
1920
#include "qgsrasterviewport.h"
2021
#include "qgsmaptopixel.h"
2122

2223
QgsRasterRenderer::QgsRasterRenderer( QgsRasterDataProvider* provider, QgsRasterResampler* resampler ): mProvider( provider ), mResampler( resampler ),
23-
mOpacity( 255 )
24+
mOpacity( 1.0 ), mRasterTransparency( 0 ), mAlphaBand( -1 )
2425
{
2526
}
2627

@@ -147,3 +148,8 @@ void QgsRasterRenderer::removePartInfo( int bandNumber )
147148
mRasterPartInfos.remove( bandNumber );
148149
}
149150
}
151+
152+
bool QgsRasterRenderer::usesTransparency() const
153+
{
154+
return ( mAlphaBand > 0 || ( mRasterTransparency && !mRasterTransparency->isEmpty() ) || !doubleNear( mOpacity, 1.0 ) );
155+
}

src/core/raster/qgsrasterrenderer.h

Lines changed: 17 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,7 @@
2323
class QPainter;
2424
class QgsMapToPixel;
2525
class QgsRasterResampler;
26+
class QgsRasterTransparency;
2627
class QgsRasterViewPort;
2728

2829
class QgsRasterRenderer
@@ -45,9 +46,17 @@ class QgsRasterRenderer
4546
virtual ~QgsRasterRenderer();
4647
virtual void draw( QPainter* p, QgsRasterViewPort* viewPort, const QgsMapToPixel* theQgsMapToPixel ) = 0;
4748

49+
bool usesTransparency() const;
50+
4851
void setOpacity( double opacity ) { mOpacity = opacity; }
4952
double opacity() const { return mOpacity; }
5053

54+
void setRasterTransparency( QgsRasterTransparency* t ) { mRasterTransparency = t; }
55+
const QgsRasterTransparency* rasterTransparency() const { return mRasterTransparency; }
56+
57+
void setAlphaBand( int band ) { mAlphaBand = band; }
58+
int alphaBand() const { return mAlphaBand; }
59+
5160
protected:
5261
inline double readValue( void *data, QgsRasterDataProvider::DataType type, int index );
5362

@@ -59,7 +68,14 @@ class QgsRasterRenderer
5968
QgsRasterDataProvider* mProvider;
6069
QgsRasterResampler* mResampler;
6170
QMap<int, RasterPartInfo> mRasterPartInfos;
62-
double mOpacity; //global alpha value
71+
72+
/**Global alpha value (0-1)*/
73+
double mOpacity;
74+
/**Raster transparency per color or value. Overwrites global alpha value*/
75+
QgsRasterTransparency* mRasterTransparency;
76+
/**Read alpha value from band. Is combined with value from raster transparency / global alpha value.
77+
Default: -1 (not set)*/
78+
int mAlphaBand;
6379

6480
private:
6581
/**Remove part into and release memory*/

src/core/raster/qgsrastertransparency.cpp

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -168,3 +168,8 @@ int QgsRasterTransparency::alphaValue( double theRedValue, double theGreenValue,
168168

169169
return theGlobalTransparency;
170170
}
171+
172+
bool QgsRasterTransparency::isEmpty() const
173+
{
174+
return ( mTransparentThreeValuePixelList.isEmpty() && mTransparentSingleValuePixelList.isEmpty() );
175+
}

src/core/raster/qgsrastertransparency.h

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -72,6 +72,9 @@ class CORE_EXPORT QgsRasterTransparency
7272
/** \brief Return the transparency value for a RGB Pixel */
7373
int alphaValue( double, double, double, int theGlobalTransparency = 255 ) const;
7474

75+
/**True if there are no entries in the pixel lists*/
76+
bool isEmpty() const;
77+
7578
private:
7679
/** \brief The list to hold transparency values for RGB layers */
7780
QList<QgsRasterTransparency::TransparentThreeValuePixel> mTransparentThreeValuePixelList;

0 commit comments

Comments
 (0)