diff options
author | Gülşah Köse <gulsah.kose@collabora.com> | 2020-10-05 14:57:33 +0300 |
---|---|---|
committer | Gülşah Köse <gulsah.kose@collabora.com> | 2020-10-16 12:05:02 +0200 |
commit | c7ada1cc8a294f0d2da32ffc02d0941b1b1afd29 (patch) | |
tree | 22ba18439f8dbe7ef3db43131572b4f523dc0843 /svx/source | |
parent | 3503c03ece2fd912f4ba4767894eb97d8f9aae07 (diff) |
tdf#128212 Change the text z camera rotation order.
Old order:
1) Apply all rotation values (normal and camera z)
2) Do the adjustment (top, middle, bottom)
New Order:
1) Apply rotation values except camera z
2) Do the adjustment (top, middle, bottom)
3) Apply camera z rotation.
We rotate the text at the center of the already positioned rectangle
of the text, which depends on e.g. the length of the laid out text.
This matches the PowerPoint behavior.
Change-Id: I8741cf443834bf01cc07c04318fd6205ed6a0dd6
Reviewed-on: https://gerrit.libreoffice.org/c/core/+/103965
Tested-by: Jenkins
Reviewed-by: Gülşah Köse <gulsah.kose@collabora.com>
Diffstat (limited to 'svx/source')
-rw-r--r-- | svx/source/sdr/contact/viewcontactofsdrobjcustomshape.cxx | 21 | ||||
-rw-r--r-- | svx/source/svdraw/svdoashp.cxx | 16 | ||||
-rw-r--r-- | svx/source/svdraw/svdotextdecomposition.cxx | 35 |
3 files changed, 39 insertions, 33 deletions
diff --git a/svx/source/sdr/contact/viewcontactofsdrobjcustomshape.cxx b/svx/source/sdr/contact/viewcontactofsdrobjcustomshape.cxx index ccc70b0d3805..2b1a1913f003 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 fd708af04550..4a3910174f6f 100644 --- a/svx/source/svdraw/svdoashp.cxx +++ b/svx/source/svdraw/svdoashp.cxx @@ -511,22 +511,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 ); - - pAny = rGeometryItem.GetPropertyValueByName("TextCameraZRotateAngle"); - - 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 1650ffa71fab..aacc10bf4b7b 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> @@ -43,6 +44,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> @@ -1109,6 +1111,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)); @@ -1120,6 +1139,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; @@ -1658,4 +1678,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: */ |