summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMiklos Vajna <vmiklos@collabora.com>2019-04-23 09:09:21 +0200
committerMiklos Vajna <vmiklos@collabora.com>2019-04-23 09:58:03 +0200
commit943a534ac7cb3df513583e226c986dafd8ba246b (patch)
treee2c0aa46f6b81f7ca16e72e5d9b31ac953a44c44
parent1ea226c6d247c349d87df3deb382052cd619e9bc (diff)
tdf#123684 PPTX import: fix wrong background color for <p:sp useBgFill="1">
Regression from commit 59339dec1ce56213dc74a06af2f0d35ac1c534d7 (tdf#105150 PPTX import: try harder to handle <p:sp useBgFill="1">, 2017-01-06), the problem was that we gave a white solid fill to a shape which is meant to be transparent. Fix the problem by limiting the scope of the mentioned commit to solid colors only, and also extend to code to look for background fill from the masterpage as well. This allows not hardcoding the white solid fill and leaves the fill style of shapes as transparent where the slide background is a bitmap or other more complex fill type. Change-Id: I0063e88d510250652d2b14856df3bd431681422d Reviewed-on: https://gerrit.libreoffice.org/71107 Reviewed-by: Miklos Vajna <vmiklos@collabora.com> Tested-by: Jenkins
-rw-r--r--oox/source/ppt/pptshapegroupcontext.cxx26
-rw-r--r--sd/qa/unit/data/pptx/tdf123684.pptxbin0 -> 142961 bytes
-rw-r--r--sd/qa/unit/import-tests.cxx16
3 files changed, 36 insertions, 6 deletions
diff --git a/oox/source/ppt/pptshapegroupcontext.cxx b/oox/source/ppt/pptshapegroupcontext.cxx
index c2e5f2f2c9b4..6535e12d3f81 100644
--- a/oox/source/ppt/pptshapegroupcontext.cxx
+++ b/oox/source/ppt/pptshapegroupcontext.cxx
@@ -106,13 +106,27 @@ ContextHandlerRef PPTShapeGroupContext::onCreateContext( sal_Int32 aElementToken
oox::drawingml::FillPropertiesPtr pBackgroundPropertiesPtr = mpSlidePersistPtr->getBackgroundProperties();
if (!pBackgroundPropertiesPtr)
{
- // The shape wants a background, but the slide doesn't have
- // one: default to white.
- pBackgroundPropertiesPtr.reset(new oox::drawingml::FillProperties);
- pBackgroundPropertiesPtr->moFillType = XML_solidFill;
- pBackgroundPropertiesPtr->maFillColor.setSrgbClr(0xFFFFFF);
+ // The shape wants a background, but the slide doesn't have one.
+ SlidePersistPtr pMaster = mpSlidePersistPtr->getMasterPersist();
+ if (pMaster)
+ {
+ oox::drawingml::FillPropertiesPtr pMasterBackground
+ = pMaster->getBackgroundProperties();
+ if (pMasterBackground)
+ {
+ if (pMasterBackground->moFillType.has()
+ && pMasterBackground->moFillType.get() == XML_solidFill)
+ {
+ // Master has a solid background, use that.
+ pBackgroundPropertiesPtr = pMasterBackground;
+ }
+ }
+ }
+ }
+ if (pBackgroundPropertiesPtr)
+ {
+ pShape->getFillProperties().assignUsed(*pBackgroundPropertiesPtr);
}
- pShape->getFillProperties().assignUsed( *pBackgroundPropertiesPtr );
}
pShape->setModelId(rAttribs.getString( XML_modelId ).get());
return new PPTShapeContext( *this, mpSlidePersistPtr, mpGroupShapePtr, pShape );
diff --git a/sd/qa/unit/data/pptx/tdf123684.pptx b/sd/qa/unit/data/pptx/tdf123684.pptx
new file mode 100644
index 000000000000..87243422753b
--- /dev/null
+++ b/sd/qa/unit/data/pptx/tdf123684.pptx
Binary files differ
diff --git a/sd/qa/unit/import-tests.cxx b/sd/qa/unit/import-tests.cxx
index 0e4ccf9a8d4e..48b061e7caa5 100644
--- a/sd/qa/unit/import-tests.cxx
+++ b/sd/qa/unit/import-tests.cxx
@@ -169,6 +169,7 @@ public:
void testTdf104445();
void testTdf105150();
void testTdf105150PPT();
+ void testTdf123684();
void testTdf100926();
void testTdf89064();
void testTdf108925();
@@ -259,6 +260,7 @@ public:
CPPUNIT_TEST(testTdf104445);
CPPUNIT_TEST(testTdf105150);
CPPUNIT_TEST(testTdf105150PPT);
+ CPPUNIT_TEST(testTdf123684);
CPPUNIT_TEST(testTdf100926);
CPPUNIT_TEST(testPatternImport);
CPPUNIT_TEST(testTdf89064);
@@ -1772,6 +1774,20 @@ void SdImportTest::testTdf105150()
xDocShRef->DoClose();
}
+void SdImportTest::testTdf123684()
+{
+ sd::DrawDocShellRef xDocShRef
+ = loadURL(m_directories.getURLFromSrc("sd/qa/unit/data/pptx/tdf123684.pptx"), PPTX);
+ const SdrPage* pPage = GetPage(1, xDocShRef);
+ const SdrObject* pObj = pPage->GetObj(0);
+ auto& rFillStyleItem
+ = dynamic_cast<const XFillStyleItem&>(pObj->GetMergedItem(XATTR_FILLSTYLE));
+ // Without the accompanying fix in place, this test would have failed with 'Expected: 0; Actual:
+ // 1', i.e. the shape's fill was FillStyle_SOLID, making the text of the shape unreadable.
+ CPPUNIT_ASSERT_EQUAL(drawing::FillStyle_NONE, rFillStyleItem.GetValue());
+ xDocShRef->DoClose();
+}
+
void SdImportTest::testTdf105150PPT()
{
sd::DrawDocShellRef xDocShRef = loadURL(m_directories.getURLFromSrc("sd/qa/unit/data/ppt/tdf105150.ppt"), PPT);