summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorGülşah Köse <gulsah.kose@collabora.com>2020-10-05 14:57:33 +0300
committerAndras Timar <andras.timar@collabora.com>2020-10-20 11:01:42 +0200
commit1fdc64bead03d06a4697bfaff28e3a1d6b60cc32 (patch)
treea995f5fa742e7d4173429537df300082647e6ada
parent19b8ded3ae18dd4070a3e21d7b980782a27e5547 (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> Reviewed-on: https://gerrit.libreoffice.org/c/core/+/104545 Reviewed-by: Andras Timar <andras.timar@collabora.com>
-rw-r--r--include/svx/svdoashp.hxx1
-rw-r--r--include/svx/svdotext.hxx1
-rw-r--r--svx/qa/unit/customshapes.cxx2
-rw-r--r--svx/source/sdr/contact/viewcontactofsdrobjcustomshape.cxx21
-rw-r--r--svx/source/svdraw/svdoashp.cxx17
-rw-r--r--svx/source/svdraw/svdotextdecomposition.cxx35
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: */