Script 'mail_helper' called by obssrc Hello community, here is the log from the commit of package libreoffice for openSUSE:Factory checked in at 2021-03-10 08:49:09 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Comparing /work/SRC/openSUSE:Factory/libreoffice (Old) and /work/SRC/openSUSE:Factory/.libreoffice.new.2378 (New) ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Package is "libreoffice" Wed Mar 10 08:49:09 2021 rev:225 rq:876942 version:7.1.1.2 Changes: -------- --- /work/SRC/openSUSE:Factory/libreoffice/libreoffice.changes 2021-02-25 18:25:53.234116414 +0100 +++ /work/SRC/openSUSE:Factory/.libreoffice.new.2378/libreoffice.changes 2021-03-10 08:49:38.542417504 +0100 @@ -1,0 +2,16 @@ +Mon Mar 1 11:04:00 UTC 2021 - Mark??ta Machov?? <mmach...@suse.com> + +- Update to 7.1.1.2 (fixes bsc#1182790) + * 7.1.1 final release +- Drop merged patch bsc1177955.diff +- Fix bsc#1176547 - Image shown with different aspect ratio + * bsc1176547_1.diff + * bsc1176547_2.diff + +------------------------------------------------------------------- +Fri Feb 26 15:00:29 UTC 2021 - Andras Timar <andras.ti...@collabora.com> + +- Fix bsc#1181644 - LO-L3: Text changes are reproducibly lost (PPTX, SmartArt) + * bsc1181644.diff + +------------------------------------------------------------------- Old: ---- bsc1177955.diff libreoffice-7.1.0.3.tar.xz libreoffice-7.1.0.3.tar.xz.asc libreoffice-help-7.1.0.3.tar.xz libreoffice-help-7.1.0.3.tar.xz.asc libreoffice-translations-7.1.0.3.tar.xz libreoffice-translations-7.1.0.3.tar.xz.asc New: ---- bsc1176547_1.diff bsc1176547_2.diff bsc1181644.diff libreoffice-7.1.1.2.tar.xz libreoffice-7.1.1.2.tar.xz.asc libreoffice-help-7.1.1.2.tar.xz libreoffice-help-7.1.1.2.tar.xz.asc libreoffice-translations-7.1.1.2.tar.xz libreoffice-translations-7.1.1.2.tar.xz.asc ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Other differences: ------------------ ++++++ libreoffice.spec ++++++ --- /var/tmp/diff_new_pack.f181Lo/_old 2021-03-10 08:49:41.358420411 +0100 +++ /var/tmp/diff_new_pack.f181Lo/_new 2021-03-10 08:49:41.362420415 +0100 @@ -46,7 +46,7 @@ %bcond_with system_gpgme %endif Name: libreoffice -Version: 7.1.0.3 +Version: 7.1.1.2 Release: 0 Summary: A Free Office Suite (Framework) License: LGPL-3.0-or-later AND MPL-2.0+ @@ -101,10 +101,13 @@ Patch3: mediawiki-no-broken-help.diff # PATCH-FIX-UPSTREAM https://github.com/LibreOffice/core/commit/f14b83b38d35a585976ef5d422754d8e0d0266a6 ucp: fix call to getComponentContext Patch4: use-comphelper.patch -# Bug 1177955 - LO-L3: SmartArt: text wrongly aligned, background boxes not quite right,... -Patch10: bsc1177955.diff # Bug 1174465 - LO-L3: Impress in TW (7.0.0.0-beta2) messes up bullet points Patch11: bsc1174465.diff +# Bug 1181644 - LO-L3: Text changes are reproducibly lost (PPTX, SmartArt) +Patch12: bsc1181644.diff +# Bug 1176547 - Image shown with different aspect ratio (and different clipping), some colored instead of grey, one horizontally mirrored +Patch13: bsc1176547_1.diff +Patch14: bsc1176547_2.diff # try to save space by using hardlinks Patch990: install-with-hardlinks.diff # save time by relying on rpm check rather than doing stupid find+grep @@ -964,8 +967,10 @@ %patch2 %patch3 %patch4 -p1 -%patch10 -p1 %patch11 -p1 +%patch12 -p1 +%patch13 -p1 +%patch14 -p1 %patch990 -p1 %patch991 -p1 ++++++ bsc1176547_1.diff ++++++ >From 5f4808d7536a4c551c8764ac2ac6be30ad975f69 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?G=C3=BCl=C5=9Fah=20K=C3=B6se?= <gulsah.k...@collabora.com> Date: Thu, 28 Jan 2021 09:37:58 +0300 Subject: [PATCH] tdf#134210 Apply mirror property to custom cropped graphic. MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 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 --- 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 | Bin 0 -> 173805 bytes sd/qa/unit/import-tests.cxx | 16 ++++++++++++ 5 files changed, 54 insertions(+), 4 deletions(-) create mode 100644 sd/qa/unit/data/pptx/mirrored-graphic.pptx 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/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 @@ class SdImportTest : public SdModelTestBase 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 @@ class SdImportTest : public SdModelTestBase 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(); ++++++ bsc1176547_2.diff ++++++ >From 33e69fb9ef450169e7d85ae3215fd9a4fc8082c2 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?G=C3=BCl=C5=9Fah=20K=C3=B6se?= <gulsah.k...@collabora.com> Date: Mon, 1 Feb 2021 17:03:33 +0300 Subject: [PATCH] tdf#134210 Import crop position of bitmap filled shape. MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Change-Id: I6a62d68cd0f57e53934851a2f53dae05bf7d3730 Reviewed-on: https://gerrit.libreoffice.org/c/core/+/110262 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/+/110973 --- oox/source/drawingml/fillproperties.cxx | 84 ++++++++++++++++++------ oox/source/export/drawingml.cxx | 39 +++++++---- sd/qa/unit/data/pptx/crop-position.pptx | Bin 0 -> 175724 bytes sd/qa/unit/export-tests-ooxml1.cxx | 29 ++++++-- sd/qa/unit/import-tests.cxx | 16 +++++ 5 files changed, 129 insertions(+), 39 deletions(-) create mode 100644 sd/qa/unit/data/pptx/crop-position.pptx diff --git a/oox/source/drawingml/fillproperties.cxx b/oox/source/drawingml/fillproperties.cxx index 78ebff7e2122..3439d28a4f22 100644 --- a/oox/source/drawingml/fillproperties.cxx +++ b/oox/source/drawingml/fillproperties.cxx @@ -87,6 +87,30 @@ Reference< XGraphic > lclRotateGraphic(uno::Reference<graphic::XGraphic> const & return aReturnGraphic.GetXGraphic(); } +void lclCalculateCropPercentage(uno::Reference<graphic::XGraphic> const & xGraphic, geometry::IntegerRectangle2D &aFillRect) +{ + ::Graphic aGraphic(xGraphic); + assert (aGraphic.GetType() == GraphicType::Bitmap); + + BitmapEx aBitmapEx(aGraphic.GetBitmapEx()); + + sal_Int32 nScaledWidth = aBitmapEx.GetSizePixel().Width(); + sal_Int32 nScaledHeight = aBitmapEx.GetSizePixel().Height(); + + sal_Int32 nOrigWidth = (nScaledWidth * (100000 - aFillRect.X1 - aFillRect.X2)) / 100000; + sal_Int32 nOrigHeight = (nScaledHeight * (100000 - aFillRect.Y1 - aFillRect.Y2)) / 100000; + + sal_Int32 nLeftPercentage = nScaledWidth * aFillRect.X1 / nOrigWidth; + sal_Int32 nRightPercentage = nScaledWidth * aFillRect.X2 / nOrigWidth; + sal_Int32 nTopPercentage = nScaledHeight * aFillRect.Y1 / nOrigHeight; + sal_Int32 nBottomPercentage = nScaledHeight * aFillRect.Y2 / nOrigHeight; + + aFillRect.X1 = -nLeftPercentage; + aFillRect.X2 = -nRightPercentage; + aFillRect.Y1 = -nTopPercentage; + aFillRect.Y2 = -nBottomPercentage; +} + Reference< XGraphic > lclCropGraphic(uno::Reference<graphic::XGraphic> const & xGraphic, geometry::IntegerRectangle2D aFillRect) { ::Graphic aGraphic(xGraphic); @@ -103,8 +127,15 @@ Reference< XGraphic > lclCropGraphic(uno::Reference<graphic::XGraphic> const & x 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))); + sal_Int32 nOrigWidth = aBitmapEx.GetSizePixel().Width(); + sal_Int32 nWidth = nOrigWidth; + sal_Int32 nLeftCorr = nOrigWidth * -1 * static_cast<double>(aFillRect.X1) / 100000; + nWidth += nLeftCorr; + sal_Int32 nRightCorr = nOrigWidth * -1 * static_cast<double>(aFillRect.X2) / 100000; + nWidth += nRightCorr; + + aBitmapEx.Scale(Size(nWidth, nHeight)); + aBitmapEx.Crop(tools::Rectangle(Point(nLeftCorr, nTopCorr), Size(nOrigWidth, nOrigHeight))); aReturnGraphic = ::Graphic(aBitmapEx); aReturnGraphic.setOriginURL(aGraphic.getOriginURL()); @@ -813,6 +844,36 @@ void GraphicProperties::pushToPropMap( PropertyMap& rPropMap, const GraphicHelpe nContrast = 0; } + // cropping + if ( maBlipProps.moClipRect.has() ) + { + geometry::IntegerRectangle2D oClipRect( maBlipProps.moClipRect.get() ); + awt::Size aOriginalSize( rGraphicHelper.getOriginalSize( xGraphic ) ); + if ( aOriginalSize.Width && aOriginalSize.Height ) + { + text::GraphicCrop aGraphCrop( 0, 0, 0, 0 ); + if ( oClipRect.X1 ) + aGraphCrop.Left = rtl::math::round( ( static_cast< double >( aOriginalSize.Width ) * oClipRect.X1 ) / 100000 ); + if ( oClipRect.Y1 ) + aGraphCrop.Top = rtl::math::round( ( static_cast< double >( aOriginalSize.Height ) * oClipRect.Y1 ) / 100000 ); + if ( oClipRect.X2 ) + aGraphCrop.Right = rtl::math::round( ( static_cast< double >( aOriginalSize.Width ) * oClipRect.X2 ) / 100000 ); + if ( oClipRect.Y2 ) + aGraphCrop.Bottom = rtl::math::round( ( static_cast< double >( aOriginalSize.Height ) * oClipRect.Y2 ) / 100000 ); + rPropMap.setProperty(PROP_GraphicCrop, aGraphCrop); + } + + if(mbIsCustomShape) + { + geometry::IntegerRectangle2D aCropRect = oClipRect; + lclCalculateCropPercentage(xGraphic, aCropRect); + xGraphic = lclCropGraphic(xGraphic, aCropRect); + + rPropMap.setProperty(PROP_FillBitmap, xGraphic); + } + + } + if(mbIsCustomShape) { // it is a cropped graphic. @@ -837,25 +898,6 @@ void GraphicProperties::pushToPropMap( PropertyMap& rPropMap, const GraphicHelpe else rPropMap.setProperty(PROP_Graphic, xGraphic); - // cropping - if ( maBlipProps.moClipRect.has() ) - { - geometry::IntegerRectangle2D oClipRect( maBlipProps.moClipRect.get() ); - awt::Size aOriginalSize( rGraphicHelper.getOriginalSize( xGraphic ) ); - if ( aOriginalSize.Width && aOriginalSize.Height ) - { - text::GraphicCrop aGraphCrop( 0, 0, 0, 0 ); - if ( oClipRect.X1 ) - aGraphCrop.Left = rtl::math::round( ( static_cast< double >( aOriginalSize.Width ) * oClipRect.X1 ) / 100000 ); - if ( oClipRect.Y1 ) - aGraphCrop.Top = rtl::math::round( ( static_cast< double >( aOriginalSize.Height ) * oClipRect.Y1 ) / 100000 ); - if ( oClipRect.X2 ) - aGraphCrop.Right = rtl::math::round( ( static_cast< double >( aOriginalSize.Width ) * oClipRect.X2 ) / 100000 ); - if ( oClipRect.Y2 ) - aGraphCrop.Bottom = rtl::math::round( ( static_cast< double >( aOriginalSize.Height ) * oClipRect.Y2 ) / 100000 ); - rPropMap.setProperty(PROP_GraphicCrop, aGraphCrop); - } - } if ( maBlipProps.moAlphaModFix.has() ) { diff --git a/oox/source/export/drawingml.cxx b/oox/source/export/drawingml.cxx index 21394acc80da..94b67cb379f2 100644 --- a/oox/source/export/drawingml.cxx +++ b/oox/source/export/drawingml.cxx @@ -1598,27 +1598,40 @@ void DrawingML::WritePattFill(const Reference<XPropertySet>& rXPropSet, const cs mpFS->endElementNS( XML_a , XML_pattFill ); } -void DrawingML::WriteGraphicCropProperties(uno::Reference<beans::XPropertySet> const & rXPropSet, Size const & rOriginalSize, MapMode const & rMapMode) +void DrawingML::WriteGraphicCropProperties(uno::Reference<beans::XPropertySet> const & rXPropSet, + Size const & rOriginalSize, + MapMode const & rMapMode) { if (!GetProperty(rXPropSet, "GraphicCrop")) return; - Size aOriginalSize(rOriginalSize); - - // GraphicCrop is in mm100, so in case the original size is in pixels, convert it over. - if (rMapMode.GetMapUnit() == MapUnit::MapPixel) - aOriginalSize = Application::GetDefaultDevice()->PixelToLogic(aOriginalSize, MapMode(MapUnit::Map100thMM)); - css::text::GraphicCrop aGraphicCropStruct; mAny >>= aGraphicCropStruct; - if ( (0 != aGraphicCropStruct.Left) || (0 != aGraphicCropStruct.Top) || (0 != aGraphicCropStruct.Right) || (0 != aGraphicCropStruct.Bottom) ) + if(GetProperty(rXPropSet, "CustomShapeGeometry")) + { + // tdf#134210 GraphicCrop property is handled in import filter because of LibreOffice has not core + // feature. We croped the bitmap physically and MSO shouldn't crop bitmap one more time. When we + // have core feature for graphic cropping in custom shapes, we should uncomment the code anymore. + + mpFS->singleElementNS( XML_a, XML_srcRect); + } + else { - mpFS->singleElementNS( XML_a, XML_srcRect, - XML_l, OString::number(rtl::math::round(aGraphicCropStruct.Left * 100000.0 / aOriginalSize.Width())), - XML_t, OString::number(rtl::math::round(aGraphicCropStruct.Top * 100000.0 / aOriginalSize.Height())), - XML_r, OString::number(rtl::math::round(aGraphicCropStruct.Right * 100000.0 / aOriginalSize.Width())), - XML_b, OString::number(rtl::math::round(aGraphicCropStruct.Bottom * 100000.0 / aOriginalSize.Height())) ); + Size aOriginalSize(rOriginalSize); + + // GraphicCrop is in mm100, so in case the original size is in pixels, convert it over. + if (rMapMode.GetMapUnit() == MapUnit::MapPixel) + aOriginalSize = Application::GetDefaultDevice()->PixelToLogic(aOriginalSize, MapMode(MapUnit::Map100thMM)); + + if ( (0 != aGraphicCropStruct.Left) || (0 != aGraphicCropStruct.Top) || (0 != aGraphicCropStruct.Right) || (0 != aGraphicCropStruct.Bottom) ) + { + mpFS->singleElementNS( XML_a, XML_srcRect, + XML_l, OString::number(rtl::math::round(aGraphicCropStruct.Left * 100000.0 / aOriginalSize.Width())), + XML_t, OString::number(rtl::math::round(aGraphicCropStruct.Top * 100000.0 / aOriginalSize.Height())), + XML_r, OString::number(rtl::math::round(aGraphicCropStruct.Right * 100000.0 / aOriginalSize.Width())), + XML_b, OString::number(rtl::math::round(aGraphicCropStruct.Bottom * 100000.0 / aOriginalSize.Height())) ); + } } } diff --git a/sd/qa/unit/export-tests-ooxml1.cxx b/sd/qa/unit/export-tests-ooxml1.cxx index 0e938e05e9c7..a1e752834f1a 100644 --- a/sd/qa/unit/export-tests-ooxml1.cxx +++ b/sd/qa/unit/export-tests-ooxml1.cxx @@ -1145,17 +1145,36 @@ void SdOOXMLExportTest1::testCustomshapeBitmapfillSrcrect() xDocShRef->DoClose(); xmlDocUniquePtr pXmlDoc = parseExport(tempFile, "ppt/slides/slide1.xml"); - const OString sXmlPath = "//a:blipFill/a:srcRect"; + + // tdf#132680 + // We are preventing the side effect of DOCX improvement to PPTX case. // Without the accompanying fix in place, this test would have failed with: // - Expected: 1 // - Actual : 0 // - XPath '//a:blipFill/a:srcRect' number of nodes is incorrect // i.e. <a:srcRect> was exported as <a:fillRect> in <a:stretch>, which made part of the image // invisible. - double fLeftPercent = std::round(getXPath(pXmlDoc, sXmlPath, "l").toDouble() / 1000); - CPPUNIT_ASSERT_EQUAL(4.0, fLeftPercent); - double fRightPercent = std::round(getXPath(pXmlDoc, sXmlPath, "r").toDouble() / 1000); - CPPUNIT_ASSERT_EQUAL(4.0, fRightPercent); + + // tdf#134210 + // Original values of attribute of l and r in xml files: <a:srcRect l="4393" r="4393"/> + // Because of we have not core feature for cropping bitmap in custom shapes, we added cropping + // support to import filter. We modified the bitmap during import. As result the original + // image is cropped anymore (if we had the core feature for that, the original image would + // remain same, just we would see like cropped in the shape) To see the image in correct + // position in Microsoft Office too, we have to remove left right top bottom percentages + // anymore. In the future if we add core feature to LibreOffice, this test will failed with + // When we add the core feature, we should change the control value with 4393 as following. + + //const OString sXmlPath = "//a:blipFill/a:srcRect"; + //sal_Int32 nLeftPercent = getXPath(pXmlDoc, sXmlPath, "l").toInt32(); + //CPPUNIT_ASSERT_EQUAL(sal_Int32(4393), nLeftPercent); + //sal_Int32 nRightPercent = getXPath(pXmlDoc, sXmlPath, "r").toInt32(); + //CPPUNIT_ASSERT_EQUAL(sal_Int32(4393), nRightPercent); + + assertXPathNoAttribute(pXmlDoc, "/p:sld/p:cSld/p:spTree/p:sp/p:spPr/a:blipFill/a:srcRect", "l"); + assertXPathNoAttribute(pXmlDoc, "/p:sld/p:cSld/p:spTree/p:sp/p:spPr/a:blipFill/a:srcRect", "r"); + assertXPathNoAttribute(pXmlDoc, "/p:sld/p:cSld/p:spTree/p:sp/p:spPr/a:blipFill/a:srcRect", "t"); + assertXPathNoAttribute(pXmlDoc, "/p:sld/p:cSld/p:spTree/p:sp/p:spPr/a:blipFill/a:srcRect", "b"); } void SdOOXMLExportTest1::testTdf100348FontworkBitmapFill() diff --git a/sd/qa/unit/import-tests.cxx b/sd/qa/unit/import-tests.cxx index eff937566383..9aefdd4ecc7b 100644 --- a/sd/qa/unit/import-tests.cxx +++ b/sd/qa/unit/import-tests.cxx @@ -217,6 +217,7 @@ class SdImportTest : public SdModelTestBase void testShapeGlowEffectPPTXImpoer(); void testShapeBlurPPTXImport(); void testMirroredGraphic(); + void testCropPositionGraphic(); bool checkPattern(sd::DrawDocShellRef const & rDocRef, int nShapeNumber, std::vector<sal_uInt8>& rExpected); void testPatternImport(); @@ -346,6 +347,7 @@ class SdImportTest : public SdModelTestBase CPPUNIT_TEST(testShapeGlowEffectPPTXImpoer); CPPUNIT_TEST(testShapeBlurPPTXImport); CPPUNIT_TEST(testMirroredGraphic); + CPPUNIT_TEST(testCropPositionGraphic); CPPUNIT_TEST_SUITE_END(); }; @@ -3324,6 +3326,20 @@ void SdImportTest::testMirroredGraphic() xDocShRef->DoClose(); } +void SdImportTest::testCropPositionGraphic() +{ + sd::DrawDocShellRef xDocShRef = loadURL(m_directories.getURLFromSrc(u"sd/qa/unit/data/pptx/crop-position.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(8682893), aBitmap.GetPixelColor( 0, 0 )); + xDocShRef->DoClose(); +} + CPPUNIT_TEST_SUITE_REGISTRATION(SdImportTest); CPPUNIT_PLUGIN_IMPLEMENT(); ++++++ bsc1177955.diff -> bsc1181644.diff ++++++ --- /work/SRC/openSUSE:Factory/libreoffice/bsc1177955.diff 2021-02-11 12:52:23.101918329 +0100 +++ /work/SRC/openSUSE:Factory/.libreoffice.new.2378/bsc1181644.diff 2021-03-10 08:49:21.146399548 +0100 @@ -1,100 +1,149 @@ -From e80fb99133a8edf4c0b03319c7296889b0e52d54 Mon Sep 17 00:00:00 2001 +From 54ad2128db5d324f530cb15ee56e6512d9093872 Mon Sep 17 00:00:00 2001 From: Miklos Vajna <vmik...@collabora.com> -Date: Wed, 20 Jan 2021 11:15:34 +0100 -Subject: [PATCH] bsc1177955.diff - -This is a combination of 2 commits. -This is the 1st commit message: - -loplugin:flatten - -(cherry picked from commit 2d582244680e7f6dec6e4a466e276f93ccb01dc9) - -This is the commit message #2: - -oox smartart: composite algo: handle right constraint when left+width is given - -The bugdoc had this constraint: - -<dgm:constr type="l" for="ch" forName="text" refType="r" refFor="ch" refForName="img"/> - -While img has no "r", it has: - -<dgm:constr type="w" for="ch" forName="img" refType="w" refFor="ch" refForName="box" fact="0.2"/> -<dgm:constr type="l" for="ch" forName="img" refType="h" refFor="ch" refForName="box" fact="0.1"/> - -Which is enough to fix the x position of the text to not overlap with -img. - -(cherry picked from commit 1359e8c566970fcef860f7ba7f54a07d8e6e0513) - -Change-Id: I80db290bd1695884ffb7b1eabaffa09462e8883d +Date: Thu, 25 Feb 2021 18:04:19 +0100 +Subject: [PATCH] tdf#132368 svx: empty the interop grab-bag on ending text + edit + +Regression from commit aafaf1f55fa413ad49d4556cf7c0a713dd206ae4 (PPTX +export: save SmartArt as diagram instead of group of shapes, +2019-03-13), the idea of interop grab-bag was to carry additional +information around as long as the object is not changed. + +However, actual clearing of the grab-bag was never implemented, do this +when editing shape text. + +An alternative would be to do this in SdrObject::SetChanged(), but +Writer sets the layer of SdrObjects during layout (when the import +filter is already finished and undo is enabled), so that would mean loss +of the smartart metadata for DOCX. + +Change-Id: I9ab205b4ef84169f4b5a16b86fe9a152e3370a6c +Reviewed-on: https://gerrit.libreoffice.org/c/core/+/111560 +Reviewed-by: Miklos Vajna <vmik...@collabora.com> +Tested-by: Jenkins +Signed-off-by: Xisco Fauli <xiscofa...@libreoffice.org> --- - .../drawingml/diagram/diagramlayoutatoms.cxx | 78 ++++++++++++++----- - 1 file changed, 60 insertions(+), 18 deletions(-) - -Index: libreoffice-7.1.0.3/oox/source/drawingml/diagram/diagramlayoutatoms.cxx -=================================================================== ---- libreoffice-7.1.0.3.orig/oox/source/drawingml/diagram/diagramlayoutatoms.cxx -+++ libreoffice-7.1.0.3/oox/source/drawingml/diagram/diagramlayoutatoms.cxx -@@ -784,6 +784,37 @@ sal_Int32 AlgAtom::getVerticalShapesCoun - namespace - { - /** -+ * Decides if a certain reference type (e.g. "right") can be inferred from the available properties -+ * in rMap (e.g. left and width). Returns true if rValue is written to. -+ */ -+bool InferFromLayoutProperty(const LayoutProperty& rMap, sal_Int32 nRefType, sal_Int32& rValue) + svx/CppunitTest_svx_unit.mk | 1 + + svx/qa/unit/svdraw.cxx | 55 ++++++++++++++++++++++++++++++++++++ + svx/source/svdraw/svdobj.cxx | 20 +++++++++++++ + 3 files changed, 76 insertions(+) + +diff --git a/svx/CppunitTest_svx_unit.mk b/svx/CppunitTest_svx_unit.mk +index ac9f3e4531ad..892490265261 100644 +--- a/svx/CppunitTest_svx_unit.mk ++++ b/svx/CppunitTest_svx_unit.mk +@@ -36,6 +36,7 @@ $(eval $(call gb_CppunitTest_add_exception_objects,svx_unit, \ + $(eval $(call gb_CppunitTest_use_libraries,svx_unit, \ + basegfx \ + drawinglayer \ ++ editeng \ + sal \ + sfx \ + svxcore \ +diff --git a/svx/qa/unit/svdraw.cxx b/svx/qa/unit/svdraw.cxx +index c96ccbb7aa97..783420d56fea 100644 +--- a/svx/qa/unit/svdraw.cxx ++++ b/svx/qa/unit/svdraw.cxx +@@ -25,6 +25,12 @@ + #include <svx/svdpage.hxx> + #include <svx/unopage.hxx> + #include <vcl/virdev.hxx> ++#include <comphelper/propertyvalue.hxx> ++#include <sfx2/viewsh.hxx> ++#include <svx/svdview.hxx> ++#include <svx/unoapi.hxx> ++#include <sal/log.hxx> ++ + #include <sdr/contact/objectcontactofobjlistpainter.hxx> + + using namespace ::com::sun::star; +@@ -105,6 +111,55 @@ CPPUNIT_TEST_FIXTURE(SvdrawTest, testSemiTransparentText) + CPPUNIT_ASSERT_EQUAL(nTransparence, + static_cast<sal_Int16>(basegfx::fround(fTransparence * 100))); + } ++ ++CPPUNIT_TEST_FIXTURE(SvdrawTest, testTextEditEmptyGrabBag) +{ -+ switch (nRefType) ++ // Given a document with a groupshape, which has 2 children. ++ getComponent() = loadFromDesktop("private:factory/sdraw"); ++ uno::Reference<lang::XMultiServiceFactory> xFactory(getComponent(), uno::UNO_QUERY); ++ uno::Reference<drawing::XShape> xRect1( ++ xFactory->createInstance("com.sun.star.drawing.RectangleShape"), uno::UNO_QUERY); ++ xRect1->setPosition(awt::Point(1000, 1000)); ++ xRect1->setSize(awt::Size(10000, 10000)); ++ uno::Reference<drawing::XShape> xRect2( ++ xFactory->createInstance("com.sun.star.drawing.RectangleShape"), uno::UNO_QUERY); ++ xRect2->setPosition(awt::Point(1000, 1000)); ++ xRect2->setSize(awt::Size(10000, 10000)); ++ uno::Reference<drawing::XShapes> xGroup( ++ xFactory->createInstance("com.sun.star.drawing.GroupShape"), uno::UNO_QUERY); ++ uno::Reference<drawing::XDrawPagesSupplier> xDrawPagesSupplier(getComponent(), uno::UNO_QUERY); ++ uno::Reference<drawing::XDrawPage> xDrawPage(xDrawPagesSupplier->getDrawPages()->getByIndex(0), ++ uno::UNO_QUERY); ++ uno::Reference<drawing::XShape> xGroupShape(xGroup, uno::UNO_QUERY); ++ xDrawPage->add(xGroupShape); ++ xGroup->add(xRect1); ++ xGroup->add(xRect2); ++ uno::Reference<text::XTextRange> xRect2Text(xRect2, uno::UNO_QUERY); ++ xRect2Text->setString("x"); ++ uno::Sequence<beans::PropertyValue> aGrabBag = { ++ comphelper::makePropertyValue("OOXLayout", true), ++ }; ++ uno::Reference<beans::XPropertySet> xGroupProps(xGroup, uno::UNO_QUERY); ++ xGroupProps->setPropertyValue("InteropGrabBag", uno::makeAny(aGrabBag)); ++ ++ // When editing the shape text of the 2nd rectangle (insert a char at the start). ++ SfxViewShell* pViewShell = SfxViewShell::Current(); ++ SdrView* pSdrView = pViewShell->GetDrawView(); ++ SdrObject* pObject = GetSdrObjectFromXShape(xRect2); ++ pSdrView->SdrBeginTextEdit(pObject); ++ EditView& rEditView = pSdrView->GetTextEditOutlinerView()->GetEditView(); ++ rEditView.InsertText("y"); ++ pSdrView->SdrEndTextEdit(); ++ ++ // Then make sure that grab-bag is empty to avoid loosing the new text. ++ xGroupProps->getPropertyValue("InteropGrabBag") >>= aGrabBag; ++ // Without the accompanying fix in place, this test would have failed with: ++ // assertion failed ++ // - Expression: !aGrabBag.hasElements() ++ // i.e. the grab-bag was still around after modifying the shape, and that grab-bag contained the ++ // old text. ++ CPPUNIT_ASSERT(!aGrabBag.hasElements()); ++} + } + + /* vim:set shiftwidth=4 softtabstop=4 expandtab: */ +diff --git a/svx/source/svdraw/svdobj.cxx b/svx/source/svdraw/svdobj.cxx +index 638c590a52cd..5480ac1d86ce 100644 +--- a/svx/source/svdraw/svdobj.cxx ++++ b/svx/source/svdraw/svdobj.cxx +@@ -1740,6 +1740,26 @@ void SdrObject::SetOutlinerParaObject(std::unique_ptr<OutlinerParaObject> pTextO + if (GetCurrentBoundRect()!=aBoundRect0) { + SendUserCall(SdrUserCallType::Resize,aBoundRect0); + } ++ ++ if (getSdrModelFromSdrObject().IsUndoEnabled()) + { -+ case XML_r: ++ // Don't do this during import. ++ SdrObject* pTopGroupObj = nullptr; ++ if (getParentSdrObjectFromSdrObject()) + { -+ auto it = rMap.find(XML_l); -+ if (it == rMap.end()) ++ pTopGroupObj = getParentSdrObjectFromSdrObject(); ++ while (pTopGroupObj->getParentSdrObjectFromSdrObject()) + { -+ return false; ++ pTopGroupObj = pTopGroupObj->getParentSdrObjectFromSdrObject(); + } -+ sal_Int32 nLeft = it->second; -+ it = rMap.find(XML_w); -+ if (it == rMap.end()) -+ { -+ return false; -+ } -+ rValue = nLeft + it->second; -+ return true; + } -+ default: -+ break; ++ if (pTopGroupObj) ++ { ++ // A shape was modified, which is in a group shape. Empty the group shape's grab-bag, ++ // which potentially contains the old text of the shapes in case of diagrams. ++ pTopGroupObj->SetGrabBagItem(uno::makeAny(uno::Sequence<beans::PropertyValue>())); ++ } + } -+ -+ return false; -+} -+ -+/** - * Apply rConstraint to the rProperties shared layout state. - * - * Note that the order in which constraints are applied matters, given that constraints can refer to -@@ -803,11 +834,22 @@ void ApplyConstraintToLayout(const Const - return; + } - const LayoutProperty::const_iterator aRefType = aRef->second.find(rConstraint.mnRefType); -+ sal_Int32 nInferredValue = 0; - if (aRefType != aRef->second.end()) -+ { -+ // Reference is found directly. - rProperties[rConstraint.msForName][rConstraint.mnType] - = aRefType->second * rConstraint.mfFactor; -+ } -+ else if (InferFromLayoutProperty(aRef->second, rConstraint.mnRefType, nInferredValue)) -+ { -+ // Reference can be inferred. -+ rProperties[rConstraint.msForName][rConstraint.mnType] -+ = nInferredValue * rConstraint.mfFactor; -+ } - else - { -+ // Reference not found, assume a fixed value. - // Values are never in EMU, while oox::drawingml::Shape position and size are always in - // EMU. - double fUnitFactor = 0; + void SdrObject::NbcSetOutlinerParaObject(std::unique_ptr<OutlinerParaObject> /*pTextObject*/) +-- +2.26.2 + ++++++ libreoffice-7.1.0.3.tar.xz -> libreoffice-7.1.1.2.tar.xz ++++++ /work/SRC/openSUSE:Factory/libreoffice/libreoffice-7.1.0.3.tar.xz /work/SRC/openSUSE:Factory/.libreoffice.new.2378/libreoffice-7.1.1.2.tar.xz differ: char 27, line 1 ++++++ libreoffice-help-7.1.0.3.tar.xz -> libreoffice-help-7.1.1.2.tar.xz ++++++ /work/SRC/openSUSE:Factory/libreoffice/libreoffice-help-7.1.0.3.tar.xz /work/SRC/openSUSE:Factory/.libreoffice.new.2378/libreoffice-help-7.1.1.2.tar.xz differ: char 27, line 1 ++++++ libreoffice-translations-7.1.0.3.tar.xz -> libreoffice-translations-7.1.1.2.tar.xz ++++++ /work/SRC/openSUSE:Factory/libreoffice/libreoffice-translations-7.1.0.3.tar.xz /work/SRC/openSUSE:Factory/.libreoffice.new.2378/libreoffice-translations-7.1.1.2.tar.xz differ: char 26, line 1