diff options
author | Miklos Vajna <vmiklos@collabora.co.uk> | 2015-11-11 08:57:31 +0100 |
---|---|---|
committer | Miklos Vajna <vmiklos@collabora.co.uk> | 2015-11-11 08:57:53 +0100 |
commit | 11129d89b152db54c86bb2bda58c24b8abb6c5a8 (patch) | |
tree | 54b65fad83cd1b018bf691055216b48d26b0df5f | |
parent | fdeaa040059647f7bd1d103f2971e945bbe18659 (diff) |
tdf#85232 WPG import: fix handling of line shapes
The missing convertMm100ToTwip() calls mispositioned the line shapes
inside the groupshape in case of using drawingML inside DOCX files.
Change-Id: I0c9d652de43d779f9073a8bfe22866ce4f31d0fa
-rw-r--r-- | oox/source/drawingml/shape.cxx | 13 | ||||
-rw-r--r-- | sw/qa/extras/ooxmlimport/data/tdf85232.docx | bin | 0 -> 24373 bytes | |||
-rw-r--r-- | sw/qa/extras/ooxmlimport/ooxmlimport.cxx | 11 |
3 files changed, 22 insertions, 2 deletions
diff --git a/oox/source/drawingml/shape.cxx b/oox/source/drawingml/shape.cxx index 7d329b23ecd1..6f8475978a2b 100644 --- a/oox/source/drawingml/shape.cxx +++ b/oox/source/drawingml/shape.cxx @@ -480,10 +480,11 @@ Reference< XShape > Shape::createAndInsert( aTransformation.translate( aCenter.getX(), aCenter.getY() ); } + bool bInGroup = !aParentTransformation.isIdentity(); if( maPosition.X != 0 || maPosition.Y != 0) { // if global position is used, add it to transformation - if (mbWps && aParentTransformation.isIdentity()) + if (mbWps && !bInGroup) aTransformation.translate( maPosition.X * EMU_PER_HMM, maPosition.Y * EMU_PER_HMM); else aTransformation.translate( maPosition.X, maPosition.Y ); @@ -505,10 +506,18 @@ Reference< XShape > Shape::createAndInsert( sal_Int32 i, nNumPoints = aPoly.count(); uno::Sequence< awt::Point > aPointSequence( nNumPoints ); awt::Point* pPoints = aPointSequence.getArray(); + uno::Reference<lang::XServiceInfo> xModelInfo(rFilterBase.getModel(), uno::UNO_QUERY); + bool bIsWriter = xModelInfo->supportsService("com.sun.star.text.TextDocument"); for( i = 0; i < nNumPoints; ++i ) { const ::basegfx::B2DPoint aPoint( aPoly.getB2DPoint( i ) ); - pPoints[ i ] = awt::Point( static_cast< sal_Int32 >( aPoint.getX() ), static_cast< sal_Int32 >( aPoint.getY() ) ); + if (bIsWriter && bInGroup) + // Writer's draw page is in twips, and these points get passed + // to core without any unit conversion when Writer + // postprocesses only the group shape itself. + pPoints[i] = awt::Point(static_cast<sal_Int32>(convertMm100ToTwip(aPoint.getX())), static_cast<sal_Int32>(convertMm100ToTwip(aPoint.getY()))); + else + pPoints[i] = awt::Point(static_cast<sal_Int32>(aPoint.getX()), static_cast<sal_Int32>(aPoint.getY())); } uno::Sequence< uno::Sequence< awt::Point > > aPolyPolySequence( 1 ); aPolyPolySequence.getArray()[ 0 ] = aPointSequence; diff --git a/sw/qa/extras/ooxmlimport/data/tdf85232.docx b/sw/qa/extras/ooxmlimport/data/tdf85232.docx Binary files differnew file mode 100644 index 000000000000..35e8a888148d --- /dev/null +++ b/sw/qa/extras/ooxmlimport/data/tdf85232.docx diff --git a/sw/qa/extras/ooxmlimport/ooxmlimport.cxx b/sw/qa/extras/ooxmlimport/ooxmlimport.cxx index 003872ca6016..c0232570a6b6 100644 --- a/sw/qa/extras/ooxmlimport/ooxmlimport.cxx +++ b/sw/qa/extras/ooxmlimport/ooxmlimport.cxx @@ -2909,6 +2909,17 @@ DECLARE_OOXMLIMPORT_TEST(testTdf94374, "hello.docx") CPPUNIT_ASSERT(paste("tdf94374.docx", xEnd)); } +DECLARE_OOXMLIMPORT_TEST(testTdf85232, "tdf85232.docx") +{ + uno::Reference<drawing::XShapes> xShapes(getShapeByName("Group 219"), uno::UNO_QUERY); + uno::Reference<drawing::XShape> xShape(xShapes->getByIndex(1), uno::UNO_QUERY); + uno::Reference<drawing::XShapeDescriptor> xShapeDescriptor(xShape, uno::UNO_QUERY); + // Make sure we're not testing the ellipse child. + CPPUNIT_ASSERT_EQUAL(OUString("com.sun.star.drawing.LineShape"), xShapeDescriptor->getShapeType()); + // This was 2900: horizontal position of the line was incorrect, the 3 children were not connected visually. + CPPUNIT_ASSERT_EQUAL(static_cast<sal_Int32>(2267), xShape->getPosition().X); +} + CPPUNIT_PLUGIN_IMPLEMENT(); /* vim:set shiftwidth=4 softtabstop=4 expandtab: */ |