From 23396b7c864d00fc164db8c80d704a1ffc430ac1 Mon Sep 17 00:00:00 2001 From: Nyall Dawson Date: Wed, 27 May 2020 15:32:27 +1000 Subject: [PATCH] [symbology] Don't force rasterized output when exporting point pattern fills This avoids the force conversion to a raster based pattern which currently occurs when exporting maps/layouts to a vector format (e.g. PDF). The raster pattern results in considerable quality loss, and the tiling edges of the raster brush can sometimes be seen in outputs. Additionally, fixes render corrupt when marker subsymbols have data defined properties which affect the marker shape, such as data defined rotation or sizes Refs #16100 (still needs fixing for line fill symbols) --- .../symbology/qgsfillsymbollayer.sip.in | 3 +- src/core/symbology/qgsfillsymbollayer.cpp | 149 +++++++++++++++++- src/core/symbology/qgsfillsymbollayer.h | 4 +- src/core/symbology/qgssymbollayer.cpp | 2 + .../core/testqgspointpatternfillsymbol.cpp | 107 ++++++++++++- .../expected_datadefined_subsymbol.png | Bin 641536 -> 641520 bytes .../expected_datadefined_subsymbol_mask.png | Bin 5891 -> 0 bytes ...xpected_symbol_pointfill_offset_vector.png | Bin 0 -> 641520 bytes .../expected_symbol_pointfill_vector.png | Bin 0 -> 641520 bytes 9 files changed, 256 insertions(+), 9 deletions(-) delete mode 100644 tests/testdata/control_images/symbol_pointpatternfill/expected_datadefined_subsymbol/expected_datadefined_subsymbol_mask.png create mode 100644 tests/testdata/control_images/symbol_pointpatternfill/expected_symbol_pointfill_offset_vector/expected_symbol_pointfill_offset_vector.png create mode 100644 tests/testdata/control_images/symbol_pointpatternfill/expected_symbol_pointfill_vector/expected_symbol_pointfill_vector.png diff --git a/python/core/auto_generated/symbology/qgsfillsymbollayer.sip.in b/python/core/auto_generated/symbology/qgsfillsymbollayer.sip.in index 9ff70c8307f7..c6e0d876908a 100644 --- a/python/core/auto_generated/symbology/qgsfillsymbollayer.sip.in +++ b/python/core/auto_generated/symbology/qgsfillsymbollayer.sip.in @@ -1615,9 +1615,10 @@ Caller takes ownership of the returned symbol layer. virtual void startRender( QgsSymbolRenderContext &context ); - virtual void stopRender( QgsSymbolRenderContext &context ); + virtual void renderPolygon( const QPolygonF &points, const QVector *rings, QgsSymbolRenderContext &context ); + virtual QgsStringMap properties() const; diff --git a/src/core/symbology/qgsfillsymbollayer.cpp b/src/core/symbology/qgsfillsymbollayer.cpp index 3ba26dba9986..0316050bc8a3 100644 --- a/src/core/symbology/qgsfillsymbollayer.cpp +++ b/src/core/symbology/qgsfillsymbollayer.cpp @@ -3276,7 +3276,19 @@ void QgsPointPatternFillSymbolLayer::applyPattern( const QgsSymbolRenderContext void QgsPointPatternFillSymbolLayer::startRender( QgsSymbolRenderContext &context ) { - applyPattern( context, mBrush, mDistanceX, mDistanceY, mDisplacementX, mDisplacementY, mOffsetX, mOffsetY ); + // if we are using a vector based output, we need to render points as vectors + // (OR if the marker has data defined symbology, in which case we need to evaluate this point-by-point) + mRenderUsingMarkers = context.renderContext().forceVectorOutput() || mMarkerSymbol->hasDataDefinedProperties(); + + if ( mRenderUsingMarkers ) + { + mMarkerSymbol->startRender( context.renderContext() ); + } + else + { + // optimised render for screen only, use image based brush + applyPattern( context, mBrush, mDistanceX, mDistanceY, mDisplacementX, mDisplacementY, mOffsetX, mOffsetY ); + } if ( mStroke ) { @@ -3286,12 +3298,142 @@ void QgsPointPatternFillSymbolLayer::startRender( QgsSymbolRenderContext &contex void QgsPointPatternFillSymbolLayer::stopRender( QgsSymbolRenderContext &context ) { + if ( mRenderUsingMarkers ) + { + mMarkerSymbol->stopRender( context.renderContext() ); + } + if ( mStroke ) { mStroke->stopRender( context.renderContext() ); } } +void QgsPointPatternFillSymbolLayer::renderPolygon( const QPolygonF &points, const QVector *rings, QgsSymbolRenderContext &context ) +{ + if ( !mRenderUsingMarkers ) + { + // use image based brush for speed + QgsImageFillSymbolLayer::renderPolygon( points, rings, context ); + return; + } + + // vector based output - so draw dot by dot! + QPainter *p = context.renderContext().painter(); + if ( !p ) + { + return; + } + + double distanceX = mDistanceX; + if ( mDataDefinedProperties.isActive( QgsSymbolLayer::PropertyDistanceX ) ) + { + context.setOriginalValueVariable( mDistanceX ); + distanceX = mDataDefinedProperties.valueAsDouble( QgsSymbolLayer::PropertyDistanceX, context.renderContext().expressionContext(), mDistanceX ); + } + const double width = context.renderContext().convertToPainterUnits( distanceX, mDistanceXUnit, mDistanceXMapUnitScale ); + + double distanceY = mDistanceY; + if ( mDataDefinedProperties.isActive( QgsSymbolLayer::PropertyDistanceY ) ) + { + context.setOriginalValueVariable( mDistanceY ); + distanceY = mDataDefinedProperties.valueAsDouble( QgsSymbolLayer::PropertyDistanceY, context.renderContext().expressionContext(), mDistanceY ); + } + const double height = context.renderContext().convertToPainterUnits( distanceY, mDistanceYUnit, mDistanceYMapUnitScale ); + + double offsetX = mOffsetX; + if ( mDataDefinedProperties.isActive( QgsSymbolLayer::PropertyOffsetX ) ) + { + context.setOriginalValueVariable( mOffsetX ); + offsetX = mDataDefinedProperties.valueAsDouble( QgsSymbolLayer::PropertyOffsetX, context.renderContext().expressionContext(), mOffsetX ); + } + const double widthOffset = std::fmod( context.renderContext().convertToPainterUnits( offsetX, mOffsetXUnit, mOffsetXMapUnitScale ), width ); + + double offsetY = mOffsetY; + if ( mDataDefinedProperties.isActive( QgsSymbolLayer::PropertyOffsetY ) ) + { + context.setOriginalValueVariable( mOffsetY ); + offsetY = mDataDefinedProperties.valueAsDouble( QgsSymbolLayer::PropertyOffsetY, context.renderContext().expressionContext(), mOffsetY ); + } + const double heightOffset = std::fmod( context.renderContext().convertToPainterUnits( offsetY, mOffsetYUnit, mOffsetYMapUnitScale ), height ); + + double displacementX = mDisplacementX; + if ( mDataDefinedProperties.isActive( QgsSymbolLayer::PropertyDisplacementX ) ) + { + context.setOriginalValueVariable( mDisplacementX ); + displacementX = mDataDefinedProperties.valueAsDouble( QgsSymbolLayer::PropertyDisplacementX, context.renderContext().expressionContext(), mDisplacementX ); + } + const double displacementPixelX = context.renderContext().convertToPainterUnits( displacementX, mDisplacementXUnit, mDisplacementXMapUnitScale ); + + double displacementY = mDisplacementY; + if ( mDataDefinedProperties.isActive( QgsSymbolLayer::PropertyDisplacementY ) ) + { + context.setOriginalValueVariable( mDisplacementY ); + displacementY = mDataDefinedProperties.valueAsDouble( QgsSymbolLayer::PropertyDisplacementY, context.renderContext().expressionContext(), mDisplacementY ); + } + const double displacementPixelY = context.renderContext().convertToPainterUnits( displacementY, mDisplacementYUnit, mDisplacementYMapUnitScale ); + + p->setPen( QPen( Qt::NoPen ) ); + + if ( context.selected() ) + { + QColor selColor = context.renderContext().selectionColor(); + p->setBrush( QBrush( selColor ) ); + _renderPolygon( p, points, rings, context ); + } + + p->save(); + + QPainterPath path; + path.addPolygon( points ); + if ( rings ) + { + for ( const QPolygonF &ring : *rings ) + { + path.addPolygon( ring ); + } + } + p->setClipPath( path, Qt::IntersectClip ); + + const double left = points.boundingRect().left(); + const double top = points.boundingRect().top(); + const double right = points.boundingRect().right(); + const double bottom = points.boundingRect().bottom(); + + bool alternateColumn = false; + for ( double currentX = ( std::floor( left / width ) - 2 ) * width; currentX <= right + 2 * width; currentX += width, alternateColumn = !alternateColumn ) + { + bool alternateRow = false; + const double columnX = currentX + widthOffset; + for ( double currentY = ( std::floor( top / height ) - 2 ) * height; currentY <= bottom + 2 * height; currentY += height, alternateRow = !alternateRow ) + { + double y = currentY + heightOffset; + double x = columnX; + if ( alternateRow ) + x += displacementPixelX; + + if ( !alternateColumn ) + y -= displacementPixelY; + + mMarkerSymbol->renderPoint( QPointF( x, y ), context.feature(), context.renderContext() ); + } + } + + p->restore(); + + if ( mStroke ) + { + mStroke->renderPolyline( points, context.feature(), context.renderContext(), -1, SELECT_FILL_BORDER && context.selected() ); + if ( rings ) + { + for ( auto ringIt = rings->constBegin(); ringIt != rings->constEnd(); ++ringIt ) + { + mStroke->renderPolyline( *ringIt, context.feature(), context.renderContext(), -1, SELECT_FILL_BORDER && context.selected() ); + } + } + } +} + QgsStringMap QgsPointPatternFillSymbolLayer::properties() const { QgsStringMap map; @@ -3395,6 +3537,7 @@ void QgsPointPatternFillSymbolLayer::applyDataDefinedSettings( QgsSymbolRenderCo { if ( !mDataDefinedProperties.isActive( QgsSymbolLayer::PropertyDistanceX ) && !mDataDefinedProperties.isActive( QgsSymbolLayer::PropertyDistanceY ) && !mDataDefinedProperties.isActive( QgsSymbolLayer::PropertyDisplacementX ) && !mDataDefinedProperties.isActive( QgsSymbolLayer::PropertyDisplacementY ) + && !mDataDefinedProperties.isActive( QgsSymbolLayer::PropertyOffsetX ) && !mDataDefinedProperties.isActive( QgsSymbolLayer::PropertyOffsetY ) && ( !mMarkerSymbol || !mMarkerSymbol->hasDataDefinedProperties() ) ) { return; @@ -3427,13 +3570,13 @@ void QgsPointPatternFillSymbolLayer::applyDataDefinedSettings( QgsSymbolRenderCo double offsetX = mOffsetX; if ( mDataDefinedProperties.isActive( QgsSymbolLayer::PropertyOffsetX ) ) { - context.setOriginalValueVariable( mDisplacementX ); + context.setOriginalValueVariable( mOffsetX ); offsetX = mDataDefinedProperties.valueAsDouble( QgsSymbolLayer::PropertyOffsetX, context.renderContext().expressionContext(), mOffsetX ); } double offsetY = mOffsetY; if ( mDataDefinedProperties.isActive( QgsSymbolLayer::PropertyOffsetY ) ) { - context.setOriginalValueVariable( mDisplacementY ); + context.setOriginalValueVariable( mOffsetY ); offsetY = mDataDefinedProperties.valueAsDouble( QgsSymbolLayer::PropertyOffsetY, context.renderContext().expressionContext(), mOffsetY ); } applyPattern( context, mBrush, distanceX, distanceY, displacementX, displacementY, offsetX, offsetY ); diff --git a/src/core/symbology/qgsfillsymbollayer.h b/src/core/symbology/qgsfillsymbollayer.h index af0e08d915f4..1a5a74c02504 100644 --- a/src/core/symbology/qgsfillsymbollayer.h +++ b/src/core/symbology/qgsfillsymbollayer.h @@ -1478,8 +1478,8 @@ class CORE_EXPORT QgsPointPatternFillSymbolLayer: public QgsImageFillSymbolLayer QString layerType() const override; void startRender( QgsSymbolRenderContext &context ) override; - void stopRender( QgsSymbolRenderContext &context ) override; + void renderPolygon( const QPolygonF &points, const QVector *rings, QgsSymbolRenderContext &context ) override; QgsStringMap properties() const override; @@ -1720,6 +1720,8 @@ class CORE_EXPORT QgsPointPatternFillSymbolLayer: public QgsImageFillSymbolLayer void applyPattern( const QgsSymbolRenderContext &context, QBrush &brush, double distanceX, double distanceY, double displacementX, double displacementY, double offsetX, double offsetY ); + + bool mRenderUsingMarkers = false; }; /** diff --git a/src/core/symbology/qgssymbollayer.cpp b/src/core/symbology/qgssymbollayer.cpp index 03211f339c01..31cc8ddd1d64 100644 --- a/src/core/symbology/qgssymbollayer.cpp +++ b/src/core/symbology/qgssymbollayer.cpp @@ -84,6 +84,8 @@ void QgsSymbolLayer::initPropertyDefinitions() { QgsSymbolLayer::PropertyDistanceY, QgsPropertyDefinition( "distanceY", QObject::tr( "Vertical distance between markers" ), QgsPropertyDefinition::DoublePositive, origin )}, { QgsSymbolLayer::PropertyDisplacementX, QgsPropertyDefinition( "displacementX", QObject::tr( "Horizontal displacement between rows" ), QgsPropertyDefinition::DoublePositive, origin )}, { QgsSymbolLayer::PropertyDisplacementY, QgsPropertyDefinition( "displacementY", QObject::tr( "Vertical displacement between columns" ), QgsPropertyDefinition::DoublePositive, origin )}, + { QgsSymbolLayer::PropertyOffsetX, QgsPropertyDefinition( "offsetX", QObject::tr( "Horizontal offset" ), QgsPropertyDefinition::Double, origin )}, + { QgsSymbolLayer::PropertyOffsetY, QgsPropertyDefinition( "offsetY", QObject::tr( "Vertical offset" ), QgsPropertyDefinition::Double, origin )}, { QgsSymbolLayer::PropertyOpacity, QgsPropertyDefinition( "alpha", QObject::tr( "Opacity" ), QgsPropertyDefinition::Opacity, origin )}, { QgsSymbolLayer::PropertyCustomDash, QgsPropertyDefinition( "customDash", QgsPropertyDefinition::DataTypeString, QObject::tr( "Custom dash pattern" ), QObject::tr( "[;] e.g. '8;2;1;2'" ), origin )}, { QgsSymbolLayer::PropertyCapStyle, QgsPropertyDefinition( "capStyle", QObject::tr( "Line cap style" ), QgsPropertyDefinition::CapStyle, origin )}, diff --git a/tests/src/core/testqgspointpatternfillsymbol.cpp b/tests/src/core/testqgspointpatternfillsymbol.cpp index 994ce5e4f4e0..46bdcc8b5b43 100644 --- a/tests/src/core/testqgspointpatternfillsymbol.cpp +++ b/tests/src/core/testqgspointpatternfillsymbol.cpp @@ -20,6 +20,7 @@ #include #include #include +#include //qgis includes... #include @@ -35,6 +36,7 @@ //qgis test includes #include "qgsrenderchecker.h" +#include "qgsmaprenderercustompainterjob.h" /** * \ingroup UnitTests @@ -54,9 +56,12 @@ class TestQgsPointPatternFillSymbol : public QObject void cleanup() {} // will be called after every testfunction. void pointPatternFillSymbol(); + void pointPatternFillSymbolVector(); void offsettedPointPatternFillSymbol(); + void offsettedPointPatternFillSymbolVector(); void dataDefinedSubSymbol(); void zeroSpacedPointPatternFillSymbol(); + void zeroSpacedPointPatternFillSymbolVector(); private: bool mTestHasError = false ; @@ -107,10 +112,6 @@ void TestQgsPointPatternFillSymbol::initTestCase() mSymbolRenderer = new QgsSingleSymbolRenderer( mFillSymbol ); mpPolysLayer->setRenderer( mSymbolRenderer ); - // We only need maprender instead of mapcanvas - // since maprender does not require a qui - // and is more light weight - // mMapSettings.setLayers( QList() << mpPolysLayer ); mReport += QLatin1String( "

Point Pattern Fill Tests

\n" ); @@ -144,6 +145,52 @@ void TestQgsPointPatternFillSymbol::pointPatternFillSymbol() QVERIFY( imageCheck( "symbol_pointfill" ) ); } +void TestQgsPointPatternFillSymbol::pointPatternFillSymbolVector() +{ + mReport += QLatin1String( "

Point pattern fill symbol renderer test

\n" ); + + QgsStringMap properties; + properties.insert( QStringLiteral( "color" ), QStringLiteral( "0,0,0,255" ) ); + properties.insert( QStringLiteral( "outline_color" ), QStringLiteral( "#000000" ) ); + properties.insert( QStringLiteral( "name" ), QStringLiteral( "circle" ) ); + properties.insert( QStringLiteral( "size" ), QStringLiteral( "5.0" ) ); + QgsMarkerSymbol *pointSymbol = QgsMarkerSymbol::createSimple( properties ); + + mPointPatternFill->setSubSymbol( pointSymbol ); + mMapSettings.setFlag( QgsMapSettings::ForceVectorOutput, true ); + bool res = imageCheck( "symbol_pointfill_vector" ); + mMapSettings.setFlag( QgsMapSettings::ForceVectorOutput, false ); + QVERIFY( res ); + + // also confirm that output is indeed vector! + QSvgGenerator generator; + generator.setResolution( mMapSettings.outputDpi() ); + generator.setSize( QSize( 100, 100 ) ); + generator.setViewBox( QRect( 0, 0, 100, 100 ) ); + QBuffer buffer; + generator.setOutputDevice( &buffer ); + QPainter p; + p.begin( &generator ); + + mMapSettings.setFlag( QgsMapSettings::ForceVectorOutput, true ); + mMapSettings.setOutputSize( QSize( 100, 100 ) ); + mMapSettings.setExtent( mpPolysLayer->extent() ); + mMapSettings.setOutputDpi( 96 ); + + properties.insert( QStringLiteral( "color" ), QStringLiteral( "255,0,0,255" ) ); + pointSymbol = QgsMarkerSymbol::createSimple( properties ); + mPointPatternFill->setSubSymbol( pointSymbol ); + + QgsMapRendererCustomPainterJob job( mMapSettings, &p ); + job.start(); + job.waitForFinished(); + p.end(); + mMapSettings.setFlag( QgsMapSettings::ForceVectorOutput, false ); + + QByteArray ba = buffer.data(); + QVERIFY( ba.contains( "fill=\"#ff0000\"" ) ); +} + void TestQgsPointPatternFillSymbol::offsettedPointPatternFillSymbol() { mReport += QLatin1String( "

Offsetted point pattern fill symbol renderer test

\n" ); @@ -171,6 +218,35 @@ void TestQgsPointPatternFillSymbol::offsettedPointPatternFillSymbol() mPointPatternFill->setOffsetY( 0 ); } +void TestQgsPointPatternFillSymbol::offsettedPointPatternFillSymbolVector() +{ + mReport += QLatin1String( "

Offsetted point pattern fill symbol renderer test

\n" ); + + QgsStringMap properties; + properties.insert( QStringLiteral( "color" ), QStringLiteral( "0,0,0,255" ) ); + properties.insert( QStringLiteral( "outline_color" ), QStringLiteral( "#000000" ) ); + properties.insert( QStringLiteral( "name" ), QStringLiteral( "circle" ) ); + properties.insert( QStringLiteral( "size" ), QStringLiteral( "5.0" ) ); + QgsMarkerSymbol *pointSymbol = QgsMarkerSymbol::createSimple( properties ); + + mPointPatternFill->setSubSymbol( pointSymbol ); + mPointPatternFill->setDistanceX( 15 ); + mPointPatternFill->setDistanceY( 15 ); + mPointPatternFill->setOffsetX( 4 ); + mPointPatternFill->setOffsetY( 4 ); + QVERIFY( imageCheck( "symbol_pointfill_offset" ) ); + + // With offset values greater than the pattern size (i.e. distance * 2 ), offsets values are modulos of offset against distance + mPointPatternFill->setOffsetX( 19 ); + mPointPatternFill->setOffsetY( 19 ); + mMapSettings.setFlag( QgsMapSettings::ForceVectorOutput, true ); + bool res = imageCheck( "symbol_pointfill_offset_vector" ); + mMapSettings.setFlag( QgsMapSettings::ForceVectorOutput, false ); + mPointPatternFill->setOffsetX( 0 ); + mPointPatternFill->setOffsetY( 0 ); + QVERIFY( res ); +} + void TestQgsPointPatternFillSymbol::dataDefinedSubSymbol() { mReport += QLatin1String( "

Point pattern symbol data defined sub symbol test

\n" ); @@ -182,6 +258,7 @@ void TestQgsPointPatternFillSymbol::dataDefinedSubSymbol() properties.insert( QStringLiteral( "size" ), QStringLiteral( "5.0" ) ); QgsMarkerSymbol *pointSymbol = QgsMarkerSymbol::createSimple( properties ); pointSymbol->symbolLayer( 0 )->setDataDefinedProperty( QgsSymbolLayer::PropertyFillColor, QgsProperty::fromExpression( QStringLiteral( "if(\"Name\" ='Lake','#ff0000','#ff00ff')" ) ) ); + pointSymbol->symbolLayer( 0 )->setDataDefinedProperty( QgsSymbolLayer::PropertySize, QgsProperty::fromExpression( QStringLiteral( "if(\"Name\" ='Lake',5,10)" ) ) ); mPointPatternFill->setSubSymbol( pointSymbol ); QVERIFY( imageCheck( "datadefined_subsymbol" ) ); } @@ -205,6 +282,28 @@ void TestQgsPointPatternFillSymbol::zeroSpacedPointPatternFillSymbol() QVERIFY( imageCheck( "pointfill_zero_space" ) ); } +void TestQgsPointPatternFillSymbol::zeroSpacedPointPatternFillSymbolVector() +{ + mReport += QLatin1String( "

Zero distance point pattern fill symbol renderer test

\n" ); + + QgsStringMap properties; + properties.insert( QStringLiteral( "color" ), QStringLiteral( "0,0,0,255" ) ); + properties.insert( QStringLiteral( "outline_color" ), QStringLiteral( "#000000" ) ); + properties.insert( QStringLiteral( "name" ), QStringLiteral( "circle" ) ); + properties.insert( QStringLiteral( "size" ), QStringLiteral( "5.0" ) ); + QgsMarkerSymbol *pointSymbol = QgsMarkerSymbol::createSimple( properties ); + + mPointPatternFill->setSubSymbol( pointSymbol ); + mPointPatternFill->setDistanceX( 0 ); + mPointPatternFill->setDistanceY( 15 ); + mPointPatternFill->setOffsetX( 4 ); + mPointPatternFill->setOffsetY( 4 ); + mMapSettings.setFlag( QgsMapSettings::ForceVectorOutput, true ); + bool res = imageCheck( "pointfill_zero_space" ); + mMapSettings.setFlag( QgsMapSettings::ForceVectorOutput, false ); + QVERIFY( res ); +} + // // Private helper functions not called directly by CTest // diff --git a/tests/testdata/control_images/symbol_pointpatternfill/expected_datadefined_subsymbol/expected_datadefined_subsymbol.png b/tests/testdata/control_images/symbol_pointpatternfill/expected_datadefined_subsymbol/expected_datadefined_subsymbol.png index dd780917cbb0dc8e13ce583b6054e09a5b896d12..00cb4a4d513d41201bf7830622abf23a2f6c2d08 100644 GIT binary patch delta 12794 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 UO1N6dT6xi_L-+Rk+YX)gf63_Dw*UYD delta 5192 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 tW|8mxq1~v1q&K4 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