diff options
author | Radek Doulik <rodo@novell.com> | 2011-04-27 18:59:10 +0200 |
---|---|---|
committer | Radek Doulik <rodo@novell.com> | 2011-04-27 18:59:10 +0200 |
commit | a63a30f02aa6e32315e87328b331834992a57480 (patch) | |
tree | 4c8bed296c3beb6492c46aae88c154abcc922bb5 /oox | |
parent | 7760ea353cebdcba352ee1220734d9f6af22fe16 (diff) |
fix group shape transformations - part of n#621739
Diffstat (limited to 'oox')
-rw-r--r-- | oox/inc/oox/drawingml/shape.hxx | 8 | ||||
-rw-r--r-- | oox/inc/oox/ppt/pptshape.hxx | 1 | ||||
-rw-r--r-- | oox/source/drawingml/chart/chartdrawingfragment.cxx | 6 | ||||
-rw-r--r-- | oox/source/drawingml/shape.cxx | 43 | ||||
-rw-r--r-- | oox/source/ppt/pptshape.cxx | 5 | ||||
-rw-r--r-- | oox/source/ppt/slidepersist.cxx | 5 | ||||
-rw-r--r-- | oox/source/shape/ShapeContextHandler.cxx | 3 | ||||
-rw-r--r-- | oox/source/xls/drawingfragment.cxx | 3 |
8 files changed, 55 insertions, 19 deletions
diff --git a/oox/inc/oox/drawingml/shape.hxx b/oox/inc/oox/drawingml/shape.hxx index f5ad5540a7de..83e7243ccbf4 100644 --- a/oox/inc/oox/drawingml/shape.hxx +++ b/oox/inc/oox/drawingml/shape.hxx @@ -38,6 +38,7 @@ #include <com/sun/star/drawing/XDrawPage.hpp> #include <boost/shared_ptr.hpp> #include <boost/enable_shared_from_this.hpp> +#include <basegfx/matrix/b2dhommatrix.hxx> #include <vector> #include <map> @@ -142,6 +143,7 @@ public: ::oox::core::XmlFilterBase& rFilterBase, const Theme* pTheme, const ::com::sun::star::uno::Reference< ::com::sun::star::drawing::XShapes >& rxShapes, + basegfx::B2DHomMatrix& aTransformation, const ::com::sun::star::awt::Rectangle* pShapeRect = 0, ShapeIdMap* pShapeMap = 0 ); @@ -161,7 +163,8 @@ protected: const Theme* pTheme, const ::com::sun::star::uno::Reference< ::com::sun::star::drawing::XShapes >& rxShapes, const ::com::sun::star::awt::Rectangle* pShapeRect, - sal_Bool bClearText ); + sal_Bool bClearText, + basegfx::B2DHomMatrix& aTransformation ); void addChildren( ::oox::core::XmlFilterBase& rFilterBase, @@ -169,7 +172,8 @@ protected: const Theme* pTheme, const ::com::sun::star::uno::Reference< ::com::sun::star::drawing::XShapes >& rxShapes, const ::com::sun::star::awt::Rectangle& rClientRect, - ShapeIdMap* pShapeMap ); + ShapeIdMap* pShapeMap, + basegfx::B2DHomMatrix& aTransformation ); virtual ::rtl::OUString finalizeServiceName( ::oox::core::XmlFilterBase& rFilter, diff --git a/oox/inc/oox/ppt/pptshape.hxx b/oox/inc/oox/ppt/pptshape.hxx index 104a1c210d6e..e06fda634af9 100644 --- a/oox/inc/oox/ppt/pptshape.hxx +++ b/oox/inc/oox/ppt/pptshape.hxx @@ -53,6 +53,7 @@ public: const SlidePersist& rPersist, const oox::drawingml::Theme* pTheme, const ::com::sun::star::uno::Reference< ::com::sun::star::drawing::XShapes >& rxShapes, + basegfx::B2DHomMatrix& aTransformation, const com::sun::star::awt::Rectangle* pShapeRect = 0, ::oox::drawingml::ShapeIdMap* pShapeMap = 0 ); diff --git a/oox/source/drawingml/chart/chartdrawingfragment.cxx b/oox/source/drawingml/chart/chartdrawingfragment.cxx index 6c9c2e7ebde5..912f64148807 100644 --- a/oox/source/drawingml/chart/chartdrawingfragment.cxx +++ b/oox/source/drawingml/chart/chartdrawingfragment.cxx @@ -218,8 +218,10 @@ void ChartDrawingFragment::onEndElement() if( mxDrawPage.is() && mxShape.get() && mxAnchor.get() ) { Rectangle aLoc = mxAnchor->calcEmuLocation( maEmuChartRect ); - if( (aLoc.X >= 0) && (aLoc.Y >= 0) && (aLoc.Width >= 0) && (aLoc.Height >= 0) ) - mxShape->addShape( getFilter(), getFilter().getCurrentTheme(), mxDrawPage, &aLoc ); + if( (aLoc.X >= 0) && (aLoc.Y >= 0) && (aLoc.Width >= 0) && (aLoc.Height >= 0) ) { + basegfx::B2DHomMatrix aMatrix; + mxShape->addShape( getFilter(), getFilter().getCurrentTheme(), mxDrawPage, aMatrix, &aLoc ); + } } mxShape.reset(); mxAnchor.reset(); diff --git a/oox/source/drawingml/shape.cxx b/oox/source/drawingml/shape.cxx index 3aee4e919975..d9eb97047ce7 100644 --- a/oox/source/drawingml/shape.cxx +++ b/oox/source/drawingml/shape.cxx @@ -167,6 +167,7 @@ void Shape::addShape( ::oox::core::XmlFilterBase& rFilterBase, const Theme* pTheme, const Reference< XShapes >& rxShapes, + basegfx::B2DHomMatrix& aTransformation, const awt::Rectangle* pShapeRect, ShapeIdMap* pShapeMap ) { @@ -175,7 +176,8 @@ void Shape::addShape( rtl::OUString sServiceName( msServiceName ); if( sServiceName.getLength() ) { - Reference< XShape > xShape( createAndInsert( rFilterBase, sServiceName, pTheme, rxShapes, pShapeRect, sal_False ) ); + basegfx::B2DHomMatrix aMatrix( aTransformation ); + Reference< XShape > xShape( createAndInsert( rFilterBase, sServiceName, pTheme, rxShapes, pShapeRect, sal_False, aMatrix ) ); if( pShapeMap && msId.getLength() ) { @@ -185,7 +187,7 @@ void Shape::addShape( // if this is a group shape, we have to add also each child shape Reference< XShapes > xShapes( xShape, UNO_QUERY ); if ( xShapes.is() ) - addChildren( rFilterBase, *this, pTheme, xShapes, pShapeRect ? *pShapeRect : awt::Rectangle( maPosition.X, maPosition.Y, maSize.Width, maSize.Height ), pShapeMap ); + addChildren( rFilterBase, *this, pTheme, xShapes, pShapeRect ? *pShapeRect : awt::Rectangle( maPosition.X, maPosition.Y, maSize.Width, maSize.Height ), pShapeMap, aMatrix ); } Reference< document::XActionLockable > xLockable( mxShape, UNO_QUERY ); if( xLockable.is() ) @@ -224,10 +226,12 @@ void Shape::addChildren( const Theme* pTheme, const Reference< XShapes >& rxShapes, const awt::Rectangle&, - ShapeIdMap* pShapeMap ) + ShapeIdMap* pShapeMap, + basegfx::B2DHomMatrix& aTransformation ) { awt::Point& aPosition( mbIsChild ? maAbsolutePosition : maPosition ); awt::Size& aSize( mbIsChild ? maAbsoluteSize : maSize ); + basegfx::B2DHomMatrix aChildTransformation; std::vector< ShapePtr >::iterator aIter( rMaster.maChildren.begin() ); while( aIter != rMaster.maChildren.end() ) @@ -236,8 +240,8 @@ void Shape::addChildren( awt::Rectangle* pShapeRect = 0; Shape& rChild = *(*aIter); - double sx = ((double)aSize.Width)/maChSize.Width; - double sy = ((double)aSize.Height)/maChSize.Height; + double sx = (maChSize.Width) ? ((double)aSize.Width)/maChSize.Width : 1.0; + double sy = (maChSize.Height) ? ((double)aSize.Height)/maChSize.Height : 1.0; rChild.maAbsolutePosition.X = aPosition.X + sx*(rChild.maPosition.X - maChPosition.X); rChild.maAbsolutePosition.Y = aPosition.Y + sy*(rChild.maPosition.Y - maChPosition.Y); rChild.maAbsoluteSize.Width = rChild.maSize.Width*sx; @@ -249,9 +253,14 @@ void Shape::addChildren( aShapeRect.Width = rChild.maAbsoluteSize.Width; aShapeRect.Height = rChild.maAbsoluteSize.Height; - pShapeRect = &aShapeRect; + //pShapeRect = &aShapeRect; + + aChildTransformation = aTransformation; - (*aIter++)->addShape( rFilterBase, pTheme, rxShapes, pShapeRect, pShapeMap ); + aChildTransformation.translate((-maChPosition.X)/360.0, (-maChPosition.Y)/360.0); + aChildTransformation.scale((360.0*sx)/(maSize.Width ? maSize.Width : 1.0), (360.0*sy)/(maSize.Height ? maSize.Height : 1.0)); + + (*aIter++)->addShape( rFilterBase, pTheme, rxShapes, aChildTransformation, pShapeRect, pShapeMap ); } } @@ -261,7 +270,8 @@ Reference< XShape > Shape::createAndInsert( const Theme* pTheme, const ::com::sun::star::uno::Reference< ::com::sun::star::drawing::XShapes >& rxShapes, const awt::Rectangle* pShapeRect, - sal_Bool bClearText ) + sal_Bool bClearText, + basegfx::B2DHomMatrix& aParentTransformation ) { awt::Size aSize( pShapeRect ? awt::Size( pShapeRect->Width, pShapeRect->Height ) : maSize ); awt::Point aPosition( pShapeRect ? awt::Point( pShapeRect->X, pShapeRect->Y ) : maPosition ); @@ -270,7 +280,7 @@ Reference< XShape > Shape::createAndInsert( OUString aServiceName = finalizeServiceName( rFilterBase, rServiceName, aShapeRectHmm ); sal_Bool bIsCustomShape = aServiceName.equalsAsciiL( RTL_CONSTASCII_STRINGPARAM( "com.sun.star.drawing.CustomShape" ) ); - basegfx::B2DHomMatrix aTransformation; + basegfx::B2DHomMatrix aTransformation( aParentTransformation ); if( aSize.Width != 1 || aSize.Height != 1) { // take care there are no zeros used by error @@ -310,6 +320,17 @@ Reference< XShape > Shape::createAndInsert( aTransformation.translate( aPosition.X / 360.0, aPosition.Y / 360.0 ); } + OSL_TRACE("transformation:\n%f %f %f\n%f %f %f\n%f %f %f\n", + aTransformation.get(0,0), + aTransformation.get(0,1), + aTransformation.get(0,2), + aTransformation.get(1,0), + aTransformation.get(1,1), + aTransformation.get(1,2), + aTransformation.get(2,0), + aTransformation.get(2,1), + aTransformation.get(2,2)); + // special for lineshape if ( aServiceName == OUString(RTL_CONSTASCII_USTRINGPARAM("com.sun.star.drawing.LineShape")) ) { @@ -352,6 +373,7 @@ Reference< XShape > Shape::createAndInsert( // now set transformation for this object HomogenMatrix3 aMatrix; + aMatrix.Line1.Column1 = aTransformation.get(0,0); aMatrix.Line1.Column2 = aTransformation.get(0,1); aMatrix.Line1.Column3 = aTransformation.get(0,2); @@ -366,6 +388,9 @@ Reference< XShape > Shape::createAndInsert( maShapeProperties[ PROP_Transformation ] <<= aMatrix; } + + aParentTransformation = aTransformation; + Reference< lang::XMultiServiceFactory > xServiceFact( rFilterBase.getModel(), UNO_QUERY_THROW ); if ( !mxShape.is() ) mxShape = Reference< drawing::XShape >( xServiceFact->createInstance( aServiceName ), UNO_QUERY_THROW ); diff --git a/oox/source/ppt/pptshape.cxx b/oox/source/ppt/pptshape.cxx index 208a6a0981a3..fc3abfc51f62 100644 --- a/oox/source/ppt/pptshape.cxx +++ b/oox/source/ppt/pptshape.cxx @@ -122,6 +122,7 @@ void PPTShape::addShape( const SlidePersist& rSlidePersist, const oox::drawingml::Theme* pTheme, const Reference< XShapes >& rxShapes, + basegfx::B2DHomMatrix& aTransformation, const awt::Rectangle* pShapeRect, ::oox::drawingml::ShapeIdMap* pShapeMap ) { @@ -292,7 +293,7 @@ void PPTShape::addShape( } else setMasterTextListStyle( aMasterTextListStyle ); - Reference< XShape > xShape( createAndInsert( rFilterBase, sServiceName, pTheme, rxShapes, pShapeRect, bClearText ) ); + Reference< XShape > xShape( createAndInsert( rFilterBase, sServiceName, pTheme, rxShapes, pShapeRect, bClearText, aTransformation ) ); if ( !rSlidePersist.isMasterPage() && rSlidePersist.getPage().is() && ( (sal_Int32)mnSubType == XML_title ) ) { try @@ -319,7 +320,7 @@ void PPTShape::addShape( // if this is a group shape, we have to add also each child shape Reference< XShapes > xShapes( xShape, UNO_QUERY ); if ( xShapes.is() ) - addChildren( rFilterBase, *this, pTheme, xShapes, pShapeRect ? *pShapeRect : awt::Rectangle( maPosition.X, maPosition.Y, maSize.Width, maSize.Height ), pShapeMap ); + addChildren( rFilterBase, *this, pTheme, xShapes, pShapeRect ? *pShapeRect : awt::Rectangle( maPosition.X, maPosition.Y, maSize.Width, maSize.Height ), pShapeMap, aTransformation ); } } } diff --git a/oox/source/ppt/slidepersist.cxx b/oox/source/ppt/slidepersist.cxx index c8d46ec3403e..576f340f59e4 100644 --- a/oox/source/ppt/slidepersist.cxx +++ b/oox/source/ppt/slidepersist.cxx @@ -150,10 +150,11 @@ void SlidePersist::createXShapes( XmlFilterBase& rFilterBase ) while( aChildIter != rChildren.end() ) { PPTShape* pPPTShape = dynamic_cast< PPTShape* >( (*aChildIter).get() ); + basegfx::B2DHomMatrix aTransformation; if ( pPPTShape ) - pPPTShape->addShape( rFilterBase, *this, getTheme().get(), xShapes, 0, &getShapeMap() ); + pPPTShape->addShape( rFilterBase, *this, getTheme().get(), xShapes, aTransformation, 0, &getShapeMap() ); else - (*aChildIter)->addShape( rFilterBase, getTheme().get(), xShapes, 0, &getShapeMap() ); + (*aChildIter)->addShape( rFilterBase, getTheme().get(), xShapes, aTransformation, 0, &getShapeMap() ); aChildIter++; } } diff --git a/oox/source/shape/ShapeContextHandler.cxx b/oox/source/shape/ShapeContextHandler.cxx index 0c50a13d9c33..3be9a562bcee 100644 --- a/oox/source/shape/ShapeContextHandler.cxx +++ b/oox/source/shape/ShapeContextHandler.cxx @@ -252,7 +252,8 @@ ShapeContextHandler::getShape() throw (uno::RuntimeException) } else if (mpShape.get() != NULL) { - mpShape->addShape(*mxFilterBase, mpThemePtr.get(), xShapes); + basegfx::B2DHomMatrix aTransformation; + mpShape->addShape(*mxFilterBase, mpThemePtr.get(), xShapes, aTransformation); xResult.set(mpShape->getXShape()); mxGraphicShapeContext.clear( ); } diff --git a/oox/source/xls/drawingfragment.cxx b/oox/source/xls/drawingfragment.cxx index e7e627c9ac5a..ba3bd444bbeb 100644 --- a/oox/source/xls/drawingfragment.cxx +++ b/oox/source/xls/drawingfragment.cxx @@ -603,7 +603,8 @@ void DrawingFragment::onEndElement() Rectangle aShapeRect = mxAnchor->calcEmuLocation( maEmuSheetSize ); if( (aShapeRect.X >= 0) && (aShapeRect.Y >= 0) && (aShapeRect.Width >= 0) && (aShapeRect.Height >= 0) ) { - mxShape->addShape( getOoxFilter(), &getTheme(), mxDrawPage, &aShapeRect ); + basegfx::B2DHomMatrix aTransformation; + mxShape->addShape( getOoxFilter(), &getTheme(), mxDrawPage, aTransformation, &aShapeRect ); /* Collect all shape positions in the WorksheetHelper base class. But first, scale EMUs to 1/100 mm. */ const UnitConverter& rUnitConv = getUnitConverter(); |