summaryrefslogtreecommitdiff
path: root/sd
diff options
context:
space:
mode:
authorTibor Nagy <tibor.nagy.extern@allotropia.de>2024-06-06 19:47:45 +0200
committerNagy Tibor <tibor.nagy.extern@allotropia.de>2024-06-07 14:38:52 +0200
commit805fd61f8efaaac119bbe28ab51617c07f0d7058 (patch)
tree34441c4d69c1720234fa6aca4a21f4e76430440a /sd
parent82640810efd1636e358c047a1a5b3e4e3fc9d28a (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.pptxbin0 -> 202978 bytes
-rw-r--r--sd/qa/unit/export-tests-ooxml4.cxx23
-rw-r--r--sd/source/filter/eppt/pptx-epptooxml.cxx80
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
new file mode 100644
index 000000000000..9bc68d6ae4e9
--- /dev/null
+++ b/sd/qa/unit/data/pptx/tdf160591.pptx
Binary files differ
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);