Skip to content

Commit 91cddd1

Browse files
committed
Support alpha-transparency in svg markers and fills
1 parent db7501a commit 91cddd1

File tree

2 files changed

+18
-27
lines changed

2 files changed

+18
-27
lines changed

src/core/symbology-ng/qgsfillsymbollayerv2.cpp

+6-26
Original file line numberDiff line numberDiff line change
@@ -210,37 +210,17 @@ void QgsSVGFillSymbolLayer::startRender( QgsSymbolV2RenderContext& context )
210210
context.renderContext().scaleFactor(), context.renderContext().rasterScaleFactor() );
211211
QTransform brushTransform;
212212
brushTransform.scale( 1.0 / context.renderContext().rasterScaleFactor(), 1.0 / context.renderContext().rasterScaleFactor() );
213-
mBrush.setTextureImage( patternImage );
214-
mBrush.setTransform( brushTransform );
215-
216-
#if 0
217-
//create QImage with appropriate dimensions
218-
int pixelWidth = context.outputPixelSize( mPatternWidth );
219-
int pixelHeight = pixelWidth / mSvgViewBox.width() * mSvgViewBox.height();
220-
221-
QImage textureImage( pixelWidth, pixelHeight, QImage::Format_ARGB32_Premultiplied );
222-
textureImage.fill( 0 ); // transparent background
223-
224-
//rasterise byte array to image
225-
QPainter p( &textureImage );
226-
QSvgRenderer r( mSvgData );
227-
if ( !r.isValid() )
213+
if( !doubleNear( context.alpha(), 1.0 ) )
228214
{
229-
return;
215+
QImage transparentImage = patternImage.copy();
216+
QgsSymbolLayerV2Utils::multiplyImageOpacity( &transparentImage, context.alpha() );
217+
mBrush.setTextureImage( transparentImage );
230218
}
231-
232-
r.render( &p );
233-
234-
if ( context.alpha() < 1.0 )
219+
else
235220
{
236-
QgsSymbolLayerV2Utils::multiplyImageOpacity( &textureImage, context.alpha() );
221+
mBrush.setTextureImage( patternImage );
237222
}
238-
239-
QTransform brushTransform;
240-
brushTransform.scale( 1.0 / context.renderContext().rasterScaleFactor(), 1.0 / context.renderContext().rasterScaleFactor() );
241-
mBrush.setTextureImage( textureImage );
242223
mBrush.setTransform( brushTransform );
243-
#endif //0
244224

245225
if ( mOutline )
246226
{

src/core/symbology-ng/qgsmarkersymbollayerv2.cpp

+12-1
Original file line numberDiff line numberDiff line change
@@ -564,10 +564,21 @@ void QgsSvgMarkerSymbolLayerV2::renderPoint( const QPointF& point, QgsSymbolV2Re
564564
{
565565
const QImage& img = QgsSvgCache::instance()->svgAsImage( mPath, size, mFillColor, mOutlineColor, mOutlineWidth,
566566
context.renderContext().scaleFactor(), context.renderContext().rasterScaleFactor() );
567-
p->drawImage( -img.width() / 2.0, -img.width() / 2.0, img );
567+
//consider transparency
568+
if( !doubleNear( context.alpha(), 1.0 ) )
569+
{
570+
QImage transparentImage = img.copy();
571+
QgsSymbolLayerV2Utils::multiplyImageOpacity( &transparentImage, context.alpha() );
572+
p->drawImage( -transparentImage.width() / 2.0, -transparentImage.height() / 2.0, transparentImage );
573+
}
574+
else
575+
{
576+
p->drawImage( -img.width() / 2.0, -img.height() / 2.0, img );
577+
}
568578
}
569579
else
570580
{
581+
p->setOpacity( context.alpha( ) );
571582
const QPicture& pct = QgsSvgCache::instance()->svgAsPicture( mPath, size, mFillColor, mOutlineColor, mOutlineWidth,
572583
context.renderContext().scaleFactor(), context.renderContext().rasterScaleFactor() );
573584
p->drawPicture( 0, 0, pct );

0 commit comments

Comments
 (0)