@@ -805,7 +805,7 @@ void QgsPalLayerSettings::registerFeature( QgsVectorLayer* layer, QgsFeature& f
805
805
}
806
806
}
807
807
808
- if ( dataDefinedRotation )
808
+ if ( dataDefinedRotation )
809
809
{
810
810
// adjust xdiff and ydiff because the hali/vali point needs to be the rotation center
811
811
double xd = xdiff * cos ( angle ) - ydiff * sin ( angle );
@@ -831,7 +831,7 @@ void QgsPalLayerSettings::registerFeature( QgsVectorLayer* layer, QgsFeature& f
831
831
// does not flag label as pinned or rotateable
832
832
// always set rotation center as if Center/Half were set for data defined
833
833
bool overPointCentroid = false ;
834
- if ( !dataDefinedPosition
834
+ if ( !labelIsPinned
835
835
&& placement == QgsPalLayerSettings::OverPoint
836
836
&& geom->type () == QGis::Point )
837
837
{
@@ -854,11 +854,14 @@ void QgsPalLayerSettings::registerFeature( QgsVectorLayer* layer, QgsFeature& f
854
854
double descentRatio = labelFontMetrics.descent () / labelFontMetrics.height ();
855
855
ydiff -= labelY * 0.5 * ( 1 - descentRatio );
856
856
857
- if ( angleOffset != 0 )
857
+ if ( !dataDefinedRotation && angleOffset != 0 )
858
858
{
859
+ dataDefinedRotation = true ;
859
860
angle = angleOffset * M_PI / 180 ; // convert to radians
861
+ }
860
862
861
- dataDefinedRotation = true ;
863
+ if ( dataDefinedRotation )
864
+ {
862
865
// adjust xdiff and ydiff for Center/Half
863
866
double xd = xdiff * cos ( angle ) - ydiff * sin ( angle );
864
867
double yd = xdiff * sin ( angle ) + ydiff * cos ( angle );
@@ -924,12 +927,11 @@ void QgsPalLayerSettings::registerFeature( QgsVectorLayer* layer, QgsFeature& f
924
927
double labelW = labelX;
925
928
double labelH = labelY;
926
929
927
- if ( angleOffset != 0 )
930
+ if ( dataDefinedRotation )
928
931
{
929
932
// use LabelPosition construction to calculate new rotated label dimensions
930
933
pal::FeaturePart* fpart = new FeaturePart ( feat, geom->asGeos () );
931
- pal::LabelPosition* lp = new LabelPosition ( 1 , xPos, yPos, labelX, labelY,
932
- ( angleOffset * M_PI / 180 ), 0.0 , fpart );
934
+ pal::LabelPosition* lp = new LabelPosition ( 1 , xPos, yPos, labelX, labelY, angle, 0.0 , fpart );
933
935
934
936
// lp->getWidth or lp->getHeight doesn't account for rotation, get bbox instead
935
937
double amin[2 ], amax[2 ];
@@ -1726,8 +1728,9 @@ void QgsPalLabeling::drawLabel( pal::LabelPosition* label, QPainter* painter, co
1726
1728
painter->scale ( 1.0 / lyr.rasterCompressFactor , 1.0 / lyr.rasterCompressFactor );
1727
1729
1728
1730
double yMultiLineOffset = ( multiLineList.size () - 1 - i ) * lyr.fontMetrics ->height ();
1729
- // yMultiLineOffset += lyr.fontMetrics->descent();
1730
- painter->translate ( QPointF ( 0 , -yMultiLineOffset ) );
1731
+ double ascentOffset = 0.0 ;
1732
+ ascentOffset = lyr.fontMetrics ->height () * 0.25 * lyr.fontMetrics ->ascent () / lyr.fontMetrics ->height ();
1733
+ painter->translate ( QPointF ( 0 , - ascentOffset - yMultiLineOffset ) );
1731
1734
1732
1735
if ( drawBuffer )
1733
1736
{
0 commit comments