include/docmodel/color/ComplexColor.hxx |   14 +++++--
 oox/source/drawingml/color.cxx          |   33 ++++++-----------
 sc/Library_scqahelper.mk                |    1 
 sc/inc/patattr.hxx                      |   13 ++++---
 sc/qa/unit/helper/qahelper.cxx          |   12 +++---
 sc/source/core/data/patattr.cxx         |   33 ++++++++++++-----
 sc/source/filter/excel/excrecds.cxx     |    2 -
 sc/source/filter/excel/xechart.cxx      |   24 ++++++-------
 sc/source/filter/excel/xecontent.cxx    |    8 ++--
 sc/source/filter/excel/xehelper.cxx     |   26 +++++++-------
 sc/source/filter/excel/xestream.cxx     |    9 +++-
 sc/source/filter/excel/xestyle.cxx      |   45 ++++++++++++------------
 sc/source/filter/excel/xichart.cxx      |   25 ++++++++-----
 sc/source/filter/excel/xistyle.cxx      |    6 +--
 sc/source/filter/excel/xlchart.cxx      |    4 +-
 sc/source/filter/excel/xlstyle.cxx      |   59 +++++++++++++++++---------------
 sc/source/filter/inc/xechart.hxx        |    9 ++--
 sc/source/filter/inc/xestyle.hxx        |    4 +-
 sc/source/filter/inc/xlchart.hxx        |    6 ++-
 sc/source/filter/inc/xlstyle.hxx        |   14 ++++---
 20 files changed, 193 insertions(+), 154 deletions(-)

New commits:
commit 7501f8928264c48c88ab6ee6b757b295b13b63d4
Author:     Tomaž Vajngerl <tomaz.vajng...@collabora.co.uk>
AuthorDate: Fri May 19 23:01:58 2023 +0900
Commit:     Tomaž Vajngerl <qui...@gmail.com>
CommitDate: Thu Jun 29 04:57:36 2023 +0200

    sc: use ComplexColor for font color (+others) in OOXML export
    
    Change-Id: I2544c7ece152323d84faafe1a544e4f89ca466d5
    Reviewed-on: https://gerrit.libreoffice.org/c/core/+/152014
    Tested-by: Jenkins
    Reviewed-by: Tomaž Vajngerl <qui...@gmail.com>

diff --git a/include/docmodel/color/ComplexColor.hxx 
b/include/docmodel/color/ComplexColor.hxx
index 19e228b2a858..4952d91ac217 100644
--- a/include/docmodel/color/ComplexColor.hxx
+++ b/include/docmodel/color/ComplexColor.hxx
@@ -133,13 +133,19 @@ public:
         meType = ColorType::CRGB;
     }
 
+    void setColor(Color const& rColor)
+    {
+        mnComponent1 = rColor.GetRed();
+        mnComponent2 = rColor.GetGreen();
+        mnComponent3 = rColor.GetBlue();
+        maFinalColor = rColor;
+        meType = ColorType::RGB;
+    }
+
     void setRGB(sal_Int32 nRGB)
     {
         ::Color aColor(ColorTransparency, nRGB);
-        mnComponent1 = aColor.GetRed();
-        mnComponent2 = aColor.GetGreen();
-        mnComponent3 = aColor.GetBlue();
-        meType = ColorType::RGB;
+        setColor(aColor);
     }
 
     void setHSL(sal_Int32 nH, sal_Int32 nS, sal_Int32 nL)
diff --git a/sc/Library_scqahelper.mk b/sc/Library_scqahelper.mk
index a4a6814203bd..6e8c9eca7327 100644
--- a/sc/Library_scqahelper.mk
+++ b/sc/Library_scqahelper.mk
@@ -45,6 +45,7 @@ $(eval $(call gb_Library_use_libraries,scqahelper,\
        comphelper \
        cppu \
        cppuhelper \
+       docmodel \
        editeng \
        for \
        sal \
diff --git a/sc/inc/patattr.hxx b/sc/inc/patattr.hxx
index 1df3a31d6fac..cc37c335cfc0 100644
--- a/sc/inc/patattr.hxx
+++ b/sc/inc/patattr.hxx
@@ -30,6 +30,7 @@
 #include "fonthelper.hxx"
 
 namespace vcl { class Font; }
+namespace model { class ComplexColor; }
 class OutputDevice;
 class Fraction;
 class ScStyleSheet;
@@ -107,19 +108,23 @@ public:
                                         SvtScriptType nScript = 
SvtScriptType::NONE, const Color* pBackConfigColor = nullptr,
                                         const Color* pTextConfigColor = 
nullptr);
 
-    static void fillColor(Color& rColor, const SfxItemSet& rItemSet, 
ScAutoFontColorMode eAutoMode, const SfxItemSet* pCondSet = nullptr,
-                            const Color* pBackConfigColor = nullptr, const 
Color* pTextConfigColor = nullptr);
+    static void fillColor(model::ComplexColor& rComplexColor,
+                            const SfxItemSet& rItemSet,
+                            ScAutoFontColorMode eAutoMode,
+                            const SfxItemSet* pCondSet = nullptr,
+                            const Color* pBackConfigColor = nullptr,
+                            const Color* pTextConfigColor = nullptr);
 
 
     static ScDxfFont        GetDxfFont(const SfxItemSet& rSet, SvtScriptType 
nScript);
 
-    void fillColor(Color& rColor,
+    void fillColor(model::ComplexColor& rComplexColor,
                     ScAutoFontColorMode eAutoMode,
                     const SfxItemSet* pCondSet = nullptr,
                     const Color* pBackConfigColor = nullptr,
                     const Color* pTextConfigColor = nullptr) const
     {
-        fillColor(rColor, GetItemSet(), eAutoMode, pCondSet, pBackConfigColor, 
pTextConfigColor);
+        fillColor(rComplexColor, GetItemSet(), eAutoMode, pCondSet, 
pBackConfigColor, pTextConfigColor);
     }
 
     void fillFontOnly(vcl::Font& rFont,
diff --git a/sc/qa/unit/helper/qahelper.cxx b/sc/qa/unit/helper/qahelper.cxx
index eff2c62d9aeb..23ddf5271fc4 100644
--- a/sc/qa/unit/helper/qahelper.cxx
+++ b/sc/qa/unit/helper/qahelper.cxx
@@ -177,12 +177,12 @@ void ScModelTestBase::testFormats(ScDocument* 
pDoc,std::u16string_view sFormat)
     //test Sheet2
     const ScPatternAttr* pPattern = pDoc->GetPattern(0, 0, 1);
     vcl::Font aFont;
-    Color aColor;
+    model::ComplexColor aComplexColor;
 
     pPattern->fillFontOnly(aFont);
-    pPattern->fillColor(aColor, ScAutoFontColorMode::Raw);
+    pPattern->fillColor(aComplexColor, ScAutoFontColorMode::Raw);
     CPPUNIT_ASSERT_EQUAL_MESSAGE("font size should be 10", tools::Long(200), 
aFont.GetFontSize().getHeight());
-    CPPUNIT_ASSERT_EQUAL_MESSAGE("font color should be black", COL_AUTO, 
aColor);
+    CPPUNIT_ASSERT_EQUAL_MESSAGE("font color should be black", COL_AUTO, 
aComplexColor.getFinalColor());
     pPattern = pDoc->GetPattern(0,1,1);
     pPattern->fillFontOnly(aFont);
     CPPUNIT_ASSERT_EQUAL_MESSAGE("font size should be 12", tools::Long(240), 
aFont.GetFontSize().getHeight());
@@ -194,8 +194,8 @@ void ScModelTestBase::testFormats(ScDocument* 
pDoc,std::u16string_view sFormat)
     CPPUNIT_ASSERT_EQUAL_MESSAGE("font should be bold", WEIGHT_BOLD, 
aFont.GetWeight());
     pPattern = pDoc->GetPattern(1,0,1);
     pPattern->fillFontOnly(aFont);
-    pPattern->fillColor(aColor, ScAutoFontColorMode::Raw);
-    CPPUNIT_ASSERT_EQUAL_MESSAGE("font should be blue", COL_BLUE, aColor);
+    pPattern->fillColor(aComplexColor, ScAutoFontColorMode::Raw);
+    CPPUNIT_ASSERT_EQUAL_MESSAGE("font should be blue", COL_BLUE, 
aComplexColor.getFinalColor());
     pPattern = pDoc->GetPattern(1,1,1);
     pPattern->fillFontOnly(aFont);
     CPPUNIT_ASSERT_EQUAL_MESSAGE("font should be striked out with a single 
line", STRIKEOUT_SINGLE, aFont.GetStrikeout());
@@ -227,7 +227,7 @@ void ScModelTestBase::testFormats(ScDocument* 
pDoc,std::u16string_view sFormat)
         CPPUNIT_ASSERT_EQUAL( aKnownGoodStr, aTestStr );
     }
     pPattern = pDoc->GetPattern(1,4,1);
-    aColor = pPattern->GetItem(ATTR_BACKGROUND).GetColor();
+    Color aColor = pPattern->GetItem(ATTR_BACKGROUND).GetColor();
     CPPUNIT_ASSERT_EQUAL_MESSAGE("background color should be green", 
COL_LIGHTGREEN, aColor);
     pPattern = pDoc->GetPattern(2,0,1);
     SvxCellHorJustify eHorJustify = 
pPattern->GetItem(ATTR_HOR_JUSTIFY).GetValue();
diff --git a/sc/source/core/data/patattr.cxx b/sc/source/core/data/patattr.cxx
index 1bb2e50daf4d..d3a9de543d3a 100644
--- a/sc/source/core/data/patattr.cxx
+++ b/sc/source/core/data/patattr.cxx
@@ -253,14 +253,14 @@ void ScPatternAttr::fillFont(
         const SfxItemSet* pCondSet, SvtScriptType nScript,
         const Color* pBackConfigColor, const Color* pTextConfigColor)
 {
-    Color aColor;
+    model::ComplexColor aComplexColor;
 
     //  determine effective font color
     ScPatternAttr::fillFontOnly(rFont, rItemSet, pOutDev, pScale, pCondSet, 
nScript);
-    ScPatternAttr::fillColor(aColor, rItemSet, eAutoMode, pCondSet, 
pBackConfigColor, pTextConfigColor);
+    ScPatternAttr::fillColor(aComplexColor, rItemSet, eAutoMode, pCondSet, 
pBackConfigColor, pTextConfigColor);
 
     //  set font effects
-    rFont.SetColor(aColor);
+    rFont.SetColor(aComplexColor.getFinalColor());
 }
 
 void ScPatternAttr::fillFontOnly(
@@ -432,9 +432,11 @@ void ScPatternAttr::fillFontOnly(
     rFont.SetTransparent( true );
 }
 
-void ScPatternAttr::fillColor(Color& rColor, const SfxItemSet& rItemSet, 
ScAutoFontColorMode eAutoMode, const SfxItemSet* pCondSet, const Color* 
pBackConfigColor, const Color* pTextConfigColor)
+void ScPatternAttr::fillColor(model::ComplexColor& rComplexColor, const 
SfxItemSet& rItemSet, ScAutoFontColorMode eAutoMode, const SfxItemSet* 
pCondSet, const Color* pBackConfigColor, const Color* pTextConfigColor)
 {
-    Color aColor = COL_TRANSPARENT;
+    model::ComplexColor aComplexColor;
+
+    Color aColor;
 
     SvxColorItem const* pColorItem = nullptr;
 
@@ -445,15 +447,24 @@ void ScPatternAttr::fillColor(Color& rColor, const 
SfxItemSet& rItemSet, ScAutoF
         pColorItem = &rItemSet.Get(ATTR_FONT_COLOR);
 
     if (pColorItem)
+    {
+        aComplexColor = pColorItem->getComplexColor();
         aColor = pColorItem->GetValue();
+    }
 
+    if (aComplexColor.getType() == model::ColorType::Unused)
+    {
+        aComplexColor.setColor(aColor);
+    }
 
     if ((aColor == COL_AUTO && eAutoMode != ScAutoFontColorMode::Raw)
         || eAutoMode == ScAutoFontColorMode::IgnoreFont
         || eAutoMode == ScAutoFontColorMode::IgnoreAll)
     {
-        if ( eAutoMode == ScAutoFontColorMode::Black )
+        if (eAutoMode == ScAutoFontColorMode::Black)
+        {
             aColor = COL_BLACK;
+        }
         else
         {
             //  get background color from conditional or own set
@@ -503,9 +514,11 @@ void ScPatternAttr::fillColor(Color& rColor, const 
SfxItemSet& rItemSet, ScAutoF
 
             //  get system text color for comparison
             Color aSysTextColor;
-            if ( eAutoMode == ScAutoFontColorMode::Print )
+            if (eAutoMode == ScAutoFontColorMode::Print)
+            {
                 aSysTextColor = COL_BLACK;
-            else if ( pTextConfigColor )
+            }
+            else if (pTextConfigColor)
             {
                 // pTextConfigColor can be used to avoid repeated lookup of 
the configured color
                 aSysTextColor = *pTextConfigColor;
@@ -533,8 +546,8 @@ void ScPatternAttr::fillColor(Color& rColor, const 
SfxItemSet& rItemSet, ScAutoF
             }
         }
     }
-
-    rColor = aColor;
+    aComplexColor.setFinalColor(aColor);
+    rComplexColor = aComplexColor;
 }
 
 ScDxfFont ScPatternAttr::GetDxfFont(const SfxItemSet& rItemSet, SvtScriptType 
nScript)
diff --git a/sc/source/filter/excel/excrecds.cxx 
b/sc/source/filter/excel/excrecds.cxx
index 3c4aa0571fc6..86afa5a6c163 100644
--- a/sc/source/filter/excel/excrecds.cxx
+++ b/sc/source/filter/excel/excrecds.cxx
@@ -801,7 +801,7 @@ void XclExpAutofilter::AddColorEntry(const ScQueryEntry& 
rEntry)
         // Ensure that selected color(s) will be added to dxf: selection can 
be not in list
         // of already added to dfx colors taken from filter range
         if (GetDxfs().GetDxfByColor(rItem.maColor) == -1)
-            GetDxfs().AddColor(rItem.maColor);
+            GetDxfs().addColor(rItem.maColor);
     }
 }
 
diff --git a/sc/source/filter/excel/xechart.cxx 
b/sc/source/filter/excel/xechart.cxx
index 5b51f8754f93..9c7eb9673c9f 100644
--- a/sc/source/filter/excel/xechart.cxx
+++ b/sc/source/filter/excel/xechart.cxx
@@ -1130,8 +1130,8 @@ void XclExpChFontBase::ConvertFontBase( const 
XclExpChRoot& rRoot, sal_uInt16 nF
 {
     if( const XclExpFont* pFont = rRoot.GetFontBuffer().GetFont( nFontIdx ) )
     {
-        XclExpChFontRef xFont = new XclExpChFont( nFontIdx );
-        SetFont( xFont, pFont->GetFontData().maColor, pFont->GetFontColorId() 
);
+        XclExpChFontRef xFont = new XclExpChFont(nFontIdx);
+        SetFont(xFont, pFont->GetFontData().maComplexColor, 
pFont->GetFontColorId());
     }
 }
 
@@ -1152,11 +1152,11 @@ XclExpChText::XclExpChText( const XclExpChRoot& rRoot ) 
:
 {
 }
 
-void XclExpChText::SetFont( XclExpChFontRef xFont, const Color& rColor, 
sal_uInt32 nColorId )
+void XclExpChText::SetFont( XclExpChFontRef xFont, model::ComplexColor const& 
rComplexColor, sal_uInt32 nColorId )
 {
     mxFont = xFont;
-    maData.maTextColor = rColor;
-    ::set_flag( maData.mnFlags, EXC_CHTEXT_AUTOCOLOR, rColor == COL_AUTO );
+    maData.maTextComplexColor = rComplexColor;
+    ::set_flag(maData.mnFlags, EXC_CHTEXT_AUTOCOLOR, 
rComplexColor.getFinalColor() == COL_AUTO);
     mnTextColorId = nColorId;
 }
 
@@ -1386,7 +1386,7 @@ void XclExpChText::WriteBody( XclExpStream& rStrm )
     rStrm   << maData.mnHAlign
             << maData.mnVAlign
             << maData.mnBackMode
-            << maData.maTextColor
+            << maData.maTextComplexColor.getFinalColor()
             << maData.maRect
             << maData.mnFlags;
 
@@ -2845,10 +2845,10 @@ void XclExpChTick::Convert( const ScfPropertySet& 
rPropSet, const XclChExtTypeIn
     }
 }
 
-void XclExpChTick::SetFontColor( const Color& rColor, sal_uInt32 nColorId )
+void XclExpChTick::SetFontColor(model::ComplexColor const& rComplexColor, 
sal_uInt32 nColorId )
 {
-    maData.maTextColor = rColor;
-    ::set_flag( maData.mnFlags, EXC_CHTICK_AUTOCOLOR, rColor == COL_AUTO );
+    maData.maTextComplexColor = rComplexColor;
+    ::set_flag(maData.mnFlags, EXC_CHTICK_AUTOCOLOR, 
rComplexColor.getFinalColor() == COL_AUTO);
     mnTextColorId = nColorId;
 }
 
@@ -2866,7 +2866,7 @@ void XclExpChTick::WriteBody( XclExpStream& rStrm )
             << maData.mnLabelPos
             << maData.mnBackMode;
     rStrm.WriteZeroBytes( 16 );
-    rStrm   << maData.maTextColor
+    rStrm   << maData.maTextComplexColor.getFinalColor()
             << maData.mnFlags;
     if( GetBiff() == EXC_BIFF8 )
         rStrm << GetPalette().GetColorIndex( mnTextColorId ) << 
maData.mnRotation;
@@ -2922,11 +2922,11 @@ XclExpChAxis::XclExpChAxis( const XclExpChRoot& rRoot, 
sal_uInt16 nAxisType ) :
     maData.mnType = nAxisType;
 }
 
-void XclExpChAxis::SetFont( XclExpChFontRef xFont, const Color& rColor, 
sal_uInt32 nColorId )
+void XclExpChAxis::SetFont( XclExpChFontRef xFont, model::ComplexColor const& 
rComplexColor, sal_uInt32 nColorId )
 {
     mxFont = xFont;
     if( mxTick )
-        mxTick->SetFontColor( rColor, nColorId );
+        mxTick->SetFontColor(rComplexColor, nColorId);
 }
 
 void XclExpChAxis::SetRotation( sal_uInt16 nRotation )
diff --git a/sc/source/filter/excel/xecontent.cxx 
b/sc/source/filter/excel/xecontent.cxx
index 47114264a50e..b1329e56f535 100644
--- a/sc/source/filter/excel/xecontent.cxx
+++ b/sc/source/filter/excel/xecontent.cxx
@@ -668,11 +668,11 @@ XclExpCFImpl::XclExpCFImpl( const XclExpRoot& rRoot, 
const ScCondFormatEntry& rF
         if( mbFontUsed )
         {
             vcl::Font aFont;
-            ::Color aColor;
+            model::ComplexColor aComplexColor;
             ScPatternAttr::fillFontOnly(aFont, rItemSet);
-            ScPatternAttr::fillColor(aColor, rItemSet, 
ScAutoFontColorMode::Raw);
-            maFontData.FillFromVclFont(aFont, aColor);
-            mnFontColorId = GetPalette().InsertColor(maFontData.maColor, 
EXC_COLOR_CELLTEXT);
+            ScPatternAttr::fillColor(aComplexColor, rItemSet, 
ScAutoFontColorMode::Raw);
+            maFontData.FillFromVclFont(aFont, aComplexColor);
+            mnFontColorId = 
GetPalette().InsertColor(maFontData.maComplexColor.getFinalColor(), 
EXC_COLOR_CELLTEXT);
         }
 
         // border
diff --git a/sc/source/filter/excel/xehelper.cxx 
b/sc/source/filter/excel/xehelper.cxx
index e9390f8ce6f5..2bae772b0ebd 100644
--- a/sc/source/filter/excel/xehelper.cxx
+++ b/sc/source/filter/excel/xehelper.cxx
@@ -389,8 +389,8 @@ XclExpStringRef lclCreateFormattedString(
 
         // construct font from current text portion
         SvxFont aFont(XclExpFontHelper::GetFontFromItemSet(rRoot, rItemSet, 
nScript));
-        Color aColor;
-        ScPatternAttr::fillColor(aColor, rItemSet, ScAutoFontColorMode::Raw);
+        model::ComplexColor aComplexColor;
+        ScPatternAttr::fillColor(aComplexColor, rItemSet, 
ScAutoFontColorMode::Raw);
 
         // Excel start position of this portion
         sal_Int32 nXclPortionStart = xString->Len();
@@ -399,7 +399,7 @@ XclExpStringRef lclCreateFormattedString(
         if( nXclPortionStart < xString->Len() )
         {
             // insert font into buffer
-            sal_uInt16 nFontIdx = rFontBuffer.Insert(aFont, aColor, 
EXC_COLOR_CELLTEXT);
+            sal_uInt16 nFontIdx = rFontBuffer.Insert(aFont, aComplexColor, 
EXC_COLOR_CELLTEXT);
             // insert font index into format run vector
             xString->AppendFormat( nXclPortionStart, nFontIdx );
         }
@@ -503,8 +503,8 @@ XclExpStringRef lclCreateFormattedString(
                 if( nScript == ApiScriptType::WEAK )
                     nScript = nLastScript;
                 SvxFont aFont( XclExpFontHelper::GetFontFromItemSet(rRoot, 
aItemSet, nScript));
-                Color aColor;
-                ScPatternAttr::fillColor(aColor, aItemSet, 
ScAutoFontColorMode::Raw);
+                model::ComplexColor aComplexColor;
+                ScPatternAttr::fillColor(aComplexColor, aItemSet, 
ScAutoFontColorMode::Raw);
 
                 nLastScript = nScript;
 
@@ -512,10 +512,10 @@ XclExpStringRef lclCreateFormattedString(
                 aFont.SetEscapement( nEsc );
                 // modify automatic font color for hyperlinks
                 if (bIsHyperlink && aItemSet.Get(ATTR_FONT_COLOR).GetValue() 
== COL_AUTO)
-                    aColor = COL_LIGHTBLUE;
+                    aComplexColor.setFinalColor(COL_LIGHTBLUE);
 
                 // insert font into buffer
-                sal_uInt16 nFontIdx = rFontBuffer.Insert(aFont, aColor, 
EXC_COLOR_CELLTEXT);
+                sal_uInt16 nFontIdx = rFontBuffer.Insert(aFont, aComplexColor, 
EXC_COLOR_CELLTEXT);
                 // insert font index into format run vector
                 xString->AppendFormat( nXclPortionStart, nFontIdx );
             }
@@ -731,12 +731,12 @@ void XclExpHFConverter::AppendPortion( const 
EditTextObject* pTextObj, sal_Unico
 // --- font attributes ---
 
                 vcl::Font aFont;
-                Color aColor;
+                model::ComplexColor aComplexColor;
                 aItemSet.ClearItem();
                 SfxItemSet aEditSet( mrEE.GetAttribs( aSel ) );
                 ScPatternAttr::GetFromEditItemSet( aItemSet, aEditSet );
                 ScPatternAttr::fillFontOnly(aFont, aItemSet);
-                ScPatternAttr::fillColor(aColor, aItemSet, 
ScAutoFontColorMode::Raw);
+                ScPatternAttr::fillColor(aComplexColor, aItemSet, 
ScAutoFontColorMode::Raw);
 
                 // font name and style
                 aNewData.maName = XclTools::GetXclFontName( 
aFont.GetFamilyName() );
@@ -789,10 +789,12 @@ void XclExpHFConverter::AppendPortion( const 
EditTextObject* pTextObj, sal_Unico
                 }
 
                 // font color
-                aNewData.maColor = aColor;
-                if ( !aFontData.maColor.IsRGBEqual( aNewData.maColor ) )
+                aNewData.maComplexColor = aComplexColor;
+                Color aNewColor = aNewData.maComplexColor.getFinalColor();
+
+                if 
(!aFontData.maComplexColor.getFinalColor().IsRGBEqual(aNewColor))
                 {
-                    aParaText.append("&K" + aNewData.maColor.AsRGBHexString());
+                    aParaText.append("&K" + aNewColor.AsRGBHexString());
                 }
 
                 // strikeout
diff --git a/sc/source/filter/excel/xestream.cxx 
b/sc/source/filter/excel/xestream.cxx
index b8fd323aa400..eeb42449f3c9 100644
--- a/sc/source/filter/excel/xestream.cxx
+++ b/sc/source/filter/excel/xestream.cxx
@@ -883,14 +883,17 @@ sax_fastparser::FSHelperPtr XclXmlUtils::WriteFontData( 
sax_fastparser::FSHelper
     if (bHaveVertAlign)
         pStream->singleElement(XML_vertAlign, XML_val, pVertAlign);
     pStream->singleElement(XML_sz, XML_val, OString::number( 
rFontData.mnHeight / 20.0 )); // Twips->Pt
-    if( rFontData.maColor != Color( ColorAlpha, 0, 0xFF, 0xFF, 0xFF ) )
-        pStream->singleElement( XML_color,
+
+    if (rFontData.maComplexColor.getFinalColor() != Color( ColorAlpha, 0, 
0xFF, 0xFF, 0xFF))
+    {
+        pStream->singleElement(XML_color,
                 // OOXTODO: XML_auto,       bool
                 // OOXTODO: XML_indexed,    uint
-                XML_rgb, XclXmlUtils::ToOString(rFontData.maColor)
+                XML_rgb, 
XclXmlUtils::ToOString(rFontData.maComplexColor.getFinalColor())
                 // OOXTODO: XML_theme,      index into <clrScheme/>
                 // OOXTODO: XML_tint,       double
         );
+    }
     pStream->singleElement(nFontId, XML_val, rFontData.maName);
     pStream->singleElement(XML_family, XML_val, OString::number(  
rFontData.mnFamily ));
     if (rFontData.mnCharSet != 0)
diff --git a/sc/source/filter/excel/xestyle.cxx 
b/sc/source/filter/excel/xestyle.cxx
index 43b9ac5e23c2..652e5f77a951 100644
--- a/sc/source/filter/excel/xestyle.cxx
+++ b/sc/source/filter/excel/xestyle.cxx
@@ -938,21 +938,22 @@ bool XclExpFontHelper::CheckItems( const XclExpRoot& 
rRoot, const SfxItemSet& rI
 
 namespace {
 
-sal_uInt32 lclCalcHash( const XclFontData& rFontData )
-{
-    sal_uInt32 nHash = rFontData.maName.getLength();
-    nHash += sal_uInt32(rFontData.maColor) * 2;
-    nHash += rFontData.mnWeight * 3;
-    nHash += rFontData.mnCharSet * 5;
-    nHash += rFontData.mnFamily * 7;
-    nHash += rFontData.mnHeight * 11;
-    nHash += rFontData.mnUnderline * 13;
-    nHash += rFontData.mnEscapem * 17;
-    if( rFontData.mbItalic ) nHash += 19;
-    if( rFontData.mbStrikeout ) nHash += 23;
-    if( rFontData.mbOutline ) nHash += 29;
-    if( rFontData.mbShadow ) nHash += 31;
-    return nHash;
+std::size_t lclCalcHash( const XclFontData& rFontData )
+{
+    std::size_t seed = 0;
+    o3tl::hash_combine(seed, rFontData.maName);
+    o3tl::hash_combine(seed, rFontData.maComplexColor);
+    o3tl::hash_combine(seed, rFontData.mnWeight);
+    o3tl::hash_combine(seed, rFontData.mnCharSet);
+    o3tl::hash_combine(seed, rFontData.mnFamily);
+    o3tl::hash_combine(seed, rFontData.mnHeight);
+    o3tl::hash_combine(seed, rFontData.mnUnderline);
+    o3tl::hash_combine(seed, rFontData.mnEscapem);
+    o3tl::hash_combine(seed, rFontData.mbItalic);
+    o3tl::hash_combine(seed, rFontData.mbStrikeout);
+    o3tl::hash_combine(seed, rFontData.mbOutline);
+    o3tl::hash_combine(seed, rFontData.mbShadow);
+    return seed;
 }
 
 } // namespace
@@ -964,7 +965,7 @@ XclExpFont::XclExpFont( const XclExpRoot& rRoot,
     maData( rFontData )
 {
     // insert font color into palette
-    mnColorId = rRoot.GetPalette().InsertColor( rFontData.maColor, eColorType, 
EXC_COLOR_FONTAUTO );
+    mnColorId = 
rRoot.GetPalette().InsertColor(rFontData.maComplexColor.getFinalColor(), 
eColorType, EXC_COLOR_FONTAUTO);
     // hash value for faster comparison
     mnHash = lclCalcHash( maData );
     // record size
@@ -1222,18 +1223,18 @@ sal_uInt16 XclExpFontBuffer::Insert(
     return static_cast< sal_uInt16 >( nPos );
 }
 
-sal_uInt16 XclExpFontBuffer::Insert(const SvxFont& rFont, Color const& rColor, 
XclExpColorType eColorType )
+sal_uInt16 XclExpFontBuffer::Insert(const SvxFont& rFont, model::ComplexColor 
const& rComplexColor, XclExpColorType eColorType )
 {
-    return Insert(XclFontData(rFont, rColor), eColorType);
+    return Insert(XclFontData(rFont, rComplexColor), eColorType);
 }
 
 sal_uInt16 XclExpFontBuffer::Insert(const SfxItemSet& rItemSet, sal_Int16 
nScript, XclExpColorType eColorType, bool bAppFont )
 {
     // #i17050# script type now provided by caller
     vcl::Font aFont = XclExpFontHelper::GetFontFromItemSet(GetRoot(), 
rItemSet, nScript);
-    Color aColor;
-    ScPatternAttr::fillColor(aColor, rItemSet, ScAutoFontColorMode::Raw);
-    return Insert(XclFontData(aFont, aColor), eColorType, bAppFont );
+    model::ComplexColor aComplexColor;
+    ScPatternAttr::fillColor(aComplexColor, rItemSet, 
ScAutoFontColorMode::Raw);
+    return Insert(XclFontData(aFont, aComplexColor), eColorType, bAppFont );
 }
 
 void XclExpFontBuffer::Save( XclExpStream& rStrm )
@@ -3208,7 +3209,7 @@ sal_Int32 XclExpDxfs::GetDxfByColor(Color aColor) const
     return -1;
 }
 
-void XclExpDxfs::AddColor(Color aColor)
+void XclExpDxfs::addColor(Color aColor)
 {
     maColorToDxfId.emplace(aColor, maDxf.size());
 
diff --git a/sc/source/filter/excel/xichart.cxx 
b/sc/source/filter/excel/xichart.cxx
index 4a30dcd25323..a52bb103fbb6 100644
--- a/sc/source/filter/excel/xichart.cxx
+++ b/sc/source/filter/excel/xichart.cxx
@@ -949,14 +949,19 @@ void XclImpChText::ReadHeaderRecord( XclImpStream& rStrm )
     maData.mnHAlign = rStrm.ReaduInt8();
     maData.mnVAlign = rStrm.ReaduInt8();
     maData.mnBackMode = rStrm.ReaduInt16();
-    rStrm   >> maData.maTextColor
-            >> maData.maRect;
+
+    Color aColor;
+    rStrm >> aColor;
+    maData.maTextComplexColor.setColor(aColor);
+
+    rStrm  >> maData.maRect;
     maData.mnFlags = rStrm.ReaduInt16();
 
     if( GetBiff() == EXC_BIFF8 )
     {
         // BIFF8: index into palette used instead of RGB data
-        maData.maTextColor = GetPalette().GetColor( rStrm.ReaduInt16() );
+        aColor = GetPalette().GetColor(rStrm.ReaduInt16());
+        maData.maTextComplexColor.setColor(aColor);
         // placement and rotation
         maData.mnFlags2 = rStrm.ReaduInt16();
         maData.mnRotation = rStrm.ReaduInt16();
@@ -1015,7 +1020,7 @@ sal_uInt16 XclImpChText::GetFontIndex() const
 
 Color XclImpChText::GetFontColor() const
 {
-    return ::get_flag( maData.mnFlags, EXC_CHTEXT_AUTOCOLOR ) ? 
GetFontAutoColor() : maData.maTextColor;
+    return ::get_flag(maData.mnFlags, EXC_CHTEXT_AUTOCOLOR) ? 
GetFontAutoColor() : maData.maTextComplexColor.getFinalColor();
 }
 
 sal_uInt16 XclImpChText::GetRotation() const
@@ -1042,8 +1047,8 @@ void XclImpChText::UpdateText( const XclImpChText* 
pParentText )
     {
         mxFont = pParentText->mxFont;
         // text color is taken from CHTEXT record, not from font in CHFONT
-        ::set_flag( maData.mnFlags, EXC_CHTEXT_AUTOCOLOR, ::get_flag( 
pParentText->maData.mnFlags, EXC_CHTEXT_AUTOCOLOR ) );
-        maData.maTextColor = pParentText->maData.maTextColor;
+        ::set_flag(maData.mnFlags, EXC_CHTEXT_AUTOCOLOR, 
::get_flag(pParentText->maData.mnFlags, EXC_CHTEXT_AUTOCOLOR));
+        maData.maTextComplexColor = pParentText->maData.maTextComplexColor;
     }
 }
 
@@ -3193,13 +3198,15 @@ void XclImpChTick::ReadChTick( XclImpStream& rStrm )
     maData.mnLabelPos = rStrm.ReaduInt8();
     maData.mnBackMode = rStrm.ReaduInt8();
     rStrm.Ignore( 16 );
-    rStrm >> maData.maTextColor;
+    Color aColor;
+    rStrm >> aColor;
+    maData.maTextComplexColor.setColor(aColor);
     maData.mnFlags = rStrm.ReaduInt16();
 
     if( GetBiff() == EXC_BIFF8 )
     {
         // BIFF8: index into palette used instead of RGB data
-        maData.maTextColor = GetPalette().GetColor( rStrm.ReaduInt16() );
+        
maData.maTextComplexColor.setColor(GetPalette().GetColor(rStrm.ReaduInt16()));
         // rotation
         maData.mnRotation = rStrm.ReaduInt16();
     }
@@ -3213,7 +3220,7 @@ void XclImpChTick::ReadChTick( XclImpStream& rStrm )
 
 Color XclImpChTick::GetFontColor() const
 {
-    return ::get_flag( maData.mnFlags, EXC_CHTICK_AUTOCOLOR ) ? 
GetFontAutoColor() : maData.maTextColor;
+    return ::get_flag(maData.mnFlags, EXC_CHTICK_AUTOCOLOR) ? 
GetFontAutoColor() : maData.maTextComplexColor.getFinalColor();
 }
 
 sal_uInt16 XclImpChTick::GetRotation() const
diff --git a/sc/source/filter/excel/xistyle.cxx 
b/sc/source/filter/excel/xistyle.cxx
index 7361c7ee612d..0d417deb4886 100644
--- a/sc/source/filter/excel/xistyle.cxx
+++ b/sc/source/filter/excel/xistyle.cxx
@@ -309,7 +309,7 @@ void XclImpFont::ReadCFFontBlock( XclImpStream& rStrm )
     if( (mbUnderlUsed = !::get_flag( nFontFlags3, EXC_CF_FONT_UNDERL ) && 
(nUnderl <= 0x7F)) )
         maData.mnUnderline = nUnderl;
     if( (mbColorUsed = (nColor <= 0x7FFF)) )
-        maData.maColor = GetPalette().GetColor( static_cast< sal_uInt16 >( 
nColor ) );
+        
maData.maComplexColor.setColor(GetPalette().GetColor(sal_uInt16(nColor)));
     if( (mbStrikeUsed = !::get_flag( nFontFlags1, EXC_CF_FONT_STRIKEOUT )) )
         maData.mbStrikeout = ::get_flag( nStyle, EXC_CF_FONT_STRIKEOUT );
 }
@@ -368,7 +368,7 @@ void XclImpFont::FillToItemSet( SfxItemSet& rItemSet, 
XclFontItemType eType, boo
 
 // Font color - pass AUTO_COL to item
     if( mbColorUsed )
-        PUTITEM( SvxColorItem( maData.maColor, ATTR_FONT_COLOR  ), 
ATTR_FONT_COLOR, EE_CHAR_COLOR );
+        PUTITEM(SvxColorItem(maData.maComplexColor.getFinalColor(), 
maData.maComplexColor, ATTR_FONT_COLOR ), ATTR_FONT_COLOR, EE_CHAR_COLOR);
 
 // Font weight (for all script types)
     if( mbWeightUsed )
@@ -455,7 +455,7 @@ void XclImpFont::ReadFontData5( XclImpStream& rStrm )
 
 void XclImpFont::ReadFontColor( XclImpStream& rStrm )
 {
-    maData.maColor = GetPalette().GetColor( rStrm.ReaduInt16() );
+    maData.maComplexColor.setColor(GetPalette().GetColor(rStrm.ReaduInt16()));
 }
 
 void XclImpFont::ReadFontName2( XclImpStream& rStrm )
diff --git a/sc/source/filter/excel/xlchart.cxx 
b/sc/source/filter/excel/xlchart.cxx
index 92c4899a0c60..011d4578ff6f 100644
--- a/sc/source/filter/excel/xlchart.cxx
+++ b/sc/source/filter/excel/xlchart.cxx
@@ -153,7 +153,6 @@ XclChFrLabelProps::XclChFrLabelProps() :
 }
 
 XclChText::XclChText() :
-    maTextColor( COL_BLACK ),
     mnHAlign( EXC_CHTEXT_ALIGN_CENTER ),
     mnVAlign( EXC_CHTEXT_ALIGN_CENTER ),
     mnBackMode( EXC_CHTEXT_TRANSPARENT ),
@@ -161,6 +160,7 @@ XclChText::XclChText() :
     mnFlags2( EXC_CHTEXT_POS_DEFAULT ),
     mnRotation( EXC_ROT_NONE )
 {
+    maTextComplexColor.setColor(COL_BLACK);
 }
 
 // Data series ================================================================
@@ -303,7 +303,6 @@ XclChValueRange::XclChValueRange() :
 }
 
 XclChTick::XclChTick() :
-    maTextColor( COL_BLACK ),
     mnMajor( EXC_CHTICK_INSIDE | EXC_CHTICK_OUTSIDE ),
     mnMinor( 0 ),
     mnLabelPos( EXC_CHTICK_NEXT ),
@@ -311,6 +310,7 @@ XclChTick::XclChTick() :
     mnFlags( EXC_CHTICK_AUTOCOLOR | EXC_CHTICK_AUTOROT ),
     mnRotation( EXC_ROT_NONE )
 {
+    maTextComplexColor.setColor(COL_BLACK);
 }
 
 XclChAxis::XclChAxis() :
diff --git a/sc/source/filter/excel/xlstyle.cxx 
b/sc/source/filter/excel/xlstyle.cxx
index f42d30edc574..5c494a7e60da 100644
--- a/sc/source/filter/excel/xlstyle.cxx
+++ b/sc/source/filter/excel/xlstyle.cxx
@@ -174,22 +174,22 @@ XclFontData::XclFontData()
     Clear();
 }
 
-XclFontData::XclFontData(const vcl::Font& rFont, Color const& rColor)
+XclFontData::XclFontData(const vcl::Font& rFont, model::ComplexColor const& 
rComplexColor)
 {
     Clear();
-    FillFromVclFont(rFont, rColor);
+    FillFromVclFont(rFont, rComplexColor);
 }
 
-XclFontData::XclFontData(const SvxFont& rFont, Color const& rColor)
+XclFontData::XclFontData(const SvxFont& rFont, model::ComplexColor const& 
rComplexColor)
 {
-    FillFromSvxFont(rFont, rColor);
+    FillFromSvxFont(rFont, rComplexColor);
 }
 
 void XclFontData::Clear()
 {
     maName.clear();
     maStyle.clear();
-    maColor = COL_AUTO;
+    maComplexColor.setColor(COL_AUTO);
     mnHeight = 0;
     mnWeight = EXC_FONTWGHT_DONTKNOW;
     mnEscapem = EXC_FONTESC_NONE;
@@ -199,11 +199,10 @@ void XclFontData::Clear()
     mbItalic = mbStrikeout = mbOutline = mbShadow = false;
 }
 
-void XclFontData::FillFromVclFont(const vcl::Font& rFont, Color const& rColor)
+void XclFontData::FillFromVclFont(const vcl::Font& rFont, model::ComplexColor 
const& rComplexColor)
 {
     maName = XclTools::GetXclFontName( rFont.GetFamilyName() );   // 
substitute with MS fonts
     maStyle.clear();
-    maColor = rColor;
     SetScUnderline( rFont.GetUnderline() );
     mnEscapem = EXC_FONTESC_NONE;
     SetScHeight( rFont.GetFontSize().Height() );
@@ -214,11 +213,13 @@ void XclFontData::FillFromVclFont(const vcl::Font& rFont, 
Color const& rColor)
     SetScStrikeout( rFont.GetStrikeout() );
     mbOutline = rFont.IsOutline();
     mbShadow = rFont.IsShadow();
+
+    maComplexColor = rComplexColor;
 }
 
-void XclFontData::FillFromSvxFont(const SvxFont& rFont, Color const& rColor)
+void XclFontData::FillFromSvxFont(const SvxFont& rFont, model::ComplexColor 
const& rComplexColor)
 {
-    FillFromVclFont(rFont, rColor);
+    FillFromVclFont(rFont, rComplexColor);
     SetScEscapement(rFont.GetEscapement());
 }
 
@@ -520,7 +521,7 @@ bool operator==( const XclFontData& rLeft, const 
XclFontData& rRight )
         (rLeft.mnHeight    == rRight.mnHeight)    &&
         (rLeft.mnWeight    == rRight.mnWeight)    &&
         (rLeft.mnUnderline == rRight.mnUnderline) &&
-        (rLeft.maColor     == rRight.maColor)     &&
+        (rLeft.maComplexColor == rRight.maComplexColor) &&
         (rLeft.mnEscapem   == rRight.mnEscapem)   &&
         (rLeft.mnFamily    == rRight.mnFamily)    &&
         (rLeft.mnCharSet   == rRight.mnCharSet)   &&
@@ -638,11 +639,13 @@ void XclFontPropSetHelper::ReadFontProperties( 
XclFontData& rFontData,
             rPropSetHlp >> aApiFontName >> fApiHeight >> eApiPosture >> 
fApiWeight;
             // read common properties
             maHlpChCommon.ReadFromPropertySet( rPropSet );
-            maHlpChCommon   >> nApiUnderl
-                            >> nApiStrikeout
-                            >> rFontData.maColor
-                            >> rFontData.mbOutline
-                            >> rFontData.mbShadow;
+            maHlpChCommon >> nApiUnderl;
+            maHlpChCommon >> nApiStrikeout;
+            Color aColor;
+            maHlpChCommon >> aColor;
+            rFontData.maComplexColor.setColor(aColor);
+            maHlpChCommon >> rFontData.mbOutline;
+            maHlpChCommon >> rFontData.mbShadow;
 
             // convert API property values to Excel settings
             lclSetApiFontSettings( rFontData, aApiFontName,
@@ -667,15 +670,17 @@ void XclFontPropSetHelper::ReadFontProperties( 
XclFontData& rFontData,
 
             // read font properties
             maHlpControl.ReadFromPropertySet( rPropSet );
-            maHlpControl    >> aApiFontName
-                            >> nApiFamily
-                            >> nApiCharSet
-                            >> fApiHeight
-                            >> nApiPosture
-                            >> fApiWeight
-                            >> nApiUnderl
-                            >> nApiStrikeout
-                            >> rFontData.maColor;
+            maHlpControl >> aApiFontName;
+            maHlpControl >> nApiFamily;
+            maHlpControl >> nApiCharSet;
+            maHlpControl >> fApiHeight;
+            maHlpControl >> nApiPosture;
+            maHlpControl >> fApiWeight;
+            maHlpControl >> nApiUnderl;
+            maHlpControl >> nApiStrikeout;
+            Color aColor;
+            maHlpControl >> aColor;
+            rFontData.maComplexColor.setColor(aColor);
 
             // convert API property values to Excel settings
             Awt::FontSlant eApiPosture = static_cast< Awt::FontSlant >( 
nApiPosture );
@@ -699,10 +704,10 @@ void XclFontPropSetHelper::WriteFontProperties(
         {
             // write common properties
             maHlpChCommon.InitializeWrite();
-            const Color& rColor = pFontColor ? *pFontColor : rFontData.maColor;
+            Color aColor = pFontColor ? *pFontColor : 
rFontData.maComplexColor.getFinalColor();
             maHlpChCommon   << rFontData.GetApiUnderline()
                             << rFontData.GetApiStrikeout()
-                            << rColor
+                            << aColor
                             << rFontData.mbOutline
                             << rFontData.mbShadow;
             maHlpChCommon.WriteToPropertySet( rPropSet );
@@ -733,7 +738,7 @@ void XclFontPropSetHelper::WriteFontProperties(
                             << rFontData.GetApiWeight()
                             << rFontData.GetApiUnderline()
                             << rFontData.GetApiStrikeout()
-                            << rFontData.maColor;
+                            << rFontData.maComplexColor.getFinalColor();
             maHlpControl.WriteToPropertySet( rPropSet );
         }
         break;
diff --git a/sc/source/filter/inc/xechart.hxx b/sc/source/filter/inc/xechart.hxx
index ff7dcc90920f..fb1eefca85f4 100644
--- a/sc/source/filter/inc/xechart.hxx
+++ b/sc/source/filter/inc/xechart.hxx
@@ -473,7 +473,7 @@ public:
     virtual             ~XclExpChFontBase();
 
     /** Derived classes set font color and color identifier to internal data 
structures. */
-    virtual void        SetFont( XclExpChFontRef xFont, const Color& rColor, 
sal_uInt32 nColorId ) = 0;
+    virtual void SetFont( XclExpChFontRef xFont, const model::ComplexColor& 
rComplexColor, sal_uInt32 nColorId ) = 0;
     /** Derived classes set text rotation to internal data structures. */
     virtual void        SetRotation( sal_uInt16 nRotation ) = 0;
 
@@ -496,7 +496,7 @@ public:
     explicit            XclExpChText( const XclExpChRoot& rRoot );
 
     /** Sets font color and color identifier to internal data structures. */
-    virtual void        SetFont( XclExpChFontRef xFont, const Color& rColor, 
sal_uInt32 nColorId ) override;
+    virtual void SetFont( XclExpChFontRef xFont, model::ComplexColor const& 
rComplexColor, sal_uInt32 nColorId ) override;
     /** Sets text rotation to internal data structures. */
     virtual void        SetRotation( sal_uInt16 nRotation ) override;
 
@@ -993,7 +993,8 @@ public:
     /** Converts axis tick mark settings. */
     void                Convert( const ScfPropertySet& rPropSet, const 
XclChExtTypeInfo& rTypeInfo, sal_uInt16 nAxisType );
     /** Sets font color and color identifier to internal data structures. */
-    void                SetFontColor( const Color& rColor, sal_uInt32 nColorId 
);
+    void SetFontColor(model::ComplexColor const& rComplexColor, sal_uInt32 
nColorId);
+
     /** Sets text rotation to internal data structures. */
     void                SetRotation( sal_uInt16 nRotation );
 
@@ -1019,7 +1020,7 @@ public:
     explicit            XclExpChAxis( const XclExpChRoot& rRoot, sal_uInt16 
nAxisType );
 
     /** Sets font color and color identifier to internal data structures. */
-    virtual void        SetFont( XclExpChFontRef xFont, const Color& rColor, 
sal_uInt32 nColorId ) override;
+    virtual void SetFont( XclExpChFontRef xFont, model::ComplexColor const& 
rComplexColor, sal_uInt32 nColorId ) override;
     /** Sets text rotation to internal data structures. */
     virtual void        SetRotation( sal_uInt16 nRotation ) override;
 
diff --git a/sc/source/filter/inc/xestyle.hxx b/sc/source/filter/inc/xestyle.hxx
index c479c6ac51f6..04e0a752bc6b 100644
--- a/sc/source/filter/inc/xestyle.hxx
+++ b/sc/source/filter/inc/xestyle.hxx
@@ -221,7 +221,7 @@ public:
     sal_uInt16          Insert(const XclFontData& rFontData, XclExpColorType 
eColorType, bool bAppFont = false );
     /** Inserts the SvxFont into the buffer if not present, e.g. where 
escapements are used.
         @return  The resulting Excel font index. */
-    sal_uInt16          Insert(const SvxFont& rFont, Color const& rColor, 
XclExpColorType eColorType);
+    sal_uInt16 Insert(const SvxFont& rFont, model::ComplexColor const& 
rComplexColor, XclExpColorType eColorType);
     /** Inserts the font contained in the passed item set into the buffer, if 
not present.
         @param nScript  The script type of the font properties to be used.
         @param bAppFont  true = Sets the application font; false = Inserts a 
new font.
@@ -756,7 +756,7 @@ public:
 
     sal_Int32 GetDxfId(const OUString& rName) const;
     sal_Int32 GetDxfByColor(Color aColor) const;
-    void AddColor(Color aColor);
+    void addColor(Color aColor);
 
     virtual void SaveXml( XclExpXmlStream& rStrm) override;
     void Finalize();
diff --git a/sc/source/filter/inc/xlchart.hxx b/sc/source/filter/inc/xlchart.hxx
index e28c6943c22a..d1a6a56b0972 100644
--- a/sc/source/filter/inc/xlchart.hxx
+++ b/sc/source/filter/inc/xlchart.hxx
@@ -20,6 +20,7 @@
 #pragma once
 
 #include <tools/gen.hxx>
+#include <docmodel/color/ComplexColor.hxx>
 #include "fapihelper.hxx"
 #include <map>
 #include <memory>
@@ -870,7 +871,8 @@ struct XclChFrLabelProps
 struct XclChText
 {
     XclChRectangle      maRect;             /// Position of the text object.
-    Color               maTextColor;        /// Text color.
+    //Color               maTextColor;        /// Text color.
+    model::ComplexColor maTextComplexColor;
     sal_uInt8           mnHAlign;           /// Horizontal alignment.
     sal_uInt8           mnVAlign;           /// Vertical alignment.
     sal_uInt16          mnBackMode;         /// Background mode: transparent, 
opaque.
@@ -1042,7 +1044,7 @@ struct XclChValueRange
 
 struct XclChTick
 {
-    Color               maTextColor;        /// Tick labels color.
+    model::ComplexColor maTextComplexColor; /// Tick labels color.
     sal_uInt8           mnMajor;            /// Type of tick marks of major 
grid.
     sal_uInt8           mnMinor;            /// Type of tick marks of minor 
grid.
     sal_uInt8           mnLabelPos;         /// Position of labels relative to 
axis.
diff --git a/sc/source/filter/inc/xlstyle.hxx b/sc/source/filter/inc/xlstyle.hxx
index d1faabc51ae6..2385b00136af 100644
--- a/sc/source/filter/inc/xlstyle.hxx
+++ b/sc/source/filter/inc/xlstyle.hxx
@@ -21,6 +21,7 @@
 
 #include <map>
 #include <com/sun/star/awt/FontSlant.hpp>
+#include <docmodel/color/ComplexColor.hxx>
 #include <tools/color.hxx>
 #include <tools/fontenum.hxx>
 #include <editeng/svxenum.hxx>
@@ -284,7 +285,6 @@ struct XclFontData
 {
     OUString            maName;         /// Font name.
     OUString            maStyle;        /// String with styles (bold, italic).
-    Color               maColor;        /// Font color.
     sal_uInt16          mnHeight;       /// Font height in twips (1/20 of a 
point).
     sal_uInt16          mnWeight;       /// Boldness: 400=normal, 700=bold.
     sal_uInt16          mnEscapem;      /// Escapement type.
@@ -296,19 +296,21 @@ struct XclFontData
     bool                mbOutline;      /// true = Outlined.
     bool                mbShadow;       /// true = Shadowed.
 
+    model::ComplexColor maComplexColor; /// Font color.
+
     /** Constructs an empty font data structure. */
-    explicit            XclFontData();
+    explicit XclFontData();
     /** Constructs a font data structure and fills it with the passed font 
attributes (except color). */
-    explicit            XclFontData(const vcl::Font& rFont, Color const& 
aColor);
+    explicit XclFontData(const vcl::Font& rFont, model::ComplexColor const& 
rComplexColor);
     /** As directly above but also fills in the escapement member. */
-    explicit            XclFontData(const SvxFont& rFont, Color const& aColor);
+    explicit XclFontData(const SvxFont& rFont, model::ComplexColor const& 
rComplexColor);
 
     /** Resets all members to default (empty) values. */
     void                Clear();
     /** Fills all members (except color and escapement) from the passed font. 
*/
-    void                FillFromVclFont(const vcl::Font& rFont, Color const& 
rColor);
+    void FillFromVclFont(const vcl::Font& rFont, model::ComplexColor const& 
rComplexColor);
     /** Fills all members (except color) from the passed SVX font. */
-    void                FillFromSvxFont(const SvxFont& rFont, Color const& 
rColor);
+    void FillFromSvxFont(const SvxFont& rFont, model::ComplexColor const& 
rComplexColor);
 
 // *** conversion of VCL/SVX constants *** ------------------------------------
 
commit ba29922dcc0a7b079fb76df445c4cd3a80102e83
Author:     Tomaž Vajngerl <tomaz.vajng...@collabora.co.uk>
AuthorDate: Wed Jun 28 22:55:22 2023 +0900
Commit:     Tomaž Vajngerl <qui...@gmail.com>
CommitDate: Thu Jun 29 04:57:28 2023 +0200

    oox: convert Excel tint value into LumOff and LumMod
    
    tint value can be converted into LumOff and LumMod values, so we
    don't need a special Excel case for calculating the final color.
    
    Change-Id: I0725c06f9df6a37a309ea5d17b183e4100a228f0
    Reviewed-on: https://gerrit.libreoffice.org/c/core/+/153716
    Tested-by: Tomaž Vajngerl <qui...@gmail.com>
    Reviewed-by: Tomaž Vajngerl <qui...@gmail.com>

diff --git a/oox/source/drawingml/color.cxx b/oox/source/drawingml/color.cxx
index b653458300f4..1ed2e57b6242 100644
--- a/oox/source/drawingml/color.cxx
+++ b/oox/source/drawingml/color.cxx
@@ -434,10 +434,18 @@ void Color::addChartTintTransformation( double fTint )
         maTransforms.emplace_back( XML_tint, MAX_PERCENT - nValue );
 }
 
-void Color::addExcelTintTransformation( double fTint )
+void Color::addExcelTintTransformation(double fTint)
 {
-    sal_Int32 nValue = getLimitedValue< sal_Int32, double >( fTint * 
MAX_PERCENT + 0.5, -MAX_PERCENT, MAX_PERCENT );
-    maTransforms.emplace_back( XLS_TOKEN( tint ), nValue );
+    sal_Int32 nValue = std::round(std::abs(fTint) * 100'000.0);
+    if (fTint > 0.0)
+    {
+        maTransforms.emplace_back(XML_lumMod, 100'000 - nValue);
+        maTransforms.emplace_back(XML_lumOff, nValue);
+    }
+    else if (fTint < 0.0)
+    {
+        maTransforms.emplace_back(XML_lumMod, 100'000 - nValue);
+    }
 }
 
 void Color::clearTransformations()
@@ -723,23 +731,6 @@ model::ComplexColor Color::getComplexColor() const
                         mnC3 = static_cast< sal_Int32 >( MAX_PERCENT - 
(MAX_PERCENT - mnC3) * fFactor );
                     }
                 break;
-                case XLS_TOKEN( tint ):
-                    // Excel tint: move luminance relative to current value
-                    toHsl();
-                    OSL_ENSURE( (-MAX_PERCENT <= transform.mnValue) && 
(transform.mnValue <= MAX_PERCENT), "Color::getColor - invalid tint value" );
-                    if( (-MAX_PERCENT <= transform.mnValue) && 
(transform.mnValue < 0) )
-                    {
-                        // negative: luminance towards 0% (black)
-                        lclModValue( mnC3, transform.mnValue + MAX_PERCENT );
-                    }
-                    else if( (0 < transform.mnValue) && (transform.mnValue <= 
MAX_PERCENT) )
-                    {
-                        // positive: luminance towards 100% (white)
-                        mnC3 = MAX_PERCENT - mnC3;
-                        lclModValue( mnC3, MAX_PERCENT - transform.mnValue );
-                        mnC3 = MAX_PERCENT - mnC3;
-                    }
-                break;
 
                 case XML_gray:
                     // change color to gray, weighted RGB: 22% red, 72% green, 
6% blue
@@ -844,7 +835,7 @@ model::ComplexColor Color::createComplexColor(const 
GraphicHelper& /*rGraphicHel
     {
         sal_Int16 nValue = sal_Int16(aTransform.mnValue / 10);
 
-        switch(aTransform.mnToken)
+        switch (aTransform.mnToken)
         {
             case XML_lumMod:
                 if (nValue != 10'000)

Reply via email to