Skip to content

Commit 63ee006

Browse files
committed
Add blend mode option for features, allows blending to be used between features in a layer
1 parent 226c524 commit 63ee006

File tree

6 files changed

+105
-19
lines changed

6 files changed

+105
-19
lines changed

src/core/composer/qgscomposermap.cpp

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -655,10 +655,15 @@ bool QgsComposerMap::containsBlendModes() const
655655
{
656656
return true;
657657
}
658-
// if vector layer and has labels, check label blend modes
658+
// if vector layer, check labels and feature blend mode
659659
QgsVectorLayer* currentVectorLayer = qobject_cast<QgsVectorLayer *>( currentLayer );
660660
if ( currentVectorLayer )
661661
{
662+
if ( currentVectorLayer->featureBlendMode() != QPainter::CompositionMode_SourceOver )
663+
{
664+
return true;
665+
}
666+
// check label blend modes
662667
if ( lbl->willUseLayer( currentVectorLayer ) )
663668
{
664669
// Check all label blending properties

src/core/qgsmaprenderer.cpp

Lines changed: 21 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -518,20 +518,29 @@ void QgsMapRenderer::render( QPainter* painter, double* forceWidthScale )
518518
// before compositing this on the map. This effectively flattens the layer and prevents
519519
// blending occuring between objects on the layer
520520
// (this is not required for raster layers or when layer caching is enabled, since that has the same effect)
521-
if (( mRenderContext.useAdvancedEffects() ) && ( ml->blendMode() != QPainter::CompositionMode_SourceOver ) &&
522-
( ml->type() != QgsMapLayer::RasterLayer ) &&
523-
( split || !mySettings.value( "/qgis/enable_render_caching", false ).toBool() ) )
521+
bool flattenedLayer = false;
522+
if (( mRenderContext.useAdvancedEffects() ) && ( ml->type() == QgsMapLayer::VectorLayer ) )
524523
{
525-
mypFlattenedImage = new QImage( mRenderContext.painter()->device()->width(),
526-
mRenderContext.painter()->device()->height(), QImage::Format_ARGB32 );
527-
mypFlattenedImage->fill( 0 );
528-
QPainter * mypPainter = new QPainter( mypFlattenedImage );
529-
if ( mySettings.value( "/qgis/enable_anti_aliasing", true ).toBool() )
524+
QgsVectorLayer* vl = qobject_cast<QgsVectorLayer *>( ml );
525+
if (( vl->blendMode() != QPainter::CompositionMode_SourceOver && ( split || !mySettings.value( "/qgis/enable_render_caching", false ).toBool() ) )
526+
|| ( vl->featureBlendMode() != QPainter::CompositionMode_SourceOver ) )
527+
530528
{
531-
mypPainter->setRenderHint( QPainter::Antialiasing );
529+
flattenedLayer = true;
530+
mypFlattenedImage = new QImage( mRenderContext.painter()->device()->width(),
531+
mRenderContext.painter()->device()->height(), QImage::Format_ARGB32 );
532+
mypFlattenedImage->fill( 0 );
533+
QPainter * mypPainter = new QPainter( mypFlattenedImage );
534+
if ( mySettings.value( "/qgis/enable_anti_aliasing", true ).toBool() )
535+
{
536+
mypPainter->setRenderHint( QPainter::Antialiasing );
537+
}
538+
mypPainter->scale( rasterScaleFactor, rasterScaleFactor );
539+
mRenderContext.setPainter( mypPainter );
540+
541+
// set the painter to the feature blend mode
542+
mypPainter->setCompositionMode( vl->featureBlendMode() );
532543
}
533-
mypPainter->scale( rasterScaleFactor, rasterScaleFactor );
534-
mRenderContext.setPainter( mypPainter );
535544
}
536545

537546
if ( scaleRaster )
@@ -584,9 +593,7 @@ void QgsMapRenderer::render( QPainter* painter, double* forceWidthScale )
584593
}
585594

586595
// If we flattened this layer for alternate blend modes, composite it now
587-
if (( mRenderContext.useAdvancedEffects() ) && ( ml->blendMode() != QPainter::CompositionMode_SourceOver ) &&
588-
( ml->type() != QgsMapLayer::RasterLayer ) &&
589-
( split || !mySettings.value( "/qgis/enable_render_caching", false ).toBool() ) )
596+
if ( flattenedLayer )
590597
{
591598
delete mRenderContext.painter();
592599
mRenderContext.setPainter( mypContextPainter );

src/core/qgsvectorlayer.cpp

Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -122,6 +122,7 @@ QgsVectorLayer::QgsVectorLayer( QString vectorLayerPath,
122122
, mRendererV2( NULL )
123123
, mLabel( 0 )
124124
, mLabelOn( false )
125+
, mFeatureBlendMode( QPainter::CompositionMode_SourceOver ) // Default to normal feature blending
125126
, mVertexMarkerOnlyForSelection( false )
126127
, mCache( new QgsGeometryCache( this ) )
127128
, mEditBuffer( 0 )
@@ -1759,6 +1760,14 @@ bool QgsVectorLayer::readSymbology( const QDomNode& node, QString& errorMessage
17591760
setBlendMode( QgsMapRenderer::getCompositionMode(( QgsMapRenderer::BlendMode ) e.text().toInt() ) );
17601761
}
17611762

1763+
// get and set the feature blend mode if it exists
1764+
QDomNode featureBlendModeNode = node.namedItem( "featureBlendMode" );
1765+
if ( !featureBlendModeNode.isNull() )
1766+
{
1767+
QDomElement e = featureBlendModeNode.toElement();
1768+
setFeatureBlendMode( QgsMapRenderer::getCompositionMode(( QgsMapRenderer::BlendMode ) e.text().toInt() ) );
1769+
}
1770+
17621771
// use scale dependent visibility flag
17631772
QDomElement e = node.toElement();
17641773
mLabel->setScaleBasedVisibility( e.attribute( "scaleBasedLabelVisibilityFlag", "0" ) == "1" );
@@ -2084,6 +2093,12 @@ bool QgsVectorLayer::writeSymbology( QDomNode& node, QDomDocument& doc, QString&
20842093
blendModeElem.appendChild( blendModeText );
20852094
node.appendChild( blendModeElem );
20862095

2096+
// add the feature blend mode field
2097+
QDomElement featureBlendModeElem = doc.createElement( "featureBlendMode" );
2098+
QDomText featureBlendModeText = doc.createTextNode( QString::number( QgsMapRenderer::getBlendModeEnum( featureBlendMode() ) ) );
2099+
featureBlendModeElem.appendChild( featureBlendModeText );
2100+
node.appendChild( featureBlendModeElem );
2101+
20872102
// add the display field
20882103
QDomElement dField = doc.createElement( "displayfield" );
20892104
QDomText dFieldText = doc.createTextNode( displayField() );
@@ -3340,6 +3355,18 @@ QVariant QgsVectorLayer::maximumValue( int index )
33403355
return QVariant();
33413356
}
33423357

3358+
/** Write blend mode for features */
3359+
void QgsVectorLayer::setFeatureBlendMode( const QPainter::CompositionMode featureBlendMode )
3360+
{
3361+
mFeatureBlendMode = featureBlendMode;
3362+
}
3363+
3364+
/** Read blend mode for layer */
3365+
QPainter::CompositionMode QgsVectorLayer::featureBlendMode() const
3366+
{
3367+
return mFeatureBlendMode;
3368+
}
3369+
33433370
void QgsVectorLayer::stopRendererV2( QgsRenderContext& rendererContext, QgsSingleSymbolRendererV2* selRenderer )
33443371
{
33453372
mRendererV2->stopRender( rendererContext );

src/core/qgsvectorlayer.h

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1226,6 +1226,15 @@ class CORE_EXPORT QgsVectorLayer : public QgsMapLayer
12261226
@note added in 1.7*/
12271227
QVariant maximumValue( int index );
12281228

1229+
/* Set the blending mode used for rendering each feature
1230+
* @note added in 2.0
1231+
*/
1232+
void setFeatureBlendMode( const QPainter::CompositionMode blendMode );
1233+
/* Returns the current blending mode for features
1234+
* @note added in 2.0
1235+
*/
1236+
QPainter::CompositionMode featureBlendMode() const;
1237+
12291238
public slots:
12301239
/**
12311240
* Select feature by its ID
@@ -1480,6 +1489,9 @@ class CORE_EXPORT QgsVectorLayer : public QgsMapLayer
14801489
/** Display labels */
14811490
bool mLabelOn;
14821491

1492+
/** Blend mode for features */
1493+
QPainter::CompositionMode mFeatureBlendMode;
1494+
14831495
/**The current type of editing marker*/
14841496
QgsVectorLayer::VertexMarkerType mCurrentVertexMarkerType;
14851497

src/gui/symbology-ng/qgsrendererv2propertiesdialog.cpp

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -89,6 +89,9 @@ QgsRendererV2PropertiesDialog::QgsRendererV2PropertiesDialog( QgsVectorLayer* la
8989
// Blend mode
9090
mBlendModeComboBox->setBlendMode( mLayer->blendMode() );
9191

92+
// Feature blend mode
93+
mFeatureBlendComboBox->setBlendMode( mLayer->featureBlendMode() );
94+
9295
QPixmap pix;
9396
QgsRendererV2Registry* reg = QgsRendererV2Registry::instance();
9497
QStringList renderers = reg->renderersList();
@@ -173,8 +176,9 @@ void QgsRendererV2PropertiesDialog::apply()
173176
mLayer->setRendererV2( renderer->clone() );
174177
}
175178

176-
// set the blend mode for the layer
179+
// set the blend modes for the layer
177180
mLayer->setBlendMode( mBlendModeComboBox->blendMode() );
181+
mLayer->setFeatureBlendMode( mFeatureBlendComboBox->blendMode() );
178182
}
179183

180184
void QgsRendererV2PropertiesDialog::onOK()

src/ui/qgsrendererv2propsdialogbase.ui

Lines changed: 34 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,31 @@
1414
<string>Renderer settings</string>
1515
</property>
1616
<layout class="QVBoxLayout" name="verticalLayout_2">
17+
<item>
18+
<widget class="QgsCollapsibleGroupBox" name="groupBox">
19+
<property name="title">
20+
<string>Layer rendering</string>
21+
</property>
22+
<property name="collapsed" stdset="0">
23+
<bool>false</bool>
24+
</property>
25+
<property name="saveCollapsedState" stdset="0">
26+
<bool>true</bool>
27+
</property>
28+
<layout class="QHBoxLayout" name="horizontalLayout">
29+
<item>
30+
<widget class="QLabel" name="lblLayerBlend">
31+
<property name="text">
32+
<string>Layer blending mode</string>
33+
</property>
34+
</widget>
35+
</item>
36+
<item>
37+
<widget class="QgsBlendModeComboBox" name="mBlendModeComboBox"/>
38+
</item>
39+
</layout>
40+
</widget>
41+
</item>
1742
<item>
1843
<layout class="QHBoxLayout" name="horizontalLayout">
1944
<item>
@@ -33,14 +58,14 @@
3358
</spacer>
3459
</item>
3560
<item>
36-
<widget class="QLabel" name="label_2">
61+
<widget class="QLabel" name="lblFeatureBlend">
3762
<property name="text">
38-
<string>Blending mode</string>
63+
<string>Feature blending mode</string>
3964
</property>
4065
</widget>
4166
</item>
4267
<item>
43-
<widget class="QgsBlendModeComboBox" name="mBlendModeComboBox"/>
68+
<widget class="QgsBlendModeComboBox" name="mFeatureBlendComboBox"/>
4469
</item>
4570
</layout>
4671
</item>
@@ -89,6 +114,12 @@
89114
<extends>QComboBox</extends>
90115
<header>qgsblendmodecombobox.h</header>
91116
</customwidget>
117+
<customwidget>
118+
<class>QgsCollapsibleGroupBox</class>
119+
<extends>QGroupBox</extends>
120+
<header>qgscollapsiblegroupbox.h</header>
121+
<container>1</container>
122+
</customwidget>
92123
</customwidgets>
93124
<tabstops>
94125
<tabstop>cboRenderers</tabstop>

0 commit comments

Comments
 (0)