include/basegfx/utils/RectangleWrapper.hxx |    5 +
 svx/source/svdraw/svdotxtr.cxx             |   73 ++++++++++++++++++++++-------
 2 files changed, 62 insertions(+), 16 deletions(-)

New commits:
commit 6e02b415f09404656d4b3ac93d2520a4c581ef8d
Author:     Tomaž Vajngerl <tomaz.vajng...@collabora.co.uk>
AuthorDate: Wed Nov 23 11:00:13 2022 +0900
Commit:     Tomaž Vajngerl <tomaz.vajng...@collabora.co.uk>
CommitDate: Wed Nov 23 11:07:34 2022 +0900

    svx: convert SdrTextObj rotate and move to use gfx::Length
    
    Change-Id: I82f10f82db8ac9d5653f4902276ee58fc18c52d6

diff --git a/include/basegfx/utils/RectangleWrapper.hxx 
b/include/basegfx/utils/RectangleWrapper.hxx
index 00586d6eae71..4f5dbe851f66 100644
--- a/include/basegfx/utils/RectangleWrapper.hxx
+++ b/include/basegfx/utils/RectangleWrapper.hxx
@@ -55,6 +55,11 @@ public:
         m_aRange.setSize(width, height);
     }
 
+    void shift(gfx::Length const& rXDelta, gfx::Length const& rYDelta)
+    {
+        m_aRange.shift(rXDelta, rYDelta);
+    }
+
     void move(sal_Int32 nXDelta, sal_Int32 nYDelta)
     {
         auto deltaX = gfx::Length::hmm(nXDelta);
diff --git a/svx/source/svdraw/svdotxtr.cxx b/svx/source/svdraw/svdotxtr.cxx
index e2a050c99dba..1ac82bc3db47 100644
--- a/svx/source/svdraw/svdotxtr.cxx
+++ b/svx/source/svdraw/svdotxtr.cxx
@@ -39,6 +39,35 @@
 
 using namespace com::sun::star;
 
+namespace
+{
+gfx::Tuple2DL rotatePoint(gfx::Tuple2DL const& rPoint, gfx::Tuple2DL const& 
rReference, double sinAngle, double cosAngle)
+{
+    gfx::Length dx = rPoint.getX() - rReference.getX();
+    gfx::Length dy = rPoint.getY() - rReference.getY();
+
+    auto x = rReference.getX() + gfx::Length::emu(basegfx::fround(dx.raw() * 
cosAngle + dy.raw() * sinAngle));
+    auto y = rReference.getY() + gfx::Length::emu(basegfx::fround(dy.raw() * 
cosAngle - dx.raw() * sinAngle));
+
+    return gfx::Tuple2DL(x, y);
+}
+
+gfx::Tuple2DL toTuple(Point const& rPointHmm)
+{
+    auto x = gfx::Length::hmm(rPointHmm.X());
+    auto y = gfx::Length::hmm(rPointHmm.Y());
+    return {x, y};
+}
+
+gfx::Size2DL toSize2D(Size const& rSizeHmm)
+{
+    auto x = gfx::Length::hmm(rSizeHmm.Width());
+    auto y = gfx::Length::hmm(rSizeHmm.Height());
+    return {x, y};
+}
+
+} // end anonymous ns
+
 void SdrTextObj::NbcSetSnapRect(const tools::Rectangle& rRect)
 {
     if (maGeo.nRotationAngle || maGeo.nShearAngle)
@@ -91,7 +120,9 @@ Degree100 SdrTextObj::GetShearAngle(bool /*bVertical*/) const
 
 void SdrTextObj::NbcMove(const Size& rSize)
 {
-    moveRectangle(rSize.Width(), rSize.Height());
+    gfx::Size2DL aSize2D = toSize2D(rSize);
+    maRectangle.shift(aSize2D.getWidth(), aSize2D.getHeight());
+
     moveOutRectangle(rSize.Width(), rSize.Height());
     maSnapRect.Move(rSize);
     SetBoundAndSnapRectsDirty(true);
@@ -182,27 +213,37 @@ void SdrTextObj::NbcResize(const Point& rRef, const 
Fraction& xFact, const Fract
     SetBoundAndSnapRectsDirty();
 }
 
-void SdrTextObj::NbcRotate(const Point& rRef, Degree100 nAngle, double sn, 
double cs)
+void SdrTextObj::NbcRotate(const Point& rRef, Degree100 nAngle, double 
sinAngle, double cosAngle)
 {
+    auto aReference = toTuple(rRef);
+
     SetGlueReallyAbsolute(true);
-    tools::Long dx = getRectangle().Right() - getRectangle().Left();
-    tools::Long dy = getRectangle().Bottom() - getRectangle().Top();
-    Point aPoint1(getRectangle().TopLeft());
-    RotatePoint(aPoint1, rRef, sn, cs);
-    Point aPoint2(aPoint1.X() + dx, aPoint1.Y() + dy);
-    tools::Rectangle aRectangle(aPoint1, aPoint2);
-    setRectangle(aRectangle);
+    auto const& rRange = maRectangle.getRange();
+
+    auto nWidth = rRange.getWidth();
+    auto nHeight = rRange.getHeight();
+
+    gfx::Tuple2DL aPoint1(rRange.getMinX(), rRange.getMinY());
+    aPoint1 = rotatePoint(aPoint1, aReference, sinAngle, cosAngle);
 
-    if (maGeo.nRotationAngle==0_deg100) {
-        maGeo.nRotationAngle=NormAngle36000(nAngle);
-        maGeo.mfSinRotationAngle=sn;
-        maGeo.mfCosRotationAngle=cs;
-    } else {
-        maGeo.nRotationAngle=NormAngle36000(maGeo.nRotationAngle+nAngle);
+    gfx::Tuple2DL aPoint2(aPoint1.getX() + nWidth, aPoint1.getY() + nHeight);
+
+    gfx::Range2DL aRange{aPoint1, aPoint2};
+    maRectangle.setRange(aRange);
+
+    if (maGeo.nRotationAngle == 0_deg100)
+    {
+        maGeo.nRotationAngle = NormAngle36000(nAngle);
+        maGeo.mfSinRotationAngle = sinAngle;
+        maGeo.mfCosRotationAngle = cosAngle;
+    }
+    else
+    {
+        maGeo.nRotationAngle = NormAngle36000(maGeo.nRotationAngle + nAngle);
         maGeo.RecalcSinCos();
     }
     SetBoundAndSnapRectsDirty();
-    NbcRotateGluePoints(rRef,nAngle,sn,cs);
+    NbcRotateGluePoints(rRef, nAngle, sinAngle, cosAngle);
     SetGlueReallyAbsolute(false);
 }
 

Reply via email to