tdf#134210 Import support for custom stretch values.

Change-Id: I33ced8d667e37b7fb79f4c87b689f45966ac0097
Reviewed-on: https://gerrit.libreoffice.org/c/core/+/109658
Tested-by: Jenkins
Reviewed-by: Gülşah Köse <gulsah.kose@collabora.com>
diff --git a/oox/inc/drawingml/fillproperties.hxx b/oox/inc/drawingml/fillproperties.hxx
index cf26acf..f308f6aa 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 3efd648..837578e 100644
--- a/oox/source/drawingml/fillproperties.cxx
+++ b/oox/source/drawingml/fillproperties.cxx
@@ -87,6 +87,32 @@ Reference< XGraphic > lclRotateGraphic(uno::Reference<graphic::XGraphic> const &
    return aReturnGraphic.GetXGraphic();
}

Reference< XGraphic > lclCropGraphic(uno::Reference<graphic::XGraphic> 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<double>(aFillRect.Y1) / 100000;
    nHeight += nTopCorr;
    sal_Int32 nBottomCorr = nOrigHeight * -1 * static_cast<double>(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<graphic::XGraphic> 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 f5aa1c2..37633ab 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 0000000..6867ac4
--- /dev/null
+++ b/sd/qa/unit/data/pptx/tdf134210.pptx
Binary files differ
diff --git a/sd/qa/unit/import-tests.cxx b/sd/qa/unit/import-tests.cxx
index b5c1c5c..59f029d 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<beans::XPropertySet> xShape(getShapeFromPage(0, 0, xDocShRef), uno::UNO_SET_THROW);
    CPPUNIT_ASSERT(xShape.is());

    uno::Reference<graphic::XGraphic> 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);