Skip to content

Commit dd51843

Browse files
committedJan 30, 2017
QgsSymbol estimateMaxBleed methods now use a QgsRenderContext
argument to correctly calculate bleed for mapunits/pixels/etc
1 parent fac7887 commit dd51843

17 files changed

+63
-65
lines changed
 

‎python/core/symbology-ng/qgsfillsymbollayer.sip

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -102,7 +102,7 @@ class QgsSimpleFillSymbolLayer : QgsFillSymbolLayer
102102
void setMapUnitScale( const QgsMapUnitScale &scale );
103103
QgsMapUnitScale mapUnitScale() const;
104104

105-
double estimateMaxBleed() const;
105+
double estimateMaxBleed( const QgsRenderContext& context ) const;
106106

107107
double dxfWidth( const QgsDxfExport& e, QgsSymbolRenderContext& context ) const;
108108
QColor dxfColor( QgsSymbolRenderContext& context ) const;
@@ -172,7 +172,7 @@ class QgsGradientFillSymbolLayer : QgsFillSymbolLayer
172172

173173
virtual QgsGradientFillSymbolLayer* clone() const /Factory/;
174174

175-
double estimateMaxBleed() const;
175+
double estimateMaxBleed( const QgsRenderContext& context ) const;
176176

177177
/** Type of gradient, e.g., linear or radial*/
178178
GradientType gradientType() const;
@@ -270,7 +270,7 @@ class QgsShapeburstFillSymbolLayer : QgsFillSymbolLayer
270270

271271
virtual QgsShapeburstFillSymbolLayer* clone() const /Factory/;
272272

273-
double estimateMaxBleed() const;
273+
double estimateMaxBleed( const QgsRenderContext& context ) const;
274274

275275
/** Sets the blur radius, which controls the amount of blurring applied to the fill.
276276
* @param blurRadius Radius for fill blur. Values between 0 - 17 are valid, where higher values results in a stronger blur. Set to 0 to disable blur.
@@ -476,7 +476,7 @@ class QgsImageFillSymbolLayer: QgsFillSymbolLayer
476476
void setMapUnitScale( const QgsMapUnitScale& scale );
477477
QgsMapUnitScale mapUnitScale() const;
478478

479-
virtual double estimateMaxBleed() const;
479+
virtual double estimateMaxBleed( const QgsRenderContext& context ) const;
480480

481481
virtual double dxfWidth( const QgsDxfExport& e, QgsSymbolRenderContext& context ) const;
482482
virtual QColor dxfColor( QgsSymbolRenderContext& context ) const;
@@ -519,7 +519,7 @@ class QgsRasterFillSymbolLayer: QgsImageFillSymbolLayer
519519
void stopRender( QgsSymbolRenderContext& context );
520520
QgsStringMap properties() const;
521521
virtual QgsRasterFillSymbolLayer* clone() const;
522-
virtual double estimateMaxBleed() const;
522+
virtual double estimateMaxBleed( const QgsRenderContext& context ) const;
523523

524524
//override QgsImageFillSymbolLayer's support for sub symbols
525525
virtual QgsSymbol* subSymbol();
@@ -762,7 +762,7 @@ class QgsLinePatternFillSymbolLayer: QgsImageFillSymbolLayer
762762

763763
void toSld( QDomDocument &doc, QDomElement &element, const QgsStringMap& props ) const;
764764

765-
double estimateMaxBleed() const;
765+
double estimateMaxBleed( const QgsRenderContext& context ) const;
766766

767767
QString ogrFeatureStyleWidth( double widthScaleFactor ) const;
768768

@@ -870,7 +870,7 @@ class QgsPointPatternFillSymbolLayer : QgsImageFillSymbolLayer
870870

871871
void toSld( QDomDocument &doc, QDomElement &element, const QgsStringMap& props ) const;
872872

873-
double estimateMaxBleed() const;
873+
double estimateMaxBleed( const QgsRenderContext& context ) const;
874874

875875
//getters and setters
876876
double distanceX() const;

‎python/core/symbology-ng/qgslinesymbollayer.sip

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -41,7 +41,7 @@ class QgsSimpleLineSymbolLayer : QgsLineSymbolLayer
4141
void setMapUnitScale( const QgsMapUnitScale &scale );
4242
QgsMapUnitScale mapUnitScale() const;
4343

44-
double estimateMaxBleed() const;
44+
double estimateMaxBleed( const QgsRenderContext& context ) const;
4545

4646
// new stuff
4747

@@ -161,7 +161,7 @@ class QgsMarkerLineSymbolLayer : QgsLineSymbolLayer
161161
virtual void setWidth( double width );
162162
virtual double width() const;
163163

164-
double estimateMaxBleed() const;
164+
double estimateMaxBleed( const QgsRenderContext& context ) const;
165165

166166
// new stuff
167167

‎python/core/symbology-ng/qgsmarkersymbollayer.sip

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -355,7 +355,7 @@ class QgsFilledMarkerSymbolLayer : QgsSimpleMarkerSymbolLayerBase
355355
virtual QgsFilledMarkerSymbolLayer* clone() const /Factory/;
356356
virtual QgsSymbol* subSymbol();
357357
virtual bool setSubSymbol( QgsSymbol* symbol /Transfer/ );
358-
virtual double estimateMaxBleed() const;
358+
virtual double estimateMaxBleed( const QgsRenderContext& context ) const;
359359
QSet<QString> usedAttributes( const QgsRenderContext& context ) const;
360360
void setColor( const QColor& c );
361361
virtual QColor color() const;

‎python/core/symbology-ng/qgssymbollayer.sip

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -210,7 +210,7 @@ class QgsSymbolLayer
210210
the drawn shape. For example, polygons drawn with an outline will draw half the width
211211
of the outline outside of the polygon. This amount is estimated, since it may
212212
be affected by data defined symbology rules.*/
213-
virtual double estimateMaxBleed() const;
213+
virtual double estimateMaxBleed( const QgsRenderContext& context ) const;
214214

215215
/** Sets the units to use for sizes and widths within the symbol layer. Individual
216216
* symbol layer subclasses will interpret this in different ways, e.g., a marker symbol

‎python/core/symbology-ng/qgssymbollayerutils.sip

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -152,7 +152,7 @@ class QgsSymbolLayerUtils
152152
static void drawStippledBackground( QPainter* painter, QRect rect );
153153

154154
/** Returns the maximum estimated bleed for the symbol */
155-
static double estimateMaxSymbolBleed( QgsSymbol* symbol );
155+
static double estimateMaxSymbolBleed( QgsSymbol* symbol, const QgsRenderContext& context );
156156

157157
/** Attempts to load a symbol from a DOM element
158158
* @param element DOM element representing symbol

‎src/core/composer/qgscomposershape.cpp

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -83,7 +83,7 @@ void QgsComposerShape::setShapeStyleSymbol( QgsFillSymbol* symbol )
8383

8484
void QgsComposerShape::refreshSymbol()
8585
{
86-
mMaxSymbolBleed = QgsSymbolLayerUtils::estimateMaxSymbolBleed( mShapeStyleSymbol );
86+
mMaxSymbolBleed = QgsSymbolLayerUtils::estimateMaxSymbolBleed( mShapeStyleSymbol, QgsComposerUtils::createRenderContextForComposition( mComposition, nullptr ) );
8787
updateBoundingRect();
8888

8989
update();
@@ -102,7 +102,7 @@ void QgsComposerShape::createDefaultShapeStyleSymbol()
102102
properties.insert( QStringLiteral( "joinstyle" ), QStringLiteral( "miter" ) );
103103
mShapeStyleSymbol = QgsFillSymbol::createSimple( properties );
104104

105-
mMaxSymbolBleed = QgsSymbolLayerUtils::estimateMaxSymbolBleed( mShapeStyleSymbol );
105+
mMaxSymbolBleed = QgsSymbolLayerUtils::estimateMaxSymbolBleed( mShapeStyleSymbol, QgsComposerUtils::createRenderContextForComposition( mComposition, nullptr ) );
106106
updateBoundingRect();
107107

108108
emit frameChanged();

‎src/core/composer/qgspaperitem.cpp

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -201,7 +201,8 @@ void QgsPaperItem::paint( QPainter* painter, const QStyleOptionGraphicsItem* ite
201201
void QgsPaperItem::calculatePageMargin()
202202
{
203203
//get max bleed from symbol
204-
double maxBleed = QgsSymbolLayerUtils::estimateMaxSymbolBleed( mComposition->pageStyleSymbol() );
204+
double maxBleed = QgsSymbolLayerUtils::estimateMaxSymbolBleed( mComposition->pageStyleSymbol(),
205+
QgsComposerUtils::createRenderContextForComposition( mComposition, nullptr ) );
205206

206207
//Now subtract 1 pixel to prevent semi-transparent borders at edge of solid page caused by
207208
//anti-aliased painting. This may cause a pixel to be cropped from certain edge lines/symbols,

‎src/core/symbology-ng/qgsfillsymbollayer.cpp

Lines changed: 14 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -386,10 +386,10 @@ QgsSymbolLayer* QgsSimpleFillSymbolLayer::createFromSld( QDomElement &element )
386386
return sl;
387387
}
388388

389-
double QgsSimpleFillSymbolLayer::estimateMaxBleed() const
389+
double QgsSimpleFillSymbolLayer::estimateMaxBleed( const QgsRenderContext& context ) const
390390
{
391-
double penBleed = mBorderStyle == Qt::NoPen ? 0 : ( mBorderWidth / 2.0 );
392-
double offsetBleed = mOffset.x() > mOffset.y() ? mOffset.x() : mOffset.y();
391+
double penBleed = context.convertToPainterUnits( mBorderStyle == Qt::NoPen ? 0 : ( mBorderWidth / 2.0 ), mBorderWidthUnit, mBorderWidthMapUnitScale );
392+
double offsetBleed = context.convertToPainterUnits( mOffset.x() > mOffset.y() ? mOffset.x() : mOffset.y(), mOffsetUnit, mOffsetMapUnitScale );
393393
return penBleed + offsetBleed;
394394
}
395395

@@ -907,9 +907,9 @@ QgsGradientFillSymbolLayer* QgsGradientFillSymbolLayer::clone() const
907907
return sl;
908908
}
909909

910-
double QgsGradientFillSymbolLayer::estimateMaxBleed() const
910+
double QgsGradientFillSymbolLayer::estimateMaxBleed( const QgsRenderContext& context ) const
911911
{
912-
double offsetBleed = mOffset.x() > mOffset.y() ? mOffset.x() : mOffset.y();
912+
double offsetBleed = context.convertToPainterUnits( mOffset.x() > mOffset.y() ? mOffset.x() : mOffset.y(), mOffsetUnit, mOffsetMapUnitScale );
913913
return offsetBleed;
914914
}
915915

@@ -1502,9 +1502,9 @@ QgsShapeburstFillSymbolLayer* QgsShapeburstFillSymbolLayer::clone() const
15021502
return sl;
15031503
}
15041504

1505-
double QgsShapeburstFillSymbolLayer::estimateMaxBleed() const
1505+
double QgsShapeburstFillSymbolLayer::estimateMaxBleed( const QgsRenderContext& context ) const
15061506
{
1507-
double offsetBleed = qMax( mOffset.x(), mOffset.y() );
1507+
double offsetBleed = context.convertToPainterUnits( qMax( mOffset.x(), mOffset.y() ), mOffsetUnit, mOffsetMapUnitScale );
15081508
return offsetBleed;
15091509
}
15101510

@@ -1654,11 +1654,11 @@ QgsMapUnitScale QgsImageFillSymbolLayer::mapUnitScale() const
16541654
return mOutlineWidthMapUnitScale;
16551655
}
16561656

1657-
double QgsImageFillSymbolLayer::estimateMaxBleed() const
1657+
double QgsImageFillSymbolLayer::estimateMaxBleed( const QgsRenderContext& context ) const
16581658
{
16591659
if ( mOutline && mOutline->symbolLayer( 0 ) )
16601660
{
1661-
double subLayerBleed = mOutline->symbolLayer( 0 )->estimateMaxBleed();
1661+
double subLayerBleed = mOutline->symbolLayer( 0 )->estimateMaxBleed( context );
16621662
return subLayerBleed;
16631663
}
16641664
return 0;
@@ -2340,7 +2340,7 @@ QSet<QString> QgsLinePatternFillSymbolLayer::usedAttributes( const QgsRenderCont
23402340
return attr;
23412341
}
23422342

2343-
double QgsLinePatternFillSymbolLayer::estimateMaxBleed() const
2343+
double QgsLinePatternFillSymbolLayer::estimateMaxBleed( const QgsRenderContext& ) const
23442344
{
23452345
return 0;
23462346
}
@@ -2520,14 +2520,7 @@ void QgsLinePatternFillSymbolLayer::applyPattern( const QgsSymbolRenderContext&
25202520
for ( int i = 0; i < fillLineSymbol->symbolLayerCount(); i++ )
25212521
{
25222522
QgsSymbolLayer *layer = fillLineSymbol->symbolLayer( i );
2523-
double layerBleed = layer->estimateMaxBleed();
2524-
// TODO: to get real bleed we have to scale it using context and units,
2525-
// unfortunately estimateMaxBleed() ignore units completely, e.g.
2526-
// QgsMarkerLineSymbolLayer::estimateMaxBleed() is mixing marker size and
2527-
// offset regardless units. This has to be fixed especially
2528-
// in estimateMaxBleed(), context probably has to be used.
2529-
// For now, we only support millimeters
2530-
double outputPixelLayerBleed = ctx.convertToPainterUnits( layerBleed, QgsUnitTypes::RenderMillimeters );
2523+
double outputPixelLayerBleed = layer->estimateMaxBleed( context.renderContext() );
25312524
outputPixelBleed = qMax( outputPixelBleed, outputPixelLayerBleed );
25322525

25332526
QgsMarkerLineSymbolLayer *markerLineLayer = dynamic_cast<QgsMarkerLineSymbolLayer *>( layer );
@@ -3330,7 +3323,7 @@ void QgsPointPatternFillSymbolLayer::applyDataDefinedSettings( QgsSymbolRenderCo
33303323
applyPattern( context, mBrush, distanceX, distanceY, displacementX, displacementY );
33313324
}
33323325

3333-
double QgsPointPatternFillSymbolLayer::estimateMaxBleed() const
3326+
double QgsPointPatternFillSymbolLayer::estimateMaxBleed( const QgsRenderContext& ) const
33343327
{
33353328
return 0;
33363329
}
@@ -3732,9 +3725,9 @@ QgsRasterFillSymbolLayer* QgsRasterFillSymbolLayer::clone() const
37323725
return sl;
37333726
}
37343727

3735-
double QgsRasterFillSymbolLayer::estimateMaxBleed() const
3728+
double QgsRasterFillSymbolLayer::estimateMaxBleed( const QgsRenderContext& context ) const
37363729
{
3737-
return mOffset.x() > mOffset.y() ? mOffset.x() : mOffset.y();
3730+
return context.convertToPainterUnits( mOffset.x() > mOffset.y() ? mOffset.x() : mOffset.y(), mOffsetUnit, mOffsetMapUnitScale );
37383731
}
37393732

37403733
void QgsRasterFillSymbolLayer::setImageFilePath( const QString &imagePath )

‎src/core/symbology-ng/qgsfillsymbollayer.h

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -125,7 +125,7 @@ class CORE_EXPORT QgsSimpleFillSymbolLayer : public QgsFillSymbolLayer
125125
void setMapUnitScale( const QgsMapUnitScale &scale ) override;
126126
QgsMapUnitScale mapUnitScale() const override;
127127

128-
double estimateMaxBleed() const override;
128+
double estimateMaxBleed( const QgsRenderContext& context ) const override;
129129

130130
double dxfWidth( const QgsDxfExport& e, QgsSymbolRenderContext& context ) const override;
131131
QColor dxfColor( QgsSymbolRenderContext& context ) const override;
@@ -220,7 +220,7 @@ class CORE_EXPORT QgsGradientFillSymbolLayer : public QgsFillSymbolLayer
220220

221221
QgsGradientFillSymbolLayer* clone() const override;
222222

223-
double estimateMaxBleed() const override;
223+
double estimateMaxBleed( const QgsRenderContext& context ) const override;
224224

225225
//! Type of gradient, e.g., linear or radial
226226
GradientType gradientType() const { return mGradientType; }
@@ -362,7 +362,7 @@ class CORE_EXPORT QgsShapeburstFillSymbolLayer : public QgsFillSymbolLayer
362362

363363
QgsShapeburstFillSymbolLayer* clone() const override;
364364

365-
double estimateMaxBleed() const override;
365+
double estimateMaxBleed( const QgsRenderContext& context ) const override;
366366

367367
/** Sets the blur radius, which controls the amount of blurring applied to the fill.
368368
* @param blurRadius Radius for fill blur. Values between 0 - 17 are valid, where higher values results in a stronger blur. Set to 0 to disable blur.
@@ -613,7 +613,7 @@ class CORE_EXPORT QgsImageFillSymbolLayer: public QgsFillSymbolLayer
613613
void setMapUnitScale( const QgsMapUnitScale &scale ) override;
614614
QgsMapUnitScale mapUnitScale() const override;
615615

616-
virtual double estimateMaxBleed() const override;
616+
virtual double estimateMaxBleed( const QgsRenderContext& context ) const override;
617617

618618
double dxfWidth( const QgsDxfExport& e, QgsSymbolRenderContext& context ) const override;
619619
QColor dxfColor( QgsSymbolRenderContext& context ) const override;
@@ -663,7 +663,7 @@ class CORE_EXPORT QgsRasterFillSymbolLayer: public QgsImageFillSymbolLayer
663663
void stopRender( QgsSymbolRenderContext& context ) override;
664664
QgsStringMap properties() const override;
665665
QgsRasterFillSymbolLayer* clone() const override;
666-
virtual double estimateMaxBleed() const override;
666+
virtual double estimateMaxBleed( const QgsRenderContext& context ) const override;
667667

668668
//override QgsImageFillSymbolLayer's support for sub symbols
669669
virtual QgsSymbol* subSymbol() override { return nullptr; }
@@ -961,7 +961,7 @@ class CORE_EXPORT QgsLinePatternFillSymbolLayer: public QgsImageFillSymbolLayer
961961

962962
void toSld( QDomDocument &doc, QDomElement &element, const QgsStringMap& props ) const override;
963963

964-
double estimateMaxBleed() const override;
964+
double estimateMaxBleed( const QgsRenderContext& context ) const override;
965965

966966
QString ogrFeatureStyleWidth( double widthScaleFactor ) const;
967967

@@ -1095,7 +1095,7 @@ class CORE_EXPORT QgsPointPatternFillSymbolLayer: public QgsImageFillSymbolLayer
10951095

10961096
void toSld( QDomDocument &doc, QDomElement &element, const QgsStringMap& props ) const override;
10971097

1098-
double estimateMaxBleed() const override;
1098+
double estimateMaxBleed( const QgsRenderContext& context ) const override;
10991099

11001100
//getters and setters
11011101
double distanceX() const { return mDistanceX; }

‎src/core/symbology-ng/qgslinesymbollayer.cpp

Lines changed: 6 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -566,7 +566,7 @@ void QgsSimpleLineSymbolLayer::applyDataDefinedSymbology( QgsSymbolRenderContext
566566
}
567567
}
568568

569-
double QgsSimpleLineSymbolLayer::estimateMaxBleed() const
569+
double QgsSimpleLineSymbolLayer::estimateMaxBleed( const QgsRenderContext& context ) const
570570
{
571571
if ( mDrawInsidePolygon )
572572
{
@@ -575,7 +575,8 @@ double QgsSimpleLineSymbolLayer::estimateMaxBleed() const
575575
}
576576
else
577577
{
578-
return ( mWidth / 2.0 ) + mOffset;
578+
return context.convertToPainterUnits(( mWidth / 2.0 ), mWidthUnit, mWidthMapUnitScale ) +
579+
context.convertToPainterUnits( mOffset, mOffsetUnit, mOffsetMapUnitScale );
579580
}
580581
}
581582

@@ -1593,9 +1594,10 @@ QSet<QString> QgsMarkerLineSymbolLayer::usedAttributes( const QgsRenderContext&
15931594
return attr;
15941595
}
15951596

1596-
double QgsMarkerLineSymbolLayer::estimateMaxBleed() const
1597+
double QgsMarkerLineSymbolLayer::estimateMaxBleed( const QgsRenderContext& context ) const
15971598
{
1598-
return ( mMarker->size() / 2.0 ) + mOffset;
1599+
return context.convertToPainterUnits(( mMarker->size() / 2.0 ), mMarker->sizeUnit(), mMarker->sizeMapUnitScale() ) +
1600+
context.convertToPainterUnits( mOffset, mOffsetUnit, mOffsetMapUnitScale );
15991601
}
16001602

16011603

‎src/core/symbology-ng/qgslinesymbollayer.h

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -72,7 +72,7 @@ class CORE_EXPORT QgsSimpleLineSymbolLayer : public QgsLineSymbolLayer
7272
void setMapUnitScale( const QgsMapUnitScale &scale ) override;
7373
QgsMapUnitScale mapUnitScale() const override;
7474

75-
double estimateMaxBleed() const override;
75+
double estimateMaxBleed( const QgsRenderContext& context ) const override;
7676

7777
// new stuff
7878

@@ -215,7 +215,7 @@ class CORE_EXPORT QgsMarkerLineSymbolLayer : public QgsLineSymbolLayer
215215
virtual void setWidth( double width ) override;
216216
virtual double width() const override;
217217

218-
double estimateMaxBleed() const override;
218+
double estimateMaxBleed( const QgsRenderContext& context ) const override;
219219

220220
// new stuff
221221

‎src/core/symbology-ng/qgsmarkersymbollayer.cpp

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1620,11 +1620,11 @@ bool QgsFilledMarkerSymbolLayer::setSubSymbol( QgsSymbol *symbol )
16201620
}
16211621
}
16221622

1623-
double QgsFilledMarkerSymbolLayer::estimateMaxBleed() const
1623+
double QgsFilledMarkerSymbolLayer::estimateMaxBleed( const QgsRenderContext& context ) const
16241624
{
16251625
if ( mFill.data() )
16261626
{
1627-
return QgsSymbolLayerUtils::estimateMaxSymbolBleed( mFill.data() );
1627+
return QgsSymbolLayerUtils::estimateMaxSymbolBleed( mFill.data(), context );
16281628
}
16291629
return 0;
16301630
}

‎src/core/symbology-ng/qgsmarkersymbollayer.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -420,7 +420,7 @@ class CORE_EXPORT QgsFilledMarkerSymbolLayer : public QgsSimpleMarkerSymbolLayer
420420
QgsFilledMarkerSymbolLayer* clone() const override;
421421
virtual QgsSymbol* subSymbol() override;
422422
virtual bool setSubSymbol( QgsSymbol* symbol ) override;
423-
virtual double estimateMaxBleed() const override;
423+
virtual double estimateMaxBleed( const QgsRenderContext& context ) const override;
424424
QSet<QString> usedAttributes( const QgsRenderContext& context ) const override;
425425
void setColor( const QColor& c ) override;
426426
virtual QColor color() const override;

‎src/core/symbology-ng/qgssymbollayer.h

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -197,10 +197,11 @@ class CORE_EXPORT QgsSymbolLayer
197197
bool isLocked() const { return mLocked; }
198198

199199
/** Returns the estimated maximum distance which the layer style will bleed outside
200-
the drawn shape. For example, polygons drawn with an outline will draw half the width
200+
the drawn shape when drawn in the specified /a context. For example, polygons
201+
drawn with an outline will draw half the width
201202
of the outline outside of the polygon. This amount is estimated, since it may
202203
be affected by data defined symbology rules.*/
203-
virtual double estimateMaxBleed() const { return 0; }
204+
virtual double estimateMaxBleed( const QgsRenderContext& context ) const { Q_UNUSED( context ); return 0; }
204205

205206
/** Sets the units to use for sizes and widths within the symbol layer. Individual
206207
* symbol layer subclasses will interpret this in different ways, e.g., a marker symbol

‎src/core/symbology-ng/qgssymbollayerutils.cpp

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -607,13 +607,13 @@ QPixmap QgsSymbolLayerUtils::symbolPreviewPixmap( QgsSymbol* symbol, QSize size,
607607
return pixmap;
608608
}
609609

610-
double QgsSymbolLayerUtils::estimateMaxSymbolBleed( QgsSymbol* symbol )
610+
double QgsSymbolLayerUtils::estimateMaxSymbolBleed( QgsSymbol* symbol, const QgsRenderContext& context )
611611
{
612612
double maxBleed = 0;
613613
for ( int i = 0; i < symbol->symbolLayerCount(); i++ )
614614
{
615615
QgsSymbolLayer* layer = symbol->symbolLayer( i );
616-
double layerMaxBleed = layer->estimateMaxBleed();
616+
double layerMaxBleed = layer->estimateMaxBleed( context );
617617
maxBleed = layerMaxBleed > maxBleed ? layerMaxBleed : maxBleed;
618618
}
619619

‎src/core/symbology-ng/qgssymbollayerutils.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -197,7 +197,7 @@ class CORE_EXPORT QgsSymbolLayerUtils
197197
static void drawStippledBackground( QPainter* painter, QRect rect );
198198

199199
//! Returns the maximum estimated bleed for the symbol
200-
static double estimateMaxSymbolBleed( QgsSymbol* symbol );
200+
static double estimateMaxSymbolBleed( QgsSymbol* symbol, const QgsRenderContext& context );
201201

202202
/** Attempts to load a symbol from a DOM element
203203
* @param element DOM element representing symbol

‎src/gui/qgsmapcanvasannotationitem.cpp

Lines changed: 9 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,7 @@
2222
#include "qgsvectorlayer.h"
2323
#include "qgsfeatureiterator.h"
2424
#include "qgscsexception.h"
25+
#include "qgssymbollayerutils.h"
2526
#include <QPainter>
2627

2728

@@ -76,14 +77,14 @@ QRectF QgsMapCanvasAnnotationItem::boundingRect() const
7677
void QgsMapCanvasAnnotationItem::updateBoundingRect()
7778
{
7879
prepareGeometryChange();
79-
double frameBorderWidth;
8080

81-
82-
// TODO
81+
QgsRenderContext rc = QgsRenderContext::fromQPainter( nullptr );
82+
double fillSymbolBleed = mAnnotation && mAnnotation->fillSymbol() ?
83+
QgsSymbolLayerUtils::estimateMaxSymbolBleed( mAnnotation->fillSymbol(), rc ) : 0;
8384

8485
if ( mAnnotation && !mAnnotation->hasFixedMapPosition() )
8586
{
86-
mBoundingRect = QRectF( - frameBorderWidth / 2.0, -frameBorderWidth / 2.0, mAnnotation->frameSize().width() + frameBorderWidth, mAnnotation->frameSize().height() + frameBorderWidth );
87+
mBoundingRect = QRectF( - fillSymbolBleed, -fillSymbolBleed, mAnnotation->frameSize().width() + fillSymbolBleed * 2, mAnnotation->frameSize().height() + fillSymbolBleed * 2 );
8788
}
8889
else
8990
{
@@ -97,10 +98,10 @@ void QgsMapCanvasAnnotationItem::updateBoundingRect()
9798

9899
QSizeF frameSize = mAnnotation ? mAnnotation->frameSize() : QSizeF( 0.0, 0.0 );
99100

100-
double xMinPos = qMin( -halfSymbolSize, offset.x() - frameBorderWidth );
101-
double xMaxPos = qMax( halfSymbolSize, offset.x() + frameSize.width() + frameBorderWidth );
102-
double yMinPos = qMin( -halfSymbolSize, offset.y() - frameBorderWidth );
103-
double yMaxPos = qMax( halfSymbolSize, offset.y() + frameSize.height() + frameBorderWidth );
101+
double xMinPos = qMin( -halfSymbolSize, offset.x() - fillSymbolBleed );
102+
double xMaxPos = qMax( halfSymbolSize, offset.x() + frameSize.width() + fillSymbolBleed );
103+
double yMinPos = qMin( -halfSymbolSize, offset.y() - fillSymbolBleed );
104+
double yMaxPos = qMax( halfSymbolSize, offset.y() + frameSize.height() + fillSymbolBleed );
104105
mBoundingRect = QRectF( xMinPos, yMinPos, xMaxPos - xMinPos, yMaxPos - yMinPos );
105106
}
106107
}

0 commit comments

Comments
 (0)
Please sign in to comment.