oox/inc/drawingml/graphicproperties.hxx    |    4 +++-
 oox/source/drawingml/fillproperties.cxx    |   29 ++++++++++++++++++++++++++++-
 oox/source/drawingml/shape.cxx             |    9 +++++++--
 sd/qa/unit/data/pptx/mirrored-graphic.pptx |binary
 sd/qa/unit/import-tests.cxx                |   16 ++++++++++++++++
 5 files changed, 54 insertions(+), 4 deletions(-)

New commits:
commit 5f4808d7536a4c551c8764ac2ac6be30ad975f69
Author:     Gülşah Köse <gulsah.k...@collabora.com>
AuthorDate: Thu Jan 28 09:37:58 2021 +0300
Commit:     Xisco Fauli <xiscofa...@libreoffice.org>
CommitDate: Tue Feb 16 11:59:51 2021 +0100

    tdf#134210 Apply mirror property to custom cropped graphic.
    
    Change-Id: I5bf2ba8fa432af8b6a560cc60c18bef799834fd0
    Reviewed-on: https://gerrit.libreoffice.org/c/core/+/110039
    Tested-by: Jenkins
    Reviewed-by: Gülşah Köse <gulsah.k...@collabora.com>
    Signed-off-by: Xisco Fauli <xiscofa...@libreoffice.org>
    Reviewed-on: https://gerrit.libreoffice.org/c/core/+/110972

diff --git a/oox/inc/drawingml/graphicproperties.hxx 
b/oox/inc/drawingml/graphicproperties.hxx
index 85b47dbff593..48d1acf61931 100644
--- a/oox/inc/drawingml/graphicproperties.hxx
+++ b/oox/inc/drawingml/graphicproperties.hxx
@@ -43,7 +43,9 @@ struct GraphicProperties
     /** Writes the properties to the passed property map. */
     void                pushToPropMap(
                             PropertyMap& rPropMap,
-                            const GraphicHelper& rGraphicHelper) const;
+                            const GraphicHelper& rGraphicHelper,
+                            bool bFlipH = false,
+                            bool bFlipV = false) const;
 };
 
 } // namespace oox::drawingml
diff --git a/oox/source/drawingml/fillproperties.cxx 
b/oox/source/drawingml/fillproperties.cxx
index 837578ebc807..78ebff7e2122 100644
--- a/oox/source/drawingml/fillproperties.cxx
+++ b/oox/source/drawingml/fillproperties.cxx
@@ -112,6 +112,28 @@ Reference< XGraphic > 
lclCropGraphic(uno::Reference<graphic::XGraphic> const & x
     return aReturnGraphic.GetXGraphic();
 }
 
+Reference< XGraphic > lclMirrorGraphic(uno::Reference<graphic::XGraphic> const 
& xGraphic, bool bFlipH, bool bFlipV)
+{
+    ::Graphic aGraphic(xGraphic);
+    ::Graphic aReturnGraphic;
+
+    assert (aGraphic.GetType() == GraphicType::Bitmap);
+
+    BitmapEx aBitmapEx(aGraphic.GetBitmapEx());
+    BmpMirrorFlags nMirrorFlags = BmpMirrorFlags::NONE;
+
+    if(bFlipH)
+        nMirrorFlags |= BmpMirrorFlags::Horizontal;
+    if(bFlipV)
+        nMirrorFlags |= BmpMirrorFlags::Vertical;
+
+    aBitmapEx.Mirror(nMirrorFlags);
+
+    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)
@@ -755,7 +777,7 @@ void FillProperties::pushToPropMap( ShapePropertyMap& 
rPropMap,
     rPropMap.setProperty( ShapeProperty::FillStyle, eFillStyle );
 }
 
-void GraphicProperties::pushToPropMap( PropertyMap& rPropMap, const 
GraphicHelper& rGraphicHelper) const
+void GraphicProperties::pushToPropMap( PropertyMap& rPropMap, const 
GraphicHelper& rGraphicHelper, bool bFlipH, bool bFlipV) const
 {
     sal_Int16 nBrightness = getLimitedValue< sal_Int16, sal_Int32 >( 
maBlipProps.moBrightness.get( 0 ) / PER_PERCENT, -100, 100 );
     sal_Int16 nContrast = getLimitedValue< sal_Int16, sal_Int32 >( 
maBlipProps.moContrast.get( 0 ) / PER_PERCENT, -100, 100 );
@@ -805,6 +827,11 @@ void GraphicProperties::pushToPropMap( PropertyMap& 
rPropMap, const GraphicHelpe
                 xGraphic = lclRotateGraphic(xGraphic, Degree10(nAngle/10) );
             }
 
+            // We have not core feature that flips graphic in the shape.
+            // Here we are applying flip property to bitmap directly.
+            if(bFlipH || bFlipV)
+                xGraphic = lclMirrorGraphic(xGraphic, bFlipH, bFlipV );
+
             rPropMap.setProperty(PROP_FillBitmap, xGraphic);
         }
         else
diff --git a/oox/source/drawingml/shape.cxx b/oox/source/drawingml/shape.cxx
index 4ec4c425c9ce..e711a3261bb3 100644
--- a/oox/source/drawingml/shape.cxx
+++ b/oox/source/drawingml/shape.cxx
@@ -1049,8 +1049,13 @@ Reference< XShape > const & Shape::createAndInsert(
         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( bIsEmbMedia ||
+            bIsCustomShape ||
+            aServiceName == "com.sun.star.drawing.GraphicObjectShape" ||
+            aServiceName == "com.sun.star.drawing.OLE2Shape")
+        {
+            mpGraphicPropertiesPtr->pushToPropMap( aShapeProps, 
rGraphicHelper, mbFlipH, mbFlipV );
+        }
         if ( mpTablePropertiesPtr && aServiceName == 
"com.sun.star.drawing.TableShape" )
             mpTablePropertiesPtr->pushToPropSet( rFilterBase, xSet, 
mpMasterTextListStyle );
 
diff --git a/sd/qa/unit/data/pptx/mirrored-graphic.pptx 
b/sd/qa/unit/data/pptx/mirrored-graphic.pptx
new file mode 100644
index 000000000000..c7cd6a406947
Binary files /dev/null and b/sd/qa/unit/data/pptx/mirrored-graphic.pptx differ
diff --git a/sd/qa/unit/import-tests.cxx b/sd/qa/unit/import-tests.cxx
index ee75e62a849b..eff937566383 100644
--- a/sd/qa/unit/import-tests.cxx
+++ b/sd/qa/unit/import-tests.cxx
@@ -216,6 +216,7 @@ public:
     void testTdf128684();
     void testShapeGlowEffectPPTXImpoer();
     void testShapeBlurPPTXImport();
+    void testMirroredGraphic();
 
     bool checkPattern(sd::DrawDocShellRef const & rDocRef, int nShapeNumber, 
std::vector<sal_uInt8>& rExpected);
     void testPatternImport();
@@ -344,6 +345,7 @@ public:
     CPPUNIT_TEST(testTdf49856);
     CPPUNIT_TEST(testShapeGlowEffectPPTXImpoer);
     CPPUNIT_TEST(testShapeBlurPPTXImport);
+    CPPUNIT_TEST(testMirroredGraphic);
 
     CPPUNIT_TEST_SUITE_END();
 };
@@ -3308,6 +3310,20 @@ void SdImportTest::testShapeBlurPPTXImport()
 
 }
 
+void SdImportTest::testMirroredGraphic()
+{
+    sd::DrawDocShellRef xDocShRef = 
loadURL(m_directories.getURLFromSrc(u"sd/qa/unit/data/pptx/mirrored-graphic.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(5196117), aBitmap.GetPixelColor( 0, 0 ));
+    xDocShRef->DoClose();
+}
+
 CPPUNIT_TEST_SUITE_REGISTRATION(SdImportTest);
 
 CPPUNIT_PLUGIN_IMPLEMENT();
_______________________________________________
Libreoffice-commits mailing list
libreoffice-comm...@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/libreoffice-commits

Reply via email to