include/editeng/unoprnms.hxx | 1 include/oox/export/drawingml.hxx | 2 include/svx/ColorSets.hxx | 2 include/svx/unoshprp.hxx | 1 oox/inc/drawingml/lineproperties.hxx | 3 oox/qa/unit/data/ThemeShapesReference.pptx |binary oox/qa/unit/drawingml.cxx | 72 ++++++++++++++++++- oox/source/drawingml/clrscheme.cxx | 24 +++--- oox/source/drawingml/lineproperties.cxx | 34 ++++++++- oox/source/drawingml/shape.cxx | 4 - oox/source/export/drawingml.cxx | 62 +++------------- oox/source/token/properties.txt | 1 sd/source/core/stlsheet.cxx | 10 ++ svx/source/styles/ColorSets.cxx | 109 +++++++++-------------------- svx/source/table/cell.cxx | 12 ++- svx/source/unodraw/unoshape.cxx | 10 ++ svx/source/xoutdev/xattr.cxx | 44 +++++++++-- 17 files changed, 241 insertions(+), 150 deletions(-)
New commits: commit 80795935980abd9a2b255b8f963691f199d1363f Author: Tomaž Vajngerl <tomaz.vajng...@collabora.co.uk> AuthorDate: Thu Jan 5 14:46:30 2023 +0900 Commit: Tomaž Vajngerl <qui...@gmail.com> CommitDate: Wed Jan 18 12:58:01 2023 +0000 svx: change ColorSet add method to use ThemeColorTyp enum Change-Id: I2034a7e915d41c6b55c8344d44be4f6a60e8287e Reviewed-on: https://gerrit.libreoffice.org/c/core/+/145072 Tested-by: Tomaž Vajngerl <qui...@gmail.com> Reviewed-by: Tomaž Vajngerl <qui...@gmail.com> (cherry picked from commit 0b35b239c0ff1adad2c4544d8692b5b13a0d363b) Reviewed-on: https://gerrit.libreoffice.org/c/core/+/145652 diff --git a/include/svx/ColorSets.hxx b/include/svx/ColorSets.hxx index 030ee8bf934f..625bcc62274e 100644 --- a/include/svx/ColorSets.hxx +++ b/include/svx/ColorSets.hxx @@ -36,7 +36,7 @@ class SVXCORE_DLLPUBLIC ColorSet public: ColorSet(OUString const& rName); - void add(sal_uInt32 nIndex, Color aColorData); + void add(model::ThemeColorType Type, Color aColorData); const OUString& getName() const { diff --git a/oox/source/drawingml/clrscheme.cxx b/oox/source/drawingml/clrscheme.cxx index 225faf81eecf..b335c7655efc 100644 --- a/oox/source/drawingml/clrscheme.cxx +++ b/oox/source/drawingml/clrscheme.cxx @@ -127,21 +127,21 @@ void ClrScheme::fill(svx::ColorSet& rColorSet) const switch (nToken) { case XML_tx1: - case XML_dk1: rColorSet.add(0, rColor); break; + case XML_dk1: rColorSet.add(model::ThemeColorType::Dark1, rColor); break; case XML_bg1: - case XML_lt1: rColorSet.add(1, rColor); break; + case XML_lt1: rColorSet.add(model::ThemeColorType::Light1, rColor); break; case XML_tx2: - case XML_dk2: rColorSet.add(2, rColor); break; + case XML_dk2: rColorSet.add(model::ThemeColorType::Dark2, rColor); break; case XML_bg2: - case XML_lt2: rColorSet.add(3, rColor); break; - case XML_accent1: rColorSet.add(4, rColor); break; - case XML_accent2: rColorSet.add(5, rColor); break; - case XML_accent3: rColorSet.add(6, rColor); break; - case XML_accent4: rColorSet.add(7, rColor); break; - case XML_accent5: rColorSet.add(8, rColor); break; - case XML_accent6: rColorSet.add(9, rColor); break; - case XML_hlink: rColorSet.add(10, rColor); break; - case XML_folHlink: rColorSet.add(11, rColor); break; + case XML_lt2: rColorSet.add(model::ThemeColorType::Light2, rColor); break; + case XML_accent1: rColorSet.add(model::ThemeColorType::Accent1, rColor); break; + case XML_accent2: rColorSet.add(model::ThemeColorType::Accent2, rColor); break; + case XML_accent3: rColorSet.add(model::ThemeColorType::Accent3, rColor); break; + case XML_accent4: rColorSet.add(model::ThemeColorType::Accent4, rColor); break; + case XML_accent5: rColorSet.add(model::ThemeColorType::Accent5, rColor); break; + case XML_accent6: rColorSet.add(model::ThemeColorType::Accent6, rColor); break; + case XML_hlink: rColorSet.add(model::ThemeColorType::Hyperlink, rColor); break; + case XML_folHlink: rColorSet.add(model::ThemeColorType::FollowedHyperlink, rColor); break; default: break; } } diff --git a/svx/source/styles/ColorSets.cxx b/svx/source/styles/ColorSets.cxx index c8102de7606c..1cc9e5ed44cf 100644 --- a/svx/source/styles/ColorSets.cxx +++ b/svx/source/styles/ColorSets.cxx @@ -120,9 +120,11 @@ ColorSet::ColorSet(OUString const & rName) : maName(rName) {} -void ColorSet::add(sal_uInt32 nIndex, Color aColorData) +void ColorSet::add(model::ThemeColorType eType, Color aColorData) { - maColors[nIndex] = aColorData; + if (eType == model::ThemeColorType::Unknown) + return; + maColors[sal_Int16(eType)] = aColorData; } void ColorSet::dumpAsXml(xmlTextWriterPtr pWriter) const @@ -152,70 +154,22 @@ ColorSets::~ColorSets() void ColorSets::init() { - { + //{ ColorSet aColorSet("Breeze"); - aColorSet.add(0, 0xFCFCFC); - aColorSet.add(1, 0x232629); - aColorSet.add(2, 0xEFF0F1); - aColorSet.add(3, 0x31363B); - aColorSet.add(4, 0xDA4453); - aColorSet.add(5, 0xF47750); - aColorSet.add(6, 0xFDBC4B); - aColorSet.add(7, 0xC9CE3B); - aColorSet.add(8, 0x1CDC9A); - aColorSet.add(9, 0x2ECC71); - aColorSet.add(10, 0x1D99F3); - aColorSet.add(11, 0x3DAEE9); - maColorSets.push_back(aColorSet); - } - { - ColorSet aColorSet("Material Blue"); - aColorSet.add(0, 0xFFFFFF); - aColorSet.add(1, 0x212121); - aColorSet.add(2, 0xECEFF1); - aColorSet.add(3, 0x37474F); - aColorSet.add(4, 0x7986CB); - aColorSet.add(5, 0x303F9F); - aColorSet.add(6, 0x64B5F6); - aColorSet.add(7, 0x1976D2); - aColorSet.add(8, 0x4FC3F7); - aColorSet.add(9, 0x0277BD); - aColorSet.add(10, 0x4DD0E1); - aColorSet.add(11, 0x0097A7); - maColorSets.push_back(aColorSet); - } - { - ColorSet aColorSet("Material Red"); - aColorSet.add(0, 0xFFFFFF); - aColorSet.add(1, 0x212121); - aColorSet.add(2, 0xF5F5F5); - aColorSet.add(3, 0x424242); - aColorSet.add(4, 0xFF9800); - aColorSet.add(5, 0xFF6D00); - aColorSet.add(6, 0xFF5722); - aColorSet.add(7, 0xDD2C00); - aColorSet.add(8, 0xF44336); - aColorSet.add(9, 0xD50000); - aColorSet.add(10, 0xE91E63); - aColorSet.add(11, 0xC51162); - maColorSets.push_back(aColorSet); - } - { - ColorSet aColorSet("Material Green"); - aColorSet.add(0, 0xFFFFFF); - aColorSet.add(1, 0x212121); - aColorSet.add(2, 0xF5F5F5); - aColorSet.add(3, 0x424242); - aColorSet.add(4, 0x009688); - aColorSet.add(5, 0x00bfa5); - aColorSet.add(6, 0x4caf50); - aColorSet.add(7, 0x00c853); - aColorSet.add(8, 0x8bc34a); - aColorSet.add(9, 0x64dd17); - aColorSet.add(10, 0xcddc39); - aColorSet.add(11, 0xaeea00); + aColorSet.add(model::ThemeColorType::Dark1, 0x232629); + aColorSet.add(model::ThemeColorType::Light1, 0xFCFCFC); + aColorSet.add(model::ThemeColorType::Dark2, 0x31363B); + aColorSet.add(model::ThemeColorType::Light2, 0xEFF0F1); + aColorSet.add(model::ThemeColorType::Accent1, 0xDA4453); + aColorSet.add(model::ThemeColorType::Accent2, 0xF47750); + aColorSet.add(model::ThemeColorType::Accent3, 0xFDBC4B); + aColorSet.add(model::ThemeColorType::Accent4, 0xC9CE3B); + aColorSet.add(model::ThemeColorType::Accent5, 0x1CDC9A); + aColorSet.add(model::ThemeColorType::Accent6, 0x2ECC71); + aColorSet.add(model::ThemeColorType::Hyperlink, 0x1D99F3); + aColorSet.add(model::ThemeColorType::FollowedHyperlink, 0x3DAEE9); maColorSets.push_back(aColorSet); - } + //} } const ColorSet& ColorSets::getColorSet(std::u16string_view rName) @@ -273,8 +227,11 @@ void Theme::ToAny(css::uno::Any& rVal) const std::vector<util::Color> aColorScheme; for (auto eThemeColorType : o3tl::enumrange<model::ThemeColorType>()) { - Color aColor = mpColorSet->getColor(eThemeColorType); - aColorScheme.push_back(sal_Int32(aColor)); + if (eThemeColorType != model::ThemeColorType::Unknown) + { + Color aColor = mpColorSet->getColor(eThemeColorType); + aColorScheme.push_back(sal_Int32(aColor)); + } } aMap["ColorSchemeName"] <<= mpColorSet->getName(); @@ -313,15 +270,20 @@ std::unique_ptr<Theme> Theme::FromAny(const css::uno::Any& rVal) { uno::Sequence<util::Color> aColors; it->second >>= aColors; - for (size_t i = 0; i < aColors.size(); ++i) + + SAL_WARN_IF(aColors.size() > 12, "svx", "Theme::FromAny: number of colors greater than max theme colors supported"); + + for (auto eThemeColorType : o3tl::enumrange<model::ThemeColorType>()) { - if (i >= 12) + if (eThemeColorType != model::ThemeColorType::Unknown) { - SAL_WARN("svx", "Theme::FromAny: too many colors in the color set"); - break; + size_t nIndex(static_cast<sal_Int16>(eThemeColorType)); + if (nIndex < aColors.size()) + { + Color aColor(ColorTransparency, aColors[nIndex]); + pColorSet->add(eThemeColorType, aColor); + } } - - pColorSet->add(i, Color(ColorTransparency, aColors[i])); } } @@ -354,7 +316,8 @@ std::vector<Color> Theme::GetColors() const std::vector<Color> aColors; for (auto eThemeColorType : o3tl::enumrange<model::ThemeColorType>()) { - aColors.push_back(mpColorSet->getColor(eThemeColorType)); + if (eThemeColorType != model::ThemeColorType::Unknown) + aColors.push_back(mpColorSet->getColor(eThemeColorType)); } return aColors; } commit 8cec5a700a36ad6d3ac6b054a3366b22354d7f1d Author: Tomaž Vajngerl <tomaz.vajng...@collabora.co.uk> AuthorDate: Thu Jan 5 13:12:34 2023 +0900 Commit: Tomaž Vajngerl <qui...@gmail.com> CommitDate: Wed Jan 18 12:57:51 2023 +0000 support theme color for lines + oox support + tests Extended XLineColor to handle model::ThemeColor which then maps to the newly added LineColorThemeData property. Extended oox import and export to map the scheme color elements to and from ThemeColor. Added a new test to check the theme line color in impress shapes. Change-Id: I23ecc18c88b5b47608c9110f5681f189d02e2f36 Reviewed-on: https://gerrit.libreoffice.org/c/core/+/145071 Tested-by: Jenkins Reviewed-by: Tomaž Vajngerl <qui...@gmail.com> (cherry picked from commit af8fdba1194e657237f9abc460381a1c4bc49982) Reviewed-on: https://gerrit.libreoffice.org/c/core/+/145651 Tested-by: Tomaž Vajngerl <qui...@gmail.com> diff --git a/include/editeng/unoprnms.hxx b/include/editeng/unoprnms.hxx index 77d4636bb14f..a85afe0788f8 100644 --- a/include/editeng/unoprnms.hxx +++ b/include/editeng/unoprnms.hxx @@ -77,6 +77,7 @@ #define UNO_NAME_LINEDASH "LineDash" #define UNO_NAME_LINEWIDTH "LineWidth" #define UNO_NAME_LINECOLOR "LineColor" +#define UNO_NAME_LINECOLOR_THEME_REFERENCE "LineColorThemeReference" #define UNO_NAME_LINEJOINT "LineJoint" #define UNO_NAME_LINESTART "LineStart" #define UNO_NAME_LINEEND "LineEnd" diff --git a/include/oox/export/drawingml.hxx b/include/oox/export/drawingml.hxx index f2ef8c910da0..65c9112ab497 100644 --- a/include/oox/export/drawingml.hxx +++ b/include/oox/export/drawingml.hxx @@ -230,7 +230,7 @@ public: void WriteConnectorConnections( EscherConnectorListEntry& rConnectorEntry, sal_Int32 nStartID, sal_Int32 nEndID ); bool WriteCharColor(const css::uno::Reference<css::beans::XPropertySet>& xPropertySet); - bool WriteFillColor(const css::uno::Reference<css::beans::XPropertySet>& xPropertySet); + bool WriteSchemeColor(OUString const& rPropertyName, const css::uno::Reference<css::beans::XPropertySet>& xPropertySet); void WriteSolidFill( ::Color nColor, sal_Int32 nAlpha = MAX_PERCENT ); void WriteSolidFill( const OUString& sSchemeName, const css::uno::Sequence< css::beans::PropertyValue >& aTransformations, sal_Int32 nAlpha = MAX_PERCENT ); diff --git a/include/svx/unoshprp.hxx b/include/svx/unoshprp.hxx index fec53929fb80..357655c5e71a 100644 --- a/include/svx/unoshprp.hxx +++ b/include/svx/unoshprp.hxx @@ -236,6 +236,7 @@ #define LINE_PROPERTIES_DEFAULTS\ { u"" UNO_NAME_LINECAP, XATTR_LINECAP, ::cppu::UnoType<css::drawing::LineCap>::get(), 0, 0}, \ { u"" UNO_NAME_LINECOLOR, XATTR_LINECOLOR, ::cppu::UnoType<sal_Int32>::get() , 0, 0}, \ + { u"" UNO_NAME_LINECOLOR_THEME_REFERENCE, XATTR_LINECOLOR, ::cppu::UnoType<css::uno::XInterface>::get() , 0, MID_COLOR_THEME_REFERENCE}, \ { u"" UNO_NAME_LINEENDCENTER, XATTR_LINEENDCENTER, cppu::UnoType<bool>::get() , 0, 0}, \ { u"" UNO_NAME_LINEENDWIDTH, XATTR_LINEENDWIDTH, ::cppu::UnoType<sal_Int32>::get() , 0, 0, PropertyMoreFlags::METRIC_ITEM}, \ { u"" UNO_NAME_LINEJOINT, XATTR_LINEJOINT, ::cppu::UnoType<css::drawing::LineJoint>::get(), 0, 0}, \ diff --git a/oox/inc/drawingml/lineproperties.hxx b/oox/inc/drawingml/lineproperties.hxx index 214aadba12e9..d2025515b67e 100644 --- a/oox/inc/drawingml/lineproperties.hxx +++ b/oox/inc/drawingml/lineproperties.hxx @@ -69,7 +69,8 @@ struct LineProperties void pushToPropMap( ShapePropertyMap& rPropMap, const GraphicHelper& rGraphicHelper, - ::Color nPhClr = API_RGB_TRANSPARENT ) const; + ::Color nPhClr = API_RGB_TRANSPARENT, + sal_Int16 nPhClrTheme = -1) const; /** Calculates the line style attribute from the internal state of the object */ css::drawing::LineStyle getLineStyle() const; diff --git a/oox/qa/unit/data/ThemeShapesReference.pptx b/oox/qa/unit/data/ThemeShapesReference.pptx new file mode 100644 index 000000000000..d871cc56a099 Binary files /dev/null and b/oox/qa/unit/data/ThemeShapesReference.pptx differ diff --git a/oox/qa/unit/drawingml.cxx b/oox/qa/unit/drawingml.cxx index 077ad261e620..db9db658ac48 100644 --- a/oox/qa/unit/drawingml.cxx +++ b/oox/qa/unit/drawingml.cxx @@ -509,7 +509,7 @@ CPPUNIT_TEST_FIXTURE(OoxDrawingmlTest, testTdf132557_footerCustomShapes) xShapeSlideNum->getShapeType()); } -CPPUNIT_TEST_FIXTURE(OoxDrawingmlTest, testThemeTint) +CPPUNIT_TEST_FIXTURE(OoxDrawingmlTest, testThemeColorTint_Table) { // Given a document with a table style, using theme color with tinting in the A2 cell: OUString aURL = m_directories.getURLFromSrc(DATA_DIRECTORY) + "theme-tint.pptx"; @@ -557,6 +557,76 @@ CPPUNIT_TEST_FIXTURE(OoxDrawingmlTest, testThemeTint) } } +CPPUNIT_TEST_FIXTURE(OoxDrawingmlTest, testThemeColor_Shape) +{ + // Given a document with a table style, using theme color with tinting in the A2 cell: + OUString aURL = m_directories.getURLFromSrc(DATA_DIRECTORY) + "ThemeShapesReference.pptx"; + load(aURL); + + // Then make sure that we only import theming info to the doc model if the effects are limited + // to lum mod / off that we can handle (i.e. no tint/shade): + uno::Reference<drawing::XDrawPagesSupplier> xDrawPagesSupplier(getComponent(), uno::UNO_QUERY); + uno::Reference<drawing::XDrawPage> xDrawPage(xDrawPagesSupplier->getDrawPages()->getByIndex(0), + uno::UNO_QUERY); + + // check line and fill theme color of shape1 + { + model::ThemeColor aThemeColor; + uno::Reference<util::XThemeColor> xThemeColor; + uno::Reference<beans::XPropertySet> xShape(xDrawPage->getByIndex(0), uno::UNO_QUERY); + + CPPUNIT_ASSERT(xShape->getPropertyValue("FillColorThemeReference") >>= xThemeColor); + CPPUNIT_ASSERT(xThemeColor.is()); + model::theme::setFromXThemeColor(aThemeColor, xThemeColor); + CPPUNIT_ASSERT_EQUAL(model::ThemeColorType::Accent6, aThemeColor.getType()); + { + auto const& rTrans = aThemeColor.getTransformations(); + CPPUNIT_ASSERT_EQUAL(size_t(2), rTrans.size()); + CPPUNIT_ASSERT_EQUAL(model::TransformationType::LumMod, rTrans[0].meType); + CPPUNIT_ASSERT_EQUAL(sal_Int16(4000), rTrans[0].mnValue); + CPPUNIT_ASSERT_EQUAL(model::TransformationType::LumOff, rTrans[1].meType); + CPPUNIT_ASSERT_EQUAL(sal_Int16(6000), rTrans[1].mnValue); + } + + CPPUNIT_ASSERT(xShape->getPropertyValue("LineColorThemeReference") >>= xThemeColor); + CPPUNIT_ASSERT(xThemeColor.is()); + model::theme::setFromXThemeColor(aThemeColor, xThemeColor); + CPPUNIT_ASSERT_EQUAL(model::ThemeColorType::Accent6, aThemeColor.getType()); + { + auto const& rTrans = aThemeColor.getTransformations(); + CPPUNIT_ASSERT_EQUAL(size_t(1), rTrans.size()); + CPPUNIT_ASSERT_EQUAL(model::TransformationType::LumMod, rTrans[0].meType); + CPPUNIT_ASSERT_EQUAL(sal_Int16(5000), rTrans[0].mnValue); + } + } + // check line and fill theme color of shape2 + { + model::ThemeColor aThemeColor; + uno::Reference<util::XThemeColor> xThemeColor; + uno::Reference<beans::XPropertySet> xShape(xDrawPage->getByIndex(1), uno::UNO_QUERY); + + CPPUNIT_ASSERT(xShape->getPropertyValue("FillColorThemeReference") >>= xThemeColor); + CPPUNIT_ASSERT(xThemeColor.is()); + model::theme::setFromXThemeColor(aThemeColor, xThemeColor); + CPPUNIT_ASSERT_EQUAL(model::ThemeColorType::Accent1, aThemeColor.getType()); + { + auto const& rTrans = aThemeColor.getTransformations(); + CPPUNIT_ASSERT_EQUAL(size_t(0), rTrans.size()); + } + + CPPUNIT_ASSERT(xShape->getPropertyValue("LineColorThemeReference") >>= xThemeColor); + CPPUNIT_ASSERT(xThemeColor.is()); + model::theme::setFromXThemeColor(aThemeColor, xThemeColor); + CPPUNIT_ASSERT_EQUAL(model::ThemeColorType::Accent1, aThemeColor.getType()); + { + auto const& rTrans = aThemeColor.getTransformations(); + CPPUNIT_ASSERT_EQUAL(size_t(1), rTrans.size()); + CPPUNIT_ASSERT_EQUAL(model::TransformationType::LumMod, rTrans[0].meType); + CPPUNIT_ASSERT_EQUAL(sal_Int16(7500), rTrans[0].mnValue); + } + } +} + CPPUNIT_PLUGIN_IMPLEMENT(); /* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/oox/source/drawingml/lineproperties.cxx b/oox/source/drawingml/lineproperties.cxx index dedde505e61a..0c4100bcd91c 100644 --- a/oox/source/drawingml/lineproperties.cxx +++ b/oox/source/drawingml/lineproperties.cxx @@ -34,6 +34,9 @@ #include <oox/helper/containerhelper.hxx> #include <oox/helper/graphichelper.hxx> #include <oox/token/tokens.hxx> +#include <oox/token/properties.hxx> +#include <docmodel/uno/UnoThemeColor.hxx> + using namespace ::com::sun::star; using namespace ::com::sun::star::beans; @@ -431,7 +434,7 @@ void LineProperties::assignUsed( const LineProperties& rSourceProps ) } void LineProperties::pushToPropMap( ShapePropertyMap& rPropMap, - const GraphicHelper& rGraphicHelper, ::Color nPhClr ) const + const GraphicHelper& rGraphicHelper, ::Color nPhClr, sal_Int16 nPhClrTheme) const { // line fill type must exist, otherwise ignore other properties if( !maLineFill.moFillType.has() ) @@ -491,11 +494,36 @@ void LineProperties::pushToPropMap( ShapePropertyMap& rPropMap, // line color and transparence Color aLineColor = maLineFill.getBestSolidColor(); - if( aLineColor.isUsed() ) + if (aLineColor.isUsed()) { - rPropMap.setProperty( ShapeProperty::LineColor, aLineColor.getColor( rGraphicHelper, nPhClr ) ); + ::Color aColor = aLineColor.getColor(rGraphicHelper, nPhClr); + rPropMap.setProperty(ShapeProperty::LineColor, aColor); if( aLineColor.hasTransparency() ) rPropMap.setProperty( ShapeProperty::LineTransparency, aLineColor.getTransparency() ); + + model::ThemeColor aThemeColor; + + if (aColor == nPhClr) + { + aThemeColor.setType(model::convertToThemeColorType(nPhClrTheme)); + rPropMap.setProperty(PROP_LineColorThemeReference, model::theme::createXThemeColor(aThemeColor)); + } + else + { + aThemeColor.setType(model::convertToThemeColorType(aLineColor.getSchemeColorIndex())); + if (aLineColor.getLumMod() != 10000) + aThemeColor.addTransformation({model::TransformationType::LumMod, aLineColor.getLumMod()}); + if (aLineColor.getLumOff() != 0) + aThemeColor.addTransformation({model::TransformationType::LumOff, aLineColor.getLumOff()}); + if (aLineColor.getTintOrShade() > 0) + aThemeColor.addTransformation({model::TransformationType::Tint, aLineColor.getTintOrShade()}); + if (aLineColor.getTintOrShade() < 0) + { + sal_Int16 nShade = o3tl::narrowing<sal_Int16>(-aLineColor.getTintOrShade()); + aThemeColor.addTransformation({model::TransformationType::Shade, nShade}); + } + rPropMap.setProperty(PROP_LineColorThemeReference, model::theme::createXThemeColor(aThemeColor)); + } } // line markers diff --git a/oox/source/drawingml/shape.cxx b/oox/source/drawingml/shape.cxx index 2343f8b3b027..c1af364f85ac 100644 --- a/oox/source/drawingml/shape.cxx +++ b/oox/source/drawingml/shape.cxx @@ -1058,6 +1058,7 @@ Reference< XShape > const & Shape::createAndInsert( ::Color nLinePhClr(ColorTransparency, 0xffffffff); ::Color nFillPhClr(ColorTransparency, 0xffffffff); sal_Int16 nFillPhClrTheme = -1; + sal_Int16 nLinePhClrTheme = -1; // TODO: use ph color when applying effect properties //sal_Int32 nEffectPhClr = -1; @@ -1074,6 +1075,7 @@ Reference< XShape > const & Shape::createAndInsert( if( const LineProperties* pLineProps = pTheme->getLineStyle( pLineRef->mnThemedIdx ) ) aLineProperties.assignUsed( *pLineProps ); nLinePhClr = pLineRef->maPhClr.getColor( rGraphicHelper ); + nLinePhClrTheme = pLineRef->maPhClr.getSchemeColorIndex(); // Store style-related properties to InteropGrabBag to be able to export them back uno::Sequence<beans::PropertyValue> aProperties = comphelper::InitPropertySequence( @@ -1166,7 +1168,7 @@ Reference< XShape > const & Shape::createAndInsert( if(!bIsCroppedGraphic) aFillProperties.pushToPropMap( aShapeProps, rGraphicHelper, mnRotation, nFillPhClr, nFillPhClrTheme, mbFlipH, mbFlipV, bIsCustomShape ); LineProperties aLineProperties = getActualLineProperties(pTheme); - aLineProperties.pushToPropMap( aShapeProps, rGraphicHelper, nLinePhClr ); + aLineProperties.pushToPropMap( aShapeProps, rGraphicHelper, nLinePhClr, nLinePhClrTheme); EffectProperties aEffectProperties = getActualEffectProperties(pTheme); // TODO: use ph color when applying effect properties aEffectProperties.pushToPropMap( aShapeProps, rGraphicHelper ); diff --git a/oox/source/export/drawingml.cxx b/oox/source/export/drawingml.cxx index 0db7abf2c8ef..da43043bd9c5 100644 --- a/oox/source/export/drawingml.cxx +++ b/oox/source/export/drawingml.cxx @@ -418,49 +418,6 @@ void DrawingML::WriteColorTransformations( const Sequence< PropertyValue >& aTra } } -bool DrawingML::WriteCharColor(const css::uno::Reference<css::beans::XPropertySet>& xPropertySet) -{ - if (!xPropertySet->getPropertySetInfo()->hasPropertyByName("CharColorThemeReference")) - return false; - - uno::Reference<util::XThemeColor> xThemeColor; - xPropertySet->getPropertyValue("CharColorThemeReference") >>= xThemeColor; - if (!xThemeColor.is()) - return false; - - model::ThemeColor aThemeColor; - model::theme::setFromXThemeColor(aThemeColor, xThemeColor); - if (aThemeColor.getType() == model::ThemeColorType::Unknown) - return false; - const char* pColorName = g_aPredefinedClrNames[sal_Int16(aThemeColor.getType())]; - mpFS->startElementNS(XML_a, XML_solidFill); - mpFS->startElementNS(XML_a, XML_schemeClr, XML_val, pColorName); - for (auto const& rTransform : aThemeColor.getTransformations()) - { - switch (rTransform.meType) - { - case model::TransformationType::LumMod: - mpFS->singleElementNS(XML_a, XML_lumMod, XML_val, OString::number(rTransform.mnValue * 10)); - break; - case model::TransformationType::LumOff: - mpFS->singleElementNS(XML_a, XML_lumOff, XML_val, OString::number(rTransform.mnValue * 10)); - break; - case model::TransformationType::Tint: - mpFS->singleElementNS(XML_a, XML_tint, XML_val, OString::number(rTransform.mnValue * 10)); - break; - case model::TransformationType::Shade: - mpFS->singleElementNS(XML_a, XML_shade, XML_val, OString::number(rTransform.mnValue * 10)); - break; - default: - break; - } - } - mpFS->endElementNS(XML_a, XML_schemeClr); - mpFS->endElementNS(XML_a, XML_solidFill); - - return true; -} - void DrawingML::WriteSolidFill( ::Color nColor, sal_Int32 nAlpha ) { mpFS->startElementNS(XML_a, XML_solidFill); @@ -553,7 +510,7 @@ void DrawingML::WriteSolidFill( const Reference< XPropertySet >& rXPropSet ) else if ( nFillColor != nOriginalColor ) { // the user has set a different color for the shape - if (!WriteFillColor(rXPropSet)) + if (!WriteSchemeColor(u"FillColorThemeReference", rXPropSet)) { WriteSolidFill(::Color(ColorTransparency, nFillColor & 0xffffff), nAlpha); } @@ -571,13 +528,13 @@ void DrawingML::WriteSolidFill( const Reference< XPropertySet >& rXPropSet ) } } -bool DrawingML::WriteFillColor(const uno::Reference<beans::XPropertySet>& xPropertySet) +bool DrawingML::WriteSchemeColor(OUString const& rPropertyName, const uno::Reference<beans::XPropertySet>& xPropertySet) { - if (!xPropertySet->getPropertySetInfo()->hasPropertyByName("FillColorThemeReference")) + if (!xPropertySet->getPropertySetInfo()->hasPropertyByName(rPropertyName)) return false; uno::Reference<util::XThemeColor> xThemeColor; - xPropertySet->getPropertyValue("FillColorThemeReference") >>= xThemeColor; + xPropertySet->getPropertyValue(rPropertyName) >>= xThemeColor; if (!xThemeColor.is()) return false; @@ -598,6 +555,12 @@ bool DrawingML::WriteFillColor(const uno::Reference<beans::XPropertySet>& xPrope case model::TransformationType::LumOff: mpFS->singleElementNS(XML_a, XML_lumOff, XML_val, OString::number(rTransform.mnValue * 10)); break; + case model::TransformationType::Tint: + mpFS->singleElementNS(XML_a, XML_tint, XML_val, OString::number(rTransform.mnValue * 10)); + break; + case model::TransformationType::Shade: + mpFS->singleElementNS(XML_a, XML_shade, XML_val, OString::number(rTransform.mnValue * 10)); + break; default: break; } @@ -1058,7 +1021,8 @@ void DrawingML::WriteOutline( const Reference<XPropertySet>& rXPropSet, Referenc if( nColor != nOriginalColor ) { // the user has set a different color for the line - WriteSolidFill( nColor, nColorAlpha ); + if (!WriteSchemeColor(u"LineColorThemeReference", rXPropSet)) + WriteSolidFill(nColor, nColorAlpha); } else if( !sColorFillScheme.isEmpty() ) { @@ -2260,7 +2224,7 @@ void DrawingML::WriteRunProperties( const Reference< XPropertySet >& rRun, bool { color.SetAlpha(255); // TODO: special handle embossed/engraved - if (!WriteCharColor(rXPropSet)) + if (!WriteSchemeColor(u"CharColorThemeReference", rXPropSet)) { WriteSolidFill(color, nTransparency); } diff --git a/oox/source/token/properties.txt b/oox/source/token/properties.txt index 7b504bd529bf..e31885499992 100644 --- a/oox/source/token/properties.txt +++ b/oox/source/token/properties.txt @@ -315,6 +315,7 @@ LeftPageHeaderContent LegacyFragment LineCap LineColor +LineColorThemeReference LineCount LineDash LineDashName diff --git a/sd/source/core/stlsheet.cxx b/sd/source/core/stlsheet.cxx index 19f62ffd3140..cb1de01f1659 100644 --- a/sd/source/core/stlsheet.cxx +++ b/sd/source/core/stlsheet.cxx @@ -40,6 +40,7 @@ #include <svx/xflbmtit.hxx> #include <svx/xflbstit.hxx> +#include <svx/xlnclit.hxx> #include <editeng/bulletitem.hxx> #include <editeng/lrspitem.hxx> #include <svx/unoshprp.hxx> @@ -1363,6 +1364,15 @@ PropertyState SAL_CALL SdStyleSheet::getPropertyState( const OUString& PropertyN } } break; + case XATTR_LINECOLOR: + if (pEntry->nMemberId == MID_COLOR_THEME_REFERENCE) + { + auto const* pColor = rStyleSet.GetItem<XLineColorItem>(pEntry->nWID); + if (pColor->GetThemeColor().getType() == model::ThemeColorType::Unknown) + { + eState = PropertyState_DEFAULT_VALUE; + } + } break; } } diff --git a/svx/source/table/cell.cxx b/svx/source/table/cell.cxx index 89c2113fd4f4..8aef7510e45a 100644 --- a/svx/source/table/cell.cxx +++ b/svx/source/table/cell.cxx @@ -55,6 +55,7 @@ #include <editeng/charrotateitem.hxx> #include <svx/xflbstit.hxx> #include <svx/xflbmtit.hxx> +#include <svx/xlnclit.hxx> #include <svx/svdpool.hxx> #include <svx/xflclit.hxx> #include <tools/diagnose_ex.h> @@ -1444,7 +1445,6 @@ PropertyState SAL_CALL Cell::getPropertyState( const OUString& PropertyName ) } break; case XATTR_FILLCOLOR: - if (pMap->nMemberId == MID_COLOR_THEME_INDEX) { const XFillColorItem* pColor = rSet.GetItem<XFillColorItem>(pMap->nWID); @@ -1490,6 +1490,16 @@ PropertyState SAL_CALL Cell::getPropertyState( const OUString& PropertyName ) } } break; + case XATTR_LINECOLOR: + if (pMap->nMemberId == MID_COLOR_THEME_REFERENCE) + { + auto const* pColor = rSet.GetItem<XLineColorItem>(pMap->nWID); + if (pColor->GetThemeColor().getType() == model::ThemeColorType::Unknown) + { + eState = PropertyState_DEFAULT_VALUE; + } + } + break; } } } diff --git a/svx/source/unodraw/unoshape.cxx b/svx/source/unodraw/unoshape.cxx index 1f02b0c97c31..5cc292621bfa 100644 --- a/svx/source/unodraw/unoshape.cxx +++ b/svx/source/unodraw/unoshape.cxx @@ -42,6 +42,7 @@ #include <svx/xflbmtit.hxx> #include <svx/xlnstit.hxx> #include <svx/xlnedit.hxx> +#include <svx/xlnclit.hxx> #include <svx/svdmodel.hxx> #include <svx/svdobjkind.hxx> #include <svx/unopage.hxx> @@ -2086,6 +2087,15 @@ beans::PropertyState SvxShape::_getPropertyState( const OUString& PropertyName ) } } break; + case XATTR_LINECOLOR: + if (pMap->nMemberId == MID_COLOR_THEME_REFERENCE) + { + auto const* pColor = rSet.GetItem<XLineColorItem>(pMap->nWID); + if (pColor->GetThemeColor().getType() == model::ThemeColorType::Unknown) + { + eState = beans::PropertyState_DEFAULT_VALUE; + } + } break; } } diff --git a/svx/source/xoutdev/xattr.cxx b/svx/source/xoutdev/xattr.cxx index d5da15155815..608829503d16 100644 --- a/svx/source/xoutdev/xattr.cxx +++ b/svx/source/xoutdev/xattr.cxx @@ -990,19 +990,49 @@ bool XLineColorItem::GetPresentation return true; } -bool XLineColorItem::QueryValue( css::uno::Any& rVal, sal_uInt8 /*nMemberId*/) const +bool XLineColorItem::QueryValue( css::uno::Any& rVal, sal_uInt8 nMemberId) const { - rVal <<= GetColorValue().GetRGBColor(); + nMemberId &= ~CONVERT_TWIPS; + switch (nMemberId) + { + case MID_COLOR_THEME_REFERENCE: + { + auto xThemeColor = model::theme::createXThemeColor(GetThemeColor()); + rVal <<= xThemeColor; + break; + } + default: + { + rVal <<= GetColorValue().GetRGBColor(); + break; + } + } return true; } -bool XLineColorItem::PutValue( const css::uno::Any& rVal, sal_uInt8 /*nMemberId*/) +bool XLineColorItem::PutValue( const css::uno::Any& rVal, sal_uInt8 nMemberId) { - sal_Int32 nValue = 0; - if(!(rVal >>= nValue)) - return false; + nMemberId &= ~CONVERT_TWIPS; + switch(nMemberId) + { + case MID_COLOR_THEME_REFERENCE: + { + css::uno::Reference<css::util::XThemeColor> xThemeColor; + if (!(rVal >>= xThemeColor)) + return false; + model::theme::setFromXThemeColor(GetThemeColor(), xThemeColor); + } + break; + default: + { + sal_Int32 nValue; + if(!(rVal >>= nValue )) + return false; - SetColorValue( Color(ColorTransparency, nValue) ); + SetColorValue( Color(ColorTransparency, nValue) ); + break; + } + } return true; }