diff --git a/src/core/textrenderer/qgstextrenderer.cpp b/src/core/textrenderer/qgstextrenderer.cpp index 1677a5cef733..5d3f2cf0623a 100644 --- a/src/core/textrenderer/qgstextrenderer.cpp +++ b/src/core/textrenderer/qgstextrenderer.cpp @@ -726,6 +726,7 @@ void QgsTextRenderer::drawBackground( QgsRenderContext &context, QgsTextRenderer // shared calculations between shapes and SVG // configure angles, set component rotation and rotationOffset + const double originAdjustRotationRadians = -component.rotation; if ( background.rotationType() != QgsTextBackgroundSettings::RotationFixed ) { component.rotation = -( component.rotation * 180 / M_PI ); // RotationSync @@ -791,6 +792,15 @@ void QgsTextRenderer::drawBackground( QgsRenderContext &context, QgsTextRenderer component.origin.y() - height / 2.0 + originAdjust ); break; } + + // apply rotation to center point + if ( !qgsDoubleNear( originAdjustRotationRadians, 0 ) ) + { + const double dx = component.center.x() - component.origin.x(); + const double dy = component.center.y() - component.origin.y(); + component.center.setX( component.origin.x() + ( std::cos( originAdjustRotationRadians ) * dx - std::sin( originAdjustRotationRadians ) * dy ) ); + component.center.setY( component.origin.y() + ( std::sin( originAdjustRotationRadians ) * dx + std::cos( originAdjustRotationRadians ) * dy ) ); + } break; } diff --git a/tests/src/python/test_qgstextrenderer.py b/tests/src/python/test_qgstextrenderer.py index ee79c3483961..1b7e70b8dcb4 100644 --- a/tests/src/python/test_qgstextrenderer.py +++ b/tests/src/python/test_qgstextrenderer.py @@ -1467,6 +1467,28 @@ def testDrawBackgroundRectangleFixedSizeMapUnits(self): format.background().setSizeUnit(QgsUnitTypes.RenderMapUnits) assert self.checkRender(format, 'background_rect_mapunits', QgsTextRenderer.Background) + def testDrawBackgroundRectangleFixedSizeWithRotatedText(self): + format = QgsTextFormat() + format.setFont(getTestFont('bold')) + format.setSize(40) + format.background().setEnabled(True) + format.background().setType(QgsTextBackgroundSettings.ShapeRectangle) + format.background().setSize(QSizeF(20, 20)) + format.background().setSizeType(QgsTextBackgroundSettings.SizeFixed) + format.background().setSizeUnit(QgsUnitTypes.RenderMillimeters) + assert self.checkRenderPoint(format, 'background_rect_fixed_rotated_text', angle=3.141 / 4) + + def testDrawBackgroundRectangleBufferSizeWithRotatedText(self): + format = QgsTextFormat() + format.setFont(getTestFont('bold')) + format.setSize(40) + format.background().setEnabled(True) + format.background().setType(QgsTextBackgroundSettings.ShapeRectangle) + format.background().setSize(QSizeF(2, 3)) + format.background().setSizeType(QgsTextBackgroundSettings.SizeBuffer) + format.background().setSizeUnit(QgsUnitTypes.RenderMillimeters) + assert self.checkRenderPoint(format, 'background_rect_buffer_rotated_text', angle=3.141 / 4) + def testDrawBackgroundRectangleMultilineFixedSizeMapUnits(self): format = QgsTextFormat() format.setFont(getTestFont('bold')) diff --git a/tests/testdata/control_images/text_renderer/background_rect_buffer_rotated_text/background_rect_buffer_rotated_text.png b/tests/testdata/control_images/text_renderer/background_rect_buffer_rotated_text/background_rect_buffer_rotated_text.png new file mode 100644 index 000000000000..1ac392fa0103 Binary files /dev/null and b/tests/testdata/control_images/text_renderer/background_rect_buffer_rotated_text/background_rect_buffer_rotated_text.png differ diff --git a/tests/testdata/control_images/text_renderer/background_rect_fixed_rotated_text/background_rect_fixed_rotated_text.png b/tests/testdata/control_images/text_renderer/background_rect_fixed_rotated_text/background_rect_fixed_rotated_text.png new file mode 100644 index 000000000000..c70bcf52e65d Binary files /dev/null and b/tests/testdata/control_images/text_renderer/background_rect_fixed_rotated_text/background_rect_fixed_rotated_text.png differ diff --git a/tests/testdata/control_images/text_renderer/text_buffer_mapunits/text_buffer_mapunits_mask.png b/tests/testdata/control_images/text_renderer/text_buffer_mapunits/text_buffer_mapunits_mask.png index f8bd155c7870..e748ded2bf03 100644 Binary files a/tests/testdata/control_images/text_renderer/text_buffer_mapunits/text_buffer_mapunits_mask.png and b/tests/testdata/control_images/text_renderer/text_buffer_mapunits/text_buffer_mapunits_mask.png differ