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>