Skip to content

Commit

Permalink
Add QgsSymbolLayer::canCauseArtifactsBetweenAdjacentTiles()
Browse files Browse the repository at this point in the history
Returns true if the symbol layer rendering can cause visible
artifacts across a single feature when the feature is rendered
as a series of adjacent map tiles each containing a portion
of the feature's geometry.

This depends on the symbol layer derived class itself - eg
a simple solid color fill won't show any artifacts, but a shapeburst
fill WILL.
  • Loading branch information
nyalldawson committed Feb 12, 2021
1 parent d5e2051 commit bdf5e4f
Show file tree
Hide file tree
Showing 11 changed files with 84 additions and 46 deletions.
31 changes: 8 additions & 23 deletions python/core/auto_generated/symbology/qgsfillsymbollayer.sip.in
Expand Up @@ -245,24 +245,20 @@ Caller takes ownership of the returned symbol layer.

virtual QString layerType() const;


virtual void startRender( QgsSymbolRenderContext &context );


virtual void stopRender( QgsSymbolRenderContext &context );


virtual void renderPolygon( const QPolygonF &points, const QVector<QPolygonF> *rings, QgsSymbolRenderContext &context );


virtual QVariantMap properties() const;


virtual QgsGradientFillSymbolLayer *clone() const /Factory/;


virtual double estimateMaxBleed( const QgsRenderContext &context ) const;

virtual bool canCauseArtifactsBetweenAdjacentTiles() const;


GradientType gradientType() const;
%Docstring
Expand Down Expand Up @@ -450,24 +446,20 @@ Caller takes ownership of the returned symbol layer.

virtual QString layerType() const;


virtual void startRender( QgsSymbolRenderContext &context );


virtual void stopRender( QgsSymbolRenderContext &context );


virtual void renderPolygon( const QPolygonF &points, const QVector<QPolygonF> *rings, QgsSymbolRenderContext &context );


virtual QVariantMap properties() const;


virtual QgsShapeburstFillSymbolLayer *clone() const /Factory/;


virtual double estimateMaxBleed( const QgsRenderContext &context ) const;

virtual bool canCauseArtifactsBetweenAdjacentTiles() const;


void setBlurRadius( int blurRadius );
%Docstring
Expand Down Expand Up @@ -2075,6 +2067,8 @@ Caller takes ownership of the returned symbol layer.

virtual QgsRandomMarkerFillSymbolLayer *clone() const /Factory/;

virtual bool canCauseArtifactsBetweenAdjacentTiles() const;


virtual void setColor( const QColor &color );

Expand Down Expand Up @@ -2251,51 +2245,42 @@ Caller takes ownership of the returned symbol layer.

virtual QString layerType() const;


virtual void startRender( QgsSymbolRenderContext &context );


virtual void stopRender( QgsSymbolRenderContext &context );


virtual void renderPolygon( const QPolygonF &points, const QVector<QPolygonF> *rings, QgsSymbolRenderContext &context );


virtual QVariantMap properties() const;


virtual QgsCentroidFillSymbolLayer *clone() const /Factory/;


virtual void toSld( QDomDocument &doc, QDomElement &element, const QVariantMap &props ) const;


virtual void setColor( const QColor &color );

virtual QColor color() const;


virtual QgsSymbol *subSymbol();

virtual bool setSubSymbol( QgsSymbol *symbol /Transfer/ );


virtual void setOutputUnit( QgsUnitTypes::RenderUnit unit );

virtual QgsUnitTypes::RenderUnit outputUnit() const;

virtual bool usesMapUnits() const;


virtual void setMapUnitScale( const QgsMapUnitScale &scale );

virtual QgsMapUnitScale mapUnitScale() const;


virtual QSet<QString> usedAttributes( const QgsRenderContext &context ) const;

virtual bool hasDataDefinedProperties() const;

virtual bool canCauseArtifactsBetweenAdjacentTiles() const;


void setPointOnSurface( bool pointOnSurface );
bool pointOnSurface() const;
Expand Down
Expand Up @@ -660,6 +660,8 @@ calculating individual symbol angles.

virtual QVariantMap properties() const;

virtual bool canCauseArtifactsBetweenAdjacentTiles() const;


protected:

Expand Down
10 changes: 10 additions & 0 deletions python/core/auto_generated/symbology/qgssymbollayer.sip.in
Expand Up @@ -336,6 +336,16 @@ Sets layer's subsymbol. takes ownership of the passed symbol
virtual bool isCompatibleWithSymbol( QgsSymbol *symbol ) const;
%Docstring
Returns if the layer can be used below the specified symbol
%End

virtual bool canCauseArtifactsBetweenAdjacentTiles() const;
%Docstring
Returns ``True`` if the symbol layer rendering can cause visible artifacts across a single feature
when the feature is rendered as a series of adjacent map tiles each containing a portion of the feature's geometry.

The default implementation returns ``False``.

.. versionadded:: 3.18
%End

void setLocked( bool locked );
Expand Down
5 changes: 5 additions & 0 deletions src/core/symbology/qgsarrowsymbollayer.cpp
Expand Up @@ -830,3 +830,8 @@ QColor QgsArrowSymbolLayer::color() const
return mSymbol.get() ? mSymbol->color() : mColor;
}

bool QgsArrowSymbolLayer::canCauseArtifactsBetweenAdjacentTiles() const
{
return true;
}

1 change: 1 addition & 0 deletions src/core/symbology/qgsarrowsymbollayer.h
Expand Up @@ -145,6 +145,7 @@ class CORE_EXPORT QgsArrowSymbolLayer : public QgsLineSymbolLayer
void renderPolyline( const QPolygonF &points, QgsSymbolRenderContext &context ) override;
void setColor( const QColor &c ) override;
QColor color() const override;
bool canCauseArtifactsBetweenAdjacentTiles() const override;

private:
#ifdef SIP_RUN
Expand Down
20 changes: 20 additions & 0 deletions src/core/symbology/qgsfillsymbollayer.cpp
Expand Up @@ -988,6 +988,11 @@ double QgsGradientFillSymbolLayer::estimateMaxBleed( const QgsRenderContext &con
return offsetBleed;
}

bool QgsGradientFillSymbolLayer::canCauseArtifactsBetweenAdjacentTiles() const
{
return true;
}

void QgsGradientFillSymbolLayer::setOutputUnit( QgsUnitTypes::RenderUnit unit )
{
mOffsetUnit = unit;
Expand Down Expand Up @@ -1618,6 +1623,11 @@ double QgsShapeburstFillSymbolLayer::estimateMaxBleed( const QgsRenderContext &c
return offsetBleed;
}

bool QgsShapeburstFillSymbolLayer::canCauseArtifactsBetweenAdjacentTiles() const
{
return true;
}

void QgsShapeburstFillSymbolLayer::setOutputUnit( QgsUnitTypes::RenderUnit unit )
{
mDistanceUnit = unit;
Expand Down Expand Up @@ -4049,6 +4059,11 @@ bool QgsCentroidFillSymbolLayer::hasDataDefinedProperties() const
return false;
}

bool QgsCentroidFillSymbolLayer::canCauseArtifactsBetweenAdjacentTiles() const
{
return true;
}

void QgsCentroidFillSymbolLayer::setOutputUnit( QgsUnitTypes::RenderUnit unit )
{
if ( mMarker )
Expand Down Expand Up @@ -4616,6 +4631,11 @@ QgsRandomMarkerFillSymbolLayer *QgsRandomMarkerFillSymbolLayer::clone() const
return res.release();
}

bool QgsRandomMarkerFillSymbolLayer::canCauseArtifactsBetweenAdjacentTiles() const
{
return true;
}

QgsSymbol *QgsRandomMarkerFillSymbolLayer::subSymbol()
{
return mMarker.get();
Expand Down
27 changes: 4 additions & 23 deletions src/core/symbology/qgsfillsymbollayer.h
Expand Up @@ -254,18 +254,13 @@ class CORE_EXPORT QgsGradientFillSymbolLayer : public QgsFillSymbolLayer
// implemented from base classes

QString layerType() const override;

void startRender( QgsSymbolRenderContext &context ) override;

void stopRender( QgsSymbolRenderContext &context ) override;

void renderPolygon( const QPolygonF &points, const QVector<QPolygonF> *rings, QgsSymbolRenderContext &context ) override;

QVariantMap properties() const override;

QgsGradientFillSymbolLayer *clone() const override SIP_FACTORY;

double estimateMaxBleed( const QgsRenderContext &context ) const override;
bool canCauseArtifactsBetweenAdjacentTiles() const override;

//! Type of gradient, e.g., linear or radial
GradientType gradientType() const { return mGradientType; }
Expand Down Expand Up @@ -454,18 +449,13 @@ class CORE_EXPORT QgsShapeburstFillSymbolLayer : public QgsFillSymbolLayer
// implemented from base classes

QString layerType() const override;

void startRender( QgsSymbolRenderContext &context ) override;

void stopRender( QgsSymbolRenderContext &context ) override;

void renderPolygon( const QPolygonF &points, const QVector<QPolygonF> *rings, QgsSymbolRenderContext &context ) override;

QVariantMap properties() const override;

QgsShapeburstFillSymbolLayer *clone() const override SIP_FACTORY;

double estimateMaxBleed( const QgsRenderContext &context ) const override;
bool canCauseArtifactsBetweenAdjacentTiles() const override;

/**
* Sets the blur radius, which controls the amount of blurring applied to the fill.
Expand Down Expand Up @@ -1860,6 +1850,7 @@ class CORE_EXPORT QgsRandomMarkerFillSymbolLayer : public QgsFillSymbolLayer
void renderPolygon( const QPolygonF &points, const QVector<QPolygonF> *rings, QgsSymbolRenderContext &context ) override;
QVariantMap properties() const override;
QgsRandomMarkerFillSymbolLayer *clone() const override SIP_FACTORY;
bool canCauseArtifactsBetweenAdjacentTiles() const override;

void setColor( const QColor &color ) override;
QColor color() const override;
Expand Down Expand Up @@ -2037,34 +2028,24 @@ class CORE_EXPORT QgsCentroidFillSymbolLayer : public QgsFillSymbolLayer
// implemented from base classes

QString layerType() const override;

void startRender( QgsSymbolRenderContext &context ) override;

void stopRender( QgsSymbolRenderContext &context ) override;

void renderPolygon( const QPolygonF &points, const QVector<QPolygonF> *rings, QgsSymbolRenderContext &context ) override;

QVariantMap properties() const override;

QgsCentroidFillSymbolLayer *clone() const override SIP_FACTORY;

void toSld( QDomDocument &doc, QDomElement &element, const QVariantMap &props ) const override;

void setColor( const QColor &color ) override;
QColor color() const override;

QgsSymbol *subSymbol() override;
bool setSubSymbol( QgsSymbol *symbol SIP_TRANSFER ) override;

void setOutputUnit( QgsUnitTypes::RenderUnit unit ) override;
QgsUnitTypes::RenderUnit outputUnit() const override;
bool usesMapUnits() const override;

void setMapUnitScale( const QgsMapUnitScale &scale ) override;
QgsMapUnitScale mapUnitScale() const override;

QSet<QString> usedAttributes( const QgsRenderContext &context ) const override;
bool hasDataDefinedProperties() const override;
bool canCauseArtifactsBetweenAdjacentTiles() const override;

void setPointOnSurface( bool pointOnSurface ) { mPointOnSurface = pointOnSurface; }
bool pointOnSurface() const { return mPointOnSurface; }
Expand Down
18 changes: 18 additions & 0 deletions src/core/symbology/qgslinesymbollayer.cpp
Expand Up @@ -1351,6 +1351,24 @@ QVariantMap QgsTemplatedLineSymbolLayerBase::properties() const
return map;
}

bool QgsTemplatedLineSymbolLayerBase::canCauseArtifactsBetweenAdjacentTiles() const
{
switch ( mPlacement )
{
case QgsTemplatedLineSymbolLayerBase::Interval:
case QgsTemplatedLineSymbolLayerBase::CentralPoint:
case QgsTemplatedLineSymbolLayerBase::SegmentCenter:
return true;

case QgsTemplatedLineSymbolLayerBase::Vertex:
case QgsTemplatedLineSymbolLayerBase::CurvePoint:
case QgsTemplatedLineSymbolLayerBase::LastVertex:
case QgsTemplatedLineSymbolLayerBase::FirstVertex:
return false;
}
return false;
}

void QgsTemplatedLineSymbolLayerBase::copyTemplateSymbolProperties( QgsTemplatedLineSymbolLayerBase *destLayer ) const
{
destLayer->setSubSymbol( const_cast< QgsTemplatedLineSymbolLayerBase * >( this )->subSymbol()->clone() );
Expand Down
1 change: 1 addition & 0 deletions src/core/symbology/qgslinesymbollayer.h
Expand Up @@ -599,6 +599,7 @@ class CORE_EXPORT QgsTemplatedLineSymbolLayerBase : public QgsLineSymbolLayer
void setMapUnitScale( const QgsMapUnitScale &scale ) FINAL;
QgsMapUnitScale mapUnitScale() const FINAL;
QVariantMap properties() const override;
bool canCauseArtifactsBetweenAdjacentTiles() const override;

protected:

Expand Down
5 changes: 5 additions & 0 deletions src/core/symbology/qgssymbollayer.cpp
Expand Up @@ -234,6 +234,11 @@ bool QgsSymbolLayer::isCompatibleWithSymbol( QgsSymbol *symbol ) const
return symbol->type() == mType;
}

bool QgsSymbolLayer::canCauseArtifactsBetweenAdjacentTiles() const
{
return false;
}

bool QgsSymbolLayer::usesMapUnits() const
{
return false;
Expand Down
10 changes: 10 additions & 0 deletions src/core/symbology/qgssymbollayer.h
Expand Up @@ -361,6 +361,16 @@ class CORE_EXPORT QgsSymbolLayer
//! Returns if the layer can be used below the specified symbol
virtual bool isCompatibleWithSymbol( QgsSymbol *symbol ) const;

/**
* Returns TRUE if the symbol layer rendering can cause visible artifacts across a single feature
* when the feature is rendered as a series of adjacent map tiles each containing a portion of the feature's geometry.
*
* The default implementation returns FALSE.
*
* \since QGIS 3.18
*/
virtual bool canCauseArtifactsBetweenAdjacentTiles() const;

void setLocked( bool locked ) { mLocked = locked; }
bool isLocked() const { return mLocked; }

Expand Down

0 comments on commit bdf5e4f

Please sign in to comment.