diff options
author | Tomaž Vajngerl <tomaz.vajngerl@collabora.co.uk> | 2023-01-01 23:25:38 +0900 |
---|---|---|
committer | Tomaž Vajngerl <quikee@gmail.com> | 2023-01-13 00:49:24 +0000 |
commit | 197e5f81213d14fdcbff40edf73385ecd4cd9815 (patch) | |
tree | 5bc1735ec61200a895b5edcf684d846245286ba5 /writerfilter | |
parent | c82fa434dab8744c548db166cd24ee82e8759e1f (diff) |
introduce {Char,Fill}ColorThemeReference which uses XThemeColor
Adds a unified UNO property for theme colors *ColorTheme
(CharColorTheme and FillColorTheme) which uses XThemeColor, that
replaces the properties *Theme, *TintOrShade, *LumOff, *LumMod.
The properties are still present for backwards compatibility and
to keep ODF support working in tests as that needs a bigger change.
Reactor the code and tests to accomodate for this change.
Change-Id: If7983decb4ba528b49fe7b5968aa9efc696a9efc
Reviewed-on: https://gerrit.libreoffice.org/c/core/+/144783
Tested-by: Jenkins
Reviewed-by: Tomaž Vajngerl <quikee@gmail.com>
Diffstat (limited to 'writerfilter')
-rw-r--r-- | writerfilter/Library_writerfilter.mk | 1 | ||||
-rw-r--r-- | writerfilter/source/dmapper/DomainMapper.cxx | 119 | ||||
-rw-r--r-- | writerfilter/source/dmapper/PropertyIds.cxx | 3 | ||||
-rw-r--r-- | writerfilter/source/dmapper/PropertyIds.hxx | 3 | ||||
-rw-r--r-- | writerfilter/source/dmapper/TDefTableHandler.cxx | 38 | ||||
-rw-r--r-- | writerfilter/source/dmapper/TDefTableHandler.hxx | 4 | ||||
-rw-r--r-- | writerfilter/source/dmapper/ThemeColorHandler.hxx | 68 |
7 files changed, 158 insertions, 78 deletions
diff --git a/writerfilter/Library_writerfilter.mk b/writerfilter/Library_writerfilter.mk index dafc17c959e1..3e0662b4fb35 100644 --- a/writerfilter/Library_writerfilter.mk +++ b/writerfilter/Library_writerfilter.mk @@ -32,6 +32,7 @@ $(eval $(call gb_Library_use_libraries,writerfilter,\ comphelper \ cppu \ cppuhelper \ + docmodel \ editeng \ i18nlangtag \ i18nutil \ diff --git a/writerfilter/source/dmapper/DomainMapper.cxx b/writerfilter/source/dmapper/DomainMapper.cxx index 649b17a1214a..61b4d6d114d4 100644 --- a/writerfilter/source/dmapper/DomainMapper.cxx +++ b/writerfilter/source/dmapper/DomainMapper.cxx @@ -69,6 +69,7 @@ #include <com/sun/star/text/FontEmphasis.hpp> #include <com/sun/star/awt/CharSet.hpp> #include <com/sun/star/lang/XMultiServiceFactory.hpp> +#include <com/sun/star/util/XThemeColor.hpp> #include <comphelper/types.hxx> #include <comphelper/storagehelper.hxx> #include <comphelper/sequence.hxx> @@ -79,6 +80,7 @@ #include <unotools/mediadescriptor.hxx> #include "TextEffectsHandler.hxx" +#include "ThemeColorHandler.hxx" #include "CellColorHandler.hxx" #include "SectionColumnHandler.hxx" #include "GraphicHelpers.hxx" @@ -338,11 +340,6 @@ void DomainMapper::lcl_attribute(Id nName, Value & val) if (m_pImpl->GetTopContext()) handleUnderlineType(nIntValue, m_pImpl->GetTopContext()); break; - case NS_ooxml::LN_CT_Color_val: - if (m_pImpl->GetTopContext()) - m_pImpl->GetTopContext()->Insert(PROP_CHAR_COLOR, uno::Any( nIntValue ) ); - m_pImpl->appendGrabBag(m_pImpl->m_aSubInteropGrabBag, "val", msfilter::util::ConvertColorOU(Color(ColorTransparency,nIntValue))); - break; case NS_ooxml::LN_CT_Underline_color: if (m_pImpl->GetTopContext()) { @@ -1030,31 +1027,6 @@ void DomainMapper::lcl_attribute(Id nName, Value & val) case NS_ooxml::LN_CT_FtnEdnRef_id: // footnote or endnote reference id - not needed break; - case NS_ooxml::LN_CT_Color_themeColor: - if (m_pImpl->GetTopContext()) - { - sal_Int16 nIndex = TDefTableHandler::getThemeColorTypeIndex(nIntValue); - if (nIndex >= 0 && nIndex <= 11) - m_pImpl->GetTopContext()->Insert(PROP_CHAR_COLOR_THEME_INDEX, uno::Any(nIndex)); - } - m_pImpl->appendGrabBag(m_pImpl->m_aSubInteropGrabBag, "themeColor", TDefTableHandler::getThemeColorTypeString(nIntValue)); - break; - case NS_ooxml::LN_CT_Color_themeTint: - if (m_pImpl->GetTopContext()) - { - if (nIntValue != 0) - m_pImpl->GetTopContext()->Insert(PROP_CHAR_COLOR_TINT_OR_SHADE, uno::Any(sal_Int16((256 - nIntValue) * 10000 / 256))); - } - m_pImpl->appendGrabBag(m_pImpl->m_aSubInteropGrabBag, "themeTint", OUString::number(nIntValue, 16)); - break; - case NS_ooxml::LN_CT_Color_themeShade: - if (m_pImpl->GetTopContext()) - { - if (nIntValue != 0) - m_pImpl->GetTopContext()->Insert(PROP_CHAR_COLOR_TINT_OR_SHADE, uno::Any(sal_Int16((nIntValue - 256) * 10000 / 256))); - } - m_pImpl->appendGrabBag(m_pImpl->m_aSubInteropGrabBag, "themeShade", OUString::number(nIntValue, 16)); - break; case NS_ooxml::LN_CT_DocGrid_linePitch: { //see SwWW8ImplReader::SetDocumentGrid @@ -2172,8 +2144,70 @@ void DomainMapper::sprmWithProps( Sprm& rSprm, const PropertyMapPtr& rContext ) } } break; - case NS_ooxml::LN_CT_PPr_sectPr: case NS_ooxml::LN_EG_RPrBase_color: + { + writerfilter::Reference<Properties>::Pointer_t pProperties = rSprm.getProps(); + if (pProperties) + { + auto pThemeColorHandler = std::make_shared<ThemeColorHandler>(); + pProperties->resolve(*pThemeColorHandler); + + uno::Any aThemeColorName(TDefTableHandler::getThemeColorTypeString(pThemeColorHandler->mnIndex)); + uno::Any aThemeColorTint(OUString::number(pThemeColorHandler->mnTint, 16)); + uno::Any aThemeColorShade(OUString::number(pThemeColorHandler->mnShade, 16)); + + if (m_pImpl->GetTopContext()) + { + m_pImpl->GetTopContext()->Insert(PROP_CHAR_COLOR, uno::Any(pThemeColorHandler->mnColor)); + + auto eType = TDefTableHandler::getThemeColorTypeIndex(pThemeColorHandler->mnIndex); + if (eType != model::ThemeColorType::Unknown) + { + model::ThemeColor aThemeColor; + aThemeColor.setType(eType); + + if (pThemeColorHandler->mnTint > 0 ) + { + sal_Int16 nTint = sal_Int16((256 - pThemeColorHandler->mnTint) * 10000 / 256); + aThemeColor.addTransformation({model::TransformationType::Tint, nTint}); + } + if (pThemeColorHandler->mnShade > 0) + { + sal_Int16 nShade = sal_Int16((256 - pThemeColorHandler->mnShade) * 10000 / 256); + aThemeColor.addTransformation({model::TransformationType::Shade, nShade}); + } + + auto xThemeColor = model::theme::createXThemeColor(aThemeColor); + m_pImpl->GetTopContext()->Insert(PROP_CHAR_COLOR_THEME_REFERENCE, uno::Any(xThemeColor)); + } + + uno::Any aColorAny(msfilter::util::ConvertColorOU(Color(ColorTransparency, pThemeColorHandler->mnColor))); + m_pImpl->GetTopContext()->Insert(PROP_CHAR_THEME_ORIGINAL_COLOR, aColorAny, true, CHAR_GRAB_BAG); + + if (pThemeColorHandler->mnIndex >= 0) + m_pImpl->GetTopContext()->Insert(PROP_CHAR_THEME_COLOR, aThemeColorName, true, CHAR_GRAB_BAG); + + if (pThemeColorHandler->mnTint > 0) + m_pImpl->GetTopContext()->Insert(PROP_CHAR_THEME_COLOR_TINT, aThemeColorTint, true, CHAR_GRAB_BAG); + + if (pThemeColorHandler->mnShade > 0) + m_pImpl->GetTopContext()->Insert(PROP_CHAR_THEME_COLOR_SHADE, aThemeColorShade, true, CHAR_GRAB_BAG); + } + { + if (pThemeColorHandler->mnIndex >= 0) + { + m_pImpl->appendGrabBag(m_pImpl->m_aSubInteropGrabBag, "themeColor", aThemeColorName.get<OUString>()); + if (pThemeColorHandler->mnTint > 0) + m_pImpl->appendGrabBag(m_pImpl->m_aSubInteropGrabBag, "themeTint", aThemeColorTint.get<OUString>()); + if (pThemeColorHandler->mnShade > 0) + m_pImpl->appendGrabBag(m_pImpl->m_aSubInteropGrabBag, "themeShade", aThemeColorShade.get<OUString>()); + } + m_pImpl->appendGrabBag(m_pImpl->m_aInteropGrabBag, "color", m_pImpl->m_aSubInteropGrabBag); + } + } + } + break; + case NS_ooxml::LN_CT_PPr_sectPr: case NS_ooxml::LN_EG_RPrBase_rFonts: case NS_ooxml::LN_EG_RPrBase_eastAsianLayout: case NS_ooxml::LN_EG_RPrBase_u: @@ -2187,12 +2221,8 @@ void DomainMapper::sprmWithProps( Sprm& rSprm, const PropertyMapPtr& rContext ) case NS_ooxml::LN_CT_PPr_rPr: case NS_ooxml::LN_CT_PPrBase_numPr: { - bool bTempGrabBag = !m_pImpl->isInteropGrabBagEnabled(); if (nSprmId == NS_ooxml::LN_CT_PPr_sectPr) m_pImpl->SetParaSectpr(true); - else if (nSprmId == NS_ooxml::LN_EG_RPrBase_color && bTempGrabBag) - // if DomainMapper grab bag is not enabled, enable it temporarily - m_pImpl->enableInteropGrabBag("TempColorPropsGrabBag"); resolveSprmProps(*this, rSprm); if (nSprmId == NS_ooxml::LN_CT_PPrBase_spacing) m_pImpl->appendGrabBag(m_pImpl->m_aInteropGrabBag, "spacing", m_pImpl->m_aSubInteropGrabBag); @@ -2200,25 +2230,6 @@ void DomainMapper::sprmWithProps( Sprm& rSprm, const PropertyMapPtr& rContext ) m_pImpl->appendGrabBag(m_pImpl->m_aInteropGrabBag, "rFonts", m_pImpl->m_aSubInteropGrabBag); else if (nSprmId == NS_ooxml::LN_EG_RPrBase_lang) m_pImpl->appendGrabBag(m_pImpl->m_aInteropGrabBag, "lang", m_pImpl->m_aSubInteropGrabBag); - else if (nSprmId == NS_ooxml::LN_EG_RPrBase_color) - { - for (const auto& rItem : m_pImpl->m_aSubInteropGrabBag) - { - if (rItem.Name == "val") - m_pImpl->GetTopContext()->Insert(PROP_CHAR_THEME_ORIGINAL_COLOR, rItem.Value, true, CHAR_GRAB_BAG); - else if (rItem.Name == "themeColor") - m_pImpl->GetTopContext()->Insert(PROP_CHAR_THEME_COLOR, rItem.Value, true, CHAR_GRAB_BAG); - else if (rItem.Name == "themeShade") - m_pImpl->GetTopContext()->Insert(PROP_CHAR_THEME_COLOR_SHADE, rItem.Value, true, CHAR_GRAB_BAG); - else if (rItem.Name == "themeTint") - m_pImpl->GetTopContext()->Insert(PROP_CHAR_THEME_COLOR_TINT, rItem.Value, true, CHAR_GRAB_BAG); - } - if (bTempGrabBag) - //disable and clear DomainMapper grab bag if it wasn't enabled before - m_pImpl->disableInteropGrabBag(); - - m_pImpl->appendGrabBag(m_pImpl->m_aInteropGrabBag, "color", m_pImpl->m_aSubInteropGrabBag); - } else if (nSprmId == NS_ooxml::LN_CT_PPrBase_ind) m_pImpl->appendGrabBag(m_pImpl->m_aInteropGrabBag, "ind", m_pImpl->m_aSubInteropGrabBag); } diff --git a/writerfilter/source/dmapper/PropertyIds.cxx b/writerfilter/source/dmapper/PropertyIds.cxx index 3f966d41f18e..98525149fcf9 100644 --- a/writerfilter/source/dmapper/PropertyIds.cxx +++ b/writerfilter/source/dmapper/PropertyIds.cxx @@ -32,8 +32,7 @@ OUString getPropertyName( PropertyIds eId ) case PROP_CHAR_SHADOWED: sName = "CharShadowed"; break; case PROP_CHAR_CASE_MAP: sName = "CharCaseMap"; break; case PROP_CHAR_COLOR: sName = "CharColor"; break; - case PROP_CHAR_COLOR_THEME_INDEX: sName = "CharColorTheme"; break; - case PROP_CHAR_COLOR_TINT_OR_SHADE: sName = "CharColorTintOrShade"; break; + case PROP_CHAR_COLOR_THEME_REFERENCE: sName = "CharColorThemeReference"; break; case PROP_CHAR_RELIEF: sName = "CharRelief"; break; case PROP_CHAR_UNDERLINE: sName = "CharUnderline"; break; case PROP_CHAR_UNDERLINE_COLOR: sName = "CharUnderlineColor"; break; diff --git a/writerfilter/source/dmapper/PropertyIds.hxx b/writerfilter/source/dmapper/PropertyIds.hxx index bddcbe56447a..52b989bf41c9 100644 --- a/writerfilter/source/dmapper/PropertyIds.hxx +++ b/writerfilter/source/dmapper/PropertyIds.hxx @@ -54,8 +54,7 @@ enum PropertyIds ,PROP_CHAR_CASE_MAP ,PROP_CHAR_CHAR_KERNING ,PROP_CHAR_COLOR - ,PROP_CHAR_COLOR_THEME_INDEX - ,PROP_CHAR_COLOR_TINT_OR_SHADE + ,PROP_CHAR_COLOR_THEME_REFERENCE ,PROP_CHAR_COMBINE_IS_ON ,PROP_CHAR_COMBINE_PREFIX ,PROP_CHAR_COMBINE_SUFFIX diff --git a/writerfilter/source/dmapper/TDefTableHandler.cxx b/writerfilter/source/dmapper/TDefTableHandler.cxx index 2dea73e65020..4d279ac4bc12 100644 --- a/writerfilter/source/dmapper/TDefTableHandler.cxx +++ b/writerfilter/source/dmapper/TDefTableHandler.cxx @@ -269,48 +269,48 @@ OUString TDefTableHandler::getThemeColorTypeString(sal_Int32 nType) return OUString(); } -sal_Int16 TDefTableHandler::getThemeColorTypeIndex(sal_Int32 nType) +model::ThemeColorType TDefTableHandler::getThemeColorTypeIndex(sal_Int32 nType) { switch (nType) { case NS_ooxml::LN_Value_St_ThemeColor_dark1: - return 0; + return model::ThemeColorType::Dark1; case NS_ooxml::LN_Value_St_ThemeColor_light1: - return 1; + return model::ThemeColorType::Light1; case NS_ooxml::LN_Value_St_ThemeColor_dark2: - return 2; + return model::ThemeColorType::Dark2; case NS_ooxml::LN_Value_St_ThemeColor_light2: - return 3; + return model::ThemeColorType::Light2; case NS_ooxml::LN_Value_St_ThemeColor_accent1: - return 4; + return model::ThemeColorType::Accent1; case NS_ooxml::LN_Value_St_ThemeColor_accent2: - return 5; + return model::ThemeColorType::Accent2; case NS_ooxml::LN_Value_St_ThemeColor_accent3: - return 6; + return model::ThemeColorType::Accent3; case NS_ooxml::LN_Value_St_ThemeColor_accent4: - return 7; + return model::ThemeColorType::Accent4; case NS_ooxml::LN_Value_St_ThemeColor_accent5: - return 8; + return model::ThemeColorType::Accent5; case NS_ooxml::LN_Value_St_ThemeColor_accent6: - return 9; + return model::ThemeColorType::Accent6; case NS_ooxml::LN_Value_St_ThemeColor_hyperlink: - return 10; + return model::ThemeColorType::Hyperlink; case NS_ooxml::LN_Value_St_ThemeColor_followedHyperlink: - return 11; + return model::ThemeColorType::FollowedHyperlink; case NS_ooxml::LN_Value_St_ThemeColor_none: - return -1; + return model::ThemeColorType::Unknown; case NS_ooxml::LN_Value_St_ThemeColor_background1: - return 0; + return model::ThemeColorType::Dark1; case NS_ooxml::LN_Value_St_ThemeColor_text1: - return 1; + return model::ThemeColorType::Light1; case NS_ooxml::LN_Value_St_ThemeColor_background2: - return 2; + return model::ThemeColorType::Dark2; case NS_ooxml::LN_Value_St_ThemeColor_text2: - return 3; + return model::ThemeColorType::Light2; default: break; } - return -1; + return model::ThemeColorType::Unknown; } void TDefTableHandler::lcl_attribute(Id rName, Value & rVal) diff --git a/writerfilter/source/dmapper/TDefTableHandler.hxx b/writerfilter/source/dmapper/TDefTableHandler.hxx index f9ae47eb5390..c997996a4f73 100644 --- a/writerfilter/source/dmapper/TDefTableHandler.hxx +++ b/writerfilter/source/dmapper/TDefTableHandler.hxx @@ -20,6 +20,8 @@ #include "LoggedResources.hxx" #include <vector> +#include <docmodel/theme/ThemeColorType.hxx> + namespace com::sun::star{ namespace table { struct BorderLine2; @@ -66,7 +68,7 @@ public: css::beans::PropertyValue getInteropGrabBag(const OUString& aName = OUString()); static OUString getBorderTypeString(sal_Int32 nType); static OUString getThemeColorTypeString(sal_Int32 nType); - static sal_Int16 getThemeColorTypeIndex(sal_Int32 nType); + static model::ThemeColorType getThemeColorTypeIndex(sal_Int32 nType); }; } diff --git a/writerfilter/source/dmapper/ThemeColorHandler.hxx b/writerfilter/source/dmapper/ThemeColorHandler.hxx new file mode 100644 index 000000000000..88ae0cfaf418 --- /dev/null +++ b/writerfilter/source/dmapper/ThemeColorHandler.hxx @@ -0,0 +1,68 @@ +/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ +/* + * This file is part of the LibreOffice project. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + * + */ + +#pragma once + +#include "LoggedResources.hxx" + +#include <com/sun/star/beans/PropertyValue.hpp> + +#include "PropertyIds.hxx" + +#include <oox/helper/grabbagstack.hxx> +#include <docmodel/uno/UnoThemeColor.hxx> + +#include <memory> +#include <optional> + +namespace writerfilter::dmapper +{ +/// Class to process all text effects like glow, textOutline, ... +class ThemeColorHandler : public LoggedProperties +{ +public: + sal_Int32 mnColor = 0; + sal_Int32 mnIndex = -1; + sal_Int32 mnTint = 0; + sal_Int32 mnShade = 0; + + explicit ThemeColorHandler() + : LoggedProperties("ThemeColorHandler") + { + } + + virtual void lcl_attribute(Id aName, Value& rValue) override + { + sal_Int32 nIntValue = rValue.getInt(); + + switch (aName) + { + case NS_ooxml::LN_CT_Color_val: + mnColor = nIntValue; + break; + case NS_ooxml::LN_CT_Color_themeColor: + mnIndex = nIntValue; + break; + + case NS_ooxml::LN_CT_Color_themeTint: + mnTint = nIntValue; + break; + + case NS_ooxml::LN_CT_Color_themeShade: + mnShade = nIntValue; + break; + } + } + + virtual void lcl_sprm(Sprm& /*sprm*/) override {} +}; +} + +/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ |