diff --git a/oox/inc/drawingml/fillproperties.hxx b/oox/inc/drawingml/fillproperties.hxx index cf26acfc17d6..f308f6aaec0d 100644 --- a/oox/inc/drawingml/fillproperties.hxx +++ b/oox/inc/drawingml/fillproperties.hxx @@ -146,7 +146,8 @@ struct FillProperties sal_Int32 nShapeRotation = 0, ::Color nPhClr = API_RGB_TRANSPARENT, bool bFlipH = false, - bool bFlipV = false ) const; + bool bFlipV = false, + bool bIsCustomShape = false ) const; }; } // namespace oox::drawingml diff --git a/oox/source/drawingml/fillproperties.cxx b/oox/source/drawingml/fillproperties.cxx index 3efd64878326..837578ebc807 100644 --- a/oox/source/drawingml/fillproperties.cxx +++ b/oox/source/drawingml/fillproperties.cxx @@ -87,6 +87,32 @@ Reference< XGraphic > lclRotateGraphic(uno::Reference const & return aReturnGraphic.GetXGraphic(); } +Reference< XGraphic > lclCropGraphic(uno::Reference const & xGraphic, geometry::IntegerRectangle2D aFillRect) +{ + ::Graphic aGraphic(xGraphic); + ::Graphic aReturnGraphic; + + assert (aGraphic.GetType() == GraphicType::Bitmap); + + BitmapEx aBitmapEx(aGraphic.GetBitmapEx()); + + sal_Int32 nOrigHeight = aBitmapEx.GetSizePixel().Height(); + sal_Int32 nHeight = nOrigHeight; + sal_Int32 nTopCorr = nOrigHeight * -1 * static_cast(aFillRect.Y1) / 100000; + nHeight += nTopCorr; + sal_Int32 nBottomCorr = nOrigHeight * -1 * static_cast(aFillRect.Y2) / 100000; + nHeight += nBottomCorr; + + aBitmapEx.Scale(Size(aBitmapEx.GetSizePixel().Width(), nHeight)); + aBitmapEx.Crop(tools::Rectangle(Point(0, nTopCorr), Size(aBitmapEx.GetSizePixel().Width(), nOrigHeight))); + + 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) { @@ -272,7 +298,7 @@ Color FillProperties::getBestSolidColor() const void FillProperties::pushToPropMap( ShapePropertyMap& rPropMap, const GraphicHelper& rGraphicHelper, sal_Int32 nShapeRotation, ::Color nPhClr, - bool bFlipH, bool bFlipV ) const + bool bFlipH, bool bFlipV, bool bIsCustomShape) const { if( !moFillType.has() ) return; @@ -675,6 +701,12 @@ void FillProperties::pushToPropMap( ShapePropertyMap& rPropMap, if ( aFillRect.Y2 ) aGraphCrop.Bottom = static_cast< sal_Int32 >( ( static_cast< double >( aOriginalSize.Height ) * aFillRect.Y2 ) / 100000 ); rPropMap.setProperty(PROP_GraphicCrop, aGraphCrop); + + if(bIsCustomShape) + { + xGraphic = lclCropGraphic(xGraphic, aFillRect); + rPropMap.setProperty(ShapeProperty::FillBitmap, xGraphic); + } } } } diff --git a/oox/source/drawingml/shape.cxx b/oox/source/drawingml/shape.cxx index f5aa1c2cd9f2..37633abb8b87 100644 --- a/oox/source/drawingml/shape.cxx +++ b/oox/source/drawingml/shape.cxx @@ -1058,7 +1058,7 @@ Reference< XShape > const & Shape::createAndInsert( if (getFillProperties().moFillType.has() && getFillProperties().moFillType.get() == XML_grpFill) getFillProperties().assignUsed(aFillProperties); if(!bIsCroppedGraphic) - aFillProperties.pushToPropMap( aShapeProps, rGraphicHelper, mnRotation, nFillPhClr, mbFlipH, mbFlipV ); + aFillProperties.pushToPropMap( aShapeProps, rGraphicHelper, mnRotation, nFillPhClr, mbFlipH, mbFlipV, bIsCustomShape ); LineProperties aLineProperties = getActualLineProperties(pTheme); aLineProperties.pushToPropMap( aShapeProps, rGraphicHelper, nLinePhClr ); EffectProperties aEffectProperties = getActualEffectProperties(pTheme); diff --git a/sd/qa/unit/data/pptx/tdf134210.pptx b/sd/qa/unit/data/pptx/tdf134210.pptx new file mode 100644 index 000000000000..6867ac4801ff Binary files /dev/null and b/sd/qa/unit/data/pptx/tdf134210.pptx differ diff --git a/sd/qa/unit/import-tests.cxx b/sd/qa/unit/import-tests.cxx index b5c1c5ca03c3..59f029dacdfd 100644 --- a/sd/qa/unit/import-tests.cxx +++ b/sd/qa/unit/import-tests.cxx @@ -200,6 +200,7 @@ public: void testTdf138148(); void testTdf114488(); void testTdf134174(); + void testTdf134210(); void testTdf114913(); void testTdf114821(); void testTdf115394(); @@ -314,6 +315,7 @@ public: CPPUNIT_TEST(testTdf138148); CPPUNIT_TEST(testTdf114488); CPPUNIT_TEST(testTdf134174); + CPPUNIT_TEST(testTdf134210); CPPUNIT_TEST(testTdf114913); CPPUNIT_TEST(testTdf114821); CPPUNIT_TEST(testTdf115394); @@ -2748,6 +2750,23 @@ void SdImportTest::testTdf134174() xDocShRef->DoClose(); } +void SdImportTest::testTdf134210() +{ + sd::DrawDocShellRef xDocShRef = loadURL(m_directories.getURLFromSrc(u"sd/qa/unit/data/pptx/tdf134210.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(6708292), aBitmap.GetPixelColor( 0, 0 )); + + xDocShRef->DoClose(); +} + void SdImportTest::testTdf114913() { sd::DrawDocShellRef xDocShRef = loadURL(m_directories.getURLFromSrc(u"sd/qa/unit/data/pptx/tdf114913.pptx"), PPTX);