summaryrefslogtreecommitdiff
path: root/oox
diff options
context:
space:
mode:
authorMiklos Vajna <vmiklos@collabora.com>2021-12-02 08:45:26 +0100
committerMiklos Vajna <vmiklos@collabora.com>2021-12-02 17:26:33 +0100
commitf36767fde87191258ea21f3faac0be6ad79328e0 (patch)
tree6a4820a0cb921365f637fd86880fecbae6b877ea /oox
parentc8e21d246bcb4289cb25c82be440cd07b7418436 (diff)
PPTX export: handle theme colors from the doc model for shape text
As a start, do this only in case there are no effects used. If there is no theme color or there are effects, fall back to the old code. Also move parseExportStream() from SdModelTestBaseXML up to MacrosTest, so oox/ test code can use it as well. Change-Id: Ia76581dcef110341f6c3e60f22c34818ed0dcabc Reviewed-on: https://gerrit.libreoffice.org/c/core/+/126215 Reviewed-by: Miklos Vajna <vmiklos@collabora.com> Tested-by: Jenkins
Diffstat (limited to 'oox')
-rw-r--r--oox/qa/unit/data/refer-to-theme.pptxbin0 -> 32686 bytes
-rw-r--r--oox/qa/unit/export.cxx45
-rw-r--r--oox/source/export/drawingml.cxx54
3 files changed, 76 insertions, 23 deletions
diff --git a/oox/qa/unit/data/refer-to-theme.pptx b/oox/qa/unit/data/refer-to-theme.pptx
new file mode 100644
index 000000000000..9a45799ab977
--- /dev/null
+++ b/oox/qa/unit/data/refer-to-theme.pptx
Binary files differ
diff --git a/oox/qa/unit/export.cxx b/oox/qa/unit/export.cxx
index b649d546ead9..fee130d77971 100644
--- a/oox/qa/unit/export.cxx
+++ b/oox/qa/unit/export.cxx
@@ -13,11 +13,9 @@
#include <com/sun/star/frame/Desktop.hpp>
#include <com/sun/star/frame/XStorable.hpp>
-#include <com/sun/star/packages/zip/ZipFileAccess.hpp>
#include <unotools/mediadescriptor.hxx>
#include <unotools/tempfile.hxx>
-#include <unotools/ucbstreamhelper.hxx>
using namespace ::com::sun::star;
@@ -86,11 +84,7 @@ CPPUNIT_TEST_FIXTURE(Test, testPolylineConnectorPosition)
loadAndSave(aURL, "Office Open XML Text");
// Then make sure polyline and connector have the correct position.
- uno::Reference<packages::zip::XZipFileAccess2> xNameAccess
- = packages::zip::ZipFileAccess::createWithURL(mxComponentContext, getTempFile().GetURL());
- uno::Reference<io::XInputStream> xInputStream(xNameAccess->getByName("word/document.xml"),
- uno::UNO_QUERY);
- std::unique_ptr<SvStream> pStream(utl::UcbStreamHelper::CreateStream(xInputStream, true));
+ std::unique_ptr<SvStream> pStream = parseExportStream(getTempFile(), "word/document.xml");
xmlDocUniquePtr pXmlDoc = parseXmlStream(pStream.get());
// For child elements of groups in Writer the position has to be adapted to be relative
@@ -117,11 +111,7 @@ CPPUNIT_TEST_FIXTURE(Test, testRotatedShapePosition)
loadAndSave(aURL, "Office Open XML Text");
// Then make sure the rotated child shape has the correct position.
- uno::Reference<packages::zip::XZipFileAccess2> xNameAccess
- = packages::zip::ZipFileAccess::createWithURL(mxComponentContext, getTempFile().GetURL());
- uno::Reference<io::XInputStream> xInputStream(xNameAccess->getByName("word/document.xml"),
- uno::UNO_QUERY);
- std::unique_ptr<SvStream> pStream(utl::UcbStreamHelper::CreateStream(xInputStream, true));
+ std::unique_ptr<SvStream> pStream = parseExportStream(getTempFile(), "word/document.xml");
xmlDocUniquePtr pXmlDoc = parseXmlStream(pStream.get());
// For a group itself and for shapes outside of groups, the position calculation is done in
@@ -142,11 +132,7 @@ CPPUNIT_TEST_FIXTURE(Test, testDmlGroupshapePolygon)
// Then make sure that the group shape, the group shape's child size and the child shape's size
// match:
- uno::Reference<packages::zip::XZipFileAccess2> xNameAccess
- = packages::zip::ZipFileAccess::createWithURL(mxComponentContext, getTempFile().GetURL());
- uno::Reference<io::XInputStream> xInputStream(xNameAccess->getByName("word/document.xml"),
- uno::UNO_QUERY);
- std::unique_ptr<SvStream> pStream(utl::UcbStreamHelper::CreateStream(xInputStream, true));
+ std::unique_ptr<SvStream> pStream = parseExportStream(getTempFile(), "word/document.xml");
xmlDocUniquePtr pXmlDoc = parseXmlStream(pStream.get());
assertXPath(pXmlDoc, "//wpg:grpSpPr/a:xfrm/a:ext", "cx", "5328360");
// Without the accompanying fix in place, this test would have failed, the <a:chExt> element was
@@ -163,11 +149,7 @@ CPPUNIT_TEST_FIXTURE(Test, testCustomShapeArrowExport)
loadAndSave(aURL, "Office Open XML Text");
// Then the shapes should retain their correct control values.
- uno::Reference<packages::zip::XZipFileAccess2> xNameAccess
- = packages::zip::ZipFileAccess::createWithURL(mxComponentContext, getTempFile().GetURL());
- uno::Reference<io::XInputStream> xInputStream(xNameAccess->getByName("word/document.xml"),
- uno::UNO_QUERY);
- std::unique_ptr<SvStream> pStream(utl::UcbStreamHelper::CreateStream(xInputStream, true));
+ std::unique_ptr<SvStream> pStream = parseExportStream(getTempFile(), "word/document.xml");
xmlDocUniquePtr pXmlDoc = parseXmlStream(pStream.get());
// Without the fix the output OOXML would have no <a:prstGeom> tags in it.
@@ -344,6 +326,25 @@ CPPUNIT_TEST_FIXTURE(Test, testCustomShapeArrowExport)
"a:graphicData/wps:wsp/wps:spPr/a:prstGeom/a:avLst/a:gd[4]",
"fmla", "val 66660");
}
+
+CPPUNIT_TEST_FIXTURE(Test, testReferToTheme)
+{
+ // Given a PPTX file that contains references to a theme:
+ OUString aURL = m_directories.getURLFromSrc(DATA_DIRECTORY) + "refer-to-theme.pptx";
+
+ // When saving that document:
+ loadAndSave(aURL, "Impress Office Open XML");
+
+ std::unique_ptr<SvStream> pStream = parseExportStream(getTempFile(), "ppt/slides/slide1.xml");
+ xmlDocUniquePtr pXmlDoc = parseXmlStream(pStream.get());
+ // Then make sure the shape text color is a scheme color:
+ // Without the accompanying fix in place, this test would have failed with:
+ // - Expected: 1
+ // - Actual : 0
+ // - XPath '//p:sp/p:txBody/a:p/a:r/a:rPr/a:solidFill/a:schemeClr' number of nodes is incorrect
+ // i.e. the <a:schemeClr> element was not written.
+ assertXPath(pXmlDoc, "//p:sp/p:txBody/a:p/a:r/a:rPr/a:solidFill/a:schemeClr", "val", "accent1");
+}
}
CPPUNIT_PLUGIN_IMPLEMENT();
diff --git a/oox/source/export/drawingml.cxx b/oox/source/export/drawingml.cxx
index fbe13359dd9b..7217efe0e5c9 100644
--- a/oox/source/export/drawingml.cxx
+++ b/oox/source/export/drawingml.cxx
@@ -152,6 +152,21 @@ sal_Int32 GetAlphaFromTransparenceGradient(const awt::Gradient& rGradient, bool
// drawingML alpha is a percentage on a 0..100000 scale.
return (255 - nRed) * oox::drawingml::MAX_PERCENT / 255;
}
+
+const char* g_aPredefinedClrNames[] = {
+ "dk1",
+ "lt1",
+ "dk2",
+ "lt2",
+ "accent1",
+ "accent2",
+ "accent3",
+ "accent4",
+ "accent5",
+ "accent6",
+ "hlink",
+ "folHlink",
+};
}
namespace oox::drawingml {
@@ -400,6 +415,40 @@ void DrawingML::WriteColorTransformations( const Sequence< PropertyValue >& aTra
}
}
+bool DrawingML::WriteCharColor(const css::uno::Reference<css::beans::XPropertySet>& xPropertySet)
+{
+ if (!xPropertySet->getPropertySetInfo()->hasPropertyByName("CharColorTheme"))
+ {
+ return false;
+ }
+
+ sal_Int32 nCharColorTheme = -1;
+ xPropertySet->getPropertyValue("CharColorTheme") >>= nCharColorTheme;
+ if (nCharColorTheme < 0 || nCharColorTheme > 11)
+ {
+ return false;
+ }
+
+ const char* pColorName = g_aPredefinedClrNames[nCharColorTheme];
+
+ sal_Int32 nCharColorLumMod{};
+ xPropertySet->getPropertyValue("CharColorLumMod") >>= nCharColorLumMod;
+ sal_Int32 nCharColorLumOff{};
+ xPropertySet->getPropertyValue("CharColorLumOff") >>= nCharColorLumOff;
+ sal_Int32 nCharColorTintOrShade{};
+ xPropertySet->getPropertyValue("CharColorTintOrShade") >>= nCharColorTintOrShade;
+ if (nCharColorLumMod != 10000 || nCharColorLumOff != 0 || nCharColorTintOrShade != 0)
+ {
+ return false;
+ }
+
+ mpFS->startElementNS(XML_a, XML_solidFill);
+ mpFS->singleElementNS(XML_a, XML_schemeClr, XML_val, pColorName);
+ mpFS->endElementNS(XML_a, XML_solidFill);
+
+ return true;
+}
+
void DrawingML::WriteSolidFill( ::Color nColor, sal_Int32 nAlpha )
{
mpFS->startElementNS(XML_a, XML_solidFill);
@@ -2146,7 +2195,10 @@ void DrawingML::WriteRunProperties( const Reference< XPropertySet >& rRun, bool
{
color.SetAlpha(255);
// TODO: special handle embossed/engraved
- WriteSolidFill(color, nTransparency);
+ if (!WriteCharColor(rXPropSet))
+ {
+ WriteSolidFill(color, nTransparency);
+ }
}
}
}