diff --git a/src/core/symbology-ng/qgsinvertedpolygonrenderer.cpp b/src/core/symbology-ng/qgsinvertedpolygonrenderer.cpp index e401c15450c..f5dc616d04e 100644 --- a/src/core/symbology-ng/qgsinvertedpolygonrenderer.cpp +++ b/src/core/symbology-ng/qgsinvertedpolygonrenderer.cpp @@ -288,13 +288,13 @@ void QgsInvertedPolygonRenderer::stopRender( QgsRenderContext& context ) Q_FOREACH ( QgsGeometry* geom, cit.geometries ) { QgsMultiPolygon multi; - if (( geom->wkbType() == QGis::WKBPolygon ) || - ( geom->wkbType() == QGis::WKBPolygon25D ) ) + QgsWKBTypes::Type type = QgsWKBTypes::flatType( geom->geometry()->wkbType() ); + + if (( type == QgsWKBTypes::Polygon ) || ( type == QgsWKBTypes::CurvePolygon ) ) { multi.append( geom->asPolygon() ); } - else if (( geom->wkbType() == QGis::WKBMultiPolygon ) || - ( geom->wkbType() == QGis::WKBMultiPolygon25D ) ) + else if (( type == QgsWKBTypes::MultiPolygon ) || ( type == QgsWKBTypes::MultiSurface ) ) { multi = geom->asMultiPolygon(); } diff --git a/src/gui/symbology-ng/qgsinvertedpolygonrendererwidget.cpp b/src/gui/symbology-ng/qgsinvertedpolygonrendererwidget.cpp index 28590184557..2eb09a93ad2 100644 --- a/src/gui/symbology-ng/qgsinvertedpolygonrendererwidget.cpp +++ b/src/gui/symbology-ng/qgsinvertedpolygonrendererwidget.cpp @@ -34,11 +34,10 @@ QgsInvertedPolygonRendererWidget::QgsInvertedPolygonRendererWidget( QgsVectorLay return; } + QgsWKBTypes::Type type = QgsWKBTypes::singleType( QgsWKBTypes::flatType( QGis::fromOldWkbType( layer->wkbType() ) ) ); + // the renderer only applies to polygon vector layers - if ( layer->wkbType() != QGis::WKBPolygon && - layer->wkbType() != QGis::WKBPolygon25D && - layer->wkbType() != QGis::WKBMultiPolygon && - layer->wkbType() != QGis::WKBMultiPolygon25D ) + if ( type != QgsWKBTypes::Polygon && type != QgsWKBTypes::CurvePolygon ) { //setup blank dialog mRenderer.reset( nullptr ); diff --git a/tests/src/core/testqgsinvertedpolygonrenderer.cpp b/tests/src/core/testqgsinvertedpolygonrenderer.cpp index 8e7db507c4a..c253e82ea3e 100644 --- a/tests/src/core/testqgsinvertedpolygonrenderer.cpp +++ b/tests/src/core/testqgsinvertedpolygonrenderer.cpp @@ -51,10 +51,13 @@ class TestQgsInvertedPolygon : public QObject void graduatedSubRenderer(); void preprocess(); void projectionTest(); +#if defined(GDAL_VERSION_NUM) && GDAL_VERSION_MAJOR >= 2 + void curvedPolygons(); +#endif private: bool mTestHasError; - bool setQml( const QString& qmlFile ); + bool setQml( QgsVectorLayer* vlayer, const QString& qmlFile ); bool imageCheck( const QString& theType, const QgsRectangle* = 0 ); QgsMapSettings mMapSettings; QgsVectorLayer * mpPolysLayer; @@ -93,8 +96,7 @@ void TestQgsInvertedPolygon::initTestCase() mpPolysLayer->setSimplifyMethod( simplifyMethod ); // Register the layer with the registry - QgsMapLayerRegistry::instance()->addMapLayers( - QList() << mpPolysLayer ); + QgsMapLayerRegistry::instance()->addMapLayers( QList() << mpPolysLayer ); mMapSettings.setLayers( QStringList() << mpPolysLayer->id() ); mReport += "

Inverted Polygon Renderer Tests

\n"; @@ -117,14 +119,14 @@ void TestQgsInvertedPolygon::cleanupTestCase() void TestQgsInvertedPolygon::singleSubRenderer() { mReport += "

Inverted polygon renderer, single sub renderer test

\n"; - QVERIFY( setQml( "inverted_polys_single.qml" ) ); + QVERIFY( setQml( mpPolysLayer, "inverted_polys_single.qml" ) ); QVERIFY( imageCheck( "inverted_polys_single" ) ); } void TestQgsInvertedPolygon::graduatedSubRenderer() { mReport += "

Inverted polygon renderer, graduated sub renderer test

\n"; - QVERIFY( setQml( "inverted_polys_graduated.qml" ) ); + QVERIFY( setQml( mpPolysLayer, "inverted_polys_graduated.qml" ) ); QVERIFY( imageCheck( "inverted_polys_graduated" ) ); } @@ -132,7 +134,7 @@ void TestQgsInvertedPolygon::preprocess() { // FIXME will have to find some overlapping polygons mReport += "

Inverted polygon renderer, preprocessing test

\n"; - QVERIFY( setQml( "inverted_polys_preprocess.qml" ) ); + QVERIFY( setQml( mpPolysLayer, "inverted_polys_preprocess.qml" ) ); QVERIFY( imageCheck( "inverted_polys_preprocess" ) ); } @@ -142,25 +144,44 @@ void TestQgsInvertedPolygon::projectionTest() mMapSettings.setDestinationCrs( QgsCoordinateReferenceSystem( "EPSG:2154" ) ); mMapSettings.setCrsTransformEnabled( true ); QgsRectangle extent( QgsPoint( -8639421, 8382691 ), QgsPoint( -3969110, 12570905 ) ); - QVERIFY( setQml( "inverted_polys_single.qml" ) ); + QVERIFY( setQml( mpPolysLayer, "inverted_polys_single.qml" ) ); QVERIFY( imageCheck( "inverted_polys_projection", &extent ) ); - QVERIFY( setQml( "inverted_polys_preprocess.qml" ) ); + QVERIFY( setQml( mpPolysLayer, "inverted_polys_preprocess.qml" ) ); QVERIFY( imageCheck( "inverted_polys_projection2", &extent ) ); mMapSettings.setCrsTransformEnabled( false ); } +#if defined(GDAL_VERSION_NUM) && GDAL_VERSION_MAJOR >= 2 +// This test relies on GDAL support of curved polygons +void TestQgsInvertedPolygon::curvedPolygons() +{ + QString myCurvedPolysFileName = mTestDataDir + "curved_polys.gpkg"; + QFileInfo myCurvedPolyFileInfo( myCurvedPolysFileName ); + QgsVectorLayer* curvedLayer = new QgsVectorLayer( myCurvedPolyFileInfo.filePath() + "|layername=polys", + myCurvedPolyFileInfo.completeBaseName(), "ogr" ); + curvedLayer->setSimplifyMethod( simplifyMethod ); + QgsMapLayerRegistry::instance()->addMapLayers( QList() << curvedLayer ); + + mReport += "

Inverted polygon renderer, curved polygons test

\n"; + mMapSettings.setLayers( QStringList() << curvedLayer->id() ); + QVERIFY( setQml( mpCurvedPolysLayer, "inverted_polys_single.qml" ) ); + QVERIFY( imageCheck( "inverted_polys_curved" ) ); + mMapSettings.setLayers( QStringList() << curvedLayer->id() ); +} +#endif + // // Private helper functions not called directly by CTest // -bool TestQgsInvertedPolygon::setQml( const QString& qmlFile ) +bool TestQgsInvertedPolygon::setQml( QgsVectorLayer* vlayer, const QString& qmlFile ) { //load a qml style and apply to our layer //the style will correspond to the renderer //type we are testing bool myStyleFlag = false; QString myFileName = mTestDataDir + qmlFile; - QString error = mpPolysLayer->loadNamedStyle( myFileName, myStyleFlag ); + QString error = vlayer->loadNamedStyle( myFileName, myStyleFlag ); if ( !myStyleFlag ) { qDebug( "%s", error.toLocal8Bit().constData() ); diff --git a/tests/testdata/control_images/symbol_invertedpolygon/expected_inverted_polys_curved/default/expected_inverted_polys_curved.png b/tests/testdata/control_images/symbol_invertedpolygon/expected_inverted_polys_curved/default/expected_inverted_polys_curved.png new file mode 100644 index 00000000000..3cc7263ea6a Binary files /dev/null and b/tests/testdata/control_images/symbol_invertedpolygon/expected_inverted_polys_curved/default/expected_inverted_polys_curved.png differ diff --git a/tests/testdata/control_images/symbol_invertedpolygon/expected_inverted_polys_curved/precise/expected_inverted_polys_curved.png b/tests/testdata/control_images/symbol_invertedpolygon/expected_inverted_polys_curved/precise/expected_inverted_polys_curved.png new file mode 100644 index 00000000000..3cc7263ea6a Binary files /dev/null and b/tests/testdata/control_images/symbol_invertedpolygon/expected_inverted_polys_curved/precise/expected_inverted_polys_curved.png differ diff --git a/tests/testdata/curved_polys.gpkg b/tests/testdata/curved_polys.gpkg new file mode 100644 index 00000000000..5ae19f47f69 Binary files /dev/null and b/tests/testdata/curved_polys.gpkg differ