PPTX export, custom shape, bitmap fill: fix source vs fill rect confusion

Commit 682ab83252 (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
This commit is contained in:
Miklos Vajna
2020-06-10 21:02:30 +02:00
parent 18c6cc0e7a
commit b00e43fa58
3 changed files with 38 additions and 0 deletions
+13
View File
@@ -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;
+25
View File
@@ -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();