diff options
-rw-r--r-- | include/svx/svdoashp.hxx | 1 | ||||
-rw-r--r-- | include/svx/svdotext.hxx | 1 | ||||
-rw-r--r-- | svx/qa/unit/customshapes.cxx | 2 | ||||
-rw-r--r-- | svx/source/sdr/contact/viewcontactofsdrobjcustomshape.cxx | 21 | ||||
-rw-r--r-- | svx/source/svdraw/svdoashp.cxx | 17 | ||||
-rw-r--r-- | svx/source/svdraw/svdotextdecomposition.cxx | 35 |
6 files changed, 41 insertions, 36 deletions
diff --git a/include/svx/svdoashp.hxx b/include/svx/svdoashp.hxx index 535060caf5ca..dd1a86d24bca 100644 --- a/include/svx/svdoashp.hxx +++ b/include/svx/svdoashp.hxx @@ -142,7 +142,6 @@ public: double GetObjectRotation() const { return fObjectRotation;} double GetExtraTextRotation( const bool bPreRotation = false ) const; - double GetCameraRotation() const; SdrObjCustomShape(SdrModel& rSdrModel); diff --git a/include/svx/svdotext.hxx b/include/svx/svdotext.hxx index 5ee175520251..9e680b30d0fd 100644 --- a/include/svx/svdotext.hxx +++ b/include/svx/svdotext.hxx @@ -577,6 +577,7 @@ public: // Set single item at the local ItemSet. *Does not use* AllowItemChange(), // ItemChange(), PostItemChange() and ItemSetChanged() calls. void SetObjectItemNoBroadcast(const SfxPoolItem& rItem); + double GetCameraZRotation() const; public: diff --git a/svx/qa/unit/customshapes.cxx b/svx/qa/unit/customshapes.cxx index ea5df12b27c3..0c362cac17a1 100644 --- a/svx/qa/unit/customshapes.cxx +++ b/svx/qa/unit/customshapes.cxx @@ -525,7 +525,7 @@ CPPUNIT_TEST_FIXTURE(CustomshapesTest, testTdf126060_3D_Z_Rotation) SdrObjCustomShape& rSdrObjCustomShape( static_cast<SdrObjCustomShape&>(*GetSdrObjectFromXShape(xShape))); - if (rSdrObjCustomShape.GetCameraRotation() != 90) + if (rSdrObjCustomShape.GetCameraZRotation() != 90) sErrors += "Wrong text camera Z rotation"; basegfx::B2DHomMatrix aObjectTransform; diff --git a/svx/source/sdr/contact/viewcontactofsdrobjcustomshape.cxx b/svx/source/sdr/contact/viewcontactofsdrobjcustomshape.cxx index 3ac982af73df..e6e8d2f1d0a5 100644 --- a/svx/source/sdr/contact/viewcontactofsdrobjcustomshape.cxx +++ b/svx/source/sdr/contact/viewcontactofsdrobjcustomshape.cxx @@ -159,18 +159,13 @@ namespace sdr::contact // #i101684# get the text range unrotated and absolute to the object range const basegfx::B2DRange aTextRange(getCorrectedTextBoundRect()); - // Get the text range before unrotated and independent from object range - const tools::Rectangle aIndTextRect(Point(aTextRange.getMinX(), aTextRange.getMinY()), GetCustomShapeObj().GetTextSize()); - const basegfx::B2DRange aIndTextRange = vcl::unotools::b2DRectangleFromRectangle(aIndTextRect); - // Rotation before scaling - if(!basegfx::fTools::equalZero(GetCustomShapeObj().GetExtraTextRotation(true)) || - !basegfx::fTools::equalZero(GetCustomShapeObj().GetCameraRotation())) + if(!basegfx::fTools::equalZero(GetCustomShapeObj().GetExtraTextRotation(true))) { basegfx::B2DVector aTranslation(0.5, 0.5); aTextBoxMatrix.translate( -aTranslation.getX(), -aTranslation.getY() ); aTextBoxMatrix.rotate(basegfx::deg2rad( - 360.0 - GetCustomShapeObj().GetExtraTextRotation(true) - GetCustomShapeObj().GetCameraRotation())); + 360.0 - GetCustomShapeObj().GetExtraTextRotation(true))); aTextBoxMatrix.translate( aTranslation.getX(), aTranslation.getY() ); } // give text object a size @@ -178,7 +173,6 @@ namespace sdr::contact // check if we have a rotation/shear at all to take care of const double fExtraTextRotation(GetCustomShapeObj().GetExtraTextRotation()); - const double fTextCameraZRotation(GetCustomShapeObj().GetCameraRotation()); const GeoStat& rGeoStat(GetCustomShapeObj().GetGeoStat()); if(rGeoStat.nShearAngle || rGeoStat.nRotationAngle || !basegfx::fTools::equalZero(fExtraTextRotation)) @@ -191,13 +185,13 @@ namespace sdr::contact aTextRange.getMinY() - aObjectRange.getMinimum().getY()); } - if(!basegfx::fTools::equalZero(fExtraTextRotation) || !basegfx::fTools::equalZero(fTextCameraZRotation)) + if(!basegfx::fTools::equalZero(fExtraTextRotation)) { basegfx::B2DVector aTranslation( ( aTextRange.getWidth() / 2 ) + ( aTextRange.getMinX() - aObjectRange.getMinimum().getX() ), ( aTextRange.getHeight() / 2 ) + ( aTextRange.getMinY() - aObjectRange.getMinimum().getY() ) ); aTextBoxMatrix.translate( -aTranslation.getX(), -aTranslation.getY() ); - aTextBoxMatrix.rotate(basegfx::deg2rad(360.0 - fExtraTextRotation + fTextCameraZRotation)); + aTextBoxMatrix.rotate(basegfx::deg2rad(360.0 - fExtraTextRotation)); aTextBoxMatrix.translate( aTranslation.getX(), aTranslation.getY() ); } @@ -214,13 +208,6 @@ namespace sdr::contact // give text it's target position aTextBoxMatrix.translate(aObjectRange.getMinimum().getX(), aObjectRange.getMinimum().getY()); } - // If text overflows from textbox we should use text info instead of textbox to relocation. - else if((aTextRange.getWidth() < aIndTextRange.getWidth() || - aTextRange.getHeight() < aIndTextRange.getHeight()) && - !basegfx::fTools::equalZero(fTextCameraZRotation)) - { - aTextBoxMatrix.translate(aIndTextRange.getCenterX(), aIndTextRange.getCenterY()); - } else { aTextBoxMatrix.translate(aTextRange.getMinX(), aTextRange.getMinY()); diff --git a/svx/source/svdraw/svdoashp.cxx b/svx/source/svdraw/svdoashp.cxx index 344e2d6036fb..1708dc64ccc3 100644 --- a/svx/source/svdraw/svdoashp.cxx +++ b/svx/source/svdraw/svdoashp.cxx @@ -517,23 +517,6 @@ double SdrObjCustomShape::GetExtraTextRotation( const bool bPreRotation ) const return fExtraTextRotateAngle; } -double SdrObjCustomShape::GetCameraRotation() const -{ - const css::uno::Any* pAny; - double fTextCameraZRotateAngle = 0.0; - const SdrCustomShapeGeometryItem& rGeometryItem = GetMergedItem( SDRATTR_CUSTOMSHAPE_GEOMETRY ); - const OUString sTextCameraZRotateAngle( "TextCameraZRotateAngle" ); - - pAny = rGeometryItem.GetPropertyValueByName(sTextCameraZRotateAngle); - - if ( pAny ) - *pAny >>= fTextCameraZRotateAngle; - - return fTextCameraZRotateAngle; -} - - - bool SdrObjCustomShape::GetTextBounds( tools::Rectangle& rTextBound ) const { bool bRet = false; diff --git a/svx/source/svdraw/svdotextdecomposition.cxx b/svx/source/svdraw/svdotextdecomposition.cxx index 8769b16b8ddc..3e67fe51b25c 100644 --- a/svx/source/svdraw/svdotextdecomposition.cxx +++ b/svx/source/svdraw/svdotextdecomposition.cxx @@ -23,6 +23,7 @@ #include <svx/svdpage.hxx> #include <svx/svdotext.hxx> #include <svx/svdmodel.hxx> +#include <svx/sdasitm.hxx> #include <textchain.hxx> #include <textchainflow.hxx> #include <svx/sdtacitm.hxx> @@ -42,6 +43,7 @@ #include <drawinglayer/animation/animationtiming.hxx> #include <basegfx/color/bcolor.hxx> #include <vcl/svapp.hxx> +#include <vcl/canvastools.hxx> #include <editeng/escapementitem.hxx> #include <editeng/svxenum.hxx> #include <editeng/flditem.hxx> @@ -1093,6 +1095,23 @@ void SdrTextObj::impDecomposeBlockTextPrimitive( const basegfx::B2DTuple aAdjOffset(fStartInX, fStartInY); basegfx::B2DHomMatrix aNewTransformA(basegfx::utils::createTranslateB2DHomMatrix(aAdjOffset.getX(), aAdjOffset.getY())); + // Apply the camera rotation. It have to be applied after adjustment of + // the text (top, bottom, center, left, right). + if(GetCameraZRotation() != 0) + { + // First find the text rect. + basegfx::B2DRange aTextRectangle(/*x1=*/aTranslate.getX() + aAdjustTranslate.getX(), + /*y1=*/aTranslate.getY() + aAdjustTranslate.getY(), + /*x2=*/aTranslate.getX() + aOutlinerScale.getX() - aAdjustTranslate.getX(), + /*y2=*/aTranslate.getY() + aOutlinerScale.getY() - aAdjustTranslate.getY()); + + // Rotate the text from the center point. + basegfx::B2DVector aTranslateToCenter(aTextRectangle.getWidth() / 2, aTextRectangle.getHeight() / 2); + aNewTransformA.translate(-aTranslateToCenter.getX(), -aTranslateToCenter.getY()); + aNewTransformA.rotate(basegfx::deg2rad(360.0 - GetCameraZRotation() )); + aNewTransformA.translate(aTranslateToCenter.getX(), aTranslateToCenter.getY()); + } + // mirroring. We are now in aAnchorTextRange sizes. When mirroring in X and Y, // move the null point which was top left to bottom right. const bool bMirrorX(basegfx::fTools::less(aScale.getX(), 0.0)); @@ -1104,6 +1123,7 @@ void SdrTextObj::impDecomposeBlockTextPrimitive( bMirrorX ? -1.0 : 1.0, bMirrorY ? -1.0 : 1.0, fShearX, fRotate, aTranslate.getX(), aTranslate.getY())); + // create ClipRange (if needed) basegfx::B2DRange aClipRange; @@ -1642,4 +1662,19 @@ void SdrTextObj::impDecomposeBlockTextPrimitiveDirect( rTarget.append(aConverter.getPrimitive2DSequence()); } +double SdrTextObj::GetCameraZRotation() const +{ + const css::uno::Any* pAny; + double fTextCameraZRotateAngle = 0.0; + const SfxItemSet& rSet = GetObjectItemSet(); + const SdrCustomShapeGeometryItem& rGeometryItem(rSet.Get(SDRATTR_CUSTOMSHAPE_GEOMETRY)); + + pAny = rGeometryItem.GetPropertyValueByName("TextCameraZRotateAngle"); + + if ( pAny ) + *pAny >>= fTextCameraZRotateAngle; + + return fTextCameraZRotateAngle; +} + /* vim:set shiftwidth=4 softtabstop=4 expandtab: */ |