diff options
author | Tibor Nagy <tibor.nagy.extern@allotropia.de> | 2024-06-06 19:47:45 +0200 |
---|---|---|
committer | Nagy Tibor <tibor.nagy.extern@allotropia.de> | 2024-06-07 14:38:52 +0200 |
commit | 805fd61f8efaaac119bbe28ab51617c07f0d7058 (patch) | |
tree | 34441c4d69c1720234fa6aca4a21f4e76430440a /sd | |
parent | 82640810efd1636e358c047a1a5b3e4e3fc9d28a (diff) |
tdf#160591 PPTX export: fix colormap mapping in slide master
Change-Id: I154f0ff1769fbda361ec62f1dd589ca0d7686bd9
Reviewed-on: https://gerrit.libreoffice.org/c/core/+/168506
Tested-by: Jenkins
Reviewed-by: Nagy Tibor <tibor.nagy.extern@allotropia.de>
Diffstat (limited to 'sd')
-rw-r--r-- | sd/qa/unit/data/pptx/tdf160591.pptx | bin | 0 -> 202978 bytes | |||
-rw-r--r-- | sd/qa/unit/export-tests-ooxml4.cxx | 23 | ||||
-rw-r--r-- | sd/source/filter/eppt/pptx-epptooxml.cxx | 80 |
3 files changed, 89 insertions, 14 deletions
diff --git a/sd/qa/unit/data/pptx/tdf160591.pptx b/sd/qa/unit/data/pptx/tdf160591.pptx Binary files differnew file mode 100644 index 000000000000..9bc68d6ae4e9 --- /dev/null +++ b/sd/qa/unit/data/pptx/tdf160591.pptx diff --git a/sd/qa/unit/export-tests-ooxml4.cxx b/sd/qa/unit/export-tests-ooxml4.cxx index fbf60274d785..63af283d664f 100644 --- a/sd/qa/unit/export-tests-ooxml4.cxx +++ b/sd/qa/unit/export-tests-ooxml4.cxx @@ -38,6 +38,29 @@ public: } }; +CPPUNIT_TEST_FIXTURE(SdOOXMLExportTest4, testTdf160591) +{ + createSdImpressDoc("pptx/tdf160591.pptx"); + save(u"Impress Office Open XML"_ustr); + + // Char scheme color + xmlDocUniquePtr pXmlDoc1 = parseExport(u"ppt/slides/slide1.xml"_ustr); + assertXPath(pXmlDoc1, + "/p:sld/p:cSld/p:spTree/p:sp/p:txBody/a:p/a:r/a:rPr/a:solidFill/a:schemeClr"_ostr, + "val"_ostr, u"lt2"_ustr); + + // Master slide ColorMap + xmlDocUniquePtr pXmlDoc2 = parseExport(u"ppt/slideMasters/slideMaster1.xml"_ustr); + assertXPath(pXmlDoc2, "/p:sldMaster/p:clrMap"_ostr, "bg1"_ostr, u"dk1"_ustr); + assertXPath(pXmlDoc2, "/p:sldMaster/p:clrMap"_ostr, "tx1"_ostr, u"lt1"_ustr); + assertXPath(pXmlDoc2, "/p:sldMaster/p:clrMap"_ostr, "bg2"_ostr, u"dk2"_ustr); + assertXPath(pXmlDoc2, "/p:sldMaster/p:clrMap"_ostr, "tx2"_ostr, u"lt2"_ustr); + + // Master slide background + assertXPath(pXmlDoc2, "/p:sldMaster/p:cSld/p:bg/p:bgPr/a:solidFill/a:schemeClr"_ostr, + "val"_ostr, u"dk1"_ustr); +} + CPPUNIT_TEST_FIXTURE(SdOOXMLExportTest4, testSmartArtPreserve) { createSdImpressDoc("pptx/smartart-preserve.pptx"); diff --git a/sd/source/filter/eppt/pptx-epptooxml.cxx b/sd/source/filter/eppt/pptx-epptooxml.cxx index b8e552b3ad0d..5711d4192e7d 100644 --- a/sd/source/filter/eppt/pptx-epptooxml.cxx +++ b/sd/source/filter/eppt/pptx-epptooxml.cxx @@ -1498,20 +1498,72 @@ void PowerPointExport::ImplWriteSlideMaster(sal_uInt32 nPageNum, Reference< XPro pFS->endElementNS(XML_p, XML_cSld); - // color map - now it uses colors from hardcoded theme, once we eventually generate theme, this might need update - pFS->singleElementNS(XML_p, XML_clrMap, - XML_bg1, "lt1", - XML_bg2, "lt2", - XML_tx1, "dk1", - XML_tx2, "dk2", - XML_accent1, "accent1", - XML_accent2, "accent2", - XML_accent3, "accent3", - XML_accent4, "accent4", - XML_accent5, "accent5", - XML_accent6, "accent6", - XML_hlink, "hlink", - XML_folHlink, "folHlink"); + css::uno::Reference< css::beans::XPropertySet > xDocPropSet(getModel(), uno::UNO_QUERY); + if (xDocPropSet.is()) + { + uno::Sequence<beans::PropertyValue> aGrabBag; + if (xDocPropSet->getPropertySetInfo()->hasPropertyByName(u"InteropGrabBag"_ustr)) + xDocPropSet->getPropertyValue(u"InteropGrabBag"_ustr) >>= aGrabBag; + + std::vector<OUString> aClrMap; + aClrMap.reserve(12); + if(aGrabBag.hasElements()) + { + uno::Sequence<beans::PropertyValue> aClrMapPropValue; + for (const auto& rProp : aGrabBag) + { + if (rProp.Name == "OOXColorMap") + { + rProp.Value >>= aClrMapPropValue; + break; + } + } + + OUString sName; + sal_Int32 nToken = XML_TOKEN_INVALID; + for(const auto& item : aClrMapPropValue) + { + item.Value >>= nToken; + switch (nToken) + { + case XML_dk1: sName = u"dk1"_ustr; break; + case XML_lt1: sName = u"lt1"_ustr; break; + case XML_dk2: sName = u"dk2"_ustr; break; + case XML_lt2: sName = u"lt2"_ustr; break; + case XML_accent1: sName = u"accent1"_ustr; break; + case XML_accent2: sName = u"accent2"_ustr; break; + case XML_accent3: sName = u"accent3"_ustr; break; + case XML_accent4: sName = u"accent4"_ustr; break; + case XML_accent5: sName = u"accent5"_ustr; break; + case XML_accent6: sName = u"accent6"_ustr; break; + case XML_hlink: sName = u"hlink"_ustr; break; + case XML_folHlink: sName = u"folHlink"_ustr; break; + } + aClrMap.push_back(sName); + } + } + else + { + // default clrMap to export ".odp" files to ".pptx" + aClrMap = { u"lt1"_ustr, u"dk1"_ustr, u"lt2"_ustr, u"dk2"_ustr, + u"accent1"_ustr, u"accent2"_ustr, u"accent3"_ustr, u"accent4"_ustr, + u"accent5"_ustr, u"accent6"_ustr, u"hlink"_ustr, u"folHlink"_ustr }; + } + + pFS->singleElementNS(XML_p, XML_clrMap, + XML_bg1, aClrMap[0], + XML_tx1, aClrMap[1], + XML_bg2, aClrMap[2], + XML_tx2, aClrMap[3], + XML_accent1, aClrMap[4], + XML_accent2, aClrMap[5], + XML_accent3, aClrMap[6], + XML_accent4, aClrMap[7], + XML_accent5, aClrMap[8], + XML_accent6, aClrMap[9], + XML_hlink, aClrMap[10], + XML_folHlink, aClrMap[11]); + } // use master's id type as they have same range, mso does that as well pFS->startElementNS(XML_p, XML_sldLayoutIdLst); |