summaryrefslogtreecommitdiff
path: root/writerfilter
diff options
context:
space:
mode:
authorTomaž Vajngerl <tomaz.vajngerl@collabora.co.uk>2023-01-01 23:25:38 +0900
committerTomaž Vajngerl <quikee@gmail.com>2023-01-13 00:49:24 +0000
commit197e5f81213d14fdcbff40edf73385ecd4cd9815 (patch)
tree5bc1735ec61200a895b5edcf684d846245286ba5 /writerfilter
parentc82fa434dab8744c548db166cd24ee82e8759e1f (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.mk1
-rw-r--r--writerfilter/source/dmapper/DomainMapper.cxx119
-rw-r--r--writerfilter/source/dmapper/PropertyIds.cxx3
-rw-r--r--writerfilter/source/dmapper/PropertyIds.hxx3
-rw-r--r--writerfilter/source/dmapper/TDefTableHandler.cxx38
-rw-r--r--writerfilter/source/dmapper/TDefTableHandler.hxx4
-rw-r--r--writerfilter/source/dmapper/ThemeColorHandler.hxx68
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: */