summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--include/oox/export/drawingml.hxx2
-rw-r--r--include/unotest/macros_test.hxx9
-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
-rw-r--r--sd/qa/unit/sdmodeltestbase.hxx11
-rw-r--r--unotest/Library_unotest.mk1
-rw-r--r--unotest/source/cpp/macros_test.cxx17
8 files changed, 105 insertions, 34 deletions
diff --git a/include/oox/export/drawingml.hxx b/include/oox/export/drawingml.hxx
index 4af628a289f9..516287293580 100644
--- a/include/oox/export/drawingml.hxx
+++ b/include/oox/export/drawingml.hxx
@@ -222,6 +222,8 @@ public:
void WriteLineArrow( const css::uno::Reference< css::beans::XPropertySet >& rXPropSet, bool bLineStart );
void WriteConnectorConnections( EscherConnectorListEntry& rConnectorEntry, sal_Int32 nStartID, sal_Int32 nEndID );
+ bool WriteCharColor(const css::uno::Reference<css::beans::XPropertySet>& xPropertySet);
+
void WriteSolidFill( ::Color nColor, sal_Int32 nAlpha = MAX_PERCENT );
void WriteSolidFill( const OUString& sSchemeName, const css::uno::Sequence< css::beans::PropertyValue >& aTransformations, sal_Int32 nAlpha = MAX_PERCENT );
void WriteSolidFill( const ::Color nColor, const css::uno::Sequence< css::beans::PropertyValue >& aTransformations, sal_Int32 nAlpha = MAX_PERCENT );
diff --git a/include/unotest/macros_test.hxx b/include/unotest/macros_test.hxx
index 14917794d38d..ed879b835a55 100644
--- a/include/unotest/macros_test.hxx
+++ b/include/unotest/macros_test.hxx
@@ -28,11 +28,16 @@ struct TestMacroInfo
};
class BasicDLL;
+class SvStream;
namespace test
{
class Directories;
}
+namespace utl
+{
+class TempFile;
+}
namespace unotest
{
@@ -76,6 +81,10 @@ public:
const OUString& rCommand,
const css::uno::Sequence<css::beans::PropertyValue>& rPropertyValues);
+ /// Opens rStreamName from rTempFile, assuming it's a ZIP storage.
+ static std::unique_ptr<SvStream> parseExportStream(const utl::TempFile& rTempFile,
+ const OUString& rStreamName);
+
void setUpNssGpg(const test::Directories& rDirectories, const OUString& rTestName);
void tearDownNssGpg();
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);
+ }
}
}
}
diff --git a/sd/qa/unit/sdmodeltestbase.hxx b/sd/qa/unit/sdmodeltestbase.hxx
index 74e25b1f1aba..03b087f8b88a 100644
--- a/sd/qa/unit/sdmodeltestbase.hxx
+++ b/sd/qa/unit/sdmodeltestbase.hxx
@@ -444,17 +444,6 @@ class SdModelTestBaseXML
{
public:
- std::unique_ptr<SvStream> parseExportStream(utl::TempFile const & rTempFile, const OUString& rStreamName)
- {
- // Read the stream we're interested in.
- OUString const url(rTempFile.GetURL());
- uno::Reference<packages::zip::XZipFileAccess2> const xZipNames(packages::zip::ZipFileAccess::createWithURL(
- comphelper::getComponentContext(m_xSFactory), url));
- uno::Reference<io::XInputStream> const xInputStream(xZipNames->getByName(rStreamName), uno::UNO_QUERY);
- std::unique_ptr<SvStream> pStream(utl::UcbStreamHelper::CreateStream(xInputStream, true));
- return pStream;
- }
-
xmlDocUniquePtr parseExport(utl::TempFile const & rTempFile, OUString const& rStreamName)
{
std::unique_ptr<SvStream> const pStream(parseExportStream(rTempFile, rStreamName));
diff --git a/unotest/Library_unotest.mk b/unotest/Library_unotest.mk
index ea697699ee82..3acfe2f69ed9 100644
--- a/unotest/Library_unotest.mk
+++ b/unotest/Library_unotest.mk
@@ -22,6 +22,7 @@ $(eval $(call gb_Library_use_libraries,unotest,\
cppuhelper \
sal \
sb \
+ utl \
))
$(eval $(call gb_Library_use_externals,unotest,\
diff --git a/unotest/source/cpp/macros_test.cxx b/unotest/source/cpp/macros_test.cxx
index ab15518e4c9c..718c0b1b8954 100644
--- a/unotest/source/cpp/macros_test.cxx
+++ b/unotest/source/cpp/macros_test.cxx
@@ -14,6 +14,7 @@
#include <com/sun/star/document/MacroExecMode.hpp>
#include <com/sun/star/uno/XComponentContext.hpp>
#include <com/sun/star/frame/DispatchHelper.hpp>
+#include <com/sun/star/packages/zip/ZipFileAccess.hpp>
#include <basic/basrdll.hxx>
#include <cppunit/TestAssert.h>
@@ -23,6 +24,8 @@
#include <osl/file.hxx>
#include <osl/process.h>
#include <osl/thread.h>
+#include <unotools/tempfile.hxx>
+#include <unotools/ucbstreamhelper.hxx>
using namespace css;
@@ -85,6 +88,20 @@ void MacrosTest::dispatchCommand(const uno::Reference<lang::XComponent>& xCompon
xDispatchHelper->executeDispatch(xFrame, rCommand, OUString(), 0, rPropertyValues);
}
+std::unique_ptr<SvStream> MacrosTest::parseExportStream(const utl::TempFile& rTempFile,
+ const OUString& rStreamName)
+{
+ const OUString aUrl = rTempFile.GetURL();
+ uno::Reference<uno::XComponentContext> xComponentContext
+ = comphelper::getProcessComponentContext();
+ uno::Reference<packages::zip::XZipFileAccess2> const xZipNames(
+ packages::zip::ZipFileAccess::createWithURL(xComponentContext, aUrl));
+ uno::Reference<io::XInputStream> const xInputStream(xZipNames->getByName(rStreamName),
+ uno::UNO_QUERY);
+ std::unique_ptr<SvStream> pStream(utl::UcbStreamHelper::CreateStream(xInputStream, true));
+ return pStream;
+}
+
void MacrosTest::setUpNssGpg(const test::Directories& rDirectories, const OUString& rTestName)
{
OUString aSourceDir = rDirectories.getURLFromSrc(u"/test/signing-keys/");