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:
@@ -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;
|
||||
|
||||
Binary file not shown.
@@ -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();
|
||||
|
||||
Reference in New Issue
Block a user