Rebased ref, commits from common ancestor: commit 36167ff3d9bfca7095b340e33d3c5d7074945f66 Author: Tomaž Vajngerl <tomaz.vajng...@collabora.co.uk> AuthorDate: Sun Mar 5 18:48:23 2023 +0900 Commit: Tomaž Vajngerl <tomaz.vajng...@collabora.co.uk> CommitDate: Tue Feb 6 13:29:23 2024 +0900
svx: use gfx::Length based types directly in SdrTextObj::NbcResize Change-Id: I839430b30685994e1767998b353c63b97f461284 diff --git a/svx/source/svdraw/svdotxtr.cxx b/svx/source/svdraw/svdotxtr.cxx index 7ed97774119d..f1abaf11e1b3 100644 --- a/svx/source/svdraw/svdotxtr.cxx +++ b/svx/source/svdraw/svdotxtr.cxx @@ -122,81 +122,102 @@ void SdrTextObj::NbcMove(const Size& rSize) void SdrTextObj::NbcResize(const Point& rRef, const Fraction& xFact, const Fraction& yFact) { - bool bNotSheared=maGeo.m_nShearAngle==0_deg100; - bool bRotate90=bNotSheared && maGeo.m_nRotationAngle.get() % 9000 ==0; - bool bXMirr=(xFact.GetNumerator()<0) != (xFact.GetDenominator()<0); - bool bYMirr=(yFact.GetNumerator()<0) != (yFact.GetDenominator()<0); - if (bXMirr || bYMirr) { + bool bNotSheared = maGeo.m_nShearAngle == 0_deg100; + bool bRotate90 = bNotSheared && maGeo.m_nRotationAngle.get() % 9000 == 0; + + bool bXMirrored = (xFact.GetNumerator() < 0) != (xFact.GetDenominator() < 0); + bool bYMirrored = (yFact.GetNumerator() < 0) != (yFact.GetDenominator() < 0); + + double fFactorX = xFact.IsValid() ? double(xFact) : 1.0; + double fFactorY = yFact.IsValid() ? double(yFact) : 1.0; + + if (bXMirrored || bYMirrored) + { Point aRef1(GetSnapRect().Center()); - if (bXMirr) { + if (bXMirrored) + { Point aRef2(aRef1); aRef2.AdjustY( 1 ); NbcMirrorGluePoints(aRef1,aRef2); } - if (bYMirr) { + if (bYMirrored) + { Point aRef2(aRef1); aRef2.AdjustX( 1 ); NbcMirrorGluePoints(aRef1,aRef2); } } - if (maGeo.m_nRotationAngle==0_deg100 && maGeo.m_nShearAngle==0_deg100) { - auto aRectangle = getRectangle(); - ResizeRect(aRectangle, rRef, xFact, yFact); - setRectangle(aRectangle); - if (bYMirr) + if (maGeo.m_nRotationAngle == 0_deg100 && maGeo.m_nShearAngle == 0_deg100) + { + auto eUnit = getSdrModelFromSdrObject().getUnit(); + gfx::Tuple2DL aReference = createTupleFromPoint(rRef, eUnit); + svx::resizeRange(maRectangleRange, aReference, fFactorX, fFactorY); + + if (bYMirrored) { - //maRectangle.Normalize(); - moveRectangle(aRectangle.Right() - aRectangle.Left(), aRectangle.Bottom() - aRectangle.Top()); - maGeo.m_nRotationAngle=18000_deg100; + maRectangleRange.shift(maRectangleRange.getWidth(), maRectangleRange.getHeight()); + maGeo.m_nRotationAngle = 18000_deg100; maGeo.RecalcSinCos(); } } else { - tools::Polygon aPol(Rect2Poly(getRectangle(), maGeo)); + tools::Polygon aPolygon(Rect2Poly(getRectangle(), maGeo)); - for(sal_uInt16 a(0); a < aPol.GetSize(); a++) + for (sal_uInt16 a(0); a < aPolygon.GetSize(); a++) { - ResizePoint(aPol[a], rRef, xFact, yFact); + ResizePoint(aPolygon[a], rRef, xFact, yFact); } - if(bXMirr != bYMirr) + if (bXMirrored != bYMirrored) { // turn polygon and move it a little - tools::Polygon aPol0(aPol); + tools::Polygon aPol0(aPolygon); - aPol[0] = aPol0[1]; - aPol[1] = aPol0[0]; - aPol[2] = aPol0[3]; - aPol[3] = aPol0[2]; - aPol[4] = aPol0[1]; + aPolygon[0] = aPol0[1]; + aPolygon[1] = aPol0[0]; + aPolygon[2] = aPol0[3]; + aPolygon[3] = aPol0[2]; + aPolygon[4] = aPol0[1]; } - tools::Rectangle aRectangle = svx::polygonToRectangle(aPol, maGeo); + tools::Rectangle aRectangle = svx::polygonToRectangle(aPolygon, maGeo); setRectangle(aRectangle); } - if (bRotate90) { - bool bRota90=maGeo.m_nRotationAngle.get() % 9000 ==0; - if (!bRota90) { // there's seems to be a rounding error occurring: correct it - Degree100 a=NormAngle36000(maGeo.m_nRotationAngle); - if (a<4500_deg100) a=0_deg100; - else if (a<13500_deg100) a=9000_deg100; - else if (a<22500_deg100) a=18000_deg100; - else if (a<31500_deg100) a=27000_deg100; - else a=0_deg100; - maGeo.m_nRotationAngle=a; + if (bRotate90) + { + bool bRota90 = maGeo.m_nRotationAngle.get() % 9000 == 0; + if (!bRota90) + { + // there's seems to be a rounding error occurring: correct it + + Degree100 angle = NormAngle36000(maGeo.m_nRotationAngle); + if (angle < 4500_deg100) + angle = 0_deg100; + else if (angle < 13500_deg100) + angle = 9000_deg100; + else if (angle < 22500_deg100) + angle = 18000_deg100; + else if (angle < 31500_deg100) + angle = 27000_deg100; + else + angle = 0_deg100; + + maGeo.m_nRotationAngle = angle; maGeo.RecalcSinCos(); } - if (bNotSheared!=(maGeo.m_nShearAngle==0_deg100)) { // correct a rounding error occurring with Shear - maGeo.m_nShearAngle=0_deg100; + if (bNotSheared != (maGeo.m_nShearAngle == 0_deg100)) + { + // correct a rounding error occurring with Shear + maGeo.m_nShearAngle = 0_deg100; maGeo.RecalcTan(); } } AdaptTextMinSize(); - if(mbTextFrame && !getSdrModelFromSdrObject().IsPasteResize()) + if (mbTextFrame && !getSdrModelFromSdrObject().IsPasteResize()) { NbcAdjustTextFrameWidthAndHeight(); } commit 8b0ca7e5da693d72d7ec0b83ad1ff9afc836a95a Author: Tomaž Vajngerl <tomaz.vajng...@collabora.co.uk> AuthorDate: Sun Mar 5 14:46:10 2023 +0900 Commit: Tomaž Vajngerl <tomaz.vajng...@collabora.co.uk> CommitDate: Tue Feb 6 13:29:23 2024 +0900 svx: use gfx::Length based types directly in SdrTextObj::NbcMove Change-Id: Ib0d4a9f60a2ae7f64d914c7a39aa146fef6a9f74 diff --git a/svx/source/svdraw/svdotxtr.cxx b/svx/source/svdraw/svdotxtr.cxx index 8943cbb2f8f2..7ed97774119d 100644 --- a/svx/source/svdraw/svdotxtr.cxx +++ b/svx/source/svdraw/svdotxtr.cxx @@ -40,6 +40,18 @@ using namespace com::sun::star; +namespace +{ + +gfx::Tuple2DL createTupleFromPoint(Point const& rPoint, gfx::LengthUnit eUnit = gfx::LengthUnit::hmm) +{ + auto x = gfx::Length::from(eUnit, rPoint.X()); + auto y = gfx::Length::from(eUnit, rPoint.Y()); + return gfx::Tuple2DL(x, y); +} + +} // end anonymous + void SdrTextObj::NbcSetSnapRect(const tools::Rectangle& rRect) { if (maGeo.m_nRotationAngle || maGeo.m_nShearAngle) @@ -95,8 +107,15 @@ Degree100 SdrTextObj::GetShearAngle(bool /*bVertical*/) const void SdrTextObj::NbcMove(const Size& rSize) { - moveRectangle(rSize.Width(), rSize.Height()); - moveOutRectangle(rSize.Width(), rSize.Height()); + gfx::Tuple2DL aDelta = createTupleFromPoint(Point(rSize.Width(), rSize.Height()), getSdrModelFromSdrObject().getUnit()); + gfx::Length xDelta = aDelta.getX(); + gfx::Length yDelta = aDelta.getY(); + + if (xDelta == 0_emu && yDelta == 0_emu) + return; + + maRectangleRange.shift(xDelta, yDelta); + m_aOutterRange.shift(xDelta, yDelta); maSnapRect.Move(rSize); SetBoundAndSnapRectsDirty(true); } @@ -186,19 +205,6 @@ void SdrTextObj::NbcResize(const Point& rRef, const Fraction& xFact, const Fract SetBoundAndSnapRectsDirty(); } -namespace -{ - -gfx::Tuple2DL createTupleFromPoint(Point const& rPoint, gfx::LengthUnit eUnit = gfx::LengthUnit::hmm) -{ - auto x = gfx::Length::from(eUnit, rPoint.X()); - auto y = gfx::Length::from(eUnit, rPoint.Y()); - return gfx::Tuple2DL(x, y); -} - -} // end anonymous - - void SdrTextObj::NbcRotate(const Point& rRef, Degree100 nAngle, double sn, double cs) { SetGlueReallyAbsolute(true); commit 6a4447878aa97b754e75804cdfe5fc5b4d1bb1b5 Author: Tomaž Vajngerl <tomaz.vajng...@collabora.co.uk> AuthorDate: Sat Mar 4 22:12:51 2023 +0900 Commit: Tomaž Vajngerl <tomaz.vajng...@collabora.co.uk> CommitDate: Tue Feb 6 13:29:23 2024 +0900 svx: use gfx::Length based types directly in SdrTextObj::NbcRotate Change-Id: Ic5ee712fa7507e016441595f8847649fd18b50ee diff --git a/include/svx/svdtrans.hxx b/include/svx/svdtrans.hxx index 79ef179c1a8c..62f487fc04df 100644 --- a/include/svx/svdtrans.hxx +++ b/include/svx/svdtrans.hxx @@ -46,13 +46,15 @@ SVXCORE_DLLPUBLIC void ResizeRect(tools::Rectangle& rRect, const Point& rRef, co namespace svx { SVXCORE_DLLPUBLIC void resizeRange(gfx::Range2DLWrap& rRange, gfx::Tuple2DL const& rReference, double fFactorX, double fFactorY); +SVXCORE_DLLPUBLIC gfx::Tuple2DL rotatePoint(gfx::Tuple2DL const& rPoint, gfx::Tuple2DL const& rReference, double sinAngle, double cosAngle); } inline void ResizePoint(Point& rPnt, const Point& rRef, const Fraction& xFract, const Fraction& yFract); void ResizePoly(tools::Polygon& rPoly, const Point& rRef, const Fraction& xFact, const Fraction& yFact); void ResizeXPoly(XPolygon& rPoly, const Point& rRef, const Fraction& xFact, const Fraction& yFact); -inline void RotatePoint(Point& rPnt, const Point& rRef, double sn, double cs); +SVXCORE_DLLPUBLIC void RotatePoint(Point& rPnt, const Point& rRef, double sn, double cs); + SVXCORE_DLLPUBLIC void RotatePoly(tools::Polygon& rPoly, const Point& rRef, double sn, double cs); void RotateXPoly(XPolygon& rPoly, const Point& rRef, double sn, double cs); void RotateXPoly(XPolyPolygon& rPoly, const Point& rRef, double sn, double cs); @@ -107,14 +109,6 @@ inline void ResizePoint(Point& rPnt, const Point& rRef, const Fraction& xFract, rPnt.setY(rRef.Y() + FRound( (rPnt.Y() - rRef.Y()) * nyFract )); } -inline void RotatePoint(Point& rPnt, const Point& rRef, double sn, double cs) -{ - tools::Long dx=rPnt.X()-rRef.X(); - tools::Long dy=rPnt.Y()-rRef.Y(); - rPnt.setX(FRound(rRef.X()+dx*cs+dy*sn)); - rPnt.setY(FRound(rRef.Y()+dy*cs-dx*sn)); -} - inline void ShearPoint(Point& rPnt, const Point& rRef, double tn, bool bVShear) { if (!bVShear) { // Horizontal diff --git a/svx/qa/unit/svdraw.cxx b/svx/qa/unit/svdraw.cxx index b2128ac75c93..d2f77b7bb556 100644 --- a/svx/qa/unit/svdraw.cxx +++ b/svx/qa/unit/svdraw.cxx @@ -600,7 +600,7 @@ CPPUNIT_TEST_FIXTURE(SvdrawTest, testRectangleObjectMove) pModel->GetItemPool().FreezeIdRanges(); rtl::Reference<SdrPage> pPage(new SdrPage(*pModel, false)); - pPage->setSize({50_cm, 50_cm}); + pPage->setSize({ 50_cm, 50_cm }); pModel->InsertPage(pPage.get(), 0); tools::Rectangle aRect(Point(), Size(100, 100)); @@ -622,7 +622,7 @@ CPPUNIT_TEST_FIXTURE(SvdrawTest, testRectangleObjectRotate) pModel->GetItemPool().FreezeIdRanges(); rtl::Reference<SdrPage> pPage(new SdrPage(*pModel, false)); - pPage->setSize({50_cm, 50_cm}); + pPage->setSize({ 50_cm, 50_cm }); pModel->InsertPage(pPage.get(), 0); { @@ -820,6 +820,46 @@ CPPUNIT_TEST_FIXTURE(SvdrawTest, testResizeRect) CPPUNIT_ASSERT_EQUAL(tools::Rectangle(6, 6, 10, 10), aRectangle); } } + +CPPUNIT_TEST_FIXTURE(SvdrawTest, testRotatePoint2D) +{ + { + auto angle = 18000_deg100; + double angleRadians = toRadians(angle); + gfx::Tuple2DL aPoint(2_cm, 1_cm); + gfx::Tuple2DL aReference(1_cm, 1_cm); + aPoint + = svx::rotatePoint(aPoint, aReference, std::sin(angleRadians), std::cos(angleRadians)); + + CPPUNIT_ASSERT_EQUAL(0_cm, aPoint.getX()); + CPPUNIT_ASSERT_EQUAL(1_cm, aPoint.getY()); + } + + { + auto angle = 9000_deg100; + double angleRadians = toRadians(angle); + gfx::Tuple2DL aPoint(2_cm, 1_cm); + gfx::Tuple2DL aReference(1_cm, 1_cm); + aPoint + = svx::rotatePoint(aPoint, aReference, std::sin(angleRadians), std::cos(angleRadians)); + + CPPUNIT_ASSERT_EQUAL(1_cm, aPoint.getX()); + CPPUNIT_ASSERT_EQUAL(0_cm, aPoint.getY()); + } + + { + auto angle = 18000_deg100; + double angleRadians = toRadians(angle); + gfx::Tuple2DL aPoint(1_cm, 1_cm); + gfx::Tuple2DL aReference(2_cm, 2_cm); + aPoint + = svx::rotatePoint(aPoint, aReference, std::sin(angleRadians), std::cos(angleRadians)); + + CPPUNIT_ASSERT_EQUAL(3_cm, aPoint.getX()); + CPPUNIT_ASSERT_EQUAL(3_cm, aPoint.getY()); + } +} + } // end anonymous namespace /* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/svx/source/svdraw/svdotxtr.cxx b/svx/source/svdraw/svdotxtr.cxx index 1d1336e856d6..8943cbb2f8f2 100644 --- a/svx/source/svdraw/svdotxtr.cxx +++ b/svx/source/svdraw/svdotxtr.cxx @@ -186,28 +186,50 @@ void SdrTextObj::NbcResize(const Point& rRef, const Fraction& xFact, const Fract SetBoundAndSnapRectsDirty(); } +namespace +{ + +gfx::Tuple2DL createTupleFromPoint(Point const& rPoint, gfx::LengthUnit eUnit = gfx::LengthUnit::hmm) +{ + auto x = gfx::Length::from(eUnit, rPoint.X()); + auto y = gfx::Length::from(eUnit, rPoint.Y()); + return gfx::Tuple2DL(x, y); +} + +} // end anonymous + + void SdrTextObj::NbcRotate(const Point& rRef, Degree100 nAngle, double sn, double cs) { SetGlueReallyAbsolute(true); - tools::Rectangle aRectangle = getRectangle(); - tools::Long dx = aRectangle.Right() - aRectangle.Left(); - tools::Long dy = aRectangle.Bottom() - aRectangle.Top(); - Point aPoint1(aRectangle.TopLeft()); - RotatePoint(aPoint1, rRef, sn, cs); - Point aPoint2(aPoint1.X() + dx, aPoint1.Y() + dy); - aRectangle = tools::Rectangle(aPoint1, aPoint2); - setRectangle(aRectangle); + gfx::Tuple2DL aReference = createTupleFromPoint(rRef, getSdrModelFromSdrObject().getUnit()); - if (maGeo.m_nRotationAngle==0_deg100) { - maGeo.m_nRotationAngle=NormAngle36000(nAngle); - maGeo.mfSinRotationAngle=sn; - maGeo.mfCosRotationAngle=cs; - } else { - maGeo.m_nRotationAngle=NormAngle36000(maGeo.m_nRotationAngle+nAngle); + gfx::Length aWidth = maRectangleRange.getWidth(); + gfx::Length aHeight = maRectangleRange.getHeight(); + + gfx::Tuple2DL aPoint(maRectangleRange.getMinX(), maRectangleRange.getMinY()); + gfx::Tuple2DL aRotated = svx::rotatePoint(aPoint, aReference, sn, cs); + + maRectangleRange = gfx::Range2DLWrap( + aRotated.getX(), + aRotated.getY(), + aRotated.getX() + aWidth, + aRotated.getY() + aHeight); + + if (maGeo.m_nRotationAngle == 0_deg100) + { + maGeo.m_nRotationAngle = NormAngle36000(nAngle); + maGeo.mfSinRotationAngle = sn; + maGeo.mfCosRotationAngle = cs; + } + else + { + maGeo.m_nRotationAngle = NormAngle36000(maGeo.m_nRotationAngle + nAngle); maGeo.RecalcSinCos(); } + SetBoundAndSnapRectsDirty(); - NbcRotateGluePoints(rRef,nAngle,sn,cs); + NbcRotateGluePoints(rRef, nAngle, sn, cs); SetGlueReallyAbsolute(false); } diff --git a/svx/source/svdraw/svdtrans.cxx b/svx/source/svdraw/svdtrans.cxx index d4c6ce015b47..725572cddab4 100644 --- a/svx/source/svdraw/svdtrans.cxx +++ b/svx/source/svdraw/svdtrans.cxx @@ -75,8 +75,24 @@ void resizeRange(gfx::Range2DLWrap& rRange, gfx::Tuple2DL const& rReference, dou rRange = gfx::Range2DLWrap(left, top, right, bottom, rRange.getUnit()); } +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(); + gfx::Length x = rReference.getX() + dx * cosAngle + dy * sinAngle; + gfx::Length y = rReference.getY() + dy * cosAngle - dx * sinAngle; + return {x, y}; +} + } // end svx namespace +void RotatePoint(Point& rPnt, const Point& rRef, double sn, double cs) +{ + tools::Long dx=rPnt.X()-rRef.X(); + tools::Long dy=rPnt.Y()-rRef.Y(); + rPnt.setX(FRound(rRef.X()+dx*cs+dy*sn)); + rPnt.setY(FRound(rRef.Y()+dy*cs-dx*sn)); +} void ResizePoly(tools::Polygon& rPoly, const Point& rRef, const Fraction& xFact, const Fraction& yFact) { commit cf67e0d5a7aa8bc022532379b0440ae7077a18ec Author: Tomaž Vajngerl <tomaz.vajng...@collabora.co.uk> AuthorDate: Tue Feb 21 22:05:02 2023 +0900 Commit: Tomaž Vajngerl <tomaz.vajng...@collabora.co.uk> CommitDate: Tue Feb 6 13:29:23 2024 +0900 svx: change SdrObjGeoData aBoundRectangle using gfx::Range2DLWrap Change-Id: I13213ea2bdbfc5badb87d1bbd836192b8ae45e72 diff --git a/include/svx/svdgeodata.hxx b/include/svx/svdgeodata.hxx index 7f5a8b9713a4..c87dacab99a6 100644 --- a/include/svx/svdgeodata.hxx +++ b/include/svx/svdgeodata.hxx @@ -23,14 +23,27 @@ #include <svx/svdglue.hxx> #include <tools/gen.hxx> #include <optional> +#include <basegfx/units/Range2DLWrap.hxx> /** * All geometrical data of an arbitrary object for use in undo/redo */ class SVXCORE_DLLPUBLIC SdrObjGeoData { +private: + gfx::Range2DLWrap maBoundRange; + public: - tools::Rectangle aBoundRect; + gfx::Range2DLWrap const& getBoundRange() const + { + return maBoundRange; + } + + void setBoundRange(gfx::Range2DLWrap const& rRange) + { + maBoundRange = rRange; + } + Point aAnchor; std::optional<SdrGluePointList> moGluePoints; bool bMovProt; diff --git a/include/svx/svdobj.hxx b/include/svx/svdobj.hxx index abafa2455545..d2e6eb678552 100644 --- a/include/svx/svdobj.hxx +++ b/include/svx/svdobj.hxx @@ -394,6 +394,7 @@ public: // non-useful BoundRects sometimes) i rename that method from GetBoundRect() to // GetCurrentBoundRect(). virtual const tools::Rectangle& GetCurrentBoundRect() const; + virtual const gfx::Range2DLWrap& getCurrentBoundRange() const; // To have a possibility to get the last calculated BoundRect e.g for producing // the first rectangle for repaints (old and new need to be used) without forcing diff --git a/svx/source/svdraw/svdobj.cxx b/svx/source/svdraw/svdobj.cxx index 1c06b2a09e9a..38ce5472cfa0 100644 --- a/svx/source/svdraw/svdobj.cxx +++ b/svx/source/svdraw/svdobj.cxx @@ -956,6 +956,13 @@ const tools::Rectangle& SdrObject::GetCurrentBoundRect() const return getOutRectangle(); } +const gfx::Range2DLWrap& SdrObject::getCurrentBoundRange() const +{ + if (m_aOutterRange.isEmpty()) + const_cast<SdrObject*>(this)->RecalcBoundRect(); + return m_aOutterRange; +} + // To have a possibility to get the last calculated BoundRect e.g for producing // the first rectangle for repaints (old and new need to be used) without forcing // a RecalcBoundRect (which may be problematical and expensive sometimes) I add here @@ -1890,7 +1897,7 @@ std::unique_ptr<SdrObjGeoData> SdrObject::NewGeoData() const void SdrObject::SaveGeoData(SdrObjGeoData& rGeo) const { - rGeo.aBoundRect =GetCurrentBoundRect(); + rGeo.setBoundRange(getCurrentBoundRange()); rGeo.aAnchor =m_aAnchor ; rGeo.bMovProt =m_bMovProt ; rGeo.bSizProt =m_bSizProt ; @@ -1910,7 +1917,7 @@ void SdrObject::SaveGeoData(SdrObjGeoData& rGeo) const void SdrObject::RestoreGeoData(const SdrObjGeoData& rGeo) { SetBoundAndSnapRectsDirty(); - setOutRectangle(rGeo.aBoundRect); + m_aOutterRange = rGeo.getBoundRange(); m_aAnchor =rGeo.aAnchor ; m_bMovProt =rGeo.bMovProt ; m_bSizProt =rGeo.bSizProt ; commit dc86fd38e8952c76fefdbb519275d3b81880fe78 Author: Tomaž Vajngerl <tomaz.vajng...@collabora.co.uk> AuthorDate: Fri Feb 10 18:10:33 2023 +0900 Commit: Tomaž Vajngerl <tomaz.vajng...@collabora.co.uk> CommitDate: Tue Feb 6 13:29:23 2024 +0900 svx: refactor SdrObject resize to use m_aOutterRange directly Change-Id: I77aad10b32a53545c7f7bbf8fd87b914395a5bad diff --git a/include/svx/svdtrans.hxx b/include/svx/svdtrans.hxx index ae225426afd6..79ef179c1a8c 100644 --- a/include/svx/svdtrans.hxx +++ b/include/svx/svdtrans.hxx @@ -29,6 +29,9 @@ #include <tools/mapunit.hxx> #include <tools/poly.hxx> +#include <basegfx/units/Range2DLWrap.hxx> +#include <basegfx/units/LengthTypes.hxx> + // That maximum shear angle constexpr Degree100 SDRMAXSHEAR(8900); @@ -39,6 +42,12 @@ inline void MovePoly(tools::Polygon& rPoly, const Size& S) { rPoly.Move(S.W void MoveXPoly(XPolygon& rPoly, const Size& S); SVXCORE_DLLPUBLIC void ResizeRect(tools::Rectangle& rRect, const Point& rRef, const Fraction& xFact, const Fraction& yFact); + +namespace svx +{ +SVXCORE_DLLPUBLIC void resizeRange(gfx::Range2DLWrap& rRange, gfx::Tuple2DL const& rReference, double fFactorX, double fFactorY); +} + inline void ResizePoint(Point& rPnt, const Point& rRef, const Fraction& xFract, const Fraction& yFract); void ResizePoly(tools::Polygon& rPoly, const Point& rRef, const Fraction& xFact, const Fraction& yFact); void ResizeXPoly(XPolygon& rPoly, const Point& rRef, const Fraction& xFact, const Fraction& yFact); diff --git a/svx/qa/unit/svdraw.cxx b/svx/qa/unit/svdraw.cxx index 3f91084d6483..b2128ac75c93 100644 --- a/svx/qa/unit/svdraw.cxx +++ b/svx/qa/unit/svdraw.cxx @@ -7,7 +7,7 @@ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ -#include <test/unoapixml_test.hxx> +#include <basegfx/units/Length.hxx> #include <com/sun/star/beans/XPropertySet.hpp> #include <com/sun/star/drawing/XDrawPagesSupplier.hpp> @@ -38,6 +38,8 @@ #include <sdr/contact/objectcontactofobjlistpainter.hxx> +#include <test/unoapixml_test.hxx> + using namespace ::com::sun::star; namespace @@ -711,6 +713,7 @@ CPPUNIT_TEST_FIXTURE(SvdrawTest, testRotatePoint) } } +<<<<<<< HEAD CPPUNIT_TEST_FIXTURE(SvdrawTest, testClipVerticalTextOverflow) { // File contains a slide with 4 rectangle shapes with text inside @@ -754,6 +757,69 @@ CPPUNIT_TEST_FIXTURE(SvdrawTest, testClipVerticalTextOverflow) assertXPath(pDocument, "((//sdrblocktext)[7]//textsimpleportion)[1]"_ostr, "x"_ostr, "25417"); assertXPath(pDocument, "((//sdrblocktext)[7]//textsimpleportion)[3]"_ostr, "x"_ostr, "23893"); } + +CPPUNIT_TEST_FIXTURE(SvdrawTest, testResizeRect) +{ + { + tools::Rectangle aRectangle(1, 1, 10, 10); + Point aReference(1, 1); + ResizeRect(aRectangle, aReference, Fraction(1, 2), Fraction(1, 2)); + + CPPUNIT_ASSERT_EQUAL(tools::Rectangle(1, 1, 6, 6), aRectangle); + } + + { + tools::Rectangle aRectangle(1, 1, 10, 10); + Point aReference(10, 10); + ResizeRect(aRectangle, aReference, Fraction(1, 2), Fraction(1, 2)); + + CPPUNIT_ASSERT_EQUAL(tools::Rectangle(5, 5, 10, 10), aRectangle); + } + + { + gfx::Range2DLWrap aRange(1_hmm, 1_hmm, 10_hmm, 10_hmm); + CPPUNIT_ASSERT_EQUAL(9_hmm, aRange.getWidth()); + CPPUNIT_ASSERT_EQUAL(9_hmm, aRange.getHeight()); + + gfx::Tuple2DL aReference(1_hmm, 1_hmm); + svx::resizeRange(aRange, aReference, 0.5, 0.5); + + CPPUNIT_ASSERT_EQUAL(false, aRange.isEmpty()); + + CPPUNIT_ASSERT_EQUAL(1_hmm, aRange.getMinX()); + CPPUNIT_ASSERT_EQUAL(5.5_hmm, aRange.getMaxX()); + CPPUNIT_ASSERT_EQUAL(1_hmm, aRange.getMinY()); + CPPUNIT_ASSERT_EQUAL(5.5_hmm, aRange.getMaxY()); + + CPPUNIT_ASSERT_EQUAL(4.5_hmm, aRange.getWidth()); + CPPUNIT_ASSERT_EQUAL(4.5_hmm, aRange.getHeight()); + + auto aRectangle = aRange.toToolsRect(); + CPPUNIT_ASSERT_EQUAL(tools::Rectangle(1, 1, 6, 6), aRectangle); + } + + { + gfx::Range2DLWrap aRange(1_hmm, 1_hmm, 10_hmm, 10_hmm); + CPPUNIT_ASSERT_EQUAL(9_hmm, aRange.getWidth()); + CPPUNIT_ASSERT_EQUAL(9_hmm, aRange.getHeight()); + + gfx::Tuple2DL aReference(10_hmm, 10_hmm); + svx::resizeRange(aRange, aReference, 0.5, 0.5); + + CPPUNIT_ASSERT_EQUAL(false, aRange.isEmpty()); + + CPPUNIT_ASSERT_EQUAL(5.5_hmm, aRange.getMinX()); + CPPUNIT_ASSERT_EQUAL(10_hmm, aRange.getMaxX()); + CPPUNIT_ASSERT_EQUAL(5.5_hmm, aRange.getMinY()); + CPPUNIT_ASSERT_EQUAL(10_hmm, aRange.getMaxY()); + + CPPUNIT_ASSERT_EQUAL(4.5_hmm, aRange.getWidth()); + CPPUNIT_ASSERT_EQUAL(4.5_hmm, aRange.getHeight()); + + auto aRectangle = aRange.toToolsRect(); + CPPUNIT_ASSERT_EQUAL(tools::Rectangle(6, 6, 10, 10), aRectangle); + } +} } // end anonymous namespace /* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/svx/source/svdraw/svdobj.cxx b/svx/source/svdraw/svdobj.cxx index 63a112813bd3..1c06b2a09e9a 100644 --- a/svx/source/svdraw/svdobj.cxx +++ b/svx/source/svdraw/svdobj.cxx @@ -33,6 +33,7 @@ #include <basegfx/polygon/b2dpolypolygoncutter.hxx> #include <basegfx/polygon/b2dpolypolygontools.hxx> #include <basegfx/units/Range2DLWrap.hxx> +#include <basegfx/units/LengthTypes.hxx> #include <basegfx/range/b2drange.hxx> #include <drawinglayer/processor2d/contourextractor2d.hxx> #include <drawinglayer/processor2d/linegeometryextractor2d.hxx> @@ -970,10 +971,8 @@ void SdrObject::RecalcBoundRect() if ((getSdrModelFromSdrObject().isLocked()) || comphelper::IsFuzzing()) return; - auto const& rRectangle = getOutRectangle(); - // central new method which will calculate the BoundRect using primitive geometry - if (!rRectangle.IsEmpty()) + if (!isOutRectangleEmpty()) return; // Use view-independent data - we do not want any connections @@ -1428,24 +1427,32 @@ void SdrObject::NbcMove(const Size& rSize) void SdrObject::NbcResize(const Point& rRef, const Fraction& xFact, const Fraction& yFact) { - bool bXMirr=(xFact.GetNumerator()<0) != (xFact.GetDenominator()<0); - bool bYMirr=(yFact.GetNumerator()<0) != (yFact.GetDenominator()<0); - if (bXMirr || bYMirr) { + bool bXMirror = (xFact.GetNumerator() < 0) != (xFact.GetDenominator() < 0); + bool bYMirror = (yFact.GetNumerator() < 0) != (yFact.GetDenominator() < 0); + if (bXMirror || bYMirror) + { Point aRef1(GetSnapRect().Center()); - if (bXMirr) { + if (bXMirror) + { Point aRef2(aRef1); aRef2.AdjustY( 1 ); - NbcMirrorGluePoints(aRef1,aRef2); + NbcMirrorGluePoints(aRef1, aRef2); } - if (bYMirr) { + if (bYMirror) + { Point aRef2(aRef1); aRef2.AdjustX( 1 ); - NbcMirrorGluePoints(aRef1,aRef2); + NbcMirrorGluePoints(aRef1, aRef2); } } - auto aRectangle = getOutRectangle(); - ResizeRect(aRectangle, rRef, xFact, yFact); - setOutRectangle(aRectangle); + + auto eUnit = getSdrModelFromSdrObject().getUnit(); + gfx::Tuple2DL aReference{ + gfx::Length::from(eUnit, rRef.X()), + gfx::Length::from(eUnit, rRef.Y())}; + double fFactorX = xFact.IsValid() ? double(xFact) : 1.0; + double fFactorY = yFact.IsValid() ? double(yFact) : 1.0; + svx::resizeRange(m_aOutterRange, aReference, fFactorX, fFactorY); SetBoundAndSnapRectsDirty(); } diff --git a/svx/source/svdraw/svdtrans.cxx b/svx/source/svdraw/svdtrans.cxx index 23c7495ad7d7..d4c6ce015b47 100644 --- a/svx/source/svdraw/svdtrans.cxx +++ b/svx/source/svdraw/svdtrans.cxx @@ -61,6 +61,22 @@ void ResizeRect(tools::Rectangle& rRect, const Point& rRef, const Fraction& rxFa rRect.Normalize(); } +namespace svx +{ + +void resizeRange(gfx::Range2DLWrap& rRange, gfx::Tuple2DL const& rReference, double fFactorX, double fFactorY) +{ + auto left = rReference.getX() + ((rRange.getMinX() - rReference.getX()) * fFactorX); + auto right = rReference.getX() + ((rRange.getMaxX() - rReference.getX()) * fFactorX); + + auto top = rReference.getY() + ((rRange.getMinY() - rReference.getY()) * fFactorY); + auto bottom = rReference.getY() + ((rRange.getMaxY() - rReference.getY()) * fFactorY); + + rRange = gfx::Range2DLWrap(left, top, right, bottom, rRange.getUnit()); +} + +} // end svx namespace + void ResizePoly(tools::Polygon& rPoly, const Point& rRef, const Fraction& xFact, const Fraction& yFact) { commit 44a2ca44c7cfcd8f2a60f18d64b37bad4f28a124 Author: Tomaž Vajngerl <tomaz.vajng...@collabora.co.uk> AuthorDate: Thu Feb 9 10:03:43 2023 +0900 Commit: Tomaž Vajngerl <tomaz.vajng...@collabora.co.uk> CommitDate: Tue Feb 6 13:29:22 2024 +0900 use Range2DLWrap for the main rectangle in SdrTextObject Change-Id: I0d8ac090f9442fe561b4f87aa767185a987874c4 diff --git a/include/svx/svdotext.hxx b/include/svx/svdotext.hxx index 84aea85fdeff..e6437198830d 100644 --- a/include/svx/svdotext.hxx +++ b/include/svx/svdotext.hxx @@ -29,6 +29,7 @@ #include <tools/datetime.hxx> #include <svl/style.hxx> #include <svx/svdtext.hxx> +#include <svx/svdmodel.hxx> #include <svx/svxdllapi.h> #include <drawinglayer/primitive2d/Primitive2DContainer.hxx> #include <memory> @@ -166,31 +167,44 @@ protected: // The "aRect" is also the rect of RectObj and CircObj. // When mbTextFrame=true the text will be formatted into this rect // When mbTextFrame=false the text will be centered around its middle - tools::Rectangle maRectangle; + gfx::Range2DLWrap maRectangleRange; tools::Rectangle const& getRectangle() const { - return maRectangle; + return maRectangleRange.toToolsRect(); } void setRectangle(tools::Rectangle const& rRectangle) { - maRectangle = rRectangle; + auto eUnit = getSdrModelFromSdrObject().getUnit(); + maRectangleRange = gfx::Range2DLWrap::create(rRectangle, eUnit); } void setRectangleSize(sal_Int32 nWidth, sal_Int32 nHeight) { - maRectangle.SetSize(Size(nWidth, nHeight)); + auto eUnit = getSdrModelFromSdrObject().getUnit(); + auto width = gfx::Length::from(eUnit, nWidth); + auto height = gfx::Length::from(eUnit, nHeight); + maRectangleRange.setSize(width, height); } void moveRectangle(sal_Int32 nXDelta, sal_Int32 nYDelta) { - maRectangle.Move(nXDelta, nYDelta); + if (nXDelta == 0 && nYDelta == 0) + return; + + auto eUnit = getSdrModelFromSdrObject().getUnit(); + auto xDelta = gfx::Length::from(eUnit, nXDelta); + auto yDelta = gfx::Length::from(eUnit, nYDelta); + maRectangleRange.shift(xDelta, yDelta); } void moveRectanglePosition(sal_Int32 nX, sal_Int32 nY) { - maRectangle.SetPos(Point(nX, nY)); + auto eUnit = getSdrModelFromSdrObject().getUnit(); + auto x = gfx::Length::from(eUnit, nX); + auto y = gfx::Length::from(eUnit, nY); + maRectangleRange.setPosition(x, y); } // The GeoStat contains the rotation and shear angles diff --git a/svx/source/svdraw/svdocirc.cxx b/svx/source/svdraw/svdocirc.cxx index becc496c76f1..deafa116328d 100644 --- a/svx/source/svdraw/svdocirc.cxx +++ b/svx/source/svdraw/svdocirc.cxx @@ -706,8 +706,9 @@ bool SdrCircObj::MovCreate(SdrDragStat& rStat) ImpSetCreateParams(rStat); ImpCircUser* pU=static_cast<ImpCircUser*>(rStat.GetUser()); rStat.SetActionRect(pU->aR); - setRectangle(pU->aR); // for ObjName - ImpJustifyRect(maRectangle); + auto aRectangle = pU->aR; + ImpJustifyRect(aRectangle); + setRectangle(aRectangle); // for ObjName nStartAngle=pU->nStart; nEndAngle=pU->nEnd; SetBoundRectDirty(); @@ -1048,8 +1049,9 @@ void SdrCircObj::NbcSetSnapRect(const tools::Rectangle& rRect) NbcResize(maSnapRect.TopLeft(),Fraction(nWdt1,nWdt0),Fraction(nHgt1,nHgt0)); NbcMove(Size(rRect.Left()-aSR0.Left(),rRect.Top()-aSR0.Top())); } else { - setRectangle(rRect); - ImpJustifyRect(maRectangle); + tools::Rectangle aRectangle(rRect); + ImpJustifyRect(aRectangle); + setRectangle(aRectangle); } SetBoundAndSnapRectsDirty(); SetXPolyDirty(); diff --git a/svx/source/svdraw/svdotext.cxx b/svx/source/svdraw/svdotext.cxx index cc8846504752..f6133f30464e 100644 --- a/svx/source/svdraw/svdotext.cxx +++ b/svx/source/svdraw/svdotext.cxx @@ -104,7 +104,7 @@ SdrTextObj::SdrTextObj(SdrModel& rSdrModel, SdrTextObj const & rSource) // #i25616# mbSupportTextIndentingOnLineWidthChange = true; - maRectangle = rSource.maRectangle; + maRectangleRange = rSource.maRectangleRange; maGeo = rSource.maGeo; maTextSize = rSource.maTextSize; @@ -204,8 +204,6 @@ SdrTextObj::~SdrTextObj() void SdrTextObj::FitFrameToTextSize() { - ImpJustifyRect(maRectangle); - SdrText* pText = getActiveText(); if(pText==nullptr || !pText->GetOutlinerParaObject()) return; diff --git a/svx/source/svdraw/svdotxtr.cxx b/svx/source/svdraw/svdotxtr.cxx index cde62097f490..1d1336e856d6 100644 --- a/svx/source/svdraw/svdotxtr.cxx +++ b/svx/source/svdraw/svdotxtr.cxx @@ -56,9 +56,9 @@ void SdrTextObj::NbcSetSnapRect(const tools::Rectangle& rRect) else { // No rotation or shear. - - setRectangle(rRect); - ImpJustifyRect(maRectangle); + tools::Rectangle aRectangle(rRect); + ImpJustifyRect(aRectangle); + setRectangle(aRectangle); AdaptTextMinSize(); @@ -74,8 +74,9 @@ const tools::Rectangle& SdrTextObj::GetLogicRect() const void SdrTextObj::NbcSetLogicRect(const tools::Rectangle& rRect) { - setRectangle(rRect); - ImpJustifyRect(maRectangle); + tools::Rectangle aRectangle(rRect); + ImpJustifyRect(aRectangle); + setRectangle(aRectangle); AdaptTextMinSize(); @@ -126,7 +127,7 @@ void SdrTextObj::NbcResize(const Point& rRef, const Fraction& xFact, const Fract setRectangle(aRectangle); if (bYMirr) { - maRectangle.Normalize(); + //maRectangle.Normalize(); moveRectangle(aRectangle.Right() - aRectangle.Left(), aRectangle.Bottom() - aRectangle.Top()); maGeo.m_nRotationAngle=18000_deg100; maGeo.RecalcSinCos(); @@ -174,8 +175,6 @@ void SdrTextObj::NbcResize(const Point& rRef, const Fraction& xFact, const Fract } } - ImpJustifyRect(maRectangle); - AdaptTextMinSize(); if(mbTextFrame && !getSdrModelFromSdrObject().IsPasteResize()) @@ -190,12 +189,13 @@ void SdrTextObj::NbcResize(const Point& rRef, const Fraction& xFact, const Fract void SdrTextObj::NbcRotate(const Point& rRef, Degree100 nAngle, double sn, double cs) { SetGlueReallyAbsolute(true); - tools::Long dx = getRectangle().Right() - getRectangle().Left(); - tools::Long dy = getRectangle().Bottom() - getRectangle().Top(); - Point aPoint1(getRectangle().TopLeft()); + tools::Rectangle aRectangle = getRectangle(); + tools::Long dx = aRectangle.Right() - aRectangle.Left(); + tools::Long dy = aRectangle.Bottom() - aRectangle.Top(); + Point aPoint1(aRectangle.TopLeft()); RotatePoint(aPoint1, rRef, sn, cs); Point aPoint2(aPoint1.X() + dx, aPoint1.Y() + dy); - tools::Rectangle aRectangle(aPoint1, aPoint2); + aRectangle = tools::Rectangle(aPoint1, aPoint2); setRectangle(aRectangle); if (maGeo.m_nRotationAngle==0_deg100) { @@ -215,16 +215,17 @@ void SdrTextObj::NbcShear(const Point& rRef, Degree100 /*nAngle*/, double tn, bo { SetGlueReallyAbsolute(true); + auto aRectangle = getRectangle(); // when this is a SdrPathObj, aRect may be uninitialized - tools::Polygon aPol(Rect2Poly(getRectangle().IsEmpty() ? GetSnapRect() : getRectangle(), maGeo)); + tools::Polygon aPol(Rect2Poly(aRectangle.IsEmpty() ? GetSnapRect() : aRectangle, maGeo)); sal_uInt16 nPointCount=aPol.GetSize(); for (sal_uInt16 i=0; i<nPointCount; i++) { ShearPoint(aPol[i],rRef,tn,bVShear); } - tools::Rectangle aRectangle = svx::polygonToRectangle(aPol, maGeo); + aRectangle = svx::polygonToRectangle(aPol, maGeo); + ImpJustifyRect(aRectangle); setRectangle(aRectangle); - ImpJustifyRect(maRectangle); if (mbTextFrame) { NbcAdjustTextFrameWidthAndHeight(); @@ -245,7 +246,7 @@ void SdrTextObj::NbcMirror(const Point& rRef1, const Point& rRef2) std::abs(rRef1.X()-rRef2.X())==std::abs(rRef1.Y()-rRef2.Y()))) { bRotate90=maGeo.m_nRotationAngle.get() % 9000 ==0; } - tools::Polygon aPol(Rect2Poly(getRectangle(),maGeo)); + tools::Polygon aPol(Rect2Poly(getRectangle(), maGeo)); sal_uInt16 i; sal_uInt16 nPointCount=aPol.GetSize(); for (i=0; i<nPointCount; i++) { @@ -279,7 +280,6 @@ void SdrTextObj::NbcMirror(const Point& rRef1, const Point& rRef2) maGeo.RecalcTan(); } - ImpJustifyRect(maRectangle); if (mbTextFrame) { NbcAdjustTextFrameWidthAndHeight(); } diff --git a/svx/source/table/svdotable.cxx b/svx/source/table/svdotable.cxx index 63eeeae7d037..50ea1652d6a6 100644 --- a/svx/source/table/svdotable.cxx +++ b/svx/source/table/svdotable.cxx @@ -842,7 +842,7 @@ SdrTableObj::SdrTableObj(SdrModel& rSdrModel, SdrTableObj const & rSource) TableModelNotifyGuard aGuard( mpImpl.is() ? mpImpl->mxTable.get() : nullptr ); maLogicRect = rSource.maLogicRect; - maRectangle = rSource.maRectangle; + maRectangleRange = rSource.maRectangleRange; maGeo = rSource.maGeo; meTextKind = rSource.meTextKind; mbTextFrame = rSource.mbTextFrame; commit 1890a62199346fa92e5430490d5a7ff2ca56b081 Author: Tomaž Vajngerl <tomaz.vajng...@collabora.co.uk> AuthorDate: Wed Feb 8 10:42:19 2023 +0900 Commit: Tomaž Vajngerl <tomaz.vajng...@collabora.co.uk> CommitDate: Tue Feb 6 13:29:22 2024 +0900 use Range2DLWrap for "OutRectangle" in SdrObject Change-Id: I243b44a84bc09991744009ae24ac7657d493c5cf diff --git a/include/svx/svdobj.hxx b/include/svx/svdobj.hxx index 2951d41e8904..abafa2455545 100644 --- a/include/svx/svdobj.hxx +++ b/include/svx/svdobj.hxx @@ -34,6 +34,7 @@ #include <tools/link.hxx> #include <tools/gen.hxx> #include <unotools/resmgr.hxx> +#include <basegfx/units/Range2DLWrap.hxx> #include <unordered_set> @@ -860,13 +861,15 @@ public: void ForceMetricToItemPoolMetric(basegfx::B2DPolyPolygon& rPolyPolygon) const noexcept; protected: - const tools::Rectangle& getOutRectangle() const; + tools::Rectangle const& getOutRectangle() const; + bool isOutRectangleEmpty() const; void setOutRectangleConst(tools::Rectangle const& rRectangle) const; // need to do something about this void setOutRectangle(tools::Rectangle const& rRectangle); void resetOutRectangle(); void moveOutRectangle(sal_Int32 nXDelta, sal_Int32 nYDelta); - mutable tools::Rectangle m_aOutRect; // surrounding rectangle for Paint (incl. LineWidth, ...) + mutable gfx::Range2DLWrap m_aOutterRange; // surrounding rectangle for Paint (incl. LineWidth, ...) + Point m_aAnchor; // anchor position (Writer) SdrObjUserCall* m_pUserCall; std::unique_ptr<SdrObjPlusData> diff --git a/include/svx/svdpage.hxx b/include/svx/svdpage.hxx index d95d8599891f..ff733107f224 100644 --- a/include/svx/svdpage.hxx +++ b/include/svx/svdpage.hxx @@ -406,6 +406,14 @@ public: tools::Long upperUnit() const { return maUpper.as(meUnit); } tools::Long lowerUnit() const { return maLower.as(meUnit); } + bool operator==(Border const& other) const + { + return maLeft == other.maLeft + && maRight == other.maRight + && maUpper == other.maUpper + && maLower == other.maLower; + } + tools::Rectangle toToolsRect() const { return tools::Rectangle(leftUnit(), upperUnit(), rightUnit(), lowerUnit()); @@ -596,10 +604,7 @@ public: return maBorder; } - virtual void setBorder(svx::Border const& rBorder) - { - maBorder = rBorder; - } + virtual void setBorder(svx::Border const& rBorder); virtual void SetBorder(sal_Int32 nLeft, sal_Int32 nUpper, sal_Int32 nRight, sal_Int32 Lower); virtual void SetLeftBorder(sal_Int32 nBorder); diff --git a/svx/source/svdraw/svdobj.cxx b/svx/source/svdraw/svdobj.cxx index 10dba8f0ebc7..63a112813bd3 100644 --- a/svx/source/svdraw/svdobj.cxx +++ b/svx/source/svdraw/svdobj.cxx @@ -32,6 +32,7 @@ #include <basegfx/polygon/b2dpolygontools.hxx> #include <basegfx/polygon/b2dpolypolygoncutter.hxx> #include <basegfx/polygon/b2dpolypolygontools.hxx> +#include <basegfx/units/Range2DLWrap.hxx> #include <basegfx/range/b2drange.hxx> #include <drawinglayer/processor2d/contourextractor2d.hxx> #include <drawinglayer/processor2d/linegeometryextractor2d.hxx> @@ -949,13 +950,9 @@ void SdrObject::SetNavigationPosition (const sal_uInt32 nNewPosition) // GetCurrentBoundRect(). const tools::Rectangle& SdrObject::GetCurrentBoundRect() const { - auto const& rRectangle = getOutRectangle(); - if (rRectangle.IsEmpty()) - { - const_cast< SdrObject* >(this)->RecalcBoundRect(); - } - - return rRectangle; + if (isOutRectangleEmpty()) + const_cast<SdrObject*>(this)->RecalcBoundRect(); + return getOutRectangle(); } // To have a possibility to get the last calculated BoundRect e.g for producing @@ -993,13 +990,12 @@ void SdrObject::RecalcBoundRect() if (!aRange.isEmpty()) { - tools::Rectangle aNewRectangle( - tools::Long(floor(aRange.getMinX())), - tools::Long(floor(aRange.getMinY())), - tools::Long(ceil(aRange.getMaxX())), - tools::Long(ceil(aRange.getMaxY()))); - setOutRectangle(aNewRectangle); - return; + const basegfx::B2DRange aRoundedRange( + std::floor(aRange.getMinX()), + std::floor(aRange.getMinY()), + std::ceil(aRange.getMaxX()), + std::ceil(aRange.getMaxY())); + m_aOutterRange = gfx::Range2DLWrap::create(aRoundedRange, getSdrModelFromSdrObject().getUnit()); } } @@ -3145,27 +3141,41 @@ void SdrObject::ForceMetricToItemPoolMetric(basegfx::B2DPolyPolygon& rPolyPolygo const tools::Rectangle& SdrObject::getOutRectangle() const { - return m_aOutRect; + return m_aOutterRange.toToolsRect(); +} + +bool SdrObject::isOutRectangleEmpty() const +{ + return getOutRectangle().IsEmpty(); } void SdrObject::setOutRectangleConst(tools::Rectangle const& rRectangle) const { - m_aOutRect = rRectangle; + auto eUnit = getSdrModelFromSdrObject().getUnit(); + m_aOutterRange = gfx::Range2DLWrap::create(rRectangle, eUnit); } void SdrObject::setOutRectangle(tools::Rectangle const& rRectangle) { - m_aOutRect = rRectangle; + auto eUnit = getSdrModelFromSdrObject().getUnit(); + m_aOutterRange = gfx::Range2DLWrap::create(rRectangle, eUnit); } void SdrObject::resetOutRectangle() { - m_aOutRect = tools::Rectangle(); + m_aOutterRange.reset(); } void SdrObject::moveOutRectangle(sal_Int32 nXDelta, sal_Int32 nYDelta) { - m_aOutRect.Move(nXDelta, nYDelta); + if (nXDelta == 0 && nYDelta == 0) + return; + + auto eUnit = getSdrModelFromSdrObject().getUnit(); + auto xDelta = gfx::Length::from(eUnit, nXDelta); + auto yDelta = gfx::Length::from(eUnit, nYDelta); + + m_aOutterRange.shift(xDelta, yDelta); } E3dScene* DynCastE3dScene(SdrObject* pObj) diff --git a/svx/source/svdraw/svdpage.cxx b/svx/source/svdraw/svdpage.cxx index bac4fe0caebc..69036df0ff75 100644 --- a/svx/source/svdraw/svdpage.cxx +++ b/svx/source/svdraw/svdpage.cxx @@ -1397,16 +1397,11 @@ rtl::Reference<SdrPage> SdrPage::CloneSdrPage(SdrModel& rTargetModel) const void SdrPage::setSize(gfx::Size2DLWrap const& rSize) { - bool bChanged = false; - - if (maSize != rSize) - { - maSize = rSize; - bChanged = true; - } + if (maSize == rSize) + return; - if (bChanged) - SetChanged(); + maSize = rSize; + SetChanged(); } void SdrPage::SetOrientation(Orientation eOri) @@ -1430,6 +1425,14 @@ Orientation SdrPage::GetOrientation() const return Orientation::Portrait; } +void SdrPage::setBorder(svx::Border const& rBorder) +{ + if (maBorder == rBorder) + return; + + maBorder = rBorder; + SetChanged(); +} void SdrPage::SetBorder(sal_Int32 nLeft, sal_Int32 nUpper, sal_Int32 nRight, sal_Int32 nLower) { diff --git a/sw/source/core/draw/dcontact.cxx b/sw/source/core/draw/dcontact.cxx index 49f2b7396e96..34db07ba9656 100644 --- a/sw/source/core/draw/dcontact.cxx +++ b/sw/source/core/draw/dcontact.cxx @@ -2438,10 +2438,8 @@ void SwDrawVirtObj::NbcSetAnchorPos(const Point& rPnt) const tools::Rectangle& SwDrawVirtObj::GetCurrentBoundRect() const { - if (getOutRectangle().IsEmpty()) - { + if (isOutRectangleEmpty()) const_cast<SwDrawVirtObj*>(this)->RecalcBoundRect(); - } return getOutRectangle(); } commit bce5093ec19afef7e48aa15935e57567914e7c31 Author: Tomaž Vajngerl <tomaz.vajng...@collabora.co.uk> AuthorDate: Wed Oct 26 20:21:37 2022 +0200 Commit: Tomaž Vajngerl <tomaz.vajng...@collabora.co.uk> CommitDate: Tue Feb 6 13:29:22 2024 +0900 svx: change PaperInfo to return gfx::Length paper sizes Change-Id: Ie99a748ab9282893a852278be9793f7379522541 diff --git a/editeng/source/items/paperinf.cxx b/editeng/source/items/paperinf.cxx index 86401e63f387..47dd992b4f02 100644 --- a/editeng/source/items/paperinf.cxx +++ b/editeng/source/items/paperinf.cxx @@ -39,6 +39,12 @@ Size SvxPaperInfo::GetPaperSize( Paper ePaper, MapUnit eUnit ) : OutputDevice::LogicToLogic(aRet, MapMode(MapUnit::Map100thMM), MapMode(eUnit)); } +gfx::Size2DLWrap SvxPaperInfo::getPaperSize(Paper ePaper) +{ + PaperInfo aInfo(ePaper); + return { gfx::Length::hmm(aInfo.getWidth()), gfx::Length::hmm(aInfo.getHeight()) }; +} + /*------------------------------------------------------------------------ Description: Return the paper size of the printer, aligned to our own sizes. If no Printer is set in the system, A4 portrait @@ -108,6 +114,12 @@ Size SvxPaperInfo::GetDefaultPaperSize( MapUnit eUnit ) : OutputDevice::LogicToLogic(aRet, MapMode(MapUnit::Map100thMM), MapMode(eUnit)); } +gfx::Size2DLWrap SvxPaperInfo::getDefaultPaperSize() +{ + PaperInfo aInfo(PaperInfo::getSystemDefaultPaper()); + return { gfx::Length::hmm(aInfo.getWidth()), gfx::Length::hmm(aInfo.getHeight()) }; +} + /*------------------------------------------------------------------------ Description: String representation for the SV-defines of paper size ------------------------------------------------------------------------*/ diff --git a/include/editeng/paperinf.hxx b/include/editeng/paperinf.hxx index 2ccc8fbf96fa..0d12100e5903 100644 --- a/include/editeng/paperinf.hxx +++ b/include/editeng/paperinf.hxx @@ -25,6 +25,7 @@ #include <tools/mapunit.hxx> #include <i18nutil/paper.hxx> #include <tools/gen.hxx> +#include <basegfx/units/Size2DLWrap.hxx> #include <editeng/editengdllapi.h> // forward --------------------------------------------------------------- @@ -42,6 +43,9 @@ public: static Paper GetSvxPaper( const Size &rSize, MapUnit eUnit ); static tools::Long GetSloppyPaperDimension( tools::Long nSize ); static OUString GetName( Paper ePaper ); + + static gfx::Size2DLWrap getPaperSize(Paper ePaper); + static gfx::Size2DLWrap getDefaultPaperSize(); }; // INLINE ----------------------------------------------------------------- diff --git a/include/svx/svdpage.hxx b/include/svx/svdpage.hxx index b613cf26d043..d95d8599891f 100644 --- a/include/svx/svdpage.hxx +++ b/include/svx/svdpage.hxx @@ -384,6 +384,13 @@ public: , meUnit(eUnit) {} + Border(gfx::Length const& nLeft, gfx::Length const& nUpper, gfx::Length const& nRight, gfx::Length const& nLower) + : maLeft(nLeft) + , maRight(nRight) + , maUpper(nUpper) + , maLower(nLower) + {} + gfx::Length const& left() const { return maLeft; } gfx::Length const& right() const { return maRight; } gfx::Length const& upper() const { return maUpper; } diff --git a/sd/source/core/drawdoc2.cxx b/sd/source/core/drawdoc2.cxx index 7caebb76925b..cdc467f2b12f 100644 --- a/sd/source/core/drawdoc2.cxx +++ b/sd/source/core/drawdoc2.cxx @@ -514,7 +514,7 @@ void SdDrawDocument::CreateFirstPages( SdDrawDocument const * pRefDocument /* = return; // #i57181# Paper size depends on Language, like in Writer - Size aDefSize = SvxPaperInfo::GetDefaultPaperSize( MapUnit::Map100thMM ); + gfx::Size2DLWrap aDefaultSize = SvxPaperInfo::getDefaultPaperSize(); // Insert handout page rtl::Reference<SdPage> pHandoutPage = AllocSdPage(false); @@ -531,8 +531,8 @@ void SdDrawDocument::CreateFirstPages( SdDrawDocument const * pRefDocument /* = } else { - pHandoutPage->setToolsSize(aDefSize); - pHandoutPage->SetBorder(0, 0, 0, 0); + pHandoutPage->setSize(aDefaultSize); + pHandoutPage->setBorder(svx::Border()); } pHandoutPage->SetPageKind(PageKind::Handout); @@ -568,7 +568,7 @@ void SdDrawDocument::CreateFirstPages( SdDrawDocument const * pRefDocument /* = else if (meDocType == DocumentType::Draw) { // Draw: always use default size with margins - pPage->setToolsSize(aDefSize); + pPage->setSize(aDefaultSize); SfxPrinter* pPrinter = mpDocSh->GetPrinter(false); if (pPrinter && pPrinter->IsValid()) @@ -578,12 +578,12 @@ void SdDrawDocument::CreateFirstPages( SdDrawDocument const * pRefDocument /* = aPageOffset -= pPrinter->PixelToLogic( Point() ); ::tools::Long nOffset = !aPageOffset.X() && !aPageOffset.Y() ? 0 : PRINT_OFFSET; - sal_uLong nTop = aPageOffset.Y(); - sal_uLong nLeft = aPageOffset.X(); - sal_uLong nBottom = std::max(::tools::Long(aDefSize.Height() - aOutSize.Height() - nTop + nOffset), ::tools::Long(0)); - sal_uLong nRight = std::max(::tools::Long(aDefSize.Width() - aOutSize.Width() - nLeft + nOffset), ::tools::Long(0)); + gfx::Length nTop = gfx::Length::hmm(aPageOffset.Y()); + gfx::Length nLeft = gfx::Length::hmm(aPageOffset.X()); + gfx::Length nBottom = gfx::Length::hmm(std::max(::tools::Long(aDefaultSize.getHeight().as_hmm() - aOutSize.Height() - aPageOffset.Y() + nOffset), tools::Long(0))); + gfx::Length nRight = gfx::Length::hmm(std::max(::tools::Long(aDefaultSize.getWidth().as_hmm() - aOutSize.Width() - aPageOffset.X() + nOffset), tools::Long(0))); - pPage->SetBorder(nLeft, nTop, nRight, nBottom); + pPage->setBorder(svx::Border(nLeft, nTop, nRight, nBottom)); } else { @@ -592,14 +592,14 @@ void SdDrawDocument::CreateFirstPages( SdDrawDocument const * pRefDocument /* = // This has to be kept synchronized with the border // width set in the // SvxPageDescPage::PaperSizeSelect_Impl callback. - pPage->SetBorder(1000, 1000, 1000, 1000); + pPage->setBorder(svx::Border(1000_hmm, 1000_hmm, 1000_hmm, 1000_hmm)); } } else { // Impress: always use screen format, landscape. - Size aSize = SvxPaperInfo::GetPaperSize(PAPER_SCREEN_16_9, MapUnit::Map100thMM); - pPage->setToolsSize(Size(aSize.Height(), aSize.Width())); + gfx::Size2DLWrap aSize = SvxPaperInfo::getPaperSize(PAPER_SCREEN_16_9); + pPage->setSize({ aSize.getHeight(), aSize.getWidth() }); pPage->setBorder(svx::Border()); } @@ -634,16 +634,16 @@ void SdDrawDocument::CreateFirstPages( SdDrawDocument const * pRefDocument /* = else { // Always use portrait format - if (aDefSize.Height() >= aDefSize.Width()) + if (aDefaultSize.getHeight() >= aDefaultSize.getWidth()) { - pNotesPage->setToolsSize(aDefSize); + pNotesPage->setSize(aDefaultSize); } else { - pNotesPage->setToolsSize(Size(aDefSize.Height(), aDefSize.Width())); + pNotesPage->setSize({ aDefaultSize.getHeight(), aDefaultSize.getWidth() }); } - pNotesPage->SetBorder(0, 0, 0, 0); + pNotesPage->setBorder(svx::Border()); } pNotesPage->SetPageKind(PageKind::Notes); InsertPage(pNotesPage.get(), 2); commit 17ad8c0e60eeb46bfdf853428de865c19cfa7067 Author: Tomaž Vajngerl <tomaz.vajng...@collabora.co.uk> AuthorDate: Thu Feb 2 19:22:23 2023 +0900 Commit: Tomaž Vajngerl <tomaz.vajng...@collabora.co.uk> CommitDate: Tue Feb 6 13:29:10 2024 +0900 svx: change SdrPage size and border to use gfx::Length Change-Id: I382cfba6189eab02581057ab5af437cd1d163138 diff --git a/basctl/source/dlged/dlged.cxx b/basctl/source/dlged/dlged.cxx index 1aa9ca380416..693b952e0bdb 100644 --- a/basctl/source/dlged/dlged.cxx +++ b/basctl/source/dlged/dlged.cxx @@ -216,12 +216,13 @@ DlgEditor::DlgEditor ( aMarkIdle.SetInvokeHandler( LINK( this, DlgEditor, MarkTimeout ) ); rWindow.SetMapMode( MapMode( MapUnit::Map100thMM ) ); - pDlgEdPage->SetSize( rWindow.PixelToLogic( Size(DLGED_PAGE_WIDTH_MIN, DLGED_PAGE_HEIGHT_MIN) ) ); + Size aPageSize = rWindow.PixelToLogic(Size(DLGED_PAGE_WIDTH_MIN, DLGED_PAGE_HEIGHT_MIN)); + pDlgEdPage->setToolsSize(aPageSize); pDlgEdView->ShowSdrPage(pDlgEdView->GetModel().GetPage(0)); pDlgEdView->SetLayerVisible( "HiddenLayer", false ); pDlgEdView->SetMoveSnapOnlyTopLeft(true); - pDlgEdView->SetWorkArea( tools::Rectangle( Point( 0, 0 ), pDlgEdPage->GetSize() ) ); + pDlgEdView->SetWorkArea(pDlgEdPage->getRectangle().toToolsRect()); Size aGridSize( 100, 100 ); // 100TH_MM pDlgEdView->SetGridCoarse( aGridSize ); @@ -267,7 +268,7 @@ void DlgEditor::InitScrollBars() return; Size aOutSize = rWindow.GetOutDev()->GetOutputSize(); - Size aPgSize = pDlgEdPage->GetSize(); + Size aPgSize = pDlgEdPage->getSize().toToolsSize(); pHScroll->SetRange( Range( 0, aPgSize.Width() )); pVScroll->SetRange( Range( 0, aPgSize.Height() )); @@ -1217,11 +1218,11 @@ bool DlgEditor::AdjustPageSize() if ( pDlgEdPage ) { - Size aPageSize = pDlgEdPage->GetSize(); + Size aPageSize = pDlgEdPage->getSize().toToolsSize(); if ( nNewPageWidth != aPageSize.Width() || nNewPageHeight != aPageSize.Height() ) { Size aNewPageSize( nNewPageWidth, nNewPageHeight ); - pDlgEdPage->SetSize( aNewPageSize ); + pDlgEdPage->setToolsSize(aNewPageSize); pDlgEdView->SetWorkArea( tools::Rectangle( Point( 0, 0 ), aNewPageSize ) ); bAdjustedPageSize = true; } diff --git a/basctl/source/dlged/dlgedobj.cxx b/basctl/source/dlged/dlgedobj.cxx index 5b87393e51bc..3fda762ac04a 100644 --- a/basctl/source/dlged/dlgedobj.cxx +++ b/basctl/source/dlged/dlgedobj.cxx @@ -419,7 +419,7 @@ void DlgEdObj::PositionAndSizeChange( const beans::PropertyChangeEvent& evt ) DBG_ASSERT( pDlgEdForm, "DlgEdObj::PositionAndSizeChange: no form!" ); DlgEdPage& rPage = pDlgEdForm->GetDlgEditor().GetPage(); { - Size aPageSize = rPage.GetSize(); + Size aPageSize = rPage.getSize().toToolsSize(); sal_Int32 nPageWidthIn = aPageSize.Width(); sal_Int32 nPageHeightIn = aPageSize.Height(); sal_Int32 nPageX, nPageY, nPageWidth, nPageHeight; @@ -1298,7 +1298,7 @@ void DlgEdForm::PositionAndSizeChange( const beans::PropertyChangeEvent& evt ) sal_Int32 nPageXIn = 0; sal_Int32 nPageYIn = 0; - Size aPageSize = rPage.GetSize(); + Size aPageSize = rPage.getSize().toToolsSize(); sal_Int32 nPageWidthIn = aPageSize.Width(); sal_Int32 nPageHeightIn = aPageSize.Height(); sal_Int32 nPageX, nPageY, nPageWidth, nPageHeight; @@ -1348,7 +1348,7 @@ void DlgEdForm::PositionAndSizeChange( const beans::PropertyChangeEvent& evt ) if ( bAdjustedPageSize ) { rEditor.InitScrollBars(); - aPageSize = rPage.GetSize(); + aPageSize = rPage.getSize().toToolsSize(); nPageWidthIn = aPageSize.Width(); nPageHeightIn = aPageSize.Height(); if ( TransformSdrToControlCoordinates( nPageXIn, nPageYIn, nPageWidthIn, nPageHeightIn, nPageX, nPageY, nPageWidth, nPageHeight ) ) diff --git a/basctl/source/dlged/dlgedview.cxx b/basctl/source/dlged/dlgedview.cxx index 81271d38f8bd..a9a6c821e480 100644 --- a/basctl/source/dlged/dlgedview.cxx +++ b/basctl/source/dlged/dlgedview.cxx @@ -90,7 +90,7 @@ void DlgEdView::MakeVisible( const tools::Rectangle& rRect, vcl::Window& rWin ) nScrollY -= nDeltaY; // don't scroll beyond the page size - Size aPageSize = rDlgEditor.GetPage().GetSize(); + Size aPageSize = rDlgEditor.GetPage().getSize().toToolsSize(); sal_Int32 nPageWidth = aPageSize.Width(); sal_Int32 nPageHeight = aPageSize.Height(); diff --git a/chart2/source/controller/drawinglayer/ViewElementListProvider.cxx b/chart2/source/controller/drawinglayer/ViewElementListProvider.cxx index 0b3df1aa22ad..f90c781ee84e 100644 --- a/chart2/source/controller/drawinglayer/ViewElementListProvider.cxx +++ b/chart2/source/controller/drawinglayer/ViewElementListProvider.cxx @@ -149,7 +149,7 @@ Graphic ViewElementListProvider::GetSymbolGraphic( sal_Int32 nStandardSymbol, co pModel->GetItemPool().FreezeIdRanges(); rtl::Reference<SdrPage> pPage = new SdrPage( *pModel, false ); - pPage->SetSize(Size(1000,1000)); + pPage->setSize({ 1000_hmm, 1000_hmm }); pModel->InsertPage( pPage.get(), 0 ); SdrView aView(*pModel, pVDev); aView.hideMarkHandles(); diff --git a/chart2/source/controller/main/DrawCommandDispatch.cxx b/chart2/source/controller/main/DrawCommandDispatch.cxx index 1446059a0223..c7d7336f2811 100644 --- a/chart2/source/controller/main/DrawCommandDispatch.cxx +++ b/chart2/source/controller/main/DrawCommandDispatch.cxx @@ -423,7 +423,7 @@ rtl::Reference<SdrObject> DrawCommandDispatch::createDefaultObject( const ChartC if ( pObj ) { Size aObjectSize( 4000, 2500 ); - tools::Rectangle aPageRect( tools::Rectangle( Point( 0, 0 ), pPage->GetSize() ) ); + tools::Rectangle aPageRect(pPage->getRectangle().toToolsRect()); Point aObjectPos = aPageRect.Center(); aObjectPos.AdjustX( -(aObjectSize.Width() / 2) ); aObjectPos.AdjustY( -(aObjectSize.Height() / 2) ); diff --git a/chart2/source/view/main/ChartView.cxx b/chart2/source/view/main/ChartView.cxx index d01a877040b2..fae6abcdce04 100644 --- a/chart2/source/view/main/ChartView.cxx +++ b/chart2/source/view/main/ChartView.cxx @@ -1384,7 +1384,7 @@ void ChartView::createShapes() if (pPage) //it is necessary to use the implementation here as the uno page does not provide a propertyset { - pPage->SetSize(Size(aPageSize.Width,aPageSize.Height)); + pPage->setSize({ gfx::Length::hmm(aPageSize.Width), gfx::Length::hmm(aPageSize.Height) }); } else { diff --git a/cui/source/tabpages/tpline.cxx b/cui/source/tabpages/tpline.cxx index 37fe8ef913b0..5a22be37c4e8 100644 --- a/cui/source/tabpages/tpline.cxx +++ b/cui/source/tabpages/tpline.cxx @@ -820,7 +820,7 @@ void SvxLineTabPage::Reset( const SfxItemSet* rAttrs ) new SdrModel(nullptr, nullptr, true)); pModel->GetItemPool().FreezeIdRanges(); rtl::Reference<SdrPage> pPage = new SdrPage( *pModel, false ); - pPage->SetSize(Size(1000,1000)); + pPage->setSize({ 1_cm, 1_cm }); pModel->InsertPage( pPage.get(), 0 ); { SdrView aView( *pModel, pVDev ); @@ -1449,7 +1449,7 @@ IMPL_LINK_NOARG(SvxLineTabPage, MenuCreateHdl_Impl, weld::Toggleable&, void) pModel->GetItemPool().FreezeIdRanges(); // Page rtl::Reference<SdrPage> pPage = new SdrPage( *pModel, false ); - pPage->SetSize(Size(1000,1000)); + pPage->setSize({ 1_cm, 1_cm }); pModel->InsertPage( pPage.get(), 0 ); { // 3D View diff --git a/filter/source/msfilter/svdfppt.cxx b/filter/source/msfilter/svdfppt.cxx index 0a93095d4ddf..c38c7b0536cc 100644 --- a/filter/source/msfilter/svdfppt.cxx +++ b/filter/source/msfilter/svdfppt.cxx @@ -1247,7 +1247,7 @@ rtl::Reference<SdrObject> SdrEscherImport::ProcessObj( SvStream& rSt, DffObjData { if ( rObjData.nSpFlags & ShapeFlag::Background ) { - pRet->NbcSetSnapRect( tools::Rectangle( Point(), rData.pPage.page->GetSize() ) ); // set size + pRet->NbcSetSnapRect(rData.pPage.page->getRectangle().toToolsRect()); // set size } if (rPersistEntry.xSolverContainer) { @@ -2666,7 +2666,8 @@ bool SdrPowerPointImport::SeekToShape( SvStream& rSt, SvxMSDffClientData* pClien rtl::Reference<SdrPage> SdrPowerPointImport::MakeBlankPage( bool bMaster ) const { rtl::Reference<SdrPage> pRet = pSdrModel->AllocPage( bMaster ); - pRet->SetSize( GetPageSize() ); + Size const& rSize = GetPageSize(); + pRet->setSize({ gfx::Length::hmm(rSize.Width()), gfx::Length::hmm(rSize.Height()) }); return pRet; } @@ -2808,7 +2809,7 @@ void SdrPowerPointImport::ImportPage( SdrPage* pRet, const PptSlidePersistEntry* { case DFF_msofbtSpContainer : { - tools::Rectangle aPageSize( Point(), pRet->GetSize() ); + tools::Rectangle aPageSize = pRet->getRectangle().toToolsRect(); if ( rSlidePersist.aSlideAtom.nFlags & 4 ) // follow master background? { if ( HasMasterPage( m_nCurrentPageNum, m_eCurrentPageKind ) ) @@ -3056,15 +3057,8 @@ rtl::Reference<SdrObject> SdrPowerPointImport::ImportPageBackgroundObject( const pSet->Put( XFillStyleItem( drawing::FillStyle_NONE ) ); } pSet->Put( XLineStyleItem( drawing::LineStyle_NONE ) ); - tools::Rectangle aRect( - rPage.GetLeftBorder(), - rPage.GetUpperBorder(), - rPage.GetWidth() - rPage.GetRightBorder(), - rPage.GetHeight() - rPage.GetLowerBorder()); - - pRet = new SdrRectObj( - *pSdrModel, - aRect); + tools::Rectangle aRect = rPage.getInnerRectangle().toToolsRect(); + pRet = new SdrRectObj(*pSdrModel, aRect); pRet->SetMergedItemSet(*pSet); pRet->SetMarkProtect( true ); diff --git a/filter/source/svg/svgfilter.cxx b/filter/source/svg/svgfilter.cxx index d84591d0c155..29a0958be9bb 100644 --- a/filter/source/svg/svgfilter.cxx +++ b/filter/source/svg/svgfilter.cxx @@ -321,12 +321,13 @@ bool SVGFilter::filterImpressOrDraw( const Sequence< PropertyValue >& rDescripto // in comparison. Use a common scaling factor for hor/ver to not get // asynchronous border distances, though. All in all this will adapt borders // nicely and is based on office-defaults for standard-page-border-sizes. - const Size aPageSize(pTargetSdrPage->GetSize()); + const gfx::Size2DL aPageSize = pTargetSdrPage->getSize(); const double fBorderRelation(( - static_cast< double >(pTargetSdrPage->GetLeftBorder()) / aPageSize.Width() + - static_cast< double >(pTargetSdrPage->GetRightBorder()) / aPageSize.Width() + - static_cast< double >(pTargetSdrPage->GetUpperBorder()) / aPageSize.Height() + - static_cast< double >(pTargetSdrPage->GetLowerBorder()) / aPageSize.Height()) / 4.0); + pTargetSdrPage->getBorder().getLeft() / aPageSize.getWidth() + + pTargetSdrPage->getBorder().getRight() / aPageSize.getWidth() + + pTargetSdrPage->getBorder().getUpper() / aPageSize.getHeight() + + pTargetSdrPage->getBorder().getLower() / aPageSize.getHeight()) / 4.0); + const tools::Long nAllBorder(basegfx::fround((aGraphicSize.Width() + aGraphicSize.Height()) * fBorderRelation * 0.5)); // Adapt PageSize and Border stuff. To get all MasterPages and PresObjs diff --git a/include/svx/svdmodel.hxx b/include/svx/svdmodel.hxx index 81ec0927db4c..8082be7ed193 100644 --- a/include/svx/svdmodel.hxx +++ b/include/svx/svdmodel.hxx @@ -39,6 +39,7 @@ #include <svx/svdtypes.hxx> #include <svx/svxdllapi.h> +#include <basegfx/units/Length.hxx> #include <rtl/ref.hxx> #include <deque> @@ -378,6 +379,13 @@ public: MapUnit GetScaleUnit() const { return m_eObjUnit; } void SetScaleUnit(MapUnit eMap); + gfx::LengthUnit getUnit() const + { + return m_eObjUnit == MapUnit::MapTwip + ? gfx::LengthUnit::twip + : gfx::LengthUnit::hmm; + } + // maximal size e.g. for auto growing texts const Size& GetMaxObjSize() const { return m_aMaxObjSize; } void SetMaxObjSize(const Size& rSiz) { m_aMaxObjSize=rSiz; } diff --git a/include/svx/svdpage.hxx b/include/svx/svdpage.hxx index c70a2f1f4a2d..b613cf26d043 100644 --- a/include/svx/svdpage.hxx +++ b/include/svx/svdpage.hxx @@ -24,6 +24,7 @@ #include <vcl/prntypes.hxx> #include <svl/itemset.hxx> #include <svx/sdrpageuser.hxx> +#include <svx/svdmodel.hxx> #include <svx/sdr/contact/viewobjectcontactredirector.hxx> #include <svx/sdrmasterpagedescriptor.hxx> #include <svx/svxdllapi.h> @@ -31,10 +32,12 @@ #include <com/sun/star/drawing/XDrawPage.hpp> #include <svx/svdobj.hxx> #include <unotools/weakref.hxx> +#include <basegfx/units/Length.hxx> #include <memory> #include <optional> #include <vector> #include <deque> +#include <basegfx/units/Size2DLWrap.hxx> // predefines @@ -42,7 +45,6 @@ namespace model { class Theme; } namespace reportdesign { class OSection; } namespace sdr::contact { class ViewContact; } class SdrPage; -class SdrModel; class SfxItemPool; class SdrPageView; class SdrLayerAdmin; @@ -361,6 +363,77 @@ public: void dumpAsXml(xmlTextWriterPtr pWriter) const; }; +namespace svx +{ + +class Border +{ +private: + gfx::Length maLeft; + gfx::Length maRight; + gfx::Length maUpper; + gfx::Length maLower; + gfx::LengthUnit meUnit; + +public: + Border(gfx::LengthUnit eUnit = gfx::LengthUnit::hmm) + : maLeft(0_emu) + , maRight(0_emu) + , maUpper(0_emu) + , maLower(0_emu) + , meUnit(eUnit) + {} + + gfx::Length const& left() const { return maLeft; } + gfx::Length const& right() const { return maRight; } + gfx::Length const& upper() const { return maUpper; } + gfx::Length const& lower() const { return maLower; } + + gfx::Length const& getLeft() const { return maLeft; } + gfx::Length const& getRight() const { return maRight; } + gfx::Length const& getUpper() const { return maUpper; } + gfx::Length const& getLower() const { return maLower; } + + tools::Long leftUnit() const { return maLeft.as(meUnit); } + tools::Long rightUnit() const { return maRight.as(meUnit); } + tools::Long upperUnit() const { return maUpper.as(meUnit); } + tools::Long lowerUnit() const { return maLower.as(meUnit); } + + tools::Rectangle toToolsRect() const + { + return tools::Rectangle(leftUnit(), upperUnit(), rightUnit(), lowerUnit()); + } + + bool isEmpty() const + { + return maLeft == 0_emu + && maRight == 0_emu + && maUpper == 0_emu + && maLower == 0_emu; + } + + void setLeft(gfx::Length const& rLeft) + { + maLeft = rLeft; + } + + void setRight(gfx::Length const& rRight) + { + maRight = rRight; + } + + void setUpper(gfx::Length const& rUpper) + { + maUpper = rUpper; + } + + void setLower(gfx::Length const& rLower) + { + maLower = rLower; + } +}; + +} // end svx /** A SdrPage contains exactly one SdrObjList and a description of the physical @@ -423,12 +496,9 @@ private: SdrModel& mrSdrModelFromSdrPage; private: - tools::Long mnWidth; // page size - tools::Long mnHeight; // page size - sal_Int32 mnBorderLeft; // left page margin - sal_Int32 mnBorderUpper; // top page margin - sal_Int32 mnBorderRight; // right page margin - sal_Int32 mnBorderLower; // bottom page margin + gfx::Size2DLWrap maSize; + svx::Border maBorder; + bool mbBackgroundFullSize = false; ///< Background object to represent the whole page. std::unique_ptr<SdrLayerAdmin> mpLayerAdmin; @@ -485,21 +555,51 @@ public: void setPageBorderOnlyLeftRight(bool bNew) { mbPageBorderOnlyLeftRight = bNew; } bool getPageBorderOnlyLeftRight() const { return mbPageBorderOnlyLeftRight; } - virtual void SetSize(const Size& aSiz); - Size GetSize() const; + gfx::LengthUnit getUnit() const { return getSdrModelFromSdrPage().getUnit(); } + virtual void setSize(gfx::Size2DLWrap const& rSize); + + void setToolsSize(Size const rSize) + { + setSize(gfx::Size2DLWrap::create(rSize, getUnit())); + } + + const gfx::Size2DLWrap& getSize() const + { + return maSize; + } + + gfx::Range2DLWrap getRectangle() const + { + return gfx::Range2DLWrap(0_emu, 0_emu, maSize.getWidth(), maSize.getHeight(), getUnit()); + } + + gfx::Range2DLWrap getInnerRectangle() const + { + return gfx::Range2DLWrap(maBorder.getLeft(), maBorder.getUpper(), + maSize.getWidth() - maBorder.getRight(), + maSize.getHeight() - maBorder.getLower(), + getUnit()); + } + virtual void SetOrientation(Orientation eOri); virtual Orientation GetOrientation() const; - tools::Long GetWidth() const; - tools::Long GetHeight() const; - virtual void SetBorder(sal_Int32 nLft, sal_Int32 nUpp, sal_Int32 nRgt, sal_Int32 Lwr); + + virtual svx::Border const& getBorder() const + { + return maBorder; + } + + virtual void setBorder(svx::Border const& rBorder) + { + maBorder = rBorder; + } + + virtual void SetBorder(sal_Int32 nLeft, sal_Int32 nUpper, sal_Int32 nRight, sal_Int32 Lower); virtual void SetLeftBorder(sal_Int32 nBorder); virtual void SetUpperBorder(sal_Int32 nBorder); virtual void SetRightBorder(sal_Int32 nBorder); virtual void SetLowerBorder(sal_Int32 nBorder); - sal_Int32 GetLeftBorder() const; - sal_Int32 GetUpperBorder() const; - sal_Int32 GetRightBorder() const; - sal_Int32 GetLowerBorder() const; + void SetBackgroundFullSize(bool bIn); bool IsBackgroundFullSize() const; diff --git a/reportdesign/source/ui/report/ReportSection.cxx b/reportdesign/source/ui/report/ReportSection.cxx index e983c4bc214d..4d59bd294000 100644 --- a/reportdesign/source/ui/report/ReportSection.cxx +++ b/reportdesign/source/ui/report/ReportSection.cxx @@ -221,9 +221,10 @@ void OReportSection::fill() // m_pPage->SetUpperBorder(-10000); m_pView->SetDesignMode(); - - m_pPage->SetSize( Size( getStyleProperty<awt::Size>(xReportDefinition,PROPERTY_PAPERSIZE).Width,5*m_xSection->getHeight()) ); - const Size aPageSize = m_pPage->GetSize(); + auto aWidth = getStyleProperty<awt::Size>(xReportDefinition, PROPERTY_PAPERSIZE).Width; + auto aHeight = 5 * m_xSection->getHeight(); + m_pPage->setToolsSize(Size(aWidth, aHeight)); + const Size aPageSize = m_pPage->getSize().toToolsSize(); m_pView->SetWorkArea( tools::Rectangle( Point( nLeftMargin, 0), Size(aPageSize.Width() - nLeftMargin - nRightMargin,aPageSize.Height()) ) ); } @@ -481,12 +482,12 @@ void OReportSection::_propertyChanged(const beans::PropertyChangeEvent& _rEvent) { m_pPage->SetRightBorder(nRightMargin); } - const Size aOldPageSize = m_pPage->GetSize(); + const Size aOldPageSize = m_pPage->getSize().toToolsSize(); sal_Int32 nNewHeight = 5*m_xSection->getHeight(); if ( aOldPageSize.Height() != nNewHeight || nPaperWidth != aOldPageSize.Width() ) { - m_pPage->SetSize( Size( nPaperWidth,nNewHeight) ); - const Size aPageSize = m_pPage->GetSize(); + m_pPage->setToolsSize(Size(nPaperWidth, nNewHeight)); + const Size aPageSize = m_pPage->getSize().toToolsSize(); m_pView->SetWorkArea( tools::Rectangle( Point( nLeftMargin, 0), Size(aPageSize.Width() - nLeftMargin - nRightMargin,aPageSize.Height()) ) ); } impl_adjustObjectSizePosition(nPaperWidth,nLeftMargin,nRightMargin); diff --git a/reportdesign/source/ui/report/SectionView.cxx b/reportdesign/source/ui/report/SectionView.cxx index e5c425ace570..73b89986f178 100644 --- a/reportdesign/source/ui/report/SectionView.cxx +++ b/reportdesign/source/ui/report/SectionView.cxx @@ -85,7 +85,7 @@ void OSectionView::MakeVisible( const tools::Rectangle& rRect, vcl::Window& rWin const sal_Int32 nVisBottom = aVisRect.Bottom(); // don't scroll beyond the page size - Size aPageSize = m_pSectionWindow->getPage()->GetSize(); + Size aPageSize = m_pSectionWindow->getPage()->getSize().toToolsSize(); const sal_Int32 nPageWidth = aPageSize.Width(); const sal_Int32 nPageHeight = aPageSize.Height(); diff --git a/sc/source/core/data/drawpage.cxx b/sc/source/core/data/drawpage.cxx index 9baa9be3ca6a..43034dde81f5 100644 --- a/sc/source/core/data/drawpage.cxx +++ b/sc/source/core/data/drawpage.cxx @@ -24,8 +24,8 @@ ScDrawPage::ScDrawPage(ScDrawLayer& rNewModel, bool bMasterPage) : FmFormPage(rNewModel, bMasterPage) { - SetSize( Size( SAL_MAX_INT32, SAL_MAX_INT32 ) ); - // largest size supported by sal_Int32 SdrPage::mnWidth/Height + setToolsSize(Size(SAL_MAX_INT32, SAL_MAX_INT32)); + // largest size supported by sal_Int32 SdrPage::mnWidth/Height } ScDrawPage::~ScDrawPage() diff --git a/sc/source/core/data/drwlayer.cxx b/sc/source/core/data/drwlayer.cxx index 80bebd1be8a2..c5b7967d323b 100644 --- a/sc/source/core/data/drwlayer.cxx +++ b/sc/source/core/data/drwlayer.cxx @@ -647,9 +647,9 @@ void ScDrawLayer::SetPageSize(sal_uInt16 nPageNo, const Size& rSize, bool bUpdat if (!pPage) return; - if ( rSize != pPage->GetSize() ) + if (rSize != pPage->getSize().toToolsSize()) { - pPage->SetSize( rSize ); + pPage->setToolsSize(rSize); Broadcast( ScTabSizeChangedHint( static_cast<SCTAB>(nPageNo) ) ); // SetWorkArea() on the views } diff --git a/sc/source/core/data/postit.cxx b/sc/source/core/data/postit.cxx index fa84f0212b81..a9f32f781251 100644 --- a/sc/source/core/data/postit.cxx +++ b/sc/source/core/data/postit.cxx @@ -366,7 +366,7 @@ void ScCaptionCreator::Initialize() mbNegPage = mrDoc.IsNegativePage( maPos.Tab() ); if( SdrPage* pDrawPage = GetDrawPage() ) { - maPageRect = tools::Rectangle( Point( 0, 0 ), pDrawPage->GetSize() ); + maPageRect = pDrawPage->getRectangle().toToolsRect(); /* #i98141# SdrPage::GetSize() returns negative width in RTL mode. The call to Rectangle::Adjust() orders left/right coordinate accordingly. */ diff --git a/sc/source/filter/rtf/eeimpars.cxx b/sc/source/filter/rtf/eeimpars.cxx index a2eca4858c2b..841a0f5c9b89 100644 --- a/sc/source/filter/rtf/eeimpars.cxx +++ b/sc/source/filter/rtf/eeimpars.cxx @@ -601,7 +601,7 @@ void ScEEImport::InsertGraphic( SCCOL nCol, SCROW nRow, SCTAB nTab, aLogicSize = pDefaultDev->PixelToLogic( aSizePix, MapMode( MapUnit::Map100thMM ) ); // Limit size - ::ScLimitSizeOnDrawPage( aLogicSize, aInsertPos, pPage->GetSize() ); + ::ScLimitSizeOnDrawPage(aLogicSize, aInsertPos, pPage->getSize().toToolsSize()); if ( pI->oGraphic ) { diff --git a/sc/source/ui/app/client.cxx b/sc/source/ui/app/client.cxx index 5c44bc077e83..5960a9239c37 100644 --- a/sc/source/ui/app/client.cxx +++ b/sc/source/ui/app/client.cxx @@ -99,7 +99,7 @@ void ScClient::RequestNewObjectArea( tools::Rectangle& aLogicRect ) return; Point aPos; - Size aSize = pPage->GetSize(); + Size aSize = pPage->getSize().toToolsSize(); if ( aSize.Width() < 0 ) { aPos.setX( aSize.Width() + 1 ); // negative diff --git a/sc/source/ui/drawfunc/fuins1.cxx b/sc/source/ui/drawfunc/fuins1.cxx index 9b51a62c5b2a..1d41666ac79a 100644 --- a/sc/source/ui/drawfunc/fuins1.cxx +++ b/sc/source/ui/drawfunc/fuins1.cxx @@ -179,7 +179,7 @@ static void lcl_InsertGraphic( const Graphic& rGraphic, if ( rData.GetDocument().IsNegativePage( rData.GetTabNo() ) ) aInsertPos.AdjustX( -(aLogicSize.Width()) ); // move position to left edge - ScLimitSizeOnDrawPage( aLogicSize, aInsertPos, pPage->GetSize() ); + ScLimitSizeOnDrawPage(aLogicSize, aInsertPos, pPage->getSize().toToolsSize()); tools::Rectangle aRect ( aInsertPos, aLogicSize ); @@ -233,7 +233,7 @@ static void lcl_InsertMedia( const OUString& rMediaURL, bool bApi, else aSize = Size( 5000, 5000 ); - ScLimitSizeOnDrawPage( aSize, aInsertPos, pPage->GetSize() ); + ScLimitSizeOnDrawPage(aSize, aInsertPos, pPage->getSize().toToolsSize()); if( rData.GetDocument().IsNegativePage( rData.GetTabNo() ) ) aInsertPos.AdjustX( -(aSize.Width()) ); diff --git a/sc/source/ui/view/drawview.cxx b/sc/source/ui/view/drawview.cxx index c1a48dc6df12..416a75a1c2ae 100644 --- a/sc/source/ui/view/drawview.cxx +++ b/sc/source/ui/view/drawview.cxx @@ -265,9 +265,9 @@ void ScDrawView::UpdateWorkArea() SdrPage* pPage = GetModel().GetPage(static_cast<sal_uInt16>(nTab)); if (pPage) { - Size aPageSize( pPage->GetSize() ); + Size aPageSize(pPage->getSize().toToolsSize()); tools::Rectangle aNewArea( Point(), aPageSize ); - if ( aPageSize.Width() < 0 ) + if (aPageSize.Width() < 0) { // RTL: from max.negative (left) to zero (right) aNewArea.SetRight( 0 ); diff --git a/sc/source/ui/view/viewfun7.cxx b/sc/source/ui/view/viewfun7.cxx index f704256756fe..2e919e21198d 100644 --- a/sc/source/ui/view/viewfun7.cxx +++ b/sc/source/ui/view/viewfun7.cxx @@ -57,7 +57,7 @@ static void lcl_AdjustInsertPos( ScViewData& rData, Point& rPos, const Size& rSi { SdrPage* pPage = rData.GetScDrawView()->GetModel().GetPage( static_cast<sal_uInt16>(rData.GetTabNo()) ); OSL_ENSURE(pPage,"pPage ???"); - Size aPgSize( pPage->GetSize() ); + Size aPgSize(pPage->getSize().toToolsSize()); if (aPgSize.Width() < 0) aPgSize.setWidth( -aPgSize.Width() ); tools::Long x = aPgSize.Width() - rPos.X() - rSize.Width(); diff --git a/sd/inc/sdpage.hxx b/sd/inc/sdpage.hxx index ef127ea60769..6c0da7ed6c92 100644 --- a/sd/inc/sdpage.hxx +++ b/sd/inc/sdpage.hxx @@ -156,7 +156,8 @@ public: virtual rtl::Reference<SdrPage> CloneSdrPage(SdrModel& rTargetModel) const override; - virtual void SetSize(const Size& aSize) override; + virtual void setSize(gfx::Size2DLWrap const& rSize) override; + virtual void SetBorder(sal_Int32 nLft, sal_Int32 nUpp, sal_Int32 nRgt, sal_Int32 Lwr) override; virtual void SetLeftBorder(sal_Int32 nBorder) override; virtual void SetRightBorder(sal_Int32 nBorder) override; diff --git a/sd/source/core/CustomAnimationEffect.cxx b/sd/source/core/CustomAnimationEffect.cxx index f041d0e1e45b..5982632f5a56 100644 --- a/sd/source/core/CustomAnimationEffect.cxx +++ b/sd/source/core/CustomAnimationEffect.cxx @@ -1584,8 +1584,8 @@ void CustomAnimationEffect::updateSdrPathObjFromPath( SdrPathObj& rPathObj ) SdrPage* pPage = pObj->getSdrPageFromSdrObject(); if( pPage ) { - const Size aPageSize( pPage->GetSize() ); - aPolyPoly.transform(basegfx::utils::createScaleB2DHomMatrix(static_cast<double>(aPageSize.Width()), static_cast<double>(aPageSize.Height()))); + const auto aPageSize = pPage->getSize().toB2DSize(); + aPolyPoly.transform(basegfx::utils::createScaleB2DHomMatrix(aPageSize.getWidth(), aPageSize.getHeight())); } const ::tools::Rectangle aBoundRect( pObj->GetCurrentBoundRect() ); @@ -1625,9 +1625,10 @@ void CustomAnimationEffect::updatePathFromSdrPathObj( const SdrPathObj& rPathObj SdrPage* pPage = pObj->getSdrPageFromSdrObject(); if( pPage ) { - const Size aPageSize( pPage->GetSize() ); + const auto aPageSize = pPage->getSize().toB2DSize(); aPolyPoly.transform(basegfx::utils::createScaleB2DHomMatrix( - 1.0 / static_cast<double>(aPageSize.Width()), 1.0 / static_cast<double>(aPageSize.Height()))); + 1.0 / aPageSize.getWidth(), + 1.0 / aPageSize.getHeight())); } } diff --git a/sd/source/core/drawdoc.cxx b/sd/source/core/drawdoc.cxx index 8df4f49c1d9a..7c4a302f282b 100644 --- a/sd/source/core/drawdoc.cxx +++ b/sd/source/core/drawdoc.cxx @@ -441,9 +441,11 @@ void SdDrawDocument::AdaptPageSizeForAllPages( new SdPageFormatUndoAction( this, pPage, - pPage->GetSize(), - pPage->GetLeftBorder(), pPage->GetRightBorder(), - pPage->GetUpperBorder(), pPage->GetLowerBorder(), + pPage->getSize().toToolsSize(), + pPage->getBorder().leftUnit(), + pPage->getBorder().rightUnit(), + pPage->getBorder().upperUnit(), + pPage->getBorder().lowerUnit(), pPage->GetOrientation(), pPage->GetPaperBin(), pPage->IsBackgroundFullSize(), @@ -464,7 +466,7 @@ void SdDrawDocument::AdaptPageSizeForAllPages( if (rNewSize.Width() > 0) { - pPage->SetSize(rNewSize); + pPage->setToolsSize(rNewSize); } } @@ -496,9 +498,11 @@ void SdDrawDocument::AdaptPageSizeForAllPages( new SdPageFormatUndoAction( this, pPage, - pPage->GetSize(), - pPage->GetLeftBorder(), pPage->GetRightBorder(), - pPage->GetUpperBorder(), pPage->GetLowerBorder(), + pPage->getSize().toToolsSize(), + pPage->getBorder().leftUnit(), + pPage->getBorder().rightUnit(), + pPage->getBorder().upperUnit(), + pPage->getBorder().lowerUnit(), pPage->GetOrientation(), pPage->GetPaperBin(), pPage->IsBackgroundFullSize(), @@ -519,7 +523,7 @@ void SdDrawDocument::AdaptPageSizeForAllPages( if (rNewSize.Width() > 0) { - pPage->SetSize(rNewSize); + pPage->setToolsSize(rNewSize); } } diff --git a/sd/source/core/drawdoc2.cxx b/sd/source/core/drawdoc2.cxx index 4feb8f10c6fd..7caebb76925b 100644 --- a/sd/source/core/drawdoc2.cxx +++ b/sd/source/core/drawdoc2.cxx @@ -526,12 +526,12 @@ void SdDrawDocument::CreateFirstPages( SdDrawDocument const * pRefDocument /* = if( pRefPage ) { - pHandoutPage->SetSize(pRefPage->GetSize()); - pHandoutPage->SetBorder( pRefPage->GetLeftBorder(), pRefPage->GetUpperBorder(), pRefPage->GetRightBorder(), pRefPage->GetLowerBorder() ); + pHandoutPage->setSize(pRefPage->getSize()); + pHandoutPage->setBorder(pRefPage->getBorder()); } else { - pHandoutPage->SetSize(aDefSize); + pHandoutPage->setToolsSize(aDefSize); pHandoutPage->SetBorder(0, 0, 0, 0); } @@ -541,12 +541,9 @@ void SdDrawDocument::CreateFirstPages( SdDrawDocument const * pRefDocument /* = // Insert master page and register this with the handout page rtl::Reference<SdPage> pHandoutMPage = AllocSdPage(true); - pHandoutMPage->SetSize( pHandoutPage->GetSize() ); + pHandoutMPage->setSize(pHandoutPage->getSize()); pHandoutMPage->SetPageKind(PageKind::Handout); - pHandoutMPage->SetBorder( pHandoutPage->GetLeftBorder(), - pHandoutPage->GetUpperBorder(), - pHandoutPage->GetRightBorder(), - pHandoutPage->GetLowerBorder() ); + pHandoutMPage->setBorder(pHandoutPage->getBorder()); InsertMasterPage(pHandoutMPage.get(), 0); pHandoutPage->TRG_SetMasterPage( *pHandoutMPage ); @@ -565,13 +562,13 @@ void SdDrawDocument::CreateFirstPages( SdDrawDocument const * pRefDocument /* = if( pRefPage ) { - pPage->SetSize( pRefPage->GetSize() ); - pPage->SetBorder( pRefPage->GetLeftBorder(), pRefPage->GetUpperBorder(), pRefPage->GetRightBorder(), pRefPage->GetLowerBorder() ); + pPage->setSize(pRefPage->getSize()); + pPage->setBorder(pRefPage->getBorder()); } else if (meDocType == DocumentType::Draw) { // Draw: always use default size with margins - pPage->SetSize(aDefSize); + pPage->setToolsSize(aDefSize); SfxPrinter* pPrinter = mpDocSh->GetPrinter(false); if (pPrinter && pPrinter->IsValid()) @@ -601,9 +598,9 @@ void SdDrawDocument::CreateFirstPages( SdDrawDocument const * pRefDocument /* = else { // Impress: always use screen format, landscape. - Size aSz( SvxPaperInfo::GetPaperSize(PAPER_SCREEN_16_9, MapUnit::Map100thMM) ); - pPage->SetSize( Size( aSz.Height(), aSz.Width() ) ); - pPage->SetBorder(0, 0, 0, 0); + Size aSize = SvxPaperInfo::GetPaperSize(PAPER_SCREEN_16_9, MapUnit::Map100thMM); + pPage->setToolsSize(Size(aSize.Height(), aSize.Width())); + pPage->setBorder(svx::Border()); } InsertPage(pPage.get(), 1); @@ -616,11 +613,8 @@ void SdDrawDocument::CreateFirstPages( SdDrawDocument const * pRefDocument /* = // Insert master page, then register this with the page rtl::Reference<SdPage> pMPage = AllocSdPage(true); - pMPage->SetSize( pPage->GetSize() ); - pMPage->SetBorder( pPage->GetLeftBorder(), - pPage->GetUpperBorder(), - pPage->GetRightBorder(), - pPage->GetLowerBorder() ); + pMPage->setSize(pPage->getSize()); + pMPage->setBorder(pPage->getBorder()); InsertMasterPage(pMPage.get(), 1); pPage->TRG_SetMasterPage( *pMPage ); if( bClipboard ) @@ -634,19 +628,19 @@ void SdDrawDocument::CreateFirstPages( SdDrawDocument const * pRefDocument /* = if( pRefPage ) { - pNotesPage->SetSize( pRefPage->GetSize() ); - pNotesPage->SetBorder( pRefPage->GetLeftBorder(), pRefPage->GetUpperBorder(), pRefPage->GetRightBorder(), pRefPage->GetLowerBorder() ); + pNotesPage->setSize(pRefPage->getSize()); + pNotesPage->setBorder(pRefPage->getBorder()); } else { // Always use portrait format if (aDefSize.Height() >= aDefSize.Width()) { - pNotesPage->SetSize(aDefSize); + pNotesPage->setToolsSize(aDefSize); } else { - pNotesPage->SetSize( Size(aDefSize.Height(), aDefSize.Width()) ); + pNotesPage->setToolsSize(Size(aDefSize.Height(), aDefSize.Width())); } pNotesPage->SetBorder(0, 0, 0, 0); @@ -658,12 +652,9 @@ void SdDrawDocument::CreateFirstPages( SdDrawDocument const * pRefDocument /* = // Insert master page, then register this with the notes page rtl::Reference<SdPage> pNotesMPage = AllocSdPage(true); - pNotesMPage->SetSize( pNotesPage->GetSize() ); + pNotesMPage->setSize(pNotesPage->getSize()); pNotesMPage->SetPageKind(PageKind::Notes); - pNotesMPage->SetBorder( pNotesPage->GetLeftBorder(), - pNotesPage->GetUpperBorder(), - pNotesPage->GetRightBorder(), - pNotesPage->GetLowerBorder() ); + pNotesMPage->setBorder(pNotesPage->getBorder()); InsertMasterPage(pNotesMPage.get(), 2); pNotesPage->TRG_SetMasterPage( *pNotesMPage ); if( bClipboard ) @@ -1108,11 +1099,8 @@ void SdDrawDocument::CheckMasterPages() pNewNotesPage->SetPageKind(PageKind::Notes); if( pRefNotesPage ) { - pNewNotesPage->SetSize( pRefNotesPage->GetSize() ); - pNewNotesPage->SetBorder( pRefNotesPage->GetLeftBorder(), - pRefNotesPage->GetUpperBorder(), - pRefNotesPage->GetRightBorder(), - pRefNotesPage->GetLowerBorder() ); + pNewNotesPage->setSize(pRefNotesPage->getSize()); + pNewNotesPage->setBorder(pRefNotesPage->getBorder()); } InsertMasterPage(pNewNotesPage.get(), nPage ); pNewNotesPage->SetLayoutName( pPage->GetLayoutName() ); @@ -1178,11 +1166,8 @@ sal_uInt16 SdDrawDocument::CreatePage ( // Set the size here since else the presobj autolayout // will be wrong. - pStandardPage->SetSize( pPreviousStandardPage->GetSize() ); - pStandardPage->SetBorder( pPreviousStandardPage->GetLeftBorder(), - pPreviousStandardPage->GetUpperBorder(), - pPreviousStandardPage->GetRightBorder(), - pPreviousStandardPage->GetLowerBorder() ); + pStandardPage->setSize(pPreviousStandardPage->getSize()); + pStandardPage->setBorder(pPreviousStandardPage->getBorder()); // Use master page of current page. pStandardPage->TRG_SetMasterPage(pPreviousStandardPage->TRG_GetMasterPage()); @@ -1367,11 +1352,8 @@ void SdDrawDocument::SetupNewPage ( { if (pPreviousPage != nullptr) { - pPage->SetSize( pPreviousPage->GetSize() ); - pPage->SetBorder( pPreviousPage->GetLeftBorder(), - pPreviousPage->GetUpperBorder(), - pPreviousPage->GetRightBorder(), - pPreviousPage->GetLowerBorder() ); + pPage->setSize(pPreviousPage->getSize()); + pPage->setBorder(pPreviousPage->getBorder()); } pPage->SetName(sPageName); diff --git a/sd/source/core/drawdoc3.cxx b/sd/source/core/drawdoc3.cxx index 5310789d2988..5ef2a51523fc 100644 --- a/sd/source/core/drawdoc3.cxx +++ b/sd/source/core/drawdoc3.cxx @@ -424,19 +424,13 @@ bool SdDrawDocument::InsertBookmarkAsPage( // before the first page. // Note that the pointers are used later on as general page pointers. SdPage* pRefPage = GetSdPage(0, PageKind::Standard); - Size aSize(pRefPage->GetSize()); - sal_Int32 nLeft = pRefPage->GetLeftBorder(); - sal_Int32 nRight = pRefPage->GetRightBorder(); - sal_Int32 nUpper = pRefPage->GetUpperBorder(); - sal_Int32 nLower = pRefPage->GetLowerBorder(); + Size aSize = pRefPage->getSize().toToolsSize(); + auto aBorder = pRefPage->getBorder(); Orientation eOrient = pRefPage->GetOrientation(); SdPage* pNPage = GetSdPage(0, PageKind::Notes); - Size aNSize(pNPage->GetSize()); - sal_Int32 nNLeft = pNPage->GetLeftBorder(); - sal_Int32 nNRight = pNPage->GetRightBorder(); - sal_Int32 nNUpper = pNPage->GetUpperBorder(); - sal_Int32 nNLower = pNPage->GetLowerBorder(); + Size aNSize = pNPage->getSize().toToolsSize(); + auto aNBorder = pNPage->getBorder(); Orientation eNOrient = pNPage->GetOrientation(); // Adapt page size and margins to those of the later pages? @@ -462,11 +456,11 @@ bool SdDrawDocument::InsertBookmarkAsPage( { SdPage* pBMPage = pBookmarkDoc->GetSdPage(0,PageKind::Standard); - if (pBMPage->GetSize() != pRefPage->GetSize() || - pBMPage->GetLeftBorder() != pRefPage->GetLeftBorder() || - pBMPage->GetRightBorder() != pRefPage->GetRightBorder() || - pBMPage->GetUpperBorder() != pRefPage->GetUpperBorder() || - pBMPage->GetLowerBorder() != pRefPage->GetLowerBorder()) + if (pBMPage->getSize() != pRefPage->getSize() || + pBMPage->getBorder().getLeft() != pRefPage->getBorder().getLeft() || + pBMPage->getBorder().getRight() != pRefPage->getBorder().getRight() || + pBMPage->getBorder().getUpper() != pRefPage->getBorder().getUpper() || + pBMPage->getBorder().getLower() != pRefPage->getBorder().getLower()) { OUString aStr(SdResId(STR_SCALE_OBJECTS)); std::unique_ptr<weld::MessageDialog> xQueryBox(Application::CreateMessageDialog(nullptr, @@ -877,11 +871,11 @@ bool SdDrawDocument::InsertBookmarkAsPage( if (bScaleObjects) { - ::tools::Rectangle aBorderRect(nLeft, nUpper, nRight, nLower); + tools::Rectangle aBorderRect(aBorder.toToolsRect()); pRefPage->ScaleObjects(aSize, aBorderRect, true); } - pRefPage->SetSize(aSize); - pRefPage->SetBorder(nLeft, nUpper, nRight, nLower); + pRefPage->setToolsSize(aSize); + pRefPage->setBorder(aBorder); pRefPage->SetOrientation( eOrient ); if( bRemoveEmptyPresObj ) @@ -896,12 +890,12 @@ bool SdDrawDocument::InsertBookmarkAsPage( if (bScaleObjects) { - ::tools::Rectangle aBorderRect(nNLeft, nNUpper, nNRight, nNLower); + tools::Rectangle aBorderRect(aNBorder.toToolsRect()); pRefPage->ScaleObjects(aNSize, aBorderRect, true); } - pRefPage->SetSize(aNSize); - pRefPage->SetBorder(nNLeft, nNUpper, nNRight, nNLower); + pRefPage->setToolsSize(aNSize); + pRefPage->setBorder(aNBorder); pRefPage->SetOrientation( eNOrient ); if( bRemoveEmptyPresObj ) @@ -919,11 +913,11 @@ bool SdDrawDocument::InsertBookmarkAsPage( { if (bScaleObjects) { - ::tools::Rectangle aBorderRect(nLeft, nUpper, nRight, nLower); + tools::Rectangle aBorderRect(aBorder.toToolsRect()); pRefPage->ScaleObjects(aSize, aBorderRect, true); } - pRefPage->SetSize(aSize); - pRefPage->SetBorder(nLeft, nUpper, nRight, nLower); + pRefPage->setToolsSize(aNSize); + pRefPage->setBorder(aBorder); pRefPage->SetOrientation( eOrient ); uno::Reference< drawing::XDrawPage > xNewPage(GetMasterPage(nPage)->getUnoPage(), uno::UNO_QUERY_THROW); @@ -954,11 +948,11 @@ bool SdDrawDocument::InsertBookmarkAsPage( { if (bScaleObjects) { - ::tools::Rectangle aBorderRect(nNLeft, nNUpper, nNRight, nNLower); + tools::Rectangle aBorderRect(aNBorder.toToolsRect()); pRefPage->ScaleObjects(aNSize, aBorderRect, true); } - pRefPage->SetSize(aNSize); - pRefPage->SetBorder(nNLeft, nNUpper, nNRight, nNLower); + pRefPage->setToolsSize(aNSize); + pRefPage->setBorder(aNBorder); pRefPage->SetOrientation( eNOrient ); } @@ -1128,7 +1122,7 @@ bool SdDrawDocument::InsertBookmarkAsObject( } else { - aObjPos = ::tools::Rectangle(Point(), pPage->GetSize()).Center(); + aObjPos = ::tools::Rectangle(Point(), pPage->getSize().toToolsSize()).Center(); } size_t nCountBefore = 0; @@ -1763,31 +1757,21 @@ void SdDrawDocument::SetMasterPage(sal_uInt16 nSdPageNum, // Adapt new master pages if (pSourceDoc != this) { - Size aSize(rOldMaster.GetSize()); - ::tools::Rectangle aBorderRect(rOldMaster.GetLeftBorder(), - rOldMaster.GetUpperBorder(), - rOldMaster.GetRightBorder(), - rOldMaster.GetLowerBorder()); + Size aSize = rOldMaster.getSize().toToolsSize(); + + tools::Rectangle aBorderRect(rOldMaster.getBorder().toToolsRect()); + pMaster->ScaleObjects(aSize, aBorderRect, true); - pMaster->SetSize(aSize); - pMaster->SetBorder(rOldMaster.GetLeftBorder(), - rOldMaster.GetUpperBorder(), - rOldMaster.GetRightBorder(), - rOldMaster.GetLowerBorder()); + pMaster->setSize(rOldMaster.getSize()); + pMaster->setBorder(rOldMaster.getBorder()); pMaster->SetOrientation( rOldMaster.GetOrientation() ); pMaster->SetAutoLayout(pMaster->GetAutoLayout()); - aSize = rOldNotesMaster.GetSize(); - ::tools::Rectangle aNotesBorderRect(rOldNotesMaster.GetLeftBorder(), - rOldNotesMaster.GetUpperBorder(), - rOldNotesMaster.GetRightBorder(), - rOldNotesMaster.GetLowerBorder()); + aSize = rOldNotesMaster.getSize().toToolsSize(); + tools::Rectangle aNotesBorderRect(rOldNotesMaster.getBorder().toToolsRect()); pNotesMaster->ScaleObjects(aSize, aNotesBorderRect, true); - pNotesMaster->SetSize(aSize); - pNotesMaster->SetBorder(rOldNotesMaster.GetLeftBorder(), - rOldNotesMaster.GetUpperBorder(), - rOldNotesMaster.GetRightBorder(), - rOldNotesMaster.GetLowerBorder()); + pNotesMaster->setSize(rOldNotesMaster.getSize()); + pNotesMaster->setBorder(rOldNotesMaster.getBorder()); pNotesMaster->SetOrientation( rOldNotesMaster.GetOrientation() ); pNotesMaster->SetAutoLayout(pNotesMaster->GetAutoLayout()); @@ -1822,11 +1806,8 @@ void SdDrawDocument::SetMasterPage(sal_uInt16 nSdPageNum, } pMaster = AllocSdPage(true); - pMaster->SetSize(pSelectedPage->GetSize()); - pMaster->SetBorder(pSelectedPage->GetLeftBorder(), - pSelectedPage->GetUpperBorder(), - pSelectedPage->GetRightBorder(), - pSelectedPage->GetLowerBorder() ); + pMaster->setSize(pSelectedPage->getSize()); + pMaster->setBorder(pSelectedPage->getBorder()); pMaster->SetName(aName); pMaster->SetLayoutName(aPageLayoutName); InsertMasterPage(pMaster.get()); @@ -1838,11 +1819,8 @@ void SdDrawDocument::SetMasterPage(sal_uInt16 nSdPageNum, pNotesMaster = AllocSdPage(true); pNotesMaster->SetPageKind(PageKind::Notes); - pNotesMaster->SetSize(pNotes->GetSize()); -e ... etc. - the rest is truncated