summaryrefslogtreecommitdiff
path: root/xmloff
diff options
context:
space:
mode:
authorArmin Le Grand <alg@apache.org>2012-11-21 13:23:01 +0000
committerCaolán McNamara <caolanm@redhat.com>2013-06-07 20:12:22 +0100
commit13ef16423e78d3ea825172594f08c47d2f9bfd09 (patch)
tree5882e5a8bde7aa687502516941d4c94da8d48ccb /xmloff
parent8c1fd9c39966a0eda71e9e9c8f80a89dd5eb6ef4 (diff)
For backward compatibility take mirrorings in setTransformation into account
Also found an error in SdrObjCustomShape::TRGetBaseGeometry when MirrorY was used (cherry picked from commit 4116c33b12d3787c406f0348f89efcb1cf409507) Conflicts: xmloff/source/draw/ximpshap.cxx xmloff/source/draw/ximpshap.hxx Change-Id: Id85ae4c4f5e26d53d501c72b84fc0e1b5cfe23b2
Diffstat (limited to 'xmloff')
-rw-r--r--xmloff/source/draw/ximpshap.cxx73
-rw-r--r--xmloff/source/draw/ximpshap.hxx3
2 files changed, 60 insertions, 16 deletions
diff --git a/xmloff/source/draw/ximpshap.cxx b/xmloff/source/draw/ximpshap.cxx
index 19067031d44f..54eb00bf55c6 100644
--- a/xmloff/source/draw/ximpshap.cxx
+++ b/xmloff/source/draw/ximpshap.cxx
@@ -33,7 +33,6 @@
#include <com/sun/star/drawing/EscapeDirection.hpp>
#include <com/sun/star/media/ZoomLevel.hpp>
#include <com/sun/star/awt/Rectangle.hpp>
-
#include <com/sun/star/style/XStyleFamiliesSupplier.hpp>
#include <com/sun/star/container/XNameAccess.hpp>
#include <comphelper/extract.hxx>
@@ -69,7 +68,6 @@
#include "XMLImageMapContext.hxx"
#include "sdpropls.hxx"
#include "eventimp.hxx"
-
#include "descriptionimp.hxx"
#include "ximpcustomshape.hxx"
#include "XMLEmbeddedObjectImportContext.hxx"
@@ -79,6 +77,8 @@
#include <com/sun/star/container/XChild.hpp>
#include <com/sun/star/text/XTextDocument.hpp>
#include <basegfx/point/b2dpoint.hxx>
+#include <basegfx/vector/b2dvector.hxx>
+
using namespace ::com::sun::star;
using namespace ::com::sun::star::uno;
@@ -153,6 +153,7 @@ SdXMLShapeContext::SdXMLShapeContext(
, mnZOrder(-1)
, maSize(1, 1)
, maPosition(0, 0)
+, maUsedTransformation()
, mbVisible(true)
, mbPrintable(true)
, mbHaveXmlId(false)
@@ -529,7 +530,7 @@ void SdXMLShapeContext::SetTransformation()
uno::Reference< beans::XPropertySet > xPropSet(mxShape, uno::UNO_QUERY);
if(xPropSet.is())
{
- ::basegfx::B2DHomMatrix aTransformation;
+ maUsedTransformation.identity();
if(maSize.Width != 1 || maSize.Height != 1)
{
@@ -540,13 +541,13 @@ void SdXMLShapeContext::SetTransformation()
maSize.Height = 1;
// set global size. This should always be used.
- aTransformation.scale(maSize.Width, maSize.Height);
+ maUsedTransformation.scale(maSize.Width, maSize.Height);
}
if(maPosition.X != 0 || maPosition.Y != 0)
{
// if global position is used, add it to transformation
- aTransformation.translate(maPosition.X, maPosition.Y);
+ maUsedTransformation.translate(maPosition.X, maPosition.Y);
}
if(mnTransform.NeedsAction())
@@ -560,24 +561,24 @@ void SdXMLShapeContext::SetTransformation()
mnTransform.GetFullTransform(aMat);
// now add to transformation
- aTransformation *= aMat;
+ maUsedTransformation *= aMat;
}
// now set transformation for this object
uno::Any aAny;
drawing::HomogenMatrix3 aMatrix;
- aMatrix.Line1.Column1 = aTransformation.get(0, 0);
- aMatrix.Line1.Column2 = aTransformation.get(0, 1);
- aMatrix.Line1.Column3 = aTransformation.get(0, 2);
+ aMatrix.Line1.Column1 = maUsedTransformation.get(0, 0);
+ aMatrix.Line1.Column2 = maUsedTransformation.get(0, 1);
+ aMatrix.Line1.Column3 = maUsedTransformation.get(0, 2);
- aMatrix.Line2.Column1 = aTransformation.get(1, 0);
- aMatrix.Line2.Column2 = aTransformation.get(1, 1);
- aMatrix.Line2.Column3 = aTransformation.get(1, 2);
+ aMatrix.Line2.Column1 = maUsedTransformation.get(1, 0);
+ aMatrix.Line2.Column2 = maUsedTransformation.get(1, 1);
+ aMatrix.Line2.Column3 = maUsedTransformation.get(1, 2);
- aMatrix.Line3.Column1 = aTransformation.get(2, 0);
- aMatrix.Line3.Column2 = aTransformation.get(2, 1);
- aMatrix.Line3.Column3 = aTransformation.get(2, 2);
+ aMatrix.Line3.Column1 = maUsedTransformation.get(2, 0);
+ aMatrix.Line3.Column2 = maUsedTransformation.get(2, 1);
+ aMatrix.Line3.Column3 = maUsedTransformation.get(2, 2);
aAny <<= aMatrix;
@@ -3741,6 +3742,48 @@ void SdXMLCustomShapeContext::StartElement( const uno::Reference< xml::sax::XAtt
void SdXMLCustomShapeContext::EndElement()
{
+ // for backward compatibility, the above SetTransformation() may alraedy have
+ // applied a call to SetMirroredX/SetMirroredY. This is not yet added to the
+ // beans::PropertyValues in maCustomShapeGeometry. When applying these now, this
+ // would be lost again.
+ // TTTT: Remove again after aw080
+ if(!maUsedTransformation.isIdentity())
+ {
+ basegfx::B2DVector aScale, aTranslate;
+ double fRotate, fShearX;
+
+ maUsedTransformation.decompose(aScale, aTranslate, fRotate, fShearX);
+
+ bool bFlippedX(aScale.getX() < 0.0);
+ bool bFlippedY(aScale.getY() < 0.0);
+
+ if(bFlippedX && bFlippedY)
+ {
+ // when both are used it is the same as 180 degree rotation; reset
+ bFlippedX = bFlippedY = false;
+ }
+
+ if(bFlippedX || bFlippedY)
+ {
+ beans::PropertyValue aNewPoroperty;
+
+ if(bFlippedX)
+ {
+ aNewPoroperty.Name = rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("MirroredX"));
+ }
+ else
+ {
+ aNewPoroperty.Name = rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("MirroredY"));
+ }
+
+ aNewPoroperty.Handle = -1;
+ aNewPoroperty.Value <<= sal_True;
+ aNewPoroperty.State = beans::PropertyState_DIRECT_VALUE;
+
+ maCustomShapeGeometry.push_back(aNewPoroperty);
+ }
+ }
+
if ( !maCustomShapeGeometry.empty() )
{
const OUString sCustomShapeGeometry ( "CustomShapeGeometry" );
diff --git a/xmloff/source/draw/ximpshap.hxx b/xmloff/source/draw/ximpshap.hxx
index 4d64a63e467a..ab0051573167 100644
--- a/xmloff/source/draw/ximpshap.hxx
+++ b/xmloff/source/draw/ximpshap.hxx
@@ -31,10 +31,10 @@
#include <com/sun/star/awt/Point.hpp>
#include <tools/rtti.hxx>
#include "xexptran.hxx"
-
#include <vector>
#include <xmloff/shapeimport.hxx>
#include <xmloff/xmlmultiimagehelper.hxx>
+#include <basegfx/matrix/b2dhommatrix.hxx>
//////////////////////////////////////////////////////////////////////////////
// common shape context
@@ -75,6 +75,7 @@ protected:
SdXMLImExTransform2D mnTransform;
com::sun::star::awt::Size maSize;
com::sun::star::awt::Point maPosition;
+ basegfx::B2DHomMatrix maUsedTransformation;
bool mbVisible;
bool mbPrintable;