summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMiklos Vajna <vmiklos@collabora.com>2020-06-10 14:51:04 +0200
committerMiklos Vajna <vmiklos@collabora.com>2020-06-10 21:02:30 +0200
commitb00e43fa5848be0cc7ba81b185021511d94cdc00 (patch)
tree4f9c08b689f02c4107325ea635f0a2a8af3debeb
parent18c6cc0e7a4515b5bd993c425a7e0694bffe1207 (diff)
PPTX export, custom shape, bitmap fill: fix source vs fill rect confusion
Commit 682ab832522b1349f1714bcb16f6e83468ea2920 (drawingML export\import: cropping of shape's fill texture, 2014-02-12) improved the DOCX filter, so the fill rectangle of a custom shape with bitmap fill is handled. The problem is drawingML has a source rectangle (similar to our crop rect) to limit the usage of the bitmap, and also it has a fill rectangle in case some margin is wanted around a stretched bitmap. We don't have a mapping for the later. Fix the problem by limiting the above work for DOCX, this way PPTX's source rectangle won't be turned into a stretch's fill rectangle. This way no unwanted margins will appear around the image -- those margins can be large enough that the image effectively disappears on export. Change-Id: Ic35063545a56eec9eaf885bbd397a854705d134f Reviewed-on: https://gerrit.libreoffice.org/c/core/+/96025 Reviewed-by: Miklos Vajna <vmiklos@collabora.com> Tested-by: Jenkins
-rw-r--r--oox/source/export/drawingml.cxx13
-rw-r--r--sd/qa/unit/data/pptx/customshape-bitmapfill-srcrect.pptxbin0 -> 34892 bytes
-rw-r--r--sd/qa/unit/export-tests-ooxml1.cxx25
3 files changed, 38 insertions, 0 deletions
diff --git a/oox/source/export/drawingml.cxx b/oox/source/export/drawingml.cxx
index fc5807ee61ba..f14129d0a2e8 100644
--- a/oox/source/export/drawingml.cxx
+++ b/oox/source/export/drawingml.cxx
@@ -1443,6 +1443,12 @@ void DrawingML::WriteXGraphicBlipFill(uno::Reference<beans::XPropertySet> const
WriteXGraphicBlip(rXPropSet, rxGraphic, bRelPathToMedia);
+ if (GetDocumentType() != DOCUMENT_DOCX)
+ {
+ // Write the crop rectangle of Impress as a source rectangle.
+ WriteSrcRectXGraphic(rXPropSet, rxGraphic);
+ }
+
if (bWriteMode)
{
WriteXGraphicBlipMode(rXPropSet, rxGraphic);
@@ -1538,6 +1544,13 @@ void DrawingML::WriteSrcRectXGraphic(uno::Reference<beans::XPropertySet> const &
void DrawingML::WriteXGraphicStretch(uno::Reference<beans::XPropertySet> const & rXPropSet,
uno::Reference<graphic::XGraphic> const & rxGraphic)
{
+ if (GetDocumentType() != DOCUMENT_DOCX)
+ {
+ // Limiting the area used for stretching is not supported in Impress.
+ mpFS->singleElementNS(XML_a, XML_stretch);
+ return;
+ }
+
mpFS->startElementNS(XML_a, XML_stretch);
bool bCrop = false;
diff --git a/sd/qa/unit/data/pptx/customshape-bitmapfill-srcrect.pptx b/sd/qa/unit/data/pptx/customshape-bitmapfill-srcrect.pptx
new file mode 100644
index 000000000000..e162f7e9923f
--- /dev/null
+++ b/sd/qa/unit/data/pptx/customshape-bitmapfill-srcrect.pptx
Binary files differ
diff --git a/sd/qa/unit/export-tests-ooxml1.cxx b/sd/qa/unit/export-tests-ooxml1.cxx
index 5de8eaf770c6..f7cec3010dc7 100644
--- a/sd/qa/unit/export-tests-ooxml1.cxx
+++ b/sd/qa/unit/export-tests-ooxml1.cxx
@@ -90,6 +90,7 @@ public:
void testRoundtripOwnLineStyles();
void testRoundtripPrstDash();
void testDashOnHairline();
+ void testCustomshapeBitmapfillSrcrect();
CPPUNIT_TEST_SUITE(SdOOXMLExportTest1);
@@ -129,6 +130,7 @@ public:
CPPUNIT_TEST(testRoundtripOwnLineStyles);
CPPUNIT_TEST(testRoundtripPrstDash);
CPPUNIT_TEST(testDashOnHairline);
+ CPPUNIT_TEST(testCustomshapeBitmapfillSrcrect);
CPPUNIT_TEST_SUITE_END();
@@ -1070,6 +1072,29 @@ void SdOOXMLExportTest1::testDashOnHairline()
assertXPath(pXmlDoc, sXmlPath, 11);
}
+void SdOOXMLExportTest1::testCustomshapeBitmapfillSrcrect()
+{
+ ::sd::DrawDocShellRef xDocShRef = loadURL(
+ m_directories.getURLFromSrc("sd/qa/unit/data/pptx/customshape-bitmapfill-srcrect.pptx"),
+ PPTX);
+ utl::TempFile tempFile;
+ xDocShRef = saveAndReload(xDocShRef.get(), PPTX, &tempFile);
+ xDocShRef->DoClose();
+
+ xmlDocUniquePtr pXmlDoc = parseExport(tempFile, "ppt/slides/slide1.xml");
+ const OString sXmlPath = "//a:blipFill/a:srcRect";
+ // 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);
+}
+
CPPUNIT_TEST_SUITE_REGISTRATION(SdOOXMLExportTest1);
CPPUNIT_PLUGIN_IMPLEMENT();