include/oox/drawingml/color.hxx       |   10 +++-
 oox/source/drawingml/color.cxx        |   77 ++++++++++++++++++++++++++++++++++
 sc/source/filter/inc/stylesbuffer.hxx |    3 +
 sc/source/filter/oox/stylesbuffer.cxx |   17 +++++--
 sc/source/ui/unoobj/styleuno.cxx      |    1 
 5 files changed, 102 insertions(+), 6 deletions(-)

New commits:
commit 1f2e110bfcd41707f2b0dbf6a296eb5cf79efe95
Author:     Tomaž Vajngerl <tomaz.vajng...@collabora.co.uk>
AuthorDate: Fri May 12 23:21:22 2023 +0900
Commit:     Miklos Vajna <vmik...@collabora.com>
CommitDate: Fri Aug 11 09:12:12 2023 +0200

    sc: OOXML import of theme colors for char and background colors
    
    Change-Id: I8209238927bb425e8e306352f1fa78d63378f005
    Reviewed-on: https://gerrit.libreoffice.org/c/core/+/151707
    Tested-by: Jenkins
    Reviewed-by: Tomaž Vajngerl <qui...@gmail.com>
    (cherry picked from commit ea1cd4993be992b89930db4811d08a4a51b1f68d)
    Reviewed-on: https://gerrit.libreoffice.org/c/core/+/155544
    Tested-by: Jenkins CollaboraOffice <jenkinscollaboraoff...@gmail.com>
    Reviewed-by: Miklos Vajna <vmik...@collabora.com>

diff --git a/include/oox/drawingml/color.hxx b/include/oox/drawingml/color.hxx
index 245e655d7c78..ea02ef8a03e4 100644
--- a/include/oox/drawingml/color.hxx
+++ b/include/oox/drawingml/color.hxx
@@ -37,6 +37,7 @@ namespace oox { class GraphicHelper; }
 namespace oox::drawingml
 {
 
+model::ThemeColorType schemeTokenToThemeColorType(sal_uInt32 nToken);
 model::ThemeColorType schemeNameToThemeColorType(OUString const& rSchemeName);
 
 class OOX_DLLPUBLIC Color
@@ -107,6 +108,13 @@ public:
     sal_Int16           getLumMod() const;
     sal_Int16           getLumOff() const;
 
+    model::ThemeColorType getThemeColorType() const
+    {
+        return meThemeColorType;
+    }
+
+    model::ComplexColor createComplexColor(const GraphicHelper& 
rGraphicHelper, sal_Int16 nPhClrTheme) const;
+
     /** Returns the unaltered list of transformations for interoperability 
purposes */
     const css::uno::Sequence< css::beans::PropertyValue >& 
getTransformations() const { return maInteropTransformations;}
 
@@ -160,8 +168,8 @@ private:
     mutable sal_Int32   mnC2;           /// Green, green%, saturation, or 
system default RGB.
     mutable sal_Int32   mnC3;           /// Blue, blue%, or luminance.
     sal_Int32           mnAlpha;        /// Alpha value (color opacity).
-
     OUString            msSchemeName;   /// Scheme name from the a:schemeClr 
element for interoperability purposes
+    model::ThemeColorType meThemeColorType;
     css::uno::Sequence< css::beans::PropertyValue >
                         maInteropTransformations;   /// Unaltered list of 
transformations for interoperability purposes
 };
diff --git a/oox/source/drawingml/color.cxx b/oox/source/drawingml/color.cxx
index e9c645b99b7c..fca70e2018ab 100644
--- a/oox/source/drawingml/color.cxx
+++ b/oox/source/drawingml/color.cxx
@@ -250,6 +250,44 @@ model::ThemeColorType schemeNameToThemeColorType(OUString 
const& rSchemeName)
         return aIterator->second;
 }
 
+model::ThemeColorType schemeTokenToThemeColorType(sal_uInt32 nToken)
+{
+    static std::unordered_map<sal_Int32, model::ThemeColorType> const 
constThemeColorTokenMap {
+        { XML_dk1, model::ThemeColorType::Dark1 },
+        { XML_lt1, model::ThemeColorType::Light1 },
+        { XML_dk2, model::ThemeColorType::Dark2 },
+        { XML_lt2, model::ThemeColorType::Light2 },
+        { XML_accent1, model::ThemeColorType::Accent1 },
+        { XML_accent2, model::ThemeColorType::Accent2 },
+        { XML_accent3, model::ThemeColorType::Accent3 },
+        { XML_accent4, model::ThemeColorType::Accent4 },
+        { XML_accent5, model::ThemeColorType::Accent5 },
+        { XML_accent6, model::ThemeColorType::Accent6 },
+        { XML_hlink, model::ThemeColorType::Hyperlink },
+        { XML_folHlink, model::ThemeColorType::FollowedHyperlink },
+        { XML_tx1, model::ThemeColorType::Dark1 },
+        { XML_bg1, model::ThemeColorType::Light1 },
+        { XML_tx2, model::ThemeColorType::Dark2 },
+        { XML_bg2, model::ThemeColorType::Light2 },
+        { XML_dark1, model::ThemeColorType::Dark1 },
+        { XML_light1, model::ThemeColorType::Light1 },
+        { XML_dark2, model::ThemeColorType::Dark2 },
+        { XML_light2, model::ThemeColorType::Light2 },
+        { XML_text1, model::ThemeColorType::Dark1 },
+        { XML_background1, model::ThemeColorType::Light1 },
+        { XML_text2, model::ThemeColorType::Dark2 },
+        { XML_background2, model::ThemeColorType::Light2 },
+        { XML_hyperlink, model::ThemeColorType::Hyperlink },
+        { XML_followedHyperlink, model::ThemeColorType::FollowedHyperlink },
+    };
+
+    auto aIterator = constThemeColorTokenMap.find(nToken);
+    if (aIterator == constThemeColorTokenMap.end())
+        return model::ThemeColorType::Unknown;
+    else
+        return aIterator->second;
+}
+
 Color::Color() :
     meMode( COLOR_UNUSED ),
     mnC1( 0 ),
@@ -346,6 +384,8 @@ void Color::setSchemeClr( sal_Int32 nToken )
     OSL_ENSURE( nToken != XML_TOKEN_INVALID, "Color::setSchemeClr - invalid 
color token" );
     meMode = (nToken == XML_phClr) ? COLOR_PH : COLOR_SCHEME;
     mnC1 = nToken;
+    if (meMode == COLOR_SCHEME)
+        meThemeColorType = schemeTokenToThemeColorType(nToken);
 }
 
 void Color::setPaletteClr( sal_Int32 nPaletteIdx )
@@ -779,6 +819,43 @@ sal_Int16 Color::getSchemeColorIndex() const
     return sal_Int16(eThemeType);
 }
 
+model::ComplexColor Color::createComplexColor(const GraphicHelper& 
/*rGraphicHelper*/, sal_Int16 nPhClrTheme) const
+{
+    model::ComplexColor aNewComplexColor;
+    if (meMode == COLOR_PH)
+    {
+        auto eTheme = model::convertToThemeColorType(nPhClrTheme);
+        aNewComplexColor.setSchemeColor(eTheme);
+    }
+    else if (meMode == COLOR_SCHEME)
+    {
+        auto eTheme = getThemeColorType();
+        aNewComplexColor.setSchemeColor(eTheme);
+    }
+    else
+    {
+        // TODO
+        return aNewComplexColor;
+    }
+
+    if (getLumMod() != 10000)
+        aNewComplexColor.addTransformation({model::TransformationType::LumMod, 
getLumMod()});
+
+    if (getLumOff() != 0)
+        aNewComplexColor.addTransformation({model::TransformationType::LumOff, 
getLumOff()});
+
+    if (getTintOrShade() > 0)
+    {
+        aNewComplexColor.addTransformation({model::TransformationType::Tint, 
getTintOrShade()});
+    }
+    else if (getTintOrShade() < 0)
+    {
+        sal_Int16 nShade = o3tl::narrowing<sal_Int16>(-getTintOrShade());
+        aNewComplexColor.addTransformation({model::TransformationType::Shade, 
nShade});
+    }
+    return aNewComplexColor;
+}
+
 // private --------------------------------------------------------------------
 
 void Color::setResolvedRgb( ::Color nRgb ) const
diff --git a/sc/source/filter/inc/stylesbuffer.hxx 
b/sc/source/filter/inc/stylesbuffer.hxx
index c80eab77241d..713b5a2f25b8 100644
--- a/sc/source/filter/inc/stylesbuffer.hxx
+++ b/sc/source/filter/inc/stylesbuffer.hxx
@@ -32,6 +32,7 @@
 #include "numberformatsbuffer.hxx"
 #include <editeng/svxenum.hxx>
 #include <editeng/frmdir.hxx>
+#include <docmodel/color/ComplexColor.hxx>
 #include <attarray.hxx>
 #include <vector>
 
@@ -196,6 +197,7 @@ struct ApiFontData
     ApiScriptFontName        maCmplxFont;        /// Font name for complex 
scripts.
     css::awt::FontDescriptor maDesc;             /// Font descriptor (height 
in twips, weight in %).
     ::Color                  mnColor;            /// Font color.
+    model::ComplexColor      maComplexColor;     /// Font complex color.
     sal_Int16                mnEscapement;       /// Escapement style.
     sal_Int8                 mnEscapeHeight;     /// Escapement font height.
     bool                     mbOutline;          /// True = outlined 
characters.
@@ -506,6 +508,7 @@ struct GradientFillModel
 struct ApiSolidFillData
 {
     ::Color             mnColor;            /// Fill color.
+    model::ComplexColor maComplexColor;
     ::Color             mnFilterColor;        /// Fill color filtering.
     bool                mbTransparent;      /// True = transparent area.
     bool                mbUsed;             /// True = fill data is valid.
diff --git a/sc/source/filter/oox/stylesbuffer.cxx 
b/sc/source/filter/oox/stylesbuffer.cxx
index 944ff7778ff6..e0c99ccb7a65 100644
--- a/sc/source/filter/oox/stylesbuffer.cxx
+++ b/sc/source/filter/oox/stylesbuffer.cxx
@@ -275,8 +275,12 @@ void Color::importColor( const AttributeList& rAttribs )
 {
     // tdf#113271 The order of import color is very important in case of more 
than one color attributes was provided.
     // This order (theme -> rgb -> indexed -> auto) is not documented and was 
gathered experimentally based on MS Excel 2013.
-    if( rAttribs.hasAttribute( XML_theme ) )
-        setTheme( rAttribs.getInteger( XML_theme, -1 ), rAttribs.getDouble( 
XML_tint, 0.0 ) );
+    if (rAttribs.hasAttribute(XML_theme))
+    {
+        sal_Int32 nTheme = rAttribs.getInteger(XML_theme, -1);
+        double fTint = rAttribs.getDouble(XML_tint, 0.0);
+        setTheme(nTheme , fTint);
+    }
     else if( rAttribs.hasAttribute( XML_rgb ) )
         setRgb( ::Color(ColorTransparency, rAttribs.getIntegerHex( XML_rgb, 
sal_Int32(API_RGB_TRANSPARENT) ) ), rAttribs.getDouble( XML_tint, 0.0 ) );
     else if( rAttribs.hasAttribute( XML_indexed ) )
@@ -746,6 +750,7 @@ void Font::finalizeImport()
             rtl_getTextEncodingFromWindowsCharset( static_cast< sal_uInt8 >( 
maModel.mnCharSet ) ) );
 
     // color, height, weight, slant, strikeout, outline, shadow
+    maApiData.maComplexColor   = 
maModel.maColor.createComplexColor(getBaseFilter().getGraphicHelper(), -1);
     maApiData.mnColor          = maModel.maColor.getColor( 
getBaseFilter().getGraphicHelper() );
     maApiData.maDesc.Height    = static_cast< sal_Int16 >( maModel.mfHeight * 
20.0 );
     maApiData.maDesc.Weight    = maModel.mbBold ? css::awt::FontWeight::BOLD : 
css::awt::FontWeight::NORMAL;
@@ -929,7 +934,7 @@ void Font::fillToItemSet( SfxItemSet& rItemSet, bool 
bEditEngineText, bool bSkip
     // character color
     if( maUsedFlags.mbColorUsed )
     {
-        ScfTools::PutItem( rItemSet,SvxColorItem( maApiData.mnColor, 
bEditEngineText ? static_cast<sal_uInt16>(EE_CHAR_COLOR) : ATTR_FONT_COLOR), 
bSkipPoolDefs );
+        ScfTools::PutItem( rItemSet,SvxColorItem( maApiData.mnColor, 
maApiData.maComplexColor, bEditEngineText ? 
static_cast<sal_uInt16>(EE_CHAR_COLOR) : ATTR_FONT_COLOR), bSkipPoolDefs );
     }
     // underline style
     if( maUsedFlags.mbUnderlineUsed )
@@ -1719,7 +1724,7 @@ void Fill::importFgColor( const AttributeList& rAttribs )
     OSL_ENSURE( mxPatternModel, "Fill::importFgColor - missing pattern data" );
     if( mxPatternModel )
     {
-        mxPatternModel->maPatternColor.importColor( rAttribs );
+        mxPatternModel->maPatternColor.importColor(rAttribs);
         mxPatternModel->mbPattColorUsed = true;
     }
 }
@@ -1729,7 +1734,7 @@ void Fill::importBgColor( const AttributeList& rAttribs )
     OSL_ENSURE( mxPatternModel, "Fill::importBgColor - missing pattern data" );
     if( mxPatternModel )
     {
-        mxPatternModel->maFillColor.importColor( rAttribs );
+        mxPatternModel->maFillColor.importColor(rAttribs);
         mxPatternModel->mbFillColorUsed = true;
     }
 }
@@ -1892,6 +1897,7 @@ void Fill::finalizeImport()
             ::Color nFillColor = rModel.maFillColor.getColor( rGraphicHelper, 
nWinColor );
 
             maApiData.mnColor = lclGetMixedColor( nPattColor, nFillColor, 
nAlpha );
+            maApiData.maComplexColor = 
rModel.maPatternColor.createComplexColor(rGraphicHelper, -1);
             maApiData.mnFilterColor = lclGetMixedColor( nFiltPattColor, 
nFillColor, nAlpha );
             maApiData.mbTransparent = false;
         }
@@ -1927,6 +1933,7 @@ void Fill::fillToItemSet( SfxItemSet& rItemSet, bool 
bSkipPoolDefs ) const
     else
     {
         aBrushItem.SetColor( maApiData.mnColor  );
+        aBrushItem.setComplexColor(maApiData.maComplexColor);
         aBrushItem.SetFiltColor( maApiData.mnFilterColor  );
     }
     ScfTools::PutItem( rItemSet, aBrushItem, bSkipPoolDefs );
diff --git a/sc/source/ui/unoobj/styleuno.cxx b/sc/source/ui/unoobj/styleuno.cxx
index d4b6a772e130..9dc1b6db2d19 100644
--- a/sc/source/ui/unoobj/styleuno.cxx
+++ b/sc/source/ui/unoobj/styleuno.cxx
@@ -51,6 +51,7 @@
 #include <com/sun/star/style/PageStyleLayout.hpp>
 #include <com/sun/star/style/GraphicLocation.hpp>
 #include <com/sun/star/sheet/XHeaderFooterContent.hpp>
+#include <com/sun/star/util/XComplexColor.hpp>
 #include <com/sun/star/util/CellProtection.hpp>
 #include <com/sun/star/util/XComplexColor.hpp>
 #include <com/sun/star/awt/FontSlant.hpp>

Reply via email to