diff options
Diffstat (limited to 'oox/source')
-rw-r--r-- | oox/source/drawingml/shape.cxx | 9 | ||||
-rw-r--r-- | oox/source/export/drawingml.cxx | 37 |
2 files changed, 39 insertions, 7 deletions
diff --git a/oox/source/drawingml/shape.cxx b/oox/source/drawingml/shape.cxx index f8f65d09f59f..c9ade16f7a1d 100644 --- a/oox/source/drawingml/shape.cxx +++ b/oox/source/drawingml/shape.cxx @@ -1410,8 +1410,7 @@ Reference< XShape > const & Shape::createAndInsert( nTextRotateAngle -= mnDiagramRotation; - bool isUpright = getTextBody()->getTextProperties().moUpright; - if (isUpright) + if (getTextBody()->getTextProperties().moUpright) { // When upright is set, we want the text without any rotation. // But if we set 0 here, the text is still rotated if the @@ -1419,8 +1418,10 @@ Reference< XShape > const & Shape::createAndInsert( // Hence, we rotate the text into the opposite direction of // the rotation of the shape, by as much as the shape was rotated. mpCustomShapePropertiesPtr->setTextRotateAngle(mnRotation / 60000); - // Also put this away in a GrabBag. - putPropertyToGrabBag("Upright", Any(isUpright)); + // Also put the initial angles away in a GrabBag. + putPropertyToGrabBag("Upright", Any(true)); + putPropertyToGrabBag("nShapeRotationAtImport", Any(mnRotation / 60000)); + putPropertyToGrabBag("nTextRotationAtImport", Any(mnRotation / 60000)); } else { diff --git a/oox/source/export/drawingml.cxx b/oox/source/export/drawingml.cxx index 01f926c0c90c..4a9ac9f69014 100644 --- a/oox/source/export/drawingml.cxx +++ b/oox/source/export/drawingml.cxx @@ -2954,20 +2954,31 @@ void DrawingML::WriteText(const Reference<XInterface>& rXIface, bool bBodyPr, bo pWrap = "square"; } - bool isUpright = false; std::optional<OUString> sHorzOverflow; std::optional<OUString> sVertOverflow; + sal_Int32 nShapeRotateAngle = 0; + if (GetProperty(rXPropSet, "RotateAngle")) + nShapeRotateAngle = rXPropSet->getPropertyValue("RotateAngle").get<sal_Int32>() / 300; + Reference< XPropertySet > xTextSet(xXText, UNO_QUERY); + sal_Int32 nShapeTextRotateAngle = 0; + if (GetProperty(xTextSet, "RotateAngle")) + nShapeTextRotateAngle = rXPropSet->getPropertyValue("RotateAngle").get<sal_Int32>() / 300; + std::optional<OString> isUpright; if (GetProperty(rXPropSet, "InteropGrabBag")) { if (rXPropSet->getPropertySetInfo()->hasPropertyByName("InteropGrabBag")) { + bool bUpright = false; + sal_Int32 nOldShapeRotation = 0; + sal_Int32 nOldTextRotation = 0; uno::Sequence<beans::PropertyValue> aGrabBag; rXPropSet->getPropertyValue("InteropGrabBag") >>= aGrabBag; for (const auto& aProp : std::as_const(aGrabBag)) { if (aProp.Name == "Upright") { - aProp.Value >>= isUpright; + aProp.Value >>= bUpright; + isUpright = OString(bUpright ? "1" : "0"); } else if (aProp.Name == "horzOverflow") { @@ -2982,6 +2993,26 @@ void DrawingML::WriteText(const Reference<XInterface>& rXIface, bool bBodyPr, bo sVertOverflow = sValue; } } + if (bUpright) + { + for (auto& aProp : aGrabBag) + { + if (aProp.Name == "nShapeRotationAtImport") + aProp.Value >>= nOldShapeRotation; + else if (aProp.Name == "nTextRotationAtImport") + aProp.Value >>= nOldTextRotation; + } + // So our shape with the textbox in it was not rotated. + // Keep upright and make the preRotateAngle 0, it is an attribute + // of textBodyPr and must be 0 when upright is true, otherwise + // bad rotation happens in MSO. + if (nShapeRotateAngle == nOldShapeRotation && nShapeTextRotateAngle == nOldTextRotation) + nTextPreRotateAngle = 0; + // So we rotated the shape, in this case lose upright and do + // as LO normally does. + else + isUpright.reset(); + } } } @@ -2997,7 +3028,7 @@ void DrawingML::WriteText(const Reference<XInterface>& rXIface, bool bBodyPr, bo XML_anchor, sVerticalAlignment, XML_anchorCtr, sax_fastparser::UseIf("1", bHorizontalCenter), XML_vert, sWritingMode, - XML_upright, isUpright ? "1" : "0", + XML_upright, isUpright, XML_rot, sax_fastparser::UseIf(oox::drawingml::calcRotationValue((nTextPreRotateAngle + nTextRotateAngle) * 100), (nTextPreRotateAngle + nTextRotateAngle) != 0)); if (bIsFontworkShape) { |