summaryrefslogtreecommitdiff
path: root/sc
diff options
context:
space:
mode:
authorTomaž Vajngerl <tomaz.vajngerl@collabora.co.uk>2023-06-30 01:39:50 +0900
committerTomaž Vajngerl <quikee@gmail.com>2023-07-04 08:40:20 +0200
commit20dbfa10d851b9df67fab561c3b86cba4f55cc8a (patch)
treef928379317ae361aaefe2efacc28900fb0d49b29 /sc
parent80569dc996a9a814ad7c2e729f30443debdbc6fe (diff)
sc: OOXML export of theme colors for text and background
Change-Id: Ifd0d8184c9210caa5ca099767baa5dbbf8783f36 Reviewed-on: https://gerrit.libreoffice.org/c/core/+/153785 Tested-by: Jenkins Reviewed-by: Tomaž Vajngerl <quikee@gmail.com>
Diffstat (limited to 'sc')
-rw-r--r--sc/qa/unit/ThemeImportExportTest.cxx18
-rw-r--r--sc/qa/unit/subsequent_export_test.cxx16
-rw-r--r--sc/source/filter/excel/xestream.cxx19
-rw-r--r--sc/source/filter/excel/xestyle.cxx40
4 files changed, 65 insertions, 28 deletions
diff --git a/sc/qa/unit/ThemeImportExportTest.cxx b/sc/qa/unit/ThemeImportExportTest.cxx
index 106471f9a816..95e6d0e2351e 100644
--- a/sc/qa/unit/ThemeImportExportTest.cxx
+++ b/sc/qa/unit/ThemeImportExportTest.cxx
@@ -41,11 +41,9 @@ CPPUNIT_TEST_FIXTURE(ThemeImportExportTest, testThemeExport)
// Fonts
assertXPath(pXmlDoc, "/x:styleSheet/x:fonts/x:font", 6);
- assertXPath(pXmlDoc, "/x:styleSheet/x:fonts/x:font[5]/x:color", "rgb",
- "FFFFC000"); // need to be theme probably
+ assertXPath(pXmlDoc, "/x:styleSheet/x:fonts/x:font[5]/x:color", "theme", "7");
- assertXPath(pXmlDoc, "/x:styleSheet/x:fonts/x:font[6]/x:color", "rgb",
- "FF9C5700"); // need to be theme probably
+ assertXPath(pXmlDoc, "/x:styleSheet/x:fonts/x:font[6]/x:color", "rgb", "FF9C5700");
// Fills
assertXPath(pXmlDoc, "/x:styleSheet/x:fills/x:fill", 4);
@@ -92,9 +90,9 @@ void checkCellBackgroundThemeColor(ScDocument* pDoc)
auto& rTransformations = aComplexColor.getTransformations();
CPPUNIT_ASSERT_EQUAL(size_t(2), rTransformations.size());
CPPUNIT_ASSERT_EQUAL(model::TransformationType::LumMod, rTransformations[0].meType);
- CPPUNIT_ASSERT_EQUAL(sal_Int16(2000), rTransformations[0].mnValue);
+ CPPUNIT_ASSERT_EQUAL(20, sal_Int32(std::round(rTransformations[0].mnValue / 100.0)));
CPPUNIT_ASSERT_EQUAL(model::TransformationType::LumOff, rTransformations[1].meType);
- CPPUNIT_ASSERT_EQUAL(sal_Int16(7999), rTransformations[1].mnValue);
+ CPPUNIT_ASSERT_EQUAL(80, sal_Int32(std::round(rTransformations[1].mnValue / 100.0)));
}
// A3
@@ -119,6 +117,8 @@ CPPUNIT_TEST_FIXTURE(ThemeImportExportTest, testCellBackgroundThemeColor)
{
loadFromURL(u"xlsx/Test_ThemeColor_Text_Background_Border.xlsx");
checkCellBackgroundThemeColor(getScDoc());
+ saveAndReload("Calc Office Open XML");
+ checkCellBackgroundThemeColor(getScDoc());
}
void checkCellTextThemeColor(ScDocument* pDoc)
@@ -151,9 +151,9 @@ void checkCellTextThemeColor(ScDocument* pDoc)
auto& rTransformations = aComplexColor.getTransformations();
CPPUNIT_ASSERT_EQUAL(size_t(2), rTransformations.size());
CPPUNIT_ASSERT_EQUAL(model::TransformationType::LumMod, rTransformations[0].meType);
- CPPUNIT_ASSERT_EQUAL(sal_Int16(6000), rTransformations[0].mnValue);
+ CPPUNIT_ASSERT_EQUAL(60, sal_Int32(std::round(rTransformations[0].mnValue / 100.0)));
CPPUNIT_ASSERT_EQUAL(model::TransformationType::LumOff, rTransformations[1].meType);
- CPPUNIT_ASSERT_EQUAL(sal_Int16(3999), rTransformations[1].mnValue);
+ CPPUNIT_ASSERT_EQUAL(40, sal_Int32(std::round(rTransformations[1].mnValue / 100.0)));
}
// B3
@@ -178,6 +178,8 @@ CPPUNIT_TEST_FIXTURE(ThemeImportExportTest, testCellTextThemeColor)
{
loadFromURL(u"xlsx/Test_ThemeColor_Text_Background_Border.xlsx");
checkCellTextThemeColor(getScDoc());
+ saveAndReload("Calc Office Open XML");
+ checkCellTextThemeColor(getScDoc());
}
void checkCellBorderThemeColor(ScDocument* pDoc)
diff --git a/sc/qa/unit/subsequent_export_test.cxx b/sc/qa/unit/subsequent_export_test.cxx
index e528e3fc679c..1ce8ef99c926 100644
--- a/sc/qa/unit/subsequent_export_test.cxx
+++ b/sc/qa/unit/subsequent_export_test.cxx
@@ -105,8 +105,13 @@ CPPUNIT_TEST_FIXTURE(ScExportTest, testTdf139167)
"FFFFFF00");
}
-CPPUNIT_TEST_FIXTURE(ScExportTest, testTdf113271)
+CPPUNIT_TEST_FIXTURE(ScExportTest, testFontColorWithMultipleAttributesDefined)
{
+ // Related: TDF #113271
+ // Test font color where "rgb" and "theme" attribute is defined and
+ // is imported and exported correctly. Theme should have priority,
+ // so LO is fine to ignore "rgb" at export.
+
createScDoc("xlsx/tdf113271.xlsx");
save("Calc Office Open XML");
@@ -115,10 +120,11 @@ CPPUNIT_TEST_FIXTURE(ScExportTest, testTdf113271)
assertXPath(pDoc, "/x:styleSheet/x:fonts", "count", "6");
- // Without the fix in place, this test would have failed with
- // - Expected: FF000000
- // - Actual : FFFFFFFF
- assertXPath(pDoc, "/x:styleSheet/x:fonts/x:font[1]/x:color", "rgb", "FF000000");
+ // Expect "theme" attribute to be set correctly
+ assertXPath(pDoc, "/x:styleSheet/x:fonts/x:font[1]/x:color", "theme", "1");
+ // We don't export "rgb" attribute
+ assertXPathNoAttribute(pDoc, "/x:styleSheet/x:fonts/x:font[1]/x:color", "rgb");
+ // Just making sure the checked font is the correct one
assertXPath(pDoc, "/x:styleSheet/x:fonts/x:font[1]/x:name", "val", "Calibri");
}
diff --git a/sc/source/filter/excel/xestream.cxx b/sc/source/filter/excel/xestream.cxx
index eeb42449f3c9..b91170cb1702 100644
--- a/sc/source/filter/excel/xestream.cxx
+++ b/sc/source/filter/excel/xestream.cxx
@@ -64,6 +64,7 @@
#include <oox/token/relationship.hxx>
#include <oox/export/drawingml.hxx>
#include <oox/export/utils.hxx>
+#include <oox/export/ColorExportUtils.hxx>
#include <formula/grammar.hxx>
#include <oox/ole/vbaexport.hxx>
#include <excelvbaproject.hxx>
@@ -884,15 +885,19 @@ sax_fastparser::FSHelperPtr XclXmlUtils::WriteFontData( sax_fastparser::FSHelper
pStream->singleElement(XML_vertAlign, XML_val, pVertAlign);
pStream->singleElement(XML_sz, XML_val, OString::number( rFontData.mnHeight / 20.0 )); // Twips->Pt
- if (rFontData.maComplexColor.getFinalColor() != Color( ColorAlpha, 0, 0xFF, 0xFF, 0xFF))
+ auto& rComplexColor = rFontData.maComplexColor;
+ if (rComplexColor.isValidSchemeType())
{
+ sal_Int32 nTheme = oox::convertThemeColorTypeToExcelThemeNumber(rComplexColor.getSchemeType());
+ double fTintShade = oox::convertColorTransformsToTintOrShade(rComplexColor);
pStream->singleElement(XML_color,
- // OOXTODO: XML_auto, bool
- // OOXTODO: XML_indexed, uint
- XML_rgb, XclXmlUtils::ToOString(rFontData.maComplexColor.getFinalColor())
- // OOXTODO: XML_theme, index into <clrScheme/>
- // OOXTODO: XML_tint, double
- );
+ XML_theme, OString::number(nTheme),
+ XML_tint, sax_fastparser::UseIf(OString::number(fTintShade), fTintShade != 0.0));
+ }
+ else if (rComplexColor.getFinalColor() != Color( ColorAlpha, 0, 0xFF, 0xFF, 0xFF))
+ {
+ pStream->singleElement(XML_color,
+ XML_rgb, XclXmlUtils::ToOString(rComplexColor.getFinalColor()));
}
pStream->singleElement(nFontId, XML_val, rFontData.maName);
pStream->singleElement(XML_family, XML_val, OString::number( rFontData.mnFamily ));
diff --git a/sc/source/filter/excel/xestyle.cxx b/sc/source/filter/excel/xestyle.cxx
index 652e5f77a951..87421c525fa2 100644
--- a/sc/source/filter/excel/xestyle.cxx
+++ b/sc/source/filter/excel/xestyle.cxx
@@ -52,6 +52,7 @@
#include <o3tl/safeint.hxx>
#include <oox/export/utils.hxx>
+#include <oox/export/ColorExportUtils.hxx>
#include <oox/token/tokens.hxx>
#include <oox/token/namespaces.hxx>
#include <oox/token/relationship.hxx>
@@ -1974,18 +1975,26 @@ void XclExpCellArea::SaveXml( XclExpXmlStream& rStrm ) const
if (maForeColor != COL_TRANSPARENT || maBackColor != COL_TRANSPARENT)
{
- if (maForegroundComplexColor.getType() == model::ColorType::Scheme)
+ if (maForegroundComplexColor.isValidSchemeType())
{
- rStyleSheet->singleElement(XML_fgColor, XML_theme, OString::number(sal_Int32(maForegroundComplexColor.getSchemeType())));
+ sal_Int32 nTheme = oox::convertThemeColorTypeToExcelThemeNumber(maForegroundComplexColor.getSchemeType());
+ double fTintShade = oox::convertColorTransformsToTintOrShade(maForegroundComplexColor);
+ rStyleSheet->singleElement(XML_fgColor,
+ XML_theme, OString::number(nTheme),
+ XML_tint, sax_fastparser::UseIf(OString::number(fTintShade), fTintShade != 0.0));
}
else if (maForeColor != COL_TRANSPARENT)
{
rStyleSheet->singleElement(XML_fgColor, XML_rgb, XclXmlUtils::ToOString(maForeColor));
}
- if (maBackgroundComplexColor.getType() == model::ColorType::Scheme)
+ if (maBackgroundComplexColor.isValidSchemeType())
{
- rStyleSheet->singleElement(XML_fgColor, XML_theme, OString::number(sal_Int32(maBackgroundComplexColor.getSchemeType())));
+ sal_Int32 nTheme = oox::convertThemeColorTypeToExcelThemeNumber(maBackgroundComplexColor.getSchemeType());
+ double fTintShade = oox::convertColorTransformsToTintOrShade(maBackgroundComplexColor);
+ rStyleSheet->singleElement(XML_bgColor,
+ XML_theme, OString::number(nTheme),
+ XML_tint, sax_fastparser::UseIf(OString::number(fTintShade), fTintShade != 0.0));
}
else if (maBackColor != COL_TRANSPARENT)
{
@@ -1994,9 +2003,14 @@ void XclExpCellArea::SaveXml( XclExpXmlStream& rStrm ) const
}
else
{
- if (maForegroundComplexColor.getType() == model::ColorType::Scheme)
+ if (maForegroundComplexColor.isValidSchemeType())
{
- rStyleSheet->singleElement(XML_fgColor, XML_theme, OString::number(sal_Int32(maForegroundComplexColor.getSchemeType())));
+ sal_Int32 nTheme = oox::convertThemeColorTypeToExcelThemeNumber(maForegroundComplexColor.getSchemeType());
+ double fTintShade = oox::convertColorTransformsToTintOrShade(maForegroundComplexColor);
+
+ rStyleSheet->singleElement(XML_fgColor,
+ XML_theme, OString::number(nTheme),
+ XML_tint, sax_fastparser::UseIf(OString::number(fTintShade), fTintShade != 0.0));
}
else if (mnForeColor != 0)
{
@@ -2005,7 +2019,11 @@ void XclExpCellArea::SaveXml( XclExpXmlStream& rStrm ) const
if (maBackgroundComplexColor.getType() == model::ColorType::Scheme)
{
- rStyleSheet->singleElement(XML_fgColor, XML_theme, OString::number(sal_Int32(maBackgroundComplexColor.getSchemeType())));
+ sal_Int32 nTheme = oox::convertThemeColorTypeToExcelThemeNumber(maBackgroundComplexColor.getSchemeType());
+ double fTintShade = oox::convertColorTransformsToTintOrShade(maBackgroundComplexColor);
+ rStyleSheet->singleElement(XML_bgColor,
+ XML_theme, OString::number(nTheme),
+ XML_tint, sax_fastparser::UseIf(OString::number(fTintShade), fTintShade != 0.0));
}
else if (mnBackColor != 0)
{
@@ -2037,7 +2055,13 @@ void XclExpColor::SaveXml( XclExpXmlStream& rStrm ) const
rStyleSheet->startElement(XML_fill);
rStyleSheet->startElement(XML_patternFill);
if (maComplexColor.getType() == model::ColorType::Scheme)
- rStyleSheet->singleElement(XML_bgColor, XML_theme, OString::number(sal_Int32(maComplexColor.getSchemeType())));
+ {
+ sal_Int32 nTheme = oox::convertThemeColorTypeToExcelThemeNumber(maComplexColor.getSchemeType());
+ double fTintShade = oox::convertColorTransformsToTintOrShade(maComplexColor);
+ rStyleSheet->singleElement(XML_bgColor,
+ XML_theme, OString::number(nTheme),
+ XML_tint, sax_fastparser::UseIf(OString::number(fTintShade), fTintShade != 0.0));
+ }
else
rStyleSheet->singleElement(XML_bgColor, XML_rgb, XclXmlUtils::ToOString(maColor));