From 0ca7e90a9f01f9f27d2c8fe1b433146ebac43092 Mon Sep 17 00:00:00 2001 From: Nyall Dawson Date: Tue, 11 Jun 2024 12:59:53 +1000 Subject: [PATCH 01/13] Add method to collect symbol layer clip geometries intersecting given bounds --- .../symbology/qgssymbollayerutils.sip.in | 12 +++ .../symbology/qgssymbollayerutils.sip.in | 12 +++ src/core/symbology/qgssymbollayerutils.cpp | 20 +++++ src/core/symbology/qgssymbollayerutils.h | 12 +++ tests/src/python/test_qgssymbollayerutils.py | 80 ++++++++++++++++++- 5 files changed, 134 insertions(+), 2 deletions(-) diff --git a/python/PyQt6/core/auto_generated/symbology/qgssymbollayerutils.sip.in b/python/PyQt6/core/auto_generated/symbology/qgssymbollayerutils.sip.in index 167897841a4f..4da46e560c18 100644 --- a/python/PyQt6/core/auto_generated/symbology/qgssymbollayerutils.sip.in +++ b/python/PyQt6/core/auto_generated/symbology/qgssymbollayerutils.sip.in @@ -1001,6 +1001,18 @@ Regenerate recursively unique id from ``symbolLayer`` and its children .. versionadded:: 3.30 %End + static QVector< QgsGeometry > collectSymbolLayerClipGeometries( const QgsRenderContext &context, const QString &symbolLayerId, const QRectF &bounds ); +%Docstring +Returns a list of the symbol layer clip geometries to be used for the symbol layer with the specified +ID. + +The ``bounds`` argument specifies the target bounds (in painter coordinates) for matching geometries. Only mask +geometries which intersect ``bounds`` will be returned. If ``bounds`` is a null QRectF then all clip geometries +for the symbol layer will be returned. + +.. versionadded:: 3.38 +%End + }; diff --git a/python/core/auto_generated/symbology/qgssymbollayerutils.sip.in b/python/core/auto_generated/symbology/qgssymbollayerutils.sip.in index 167897841a4f..4da46e560c18 100644 --- a/python/core/auto_generated/symbology/qgssymbollayerutils.sip.in +++ b/python/core/auto_generated/symbology/qgssymbollayerutils.sip.in @@ -1001,6 +1001,18 @@ Regenerate recursively unique id from ``symbolLayer`` and its children .. versionadded:: 3.30 %End + static QVector< QgsGeometry > collectSymbolLayerClipGeometries( const QgsRenderContext &context, const QString &symbolLayerId, const QRectF &bounds ); +%Docstring +Returns a list of the symbol layer clip geometries to be used for the symbol layer with the specified +ID. + +The ``bounds`` argument specifies the target bounds (in painter coordinates) for matching geometries. Only mask +geometries which intersect ``bounds`` will be returned. If ``bounds`` is a null QRectF then all clip geometries +for the symbol layer will be returned. + +.. versionadded:: 3.38 +%End + }; diff --git a/src/core/symbology/qgssymbollayerutils.cpp b/src/core/symbology/qgssymbollayerutils.cpp index 7985d43c40f3..6d04614cca28 100644 --- a/src/core/symbology/qgssymbollayerutils.cpp +++ b/src/core/symbology/qgssymbollayerutils.cpp @@ -5418,6 +5418,26 @@ void QgsSymbolLayerUtils::resetSymbolLayerIds( QgsSymbolLayer *symbolLayer ) changeSymbolLayerIds( symbolLayer, []() { return QUuid::createUuid().toString(); } ); } +QVector QgsSymbolLayerUtils::collectSymbolLayerClipGeometries( const QgsRenderContext &context, const QString &symbolLayerId, const QRectF &bounds ) +{ + QVector clipGeometries = context.symbolLayerClipGeometries( symbolLayerId ); + if ( clipGeometries.empty() ) + return {}; + + if ( bounds.isNull() ) + return clipGeometries; + + const QgsRectangle boundsRect = QgsRectangle( bounds ); + + clipGeometries.erase( + std::remove_if( clipGeometries.begin(), clipGeometries.end(), [&boundsRect]( const QgsGeometry & geometry ) + { + return !geometry.boundingBoxIntersects( boundsRect ); + } ), clipGeometries.end() ); + + return clipGeometries; +} + void QgsSymbolLayerUtils::resetSymbolLayerIds( QgsSymbol *symbol ) { changeSymbolLayerIds( symbol, []() { return QUuid::createUuid().toString(); } ); diff --git a/src/core/symbology/qgssymbollayerutils.h b/src/core/symbology/qgssymbollayerutils.h index e20ea9777b09..89f50d28e5a9 100644 --- a/src/core/symbology/qgssymbollayerutils.h +++ b/src/core/symbology/qgssymbollayerutils.h @@ -929,6 +929,18 @@ class CORE_EXPORT QgsSymbolLayerUtils */ static void resetSymbolLayerIds( QgsSymbolLayer *symbolLayer ); + /** + * Returns a list of the symbol layer clip geometries to be used for the symbol layer with the specified + * ID. + * + * The \a bounds argument specifies the target bounds (in painter coordinates) for matching geometries. Only mask + * geometries which intersect \a bounds will be returned. If \a bounds is a null QRectF then all clip geometries + * for the symbol layer will be returned. + * + * \since QGIS 3.38 + */ + static QVector< QgsGeometry > collectSymbolLayerClipGeometries( const QgsRenderContext &context, const QString &symbolLayerId, const QRectF &bounds ); + ///@cond PRIVATE #ifndef SIP_RUN static QgsProperty rotateWholeSymbol( double additionalRotation, const QgsProperty &property ) diff --git a/tests/src/python/test_qgssymbollayerutils.py b/tests/src/python/test_qgssymbollayerutils.py index b916f75605b7..3969d25a3ffe 100644 --- a/tests/src/python/test_qgssymbollayerutils.py +++ b/tests/src/python/test_qgssymbollayerutils.py @@ -11,7 +11,15 @@ import math -from qgis.PyQt.QtCore import QDir, QMimeData, QPointF, QSize, QSizeF, Qt +from qgis.PyQt.QtCore import ( + QDir, + QMimeData, + QPointF, + QSize, + QSizeF, + Qt, + QRectF +) from qgis.PyQt.QtXml import QDomDocument, QDomElement from qgis.PyQt.QtGui import QColor, QImage, QPolygonF from qgis.core import ( @@ -33,7 +41,9 @@ QgsSymbolLayer, QgsSymbolLayerUtils, QgsUnitTypes, - QgsVectorLayer + QgsVectorLayer, + QgsRenderContext, + QgsGeometry ) import unittest from qgis.testing import start_app, QgisTestCase @@ -821,6 +831,72 @@ def test_font_marker_load(self): font_marker = QgsSymbolLayerUtils.loadSymbol(elem, QgsReadWriteContext()) self.assertEqual(font_marker.symbolLayers()[0].character(), "()") + def test_collect_symbol_layer_clip_geometries(self): + """ + Test logic relating to symbol layer clip geometries. + """ + rc = QgsRenderContext() + self.assertFalse(QgsSymbolLayerUtils.collectSymbolLayerClipGeometries( + rc, 'x', QRectF(0, 0, 10, 10) + )) + rc.addSymbolLayerClipGeometry('x', + QgsGeometry.fromWkt( + 'Polygon(( 0 0, 1 0 , 1 1 , 0 1, 0 0 ))')) + self.assertFalse(QgsSymbolLayerUtils.collectSymbolLayerClipGeometries( + rc, 'y', QRectF(0, 0, 10, 10) + )) + self.assertCountEqual([g.asWkt() for g in + QgsSymbolLayerUtils.collectSymbolLayerClipGeometries( + rc, 'x', QRectF(0, 0, 10, 10) + )], ['Polygon ((0 0, 1 0, 1 1, 0 1, 0 0))']) + rc.addSymbolLayerClipGeometry('x', QgsGeometry.fromWkt( + 'Polygon(( 20 0, 21 0 , 21 1 , 20 1, 20 0 ))')) + self.assertCountEqual([g.asWkt() for g in + QgsSymbolLayerUtils.collectSymbolLayerClipGeometries( + rc, 'x', QRectF(0, 0, 10, 10) + )], ['Polygon ((0 0, 1 0, 1 1, 0 1, 0 0))']) + self.assertCountEqual([g.asWkt() for g in + QgsSymbolLayerUtils.collectSymbolLayerClipGeometries( + rc, 'x', QRectF(15, 0, 10, 10) + )], + ['Polygon ((20 0, 21 0, 21 1, 20 1, 20 0))']) + self.assertCountEqual([g.asWkt() for g in + QgsSymbolLayerUtils.collectSymbolLayerClipGeometries( + rc, 'x', QRectF(0, 0, 25, 10) + )], ['Polygon ((0 0, 1 0, 1 1, 0 1, 0 0))', + 'Polygon ((20 0, 21 0, 21 1, 20 1, 20 0))']) + + # null rect + self.assertCountEqual([g.asWkt() for g in + QgsSymbolLayerUtils.collectSymbolLayerClipGeometries( + rc, 'x', QRectF() + )], ['Polygon ((0 0, 1 0, 1 1, 0 1, 0 0))', + 'Polygon ((20 0, 21 0, 21 1, 20 1, 20 0))']) + + rc.addSymbolLayerClipGeometry('y', + QgsGeometry.fromWkt( + 'Polygon(( 0 0, 2 0 , 2 1 , 0 1, 0 0 ))')) + self.assertCountEqual([g.asWkt() for g in + QgsSymbolLayerUtils.collectSymbolLayerClipGeometries( + rc, 'x', QRectF(0, 0, 25, 10) + )], ['Polygon ((0 0, 1 0, 1 1, 0 1, 0 0))', + 'Polygon ((20 0, 21 0, 21 1, 20 1, 20 0))']) + self.assertCountEqual([g.asWkt() for g in + QgsSymbolLayerUtils.collectSymbolLayerClipGeometries( + rc, 'y', QRectF(0, 0, 25, 10) + )], ['Polygon ((0 0, 2 0, 2 1, 0 1, 0 0))']) + + # null rect + self.assertCountEqual([g.asWkt() for g in + QgsSymbolLayerUtils.collectSymbolLayerClipGeometries( + rc, 'x', QRectF() + )], ['Polygon ((0 0, 1 0, 1 1, 0 1, 0 0))', + 'Polygon ((20 0, 21 0, 21 1, 20 1, 20 0))']) + self.assertCountEqual([g.asWkt() for g in + QgsSymbolLayerUtils.collectSymbolLayerClipGeometries( + rc, 'y', QRectF() + )], ['Polygon ((0 0, 2 0, 2 1, 0 1, 0 0))']) + if __name__ == '__main__': unittest.main() From c976a1e7a6e36872df65a70642c2c5bb8383a59a Mon Sep 17 00:00:00 2001 From: Nyall Dawson Date: Wed, 19 Jun 2024 09:51:30 +1000 Subject: [PATCH 02/13] Add argument to QgsSymbol::startRender for whether symbol is subsymbol Allows us to know in startRender whether the symbol is actually a subsymbol for a QgsSymbolLayer. Currently unused. --- .../auto_generated/symbology/qgssymbol.sip.in | 3 ++- .../auto_generated/symbology/qgssymbol.sip.in | 3 ++- src/core/symbology/qgsarrowsymbollayer.cpp | 2 +- src/core/symbology/qgsfillsymbollayer.cpp | 18 +++++++++--------- .../qgsgeometrygeneratorsymbollayer.cpp | 2 +- src/core/symbology/qgslinesymbollayer.cpp | 6 +++--- src/core/symbology/qgsmarkersymbollayer.cpp | 2 +- src/core/symbology/qgssymbol.cpp | 2 +- src/core/symbology/qgssymbol.h | 3 ++- .../symbology/qgsvectorfieldsymbollayer.cpp | 2 +- 10 files changed, 23 insertions(+), 20 deletions(-) diff --git a/python/PyQt6/core/auto_generated/symbology/qgssymbol.sip.in b/python/PyQt6/core/auto_generated/symbology/qgssymbol.sip.in index 95197f0cf6d4..79f9a46ae366 100644 --- a/python/PyQt6/core/auto_generated/symbology/qgssymbol.sip.in +++ b/python/PyQt6/core/auto_generated/symbology/qgssymbol.sip.in @@ -283,7 +283,7 @@ Returns ``False`` if ``layer`` is not compatible with the symbol's :py:func:`~Qg ``True`` if the layer was successfully replaced. %End - void startRender( QgsRenderContext &context, const QgsFields &fields = QgsFields() ); + void startRender( QgsRenderContext &context, const QgsFields &fields = QgsFields(), bool isSubSymbol = false ); %Docstring Begins the rendering process for the symbol. This must be called before :py:func:`~QgsSymbol.renderFeature`, and should be followed by a call to :py:func:`~QgsSymbol.stopRender`. @@ -292,6 +292,7 @@ and should be followed by a call to :py:func:`~QgsSymbol.stopRender`. :param fields: fields for features to be rendered (usually the associated vector layer's fields). Required for correct calculation of data defined overrides. +:param isSubSymbol: Should be set to ``True`` when the symbol is being used as a subsymbol of a :py:class:`QgsSymbolLayer` (since QGIS 3.38) .. seealso:: :py:func:`stopRender` %End diff --git a/python/core/auto_generated/symbology/qgssymbol.sip.in b/python/core/auto_generated/symbology/qgssymbol.sip.in index 30e0d6937336..91f121cb085c 100644 --- a/python/core/auto_generated/symbology/qgssymbol.sip.in +++ b/python/core/auto_generated/symbology/qgssymbol.sip.in @@ -283,7 +283,7 @@ Returns ``False`` if ``layer`` is not compatible with the symbol's :py:func:`~Qg ``True`` if the layer was successfully replaced. %End - void startRender( QgsRenderContext &context, const QgsFields &fields = QgsFields() ); + void startRender( QgsRenderContext &context, const QgsFields &fields = QgsFields(), bool isSubSymbol = false ); %Docstring Begins the rendering process for the symbol. This must be called before :py:func:`~QgsSymbol.renderFeature`, and should be followed by a call to :py:func:`~QgsSymbol.stopRender`. @@ -292,6 +292,7 @@ and should be followed by a call to :py:func:`~QgsSymbol.stopRender`. :param fields: fields for features to be rendered (usually the associated vector layer's fields). Required for correct calculation of data defined overrides. +:param isSubSymbol: Should be set to ``True`` when the symbol is being used as a subsymbol of a :py:class:`QgsSymbolLayer` (since QGIS 3.38) .. seealso:: :py:func:`stopRender` %End diff --git a/src/core/symbology/qgsarrowsymbollayer.cpp b/src/core/symbology/qgsarrowsymbollayer.cpp index fccc1dfb91f8..713153c02bc5 100644 --- a/src/core/symbology/qgsarrowsymbollayer.cpp +++ b/src/core/symbology/qgsarrowsymbollayer.cpp @@ -215,7 +215,7 @@ void QgsArrowSymbolLayer::startRender( QgsSymbolRenderContext &context ) mComputedHeadType = headType(); mComputedArrowType = arrowType(); - mSymbol->startRender( context.renderContext() ); + mSymbol->startRender( context.renderContext(), context.fields(), true ); } void QgsArrowSymbolLayer::stopRender( QgsSymbolRenderContext &context ) diff --git a/src/core/symbology/qgsfillsymbollayer.cpp b/src/core/symbology/qgsfillsymbollayer.cpp index b3250740676b..48accab3bcec 100644 --- a/src/core/symbology/qgsfillsymbollayer.cpp +++ b/src/core/symbology/qgsfillsymbollayer.cpp @@ -2148,7 +2148,7 @@ void QgsSVGFillSymbolLayer::startRender( QgsSymbolRenderContext &context ) if ( mStroke ) { - mStroke->startRender( context.renderContext(), context.fields() ); + mStroke->startRender( context.renderContext(), context.fields(), true ); } } @@ -3118,7 +3118,7 @@ bool QgsLinePatternFillSymbolLayer::applyPattern( const QgsSymbolRenderContext & lineRenderContext.setFlag( Qgis::RenderContextFlag::RenderingSubSymbol ); lineRenderContext.setDisabledSymbolLayersV2( context.renderContext().disabledSymbolLayersV2() ); - fillLineSymbol->startRender( lineRenderContext, context.fields() ); + fillLineSymbol->startRender( lineRenderContext, context.fields(), true ); QVector polygons; polygons.append( QPolygonF() << p1 << p2 ); @@ -3176,7 +3176,7 @@ void QgsLinePatternFillSymbolLayer::startRender( QgsSymbolRenderContext &context if ( mRenderUsingLines && mFillLineSymbol ) { - mFillLineSymbol->startRender( context.renderContext(), context.fields() ); + mFillLineSymbol->startRender( context.renderContext(), context.fields(), true ); mFillLineSymbolRenderStarted = true; } } @@ -3202,7 +3202,7 @@ void QgsLinePatternFillSymbolLayer::renderPolygon( const QPolygonF &points, cons if ( !mFillLineSymbolRenderStarted && mFillLineSymbol ) { - mFillLineSymbol->startRender( context.renderContext(), context.fields() ); + mFillLineSymbol->startRender( context.renderContext(), context.fields(), true ); mFillLineSymbolRenderStarted = true; } @@ -3880,7 +3880,7 @@ bool QgsPointPatternFillSymbolLayer::applyPattern( const QgsSymbolRenderContext pointRenderContext.setExpressionContext( context.renderContext().expressionContext() ); pointRenderContext.setFlag( Qgis::RenderContextFlag::RenderingSubSymbol ); - mMarkerSymbol->startRender( pointRenderContext, context.fields() ); + mMarkerSymbol->startRender( pointRenderContext, context.fields(), true ); //render points on distance grid for ( double currentX = -width; currentX <= width * 2.0; currentX += width ) @@ -3957,7 +3957,7 @@ void QgsPointPatternFillSymbolLayer::startRender( QgsSymbolRenderContext &contex if ( mRenderUsingMarkers && mMarkerSymbol ) { - mMarkerSymbol->startRender( context.renderContext() ); + mMarkerSymbol->startRender( context.renderContext(), context.fields(), true ); mMarkerSymbolRenderStarted = true; } } @@ -4001,7 +4001,7 @@ void QgsPointPatternFillSymbolLayer::renderPolygon( const QPolygonF &points, con if ( !mMarkerSymbolRenderStarted && mMarkerSymbol ) { - mMarkerSymbol->startRender( context.renderContext() ); + mMarkerSymbol->startRender( context.renderContext(), context.fields(), true ); mMarkerSymbolRenderStarted = true; } @@ -4793,7 +4793,7 @@ QColor QgsCentroidFillSymbolLayer::color() const void QgsCentroidFillSymbolLayer::startRender( QgsSymbolRenderContext &context ) { - mMarker->startRender( context.renderContext(), context.fields() ); + mMarker->startRender( context.renderContext(), context.fields(), true ); } void QgsCentroidFillSymbolLayer::stopRender( QgsSymbolRenderContext &context ) @@ -5544,7 +5544,7 @@ QColor QgsRandomMarkerFillSymbolLayer::color() const void QgsRandomMarkerFillSymbolLayer::startRender( QgsSymbolRenderContext &context ) { - mMarker->startRender( context.renderContext(), context.fields() ); + mMarker->startRender( context.renderContext(), context.fields(), true ); } void QgsRandomMarkerFillSymbolLayer::stopRender( QgsSymbolRenderContext &context ) diff --git a/src/core/symbology/qgsgeometrygeneratorsymbollayer.cpp b/src/core/symbology/qgsgeometrygeneratorsymbollayer.cpp index a7090aa2b866..4781761159d8 100644 --- a/src/core/symbology/qgsgeometrygeneratorsymbollayer.cpp +++ b/src/core/symbology/qgsgeometrygeneratorsymbollayer.cpp @@ -98,7 +98,7 @@ void QgsGeometryGeneratorSymbolLayer::startRender( QgsSymbolRenderContext &conte { mExpression->prepare( &context.renderContext().expressionContext() ); - subSymbol()->startRender( context.renderContext() ); + subSymbol()->startRender( context.renderContext(), context.fields(), true ); } void QgsGeometryGeneratorSymbolLayer::stopRender( QgsSymbolRenderContext &context ) diff --git a/src/core/symbology/qgslinesymbollayer.cpp b/src/core/symbology/qgslinesymbollayer.cpp index fa41e5177416..83b478293f5f 100644 --- a/src/core/symbology/qgslinesymbollayer.cpp +++ b/src/core/symbology/qgslinesymbollayer.cpp @@ -2475,7 +2475,7 @@ void QgsMarkerLineSymbolLayer::startRender( QgsSymbolRenderContext &context ) hints |= Qgis::SymbolRenderHint::DynamicRotation; mMarker->setRenderHints( hints ); - mMarker->startRender( context.renderContext(), context.fields() ); + mMarker->startRender( context.renderContext(), context.fields(), true ); } void QgsMarkerLineSymbolLayer::stopRender( QgsSymbolRenderContext &context ) @@ -2801,7 +2801,7 @@ void QgsHashedLineSymbolLayer::startRender( QgsSymbolRenderContext &context ) hints |= Qgis::SymbolRenderHint::DynamicRotation; mHashSymbol->setRenderHints( hints ); - mHashSymbol->startRender( context.renderContext(), context.fields() ); + mHashSymbol->startRender( context.renderContext(), context.fields(), true ); } void QgsHashedLineSymbolLayer::stopRender( QgsSymbolRenderContext &context ) @@ -3876,7 +3876,7 @@ void QgsFilledLineSymbolLayer::startRender( QgsSymbolRenderContext &context ) { if ( mFill ) { - mFill->startRender( context.renderContext(), context.fields() ); + mFill->startRender( context.renderContext(), context.fields(), true ); } } diff --git a/src/core/symbology/qgsmarkersymbollayer.cpp b/src/core/symbology/qgsmarkersymbollayer.cpp index 2a373c60770b..19801e4cb02d 100644 --- a/src/core/symbology/qgsmarkersymbollayer.cpp +++ b/src/core/symbology/qgsmarkersymbollayer.cpp @@ -1931,7 +1931,7 @@ void QgsFilledMarkerSymbolLayer::startRender( QgsSymbolRenderContext &context ) { if ( mFill ) { - mFill->startRender( context.renderContext(), context.fields() ); + mFill->startRender( context.renderContext(), context.fields(), true ); } QgsSimpleMarkerSymbolLayerBase::startRender( context ); diff --git a/src/core/symbology/qgssymbol.cpp b/src/core/symbology/qgssymbol.cpp index ae26a6b516a9..233ed4ea781e 100644 --- a/src/core/symbology/qgssymbol.cpp +++ b/src/core/symbology/qgssymbol.cpp @@ -826,7 +826,7 @@ bool QgsSymbol::changeSymbolLayer( int index, QgsSymbolLayer *layer ) } -void QgsSymbol::startRender( QgsRenderContext &context, const QgsFields &fields ) +void QgsSymbol::startRender( QgsRenderContext &context, const QgsFields &fields, bool isSubSymbol ) { Q_ASSERT_X( !mStarted, "startRender", "Rendering has already been started for this symbol instance!" ); mStarted = true; diff --git a/src/core/symbology/qgssymbol.h b/src/core/symbology/qgssymbol.h index 4bac791d9c1e..123c9f445208 100644 --- a/src/core/symbology/qgssymbol.h +++ b/src/core/symbology/qgssymbol.h @@ -329,9 +329,10 @@ class CORE_EXPORT QgsSymbol * \param fields fields for features to be rendered (usually the associated * vector layer's fields). Required for correct calculation of data defined * overrides. + * \param isSubSymbol Should be set to TRUE when the symbol is being used as a subsymbol of a QgsSymbolLayer (since QGIS 3.38) * \see stopRender() */ - void startRender( QgsRenderContext &context, const QgsFields &fields = QgsFields() ); + void startRender( QgsRenderContext &context, const QgsFields &fields = QgsFields(), bool isSubSymbol = false ); /** * Ends the rendering process. This should be called after rendering all desired features. diff --git a/src/core/symbology/qgsvectorfieldsymbollayer.cpp b/src/core/symbology/qgsvectorfieldsymbollayer.cpp index 105a0eede77f..ef2d68294173 100644 --- a/src/core/symbology/qgsvectorfieldsymbollayer.cpp +++ b/src/core/symbology/qgsvectorfieldsymbollayer.cpp @@ -223,7 +223,7 @@ void QgsVectorFieldSymbolLayer::startRender( QgsSymbolRenderContext &context ) { if ( mLineSymbol ) { - mLineSymbol->startRender( context.renderContext(), context.fields() ); + mLineSymbol->startRender( context.renderContext(), context.fields(), true ); } const QgsFields fields = context.fields(); From f83b228adf2abfca6a2eb2e24091d079db7a01c9 Mon Sep 17 00:00:00 2001 From: Nyall Dawson Date: Wed, 19 Jun 2024 09:53:53 +1000 Subject: [PATCH 03/13] Minor cleanup --- src/core/symbology/qgssymbollayer.cpp | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/src/core/symbology/qgssymbollayer.cpp b/src/core/symbology/qgssymbollayer.cpp index 037c37271f47..02ba02a202e9 100644 --- a/src/core/symbology/qgssymbollayer.cpp +++ b/src/core/symbology/qgssymbollayer.cpp @@ -958,15 +958,14 @@ void QgsSymbolLayer::prepareMasks( const QgsSymbolRenderContext &context ) mClipPath.clear(); const QgsRenderContext &renderContext = context.renderContext(); - const QVector clipGeometries = renderContext.symbolLayerClipGeometries( id() ); if ( !clipGeometries.empty() ) { QgsGeometry mergedGeom = QgsGeometry::unaryUnion( clipGeometries ); - if ( context.renderContext().maskSettings().simplifyTolerance() > 0 ) + if ( renderContext.maskSettings().simplifyTolerance() > 0 ) { QgsGeos geos( mergedGeom.constGet() ); - mergedGeom = QgsGeometry( geos.simplify( context.renderContext().maskSettings().simplifyTolerance() ) ); + mergedGeom = QgsGeometry( geos.simplify( renderContext.maskSettings().simplifyTolerance() ) ); } #if GEOS_VERSION_MAJOR==3 && GEOS_VERSION_MINOR<10 // structure would be better, but too old GEOS From d73ed4251bf51a402beb44c5f6946bc7235a3dab Mon Sep 17 00:00:00 2001 From: Nyall Dawson Date: Wed, 19 Jun 2024 09:57:00 +1000 Subject: [PATCH 04/13] Make installMasks return TRUE if any masks were found and installed --- .../core/auto_generated/symbology/qgssymbollayer.sip.in | 4 +++- .../core/auto_generated/symbology/qgssymbollayer.sip.in | 4 +++- src/core/symbology/qgssymbollayer.cpp | 8 ++++++-- src/core/symbology/qgssymbollayer.h | 5 ++++- 4 files changed, 16 insertions(+), 5 deletions(-) diff --git a/python/PyQt6/core/auto_generated/symbology/qgssymbollayer.sip.in b/python/PyQt6/core/auto_generated/symbology/qgssymbollayer.sip.in index fcf655854261..04389e56d0fa 100644 --- a/python/PyQt6/core/auto_generated/symbology/qgssymbollayer.sip.in +++ b/python/PyQt6/core/auto_generated/symbology/qgssymbollayer.sip.in @@ -702,7 +702,7 @@ Copies paint effect of this layer to another symbol layer :param destLayer: destination layer %End - void installMasks( QgsRenderContext &context, bool recursive ); + bool installMasks( QgsRenderContext &context, bool recursive ); %Docstring When rendering, install masks on ``context`` painter if ``recursive`` is ``True`` masks are installed recursively for all children symbol layers @@ -711,6 +711,8 @@ if ``recursive`` is ``True`` masks are installed recursively for all children sy .. seealso:: :py:func:`removeMasks` +:return: ``True`` if any masks were installed (since QGIS 3.38) + .. versionadded:: 3.30 %End diff --git a/python/core/auto_generated/symbology/qgssymbollayer.sip.in b/python/core/auto_generated/symbology/qgssymbollayer.sip.in index aa4f1ed80d6a..0511c1b7ddc7 100644 --- a/python/core/auto_generated/symbology/qgssymbollayer.sip.in +++ b/python/core/auto_generated/symbology/qgssymbollayer.sip.in @@ -702,7 +702,7 @@ Copies paint effect of this layer to another symbol layer :param destLayer: destination layer %End - void installMasks( QgsRenderContext &context, bool recursive ); + bool installMasks( QgsRenderContext &context, bool recursive ); %Docstring When rendering, install masks on ``context`` painter if ``recursive`` is ``True`` masks are installed recursively for all children symbol layers @@ -711,6 +711,8 @@ if ``recursive`` is ``True`` masks are installed recursively for all children sy .. seealso:: :py:func:`removeMasks` +:return: ``True`` if any masks were installed (since QGIS 3.38) + .. versionadded:: 3.30 %End diff --git a/src/core/symbology/qgssymbollayer.cpp b/src/core/symbology/qgssymbollayer.cpp index 02ba02a202e9..11b41438678f 100644 --- a/src/core/symbology/qgssymbollayer.cpp +++ b/src/core/symbology/qgssymbollayer.cpp @@ -1005,20 +1005,24 @@ void QgsSymbolLayer::prepareMasks( const QgsSymbolRenderContext &context ) } } -void QgsSymbolLayer::installMasks( QgsRenderContext &context, bool recursive ) +bool QgsSymbolLayer::installMasks( QgsRenderContext &context, bool recursive ) { + bool res = false; if ( !mClipPath.isEmpty() ) { context.painter()->save(); context.painter()->setClipPath( mClipPath, Qt::IntersectClip ); + res = true; } if ( QgsSymbol *lSubSymbol = recursive ? subSymbol() : nullptr ) { const QList layers = lSubSymbol->symbolLayers(); for ( QgsSymbolLayer *sl : layers ) - sl->installMasks( context, true ); + res = sl->installMasks( context, true ) || res; } + + return res; } void QgsSymbolLayer::removeMasks( QgsRenderContext &context, bool recursive ) diff --git a/src/core/symbology/qgssymbollayer.h b/src/core/symbology/qgssymbollayer.h index bb2ec73e9dc9..39ca75642175 100644 --- a/src/core/symbology/qgssymbollayer.h +++ b/src/core/symbology/qgssymbollayer.h @@ -712,9 +712,12 @@ class CORE_EXPORT QgsSymbolLayer * if \a recursive is TRUE masks are installed recursively for all children symbol layers * \see prepareMasks() * \see removeMasks() + * + * \returns TRUE if any masks were installed (since QGIS 3.38) + * * \since QGIS 3.30 */ - void installMasks( QgsRenderContext &context, bool recursive ); + bool installMasks( QgsRenderContext &context, bool recursive ); /** * When rendering, remove previously installed masks from \a context painter From 3122666196ec8882f1eda4c923287fb0738633b8 Mon Sep 17 00:00:00 2001 From: Nyall Dawson Date: Wed, 19 Jun 2024 10:09:56 +1000 Subject: [PATCH 05/13] Greatly optimise selective masking vector exports Optimise the logic used when the new geometry backend for selective masking is in effect: Whenever its SAFE, instead of calculating an "entire map" clipping path and then applying this for every feature being rendered, we now defer the calculation of the clipping path until we are rendering individual features. Then, we create a clipping path which contains ONLY the mask paths which are within the area being drawn over. This avoids having the entire map clipping path being used for EVERY feature being rendered, which results in huge PDF/SVG exports when masks are in effect, and instead results in clipping paths which are confined just to a sensible area around each rendered feature. In some complex test projects this reduces the PDF export size by a factor of 0.01!! (and results in PDFs/SVGs which open much quicker in viewers and editors, and don't grind their operation to a halt). --- python/PyQt6/core/auto_additions/qgis.py | 3 +- python/PyQt6/core/auto_generated/qgis.sip.in | 1 + .../symbology/qgssymbollayer.sip.in | 33 +++++----- python/core/auto_additions/qgis.py | 3 +- python/core/auto_generated/qgis.sip.in | 1 + .../symbology/qgssymbollayer.sip.in | 33 +++++----- src/core/qgis.h | 1 + src/core/symbology/qgssymbol.cpp | 63 ++++++++++++++++++- src/core/symbology/qgssymbollayer.cpp | 33 +++++++++- src/core/symbology/qgssymbollayer.h | 29 +++++---- 10 files changed, 156 insertions(+), 44 deletions(-) diff --git a/python/PyQt6/core/auto_additions/qgis.py b/python/PyQt6/core/auto_additions/qgis.py index 6b45e2385117..023dc3dc748c 100644 --- a/python/PyQt6/core/auto_additions/qgis.py +++ b/python/PyQt6/core/auto_additions/qgis.py @@ -669,7 +669,8 @@ SymbolPreviewFlags = Qgis # dirty hack since SIP seems to introduce the flags in module # monkey patching scoped based enum Qgis.SymbolLayerFlag.DisableFeatureClipping.__doc__ = "If present, indicates that features should never be clipped to the map extent during rendering" -Qgis.SymbolLayerFlag.__doc__ = "Flags controlling behavior of symbol layers\n\n.. note::\n\n These differ from Qgis.SymbolLayerUserFlag in that Qgis.SymbolLayerFlag flags are used to reflect the inbuilt properties\n of a symbol layer type, whereas Qgis.SymbolLayerUserFlag are optional, user controlled flags which can be toggled\n for a symbol layer.\n\n.. versionadded:: 3.22\n\n" + '* ``DisableFeatureClipping``: ' + Qgis.SymbolLayerFlag.DisableFeatureClipping.__doc__ +Qgis.SymbolLayerFlag.CanCalculateMaskGeometryPerFeature.__doc__ = "If present, indicates that mask geometry can safely be calculated per feature for the symbol layer. This avoids using the entire symbol layer's mask geometry for every feature rendered, considerably simplifying vector exports and resulting in much smaller file sizes. (Since QGIS 3.38)" +Qgis.SymbolLayerFlag.__doc__ = "Flags controlling behavior of symbol layers\n\n.. note::\n\n These differ from Qgis.SymbolLayerUserFlag in that Qgis.SymbolLayerFlag flags are used to reflect the inbuilt properties\n of a symbol layer type, whereas Qgis.SymbolLayerUserFlag are optional, user controlled flags which can be toggled\n for a symbol layer.\n\n.. versionadded:: 3.22\n\n" + '* ``DisableFeatureClipping``: ' + Qgis.SymbolLayerFlag.DisableFeatureClipping.__doc__ + '\n' + '* ``CanCalculateMaskGeometryPerFeature``: ' + Qgis.SymbolLayerFlag.CanCalculateMaskGeometryPerFeature.__doc__ # -- Qgis.SymbolLayerFlag.baseClass = Qgis Qgis.SymbolLayerFlags = lambda flags=0: Qgis.SymbolLayerFlag(flags) diff --git a/python/PyQt6/core/auto_generated/qgis.sip.in b/python/PyQt6/core/auto_generated/qgis.sip.in index 0ddc173a1abc..e1ee8e809a9b 100644 --- a/python/PyQt6/core/auto_generated/qgis.sip.in +++ b/python/PyQt6/core/auto_generated/qgis.sip.in @@ -389,6 +389,7 @@ The development version enum class SymbolLayerFlag /BaseType=IntFlag/ { DisableFeatureClipping, + CanCalculateMaskGeometryPerFeature, }; typedef QFlags SymbolLayerFlags; diff --git a/python/PyQt6/core/auto_generated/symbology/qgssymbollayer.sip.in b/python/PyQt6/core/auto_generated/symbology/qgssymbollayer.sip.in index 04389e56d0fa..4c0cbc8d89f8 100644 --- a/python/PyQt6/core/auto_generated/symbology/qgssymbollayer.sip.in +++ b/python/PyQt6/core/auto_generated/symbology/qgssymbollayer.sip.in @@ -663,6 +663,25 @@ This id has to be unique in the whole project Returns symbol layer identifier This id is unique in the whole project +.. versionadded:: 3.30 +%End + + bool installMasks( QgsRenderContext &context, bool recursive, const QRectF &rect = QRectF() ); +%Docstring +When rendering, install masks on ``context`` painter. + +If ``recursive`` is ``True`` masks are installed recursively for all children symbol layers. + +Since QGIS 3.38 the ``rect`` argument can be used to specify a target bounds (in painter coordinates) +for mask geometries. Only mask geometries which intersect ``rect`` will be installed. + +:return: ``True`` if any masks were installed (since QGIS 3.38) + +.. seealso:: :py:func:`prepareMasks` + +.. seealso:: :py:func:`removeMasks` + + .. versionadded:: 3.30 %End @@ -700,20 +719,6 @@ Copies all data defined properties of this layer to another symbol layer. Copies paint effect of this layer to another symbol layer :param destLayer: destination layer -%End - - bool installMasks( QgsRenderContext &context, bool recursive ); -%Docstring -When rendering, install masks on ``context`` painter -if ``recursive`` is ``True`` masks are installed recursively for all children symbol layers - -.. seealso:: :py:func:`prepareMasks` - -.. seealso:: :py:func:`removeMasks` - -:return: ``True`` if any masks were installed (since QGIS 3.38) - -.. versionadded:: 3.30 %End void removeMasks( QgsRenderContext &context, bool recursive ); diff --git a/python/core/auto_additions/qgis.py b/python/core/auto_additions/qgis.py index 3f15916b53dd..d0e7e1474a6b 100644 --- a/python/core/auto_additions/qgis.py +++ b/python/core/auto_additions/qgis.py @@ -653,7 +653,8 @@ SymbolPreviewFlags = Qgis # dirty hack since SIP seems to introduce the flags in module # monkey patching scoped based enum Qgis.SymbolLayerFlag.DisableFeatureClipping.__doc__ = "If present, indicates that features should never be clipped to the map extent during rendering" -Qgis.SymbolLayerFlag.__doc__ = "Flags controlling behavior of symbol layers\n\n.. note::\n\n These differ from Qgis.SymbolLayerUserFlag in that Qgis.SymbolLayerFlag flags are used to reflect the inbuilt properties\n of a symbol layer type, whereas Qgis.SymbolLayerUserFlag are optional, user controlled flags which can be toggled\n for a symbol layer.\n\n.. versionadded:: 3.22\n\n" + '* ``DisableFeatureClipping``: ' + Qgis.SymbolLayerFlag.DisableFeatureClipping.__doc__ +Qgis.SymbolLayerFlag.CanCalculateMaskGeometryPerFeature.__doc__ = "If present, indicates that mask geometry can safely be calculated per feature for the symbol layer. This avoids using the entire symbol layer's mask geometry for every feature rendered, considerably simplifying vector exports and resulting in much smaller file sizes. (Since QGIS 3.38)" +Qgis.SymbolLayerFlag.__doc__ = "Flags controlling behavior of symbol layers\n\n.. note::\n\n These differ from Qgis.SymbolLayerUserFlag in that Qgis.SymbolLayerFlag flags are used to reflect the inbuilt properties\n of a symbol layer type, whereas Qgis.SymbolLayerUserFlag are optional, user controlled flags which can be toggled\n for a symbol layer.\n\n.. versionadded:: 3.22\n\n" + '* ``DisableFeatureClipping``: ' + Qgis.SymbolLayerFlag.DisableFeatureClipping.__doc__ + '\n' + '* ``CanCalculateMaskGeometryPerFeature``: ' + Qgis.SymbolLayerFlag.CanCalculateMaskGeometryPerFeature.__doc__ # -- Qgis.SymbolLayerFlag.baseClass = Qgis Qgis.SymbolLayerFlags.baseClass = Qgis diff --git a/python/core/auto_generated/qgis.sip.in b/python/core/auto_generated/qgis.sip.in index 65e2c997f4cc..117988fbd58c 100644 --- a/python/core/auto_generated/qgis.sip.in +++ b/python/core/auto_generated/qgis.sip.in @@ -389,6 +389,7 @@ The development version enum class SymbolLayerFlag { DisableFeatureClipping, + CanCalculateMaskGeometryPerFeature, }; typedef QFlags SymbolLayerFlags; diff --git a/python/core/auto_generated/symbology/qgssymbollayer.sip.in b/python/core/auto_generated/symbology/qgssymbollayer.sip.in index 0511c1b7ddc7..14450dbcbfc1 100644 --- a/python/core/auto_generated/symbology/qgssymbollayer.sip.in +++ b/python/core/auto_generated/symbology/qgssymbollayer.sip.in @@ -663,6 +663,25 @@ This id has to be unique in the whole project Returns symbol layer identifier This id is unique in the whole project +.. versionadded:: 3.30 +%End + + bool installMasks( QgsRenderContext &context, bool recursive, const QRectF &rect = QRectF() ); +%Docstring +When rendering, install masks on ``context`` painter. + +If ``recursive`` is ``True`` masks are installed recursively for all children symbol layers. + +Since QGIS 3.38 the ``rect`` argument can be used to specify a target bounds (in painter coordinates) +for mask geometries. Only mask geometries which intersect ``rect`` will be installed. + +:return: ``True`` if any masks were installed (since QGIS 3.38) + +.. seealso:: :py:func:`prepareMasks` + +.. seealso:: :py:func:`removeMasks` + + .. versionadded:: 3.30 %End @@ -700,20 +719,6 @@ Copies all data defined properties of this layer to another symbol layer. Copies paint effect of this layer to another symbol layer :param destLayer: destination layer -%End - - bool installMasks( QgsRenderContext &context, bool recursive ); -%Docstring -When rendering, install masks on ``context`` painter -if ``recursive`` is ``True`` masks are installed recursively for all children symbol layers - -.. seealso:: :py:func:`prepareMasks` - -.. seealso:: :py:func:`removeMasks` - -:return: ``True`` if any masks were installed (since QGIS 3.38) - -.. versionadded:: 3.30 %End void removeMasks( QgsRenderContext &context, bool recursive ); diff --git a/src/core/qgis.h b/src/core/qgis.h index a42b247e4589..6b178db00ff6 100644 --- a/src/core/qgis.h +++ b/src/core/qgis.h @@ -636,6 +636,7 @@ class CORE_EXPORT Qgis enum class SymbolLayerFlag : int SIP_ENUM_BASETYPE( IntFlag ) { DisableFeatureClipping = 1 << 0, //!< If present, indicates that features should never be clipped to the map extent during rendering + CanCalculateMaskGeometryPerFeature = 1 << 1, //!< If present, indicates that mask geometry can safely be calculated per feature for the symbol layer. This avoids using the entire symbol layer's mask geometry for every feature rendered, considerably simplifying vector exports and resulting in much smaller file sizes. (Since QGIS 3.38) }; Q_ENUM( SymbolLayerFlag ) //! Symbol layer flags diff --git a/src/core/symbology/qgssymbol.cpp b/src/core/symbology/qgssymbol.cpp index 233ed4ea781e..87908ab969fd 100644 --- a/src/core/symbology/qgssymbol.cpp +++ b/src/core/symbology/qgssymbol.cpp @@ -18,6 +18,7 @@ #include #include #include +#include #include #include @@ -868,7 +869,25 @@ void QgsSymbol::startRender( QgsRenderContext &context, const QgsFields &fields, continue; layer->prepareExpressions( symbolContext ); - layer->prepareMasks( symbolContext ); + + // We prepare "entire map" clip masks in advance only in certain circumstances. These are non-optimal, + // because the entire map mask will be applied once for every feature rendered, resulting in overly complex + // clipping paths with paths which fall well outside of the map area that is actually being drawn on for the + // feature. These circumstances are: + // 1. If we are rendering a sub symbol. The current logic relating to calculating per-feature masks + // is not designed to handle sub symbol rendering where layers from the subsymbol have their own set of + // clipping paths, so we just fallback to the non-optimal approach always for these cases. + // TODO: + // - we could add another special condition here to check whether the subsymbol actually does have unique + // clipping paths in its symbol layers, or whether they are identical to the parent symbol layer's clipping paths. + // 2. When the symbol layer type doesn't explicitly state that it's compatible with per-feature mask geometries + // 3. When the older clipping mask approach using QPainterPaths is being used. (This last condition can be + // safely removed when the older QPainterPath backend is removed.) + // In other circumstances we do NOT prepare masks in advance, and instead calculate them in renderFeature(). + if ( isSubSymbol + || !layer->flags().testFlag( Qgis::SymbolLayerFlag::CanCalculateMaskGeometryPerFeature ) + || !context.symbolLayerClipPaths( layer->id() ).isEmpty() ) + layer->prepareMasks( symbolContext ); layer->startRender( symbolContext ); } } @@ -1642,6 +1661,22 @@ void QgsSymbol::renderFeature( const QgsFeature &feature, QgsRenderContext &cont if ( needsExpressionContext ) mSymbolRenderContext->expressionContextScope()->addVariable( QgsExpressionContextScope::StaticVariable( QStringLiteral( "symbol_layer_index" ), symbolLayerIndex + 1, true ) ); + // if this symbol layer has associated clip masks, we need to render it to a QPicture first so that we can + // determine the actual rendered bounds of the symbol. We'll then use that to retrieve the clip masks we need + // to apply when painting the symbol via this QPicture. + const bool hasClipGeometries = symbolLayer->flags().testFlag( Qgis::SymbolLayerFlag::CanCalculateMaskGeometryPerFeature ) + && context.symbolLayerHasClipGeometries( symbolLayer->id() ); + QPainter *previousPainter = nullptr; + std::unique_ptr< QPicture > renderedPicture; + std::unique_ptr< QPainter > picturePainter; + if ( hasClipGeometries ) + { + previousPainter = context.painter(); + renderedPicture = std::make_unique< QPicture >(); + picturePainter = std::make_unique< QPainter >( renderedPicture.get() ); + context.setPainter( picturePainter.get() ); + } + symbolLayer->startFeatureRender( feature, context ); switch ( mType ) @@ -1710,6 +1745,32 @@ void QgsSymbol::renderFeature( const QgsFeature &feature, QgsRenderContext &cont } symbolLayer->stopFeatureRender( feature, context ); + + if ( hasClipGeometries ) + { + // restore previous painter + context.setPainter( previousPainter ); + picturePainter->end(); + picturePainter.reset(); + + // determine actual rendered bounds of symbol layer, and then buffer out a little to be safe + QRectF maximalBounds = renderedPicture->boundingRect(); + constexpr double BOUNDS_MARGIN = 0.05; + maximalBounds.adjust( -maximalBounds.width() * BOUNDS_MARGIN, -maximalBounds.height() * BOUNDS_MARGIN, maximalBounds.width() * BOUNDS_MARGIN, maximalBounds.height() * BOUNDS_MARGIN ); + + const bool hadClipping = context.painter()->hasClipping(); + const QPainterPath oldClipPath = hadClipping ? context.painter()->clipPath() : QPainterPath(); + + const bool isMasked = symbolLayer->installMasks( context, false, maximalBounds ); + + context.painter()->drawPicture( QPointF( 0, 0 ), *renderedPicture ); + + if ( isMasked ) + { + context.painter()->setClipPath( oldClipPath ); + context.painter()->setClipping( hadClipping ); + } + } } // step 4 - handle post processing steps diff --git a/src/core/symbology/qgssymbollayer.cpp b/src/core/symbology/qgssymbollayer.cpp index 11b41438678f..1f1b029e7a91 100644 --- a/src/core/symbology/qgssymbollayer.cpp +++ b/src/core/symbology/qgssymbollayer.cpp @@ -1005,7 +1005,7 @@ void QgsSymbolLayer::prepareMasks( const QgsSymbolRenderContext &context ) } } -bool QgsSymbolLayer::installMasks( QgsRenderContext &context, bool recursive ) +bool QgsSymbolLayer::installMasks( QgsRenderContext &context, bool recursive, const QRectF &rect ) { bool res = false; if ( !mClipPath.isEmpty() ) @@ -1014,6 +1014,37 @@ bool QgsSymbolLayer::installMasks( QgsRenderContext &context, bool recursive ) context.painter()->setClipPath( mClipPath, Qt::IntersectClip ); res = true; } + else if ( rect.isValid() ) + { + // find just the clip geometries within the area the symbol layer will be drawn over + const QVector clipGeometries = QgsSymbolLayerUtils::collectSymbolLayerClipGeometries( context, id(), rect ); + if ( !clipGeometries.empty() ) + { + QgsGeometry mergedGeom = QgsGeometry::unaryUnion( clipGeometries ); + if ( context.maskSettings().simplifyTolerance() > 0 ) + { + QgsGeos geos( mergedGeom.constGet() ); + mergedGeom = QgsGeometry( geos.simplify( context.maskSettings().simplifyTolerance() ) ); + } +#if GEOS_VERSION_MAJOR==3 && GEOS_VERSION_MINOR<10 + // structure would be better, but too old GEOS + mergedGeom = mergedGeom.makeValid( Qgis::MakeValidMethod::Linework ); +#else + mergedGeom = mergedGeom.makeValid( Qgis::MakeValidMethod::Structure ); +#endif + if ( !mergedGeom.isEmpty() ) + { + const QgsGeometry exterior = QgsGeometry::fromRect( + rect ); + const QgsGeometry maskGeom = exterior.difference( mergedGeom ); + if ( !maskGeom.isNull() ) + { + context.painter()->setClipPath( maskGeom.constGet()->asQPainterPath(), context.painter()->clipPath().isEmpty() ? Qt::ReplaceClip : Qt::IntersectClip ); + res = true; + } + } + } + } if ( QgsSymbol *lSubSymbol = recursive ? subSymbol() : nullptr ) { diff --git a/src/core/symbology/qgssymbollayer.h b/src/core/symbology/qgssymbollayer.h index 39ca75642175..fae4bf17cf59 100644 --- a/src/core/symbology/qgssymbollayer.h +++ b/src/core/symbology/qgssymbollayer.h @@ -653,6 +653,23 @@ class CORE_EXPORT QgsSymbolLayer */ QString id() const; + /** + * When rendering, install masks on \a context painter. + * + * If \a recursive is TRUE masks are installed recursively for all children symbol layers. + * + * Since QGIS 3.38 the \a rect argument can be used to specify a target bounds (in painter coordinates) + * for mask geometries. Only mask geometries which intersect ``rect`` will be installed. + * + * \returns TRUE if any masks were installed (since QGIS 3.38) + * + * \see prepareMasks() + * \see removeMasks() + * + * \since QGIS 3.30 + */ + bool installMasks( QgsRenderContext &context, bool recursive, const QRectF &rect = QRectF() ); + protected: /** @@ -707,18 +724,6 @@ class CORE_EXPORT QgsSymbolLayer */ void copyPaintEffect( QgsSymbolLayer *destLayer ) const; - /** - * When rendering, install masks on \a context painter - * if \a recursive is TRUE masks are installed recursively for all children symbol layers - * \see prepareMasks() - * \see removeMasks() - * - * \returns TRUE if any masks were installed (since QGIS 3.38) - * - * \since QGIS 3.30 - */ - bool installMasks( QgsRenderContext &context, bool recursive ); - /** * When rendering, remove previously installed masks from \a context painter * if \a recursive is TRUE masks are removed recursively for all children symbol layers From e7dbfd0b674a5a5a868a376244d247df2880455a Mon Sep 17 00:00:00 2001 From: Nyall Dawson Date: Wed, 19 Jun 2024 09:59:33 +1000 Subject: [PATCH 06/13] Add CanCalculateMaskGeometryPerFeature flag to "simple" symbol layers These are the symbol layer classes where there's no special logic required relating to feature rendering and features are rendered one-by-one, with no sub symbols. --- .../symbology/qgsellipsesymbollayer.sip.in | 2 ++ .../symbology/qgsfillsymbollayer.sip.in | 14 ++++++------- .../symbology/qgslinesymbollayer.sip.in | 6 ++++++ .../symbology/qgsmarkersymbollayer.sip.in | 11 +++++----- .../symbology/qgsellipsesymbollayer.sip.in | 2 ++ .../symbology/qgsfillsymbollayer.sip.in | 14 ++++++------- .../symbology/qgslinesymbollayer.sip.in | 6 ++++++ .../symbology/qgsmarkersymbollayer.sip.in | 11 +++++----- src/core/symbology/qgsellipsesymbollayer.cpp | 5 +++++ src/core/symbology/qgsellipsesymbollayer.h | 1 + src/core/symbology/qgsfillsymbollayer.cpp | 20 +++++++++++++++++++ src/core/symbology/qgsfillsymbollayer.h | 12 ++++------- .../symbology/qgsinterpolatedlinerenderer.cpp | 4 +++- src/core/symbology/qgslinesymbollayer.cpp | 15 ++++++++++++++ src/core/symbology/qgslinesymbollayer.h | 3 +++ src/core/symbology/qgsmarkersymbollayer.cpp | 20 +++++++++++++++++++ src/core/symbology/qgsmarkersymbollayer.h | 11 ++++------ 17 files changed, 117 insertions(+), 40 deletions(-) diff --git a/python/PyQt6/core/auto_generated/symbology/qgsellipsesymbollayer.sip.in b/python/PyQt6/core/auto_generated/symbology/qgsellipsesymbollayer.sip.in index 56fea467e556..a0db8f4ec749 100644 --- a/python/PyQt6/core/auto_generated/symbology/qgsellipsesymbollayer.sip.in +++ b/python/PyQt6/core/auto_generated/symbology/qgsellipsesymbollayer.sip.in @@ -67,6 +67,8 @@ Creates the symbol layer virtual QString layerType() const; + virtual Qgis::SymbolLayerFlags flags() const; + virtual void startRender( QgsSymbolRenderContext &context ); virtual void stopRender( QgsSymbolRenderContext &context ); diff --git a/python/PyQt6/core/auto_generated/symbology/qgsfillsymbollayer.sip.in b/python/PyQt6/core/auto_generated/symbology/qgsfillsymbollayer.sip.in index 910903ef95b9..0fb1ffc4aa7f 100644 --- a/python/PyQt6/core/auto_generated/symbology/qgsfillsymbollayer.sip.in +++ b/python/PyQt6/core/auto_generated/symbology/qgsfillsymbollayer.sip.in @@ -41,25 +41,20 @@ Caller takes ownership of the returned symbol layer. virtual QString layerType() const; + virtual Qgis::SymbolLayerFlags flags() const; virtual void startRender( QgsSymbolRenderContext &context ); - virtual void stopRender( QgsSymbolRenderContext &context ); - virtual void renderPolygon( const QPolygonF &points, const QVector *rings, QgsSymbolRenderContext &context ); - virtual QVariantMap properties() const; - virtual QgsSimpleFillSymbolLayer *clone() const /Factory/; - virtual void toSld( QDomDocument &doc, QDomElement &element, const QVariantMap &props ) const; - virtual QString ogrFeatureStyle( double mmScaleFactor, double mapUnitScaleFactor ) const; @@ -68,7 +63,6 @@ Caller takes ownership of the returned symbol layer. virtual QColor strokeColor() const; virtual void setStrokeColor( const QColor &strokeColor ); - virtual QColor fillColor() const; virtual void setFillColor( const QColor &color ); @@ -225,6 +219,8 @@ Caller takes ownership of the returned symbol layer. %End + virtual Qgis::SymbolLayerFlags flags() const; + virtual QString layerType() const; virtual void startRender( QgsSymbolRenderContext &context ); @@ -498,6 +494,8 @@ Caller takes ownership of the returned symbol layer. virtual QString layerType() const; + virtual Qgis::SymbolLayerFlags flags() const; + virtual void startRender( QgsSymbolRenderContext &context ); virtual void stopRender( QgsSymbolRenderContext &context ); @@ -915,6 +913,8 @@ Used internally when reading/writing symbols. virtual QString layerType() const; + virtual Qgis::SymbolLayerFlags flags() const; + virtual void renderPolygon( const QPolygonF &points, const QVector *rings, QgsSymbolRenderContext &context ); virtual void startRender( QgsSymbolRenderContext &context ); diff --git a/python/PyQt6/core/auto_generated/symbology/qgslinesymbollayer.sip.in b/python/PyQt6/core/auto_generated/symbology/qgslinesymbollayer.sip.in index 4e2230545a17..690bc7f84d33 100644 --- a/python/PyQt6/core/auto_generated/symbology/qgslinesymbollayer.sip.in +++ b/python/PyQt6/core/auto_generated/symbology/qgslinesymbollayer.sip.in @@ -48,6 +48,8 @@ Creates a new QgsSimpleLineSymbolLayer from an SLD XML DOM ``element``. virtual QString layerType() const; + virtual Qgis::SymbolLayerFlags flags() const; + virtual void startRender( QgsSymbolRenderContext &context ); virtual void stopRender( QgsSymbolRenderContext &context ); @@ -1358,6 +1360,8 @@ Set the line opacity. virtual QString layerType() const; + virtual Qgis::SymbolLayerFlags flags() const; + virtual void startRender( QgsSymbolRenderContext &context ); virtual void stopRender( QgsSymbolRenderContext &context ); @@ -1421,6 +1425,8 @@ serialized in the ``properties`` map (corresponding to the output from virtual QString layerType() const; + virtual Qgis::SymbolLayerFlags flags() const; + virtual void startRender( QgsSymbolRenderContext &context ); virtual void stopRender( QgsSymbolRenderContext &context ); diff --git a/python/PyQt6/core/auto_generated/symbology/qgsmarkersymbollayer.sip.in b/python/PyQt6/core/auto_generated/symbology/qgsmarkersymbollayer.sip.in index 4da6839f841e..9f21fb06eb29 100644 --- a/python/PyQt6/core/auto_generated/symbology/qgsmarkersymbollayer.sip.in +++ b/python/PyQt6/core/auto_generated/symbology/qgsmarkersymbollayer.sip.in @@ -214,6 +214,8 @@ Creates a new QgsSimpleMarkerSymbolLayer from an SLD XML element. virtual QString layerType() const; + virtual Qgis::SymbolLayerFlags flags() const; + virtual void startRender( QgsSymbolRenderContext &context ); virtual void renderPoint( QPointF point, QgsSymbolRenderContext &context ); @@ -562,24 +564,20 @@ Used internally when reading/writing symbols. virtual QString layerType() const; + virtual Qgis::SymbolLayerFlags flags() const; virtual void startRender( QgsSymbolRenderContext &context ); - virtual void stopRender( QgsSymbolRenderContext &context ); - virtual void renderPoint( QPointF point, QgsSymbolRenderContext &context ); - virtual QVariantMap properties() const; virtual bool usesMapUnits() const; - virtual QgsSvgMarkerSymbolLayer *clone() const /Factory/; - virtual void writeSldMarker( QDomDocument &doc, QDomElement &element, const QVariantMap &props ) const; @@ -773,6 +771,7 @@ Used internally when reading/writing symbols. virtual QString layerType() const; + virtual Qgis::SymbolLayerFlags flags() const; virtual void renderPoint( QPointF point, QgsSymbolRenderContext &context ); @@ -953,6 +952,8 @@ required fonts are not available on the system. virtual QString layerType() const; + virtual Qgis::SymbolLayerFlags flags() const; + virtual void startRender( QgsSymbolRenderContext &context ); diff --git a/python/core/auto_generated/symbology/qgsellipsesymbollayer.sip.in b/python/core/auto_generated/symbology/qgsellipsesymbollayer.sip.in index 9d3af4bcdf20..80f04eabbbb7 100644 --- a/python/core/auto_generated/symbology/qgsellipsesymbollayer.sip.in +++ b/python/core/auto_generated/symbology/qgsellipsesymbollayer.sip.in @@ -67,6 +67,8 @@ Creates the symbol layer virtual QString layerType() const; + virtual Qgis::SymbolLayerFlags flags() const; + virtual void startRender( QgsSymbolRenderContext &context ); virtual void stopRender( QgsSymbolRenderContext &context ); diff --git a/python/core/auto_generated/symbology/qgsfillsymbollayer.sip.in b/python/core/auto_generated/symbology/qgsfillsymbollayer.sip.in index 910903ef95b9..0fb1ffc4aa7f 100644 --- a/python/core/auto_generated/symbology/qgsfillsymbollayer.sip.in +++ b/python/core/auto_generated/symbology/qgsfillsymbollayer.sip.in @@ -41,25 +41,20 @@ Caller takes ownership of the returned symbol layer. virtual QString layerType() const; + virtual Qgis::SymbolLayerFlags flags() const; virtual void startRender( QgsSymbolRenderContext &context ); - virtual void stopRender( QgsSymbolRenderContext &context ); - virtual void renderPolygon( const QPolygonF &points, const QVector *rings, QgsSymbolRenderContext &context ); - virtual QVariantMap properties() const; - virtual QgsSimpleFillSymbolLayer *clone() const /Factory/; - virtual void toSld( QDomDocument &doc, QDomElement &element, const QVariantMap &props ) const; - virtual QString ogrFeatureStyle( double mmScaleFactor, double mapUnitScaleFactor ) const; @@ -68,7 +63,6 @@ Caller takes ownership of the returned symbol layer. virtual QColor strokeColor() const; virtual void setStrokeColor( const QColor &strokeColor ); - virtual QColor fillColor() const; virtual void setFillColor( const QColor &color ); @@ -225,6 +219,8 @@ Caller takes ownership of the returned symbol layer. %End + virtual Qgis::SymbolLayerFlags flags() const; + virtual QString layerType() const; virtual void startRender( QgsSymbolRenderContext &context ); @@ -498,6 +494,8 @@ Caller takes ownership of the returned symbol layer. virtual QString layerType() const; + virtual Qgis::SymbolLayerFlags flags() const; + virtual void startRender( QgsSymbolRenderContext &context ); virtual void stopRender( QgsSymbolRenderContext &context ); @@ -915,6 +913,8 @@ Used internally when reading/writing symbols. virtual QString layerType() const; + virtual Qgis::SymbolLayerFlags flags() const; + virtual void renderPolygon( const QPolygonF &points, const QVector *rings, QgsSymbolRenderContext &context ); virtual void startRender( QgsSymbolRenderContext &context ); diff --git a/python/core/auto_generated/symbology/qgslinesymbollayer.sip.in b/python/core/auto_generated/symbology/qgslinesymbollayer.sip.in index 4e2230545a17..690bc7f84d33 100644 --- a/python/core/auto_generated/symbology/qgslinesymbollayer.sip.in +++ b/python/core/auto_generated/symbology/qgslinesymbollayer.sip.in @@ -48,6 +48,8 @@ Creates a new QgsSimpleLineSymbolLayer from an SLD XML DOM ``element``. virtual QString layerType() const; + virtual Qgis::SymbolLayerFlags flags() const; + virtual void startRender( QgsSymbolRenderContext &context ); virtual void stopRender( QgsSymbolRenderContext &context ); @@ -1358,6 +1360,8 @@ Set the line opacity. virtual QString layerType() const; + virtual Qgis::SymbolLayerFlags flags() const; + virtual void startRender( QgsSymbolRenderContext &context ); virtual void stopRender( QgsSymbolRenderContext &context ); @@ -1421,6 +1425,8 @@ serialized in the ``properties`` map (corresponding to the output from virtual QString layerType() const; + virtual Qgis::SymbolLayerFlags flags() const; + virtual void startRender( QgsSymbolRenderContext &context ); virtual void stopRender( QgsSymbolRenderContext &context ); diff --git a/python/core/auto_generated/symbology/qgsmarkersymbollayer.sip.in b/python/core/auto_generated/symbology/qgsmarkersymbollayer.sip.in index 4da6839f841e..9f21fb06eb29 100644 --- a/python/core/auto_generated/symbology/qgsmarkersymbollayer.sip.in +++ b/python/core/auto_generated/symbology/qgsmarkersymbollayer.sip.in @@ -214,6 +214,8 @@ Creates a new QgsSimpleMarkerSymbolLayer from an SLD XML element. virtual QString layerType() const; + virtual Qgis::SymbolLayerFlags flags() const; + virtual void startRender( QgsSymbolRenderContext &context ); virtual void renderPoint( QPointF point, QgsSymbolRenderContext &context ); @@ -562,24 +564,20 @@ Used internally when reading/writing symbols. virtual QString layerType() const; + virtual Qgis::SymbolLayerFlags flags() const; virtual void startRender( QgsSymbolRenderContext &context ); - virtual void stopRender( QgsSymbolRenderContext &context ); - virtual void renderPoint( QPointF point, QgsSymbolRenderContext &context ); - virtual QVariantMap properties() const; virtual bool usesMapUnits() const; - virtual QgsSvgMarkerSymbolLayer *clone() const /Factory/; - virtual void writeSldMarker( QDomDocument &doc, QDomElement &element, const QVariantMap &props ) const; @@ -773,6 +771,7 @@ Used internally when reading/writing symbols. virtual QString layerType() const; + virtual Qgis::SymbolLayerFlags flags() const; virtual void renderPoint( QPointF point, QgsSymbolRenderContext &context ); @@ -953,6 +952,8 @@ required fonts are not available on the system. virtual QString layerType() const; + virtual Qgis::SymbolLayerFlags flags() const; + virtual void startRender( QgsSymbolRenderContext &context ); diff --git a/src/core/symbology/qgsellipsesymbollayer.cpp b/src/core/symbology/qgsellipsesymbollayer.cpp index 8a3149637a00..c9a8ea527d5d 100644 --- a/src/core/symbology/qgsellipsesymbollayer.cpp +++ b/src/core/symbology/qgsellipsesymbollayer.cpp @@ -348,6 +348,11 @@ QString QgsEllipseSymbolLayer::layerType() const return QStringLiteral( "EllipseMarker" ); } +Qgis::SymbolLayerFlags QgsEllipseSymbolLayer::flags() const +{ + return QgsMarkerSymbolLayer::flags() | Qgis::SymbolLayerFlag::CanCalculateMaskGeometryPerFeature; +} + void QgsEllipseSymbolLayer::startRender( QgsSymbolRenderContext &context ) { QgsMarkerSymbolLayer::startRender( context ); // get anchor point expressions diff --git a/src/core/symbology/qgsellipsesymbollayer.h b/src/core/symbology/qgsellipsesymbollayer.h index 97e96c86ec51..0f13045c2e32 100644 --- a/src/core/symbology/qgsellipsesymbollayer.h +++ b/src/core/symbology/qgsellipsesymbollayer.h @@ -72,6 +72,7 @@ class CORE_EXPORT QgsEllipseSymbolLayer: public QgsMarkerSymbolLayer void renderPoint( QPointF point, QgsSymbolRenderContext &context ) override; QString layerType() const override; + Qgis::SymbolLayerFlags flags() const override; void startRender( QgsSymbolRenderContext &context ) override; void stopRender( QgsSymbolRenderContext &context ) override; QgsEllipseSymbolLayer *clone() const override SIP_FACTORY; diff --git a/src/core/symbology/qgsfillsymbollayer.cpp b/src/core/symbology/qgsfillsymbollayer.cpp index 48accab3bcec..42a33ac76329 100644 --- a/src/core/symbology/qgsfillsymbollayer.cpp +++ b/src/core/symbology/qgsfillsymbollayer.cpp @@ -258,6 +258,11 @@ QString QgsSimpleFillSymbolLayer::layerType() const return QStringLiteral( "SimpleFill" ); } +Qgis::SymbolLayerFlags QgsSimpleFillSymbolLayer::flags() const +{ + return QgsFillSymbolLayer::flags() | Qgis::SymbolLayerFlag::CanCalculateMaskGeometryPerFeature; +} + void QgsSimpleFillSymbolLayer::startRender( QgsSymbolRenderContext &context ) { QColor fillColor = mColor; @@ -691,6 +696,11 @@ QgsSymbolLayer *QgsGradientFillSymbolLayer::create( const QVariantMap &props ) return sl.release(); } +Qgis::SymbolLayerFlags QgsGradientFillSymbolLayer::flags() const +{ + return QgsFillSymbolLayer::flags() | Qgis::SymbolLayerFlag::CanCalculateMaskGeometryPerFeature; +} + void QgsGradientFillSymbolLayer::setColorRamp( QgsColorRamp *ramp ) { delete mGradientRamp; @@ -1208,6 +1218,11 @@ QString QgsShapeburstFillSymbolLayer::layerType() const return QStringLiteral( "ShapeburstFill" ); } +Qgis::SymbolLayerFlags QgsShapeburstFillSymbolLayer::flags() const +{ + return QgsFillSymbolLayer::flags() | Qgis::SymbolLayerFlag::CanCalculateMaskGeometryPerFeature; +} + void QgsShapeburstFillSymbolLayer::setColorRamp( QgsColorRamp *ramp ) { if ( mGradientRamp.get() == ramp ) @@ -5208,6 +5223,11 @@ QString QgsRasterFillSymbolLayer::layerType() const return QStringLiteral( "RasterFill" ); } +Qgis::SymbolLayerFlags QgsRasterFillSymbolLayer::flags() const +{ + return QgsImageFillSymbolLayer::flags() | Qgis::SymbolLayerFlag::CanCalculateMaskGeometryPerFeature; +} + void QgsRasterFillSymbolLayer::renderPolygon( const QPolygonF &points, const QVector *rings, QgsSymbolRenderContext &context ) { QPainter *p = context.renderContext().painter(); diff --git a/src/core/symbology/qgsfillsymbollayer.h b/src/core/symbology/qgsfillsymbollayer.h index 5dc3a697c2da..af32b7877a6f 100644 --- a/src/core/symbology/qgsfillsymbollayer.h +++ b/src/core/symbology/qgsfillsymbollayer.h @@ -66,19 +66,13 @@ class CORE_EXPORT QgsSimpleFillSymbolLayer : public QgsFillSymbolLayer // implemented from base classes QString layerType() const override; - + Qgis::SymbolLayerFlags flags() const override; void startRender( QgsSymbolRenderContext &context ) override; - void stopRender( QgsSymbolRenderContext &context ) override; - void renderPolygon( const QPolygonF &points, const QVector *rings, QgsSymbolRenderContext &context ) override; - QVariantMap properties() const override; - QgsSimpleFillSymbolLayer *clone() const override SIP_FACTORY; - void toSld( QDomDocument &doc, QDomElement &element, const QVariantMap &props ) const override; - QString ogrFeatureStyle( double mmScaleFactor, double mapUnitScaleFactor ) const override; Qt::BrushStyle brushStyle() const { return mBrushStyle; } @@ -86,7 +80,6 @@ class CORE_EXPORT QgsSimpleFillSymbolLayer : public QgsFillSymbolLayer QColor strokeColor() const override { return mStrokeColor; } void setStrokeColor( const QColor &strokeColor ) override { mStrokeColor = strokeColor; } - QColor fillColor() const override { return color(); } void setFillColor( const QColor &color ) override { setColor( color ); } @@ -238,6 +231,7 @@ class CORE_EXPORT QgsGradientFillSymbolLayer : public QgsFillSymbolLayer // implemented from base classes + Qgis::SymbolLayerFlags flags() const override; QString layerType() const override; void startRender( QgsSymbolRenderContext &context ) override; void stopRender( QgsSymbolRenderContext &context ) override; @@ -522,6 +516,7 @@ class CORE_EXPORT QgsShapeburstFillSymbolLayer : public QgsFillSymbolLayer // implemented from base classes QString layerType() const override; + Qgis::SymbolLayerFlags flags() const override; void startRender( QgsSymbolRenderContext &context ) override; void stopRender( QgsSymbolRenderContext &context ) override; void renderPolygon( const QPolygonF &points, const QVector *rings, QgsSymbolRenderContext &context ) override; @@ -888,6 +883,7 @@ class CORE_EXPORT QgsRasterFillSymbolLayer: public QgsImageFillSymbolLayer // implemented from base classes QString layerType() const override; + Qgis::SymbolLayerFlags flags() const override; void renderPolygon( const QPolygonF &points, const QVector *rings, QgsSymbolRenderContext &context ) override; void startRender( QgsSymbolRenderContext &context ) override; void stopRender( QgsSymbolRenderContext &context ) override; diff --git a/src/core/symbology/qgsinterpolatedlinerenderer.cpp b/src/core/symbology/qgsinterpolatedlinerenderer.cpp index 3a0a9bcb466a..945603deca65 100644 --- a/src/core/symbology/qgsinterpolatedlinerenderer.cpp +++ b/src/core/symbology/qgsinterpolatedlinerenderer.cpp @@ -868,7 +868,9 @@ QgsSymbolLayer *QgsInterpolatedLineSymbolLayer::create( const QVariantMap &prope Qgis::SymbolLayerFlags QgsInterpolatedLineSymbolLayer::flags() const { - return Qgis::SymbolLayerFlag::DisableFeatureClipping; + return QgsLineSymbolLayer::flags() + | Qgis::SymbolLayerFlag::DisableFeatureClipping + | Qgis::SymbolLayerFlag::CanCalculateMaskGeometryPerFeature; } QVariantMap QgsInterpolatedLineSymbolLayer::properties() const diff --git a/src/core/symbology/qgslinesymbollayer.cpp b/src/core/symbology/qgslinesymbollayer.cpp index 83b478293f5f..a37abf36e880 100644 --- a/src/core/symbology/qgslinesymbollayer.cpp +++ b/src/core/symbology/qgslinesymbollayer.cpp @@ -231,6 +231,11 @@ QString QgsSimpleLineSymbolLayer::layerType() const return QStringLiteral( "SimpleLine" ); } +Qgis::SymbolLayerFlags QgsSimpleLineSymbolLayer::flags() const +{ + return QgsLineSymbolLayer::flags() | Qgis::SymbolLayerFlag::CanCalculateMaskGeometryPerFeature; +} + void QgsSimpleLineSymbolLayer::startRender( QgsSymbolRenderContext &context ) { QColor penColor = mColor; @@ -3438,6 +3443,11 @@ QString QgsRasterLineSymbolLayer::layerType() const return QStringLiteral( "RasterLine" ); } +Qgis::SymbolLayerFlags QgsRasterLineSymbolLayer::flags() const +{ + return QgsAbstractBrushedLineSymbolLayer::flags() | Qgis::SymbolLayerFlag::CanCalculateMaskGeometryPerFeature; +} + void QgsRasterLineSymbolLayer::startRender( QgsSymbolRenderContext &context ) { double scaledHeight = context.renderContext().convertToPainterUnits( mWidth, mWidthUnit, mWidthMapUnitScale ); @@ -3683,6 +3693,11 @@ QString QgsLineburstSymbolLayer::layerType() const return QStringLiteral( "Lineburst" ); } +Qgis::SymbolLayerFlags QgsLineburstSymbolLayer::flags() const +{ + return QgsAbstractBrushedLineSymbolLayer::flags() | Qgis::SymbolLayerFlag::CanCalculateMaskGeometryPerFeature; +} + void QgsLineburstSymbolLayer::startRender( QgsSymbolRenderContext & ) { } diff --git a/src/core/symbology/qgslinesymbollayer.h b/src/core/symbology/qgslinesymbollayer.h index 7ed31618cf61..8f1189c88bc9 100644 --- a/src/core/symbology/qgslinesymbollayer.h +++ b/src/core/symbology/qgslinesymbollayer.h @@ -71,6 +71,7 @@ class CORE_EXPORT QgsSimpleLineSymbolLayer : public QgsLineSymbolLayer static QgsSymbolLayer *createFromSld( QDomElement &element ) SIP_FACTORY; QString layerType() const override; + Qgis::SymbolLayerFlags flags() const override; void startRender( QgsSymbolRenderContext &context ) override; void stopRender( QgsSymbolRenderContext &context ) override; void renderPolyline( const QPolygonF &points, QgsSymbolRenderContext &context ) override; @@ -1249,6 +1250,7 @@ class CORE_EXPORT QgsRasterLineSymbolLayer : public QgsAbstractBrushedLineSymbol void setOpacity( double opacity ) { mOpacity = opacity; } QString layerType() const override; + Qgis::SymbolLayerFlags flags() const override; void startRender( QgsSymbolRenderContext &context ) override; void stopRender( QgsSymbolRenderContext &context ) override; void renderPolyline( const QPolygonF &points, QgsSymbolRenderContext &context ) override; @@ -1300,6 +1302,7 @@ class CORE_EXPORT QgsLineburstSymbolLayer : public QgsAbstractBrushedLineSymbolL static QgsSymbolLayer *create( const QVariantMap &properties = QVariantMap() ) SIP_FACTORY; QString layerType() const override; + Qgis::SymbolLayerFlags flags() const override; void startRender( QgsSymbolRenderContext &context ) override; void stopRender( QgsSymbolRenderContext &context ) override; void renderPolyline( const QPolygonF &points, QgsSymbolRenderContext &context ) override; diff --git a/src/core/symbology/qgsmarkersymbollayer.cpp b/src/core/symbology/qgsmarkersymbollayer.cpp index 19801e4cb02d..b11f3d896ad7 100644 --- a/src/core/symbology/qgsmarkersymbollayer.cpp +++ b/src/core/symbology/qgsmarkersymbollayer.cpp @@ -1089,6 +1089,11 @@ QString QgsSimpleMarkerSymbolLayer::layerType() const return QStringLiteral( "SimpleMarker" ); } +Qgis::SymbolLayerFlags QgsSimpleMarkerSymbolLayer::flags() const +{ + return QgsSimpleMarkerSymbolLayerBase::flags() | Qgis::SymbolLayerFlag::CanCalculateMaskGeometryPerFeature; +} + void QgsSimpleMarkerSymbolLayer::startRender( QgsSymbolRenderContext &context ) { QgsSimpleMarkerSymbolLayerBase::startRender( context ); @@ -2313,6 +2318,11 @@ QString QgsSvgMarkerSymbolLayer::layerType() const return QStringLiteral( "SvgMarker" ); } +Qgis::SymbolLayerFlags QgsSvgMarkerSymbolLayer::flags() const +{ + return QgsMarkerSymbolLayer::flags() | Qgis::SymbolLayerFlag::CanCalculateMaskGeometryPerFeature; +} + void QgsSvgMarkerSymbolLayer::startRender( QgsSymbolRenderContext &context ) { QgsMarkerSymbolLayer::startRender( context ); // get anchor point expressions @@ -3137,6 +3147,11 @@ QString QgsRasterMarkerSymbolLayer::layerType() const return QStringLiteral( "RasterMarker" ); } +Qgis::SymbolLayerFlags QgsRasterMarkerSymbolLayer::flags() const +{ + return QgsMarkerSymbolLayer::flags() | Qgis::SymbolLayerFlag::CanCalculateMaskGeometryPerFeature; +} + void QgsRasterMarkerSymbolLayer::renderPoint( QPointF point, QgsSymbolRenderContext &context ) { QPainter *p = context.renderContext().painter(); @@ -3535,6 +3550,11 @@ QString QgsFontMarkerSymbolLayer::layerType() const return QStringLiteral( "FontMarker" ); } +Qgis::SymbolLayerFlags QgsFontMarkerSymbolLayer::flags() const +{ + return QgsMarkerSymbolLayer::flags() | Qgis::SymbolLayerFlag::CanCalculateMaskGeometryPerFeature; +} + void QgsFontMarkerSymbolLayer::startRender( QgsSymbolRenderContext &context ) { QColor brushColor = mColor; diff --git a/src/core/symbology/qgsmarkersymbollayer.h b/src/core/symbology/qgsmarkersymbollayer.h index 38fabd2385e3..b07ec4c29003 100644 --- a/src/core/symbology/qgsmarkersymbollayer.h +++ b/src/core/symbology/qgsmarkersymbollayer.h @@ -215,6 +215,7 @@ class CORE_EXPORT QgsSimpleMarkerSymbolLayer : public QgsSimpleMarkerSymbolLayer // reimplemented from base classes QString layerType() const override; + Qgis::SymbolLayerFlags flags() const override; void startRender( QgsSymbolRenderContext &context ) override; void renderPoint( QPointF point, QgsSymbolRenderContext &context ) override; QVariantMap properties() const override; @@ -513,18 +514,13 @@ class CORE_EXPORT QgsSvgMarkerSymbolLayer : public QgsMarkerSymbolLayer // implemented from base classes QString layerType() const override; - + Qgis::SymbolLayerFlags flags() const override; void startRender( QgsSymbolRenderContext &context ) override; - void stopRender( QgsSymbolRenderContext &context ) override; - void renderPoint( QPointF point, QgsSymbolRenderContext &context ) override; - QVariantMap properties() const override; bool usesMapUnits() const override; - QgsSvgMarkerSymbolLayer *clone() const override SIP_FACTORY; - void writeSldMarker( QDomDocument &doc, QDomElement &element, const QVariantMap &props ) const override; /** @@ -705,7 +701,7 @@ class CORE_EXPORT QgsRasterMarkerSymbolLayer : public QgsMarkerSymbolLayer // implemented from base classes QString layerType() const override; - + Qgis::SymbolLayerFlags flags() const override; void renderPoint( QPointF point, QgsSymbolRenderContext &context ) override; QVariantMap properties() const override; QgsRasterMarkerSymbolLayer *clone() const override SIP_FACTORY; @@ -885,6 +881,7 @@ class CORE_EXPORT QgsFontMarkerSymbolLayer : public QgsMarkerSymbolLayer // implemented from base classes QString layerType() const override; + Qgis::SymbolLayerFlags flags() const override; void startRender( QgsSymbolRenderContext &context ) override; From ef57813647c3e13af440e7e9661c7ee0334c68a5 Mon Sep 17 00:00:00 2001 From: Nyall Dawson Date: Thu, 20 Jun 2024 11:09:50 +1000 Subject: [PATCH 07/13] Add optional flag to force global ("entire map") clipping paths This is a new opt-in flag for map settings/render context/layouts. If set, then when applying clipping paths for selective masking, we always use global ("entire map") paths, instead of calculating local clipping paths per rendered feature. This results in considerably more complex vector exports in all current Qt versions, but gives us a way to force this IF/when a future Qt version adds optimisations which make global masks desirable. --- python/PyQt6/core/auto_additions/qgis.py | 10 ++++++++-- .../core/auto_additions/qgslayoutrendercontext.py | 1 + .../layout/qgslayoutrendercontext.sip.in | 3 ++- python/PyQt6/core/auto_generated/qgis.sip.in | 2 ++ python/core/auto_additions/qgis.py | 10 ++++++++-- .../layout/qgslayoutrendercontext.sip.in | 3 ++- python/core/auto_generated/qgis.sip.in | 2 ++ src/core/layout/qgslayoutitemmap.cpp | 1 + src/core/layout/qgslayoutrendercontext.h | 3 ++- src/core/qgis.h | 2 ++ src/core/qgsrendercontext.cpp | 1 + src/core/symbology/qgssymbol.cpp | 5 ++++- 12 files changed, 35 insertions(+), 8 deletions(-) diff --git a/python/PyQt6/core/auto_additions/qgis.py b/python/PyQt6/core/auto_additions/qgis.py index 023dc3dc748c..e0664376b6da 100644 --- a/python/PyQt6/core/auto_additions/qgis.py +++ b/python/PyQt6/core/auto_additions/qgis.py @@ -2309,7 +2309,10 @@ QgsMapSettings.RecordProfile = Qgis.MapSettingsFlag.RecordProfile QgsMapSettings.RecordProfile.is_monkey_patched = True QgsMapSettings.RecordProfile.__doc__ = "Enable run-time profiling while rendering (since QGIS 3.34)" -Qgis.MapSettingsFlag.__doc__ = "Flags which adjust the way maps are rendered.\n\n.. versionadded:: 3.22\n\n" + '* ``Antialiasing``: ' + Qgis.MapSettingsFlag.Antialiasing.__doc__ + '\n' + '* ``DrawEditingInfo``: ' + Qgis.MapSettingsFlag.DrawEditingInfo.__doc__ + '\n' + '* ``ForceVectorOutput``: ' + Qgis.MapSettingsFlag.ForceVectorOutput.__doc__ + '\n' + '* ``UseAdvancedEffects``: ' + Qgis.MapSettingsFlag.UseAdvancedEffects.__doc__ + '\n' + '* ``DrawLabeling``: ' + Qgis.MapSettingsFlag.DrawLabeling.__doc__ + '\n' + '* ``UseRenderingOptimization``: ' + Qgis.MapSettingsFlag.UseRenderingOptimization.__doc__ + '\n' + '* ``DrawSelection``: ' + Qgis.MapSettingsFlag.DrawSelection.__doc__ + '\n' + '* ``DrawSymbolBounds``: ' + Qgis.MapSettingsFlag.DrawSymbolBounds.__doc__ + '\n' + '* ``RenderMapTile``: ' + Qgis.MapSettingsFlag.RenderMapTile.__doc__ + '\n' + '* ``RenderPartialOutput``: ' + Qgis.MapSettingsFlag.RenderPartialOutput.__doc__ + '\n' + '* ``RenderPreviewJob``: ' + Qgis.MapSettingsFlag.RenderPreviewJob.__doc__ + '\n' + '* ``RenderBlocking``: ' + Qgis.MapSettingsFlag.RenderBlocking.__doc__ + '\n' + '* ``LosslessImageRendering``: ' + Qgis.MapSettingsFlag.LosslessImageRendering.__doc__ + '\n' + '* ``Render3DMap``: ' + Qgis.MapSettingsFlag.Render3DMap.__doc__ + '\n' + '* ``HighQualityImageTransforms``: ' + Qgis.MapSettingsFlag.HighQualityImageTransforms.__doc__ + '\n' + '* ``SkipSymbolRendering``: ' + Qgis.MapSettingsFlag.SkipSymbolRendering.__doc__ + '\n' + '* ``ForceRasterMasks``: ' + Qgis.MapSettingsFlag.ForceRasterMasks.__doc__ + '\n' + '* ``RecordProfile``: ' + Qgis.MapSettingsFlag.RecordProfile.__doc__ +QgsMapSettings.AlwaysUseGlobalMasks = Qgis.MapSettingsFlag.AlwaysUseGlobalMasks +QgsMapSettings.AlwaysUseGlobalMasks.is_monkey_patched = True +QgsMapSettings.AlwaysUseGlobalMasks.__doc__ = "When applying clipping paths for selective masking, always use global (\"entire map\") paths, instead of calculating local clipping paths per rendered feature. This results in considerably more complex vector exports in all current Qt versions. This flag only applies to vector map exports. (Since QGIS 3.38)" +Qgis.MapSettingsFlag.__doc__ = "Flags which adjust the way maps are rendered.\n\n.. versionadded:: 3.22\n\n" + '* ``Antialiasing``: ' + Qgis.MapSettingsFlag.Antialiasing.__doc__ + '\n' + '* ``DrawEditingInfo``: ' + Qgis.MapSettingsFlag.DrawEditingInfo.__doc__ + '\n' + '* ``ForceVectorOutput``: ' + Qgis.MapSettingsFlag.ForceVectorOutput.__doc__ + '\n' + '* ``UseAdvancedEffects``: ' + Qgis.MapSettingsFlag.UseAdvancedEffects.__doc__ + '\n' + '* ``DrawLabeling``: ' + Qgis.MapSettingsFlag.DrawLabeling.__doc__ + '\n' + '* ``UseRenderingOptimization``: ' + Qgis.MapSettingsFlag.UseRenderingOptimization.__doc__ + '\n' + '* ``DrawSelection``: ' + Qgis.MapSettingsFlag.DrawSelection.__doc__ + '\n' + '* ``DrawSymbolBounds``: ' + Qgis.MapSettingsFlag.DrawSymbolBounds.__doc__ + '\n' + '* ``RenderMapTile``: ' + Qgis.MapSettingsFlag.RenderMapTile.__doc__ + '\n' + '* ``RenderPartialOutput``: ' + Qgis.MapSettingsFlag.RenderPartialOutput.__doc__ + '\n' + '* ``RenderPreviewJob``: ' + Qgis.MapSettingsFlag.RenderPreviewJob.__doc__ + '\n' + '* ``RenderBlocking``: ' + Qgis.MapSettingsFlag.RenderBlocking.__doc__ + '\n' + '* ``LosslessImageRendering``: ' + Qgis.MapSettingsFlag.LosslessImageRendering.__doc__ + '\n' + '* ``Render3DMap``: ' + Qgis.MapSettingsFlag.Render3DMap.__doc__ + '\n' + '* ``HighQualityImageTransforms``: ' + Qgis.MapSettingsFlag.HighQualityImageTransforms.__doc__ + '\n' + '* ``SkipSymbolRendering``: ' + Qgis.MapSettingsFlag.SkipSymbolRendering.__doc__ + '\n' + '* ``ForceRasterMasks``: ' + Qgis.MapSettingsFlag.ForceRasterMasks.__doc__ + '\n' + '* ``RecordProfile``: ' + Qgis.MapSettingsFlag.RecordProfile.__doc__ + '\n' + '* ``AlwaysUseGlobalMasks``: ' + Qgis.MapSettingsFlag.AlwaysUseGlobalMasks.__doc__ # -- Qgis.MapSettingsFlags = lambda flags=0: Qgis.MapSettingsFlag(flags) QgsMapSettings.Flags = Qgis.MapSettingsFlags @@ -2378,7 +2381,10 @@ QgsRenderContext.RecordProfile = Qgis.RenderContextFlag.RecordProfile QgsRenderContext.RecordProfile.is_monkey_patched = True QgsRenderContext.RecordProfile.__doc__ = "Enable run-time profiling while rendering (since QGIS 3.34)" -Qgis.RenderContextFlag.__doc__ = "Flags which affect rendering operations.\n\n.. versionadded:: 3.22\n\n" + '* ``DrawEditingInfo``: ' + Qgis.RenderContextFlag.DrawEditingInfo.__doc__ + '\n' + '* ``ForceVectorOutput``: ' + Qgis.RenderContextFlag.ForceVectorOutput.__doc__ + '\n' + '* ``UseAdvancedEffects``: ' + Qgis.RenderContextFlag.UseAdvancedEffects.__doc__ + '\n' + '* ``UseRenderingOptimization``: ' + Qgis.RenderContextFlag.UseRenderingOptimization.__doc__ + '\n' + '* ``DrawSelection``: ' + Qgis.RenderContextFlag.DrawSelection.__doc__ + '\n' + '* ``DrawSymbolBounds``: ' + Qgis.RenderContextFlag.DrawSymbolBounds.__doc__ + '\n' + '* ``RenderMapTile``: ' + Qgis.RenderContextFlag.RenderMapTile.__doc__ + '\n' + '* ``Antialiasing``: ' + Qgis.RenderContextFlag.Antialiasing.__doc__ + '\n' + '* ``RenderPartialOutput``: ' + Qgis.RenderContextFlag.RenderPartialOutput.__doc__ + '\n' + '* ``RenderPreviewJob``: ' + Qgis.RenderContextFlag.RenderPreviewJob.__doc__ + '\n' + '* ``RenderBlocking``: ' + Qgis.RenderContextFlag.RenderBlocking.__doc__ + '\n' + '* ``RenderSymbolPreview``: ' + Qgis.RenderContextFlag.RenderSymbolPreview.__doc__ + '\n' + '* ``LosslessImageRendering``: ' + Qgis.RenderContextFlag.LosslessImageRendering.__doc__ + '\n' + '* ``ApplyScalingWorkaroundForTextRendering``: ' + Qgis.RenderContextFlag.ApplyScalingWorkaroundForTextRendering.__doc__ + '\n' + '* ``Render3DMap``: ' + Qgis.RenderContextFlag.Render3DMap.__doc__ + '\n' + '* ``ApplyClipAfterReprojection``: ' + Qgis.RenderContextFlag.ApplyClipAfterReprojection.__doc__ + '\n' + '* ``RenderingSubSymbol``: ' + Qgis.RenderContextFlag.RenderingSubSymbol.__doc__ + '\n' + '* ``HighQualityImageTransforms``: ' + Qgis.RenderContextFlag.HighQualityImageTransforms.__doc__ + '\n' + '* ``SkipSymbolRendering``: ' + Qgis.RenderContextFlag.SkipSymbolRendering.__doc__ + '\n' + '* ``RecordProfile``: ' + Qgis.RenderContextFlag.RecordProfile.__doc__ +QgsRenderContext.AlwaysUseGlobalMasks = Qgis.RenderContextFlag.AlwaysUseGlobalMasks +QgsRenderContext.AlwaysUseGlobalMasks.is_monkey_patched = True +QgsRenderContext.AlwaysUseGlobalMasks.__doc__ = "When applying clipping paths for selective masking, always use global (\"entire map\") paths, instead of calculating local clipping paths per rendered feature. This results in considerably more complex vector exports in all current Qt versions. This flag only applies to vector map exports. (Since QGIS 3.38)" +Qgis.RenderContextFlag.__doc__ = "Flags which affect rendering operations.\n\n.. versionadded:: 3.22\n\n" + '* ``DrawEditingInfo``: ' + Qgis.RenderContextFlag.DrawEditingInfo.__doc__ + '\n' + '* ``ForceVectorOutput``: ' + Qgis.RenderContextFlag.ForceVectorOutput.__doc__ + '\n' + '* ``UseAdvancedEffects``: ' + Qgis.RenderContextFlag.UseAdvancedEffects.__doc__ + '\n' + '* ``UseRenderingOptimization``: ' + Qgis.RenderContextFlag.UseRenderingOptimization.__doc__ + '\n' + '* ``DrawSelection``: ' + Qgis.RenderContextFlag.DrawSelection.__doc__ + '\n' + '* ``DrawSymbolBounds``: ' + Qgis.RenderContextFlag.DrawSymbolBounds.__doc__ + '\n' + '* ``RenderMapTile``: ' + Qgis.RenderContextFlag.RenderMapTile.__doc__ + '\n' + '* ``Antialiasing``: ' + Qgis.RenderContextFlag.Antialiasing.__doc__ + '\n' + '* ``RenderPartialOutput``: ' + Qgis.RenderContextFlag.RenderPartialOutput.__doc__ + '\n' + '* ``RenderPreviewJob``: ' + Qgis.RenderContextFlag.RenderPreviewJob.__doc__ + '\n' + '* ``RenderBlocking``: ' + Qgis.RenderContextFlag.RenderBlocking.__doc__ + '\n' + '* ``RenderSymbolPreview``: ' + Qgis.RenderContextFlag.RenderSymbolPreview.__doc__ + '\n' + '* ``LosslessImageRendering``: ' + Qgis.RenderContextFlag.LosslessImageRendering.__doc__ + '\n' + '* ``ApplyScalingWorkaroundForTextRendering``: ' + Qgis.RenderContextFlag.ApplyScalingWorkaroundForTextRendering.__doc__ + '\n' + '* ``Render3DMap``: ' + Qgis.RenderContextFlag.Render3DMap.__doc__ + '\n' + '* ``ApplyClipAfterReprojection``: ' + Qgis.RenderContextFlag.ApplyClipAfterReprojection.__doc__ + '\n' + '* ``RenderingSubSymbol``: ' + Qgis.RenderContextFlag.RenderingSubSymbol.__doc__ + '\n' + '* ``HighQualityImageTransforms``: ' + Qgis.RenderContextFlag.HighQualityImageTransforms.__doc__ + '\n' + '* ``SkipSymbolRendering``: ' + Qgis.RenderContextFlag.SkipSymbolRendering.__doc__ + '\n' + '* ``RecordProfile``: ' + Qgis.RenderContextFlag.RecordProfile.__doc__ + '\n' + '* ``AlwaysUseGlobalMasks``: ' + Qgis.RenderContextFlag.AlwaysUseGlobalMasks.__doc__ # -- Qgis.RenderContextFlags = lambda flags=0: Qgis.RenderContextFlag(flags) QgsRenderContext.Flags = Qgis.RenderContextFlags diff --git a/python/PyQt6/core/auto_additions/qgslayoutrendercontext.py b/python/PyQt6/core/auto_additions/qgslayoutrendercontext.py index abd5decf0c9e..443b50e6d12c 100644 --- a/python/PyQt6/core/auto_additions/qgslayoutrendercontext.py +++ b/python/PyQt6/core/auto_additions/qgslayoutrendercontext.py @@ -10,4 +10,5 @@ QgsLayoutRenderContext.FlagRenderLabelsByMapLayer = QgsLayoutRenderContext.Flag.FlagRenderLabelsByMapLayer QgsLayoutRenderContext.FlagLosslessImageRendering = QgsLayoutRenderContext.Flag.FlagLosslessImageRendering QgsLayoutRenderContext.FlagSynchronousLegendGraphics = QgsLayoutRenderContext.Flag.FlagSynchronousLegendGraphics +QgsLayoutRenderContext.FlagAlwaysUseGlobalMasks = QgsLayoutRenderContext.Flag.FlagAlwaysUseGlobalMasks QgsLayoutRenderContext.Flags = lambda flags=0: QgsLayoutRenderContext.Flag(flags) diff --git a/python/PyQt6/core/auto_generated/layout/qgslayoutrendercontext.sip.in b/python/PyQt6/core/auto_generated/layout/qgslayoutrendercontext.sip.in index 8fcc1222baff..dea066d7c48a 100644 --- a/python/PyQt6/core/auto_generated/layout/qgslayoutrendercontext.sip.in +++ b/python/PyQt6/core/auto_generated/layout/qgslayoutrendercontext.sip.in @@ -31,7 +31,8 @@ Stores information relating to the current rendering settings for a layout. FlagDisableTiledRasterLayerRenders, FlagRenderLabelsByMapLayer, FlagLosslessImageRendering, - FlagSynchronousLegendGraphics + FlagSynchronousLegendGraphics, + FlagAlwaysUseGlobalMasks, }; typedef QFlags Flags; diff --git a/python/PyQt6/core/auto_generated/qgis.sip.in b/python/PyQt6/core/auto_generated/qgis.sip.in index e1ee8e809a9b..3aea91910c7f 100644 --- a/python/PyQt6/core/auto_generated/qgis.sip.in +++ b/python/PyQt6/core/auto_generated/qgis.sip.in @@ -1361,6 +1361,7 @@ The development version SkipSymbolRendering, ForceRasterMasks, RecordProfile, + AlwaysUseGlobalMasks, }; typedef QFlags MapSettingsFlags; @@ -1387,6 +1388,7 @@ The development version HighQualityImageTransforms, SkipSymbolRendering, RecordProfile, + AlwaysUseGlobalMasks, }; typedef QFlags RenderContextFlags; diff --git a/python/core/auto_additions/qgis.py b/python/core/auto_additions/qgis.py index d0e7e1474a6b..0d3e413e94b3 100644 --- a/python/core/auto_additions/qgis.py +++ b/python/core/auto_additions/qgis.py @@ -2267,7 +2267,10 @@ QgsMapSettings.RecordProfile = Qgis.MapSettingsFlag.RecordProfile QgsMapSettings.RecordProfile.is_monkey_patched = True QgsMapSettings.RecordProfile.__doc__ = "Enable run-time profiling while rendering (since QGIS 3.34)" -Qgis.MapSettingsFlag.__doc__ = "Flags which adjust the way maps are rendered.\n\n.. versionadded:: 3.22\n\n" + '* ``Antialiasing``: ' + Qgis.MapSettingsFlag.Antialiasing.__doc__ + '\n' + '* ``DrawEditingInfo``: ' + Qgis.MapSettingsFlag.DrawEditingInfo.__doc__ + '\n' + '* ``ForceVectorOutput``: ' + Qgis.MapSettingsFlag.ForceVectorOutput.__doc__ + '\n' + '* ``UseAdvancedEffects``: ' + Qgis.MapSettingsFlag.UseAdvancedEffects.__doc__ + '\n' + '* ``DrawLabeling``: ' + Qgis.MapSettingsFlag.DrawLabeling.__doc__ + '\n' + '* ``UseRenderingOptimization``: ' + Qgis.MapSettingsFlag.UseRenderingOptimization.__doc__ + '\n' + '* ``DrawSelection``: ' + Qgis.MapSettingsFlag.DrawSelection.__doc__ + '\n' + '* ``DrawSymbolBounds``: ' + Qgis.MapSettingsFlag.DrawSymbolBounds.__doc__ + '\n' + '* ``RenderMapTile``: ' + Qgis.MapSettingsFlag.RenderMapTile.__doc__ + '\n' + '* ``RenderPartialOutput``: ' + Qgis.MapSettingsFlag.RenderPartialOutput.__doc__ + '\n' + '* ``RenderPreviewJob``: ' + Qgis.MapSettingsFlag.RenderPreviewJob.__doc__ + '\n' + '* ``RenderBlocking``: ' + Qgis.MapSettingsFlag.RenderBlocking.__doc__ + '\n' + '* ``LosslessImageRendering``: ' + Qgis.MapSettingsFlag.LosslessImageRendering.__doc__ + '\n' + '* ``Render3DMap``: ' + Qgis.MapSettingsFlag.Render3DMap.__doc__ + '\n' + '* ``HighQualityImageTransforms``: ' + Qgis.MapSettingsFlag.HighQualityImageTransforms.__doc__ + '\n' + '* ``SkipSymbolRendering``: ' + Qgis.MapSettingsFlag.SkipSymbolRendering.__doc__ + '\n' + '* ``ForceRasterMasks``: ' + Qgis.MapSettingsFlag.ForceRasterMasks.__doc__ + '\n' + '* ``RecordProfile``: ' + Qgis.MapSettingsFlag.RecordProfile.__doc__ +QgsMapSettings.AlwaysUseGlobalMasks = Qgis.MapSettingsFlag.AlwaysUseGlobalMasks +QgsMapSettings.AlwaysUseGlobalMasks.is_monkey_patched = True +QgsMapSettings.AlwaysUseGlobalMasks.__doc__ = "When applying clipping paths for selective masking, always use global (\"entire map\") paths, instead of calculating local clipping paths per rendered feature. This results in considerably more complex vector exports in all current Qt versions. This flag only applies to vector map exports. (Since QGIS 3.38)" +Qgis.MapSettingsFlag.__doc__ = "Flags which adjust the way maps are rendered.\n\n.. versionadded:: 3.22\n\n" + '* ``Antialiasing``: ' + Qgis.MapSettingsFlag.Antialiasing.__doc__ + '\n' + '* ``DrawEditingInfo``: ' + Qgis.MapSettingsFlag.DrawEditingInfo.__doc__ + '\n' + '* ``ForceVectorOutput``: ' + Qgis.MapSettingsFlag.ForceVectorOutput.__doc__ + '\n' + '* ``UseAdvancedEffects``: ' + Qgis.MapSettingsFlag.UseAdvancedEffects.__doc__ + '\n' + '* ``DrawLabeling``: ' + Qgis.MapSettingsFlag.DrawLabeling.__doc__ + '\n' + '* ``UseRenderingOptimization``: ' + Qgis.MapSettingsFlag.UseRenderingOptimization.__doc__ + '\n' + '* ``DrawSelection``: ' + Qgis.MapSettingsFlag.DrawSelection.__doc__ + '\n' + '* ``DrawSymbolBounds``: ' + Qgis.MapSettingsFlag.DrawSymbolBounds.__doc__ + '\n' + '* ``RenderMapTile``: ' + Qgis.MapSettingsFlag.RenderMapTile.__doc__ + '\n' + '* ``RenderPartialOutput``: ' + Qgis.MapSettingsFlag.RenderPartialOutput.__doc__ + '\n' + '* ``RenderPreviewJob``: ' + Qgis.MapSettingsFlag.RenderPreviewJob.__doc__ + '\n' + '* ``RenderBlocking``: ' + Qgis.MapSettingsFlag.RenderBlocking.__doc__ + '\n' + '* ``LosslessImageRendering``: ' + Qgis.MapSettingsFlag.LosslessImageRendering.__doc__ + '\n' + '* ``Render3DMap``: ' + Qgis.MapSettingsFlag.Render3DMap.__doc__ + '\n' + '* ``HighQualityImageTransforms``: ' + Qgis.MapSettingsFlag.HighQualityImageTransforms.__doc__ + '\n' + '* ``SkipSymbolRendering``: ' + Qgis.MapSettingsFlag.SkipSymbolRendering.__doc__ + '\n' + '* ``ForceRasterMasks``: ' + Qgis.MapSettingsFlag.ForceRasterMasks.__doc__ + '\n' + '* ``RecordProfile``: ' + Qgis.MapSettingsFlag.RecordProfile.__doc__ + '\n' + '* ``AlwaysUseGlobalMasks``: ' + Qgis.MapSettingsFlag.AlwaysUseGlobalMasks.__doc__ # -- QgsMapSettings.Flags = Qgis.MapSettingsFlags Qgis.MapSettingsFlag.baseClass = Qgis @@ -2335,7 +2338,10 @@ QgsRenderContext.RecordProfile = Qgis.RenderContextFlag.RecordProfile QgsRenderContext.RecordProfile.is_monkey_patched = True QgsRenderContext.RecordProfile.__doc__ = "Enable run-time profiling while rendering (since QGIS 3.34)" -Qgis.RenderContextFlag.__doc__ = "Flags which affect rendering operations.\n\n.. versionadded:: 3.22\n\n" + '* ``DrawEditingInfo``: ' + Qgis.RenderContextFlag.DrawEditingInfo.__doc__ + '\n' + '* ``ForceVectorOutput``: ' + Qgis.RenderContextFlag.ForceVectorOutput.__doc__ + '\n' + '* ``UseAdvancedEffects``: ' + Qgis.RenderContextFlag.UseAdvancedEffects.__doc__ + '\n' + '* ``UseRenderingOptimization``: ' + Qgis.RenderContextFlag.UseRenderingOptimization.__doc__ + '\n' + '* ``DrawSelection``: ' + Qgis.RenderContextFlag.DrawSelection.__doc__ + '\n' + '* ``DrawSymbolBounds``: ' + Qgis.RenderContextFlag.DrawSymbolBounds.__doc__ + '\n' + '* ``RenderMapTile``: ' + Qgis.RenderContextFlag.RenderMapTile.__doc__ + '\n' + '* ``Antialiasing``: ' + Qgis.RenderContextFlag.Antialiasing.__doc__ + '\n' + '* ``RenderPartialOutput``: ' + Qgis.RenderContextFlag.RenderPartialOutput.__doc__ + '\n' + '* ``RenderPreviewJob``: ' + Qgis.RenderContextFlag.RenderPreviewJob.__doc__ + '\n' + '* ``RenderBlocking``: ' + Qgis.RenderContextFlag.RenderBlocking.__doc__ + '\n' + '* ``RenderSymbolPreview``: ' + Qgis.RenderContextFlag.RenderSymbolPreview.__doc__ + '\n' + '* ``LosslessImageRendering``: ' + Qgis.RenderContextFlag.LosslessImageRendering.__doc__ + '\n' + '* ``ApplyScalingWorkaroundForTextRendering``: ' + Qgis.RenderContextFlag.ApplyScalingWorkaroundForTextRendering.__doc__ + '\n' + '* ``Render3DMap``: ' + Qgis.RenderContextFlag.Render3DMap.__doc__ + '\n' + '* ``ApplyClipAfterReprojection``: ' + Qgis.RenderContextFlag.ApplyClipAfterReprojection.__doc__ + '\n' + '* ``RenderingSubSymbol``: ' + Qgis.RenderContextFlag.RenderingSubSymbol.__doc__ + '\n' + '* ``HighQualityImageTransforms``: ' + Qgis.RenderContextFlag.HighQualityImageTransforms.__doc__ + '\n' + '* ``SkipSymbolRendering``: ' + Qgis.RenderContextFlag.SkipSymbolRendering.__doc__ + '\n' + '* ``RecordProfile``: ' + Qgis.RenderContextFlag.RecordProfile.__doc__ +QgsRenderContext.AlwaysUseGlobalMasks = Qgis.RenderContextFlag.AlwaysUseGlobalMasks +QgsRenderContext.AlwaysUseGlobalMasks.is_monkey_patched = True +QgsRenderContext.AlwaysUseGlobalMasks.__doc__ = "When applying clipping paths for selective masking, always use global (\"entire map\") paths, instead of calculating local clipping paths per rendered feature. This results in considerably more complex vector exports in all current Qt versions. This flag only applies to vector map exports. (Since QGIS 3.38)" +Qgis.RenderContextFlag.__doc__ = "Flags which affect rendering operations.\n\n.. versionadded:: 3.22\n\n" + '* ``DrawEditingInfo``: ' + Qgis.RenderContextFlag.DrawEditingInfo.__doc__ + '\n' + '* ``ForceVectorOutput``: ' + Qgis.RenderContextFlag.ForceVectorOutput.__doc__ + '\n' + '* ``UseAdvancedEffects``: ' + Qgis.RenderContextFlag.UseAdvancedEffects.__doc__ + '\n' + '* ``UseRenderingOptimization``: ' + Qgis.RenderContextFlag.UseRenderingOptimization.__doc__ + '\n' + '* ``DrawSelection``: ' + Qgis.RenderContextFlag.DrawSelection.__doc__ + '\n' + '* ``DrawSymbolBounds``: ' + Qgis.RenderContextFlag.DrawSymbolBounds.__doc__ + '\n' + '* ``RenderMapTile``: ' + Qgis.RenderContextFlag.RenderMapTile.__doc__ + '\n' + '* ``Antialiasing``: ' + Qgis.RenderContextFlag.Antialiasing.__doc__ + '\n' + '* ``RenderPartialOutput``: ' + Qgis.RenderContextFlag.RenderPartialOutput.__doc__ + '\n' + '* ``RenderPreviewJob``: ' + Qgis.RenderContextFlag.RenderPreviewJob.__doc__ + '\n' + '* ``RenderBlocking``: ' + Qgis.RenderContextFlag.RenderBlocking.__doc__ + '\n' + '* ``RenderSymbolPreview``: ' + Qgis.RenderContextFlag.RenderSymbolPreview.__doc__ + '\n' + '* ``LosslessImageRendering``: ' + Qgis.RenderContextFlag.LosslessImageRendering.__doc__ + '\n' + '* ``ApplyScalingWorkaroundForTextRendering``: ' + Qgis.RenderContextFlag.ApplyScalingWorkaroundForTextRendering.__doc__ + '\n' + '* ``Render3DMap``: ' + Qgis.RenderContextFlag.Render3DMap.__doc__ + '\n' + '* ``ApplyClipAfterReprojection``: ' + Qgis.RenderContextFlag.ApplyClipAfterReprojection.__doc__ + '\n' + '* ``RenderingSubSymbol``: ' + Qgis.RenderContextFlag.RenderingSubSymbol.__doc__ + '\n' + '* ``HighQualityImageTransforms``: ' + Qgis.RenderContextFlag.HighQualityImageTransforms.__doc__ + '\n' + '* ``SkipSymbolRendering``: ' + Qgis.RenderContextFlag.SkipSymbolRendering.__doc__ + '\n' + '* ``RecordProfile``: ' + Qgis.RenderContextFlag.RecordProfile.__doc__ + '\n' + '* ``AlwaysUseGlobalMasks``: ' + Qgis.RenderContextFlag.AlwaysUseGlobalMasks.__doc__ # -- QgsRenderContext.Flags = Qgis.RenderContextFlags Qgis.RenderContextFlag.baseClass = Qgis diff --git a/python/core/auto_generated/layout/qgslayoutrendercontext.sip.in b/python/core/auto_generated/layout/qgslayoutrendercontext.sip.in index 38079a9d8665..2a4257bc1627 100644 --- a/python/core/auto_generated/layout/qgslayoutrendercontext.sip.in +++ b/python/core/auto_generated/layout/qgslayoutrendercontext.sip.in @@ -31,7 +31,8 @@ Stores information relating to the current rendering settings for a layout. FlagDisableTiledRasterLayerRenders, FlagRenderLabelsByMapLayer, FlagLosslessImageRendering, - FlagSynchronousLegendGraphics + FlagSynchronousLegendGraphics, + FlagAlwaysUseGlobalMasks, }; typedef QFlags Flags; diff --git a/python/core/auto_generated/qgis.sip.in b/python/core/auto_generated/qgis.sip.in index 117988fbd58c..97ffe7b642df 100644 --- a/python/core/auto_generated/qgis.sip.in +++ b/python/core/auto_generated/qgis.sip.in @@ -1361,6 +1361,7 @@ The development version SkipSymbolRendering, ForceRasterMasks, RecordProfile, + AlwaysUseGlobalMasks, }; typedef QFlags MapSettingsFlags; @@ -1387,6 +1388,7 @@ The development version HighQualityImageTransforms, SkipSymbolRendering, RecordProfile, + AlwaysUseGlobalMasks, }; typedef QFlags RenderContextFlags; diff --git a/src/core/layout/qgslayoutitemmap.cpp b/src/core/layout/qgslayoutitemmap.cpp index 1da98a1148ff..0a7d4b3f71bf 100644 --- a/src/core/layout/qgslayoutitemmap.cpp +++ b/src/core/layout/qgslayoutitemmap.cpp @@ -1746,6 +1746,7 @@ QgsMapSettings QgsLayoutItemMap::mapSettings( const QgsRectangle &extent, QSizeF jobMapSettings.setFlag( Qgis::MapSettingsFlag::DrawSelection, mLayout->renderContext().flags() & QgsLayoutRenderContext::FlagDrawSelection ); jobMapSettings.setFlag( Qgis::MapSettingsFlag::RenderPartialOutput, mLayout->renderContext().flags() & QgsLayoutRenderContext::FlagDisableTiledRasterLayerRenders ); jobMapSettings.setFlag( Qgis::MapSettingsFlag::UseAdvancedEffects, mLayout->renderContext().flags() & QgsLayoutRenderContext::FlagUseAdvancedEffects ); + jobMapSettings.setFlag( Qgis::MapSettingsFlag::AlwaysUseGlobalMasks, mLayout->renderContext().flags() & QgsLayoutRenderContext::FlagAlwaysUseGlobalMasks ); jobMapSettings.setTransformContext( mLayout->project()->transformContext() ); jobMapSettings.setPathResolver( mLayout->project()->pathResolver() ); diff --git a/src/core/layout/qgslayoutrendercontext.h b/src/core/layout/qgslayoutrendercontext.h index 6c1e1f3bd522..fb4ac1511417 100644 --- a/src/core/layout/qgslayoutrendercontext.h +++ b/src/core/layout/qgslayoutrendercontext.h @@ -53,7 +53,8 @@ class CORE_EXPORT QgsLayoutRenderContext : public QObject FlagDisableTiledRasterLayerRenders = 1 << 8, //!< If set, then raster layers will not be drawn as separate tiles. This may improve the appearance in exported files, at the cost of much higher memory usage during exports. FlagRenderLabelsByMapLayer = 1 << 9, //!< When rendering map items to multi-layered exports, render labels belonging to different layers into separate export layers FlagLosslessImageRendering = 1 << 10, //!< Render images losslessly whenever possible, instead of the default lossy jpeg rendering used for some destination devices (e.g. PDF). - FlagSynchronousLegendGraphics = 1 << 11 //!< Query legend graphics synchronously. + FlagSynchronousLegendGraphics = 1 << 11, //!< Query legend graphics synchronously. + FlagAlwaysUseGlobalMasks = 1 << 12, //!< When applying clipping paths for selective masking, always use global ("entire map") paths, instead of calculating local clipping paths per rendered feature. This results in considerably more complex layout exports in all current Qt versions. This flag only applies to vector layout exports. (Since QGIS 3.38) }; Q_DECLARE_FLAGS( Flags, Flag ) diff --git a/src/core/qgis.h b/src/core/qgis.h index 6b178db00ff6..7e67301854da 100644 --- a/src/core/qgis.h +++ b/src/core/qgis.h @@ -2335,6 +2335,7 @@ class CORE_EXPORT Qgis SkipSymbolRendering = 0x8000, //!< Disable symbol rendering while still drawing labels if enabled (since QGIS 3.24) ForceRasterMasks = 0x10000, //!< Force symbol masking to be applied using a raster method. This is considerably faster when compared to the vector method, but results in a inferior quality output. (since QGIS 3.26.1) RecordProfile = 0x20000, //!< Enable run-time profiling while rendering (since QGIS 3.34) + AlwaysUseGlobalMasks = 0x40000, //!< When applying clipping paths for selective masking, always use global ("entire map") paths, instead of calculating local clipping paths per rendered feature. This results in considerably more complex vector exports in all current Qt versions. This flag only applies to vector map exports. (Since QGIS 3.38) }; //! Map settings flags Q_DECLARE_FLAGS( MapSettingsFlags, MapSettingsFlag ) SIP_MONKEYPATCH_FLAGS_UNNEST( QgsMapSettings, Flags ) @@ -2368,6 +2369,7 @@ class CORE_EXPORT Qgis HighQualityImageTransforms = 0x20000, //!< Enable high quality image transformations, which results in better appearance of scaled or rotated raster components of a map (since QGIS 3.24) SkipSymbolRendering = 0x40000, //!< Disable symbol rendering while still drawing labels if enabled (since QGIS 3.24) RecordProfile = 0x80000, //!< Enable run-time profiling while rendering (since QGIS 3.34) + AlwaysUseGlobalMasks = 0x100000, //!< When applying clipping paths for selective masking, always use global ("entire map") paths, instead of calculating local clipping paths per rendered feature. This results in considerably more complex vector exports in all current Qt versions. This flag only applies to vector map exports. (Since QGIS 3.38) }; //! Render context flags Q_DECLARE_FLAGS( RenderContextFlags, RenderContextFlag ) SIP_MONKEYPATCH_FLAGS_UNNEST( QgsRenderContext, Flags ) diff --git a/src/core/qgsrendercontext.cpp b/src/core/qgsrendercontext.cpp index 61a84d0b2d87..7d01a3bf96c3 100644 --- a/src/core/qgsrendercontext.cpp +++ b/src/core/qgsrendercontext.cpp @@ -260,6 +260,7 @@ QgsRenderContext QgsRenderContext::fromMapSettings( const QgsMapSettings &mapSet ctx.setFlag( Qgis::RenderContextFlag::HighQualityImageTransforms, mapSettings.testFlag( Qgis::MapSettingsFlag::HighQualityImageTransforms ) ); ctx.setFlag( Qgis::RenderContextFlag::SkipSymbolRendering, mapSettings.testFlag( Qgis::MapSettingsFlag::SkipSymbolRendering ) ); ctx.setFlag( Qgis::RenderContextFlag::RecordProfile, mapSettings.testFlag( Qgis::MapSettingsFlag::RecordProfile ) ); + ctx.setFlag( Qgis::RenderContextFlag::AlwaysUseGlobalMasks, mapSettings.testFlag( Qgis::MapSettingsFlag::AlwaysUseGlobalMasks ) ); ctx.setScaleFactor( mapSettings.outputDpi() / 25.4 ); // = pixels per mm ctx.setDpiTarget( mapSettings.dpiTarget() >= 0.0 ? mapSettings.dpiTarget() : -1.0 ); ctx.setRendererScale( mapSettings.scale() ); diff --git a/src/core/symbology/qgssymbol.cpp b/src/core/symbology/qgssymbol.cpp index 87908ab969fd..d67e17d141ed 100644 --- a/src/core/symbology/qgssymbol.cpp +++ b/src/core/symbology/qgssymbol.cpp @@ -883,8 +883,10 @@ void QgsSymbol::startRender( QgsRenderContext &context, const QgsFields &fields, // 2. When the symbol layer type doesn't explicitly state that it's compatible with per-feature mask geometries // 3. When the older clipping mask approach using QPainterPaths is being used. (This last condition can be // safely removed when the older QPainterPath backend is removed.) + // 4. When per feature mask geometry is explicitly disabled for the render context // In other circumstances we do NOT prepare masks in advance, and instead calculate them in renderFeature(). if ( isSubSymbol + || context.testFlag( Qgis::RenderContextFlag::AlwaysUseGlobalMasks ) || !layer->flags().testFlag( Qgis::SymbolLayerFlag::CanCalculateMaskGeometryPerFeature ) || !context.symbolLayerClipPaths( layer->id() ).isEmpty() ) layer->prepareMasks( symbolContext ); @@ -1664,7 +1666,8 @@ void QgsSymbol::renderFeature( const QgsFeature &feature, QgsRenderContext &cont // if this symbol layer has associated clip masks, we need to render it to a QPicture first so that we can // determine the actual rendered bounds of the symbol. We'll then use that to retrieve the clip masks we need // to apply when painting the symbol via this QPicture. - const bool hasClipGeometries = symbolLayer->flags().testFlag( Qgis::SymbolLayerFlag::CanCalculateMaskGeometryPerFeature ) + const bool hasClipGeometries = !context.testFlag( Qgis::RenderContextFlag::AlwaysUseGlobalMasks ) + && symbolLayer->flags().testFlag( Qgis::SymbolLayerFlag::CanCalculateMaskGeometryPerFeature ) && context.symbolLayerHasClipGeometries( symbolLayer->id() ); QPainter *previousPainter = nullptr; std::unique_ptr< QPicture > renderedPicture; From d1e91019c3a343356f95e6b48c0e7381ced37552 Mon Sep 17 00:00:00 2001 From: Nyall Dawson Date: Thu, 20 Jun 2024 11:29:03 +1000 Subject: [PATCH 08/13] Use SymbolRenderHint for flagging subsymbols Instead of the extra argument to startRender --- python/PyQt6/core/auto_additions/qgis.py | 5 +++- python/PyQt6/core/auto_generated/qgis.sip.in | 1 + .../auto_generated/symbology/qgssymbol.sip.in | 3 +-- python/core/auto_additions/qgis.py | 5 +++- python/core/auto_generated/qgis.sip.in | 1 + .../auto_generated/symbology/qgssymbol.sip.in | 3 +-- src/core/qgis.h | 3 ++- src/core/symbology/qgsarrowsymbollayer.cpp | 4 ++- src/core/symbology/qgsfillsymbollayer.cpp | 27 ++++++++++++------- .../qgsgeometrygeneratorsymbollayer.cpp | 4 ++- src/core/symbology/qgslinesymbollayer.cpp | 11 ++++---- src/core/symbology/qgsmarkersymbollayer.cpp | 3 ++- src/core/symbology/qgssymbol.cpp | 4 +-- src/core/symbology/qgssymbol.h | 3 +-- .../symbology/qgsvectorfieldsymbollayer.cpp | 3 ++- 15 files changed, 51 insertions(+), 29 deletions(-) diff --git a/python/PyQt6/core/auto_additions/qgis.py b/python/PyQt6/core/auto_additions/qgis.py index e0664376b6da..fbd0ce5c41e1 100644 --- a/python/PyQt6/core/auto_additions/qgis.py +++ b/python/PyQt6/core/auto_additions/qgis.py @@ -634,7 +634,10 @@ QgsSymbol.DynamicRotation = Qgis.SymbolRenderHint.DynamicRotation QgsSymbol.DynamicRotation.is_monkey_patched = True QgsSymbol.DynamicRotation.__doc__ = "Rotation of symbol may be changed during rendering and symbol should not be cached" -Qgis.SymbolRenderHint.__doc__ = "Flags controlling behavior of symbols during rendering\n\n.. versionadded:: 3.20\n\n" + '* ``DynamicRotation``: ' + Qgis.SymbolRenderHint.DynamicRotation.__doc__ +QgsSymbol.IsSymbolLayerSubSymbol = Qgis.SymbolRenderHint.IsSymbolLayerSubSymbol +QgsSymbol.IsSymbolLayerSubSymbol.is_monkey_patched = True +QgsSymbol.IsSymbolLayerSubSymbol.__doc__ = "Symbol is being rendered as a sub-symbol of a QgsSymbolLayer (since QGIS 3.38)" +Qgis.SymbolRenderHint.__doc__ = "Flags controlling behavior of symbols during rendering\n\n.. versionadded:: 3.20\n\n" + '* ``DynamicRotation``: ' + Qgis.SymbolRenderHint.DynamicRotation.__doc__ + '\n' + '* ``IsSymbolLayerSubSymbol``: ' + Qgis.SymbolRenderHint.IsSymbolLayerSubSymbol.__doc__ # -- Qgis.SymbolRenderHint.baseClass = Qgis Qgis.SymbolRenderHints = lambda flags=0: Qgis.SymbolRenderHint(flags) diff --git a/python/PyQt6/core/auto_generated/qgis.sip.in b/python/PyQt6/core/auto_generated/qgis.sip.in index 3aea91910c7f..5a98ae351d69 100644 --- a/python/PyQt6/core/auto_generated/qgis.sip.in +++ b/python/PyQt6/core/auto_generated/qgis.sip.in @@ -362,6 +362,7 @@ The development version enum class SymbolRenderHint /BaseType=IntFlag/ { DynamicRotation, + IsSymbolLayerSubSymbol, }; typedef QFlags SymbolRenderHints; diff --git a/python/PyQt6/core/auto_generated/symbology/qgssymbol.sip.in b/python/PyQt6/core/auto_generated/symbology/qgssymbol.sip.in index 79f9a46ae366..95197f0cf6d4 100644 --- a/python/PyQt6/core/auto_generated/symbology/qgssymbol.sip.in +++ b/python/PyQt6/core/auto_generated/symbology/qgssymbol.sip.in @@ -283,7 +283,7 @@ Returns ``False`` if ``layer`` is not compatible with the symbol's :py:func:`~Qg ``True`` if the layer was successfully replaced. %End - void startRender( QgsRenderContext &context, const QgsFields &fields = QgsFields(), bool isSubSymbol = false ); + void startRender( QgsRenderContext &context, const QgsFields &fields = QgsFields() ); %Docstring Begins the rendering process for the symbol. This must be called before :py:func:`~QgsSymbol.renderFeature`, and should be followed by a call to :py:func:`~QgsSymbol.stopRender`. @@ -292,7 +292,6 @@ and should be followed by a call to :py:func:`~QgsSymbol.stopRender`. :param fields: fields for features to be rendered (usually the associated vector layer's fields). Required for correct calculation of data defined overrides. -:param isSubSymbol: Should be set to ``True`` when the symbol is being used as a subsymbol of a :py:class:`QgsSymbolLayer` (since QGIS 3.38) .. seealso:: :py:func:`stopRender` %End diff --git a/python/core/auto_additions/qgis.py b/python/core/auto_additions/qgis.py index 0d3e413e94b3..077aa510efcc 100644 --- a/python/core/auto_additions/qgis.py +++ b/python/core/auto_additions/qgis.py @@ -621,7 +621,10 @@ QgsSymbol.DynamicRotation = Qgis.SymbolRenderHint.DynamicRotation QgsSymbol.DynamicRotation.is_monkey_patched = True QgsSymbol.DynamicRotation.__doc__ = "Rotation of symbol may be changed during rendering and symbol should not be cached" -Qgis.SymbolRenderHint.__doc__ = "Flags controlling behavior of symbols during rendering\n\n.. versionadded:: 3.20\n\n" + '* ``DynamicRotation``: ' + Qgis.SymbolRenderHint.DynamicRotation.__doc__ +QgsSymbol.IsSymbolLayerSubSymbol = Qgis.SymbolRenderHint.IsSymbolLayerSubSymbol +QgsSymbol.IsSymbolLayerSubSymbol.is_monkey_patched = True +QgsSymbol.IsSymbolLayerSubSymbol.__doc__ = "Symbol is being rendered as a sub-symbol of a QgsSymbolLayer (since QGIS 3.38)" +Qgis.SymbolRenderHint.__doc__ = "Flags controlling behavior of symbols during rendering\n\n.. versionadded:: 3.20\n\n" + '* ``DynamicRotation``: ' + Qgis.SymbolRenderHint.DynamicRotation.__doc__ + '\n' + '* ``IsSymbolLayerSubSymbol``: ' + Qgis.SymbolRenderHint.IsSymbolLayerSubSymbol.__doc__ # -- Qgis.SymbolRenderHint.baseClass = Qgis QgsSymbol.RenderHints = Qgis.SymbolRenderHints diff --git a/python/core/auto_generated/qgis.sip.in b/python/core/auto_generated/qgis.sip.in index 97ffe7b642df..c3c073a12eb6 100644 --- a/python/core/auto_generated/qgis.sip.in +++ b/python/core/auto_generated/qgis.sip.in @@ -362,6 +362,7 @@ The development version enum class SymbolRenderHint { DynamicRotation, + IsSymbolLayerSubSymbol, }; typedef QFlags SymbolRenderHints; diff --git a/python/core/auto_generated/symbology/qgssymbol.sip.in b/python/core/auto_generated/symbology/qgssymbol.sip.in index 91f121cb085c..30e0d6937336 100644 --- a/python/core/auto_generated/symbology/qgssymbol.sip.in +++ b/python/core/auto_generated/symbology/qgssymbol.sip.in @@ -283,7 +283,7 @@ Returns ``False`` if ``layer`` is not compatible with the symbol's :py:func:`~Qg ``True`` if the layer was successfully replaced. %End - void startRender( QgsRenderContext &context, const QgsFields &fields = QgsFields(), bool isSubSymbol = false ); + void startRender( QgsRenderContext &context, const QgsFields &fields = QgsFields() ); %Docstring Begins the rendering process for the symbol. This must be called before :py:func:`~QgsSymbol.renderFeature`, and should be followed by a call to :py:func:`~QgsSymbol.stopRender`. @@ -292,7 +292,6 @@ and should be followed by a call to :py:func:`~QgsSymbol.stopRender`. :param fields: fields for features to be rendered (usually the associated vector layer's fields). Required for correct calculation of data defined overrides. -:param isSubSymbol: Should be set to ``True`` when the symbol is being used as a subsymbol of a :py:class:`QgsSymbolLayer` (since QGIS 3.38) .. seealso:: :py:func:`stopRender` %End diff --git a/src/core/qgis.h b/src/core/qgis.h index 7e67301854da..b9de4cebba1f 100644 --- a/src/core/qgis.h +++ b/src/core/qgis.h @@ -577,7 +577,8 @@ class CORE_EXPORT Qgis */ enum class SymbolRenderHint SIP_MONKEYPATCH_SCOPEENUM_UNNEST( QgsSymbol, RenderHint ) : int SIP_ENUM_BASETYPE( IntFlag ) { - DynamicRotation = 2, //!< Rotation of symbol may be changed during rendering and symbol should not be cached + DynamicRotation = 1 << 1, //!< Rotation of symbol may be changed during rendering and symbol should not be cached + IsSymbolLayerSubSymbol = 1 << 2, //!< Symbol is being rendered as a sub-symbol of a QgsSymbolLayer (since QGIS 3.38) }; Q_ENUM( SymbolRenderHint ) //! Symbol render hints diff --git a/src/core/symbology/qgsarrowsymbollayer.cpp b/src/core/symbology/qgsarrowsymbollayer.cpp index 713153c02bc5..478a92e54588 100644 --- a/src/core/symbology/qgsarrowsymbollayer.cpp +++ b/src/core/symbology/qgsarrowsymbollayer.cpp @@ -215,7 +215,9 @@ void QgsArrowSymbolLayer::startRender( QgsSymbolRenderContext &context ) mComputedHeadType = headType(); mComputedArrowType = arrowType(); - mSymbol->startRender( context.renderContext(), context.fields(), true ); + mSymbol->setRenderHints( mSymbol->renderHints() | Qgis::SymbolRenderHint::IsSymbolLayerSubSymbol ); + + mSymbol->startRender( context.renderContext(), context.fields() ); } void QgsArrowSymbolLayer::stopRender( QgsSymbolRenderContext &context ) diff --git a/src/core/symbology/qgsfillsymbollayer.cpp b/src/core/symbology/qgsfillsymbollayer.cpp index 42a33ac76329..a70abb1e8063 100644 --- a/src/core/symbology/qgsfillsymbollayer.cpp +++ b/src/core/symbology/qgsfillsymbollayer.cpp @@ -2163,7 +2163,8 @@ void QgsSVGFillSymbolLayer::startRender( QgsSymbolRenderContext &context ) if ( mStroke ) { - mStroke->startRender( context.renderContext(), context.fields(), true ); + mStroke->setRenderHints( mStroke->renderHints() | Qgis::SymbolRenderHint::IsSymbolLayerSubSymbol ); + mStroke->startRender( context.renderContext(), context.fields() ); } } @@ -3133,7 +3134,8 @@ bool QgsLinePatternFillSymbolLayer::applyPattern( const QgsSymbolRenderContext & lineRenderContext.setFlag( Qgis::RenderContextFlag::RenderingSubSymbol ); lineRenderContext.setDisabledSymbolLayersV2( context.renderContext().disabledSymbolLayersV2() ); - fillLineSymbol->startRender( lineRenderContext, context.fields(), true ); + fillLineSymbol->setRenderHints( fillLineSymbol->renderHints() | Qgis::SymbolRenderHint::IsSymbolLayerSubSymbol ); + fillLineSymbol->startRender( lineRenderContext, context.fields() ); QVector polygons; polygons.append( QPolygonF() << p1 << p2 ); @@ -3191,7 +3193,8 @@ void QgsLinePatternFillSymbolLayer::startRender( QgsSymbolRenderContext &context if ( mRenderUsingLines && mFillLineSymbol ) { - mFillLineSymbol->startRender( context.renderContext(), context.fields(), true ); + mFillLineSymbol->setRenderHints( mFillLineSymbol->renderHints() | Qgis::SymbolRenderHint::IsSymbolLayerSubSymbol ); + mFillLineSymbol->startRender( context.renderContext(), context.fields() ); mFillLineSymbolRenderStarted = true; } } @@ -3217,7 +3220,8 @@ void QgsLinePatternFillSymbolLayer::renderPolygon( const QPolygonF &points, cons if ( !mFillLineSymbolRenderStarted && mFillLineSymbol ) { - mFillLineSymbol->startRender( context.renderContext(), context.fields(), true ); + mFillLineSymbol->setRenderHints( mFillLineSymbol->renderHints() | Qgis::SymbolRenderHint::IsSymbolLayerSubSymbol ); + mFillLineSymbol->startRender( context.renderContext(), context.fields() ); mFillLineSymbolRenderStarted = true; } @@ -3895,7 +3899,8 @@ bool QgsPointPatternFillSymbolLayer::applyPattern( const QgsSymbolRenderContext pointRenderContext.setExpressionContext( context.renderContext().expressionContext() ); pointRenderContext.setFlag( Qgis::RenderContextFlag::RenderingSubSymbol ); - mMarkerSymbol->startRender( pointRenderContext, context.fields(), true ); + mMarkerSymbol->setRenderHints( mMarkerSymbol->renderHints() | Qgis::SymbolRenderHint::IsSymbolLayerSubSymbol ); + mMarkerSymbol->startRender( pointRenderContext, context.fields() ); //render points on distance grid for ( double currentX = -width; currentX <= width * 2.0; currentX += width ) @@ -3972,7 +3977,8 @@ void QgsPointPatternFillSymbolLayer::startRender( QgsSymbolRenderContext &contex if ( mRenderUsingMarkers && mMarkerSymbol ) { - mMarkerSymbol->startRender( context.renderContext(), context.fields(), true ); + mMarkerSymbol->setRenderHints( mMarkerSymbol->renderHints() | Qgis::SymbolRenderHint::IsSymbolLayerSubSymbol ); + mMarkerSymbol->startRender( context.renderContext(), context.fields() ); mMarkerSymbolRenderStarted = true; } } @@ -4016,7 +4022,8 @@ void QgsPointPatternFillSymbolLayer::renderPolygon( const QPolygonF &points, con if ( !mMarkerSymbolRenderStarted && mMarkerSymbol ) { - mMarkerSymbol->startRender( context.renderContext(), context.fields(), true ); + mMarkerSymbol->setRenderHints( mMarkerSymbol->renderHints() | Qgis::SymbolRenderHint::IsSymbolLayerSubSymbol ); + mMarkerSymbol->startRender( context.renderContext(), context.fields() ); mMarkerSymbolRenderStarted = true; } @@ -4808,7 +4815,8 @@ QColor QgsCentroidFillSymbolLayer::color() const void QgsCentroidFillSymbolLayer::startRender( QgsSymbolRenderContext &context ) { - mMarker->startRender( context.renderContext(), context.fields(), true ); + mMarker->setRenderHints( mMarker->renderHints() | Qgis::SymbolRenderHint::IsSymbolLayerSubSymbol ); + mMarker->startRender( context.renderContext(), context.fields() ); } void QgsCentroidFillSymbolLayer::stopRender( QgsSymbolRenderContext &context ) @@ -5564,7 +5572,8 @@ QColor QgsRandomMarkerFillSymbolLayer::color() const void QgsRandomMarkerFillSymbolLayer::startRender( QgsSymbolRenderContext &context ) { - mMarker->startRender( context.renderContext(), context.fields(), true ); + mMarker->setRenderHints( mMarker->renderHints() | Qgis::SymbolRenderHint::IsSymbolLayerSubSymbol ); + mMarker->startRender( context.renderContext(), context.fields() ); } void QgsRandomMarkerFillSymbolLayer::stopRender( QgsSymbolRenderContext &context ) diff --git a/src/core/symbology/qgsgeometrygeneratorsymbollayer.cpp b/src/core/symbology/qgsgeometrygeneratorsymbollayer.cpp index 4781761159d8..dc9d3dac189b 100644 --- a/src/core/symbology/qgsgeometrygeneratorsymbollayer.cpp +++ b/src/core/symbology/qgsgeometrygeneratorsymbollayer.cpp @@ -98,7 +98,9 @@ void QgsGeometryGeneratorSymbolLayer::startRender( QgsSymbolRenderContext &conte { mExpression->prepare( &context.renderContext().expressionContext() ); - subSymbol()->startRender( context.renderContext(), context.fields(), true ); + subSymbol()->setRenderHints( subSymbol()->renderHints() | Qgis::SymbolRenderHint::IsSymbolLayerSubSymbol ); + + subSymbol()->startRender( context.renderContext(), context.fields() ); } void QgsGeometryGeneratorSymbolLayer::stopRender( QgsSymbolRenderContext &context ) diff --git a/src/core/symbology/qgslinesymbollayer.cpp b/src/core/symbology/qgslinesymbollayer.cpp index a37abf36e880..cf48a1f5616c 100644 --- a/src/core/symbology/qgslinesymbollayer.cpp +++ b/src/core/symbology/qgslinesymbollayer.cpp @@ -2475,12 +2475,12 @@ QColor QgsMarkerLineSymbolLayer::color() const void QgsMarkerLineSymbolLayer::startRender( QgsSymbolRenderContext &context ) { // if being rotated, it gets initialized with every line segment - Qgis::SymbolRenderHints hints = Qgis::SymbolRenderHints(); + Qgis::SymbolRenderHints hints = Qgis::SymbolRenderHint::IsSymbolLayerSubSymbol; if ( rotateSymbols() ) hints |= Qgis::SymbolRenderHint::DynamicRotation; mMarker->setRenderHints( hints ); - mMarker->startRender( context.renderContext(), context.fields(), true ); + mMarker->startRender( context.renderContext(), context.fields() ); } void QgsMarkerLineSymbolLayer::stopRender( QgsSymbolRenderContext &context ) @@ -2801,12 +2801,12 @@ QString QgsHashedLineSymbolLayer::layerType() const void QgsHashedLineSymbolLayer::startRender( QgsSymbolRenderContext &context ) { // if being rotated, it gets initialized with every line segment - Qgis::SymbolRenderHints hints = Qgis::SymbolRenderHints(); + Qgis::SymbolRenderHints hints = Qgis::SymbolRenderHint::IsSymbolLayerSubSymbol; if ( rotateSymbols() ) hints |= Qgis::SymbolRenderHint::DynamicRotation; mHashSymbol->setRenderHints( hints ); - mHashSymbol->startRender( context.renderContext(), context.fields(), true ); + mHashSymbol->startRender( context.renderContext(), context.fields() ); } void QgsHashedLineSymbolLayer::stopRender( QgsSymbolRenderContext &context ) @@ -3891,7 +3891,8 @@ void QgsFilledLineSymbolLayer::startRender( QgsSymbolRenderContext &context ) { if ( mFill ) { - mFill->startRender( context.renderContext(), context.fields(), true ); + mFill->setRenderHints( mFill->renderHints() | Qgis::SymbolRenderHint::IsSymbolLayerSubSymbol ); + mFill->startRender( context.renderContext(), context.fields() ); } } diff --git a/src/core/symbology/qgsmarkersymbollayer.cpp b/src/core/symbology/qgsmarkersymbollayer.cpp index b11f3d896ad7..7bc65562deea 100644 --- a/src/core/symbology/qgsmarkersymbollayer.cpp +++ b/src/core/symbology/qgsmarkersymbollayer.cpp @@ -1936,7 +1936,8 @@ void QgsFilledMarkerSymbolLayer::startRender( QgsSymbolRenderContext &context ) { if ( mFill ) { - mFill->startRender( context.renderContext(), context.fields(), true ); + mFill->setRenderHints( mFill->renderHints() | Qgis::SymbolRenderHint::IsSymbolLayerSubSymbol ); + mFill->startRender( context.renderContext(), context.fields() ); } QgsSimpleMarkerSymbolLayerBase::startRender( context ); diff --git a/src/core/symbology/qgssymbol.cpp b/src/core/symbology/qgssymbol.cpp index d67e17d141ed..3760b8850b91 100644 --- a/src/core/symbology/qgssymbol.cpp +++ b/src/core/symbology/qgssymbol.cpp @@ -827,7 +827,7 @@ bool QgsSymbol::changeSymbolLayer( int index, QgsSymbolLayer *layer ) } -void QgsSymbol::startRender( QgsRenderContext &context, const QgsFields &fields, bool isSubSymbol ) +void QgsSymbol::startRender( QgsRenderContext &context, const QgsFields &fields ) { Q_ASSERT_X( !mStarted, "startRender", "Rendering has already been started for this symbol instance!" ); mStarted = true; @@ -885,7 +885,7 @@ void QgsSymbol::startRender( QgsRenderContext &context, const QgsFields &fields, // safely removed when the older QPainterPath backend is removed.) // 4. When per feature mask geometry is explicitly disabled for the render context // In other circumstances we do NOT prepare masks in advance, and instead calculate them in renderFeature(). - if ( isSubSymbol + if ( mRenderHints.testFlag( Qgis::SymbolRenderHint::IsSymbolLayerSubSymbol ) || context.testFlag( Qgis::RenderContextFlag::AlwaysUseGlobalMasks ) || !layer->flags().testFlag( Qgis::SymbolLayerFlag::CanCalculateMaskGeometryPerFeature ) || !context.symbolLayerClipPaths( layer->id() ).isEmpty() ) diff --git a/src/core/symbology/qgssymbol.h b/src/core/symbology/qgssymbol.h index 123c9f445208..4bac791d9c1e 100644 --- a/src/core/symbology/qgssymbol.h +++ b/src/core/symbology/qgssymbol.h @@ -329,10 +329,9 @@ class CORE_EXPORT QgsSymbol * \param fields fields for features to be rendered (usually the associated * vector layer's fields). Required for correct calculation of data defined * overrides. - * \param isSubSymbol Should be set to TRUE when the symbol is being used as a subsymbol of a QgsSymbolLayer (since QGIS 3.38) * \see stopRender() */ - void startRender( QgsRenderContext &context, const QgsFields &fields = QgsFields(), bool isSubSymbol = false ); + void startRender( QgsRenderContext &context, const QgsFields &fields = QgsFields() ); /** * Ends the rendering process. This should be called after rendering all desired features. diff --git a/src/core/symbology/qgsvectorfieldsymbollayer.cpp b/src/core/symbology/qgsvectorfieldsymbollayer.cpp index ef2d68294173..f1f667f8af37 100644 --- a/src/core/symbology/qgsvectorfieldsymbollayer.cpp +++ b/src/core/symbology/qgsvectorfieldsymbollayer.cpp @@ -223,7 +223,8 @@ void QgsVectorFieldSymbolLayer::startRender( QgsSymbolRenderContext &context ) { if ( mLineSymbol ) { - mLineSymbol->startRender( context.renderContext(), context.fields(), true ); + mLineSymbol->setRenderHints( mLineSymbol->renderHints() | Qgis::SymbolRenderHint::IsSymbolLayerSubSymbol ); + mLineSymbol->startRender( context.renderContext(), context.fields() ); } const QgsFields fields = context.fields(); From cc998d8501d964e9d37e2941dd09db382b8581db Mon Sep 17 00:00:00 2001 From: Nyall Dawson Date: Wed, 19 Jun 2024 10:27:11 +1000 Subject: [PATCH 09/13] Update test masks --- .../layout_export/layout_export_mask.png | Bin 23653 -> 25389 bytes .../layout_export_2_sources_masking_mask.png | Bin 29764 -> 31087 bytes ...layout_export_force_raster_render_mask.png | Bin 11565 -> 13105 bytes .../layout_export_marker_masking_mask.png | Bin 19246 -> 20541 bytes .../layout_export_markerline_masked_mask.png | Bin 10550 -> 10984 bytes .../layout_export_svg_marker_masking_mask.png | Bin 8605 -> 10640 bytes .../layout_export_w_raster_mask.png | Bin 20752 -> 21904 bytes 7 files changed, 0 insertions(+), 0 deletions(-) diff --git a/tests/testdata/control_images/selective_masking/layout_export/layout_export_mask.png b/tests/testdata/control_images/selective_masking/layout_export/layout_export_mask.png index f2939a7b9bd4ff35f66140d6598fb32423f6c33a..19bae4092352e1fc75607daf57d3f608f4845e13 100644 GIT binary patch literal 25389 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 ZaoUr|#Vw5Ucd<6Y%G}1RV7Euqe*naSShWBE diff --git a/tests/testdata/control_images/selective_masking/layout_export_2_sources_masking/layout_export_2_sources_masking_mask.png b/tests/testdata/control_images/selective_masking/layout_export_2_sources_masking/layout_export_2_sources_masking_mask.png index fc07e35d0789280baed96fa9c31b0c68f2f3940c..3bd9d9c2ea5628679101306596dcd3e4ddcb2df0 100644 GIT binary patch literal 31087 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%0A#K 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 KQlw*d=Dz?p5li9# diff --git a/tests/testdata/control_images/selective_masking/layout_export_force_raster_render/layout_export_force_raster_render_mask.png b/tests/testdata/control_images/selective_masking/layout_export_force_raster_render/layout_export_force_raster_render_mask.png index 13b856af0091360a6c954525f5f1083b8d51eb5c..ba4ed65a204418bb805c46bec883e991adbdc7a0 100644 GIT binary patch literal 13105 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 literal 11565 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 U8Q;!vb%UbO)78&qol`;+0O@zLF8}}l literal 19246 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 HgQx!k0XQi{ diff --git a/tests/testdata/control_images/selective_masking/layout_export_markerline_masked/layout_export_markerline_masked_mask.png b/tests/testdata/control_images/selective_masking/layout_export_markerline_masked/layout_export_markerline_masked_mask.png index 6ea2f0008eeb9125037a964d0fbcc63491c86b86..518545a06f5b9125011cfe48f8202947bafa21c6 100644 GIT binary patch literal 10984 zcmeHtc{r5c-~Ww7DukkJ*+Pjz_AP|Q+EB7rh^!&Iu@oWMvSrsIX(43n%O@fxA=&qs z?8#WiGJfyT=llHrey;2Je>-JIB`FuO~IT{ODx zOq|BjCg0VqEm4U^hAj^wOs@0aa5_29P^3lDy268f#v6vT{5j@*(b>tZ{?7dr)mGI* zTuky*N2o4l+&9}ju>bZhEnA2{L!W5Vr~LmLQhcne?cQ z414g8ij7gp6nVC%JmSEt3@y2YN61hjNU(EN^9oEDX?sXXjUYLZ{}aE5E-7V8E2`?s zWlAYhBEgi@L&F3@@yrp2=bf)-jvxq&P)^0W!oqYe3PdG@^0z2cWQ48Bt7Zh*M@vmt z9yKyzDeJ%XZsvR=*15mRyKv?_`I52Uw~C%7;%vLDzeF+%+Su4MuCO5p9m@yBcrA6O zK`Cr48nwB#75$z8DL+b0*Y{AJmq$=9;~bWhDq%M{_RoW+9vWom5hb-#*PlNh;slo+ia6ea zcQ?6hXP1l4XM4(qY{O#TJ%}rwoNP&8iq;TF)p5YQL!-WB$nx>3##45DhnYHvr#=o< z203QfZT873H|7ui2m03LNgPcKRN4mFzmj>g$uUZt4CBL zXwEAkJdHP;2EAYeyJoQ@6#09cxrs}?C|VxTrVS*NQSAy!Hs7c<#q;~j$E99vS{|3M zEfosq`Bb~Ccp}lay*J>#_OJ=o7;7V939t1ehsFDsa|v%EEra% zL(-1Q8>p}si)cf*V$SOG^6swa@2dM!c8EXD*5nV}U}x^-<5UXho0*?c(!f*uF@w>$CAGEUZALVgfxs6IeWI{p9eG;i)HrFjfd5{q^;V5 z1BfL=owJRzvo0h^p(E+r;&x2o97QlUc`OqXlO+s!r1tgy404EpVXO9+|6BztQXsmql++)O*Db2kBkv=^4^TP3+SIG& z-rZ;>^xI{(e2!wp*OBJxCKt*^lNppYR04@OtJbOPAQwL!gjSM{B{*%k${S}~OE~Jg zyR)8KSg7x{IC6HEAhyfP9kg9E(}}R%fc%s5oK4Q0OG-LAv$&X&mBnRZW|rVyA=0kA zTWwx`_n+x^fiSJU@0j&rL4Ad#(14{Vt3-4@|Lz}#-Fo_?9Y5VGGTs#wpscL2`4d{I zNW@!3Ldu(+vFhrR`FUAS9D56h=WckMq{4vDmro^pW3Ah`G*QB+Iva~_y_}2I zduDKV;c12Wx5(y+Cad&ta!kK$Nzgf!xfn1d&mydvb}rdgHdUwT3aTP-UiI0Sj;`+U zplHibLm$L^c``x26^~1?y>sVsfmNN09|z)na}diR>#qK5YD&@Uh0*C2GuIk{uCA`E z_ctFc9n++}^In0pF`*}(dQSu=u5^&cW?3jVAWIcu$gHKs_RKYH~ZzSzy|N<>RUTG_KC|3hS$=*oq%N z&dt64ULi8#@#Du|W@q0(Wj5>5hE+obv`XurmVd6FpMRGj>(R9CSp#hZ$%%d(9o^E` z_cXrrOwuDL1j5InGo-X3oEa5P|1Y)KDXr!jF*#LN~xSnO@T&@_8V2fxsV2074% z7v<#SbYeRg=~xitPZIjHLDkJw7)@7HXx)>7F#zx0ze3B)OTdc-ne5-cUnjN`zS%K( zpP;Oc{39(RBZPHM=Td{MB6pt^w!_c%CZeICVRQ55KhuX$`NPaeoX zxAqNKTU(1uN!@nBl))70?NY?7$RG9nyQ*IXpsU=Qj%&Pio^P&-j0<#wEzXofJ=PLp zVZs#$SZ#exl{j0p#SdFzPd{(^k8VOj0-M0RcVRJ z2f|dF>`pGk-zu7h$k7zWZx%TZdhM0r=}TTi8`Qz4u>R{V#Lr@ZH=QuhBA{A8ukT>X zO%xFoZJnNe4FOc{{?$q9jQfP&+iU6}lmm&*gYNj&qflXJEU^zh$$Kz@O7zJ2?a>>oZnY>*R-_>P6pK>8`2 zSKKeTy0+GutDT|~OHr>0jr{|;T0uhKXS?6N(hNC8C)QC5_ZgG$dKdf)K+9cCD4@kf zMK}EpA+#Li*a<$B6-M(fj^p~f*+_~T9Rq^>;4!5)!gF9uikv}+ZpJ67vB*q$?=%2m z3gk2`7h$2hTwyMyxF2CCqN1*6UI-YM#2>K7%&SlYM+`xAC%m=VX$8=gwol#w!Cn&1 zU7hk?99ifWvCL7R==g`8B^djwX%&SMhE`b6w(sNydFzohng2|vUczegJ3QN1B_KTL zO|*#KI0eOz&Q2b7cJ^1z_Lql;huw(;KzN9~`+v<6K{{Z^g3o?j=Io{zIu2Qc{Szh@ z@Xrb@LK)!*xr0c;bpJjwTSs@dt=~RGh3em%ata~NQ!wo}06QgRz4pE>+(iZPsz8bN z0^kUJN;fv-6x6!vmG9cc*3B^kbz3W4`uNS&Il}gG`*P_I8)&DLF;hP&+RmJaZUu-4 z&=m(^`!X+2)6dV(=GHA$_}?jBUI1L_uC>DCVETuK`-|fG5Z}Rr2lwJ^!ulYK5UWw$ zhO5`I6+NQj-*UTzz`eV~O@K$a$mKW90~N)TI~#|ed|x*5gw-nGN`Ym~Y=6dUZt6Gm zFmOwPpa9$*%Ah*$5s1zdR4y+{nA|#gE&Ugg7yA19O<>tIruHK~IIMGOYHGYil~)UC zXG`caqHG|eNwR=ldsY(kUH6G-cIn00qfwWLV-FZ?Fc^zgd@*_0 z5zM;9C|#1;?+hoYIUDig#<3wF1NEBD1SrUYv>5ES?CXYchEv(&q!%QCz&8rYzpcK8>kv*G)(vwOjBR@lt zV~UyagKSPbC!!xkd|6rf__mqz#0jP&@kXZw#A-KgshJgHopGN&-6!`S0JV|oF98HS z3=b!FR(18Bo}S-*BjXIiQ7U2_3_Um0D3;Z1PxMuDkk?bH+g_yh= zKuH1tCx+uDjdNos@h4HjCg$deUXI9a5kxhaj)1CMCJUx$Rhs5Pv62>cR&6nuOWv*csSS@}2 z*_iW|@3jB1+HSl0SYL6}uI$Ki_QxCn4tjZ5nzB{#)UVjGt%mUrVrB`A!_&tYV@bu# zs^&U!nO=ZZG5}6*4dkL*$hbq9#zlZD)_=1BQ`y{pAn$s zy6vG}tsh7C10vx@z<$;H$8r;wH|Gkg0;AvQSq2jE$>lxY<_Jd7Gy<*Lf?`^o{fFHp zx}$0rSGHo6HeZY7u|!Ibvs_=!d-0-S;}E|L-lNue4CH;74ZQ|i*vRD zGxr8c7njz3ylk&B1Jnk_6u$)kk4Qy9bRMg>7Rf=Ddb2VY`@yrp*2hB5M zw;>7K$Ld4OL`~PsM2;l@<{RqUj7FncfWj7**~$QNQCR*eQNR&J>6wrqsDGlSt_gZf zXv4S}$$~dN&NXm3U1Rsjr$f14>n^X6wiba2ZI&anc&ge8yNP!ewg}cIpna{-t^l8RLy((Y%p2evCNbk-X1{NOv za(L*FjX<|$g;#bR(Y7WUQ(hCMc3wFyJ`>T>WTyM7InF@HXwcVZJd9PL>c!dZ&x(n` zJ;lYvxBNn1dCmUFug_fSycAM-6N6D?WN_eMV~c~Nfc-0W9aZX@KoF@bHJ##VU4Vd~ zU0=9&XqnYy?3kLG+LIQWNoYmp>-!`raK)yCn2z$2tgI}Rn*5xSlCBk6Qvkm6{UyyS zY^4%Pt1ej|s65r;u+}(y@#EOobS^56VaAsWeP@gd_Wg`H_?vF?{UIUBUl$0<9vg4#>PA;+FElhXywdDI zW2D~RfoUDiY3`fQ0UX`M_fde( zsGcS2QUS){X5D6Yp-$}GgPE$DL@JUowB_#Zt6kPV_RTOQF3^73DS30kH(Zi6e)L0i zwUghzc=kNsa#Fr0hR`DTO0yi`#?nE3l1N9ZoV+}~q+LluQA0OQPY}xtJ25>sCjkNo zqf1_J&ykg=UbEv>E${ENXDLF5p$GV~BE&==ZVPl5+Ma2&xw6LIW(@CPyyfiOp%q&D z^U;>oT%oQ^ZEuWDr*ctnv7I>aBs%)A$@S~!6d#edW!MA#z`aTHL`E0{;zkFhIi!;3SX9e+LwNKzAV^S2 z+}cp-<0Hy_F()(E>UTGzM>h@=*UIXgZ3MN11x9y%d#A6-Rh^vAs#$7cKRkRS6XvMJ ze{01r7E-3QtZv8I7lQL~8?x)R$eklAkZ_r}xJz<{0=I%$0I4N4GjkPVA-xa(xP5lk zK~4JoE0tk>P-x=$G#|fnHaX^ciF#mP-h^qhbnVh%;`EEy0L7$r$GSB~aXGnxkBfaV zpKrPU8N2vGLMYd~;uwx+R~c9dM0jmsIx5$p?%VB>7%%S(O~>!{L6$XHm9S@*+?8>1+R-^R(d70ui1$Gg*iVUtAGP!5t5J?}GmoO{HvY zl593=-4?|3;HlARymsWH=81Gtm{uMTtp4F)=j~-}EcYPR(KeisX~;$)+ zMdG_Heq3K~3KCe}fBp9bQiVWh+%?^z>-TDRcNTjsUOxK#yyU}&4)-d(^v~@QN}^U= z)}#d16&5;b!A!j>^zBdM9}-ZxE)~D-yyZ~z`;owO;r#iV+sh!VyywbIOwh~AoXYb5 zChIx-gHtTy8j9SqeV0D7X4Y-Kt#gR_dC#L-^a@v^pj~sc)tG1^+Wptp<42D8&gSQl zalR=xH{_9viym)$1c*z{LFV~JPXG!*(;tv<#s3*^a0eC0IQ9V2XZp+_E*o?PGQuPW z3_rkKSJ%Sr&BEQvp`hIz-F0($X%K9DiTD&e)TIJ0X^6KX>t_B`ok~A*IwMZNG7%Ag z_*2u<6Bv}Y|6s{`SWWzu?oQhFCDX@4^z=PDtS_#Mv@!&3r~ycF^;vsUQ6UQ#cr5q; zP(7X9jw3El;Ww5h4v$W?Vx48(CnGpy?$#&BV|y`TtANr#^-@>Q3L^RTvRlXL>gn|a zS_rXBzKB(NQ$qs$@@T01%E-n>`59?B_7f-GD0c6(?{2r3de=#n0Cs%{3Q2JK8$0{I zN|-NHsyU?zW>D7L-M@FYg{M~(Q(YA~hSyZyjE{);`t6(4!tj;!i>pzyznF|;p$CBE z6qij}$t!5v4+CL6nlyz4tVo0u+rU6ez+7v&;;ZhfEF*2b2XyuIt30o7bAP^dB{?~H za;UK#6&^&y{P}uDKA`LEl)L@9*mHSePAe zxnR)k`o|@sp)qr~dbt-=$XLa-zE|0F8=t@sLEcEDe^z`ik~UIpgH)w$5Z(|dLW5*&z8~E@3rywQ z*Az+tX_uH)UqK@zEk+?vsqI*WT^n5PHI+?$;$=%NFKDJdzg#2Vn31p14J z_v&EX&LCkXFS`}$i8ropw@Z1)kO(x@r|f*kLk{JHw%dxbE;1Zs(XwYrJNF5^LB_sN zzviYw7{7DCX5J;QKweqddQ8ymfPf()U~T!ls;a?_>QKhfpNsd&MN#8L0cU%$h#=Gu zVnFS)iOFSO$Xt1paM$idS{{m)#hsBwSy0mZda@T57Ca%}B_t(n0$fxh#Fm1tlzBaa zc9GCxW1g-pj0b`aH7=DDt4e$RDJ;xX?CwTvDbC|^XL3u8Qhqg z*)ZQ|5}q*`=m^AysCoI=KoJF5JO)9;1{x+|XEDfX%NpObtBHK188tJL%XFEZ$b0oF z1B&a+<1p2Kx(%a4osyvR()`>^rQr_fkoEbKvn0D6fo>(c2g~nWF}T#MEHBX7md+M> zRGO9V3yxcR6wmpZ45gK&GWBqP-=-LZxQ-u>SABL8_G(`J!bxCT`azq9y@998oXynL z3(PBiwl3ZO>AJh-iic;s{Q?wrDAK@aT&87E!VBIeQidS=GRHPM?kY%1PAV)l zGJgYqB*PUmXZFpwZu9Dtw$&zjxOwsSZ?DR#s?2ciz`p)c$CTwi4Gi)OiYpzjg0M%G zno+{A|HR^C=RtGn%UbMBU+90dt>65<1OcxN5+5e(y^g-V_UWW2pmkgIIv)kKSzR4i zorstiZl)^_KkPj^yrw_fz2ygbU37GJOs~VOqQ0~1T4#<$p+%0lZh6$y)DTJwF}g5` zOX`#3;oQlPtVfQRn3}#>xPFw5x*~vB9I!KIm9jn>WF=}*$vp&5dgTH^5()_ksho0Dm*FVD95$-6JaHuI^GlFK#e#_1`Y!IrVb=l!vk3b> z3XdL4M5BP^&2C;dtYYBf;{(Y2_}#FB)RyaYOm+J+weZO&Q=sD&13v1R)7uMejRE`MlH>w)}77BWM75eMn zUI?1{3k3@2Z@nH5mwbkVlTfDI%+VT|w~Fjn%;jTi((eR~OnaRbVK*Py`_J zC%1{qVDs2Q2iQ+TqgdxmmlpNcDI#wktWSmC>YJ7I^-=eQUn4dC#L7EVwWXzg*xIu= z!pg_{zqen3Vt7PZpE<1IroM}XLCvcAiz+>DlvH{RzK0>y=Qys|A@51qvSL1R;_&Vv6(c7BMmgfL<1`FwV&i+Qwy@6r*RrZ+yHO~UhmHm1bkbKf^%FS3$f-<6qfDR_f!mGxVB?K&#r zUSZxK?I2)NVpJI9F>(EUpv0I|^m3tn%Yxq>+|rLw~4GO;+4)0wbaw)2l~Wgj7l1DW9XCFw%!BZZ(~h*7JT^e(l4E z_C8t==5`qkgjg~(xiLRB=J*dcS3S^t(fKf_^)NaFjk=N((FvM~U_y(%Rh04B8AY4tQ)nRcML&?h3}P)fH3HC-Ct{UFA(ev`+=RNzrc!XW{Uvs>Q{HV@=fUYgY(mRR z=oNgi{;G~&z`>G{nZ^xoSQkA7*f^ojtzvENY}4&6QttUkMfm7b@BX`wg7;nM9_|DI z!HM-0ZIE(tzettA%K{@;!?E?sfHo=5A=x-~*VSsn`-Fn9lK~G-^1nXtX*71$+DfPW zVw%_~{XFXNMfy&CwY)!Xysh7lU_1d4l{y!tzkm16$K9N>Es)i-UK_dznS!D7jb56I z0$!dNOO5loY@kc>-t~6dS9a%7lh+25k{WUXKj0tz*b%0gg$?Q860L&CLM^ zhCG%~q)gLc{3Z%<4c2(ttf)aCI~P|n&<~phXcZ40JkaRbpF>tYfFAN%Dr%Ya*4GCY zExNtd?_zlk-xwu+^Hvvb|6Tn-I5&|)?p{Qm1C<%=C(lRH%Uiq5_LiBMnYBaMF&D6w zY+PKvt*~`;NK&KJ$(0q1fM0WIAc>UvFCu+I;E>N8aapRTVtC3$q5E@>rmG}4yrDcA z^%*YJ141Jm>m0-aOLk>YMMDBR{1?w>&@WD3M6_s0O&^V?@{{{~=_9=>LC_H9;B zr#^fi_?wI;jZ?$l^8oknU6j8c%PI8Zt*{si+u!!fDrR|aXTXx|-l!WC3V?@Nr<0flu@)FGqY3Y<#qHuYa52&G_?hCNcwSaP8VVhd)Y-Z^d)Q7fQ&>pUer?OPIadv(Gj$ZiG^VYbqholn}q?~); zPyOU1IVG&+%ad)F4%2#qXPb*YuhamNZ|Cuxyj-|87yXQbVn2ij`(T)yFTrLZT z*g=!g(j(_cr6mAKMi)IInj{x4O(OU0+}+W&>otqSS^$akLv0G39I)|}ZYLIjekiz> zwt(wXJ_~za`x`lv3%eR)VJF#G{0?i*9_>cU)7UoYE-MIPUM(>P72Kz4h73%}+AyaV#w&#lV4;d`cG z8<`iTw^at31O0?jCzSiRPUE}W(v~Ai*!JF3lq3h)^)ZzJU`qBh0o~$#`ki_b&>9h= zVZXpB^aQlC)T=uivqVA5;~Zx$It6pu(>t%CWI@EdoY$pSbX}5Usx?Pu^iV9b3PE`g z($~%6ln$goYRid{6pD(9-T~_wdmW{JVB&03Q`HZ7)Gn57-zFAKWYl z0P0$|gN02lyX1Bn+|h*WZFOKl5fN~_BVuUf&_Hdil8Kd73h3hcimQp8G_h47;8N8~ zkuj9d((^gAXz2|x0M$j3`B zuE=`LUsrSeBXlf^(7;VHumnBad2yban(SFRrL!*bf5p4+Y0+SC^c%TyoDUSER;A?$ z-KPwFac#a9G+-e2A5*i=-3UPTK2Sgjw{r))OLTa}Wc%-1fLEc}Y+!rfa7A?8uPQuO z*AxRB0s5c_dMf!41I{!Fb%~x^iDSbXau7l4IbmwPlku7X780O70T+i8K~}xp7r~=N z(m|31&=fzMVwW$I-zPf&6@uExzISh3gOM;+Bl2_^ z?f1OhzvI;xi$r;k!wr9(J9myTLbC!+BA}p-&760E^DhWeb{x71@cdLRz7KyN3xmPH z0g9s47oD%?N9#uWHqG`XtP6sgtS{kZ(W)JsCICd43gqrJnT zd-Hh_AAba5;OU;n4zdLN3BK=W&ks1G1c92Cm6Z(1y@7u2G)VqK3mn{l_ZqU`;L`G# zfuBHDcCMg&D>dNA7s<5j_?~sk^YQ@t?3HBOia@7-P2CF)jpVa5skxeE_kXO!e?8Ryp%ZccH`@QL!2jA6nAxSU*-9q7 Tw9+Oa@N@Z+o_c}mjr;!(%eG%V literal 10550 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 f{C~0ni*xP6GL~5sA!Mi&@}M$o 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 V#`mLh3vj;3Wi?&Z;)~WH{{ip}m>>WE literal 8605 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 I`SFwg0s2}q0ssI2 literal 20752 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℞*{XV#KP@9; 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 Date: Thu, 20 Jun 2024 12:30:21 +1000 Subject: [PATCH 10/13] Reduce duplicate code --- src/core/symbology/qgssymbollayer.cpp | 61 ++++++++++++--------------- 1 file changed, 28 insertions(+), 33 deletions(-) diff --git a/src/core/symbology/qgssymbollayer.cpp b/src/core/symbology/qgssymbollayer.cpp index 1f1b029e7a91..87eafd7b2952 100644 --- a/src/core/symbology/qgssymbollayer.cpp +++ b/src/core/symbology/qgssymbollayer.cpp @@ -953,14 +953,15 @@ double QgsMarkerSymbolLayer::dxfAngle( QgsSymbolRenderContext &context ) const return angle; } -void QgsSymbolLayer::prepareMasks( const QgsSymbolRenderContext &context ) +QPainterPath generateClipPath( const QgsRenderContext &renderContext, const QString &id, const QRectF *rect, bool &foundGeometries ) { - mClipPath.clear(); - - const QgsRenderContext &renderContext = context.renderContext(); - const QVector clipGeometries = renderContext.symbolLayerClipGeometries( id() ); + foundGeometries = false; + const QVector clipGeometries = rect + ? QgsSymbolLayerUtils::collectSymbolLayerClipGeometries( renderContext, id, *rect ) + : renderContext.symbolLayerClipGeometries( id ); if ( !clipGeometries.empty() ) { + foundGeometries = true; QgsGeometry mergedGeom = QgsGeometry::unaryUnion( clipGeometries ); if ( renderContext.maskSettings().simplifyTolerance() > 0 ) { @@ -975,15 +976,29 @@ void QgsSymbolLayer::prepareMasks( const QgsSymbolRenderContext &context ) #endif if ( !mergedGeom.isEmpty() ) { - const QgsGeometry exterior = QgsGeometry::fromRect( + const QgsGeometry exterior = rect + ? QgsGeometry::fromRect( *rect ) + : QgsGeometry::fromRect( QgsRectangle( 0, 0, renderContext.outputSize().width(), renderContext.outputSize().height() ) ); const QgsGeometry maskGeom = exterior.difference( mergedGeom ); - mClipPath = maskGeom.constGet()->asQPainterPath(); + if ( !maskGeom.isNull() ) + { + return maskGeom.constGet()->asQPainterPath(); + } } } - else + return QPainterPath(); +} + +void QgsSymbolLayer::prepareMasks( const QgsSymbolRenderContext &context ) +{ + const QgsRenderContext &renderContext = context.renderContext(); + + bool foundGeometries = false; + mClipPath = generateClipPath( renderContext, id(), nullptr, foundGeometries ); + if ( !foundGeometries ) { const QList clipPaths = renderContext.symbolLayerClipPaths( id() ); if ( !clipPaths.isEmpty() ) @@ -1017,32 +1032,12 @@ bool QgsSymbolLayer::installMasks( QgsRenderContext &context, bool recursive, co else if ( rect.isValid() ) { // find just the clip geometries within the area the symbol layer will be drawn over - const QVector clipGeometries = QgsSymbolLayerUtils::collectSymbolLayerClipGeometries( context, id(), rect ); - if ( !clipGeometries.empty() ) + bool foundGeometries = false; + const QPainterPath clipPath = generateClipPath( context, id(), &rect, foundGeometries ); + if ( !clipPath.isEmpty() ) { - QgsGeometry mergedGeom = QgsGeometry::unaryUnion( clipGeometries ); - if ( context.maskSettings().simplifyTolerance() > 0 ) - { - QgsGeos geos( mergedGeom.constGet() ); - mergedGeom = QgsGeometry( geos.simplify( context.maskSettings().simplifyTolerance() ) ); - } -#if GEOS_VERSION_MAJOR==3 && GEOS_VERSION_MINOR<10 - // structure would be better, but too old GEOS - mergedGeom = mergedGeom.makeValid( Qgis::MakeValidMethod::Linework ); -#else - mergedGeom = mergedGeom.makeValid( Qgis::MakeValidMethod::Structure ); -#endif - if ( !mergedGeom.isEmpty() ) - { - const QgsGeometry exterior = QgsGeometry::fromRect( - rect ); - const QgsGeometry maskGeom = exterior.difference( mergedGeom ); - if ( !maskGeom.isNull() ) - { - context.painter()->setClipPath( maskGeom.constGet()->asQPainterPath(), context.painter()->clipPath().isEmpty() ? Qt::ReplaceClip : Qt::IntersectClip ); - res = true; - } - } + context.painter()->setClipPath( clipPath, context.painter()->clipPath().isEmpty() ? Qt::ReplaceClip : Qt::IntersectClip ); + res = true; } } From 0ecab869132c1e87d703a888c495c8ab889dc45d Mon Sep 17 00:00:00 2001 From: Nyall Dawson Date: Fri, 21 Jun 2024 08:00:55 +1000 Subject: [PATCH 11/13] Fix check for sub symbol --- src/core/symbology/qgssymbol.cpp | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/src/core/symbology/qgssymbol.cpp b/src/core/symbology/qgssymbol.cpp index 3760b8850b91..d93059ee80c0 100644 --- a/src/core/symbology/qgssymbol.cpp +++ b/src/core/symbology/qgssymbol.cpp @@ -1654,6 +1654,9 @@ void QgsSymbol::renderFeature( const QgsFeature &feature, QgsRenderContext &cont if ( needsExpressionContext ) mSymbolRenderContext->expressionContextScope()->addVariable( QgsExpressionContextScope::StaticVariable( QStringLiteral( "symbol_layer_count" ), mLayers.count(), true ) ); + const bool maskGeometriesDisabledForSymbol = context.testFlag( Qgis::RenderContextFlag::AlwaysUseGlobalMasks ) + && !mRenderHints.testFlag( Qgis::SymbolRenderHint::IsSymbolLayerSubSymbol ); + for ( const int symbolLayerIndex : layers ) { QgsSymbolLayer *symbolLayer = mLayers.value( symbolLayerIndex ); @@ -1666,7 +1669,7 @@ void QgsSymbol::renderFeature( const QgsFeature &feature, QgsRenderContext &cont // if this symbol layer has associated clip masks, we need to render it to a QPicture first so that we can // determine the actual rendered bounds of the symbol. We'll then use that to retrieve the clip masks we need // to apply when painting the symbol via this QPicture. - const bool hasClipGeometries = !context.testFlag( Qgis::RenderContextFlag::AlwaysUseGlobalMasks ) + const bool hasClipGeometries = !maskGeometriesDisabledForSymbol && symbolLayer->flags().testFlag( Qgis::SymbolLayerFlag::CanCalculateMaskGeometryPerFeature ) && context.symbolLayerHasClipGeometries( symbolLayer->id() ); QPainter *previousPainter = nullptr; From e09d8df402b34e5e7ad7ed8395b1d6593d4a1071 Mon Sep 17 00:00:00 2001 From: Nyall Dawson Date: Fri, 21 Jun 2024 09:31:53 +1000 Subject: [PATCH 12/13] Update src/core/symbology/qgssymbol.cpp --- src/core/symbology/qgssymbol.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/core/symbology/qgssymbol.cpp b/src/core/symbology/qgssymbol.cpp index d93059ee80c0..fa46fb84978f 100644 --- a/src/core/symbology/qgssymbol.cpp +++ b/src/core/symbology/qgssymbol.cpp @@ -1655,7 +1655,7 @@ void QgsSymbol::renderFeature( const QgsFeature &feature, QgsRenderContext &cont mSymbolRenderContext->expressionContextScope()->addVariable( QgsExpressionContextScope::StaticVariable( QStringLiteral( "symbol_layer_count" ), mLayers.count(), true ) ); const bool maskGeometriesDisabledForSymbol = context.testFlag( Qgis::RenderContextFlag::AlwaysUseGlobalMasks ) - && !mRenderHints.testFlag( Qgis::SymbolRenderHint::IsSymbolLayerSubSymbol ); + && !mRenderHints.testFlag( Qgis::SymbolRenderHint::IsSymbolLayerSubSymbol ); for ( const int symbolLayerIndex : layers ) { From 6d50d6f17ba1f12ee10f4aff3360173752b791d7 Mon Sep 17 00:00:00 2001 From: Nyall Dawson Date: Fri, 21 Jun 2024 09:34:15 +1000 Subject: [PATCH 13/13] Update src/core/symbology/qgssymbol.cpp --- src/core/symbology/qgssymbol.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/core/symbology/qgssymbol.cpp b/src/core/symbology/qgssymbol.cpp index fa46fb84978f..7efebe820228 100644 --- a/src/core/symbology/qgssymbol.cpp +++ b/src/core/symbology/qgssymbol.cpp @@ -1655,7 +1655,7 @@ void QgsSymbol::renderFeature( const QgsFeature &feature, QgsRenderContext &cont mSymbolRenderContext->expressionContextScope()->addVariable( QgsExpressionContextScope::StaticVariable( QStringLiteral( "symbol_layer_count" ), mLayers.count(), true ) ); const bool maskGeometriesDisabledForSymbol = context.testFlag( Qgis::RenderContextFlag::AlwaysUseGlobalMasks ) - && !mRenderHints.testFlag( Qgis::SymbolRenderHint::IsSymbolLayerSubSymbol ); + && !mRenderHints.testFlag( Qgis::SymbolRenderHint::IsSymbolLayerSubSymbol ); for ( const int symbolLayerIndex : layers ) {