Kaydet (Commit) 921cea89 authored tarafından Gary Houston's avatar Gary Houston Kaydeden (comit) Miklos Vajna

fdo#87488 Wrong text rotation inside a preset shape from docx

Preset shape text rotation values are read in a few places and stored in
moRotation. With these changes, moRotation is always read unchanged, but
multiplied by -1 when it's used.

Change-Id: I633d665c21daa69e15fa828a43300f10d2bf2054
Reviewed-on: https://gerrit.libreoffice.org/13561Reviewed-by: 's avatarMiklos Vajna <vmiklos@collabora.co.uk>
Tested-by: 's avatarMiklos Vajna <vmiklos@collabora.co.uk>
üst 1ca9c116
......@@ -1014,7 +1014,10 @@ Reference< XShape > Shape::createAndInsert(
if( getTextBody() )
{
sal_Int32 nTextRotateAngle = static_cast< sal_Int32 >( getTextBody()->getTextProperties().moRotation.get( 0 ) );
mpCustomShapePropertiesPtr->setTextRotateAngle( nTextRotateAngle / 60000 );
/* OOX measures text rotation clockwise in 1/60000th degrees,
relative to the containing shape. setTextRotateAngle wants
degrees anticlockwise. */
mpCustomShapePropertiesPtr->setTextRotateAngle( -1 * nTextRotateAngle / 60000 );
}
SAL_INFO("oox.cscode", "==cscode== shape name: '" << msName << "'");
......
......@@ -84,13 +84,16 @@ TextBodyPropertiesContext::TextBodyPropertiesContext( ContextHandler2Helper& rPa
// ST_TextVerticalType
if( rAttribs.hasAttribute( XML_vert ) ) {
mrTextBodyProp.moVert = rAttribs.getToken( XML_vert );
bool bRtl = rAttribs.getBool( XML_rtl, false );
sal_Int32 tVert = mrTextBodyProp.moVert.get( XML_horz );
if( tVert == XML_vert || tVert == XML_eaVert || tVert == XML_vert270 || tVert == XML_mongolianVert )
mrTextBodyProp.moRotation = -5400000*(tVert==XML_vert270?3:1);
else
if (tVert == XML_vert || tVert == XML_eaVert || tVert == XML_mongolianVert)
mrTextBodyProp.moRotation = 5400000;
else if (tVert == XML_vert270)
mrTextBodyProp.moRotation = 5400000 * 3;
else {
bool bRtl = rAttribs.getBool( XML_rtl, false );
mrTextBodyProp.maPropertyMap.setProperty( PROP_TextWritingMode,
( bRtl ? WritingMode_RL_TB : WritingMode_LR_TB ));
}
}
// ST_TextAnchoringType
......
......@@ -48,7 +48,7 @@ Transform2DContext::Transform2DContext( ContextHandler2Helper& rParent, const At
else
{
if( rAttribs.hasAttribute( XML_rot ) )
mrShape.getTextBody()->getTextProperties().moRotation = -rAttribs.getInteger( XML_rot ).get();
mrShape.getTextBody()->getTextProperties().moRotation = rAttribs.getInteger( XML_rot ).get();
}
}
......
......@@ -78,13 +78,13 @@ public:
virtual void preTest(const char* filename) SAL_OVERRIDE
{
if (OString(filename) == "smartart.docx" || OString(filename) == "strict-smartart.docx")
if (OString(filename) == "smartart.docx" || OString(filename) == "strict-smartart.docx" || OString(filename) == "fdo87488.docx")
SvtFilterOptions::Get().SetSmartArt2Shape(true);
}
virtual void postTest(const char* filename) SAL_OVERRIDE
{
if (OString(filename) == "smartart.docx" || OString(filename) == "strict-smartart.docx")
if (OString(filename) == "smartart.docx" || OString(filename) == "strict-smartart.docx" || OString(filename) == "fdo87488.docx")
SvtFilterOptions::Get().SetSmartArt2Shape(false);
}
};
......@@ -2573,6 +2573,27 @@ DECLARE_OOXMLIMPORT_TEST(testChtOutlineNumberingOoxml, "chtoutline.docx")
CPPUNIT_ASSERT_EQUAL(OUString(aExpectedSuffix,SAL_N_ELEMENTS(aExpectedSuffix)), aSuffix);
}
DECLARE_OOXMLIMPORT_TEST(testFdo87488, "fdo87488.docx")
{
// The shape on the right (index 0, CustomShape within a
// GroupShape) is rotated 90 degrees clockwise and contains text
// rotated 90 degrees anticlockwise. Must be read with SmartArt
// enabled in preTest above, otherwise it gets converted to a
// StarView MetaFile.
uno::Reference<container::XIndexAccess> group(getShape(1), uno::UNO_QUERY);
{
uno::Reference<text::XTextRange> text(group->getByIndex(0), uno::UNO_QUERY);
CPPUNIT_ASSERT_EQUAL(OUString("text2"), text->getString());
}
{
uno::Reference<beans::XPropertySet> props(group->getByIndex(0), uno::UNO_QUERY);
CPPUNIT_ASSERT_EQUAL(props->getPropertyValue("RotateAngle"),
uno::makeAny(270 * 100));
comphelper::SequenceAsHashMap geom(props->getPropertyValue("CustomShapeGeometry"));
CPPUNIT_ASSERT_EQUAL(sal_Int32(90), geom["TextPreRotateAngle"].get<sal_Int32>());
}
}
#endif
CPPUNIT_PLUGIN_IMPLEMENT();
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment