diff --git a/oox/source/drawingml/fillproperties.cxx b/oox/source/drawingml/fillproperties.cxx index d2485e02ddd3..b6669210942a 100644 --- a/oox/source/drawingml/fillproperties.cxx +++ b/oox/source/drawingml/fillproperties.cxx @@ -22,6 +22,7 @@ #include #include +#include #include #include @@ -71,6 +72,22 @@ Reference< XGraphic > lclCheckAndApplyDuotoneTransform(const BlipFillProperties& return xGraphic; } +Reference< XGraphic > lclRotateGraphic(uno::Reference const & xGraphic, long nRotation) +{ + ::Graphic aGraphic(xGraphic); + ::Graphic aReturnGraphic; + + assert (aGraphic.GetType() == GraphicType::Bitmap); + + BitmapEx aBitmapEx(aGraphic.GetBitmapEx()); + const ::Color& aColor = ::Color(0x00); + aBitmapEx.Rotate(nRotation, aColor); + aReturnGraphic = ::Graphic(aBitmapEx); + aReturnGraphic.setOriginURL(aGraphic.getOriginURL()); + + return aReturnGraphic.GetXGraphic(); +} + Reference< XGraphic > lclCheckAndApplyChangeColorTransform(const BlipFillProperties &aBlipProps, uno::Reference const & xGraphic, const GraphicHelper& rGraphicHelper, const ::Color nPhClr) { @@ -748,6 +765,15 @@ void GraphicProperties::pushToPropMap( PropertyMap& rPropMap, const GraphicHelpe // it is a cropped graphic. rPropMap.setProperty(PROP_FillStyle, FillStyle_BITMAP); rPropMap.setProperty(PROP_FillBitmapMode, BitmapMode_STRETCH); + + // It is a bitmap filled and rotated graphic. + // When custom shape is rotated, bitmap have to be rotated too. + if(rPropMap.hasProperty(PROP_RotateAngle)) + { + long nAngle = rPropMap.getProperty(PROP_RotateAngle).get(); + xGraphic = lclRotateGraphic(xGraphic, nAngle/10 ); + } + rPropMap.setProperty(PROP_FillBitmap, xGraphic); } else diff --git a/oox/source/drawingml/shape.cxx b/oox/source/drawingml/shape.cxx index 8550129d0d2d..35d44339f62a 100644 --- a/oox/source/drawingml/shape.cxx +++ b/oox/source/drawingml/shape.cxx @@ -1029,6 +1029,8 @@ Reference< XShape > const & Shape::createAndInsert( // applying properties aShapeProps.assignUsed( getShapeProperties() ); aShapeProps.assignUsed( maDefaultShapeProperties ); + if(mnRotation != 0 && bIsCustomShape) + aShapeProps.setProperty( PROP_RotateAngle, sal_Int32( NormAngle36000( mnRotation / -600 ) )); if ( bIsEmbMedia || aServiceName == "com.sun.star.drawing.GraphicObjectShape" || aServiceName == "com.sun.star.drawing.OLE2Shape" || bIsCustomShape ) mpGraphicPropertiesPtr->pushToPropMap( aShapeProps, rGraphicHelper ); if ( mpTablePropertiesPtr && aServiceName == "com.sun.star.drawing.TableShape" ) diff --git a/sd/qa/unit/data/pptx/tdf134174.pptx b/sd/qa/unit/data/pptx/tdf134174.pptx new file mode 100644 index 000000000000..ef722dc501a8 Binary files /dev/null and b/sd/qa/unit/data/pptx/tdf134174.pptx differ diff --git a/sd/qa/unit/import-tests.cxx b/sd/qa/unit/import-tests.cxx index 0dcdd28ee99b..3d3032e2e3bd 100644 --- a/sd/qa/unit/import-tests.cxx +++ b/sd/qa/unit/import-tests.cxx @@ -200,6 +200,7 @@ public: void testTdf100065(); void testTdf90626(); void testTdf114488(); + void testTdf134174(); void testTdf114913(); void testTdf114821(); void testTdf115394(); @@ -311,6 +312,7 @@ public: CPPUNIT_TEST(testTdf100065); CPPUNIT_TEST(testTdf90626); CPPUNIT_TEST(testTdf114488); + CPPUNIT_TEST(testTdf134174); CPPUNIT_TEST(testTdf114913); CPPUNIT_TEST(testTdf114821); CPPUNIT_TEST(testTdf115394); @@ -2641,6 +2643,23 @@ void SdImportTest::testTdf114488() xDocShRef->DoClose(); } +void SdImportTest::testTdf134174() +{ + sd::DrawDocShellRef xDocShRef = loadURL(m_directories.getURLFromSrc("sd/qa/unit/data/pptx/tdf134174.pptx"), PPTX); + uno::Reference xShape(getShapeFromPage(0, 0, xDocShRef), uno::UNO_SET_THROW); + CPPUNIT_ASSERT(xShape.is()); + + uno::Reference xGraphic; + xShape->getPropertyValue("FillBitmap") >>= xGraphic; + CPPUNIT_ASSERT(xGraphic.is()); + + Graphic aGraphic(xGraphic); + BitmapEx aBitmap(aGraphic.GetBitmapEx()); + CPPUNIT_ASSERT_EQUAL( Color(9118171), aBitmap.GetPixelColor( 0, 0 )); + + xDocShRef->DoClose(); +} + void SdImportTest::testTdf114913() { sd::DrawDocShellRef xDocShRef = loadURL(m_directories.getURLFromSrc("sd/qa/unit/data/pptx/tdf114913.pptx"), PPTX);