Skip to content

Commit 435466c

Browse files
committedJun 10, 2019
[labeling] Fix curved labels sometimes placed below line even when
set to above line only (cherry picked from commit 10c4bb9)
1 parent 626d294 commit 435466c

File tree

1 file changed

+67
-0
lines changed

1 file changed

+67
-0
lines changed
 

‎tests/src/core/testqgslabelingengine.cpp

Lines changed: 67 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -56,6 +56,7 @@ class TestQgsLabelingEngine : public QObject
5656
void testTouchingParts();
5757
void testMergingLinesWithForks();
5858
void testCurvedLabelsWithTinySegments();
59+
void testCurvedLabelCorrectLinePlacement();
5960
void testLabelRotationWithReprojection();
6061

6162
private:
@@ -1035,6 +1036,72 @@ void TestQgsLabelingEngine::testCurvedLabelsWithTinySegments()
10351036
QVERIFY( imageCheck( QStringLiteral( "label_curved_label_small_segments" ), img, 20 ) );
10361037
}
10371038

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+
10381105
void TestQgsLabelingEngine::testLabelRotationWithReprojection()
10391106
{
10401107
// test combination of map rotation with reprojected layer

0 commit comments

Comments
 (0)
Please sign in to comment.