From 144ca12ef3e17e1d315a496b456cd2bb4cd08744 Mon Sep 17 00:00:00 2001 From: Miklos Vajna Date: Mon, 12 Aug 2013 15:51:45 +0200 Subject: [PATCH] VML import: handle rotation on groupshapes Change-Id: I37f0081ae0a8af838c9f5bf158b340d726d7d1a3 --- oox/source/vml/vmlshape.cxx | 13 ++++++++++--- .../ooxmlimport/data/groupshape-rotation.docx | Bin 0 -> 10462 bytes sw/qa/extras/ooxmlimport/ooxmlimport.cxx | 10 ++++++++++ 3 files changed, 20 insertions(+), 3 deletions(-) create mode 100755 sw/qa/extras/ooxmlimport/data/groupshape-rotation.docx diff --git a/oox/source/vml/vmlshape.cxx b/oox/source/vml/vmlshape.cxx index 405c6686457f..e1df8e6ac520 100644 --- a/oox/source/vml/vmlshape.cxx +++ b/oox/source/vml/vmlshape.cxx @@ -490,6 +490,13 @@ void lcl_SetAnchorType(PropertySet& rPropSet, const ShapeTypeModel& rTypeModel) lcl_setSurround( rPropSet, rTypeModel ); } +void lcl_SetRotation(PropertySet& rPropSet, const sal_Int32 nRotation) +{ + // See DffPropertyReader::Fix16ToAngle(): in VML, positive rotation angles are clockwise, we have them as counter-clockwise. + // Additionally, VML type is 0..360, our is 0.36000. + rPropSet.setAnyProperty(PROP_RotateAngle, makeAny(sal_Int32(NormAngle360(nRotation * -100)))); +} + Reference< XShape > SimpleShape::implConvertAndInsert( const Reference< XShapes >& rxShapes, const awt::Rectangle& rShapeRect ) const { awt::Rectangle aShapeRect(rShapeRect); @@ -580,9 +587,7 @@ Reference< XShape > SimpleShape::implConvertAndInsert( const Reference< XShapes PropertySet aPropertySet(xShape); if (xShape.is() && oRotation) { - // See DffPropertyReader::Fix16ToAngle(): in VML, positive rotation angles are clockwise, we have them as counter-clockwise. - // Additionally, VML type is 0..360, our is 0.36000. - aPropertySet.setAnyProperty(PROP_RotateAngle, makeAny(sal_Int32(NormAngle360((*oRotation) * -100)))); + lcl_SetRotation(aPropertySet, *oRotation); // If rotation is used, simple setPosition() is not enough. aPropertySet.setAnyProperty(PROP_HoriOrientPosition, makeAny( aShapeRect.X ) ); aPropertySet.setAnyProperty(PROP_VertOrientPosition, makeAny( aShapeRect.Y ) ); @@ -984,6 +989,8 @@ Reference< XShape > GroupShape::implConvertAndInsert( const Reference< XShapes > // Make sure group shapes are inline as well, unless there is an explicit different style. PropertySet aPropertySet(xGroupShape); lcl_SetAnchorType(aPropertySet, maTypeModel); + if (!maTypeModel.maRotation.isEmpty()) + lcl_SetRotation(aPropertySet, maTypeModel.maRotation.toInt32()); return xGroupShape; } diff --git a/sw/qa/extras/ooxmlimport/data/groupshape-rotation.docx b/sw/qa/extras/ooxmlimport/data/groupshape-rotation.docx new file mode 100755 index 0000000000000000000000000000000000000000..d63b5d0734e15f41cc81491ce421047a90ac1b45 GIT binary patch literal 10462 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 i?q3Wli2st_|8e$|(xTables->getByIndex(0), "RelativeWidth")); } +void Test::testGroupshapeRotation() +{ + // Rotation on groupshapes wasn't handled at all by the VML importer. + uno::Reference xDrawPageSupplier(mxComponent, uno::UNO_QUERY); + uno::Reference xDraws(xDrawPageSupplier->getDrawPage(), uno::UNO_QUERY); + CPPUNIT_ASSERT_EQUAL(sal_Int32(315 * 100), getProperty(xDraws->getByIndex(0), "RotateAngle")); +} + CPPUNIT_TEST_SUITE_REGISTRATION(Test); CPPUNIT_PLUGIN_IMPLEMENT();