@@ -56,6 +56,7 @@ class TestQgsLabelingEngine : public QObject
56
56
void testTouchingParts ();
57
57
void testMergingLinesWithForks ();
58
58
void testCurvedLabelsWithTinySegments ();
59
+ void testCurvedLabelCorrectLinePlacement ();
59
60
void testLabelRotationWithReprojection ();
60
61
61
62
private:
@@ -1035,6 +1036,72 @@ void TestQgsLabelingEngine::testCurvedLabelsWithTinySegments()
1035
1036
QVERIFY ( imageCheck ( QStringLiteral ( " label_curved_label_small_segments" ), img, 20 ) );
1036
1037
}
1037
1038
1039
+ void TestQgsLabelingEngine::testCurvedLabelCorrectLinePlacement ()
1040
+ {
1041
+ // test drawing curved labels when input linestring has many small segments
1042
+ QgsPalLayerSettings settings;
1043
+ setDefaultLabelParams ( settings );
1044
+
1045
+ QgsTextFormat format = settings.format ();
1046
+ format.setSize ( 20 );
1047
+ format.setColor ( QColor ( 0 , 0 , 0 ) );
1048
+ settings.setFormat ( format );
1049
+
1050
+ settings.fieldName = QStringLiteral ( " 'XXXXXXXXXXXXXXXXXXXXXXXXXX'" );
1051
+ settings.isExpression = true ;
1052
+ settings.placement = QgsPalLayerSettings::Curved;
1053
+ settings.placementFlags = QgsPalLayerSettings::AboveLine | QgsPalLayerSettings::MapOrientation;
1054
+ settings.maxCurvedCharAngleIn = 99 ;
1055
+ settings.maxCurvedCharAngleOut = 99 ;
1056
+
1057
+ std::unique_ptr< QgsVectorLayer> vl2 ( new QgsVectorLayer ( QStringLiteral ( " LineString?crs=epsg:4326&field=id:integer" ), QStringLiteral ( " vl" ), QStringLiteral ( " memory" ) ) );
1058
+ vl2->setRenderer ( new QgsNullSymbolRenderer () );
1059
+
1060
+ QgsFeature f;
1061
+ f.setAttributes ( QgsAttributes () << 1 );
1062
+ // Geometry which roughly curves around from "1 oclock" anticlockwise to 6 oclock.
1063
+ QgsGeometry g ( QgsGeometry::fromWkt ( QStringLiteral ( " LineString (0.30541596873255172 0.3835845896147404, -0.08989391401451696 0.21831379117811278, -0.33668341708542704 -0.01619207146845336, -0.156895589056393 -0.20714684533780003, 0.02735901730876611 -0.21496370742601911)" ) ) );
1064
+ f.setGeometry ( g );
1065
+ QVERIFY ( vl2->dataProvider ()->addFeature ( f ) );
1066
+
1067
+ vl2->setLabeling ( new QgsVectorLayerSimpleLabeling ( settings ) ); // TODO: this should not be necessary!
1068
+ vl2->setLabelsEnabled ( true );
1069
+
1070
+ // make a fake render context
1071
+ QSize size ( 640 , 480 );
1072
+ QgsMapSettings mapSettings;
1073
+ mapSettings.setDestinationCrs ( vl2->crs () );
1074
+
1075
+ mapSettings.setOutputSize ( size );
1076
+ mapSettings.setExtent ( g.boundingBox () );
1077
+ mapSettings.setLayers ( QList<QgsMapLayer *>() << vl2.get () );
1078
+ mapSettings.setOutputDpi ( 96 );
1079
+
1080
+ QgsLabelingEngineSettings engineSettings = mapSettings.labelingEngineSettings ();
1081
+ engineSettings.setFlag ( QgsLabelingEngineSettings::UsePartialCandidates, false );
1082
+ engineSettings.setFlag ( QgsLabelingEngineSettings::DrawLabelRectOnly, true );
1083
+ // engineSettings.setFlag( QgsLabelingEngineSettings::DrawCandidates, true );
1084
+ mapSettings.setLabelingEngineSettings ( engineSettings );
1085
+
1086
+ QgsMapRendererSequentialJob job ( mapSettings );
1087
+ job.start ();
1088
+ job.waitForFinished ();
1089
+
1090
+ QImage img = job.renderedImage ();
1091
+ QVERIFY ( imageCheck ( QStringLiteral ( " label_curved_label_above_1" ), img, 20 ) );
1092
+
1093
+ // and below...
1094
+ settings.placementFlags = QgsPalLayerSettings::BelowLine | QgsPalLayerSettings::MapOrientation;
1095
+ vl2->setLabeling ( new QgsVectorLayerSimpleLabeling ( settings ) ); // TODO: this should not be necessary!
1096
+
1097
+ QgsMapRendererSequentialJob job2 ( mapSettings );
1098
+ job2.start ();
1099
+ job2.waitForFinished ();
1100
+
1101
+ img = job2.renderedImage ();
1102
+ QVERIFY ( imageCheck ( QStringLiteral ( " label_curved_label_below_1" ), img, 20 ) );
1103
+ }
1104
+
1038
1105
void TestQgsLabelingEngine::testLabelRotationWithReprojection ()
1039
1106
{
1040
1107
// test combination of map rotation with reprojected layer
0 commit comments