Skip to content

Commit 421d5aa

Browse files
author
homann
committed
Made point symbols respect the layer transparency setting. Fixes #1220
git-svn-id: http://svn.osgeo.org/qgis/trunk/qgis@11275 c8812cc2-4d05-0410-92ff-de0c093fc19c
1 parent fd86c81 commit 421d5aa

16 files changed

+74
-47
lines changed

src/core/qgsvectorlayer.cpp

+7-1
Original file line numberDiff line numberDiff line change
@@ -739,7 +739,13 @@ bool QgsVectorLayer::draw( QgsRenderContext& rendererContext )
739739

740740
//QgsDebugMsg(QString("markerScale before renderFeature(): %1").arg(markerScaleFactor));
741741
// markerScalerFactore reflects the wanted scaling of the marker
742-
mRenderer->renderFeature( rendererContext, fet, &marker, sel );
742+
743+
double opacity = 1.0;
744+
if ( !mRenderer->usesTransparency() )
745+
{
746+
opacity = ( mTransparencyLevel * 1.0) / 255.0;
747+
}
748+
mRenderer->renderFeature( rendererContext, fet, &marker, sel, opacity );
743749

744750
// markerScalerFactore now reflects the actual scaling of the marker that the render performed.
745751
//QgsDebugMsg(QString("markerScale after renderFeature(): %1").arg(markerScaleFactor));

src/core/renderer/qgscontinuouscolorrenderer.cpp

+4-2
Original file line numberDiff line numberDiff line change
@@ -74,7 +74,7 @@ void QgsContinuousColorRenderer::setMaximumSymbol( QgsSymbol* sy )
7474
mMaximumSymbol = sy;
7575
}
7676

77-
void QgsContinuousColorRenderer::renderFeature( QgsRenderContext &renderContext, QgsFeature & f, QImage* img, bool selected )
77+
void QgsContinuousColorRenderer::renderFeature( QgsRenderContext &renderContext, QgsFeature & f, QImage* img, bool selected, double opacity )
7878
{
7979
QPainter *p = renderContext.painter();
8080

@@ -148,7 +148,9 @@ void QgsContinuousColorRenderer::renderFeature( QgsRenderContext &renderContext,
148148
brush.setStyle( Qt::SolidPattern );
149149

150150
*img = QgsMarkerCatalogue::instance()->imageMarker( mMinimumSymbol->pointSymbolName(),
151-
mMinimumSymbol->pointSize() * renderContext.scaleFactor() * renderContext.rasterScaleFactor(), pen, brush );
151+
mMinimumSymbol->pointSize() * renderContext.scaleFactor() * renderContext.rasterScaleFactor(),
152+
pen, brush, opacity );
153+
152154
}
153155
else if ( mGeometryType == QGis::Line )
154156
{

src/core/renderer/qgscontinuouscolorrenderer.h

+1-1
Original file line numberDiff line numberDiff line change
@@ -38,7 +38,7 @@ class CORE_EXPORT QgsContinuousColorRenderer: public QgsRenderer
3838

3939
/**Renders the feature using the minimum and maximum value of the classification field
4040
* added in 1.2 */
41-
void renderFeature( QgsRenderContext &renderContext, QgsFeature& f, QImage* img, bool selected );
41+
void renderFeature( QgsRenderContext &renderContext, QgsFeature& f, QImage* img, bool selected, double opacity = 1.0 );
4242

4343
/**Returns the number of the classification field*/
4444
int classificationField() const;

src/core/renderer/qgsgraduatedsymbolrenderer.cpp

+3-2
Original file line numberDiff line numberDiff line change
@@ -116,7 +116,7 @@ bool QgsGraduatedSymbolRenderer::willRenderFeature( QgsFeature *f )
116116
return ( symbolForFeature( f ) != 0 );
117117
}
118118

119-
void QgsGraduatedSymbolRenderer::renderFeature( QgsRenderContext &renderContext, QgsFeature & f, QImage* img, bool selected )
119+
void QgsGraduatedSymbolRenderer::renderFeature( QgsRenderContext &renderContext, QgsFeature & f, QImage* img, bool selected, double opacity )
120120
{
121121
QPainter *p = renderContext.painter();
122122
QgsSymbol* theSymbol = symbolForFeature( &f );
@@ -165,7 +165,8 @@ void QgsGraduatedSymbolRenderer::renderFeature( QgsRenderContext &renderContext,
165165
oldName = theSymbol->pointSymbolName();
166166
theSymbol->setNamedPointSymbol( name );
167167
}
168-
*img = theSymbol->getPointSymbolAsImage( renderContext.scaleFactor(), selected, mSelectionColor, fieldScale, rotation, renderContext.rasterScaleFactor() );
168+
*img = theSymbol->getPointSymbolAsImage( renderContext.scaleFactor(), selected, mSelectionColor, fieldScale,
169+
rotation, renderContext.rasterScaleFactor(), opacity );
169170

170171
if ( !oldName.isNull() )
171172
{

src/core/renderer/qgsgraduatedsymbolrenderer.h

+1-1
Original file line numberDiff line numberDiff line change
@@ -71,7 +71,7 @@ class CORE_EXPORT QgsGraduatedSymbolRenderer: public QgsRenderer
7171
\param f a pointer to a feature to render
7272
\param t the transform object containing the information how to transform the map coordinates to screen coordinates
7373
\note added in 1.2 */
74-
void renderFeature( QgsRenderContext &renderContext, QgsFeature& f, QImage* img, bool selected );
74+
void renderFeature( QgsRenderContext &renderContext, QgsFeature& f, QImage* img, bool selected, double opacity = 1.0 );
7575

7676
/**Sets the classicifation field by index
7777
\param field the number of the field to classify*/

src/core/renderer/qgsrenderer.h

+5-1
Original file line numberDiff line numberDiff line change
@@ -72,7 +72,11 @@ class CORE_EXPORT QgsRenderer
7272

7373
/**A vector layer passes features to a renderer object to change the brush and pen of the qpainter
7474
@note added in 1.2 */
75-
virtual void renderFeature( QgsRenderContext &renderContext, QgsFeature& f, QImage* pic, bool selected ) = 0;
75+
//void renderFeature( QgsRenderContext &renderContext, QgsFeature& f, QImage* pic, bool selected )
76+
//{
77+
// void renderFeature( renderContext, f, pic, selected, 255);
78+
//}
79+
virtual void renderFeature( QgsRenderContext &renderContext, QgsFeature& f, QImage* pic, bool selected, double opacity = 1.0 ) = 0;
7680

7781
/**Reads the renderer configuration from an XML file
7882
@param rnode the Dom node to read

src/core/renderer/qgssinglesymbolrenderer.cpp

+2-2
Original file line numberDiff line numberDiff line change
@@ -94,7 +94,7 @@ void QgsSingleSymbolRenderer::addSymbol( QgsSymbol *sy )
9494
updateSymbolAttributes();
9595
}
9696

97-
void QgsSingleSymbolRenderer::renderFeature( QgsRenderContext &renderContext, QgsFeature & f, QImage* img, bool selected )
97+
void QgsSingleSymbolRenderer::renderFeature( QgsRenderContext &renderContext, QgsFeature & f, QImage* img, bool selected, double opacity )
9898
{
9999
QPainter *p = renderContext.painter();
100100

@@ -156,7 +156,7 @@ void QgsSingleSymbolRenderer::renderFeature( QgsRenderContext &renderContext, Qg
156156
scale *= ( x2 - x1 ) * 0.001;
157157
}
158158

159-
*img = sy->getPointSymbolAsImage( scale, selected, mSelectionColor, fieldScale, rotation, renderContext.rasterScaleFactor() );
159+
*img = sy->getPointSymbolAsImage( scale, selected, mSelectionColor, fieldScale, rotation, renderContext.rasterScaleFactor(), opacity );
160160
}
161161

162162
// Line, polygon

src/core/renderer/qgssinglesymbolrenderer.h

+1-1
Original file line numberDiff line numberDiff line change
@@ -40,7 +40,7 @@ class CORE_EXPORT QgsSingleSymbolRenderer: public QgsRenderer
4040

4141
/**Renders a feature
4242
* added in 1.2 */
43-
void renderFeature( QgsRenderContext &renderContext, QgsFeature& f, QImage* img, bool selected );
43+
void renderFeature( QgsRenderContext &renderContext, QgsFeature& f, QImage* img, bool selected, double opacity = 1.0 );
4444

4545
/**Reads the renderer configuration from an XML file
4646
@param rnode the Dom node to read

src/core/renderer/qgsuniquevaluerenderer.cpp

+3-2
Original file line numberDiff line numberDiff line change
@@ -105,7 +105,7 @@ bool QgsUniqueValueRenderer::willRenderFeature( QgsFeature *f )
105105
return ( symbolForFeature( f ) != 0 );
106106
}
107107

108-
void QgsUniqueValueRenderer::renderFeature( QgsRenderContext &renderContext, QgsFeature& f, QImage* img, bool selected )
108+
void QgsUniqueValueRenderer::renderFeature( QgsRenderContext &renderContext, QgsFeature& f, QImage* img, bool selected, double opacity )
109109
{
110110
QPainter *p = renderContext.painter();
111111
QgsSymbol* symbol = symbolForFeature( &f );
@@ -152,7 +152,8 @@ void QgsUniqueValueRenderer::renderFeature( QgsRenderContext &renderContext, Qgs
152152
}
153153

154154
*img = symbol->getPointSymbolAsImage( renderContext.scaleFactor(), selected, mSelectionColor,
155-
fieldScale, rotation, renderContext.rasterScaleFactor() );
155+
fieldScale, rotation, renderContext.rasterScaleFactor(),
156+
opacity );
156157
if ( !oldName.isNull() )
157158
{
158159
symbol->setNamedPointSymbol( oldName );

src/core/renderer/qgsuniquevaluerenderer.h

+1-1
Original file line numberDiff line numberDiff line change
@@ -34,7 +34,7 @@ class CORE_EXPORT QgsUniqueValueRenderer: public QgsRenderer
3434

3535
/** Render feature
3636
* added in 1.2 */
37-
void renderFeature( QgsRenderContext &renderContext, QgsFeature& f, QImage* img, bool selected );
37+
void renderFeature( QgsRenderContext &renderContext, QgsFeature& f, QImage* img, bool selected, double opacity = 1.0 );
3838

3939
/**Reads the renderer configuration from an XML file
4040
@param rnode the Dom node to read

src/core/symbology/qgsmarkercatalogue.cpp

+7-5
Original file line numberDiff line numberDiff line change
@@ -113,7 +113,7 @@ QgsMarkerCatalogue *QgsMarkerCatalogue::instance()
113113
return QgsMarkerCatalogue::mMarkerCatalogue;
114114
}
115115

116-
QImage QgsMarkerCatalogue::imageMarker( QString fullName, double size, QPen pen, QBrush brush, bool qtBug )
116+
QImage QgsMarkerCatalogue::imageMarker( QString fullName, double size, QPen pen, QBrush brush, double opacity )
117117
{
118118

119119
//
@@ -149,6 +149,7 @@ QImage QgsMarkerCatalogue::imageMarker( QString fullName, double size, QPen pen,
149149
QPainter myPainter;
150150
myPainter.begin( &myImage );
151151
myPainter.setRenderHint( QPainter::Antialiasing );
152+
myPainter.setOpacity( opacity );
152153

153154
//
154155
// Now pass the paintdevice along to have the marker rendered on it
@@ -182,7 +183,7 @@ QImage QgsMarkerCatalogue::imageMarker( QString fullName, double size, QPen pen,
182183

183184
if ( fullName.startsWith( "hard:" ) )
184185
{
185-
hardMarker( &myPainter, imageSize, fullName.mid( 5 ), size, pen, brush, qtBug );
186+
hardMarker( &myPainter, imageSize, fullName.mid( 5 ), size, pen, brush);
186187
#ifdef IMAGEDEBUG
187188
QgsDebugMsg( "*** Saving hard marker to hardMarker.png ***" );
188189
#ifdef QGISDEBUG
@@ -195,7 +196,7 @@ QImage QgsMarkerCatalogue::imageMarker( QString fullName, double size, QPen pen,
195196
return QImage(); // empty
196197
}
197198

198-
QPicture QgsMarkerCatalogue::pictureMarker( QString fullName, double size, QPen pen, QBrush brush, bool qtBug )
199+
QPicture QgsMarkerCatalogue::pictureMarker( QString fullName, double size, QPen pen, QBrush brush, double opacity)
199200
{
200201

201202
//
@@ -218,6 +219,7 @@ QPicture QgsMarkerCatalogue::pictureMarker( QString fullName, double size, QPen
218219

219220
QPainter myPainter( &myPicture );
220221
myPainter.setRenderHint( QPainter::Antialiasing );
222+
myPainter.setOpacity( opacity );
221223

222224
//
223225
// Now pass the paintdevice along to have the marker rndered on it
@@ -233,7 +235,7 @@ QPicture QgsMarkerCatalogue::pictureMarker( QString fullName, double size, QPen
233235

234236
if ( fullName.left( 5 ) == "hard:" )
235237
{
236-
hardMarker( &myPainter, ( int ) size, fullName.mid( 5 ), size, pen, brush, qtBug );
238+
hardMarker( &myPainter, ( int ) size, fullName.mid( 5 ), size, pen, brush );
237239
return myPicture;
238240
}
239241

@@ -285,7 +287,7 @@ bool QgsMarkerCatalogue::svgMarker( QPainter * thepPainter, QString fileName, do
285287
return true;
286288
}
287289

288-
void QgsMarkerCatalogue::hardMarker( QPainter * thepPainter, int imageSize, QString name, double s, QPen pen, QBrush brush, bool qtBug )
290+
void QgsMarkerCatalogue::hardMarker( QPainter * thepPainter, int imageSize, QString name, double s, QPen pen, QBrush brush )
289291
{
290292
// Size of polygon symbols is calculated so that the boundingbox is circumscribed
291293
// around a circle with diameter mPointSize

src/core/symbology/qgsmarkercatalogue.h

+3-3
Original file line numberDiff line numberDiff line change
@@ -43,12 +43,12 @@ class CORE_EXPORT QgsMarkerCatalogue : public QObject
4343
/** Returns pixmap of the marker
4444
* \param fullName full name, e.g. hard:circle, svg:/home/usr1/marker1.svg
4545
*/
46-
QImage imageMarker( QString fullName, double size, QPen pen, QBrush brush, bool qtBug = true );
46+
QImage imageMarker( QString fullName, double size, QPen pen, QBrush brush, double opacity = 1.0);
4747

4848
/** Returns qpicture of the marker
4949
* \param fullName full name, e.g. hard:circle, svg:/home/usr1/marker1.svg
5050
*/
51-
QPicture pictureMarker( QString fullName, double size, QPen pen, QBrush brush, bool qtBug = true );
51+
QPicture pictureMarker( QString fullName, double size, QPen pen, QBrush brush, double opacity = 1.0 );
5252

5353
/** Returns a pixmap given a file name of a svg marker
5454
* NOTE: this method needs to be public static for QgsMarkerDialog::visualizeMarkers */
@@ -71,7 +71,7 @@ class CORE_EXPORT QgsMarkerCatalogue : public QObject
7171
QStringList mList;
7272

7373
/** Hard coded */
74-
void hardMarker( QPainter * thepPainter, int imageSize, QString name, double size, QPen pen, QBrush brush, bool qtBug = true );
74+
void hardMarker( QPainter * thepPainter, int imageSize, QString name, double size, QPen pen, QBrush brush );
7575

7676
bool fontMarker( QPainter * thepPainter, QString name, double size );
7777

src/core/symbology/qgssymbol.cpp

+22-17
Original file line numberDiff line numberDiff line change
@@ -352,19 +352,19 @@ QImage QgsSymbol::getPolygonSymbolAsImage()
352352
return img; //this is ok because of qts sharing mechanism
353353
}
354354

355-
QImage QgsSymbol::getCachedPointSymbolAsImage( double widthScale,
356-
bool selected, QColor selectionColor )
355+
QImage QgsSymbol::getCachedPointSymbolAsImage( double widthScale, bool selected, QColor selectionColor, double opacity )
357356
{
358357
if ( !mCacheUpToDate2
359-
|| ( selected && mSelectionColor != selectionColor ) )
358+
|| ( selected && mSelectionColor != selectionColor ) || ( opacity != mOpacity ) )
360359
{
361360
if ( selected )
362361
{
363-
cache2( widthScale, selectionColor );
362+
cache2( widthScale, selectionColor, opacity);
364363
}
365364
else
366365
{
367-
cache2( widthScale, mSelectionColor );
366+
367+
cache2( widthScale, mSelectionColor, opacity );
368368
}
369369
}
370370

@@ -379,14 +379,15 @@ QImage QgsSymbol::getCachedPointSymbolAsImage( double widthScale,
379379
}
380380

381381
QImage QgsSymbol::getPointSymbolAsImage( double widthScale, bool selected, QColor selectionColor, double scale,
382-
double rotation, double rasterScaleFactor )
382+
double rotation, double rasterScaleFactor, double opacity )
383383
{
384+
384385
if ( 1.0 == ( scale * rasterScaleFactor ) && 0 == rotation )
385386
{
386387
if ( mWidthScale < 0 || widthScale == mWidthScale )
387388
{
388-
// If scale is 1.0 and rotation 0.0, use cached image.
389-
return getCachedPointSymbolAsImage( widthScale, selected, selectionColor );
389+
// If scale is 1.0, rotation 0.0 use cached image.
390+
return getCachedPointSymbolAsImage( widthScale, selected, selectionColor, opacity );
390391
}
391392
}
392393

@@ -402,18 +403,19 @@ QImage QgsSymbol::getPointSymbolAsImage( double widthScale, bool selected, QColo
402403
preRotateImage = QgsMarkerCatalogue::instance()->imageMarker(
403404
mPointSymbolName,
404405
( float )( mSize * scale * widthScale * rasterScaleFactor ),
405-
pen, mBrush );
406+
pen, mBrush, opacity );
406407
}
407408
else
408409
{
409-
QgsDebugMsg( QString( "marker:%1 mPointSize:%2 mPointSizeUnits:%3 scale:%4 widthScale:%5 rasterScaleFactor:%6" )
410-
.arg( mPointSymbolName )
411-
.arg( mSize ).arg( mSizeInMapUnits ? "true" : "false" )
412-
.arg( scale ).arg( widthScale ).arg( rasterScaleFactor ) );
410+
QgsDebugMsg( QString( "marker:%1 mPointSize:%2 mPointSizeUnits:%3 scale:%4 widthScale:%5 rasterScaleFactor:%6 opacity:%7" )
411+
.arg( mPointSymbolName ).arg( mSize ).arg( mSizeInMapUnits ? "true" : "false" )
412+
.arg( scale ).arg( widthScale ).arg( rasterScaleFactor ).arg( opacity ) );
413+
414+
413415
preRotateImage = QgsMarkerCatalogue::instance()->imageMarker(
414416
mPointSymbolName,
415417
( float )( mSize * scale * widthScale * rasterScaleFactor ),
416-
pen, mBrush );
418+
pen, mBrush, opacity );
417419
}
418420

419421
QMatrix rotationMatrix;
@@ -443,26 +445,29 @@ void QgsSymbol::cache( QColor selectionColor )
443445
mCacheUpToDate = true;
444446
}
445447

446-
void QgsSymbol::cache2( double widthScale, QColor selectionColor )
448+
void QgsSymbol::cache2( double widthScale, QColor selectionColor, double opacity )
447449
{
448450
// QgsDebugMsg(QString("widthScale = %1").arg(widthScale));
449451

450452
QPen pen = mPen;
451453
pen.setWidthF( widthScale * pen.widthF() );
452454

453455
mPointSymbolImage2 = QgsMarkerCatalogue::instance()->imageMarker( mPointSymbolName, mSize * widthScale,
454-
pen, mBrush, false );
456+
pen, mBrush, opacity);
455457

456458
QBrush brush = mBrush;
457459
brush.setColor( selectionColor );
458460
pen.setColor( selectionColor );
459461

460462
mPointSymbolImageSelected2 = QgsMarkerCatalogue::instance()->imageMarker(
461-
mPointSymbolName, mSize * widthScale, pen, brush, false );
463+
mPointSymbolName, mSize * widthScale, pen, brush, opacity );
462464

463465
mSelectionColor2 = selectionColor;
464466

465467
mWidthScale = widthScale;
468+
469+
mOpacity = opacity;
470+
466471
mCacheUpToDate2 = true;
467472
}
468473

src/core/symbology/qgssymbol.h

+9-3
Original file line numberDiff line numberDiff line change
@@ -108,7 +108,9 @@ class CORE_EXPORT QgsSymbol
108108
/** Get QImage representation of point symbol with current settings
109109
*/
110110
virtual QImage getCachedPointSymbolAsImage( double widthScale = 1.0,
111-
bool selected = false, QColor selectionColor = Qt::yellow );
111+
bool selected = false,
112+
QColor selectionColor = Qt::yellow,
113+
double opacity = 1.0);
112114

113115
/** Get QImage representation of point symbol with current settings
114116
* and scaled (can be slow when scale != 1.0)
@@ -118,7 +120,8 @@ class CORE_EXPORT QgsSymbol
118120
QColor selectionColor = Qt::yellow,
119121
double scale = 1.0,
120122
double rotation = 0.0,
121-
double rasterScaleFactor = 1.0 );
123+
double rasterScaleFactor = 1.0,
124+
double opacity = 1.0);
122125

123126
/**Writes the contents of the symbol to a configuration file
124127
@ return true in case of success*/
@@ -193,11 +196,14 @@ class CORE_EXPORT QgsSymbol
193196
QImage mPointSymbolImage2;
194197
QImage mPointSymbolImageSelected2;
195198

199+
/* The alpha channel of the symbol */
200+
double mOpacity;
201+
196202
/* Create point symbol mPointSymbolImage/mPointSymbolImage cache */
197203
void cache( QColor selectionColor );
198204

199205
/* Create point symbol mPointSymbolImage2 cache */
200-
void cache2( double widthScale, QColor selectionColor );
206+
void cache2( double widthScale, QColor selectionColor, double opacity);
201207

202208
/* mPointSymbolImage/mPointSymbolImage cache updated */
203209
bool mCacheUpToDate;

src/providers/osm/osmrenderer.cpp

+4-4
Original file line numberDiff line numberDiff line change
@@ -92,7 +92,7 @@ bool OsmRenderer::willRenderFeature( QgsFeature *f )
9292
}
9393

9494

95-
void OsmRenderer::renderFeature( QgsRenderContext &renderContext, QgsFeature& f, QImage* pic, bool selected )
95+
void OsmRenderer::renderFeature( QgsRenderContext &renderContext, QgsFeature& f, QImage* pic, bool selected, double opacity )
9696
{
9797
// QgsDebugMsg("RENDERING FEAT:" + f.id());
9898
QPainter* p = renderContext.painter();
@@ -104,20 +104,20 @@ void OsmRenderer::renderFeature( QgsRenderContext &renderContext, QgsFeature& f,
104104
QPen pen = osmstyle.get_pen( tags );
105105
QColor penColor = pen.color();
106106
p->setPen( osmstyle.get_pen( tags ) );
107-
p->setOpacity( 1.0 );
107+
p->setOpacity( opacity );
108108
}
109109
else if ( mGeomType == QGis::Polygon )
110110
{
111111
QBrush br;
112112
p->setPen( osmstyle.get_pen_brush( tags, br ) );
113113
p->setBrush( br );
114114
p->setBackgroundMode( Qt::TransparentMode );
115-
p->setOpacity( 0.5 );
115+
p->setOpacity( opacity );
116116
}
117117
else if ( mGeomType == QGis::Point )
118118
{
119119
*pic = osmstyle.get_image( tags );
120-
p->setOpacity( 1.0 );
120+
p->setOpacity( opacity );
121121
}
122122
}
123123

0 commit comments

Comments
 (0)