diff options
-rw-r--r-- | svx/qa/unit/data/theme.pptx | bin | 25742 -> 27231 bytes | |||
-rw-r--r-- | svx/qa/unit/styles.cxx | 49 | ||||
-rw-r--r-- | svx/source/styles/ColorSets.cxx | 42 |
3 files changed, 63 insertions, 28 deletions
diff --git a/svx/qa/unit/data/theme.pptx b/svx/qa/unit/data/theme.pptx Binary files differindex 397b6706ffa4..652a9fc29e06 100644 --- a/svx/qa/unit/data/theme.pptx +++ b/svx/qa/unit/data/theme.pptx diff --git a/svx/qa/unit/styles.cxx b/svx/qa/unit/styles.cxx index 9cbae8f997ba..1e7151edf359 100644 --- a/svx/qa/unit/styles.cxx +++ b/svx/qa/unit/styles.cxx @@ -49,6 +49,19 @@ void Test::tearDown() constexpr OUStringLiteral DATA_DIRECTORY = u"/svx/qa/unit/data/"; +/// Get the character color of the first text portion in xShape. +sal_Int32 GetShapeTextColor(const uno::Reference<text::XTextRange>& xShape) +{ + uno::Reference<container::XEnumerationAccess> xText(xShape->getText(), uno::UNO_QUERY); + uno::Reference<container::XEnumerationAccess> xPara(xText->createEnumeration()->nextElement(), + uno::UNO_QUERY); + uno::Reference<beans::XPropertySet> xPortion(xPara->createEnumeration()->nextElement(), + uno::UNO_QUERY); + sal_Int32 nColor{}; + xPortion->getPropertyValue("CharColor") >>= nColor; + return nColor; +} + CPPUNIT_TEST_FIXTURE(Test, testThemeChange) { // Given a document, with a first slide and blue shape text from theme: @@ -59,17 +72,14 @@ CPPUNIT_TEST_FIXTURE(Test, testThemeChange) xDrawPagesSupplier->getDrawPages()->getByIndex(0), uno::UNO_QUERY); uno::Reference<drawing::XShapes> xDrawPageShapes(xDrawPage, uno::UNO_QUERY); uno::Reference<text::XTextRange> xShape(xDrawPageShapes->getByIndex(0), uno::UNO_QUERY); - { - uno::Reference<container::XEnumerationAccess> xText(xShape->getText(), uno::UNO_QUERY); - uno::Reference<container::XEnumerationAccess> xPara( - xText->createEnumeration()->nextElement(), uno::UNO_QUERY); - uno::Reference<beans::XPropertySet> xPortion(xPara->createEnumeration()->nextElement(), - uno::UNO_QUERY); - sal_Int32 nColor{}; - xPortion->getPropertyValue("CharColor") >>= nColor; - // Blue. - CPPUNIT_ASSERT_EQUAL(static_cast<sal_Int32>(0x4472c4), nColor); - } + // Blue. + CPPUNIT_ASSERT_EQUAL(static_cast<sal_Int32>(0x4472c4), GetShapeTextColor(xShape)); + uno::Reference<text::XTextRange> xShape2(xDrawPageShapes->getByIndex(1), uno::UNO_QUERY); + // Blue, lighter. + CPPUNIT_ASSERT_EQUAL(static_cast<sal_Int32>(0xb4c7e7), GetShapeTextColor(xShape2)); + uno::Reference<text::XTextRange> xShape3(xDrawPageShapes->getByIndex(2), uno::UNO_QUERY); + // Blue, darker. + CPPUNIT_ASSERT_EQUAL(static_cast<sal_Int32>(0x2f5597), GetShapeTextColor(xShape3)); // When changing the master slide of slide 1 to use the theme of the second master slide: uno::Reference<drawing::XMasterPageTarget> xDrawPage2( @@ -80,18 +90,19 @@ CPPUNIT_TEST_FIXTURE(Test, testThemeChange) xMasterPage->setPropertyValue("Theme", aTheme); // Then make sure the shape text color is now green: - uno::Reference<container::XEnumerationAccess> xText(xShape->getText(), uno::UNO_QUERY); - uno::Reference<container::XEnumerationAccess> xPara(xText->createEnumeration()->nextElement(), - uno::UNO_QUERY); - uno::Reference<beans::XPropertySet> xPortion(xPara->createEnumeration()->nextElement(), - uno::UNO_QUERY); - sal_Int32 nColor{}; - xPortion->getPropertyValue("CharColor") >>= nColor; // Without the accompanying fix in place, this test would have failed with: // - Expected: 9486886 (#90c226, green) // - Actual : 4485828 (#4472c4, blue) // i.e. shape text was not updated on theme change. - CPPUNIT_ASSERT_EQUAL(static_cast<sal_Int32>(0x90c226), nColor); + CPPUNIT_ASSERT_EQUAL(static_cast<sal_Int32>(0x90c226), GetShapeTextColor(xShape)); + // Green, lighter: + // Without the accompanying fix in place, this test would have failed with: + // - Expected: 14020002 (#d5eda2, light green) + // - Actual : 9486886 (#90c226, stock green) + // i.e. the "light" effect on green was not applied. + CPPUNIT_ASSERT_EQUAL(static_cast<sal_Int32>(0xd5eda2), GetShapeTextColor(xShape2)); + // Green, darker. + CPPUNIT_ASSERT_EQUAL(static_cast<sal_Int32>(0x6c911d), GetShapeTextColor(xShape3)); } } diff --git a/svx/source/styles/ColorSets.cxx b/svx/source/styles/ColorSets.cxx index a5f8c6e7c548..30a9dd423d78 100644 --- a/svx/source/styles/ColorSets.cxx +++ b/svx/source/styles/ColorSets.cxx @@ -33,6 +33,38 @@ using namespace com::sun::star; namespace { +/// Updates a text portion to match a new color set, in case it already uses theme colors. +void UpdateTextPortionColorSet(const uno::Reference<beans::XPropertySet>& xPortion, + svx::ColorSet& rColorSet) +{ + sal_Int16 nCharColorTheme = -1; + xPortion->getPropertyValue(UNO_NAME_EDIT_CHAR_COLOR_THEME) >>= nCharColorTheme; + if (nCharColorTheme < 0 || nCharColorTheme > 11) + { + return; + } + + Color aColor = rColorSet.getColor(nCharColorTheme); + sal_Int32 nCharColorLumMod{}; + xPortion->getPropertyValue(UNO_NAME_EDIT_CHAR_COLOR_LUM_MOD) >>= nCharColorLumMod; + sal_Int32 nCharColorLumOff{}; + xPortion->getPropertyValue(UNO_NAME_EDIT_CHAR_COLOR_LUM_OFF) >>= nCharColorLumOff; + if (nCharColorLumMod != 10000 || nCharColorLumOff != 0) + { + aColor.ApplyLumModOff(nCharColorLumMod, nCharColorLumOff); + } + + sal_Int32 nCharColorTintOrShade{}; + xPortion->getPropertyValue(UNO_NAME_EDIT_CHAR_COLOR_TINT_OR_SHADE) >>= nCharColorTintOrShade; + if (nCharColorTintOrShade != 0) + { + aColor.ApplyTintOrShade(nCharColorTintOrShade); + } + + xPortion->setPropertyValue(UNO_NAME_EDIT_CHAR_COLOR, + uno::makeAny(static_cast<sal_Int32>(aColor))); +} + void UpdateSdrObject(svx::Theme* pTheme, SdrObject* pObject) { svx::ColorSet* pColorSet = pTheme->GetColorSet(); @@ -51,15 +83,7 @@ void UpdateSdrObject(svx::Theme* pTheme, SdrObject* pObject) while (xPortions->hasMoreElements()) { uno::Reference<beans::XPropertySet> xPortion(xPortions->nextElement(), uno::UNO_QUERY); - sal_Int16 nCharColorTheme = -1; - xPortion->getPropertyValue(UNO_NAME_EDIT_CHAR_COLOR_THEME) >>= nCharColorTheme; - if (nCharColorTheme < 0 || nCharColorTheme > 11) - { - continue; - } - - Color aColor = pColorSet->getColor(nCharColorTheme); - xPortion->setPropertyValue(UNO_NAME_EDIT_CHAR_COLOR, uno::makeAny(static_cast<sal_Int32>(aColor))); + UpdateTextPortionColorSet(xPortion, *pColorSet); } } } |