include/editeng/unoprnms.hxx | 4 + include/editeng/unotext.hxx | 5 - oox/source/drawingml/textcharacterproperties.cxx | 6 + oox/source/token/properties.txt | 2 sw/source/filter/ww8/docxattributeoutput.cxx | 26 ++++++-- writerfilter/source/dmapper/CellColorHandler.cxx | 70 ++++++++++++++++++++++- writerfilter/source/dmapper/CellColorHandler.hxx | 15 ++++ writerfilter/source/dmapper/PropertyIds.cxx | 7 +- writerfilter/source/dmapper/PropertyIds.hxx | 3 9 files changed, 124 insertions(+), 14 deletions(-)
New commits: commit abff4459415dac99c66ad4d6b13ece6755ac37ab Author: Tomaž Vajngerl <tomaz.vajng...@collabora.co.uk> AuthorDate: Sun Jun 11 00:57:36 2023 +0900 Commit: Miklos Vajna <vmik...@collabora.com> CommitDate: Tue Jun 20 08:48:55 2023 +0200 ooxml: import and export background and fill theme colors props. This adds support to import and export background and fill theme color properties. Change-Id: I0f40615fe2d06cdcb4f2f9752602fe2ec699c7b3 Reviewed-on: https://gerrit.libreoffice.org/c/core/+/152835 Tested-by: Jenkins Reviewed-by: Tomaž Vajngerl <qui...@gmail.com> (cherry picked from commit 9e121f3a6b95dab7525aa1583f810b2b504ce1b3) Reviewed-on: https://gerrit.libreoffice.org/c/core/+/153255 Tested-by: Jenkins CollaboraOffice <jenkinscollaboraoff...@gmail.com> Reviewed-by: Miklos Vajna <vmik...@collabora.com> diff --git a/include/editeng/unoprnms.hxx b/include/editeng/unoprnms.hxx index e9fedb92d611..c38a7ecaa493 100644 --- a/include/editeng/unoprnms.hxx +++ b/include/editeng/unoprnms.hxx @@ -350,6 +350,10 @@ inline constexpr OUStringLiteral UNO_NAME_EDIT_CHAR_SHADOWED = u"CharShadowed"; inline constexpr OUStringLiteral UNO_NAME_EDIT_CHAR_UNDERLINE = u"CharUnderline"; inline constexpr OUStringLiteral UNO_NAME_EDIT_CHAR_OVERLINE = u"CharOverline"; +inline constexpr OUStringLiteral UNO_NAME_EDIT_CHAR_BACKGROUND_COLOR = u"CharBackColor"; +inline constexpr OUStringLiteral UNO_NAME_EDIT_CHAR_BACKGROUND_COMPLEX_COLOR = u"CharBackgroundComplexColor"; +inline constexpr OUStringLiteral UNO_NAME_EDIT_CHAR_BACKGROUND_TRANSPARENT = u"CharBackTransparent"; + inline constexpr OUStringLiteral UNO_NAME_BITMAP = u"Bitmap"; inline constexpr OUStringLiteral UNO_NAME_LINKDISPLAYNAME = u"LinkDisplayName"; diff --git a/include/editeng/unotext.hxx b/include/editeng/unotext.hxx index 79cbb92a3770..2e3397d392a5 100644 --- a/include/editeng/unotext.hxx +++ b/include/editeng/unotext.hxx @@ -93,8 +93,9 @@ struct SfxItemPropertyMapEntry; { UNO_NAME_EDIT_CHAR_COLOR_LUM_MOD, EE_CHAR_COLOR, ::cppu::UnoType<sal_Int16>::get(), 0, MID_COLOR_LUM_MOD }, \ { UNO_NAME_EDIT_CHAR_COLOR_LUM_OFF, EE_CHAR_COLOR, ::cppu::UnoType<sal_Int16>::get(), 0, MID_COLOR_LUM_OFF }, \ { UNO_NAME_EDIT_CHAR_COMPLEX_COLOR, EE_CHAR_COLOR, ::cppu::UnoType<css::util::XComplexColor>::get(), 0, MID_COMPLEX_COLOR }, \ - { u"CharBackColor", EE_CHAR_BKGCOLOR, ::cppu::UnoType<sal_Int32>::get(), 0, 0 }, \ - { u"CharBackTransparent", EE_CHAR_BKGCOLOR, ::cppu::UnoType<bool>::get(), 0, MID_GRAPHIC_TRANSPARENT }, \ + { UNO_NAME_EDIT_CHAR_BACKGROUND_COLOR, EE_CHAR_BKGCOLOR, ::cppu::UnoType<sal_Int32>::get(), 0, MID_COLOR_RGB }, \ + { UNO_NAME_EDIT_CHAR_BACKGROUND_COMPLEX_COLOR, EE_CHAR_BKGCOLOR, ::cppu::UnoType<css::util::XComplexColor>::get(), 0, MID_COMPLEX_COLOR }, \ + { UNO_NAME_EDIT_CHAR_BACKGROUND_TRANSPARENT, EE_CHAR_BKGCOLOR, ::cppu::UnoType<bool>::get(), 0, MID_GRAPHIC_TRANSPARENT }, \ { UNO_NAME_EDIT_CHAR_ESCAPEMENT, EE_CHAR_ESCAPEMENT, ::cppu::UnoType<sal_Int16>::get(), 0, MID_ESC }, \ { UNO_NAME_EDIT_CHAR_UNDERLINE, EE_CHAR_UNDERLINE, ::cppu::UnoType<sal_Int16>::get(), 0, MID_TL_STYLE }, \ { u"CharUnderlineColor", EE_CHAR_UNDERLINE, ::cppu::UnoType<sal_Int32>::get(), 0, MID_TL_COLOR }, \ diff --git a/oox/source/drawingml/textcharacterproperties.cxx b/oox/source/drawingml/textcharacterproperties.cxx index 1217c19441ae..c3dde4889a64 100644 --- a/oox/source/drawingml/textcharacterproperties.cxx +++ b/oox/source/drawingml/textcharacterproperties.cxx @@ -216,7 +216,11 @@ void TextCharacterProperties::pushToPropMap( PropertyMap& rPropMap, const XmlFil } if (maHighlightColor.isUsed() && maHighlightColor.getTransparency() != 100) - rPropMap.setProperty( PROP_CharBackColor, maHighlightColor.getColor( rFilter.getGraphicHelper() )); + { + rPropMap.setProperty(PROP_CharBackColor, maHighlightColor.getColor( rFilter.getGraphicHelper() )); + model::ComplexColor aComplexColor = maHighlightColor.getComplexColor(); + rPropMap.setProperty(PROP_CharBackgroundComplexColor, model::color::createXComplexColor(aComplexColor)); + } else rPropMap.setProperty( PROP_CharBackColor, sal_Int32(-1)); } diff --git a/oox/source/token/properties.txt b/oox/source/token/properties.txt index 025b0628b9d8..a6de5458b663 100644 --- a/oox/source/token/properties.txt +++ b/oox/source/token/properties.txt @@ -24,6 +24,7 @@ BackGraphicLocation BackGraphic Background BackgroundColor +BackgroundComplexColor BasicLibraries BlackDay BlockIncrement @@ -52,6 +53,7 @@ CenterHorizontally CenterVertically Change CharBackColor +CharBackgroundComplexColor CharCaseMap CharColor CharContoured diff --git a/sw/source/filter/ww8/docxattributeoutput.cxx b/sw/source/filter/ww8/docxattributeoutput.cxx index d7cb68aa9fa8..cb97a6aa0e6f 100644 --- a/sw/source/filter/ww8/docxattributeoutput.cxx +++ b/sw/source/filter/ww8/docxattributeoutput.cxx @@ -285,7 +285,9 @@ OUString NumberToHexBinary(sal_Int32 n) return aBuf.makeStringAndClear(); } -void lclAddThemeColorAttributes(rtl::Reference<sax_fastparser::FastAttributeList>& pAttrList, model::ComplexColor const& rComplexColor) +void lclAddThemeValuesToCustomAttributes( + rtl::Reference<sax_fastparser::FastAttributeList>& pAttrList, model::ComplexColor const& rComplexColor, + sal_Int32 nThemeAttrId, sal_Int32 nThemeTintAttrId, sal_Int32 nThemeShadeAttrId) { static std::unordered_map<model::ThemeColorType, const char*> constThemeColorTypeTokenMap = { { model::ThemeColorType::Dark1, "dark1" }, @@ -321,7 +323,7 @@ void lclAddThemeColorAttributes(rtl::Reference<sax_fastparser::FastAttributeList sSchemeType = "background2"; } - DocxAttributeOutput::AddToAttrList(pAttrList, FSNS(XML_w, XML_themeColor), sSchemeType.getStr()); + DocxAttributeOutput::AddToAttrList(pAttrList, FSNS(XML_w, nThemeAttrId), sSchemeType.getStr()); sal_Int16 nLumMod = 10'000; sal_Int16 nLumOff = 0; @@ -345,13 +347,13 @@ void lclAddThemeColorAttributes(rtl::Reference<sax_fastparser::FastAttributeList { // Convert from 0-100 into 0-255 sal_Int16 nTint255 = std::round(255.0 - (double(nTint) / 10000.0) * 255.0); - DocxAttributeOutput::AddToAttrList(pAttrList, FSNS(XML_w, XML_themeTint), OString::number(nTint255, 16).getStr()); + DocxAttributeOutput::AddToAttrList(pAttrList, FSNS(XML_w, nThemeTintAttrId), OString::number(nTint255, 16).getStr()); } else if (nShade != 0) { // Convert from 0-100 into 0-255 sal_Int16 nShade255 = std::round(255.0 - (double(nShade) / 10000.0) * 255.0); - DocxAttributeOutput::AddToAttrList(pAttrList, FSNS(XML_w, XML_themeShade), OString::number(nShade255, 16).getStr()); + DocxAttributeOutput::AddToAttrList(pAttrList, FSNS(XML_w, nThemeShadeAttrId), OString::number(nShade255, 16).getStr()); } } else @@ -367,13 +369,23 @@ void lclAddThemeColorAttributes(rtl::Reference<sax_fastparser::FastAttributeList sal_Int16 nTintShade255 = std::round(255.0 - (std::abs(nPercentage) / 100.0) * 255.0); if (nPercentage > 0) - DocxAttributeOutput::AddToAttrList(pAttrList, FSNS(XML_w, XML_themeTint), OString::number(nTintShade255, 16).getStr()); + DocxAttributeOutput::AddToAttrList(pAttrList, FSNS(XML_w, nThemeTintAttrId), OString::number(nTintShade255, 16).getStr()); else if (nPercentage < 0) - DocxAttributeOutput::AddToAttrList(pAttrList, FSNS(XML_w, XML_themeShade), OString::number(nTintShade255, 16).getStr()); + DocxAttributeOutput::AddToAttrList(pAttrList, FSNS(XML_w, nThemeShadeAttrId), OString::number(nTintShade255, 16).getStr()); } } } +void lclAddThemeFillColorAttributes(rtl::Reference<sax_fastparser::FastAttributeList>& pAttrList, model::ComplexColor const& rComplexColor) +{ + lclAddThemeValuesToCustomAttributes(pAttrList, rComplexColor, XML_themeFill, XML_themeFillTint, XML_themeFillShade); +} + +void lclAddThemeColorAttributes(rtl::Reference<sax_fastparser::FastAttributeList>& pAttrList, model::ComplexColor const& rComplexColor) +{ + lclAddThemeValuesToCustomAttributes(pAttrList, rComplexColor, XML_themeColor, XML_themeTint, XML_themeShade); +} + } // end anonymous namespace void DocxAttributeOutput::RTLAndCJKState( bool bIsRTL, sal_uInt16 /*nScript*/ ) @@ -9400,6 +9412,7 @@ static std::optional<sal_Int32> lcl_getDmlAlpha(const SvxBrushItem& rBrush) void DocxAttributeOutput::FormatBackground( const SvxBrushItem& rBrush ) { const Color aColor = rBrush.GetColor(); + model::ComplexColor const& rComplexColor = rBrush.getComplexColor(); OString sColor = msfilter::util::ConvertColor( aColor.GetRGBColor() ); std::optional<sal_Int32> oAlpha = lcl_getDmlAlpha(rBrush); if (m_rExport.SdrExporter().getTextFrameSyntax()) @@ -9417,6 +9430,7 @@ void DocxAttributeOutput::FormatBackground( const SvxBrushItem& rBrush ) sColor = "#" + sColor; AddToAttrList( m_rExport.SdrExporter().getFlyAttrList(), XML_fillcolor, sColor.getStr() ); + lclAddThemeFillColorAttributes(m_rExport.SdrExporter().getFlyAttrList(), rComplexColor); } else if (m_rExport.SdrExporter().getDMLTextFrameSyntax()) { diff --git a/writerfilter/source/dmapper/CellColorHandler.cxx b/writerfilter/source/dmapper/CellColorHandler.cxx index 439806e20fa8..ef4eb5dc4172 100644 --- a/writerfilter/source/dmapper/CellColorHandler.cxx +++ b/writerfilter/source/dmapper/CellColorHandler.cxx @@ -25,6 +25,7 @@ #include <filter/msfilter/util.hxx> #include <comphelper/sequence.hxx> #include <tools/color.hxx> +#include <docmodel/uno/UnoComplexColor.hxx> namespace writerfilter::dmapper { @@ -124,21 +125,27 @@ void CellColorHandler::lcl_attribute(Id rName, Value & rVal) m_nColor = nIntValue; break; case NS_ooxml::LN_CT_Shd_themeFill: + m_eFillThemeColorType = TDefTableHandler::getThemeColorTypeIndex(nIntValue); createGrabBag("themeFill", uno::Any(TDefTableHandler::getThemeColorTypeString(nIntValue))); break; case NS_ooxml::LN_CT_Shd_themeFillShade: + m_nFillThemeColorShade = nIntValue; createGrabBag("themeFillShade", uno::Any(OUString::number(nIntValue, 16))); break; case NS_ooxml::LN_CT_Shd_themeFillTint: + m_nFillThemeColorTint = nIntValue; createGrabBag("themeFillTint", uno::Any(OUString::number(nIntValue, 16))); break; case NS_ooxml::LN_CT_Shd_themeColor: + m_eThemeColorType = TDefTableHandler::getThemeColorTypeIndex(nIntValue); createGrabBag("themeColor", uno::Any(TDefTableHandler::getThemeColorTypeString(nIntValue))); break; case NS_ooxml::LN_CT_Shd_themeShade: + m_nThemeColorShade = nIntValue; createGrabBag("themeShade", uno::Any(OUString::number(nIntValue, 16))); break; case NS_ooxml::LN_CT_Shd_themeTint: + m_nThemeColorTint = nIntValue; createGrabBag("themeTint", uno::Any(OUString::number(nIntValue, 16))); break; default: @@ -281,11 +288,26 @@ TablePropertyMapPtr CellColorHandler::getProperties() pPropertyMap->Insert(PROP_FILL_STYLE, uno::Any(drawing::FillStyle_NONE)); pPropertyMap->Insert(PROP_FILL_COLOR, uno::Any(nApplyColor)); + auto xComplexColor = model::color::createXComplexColor(getFillComplexColor()); + pPropertyMap->Insert(PROP_FILL_COMPLEX_COLOR, uno::Any(xComplexColor)); } else if ( nWW8BrushStyle || !m_bAutoFillColor || m_bFillSpecified ) - pPropertyMap->Insert( m_OutputFormat == Form ? PROP_BACK_COLOR - : PROP_CHAR_BACK_COLOR, uno::Any( nApplyColor )); - + { + if (m_OutputFormat == Form) + { + pPropertyMap->Insert(PROP_BACK_COLOR, uno::Any(nApplyColor)); + } + else + { + pPropertyMap->Insert(PROP_CHAR_BACK_COLOR, uno::Any(nApplyColor)); + auto aComplexColor = getFillComplexColor(); + if (aComplexColor.getType() != model::ColorType::Unused) + { + auto xComplexColor = model::color::createXComplexColor(aComplexColor); + pPropertyMap->Insert(PROP_CHAR_BACKGROUND_COMPLEX_COLOR, uno::Any(xComplexColor)); + } + } + } createGrabBag("originalColor", uno::Any(msfilter::util::ConvertColorOU(Color(ColorTransparency, nApplyColor)))); return pPropertyMap; @@ -326,6 +348,48 @@ bool CellColorHandler::isInteropGrabBagEnabled() const return !(m_aInteropGrabBagName.isEmpty()); } +model::ComplexColor CellColorHandler::getComplexColor() const +{ + model::ComplexColor aComplexColor; + if (m_eThemeColorType != model::ThemeColorType::Unknown) + { + aComplexColor.setSchemeColor(m_eThemeColorType); + + if (m_nThemeColorTint > 0 ) + { + sal_Int16 nTint = sal_Int16((255.0 - m_nThemeColorTint) * 10000.0 / 255.0); + aComplexColor.addTransformation({model::TransformationType::Tint, nTint}); + } + if (m_nThemeColorShade > 0) + { + sal_Int16 nShade = sal_Int16((255.0 - m_nThemeColorShade) * 10000 / 255.0); + aComplexColor.addTransformation({model::TransformationType::Shade, nShade}); + } + } + return aComplexColor; +} + +model::ComplexColor CellColorHandler::getFillComplexColor() const +{ + model::ComplexColor aComplexColor; + if (m_eFillThemeColorType != model::ThemeColorType::Unknown) + { + aComplexColor.setSchemeColor(m_eFillThemeColorType); + + if (m_nFillThemeColorTint > 0 ) + { + sal_Int16 nTint = sal_Int16((255.0 - m_nFillThemeColorTint) * 10000.0 / 255.0); + aComplexColor.addTransformation({model::TransformationType::Tint, nTint}); + } + if (m_nFillThemeColorShade > 0) + { + sal_Int16 nShade = sal_Int16((255.0 - m_nFillThemeColorShade) * 10000.0 / 255.0); + aComplexColor.addTransformation({model::TransformationType::Shade, nShade}); + } + } + return aComplexColor; +} + } //namespace writerfilter /* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/writerfilter/source/dmapper/CellColorHandler.hxx b/writerfilter/source/dmapper/CellColorHandler.hxx index a011cd9fd794..418f8e1f93e4 100644 --- a/writerfilter/source/dmapper/CellColorHandler.hxx +++ b/writerfilter/source/dmapper/CellColorHandler.hxx @@ -21,7 +21,8 @@ #include "LoggedResources.hxx" #include "PropertyMap.hxx" #include <vector> - +#include <docmodel/theme/ThemeColorType.hxx> +#include <docmodel/color/ComplexColor.hxx> #include <com/sun/star/beans/PropertyValue.hpp> namespace writerfilter::dmapper @@ -33,8 +34,17 @@ public: enum OutputFormat { Form, Paragraph, Character }; // for what part of the document private: sal_Int32 m_nShadingPattern; + sal_Int32 m_nColor; + model::ThemeColorType m_eThemeColorType = model::ThemeColorType::Unknown; + sal_Int32 m_nThemeColorTint = 0; + sal_Int32 m_nThemeColorShade = 0; + sal_Int32 m_nFillColor; + model::ThemeColorType m_eFillThemeColorType = model::ThemeColorType::Unknown; + sal_Int32 m_nFillThemeColorTint = 0; + sal_Int32 m_nFillThemeColorShade = 0; + bool m_bAutoFillColor; bool m_bFillSpecified; OutputFormat m_OutputFormat; @@ -60,6 +70,9 @@ public: css::beans::PropertyValue getInteropGrabBag(); void disableInteropGrabBag(); bool isInteropGrabBagEnabled() const; + + model::ComplexColor getComplexColor() const; + model::ComplexColor getFillComplexColor() const; }; } diff --git a/writerfilter/source/dmapper/PropertyIds.cxx b/writerfilter/source/dmapper/PropertyIds.cxx index 80fec2208122..b77991581ae9 100644 --- a/writerfilter/source/dmapper/PropertyIds.cxx +++ b/writerfilter/source/dmapper/PropertyIds.cxx @@ -61,6 +61,7 @@ const OUString & getPropertyName( PropertyIds eId ) { PROP_CHAR_WEIGHT_ASIAN, u"CharWeightAsian"}, { PROP_CHAR_POSTURE_ASIAN, u"CharPostureAsian"}, { PROP_CHAR_BACK_COLOR, u"CharBackColor"}, + { PROP_CHAR_BACKGROUND_COMPLEX_COLOR, u"CharBackgroundComplexColor"}, { PROP_CHAR_EMPHASIS, u"CharEmphasis"}, { PROP_CHAR_COMBINE_IS_ON, u"CharCombineIsOn"}, { PROP_CHAR_COMBINE_PREFIX, u"CharCombinePrefix"}, @@ -169,6 +170,7 @@ const OUString & getPropertyName( PropertyIds eId ) { PROP_CONTOUR_POLY_POLYGON, u"ContourPolyPolygon"}, { PROP_PAGE_TOGGLE, u"PageToggle"}, { PROP_BACK_COLOR, u"BackColor"}, + { PROP_BACK_COMPLEX_COLOR, u"BackComplexColor"}, { PROP_BACK_COLOR_TRANSPARENCY, u"BackColorTransparency"}, { PROP_ALTERNATIVE_TEXT, u"AlternativeText"}, { PROP_HEADER_TEXT_LEFT, u"HeaderTextLeft"}, @@ -353,6 +355,7 @@ const OUString & getPropertyName( PropertyIds eId ) { PROP_FOLLOW_TEXT_FLOW, u"IsFollowingTextFlow"}, { PROP_FILL_STYLE, u"FillStyle"}, { PROP_FILL_COLOR, u"FillColor"}, + { PROP_FILL_COMPLEX_COLOR, u"FillComplexColor"}, { PROP_SNAP_TO_GRID, u"SnapToGrid"}, { PROP_GRID_SNAP_TO_CHARS, u"GridSnapToChars"}, { PROP_RUBY_STYLE, u"RubyCharStyleName"}, @@ -382,7 +385,9 @@ bool isCharacterProperty( const PropertyIds eId ) bool isParagraphProperty( const PropertyIds eId ) { - return (eId >= PROP_PARA_ADJUST && eId <= PROP_PARA_WIDOWS) || eId == PROP_FILL_COLOR; + return (eId >= PROP_PARA_ADJUST && eId <= PROP_PARA_WIDOWS) + || eId == PROP_FILL_COLOR + || eId == PROP_FILL_COMPLEX_COLOR; } } //namespace writerfilter diff --git a/writerfilter/source/dmapper/PropertyIds.hxx b/writerfilter/source/dmapper/PropertyIds.hxx index 8fbb87a44a16..3f272743db7b 100644 --- a/writerfilter/source/dmapper/PropertyIds.hxx +++ b/writerfilter/source/dmapper/PropertyIds.hxx @@ -40,6 +40,7 @@ enum PropertyIds ,PROP_ANCHOR_TYPE ,PROP_AUTOMATIC_DISTANCE ,PROP_BACK_COLOR + ,PROP_BACK_COMPLEX_COLOR ,PROP_BACK_COLOR_TRANSPARENCY ,PROP_BITMAP ,PROP_BORDER_LEFT_COMPLEX_COLOR @@ -56,6 +57,7 @@ enum PropertyIds ,PROP_CHARACTER_STYLES ,PROP_CHAR_AUTO_KERNING ,PROP_CHAR_BACK_COLOR + ,PROP_CHAR_BACKGROUND_COMPLEX_COLOR ,PROP_CHAR_CASE_MAP ,PROP_CHAR_CHAR_KERNING ,PROP_CHAR_COLOR @@ -356,6 +358,7 @@ enum PropertyIds ,PROP_FOLLOW_TEXT_FLOW ,PROP_FILL_STYLE ,PROP_FILL_COLOR + ,PROP_FILL_COMPLEX_COLOR ,PROP_SNAP_TO_GRID ,PROP_GRID_SNAP_TO_CHARS ,PROP_RUBY_STYLE