/* -*- 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/. */ #include #include #include #include #include #include using namespace ::com::sun::star; namespace { /// Tests for svx/source/styles/ code. class Test : public UnoApiTest { public: Test() : UnoApiTest("svx/qa/unit/data/") { } }; /// Get the character color of the first text portion in xShape. Color GetShapeTextColor(const uno::Reference& xShape) { uno::Reference xText(xShape->getText(), uno::UNO_QUERY); uno::Reference xPara(xText->createEnumeration()->nextElement(), uno::UNO_QUERY); uno::Reference xPortion(xPara->createEnumeration()->nextElement(), uno::UNO_QUERY); Color nColor{}; xPortion->getPropertyValue("CharColor") >>= nColor; return nColor; } /// Get the solid fill color of xShape. Color GetShapeFillColor(const uno::Reference& xShape) { Color nColor{}; xShape->getPropertyValue("FillColor") >>= nColor; return nColor; } CPPUNIT_TEST_FIXTURE(Test, testThemeChange) { // Given a document, with a first slide and blue shape text from theme: loadFromURL(u"theme.pptx"); uno::Reference xDrawPagesSupplier(mxComponent, uno::UNO_QUERY); // The draw page also contains a group shape to make sure we don't crash on group shapes. uno::Reference xDrawPage( xDrawPagesSupplier->getDrawPages()->getByIndex(0), uno::UNO_QUERY); uno::Reference xDrawPageShapes(xDrawPage, uno::UNO_QUERY); uno::Reference xShape(xDrawPageShapes->getByIndex(0), uno::UNO_QUERY); // Blue. CPPUNIT_ASSERT_EQUAL(Color(0x4472c4), GetShapeTextColor(xShape)); uno::Reference xShape2(xDrawPageShapes->getByIndex(1), uno::UNO_QUERY); // Blue, lighter. CPPUNIT_ASSERT_EQUAL(Color(0xb4c7e7), GetShapeTextColor(xShape2)); uno::Reference xShape3(xDrawPageShapes->getByIndex(2), uno::UNO_QUERY); // Blue, darker. CPPUNIT_ASSERT_EQUAL(Color(0x2f5597), GetShapeTextColor(xShape3)); // Shape fill: uno::Reference xShape4(xDrawPageShapes->getByIndex(4), uno::UNO_QUERY); // Blue. CPPUNIT_ASSERT_EQUAL(Color(0x4472c4), GetShapeFillColor(xShape4)); // The theme color of this filled shape is set by the PPTX import: { uno::Reference xThemeColor; CPPUNIT_ASSERT(xShape4->getPropertyValue("FillColorThemeReference") >>= xThemeColor); CPPUNIT_ASSERT(xThemeColor.is()); model::ThemeColor aThemeColor; model::theme::setFromXThemeColor(aThemeColor, xThemeColor); CPPUNIT_ASSERT_EQUAL(model::ThemeColorType::Accent1, aThemeColor.getType()); } uno::Reference xShape5(xDrawPageShapes->getByIndex(5), uno::UNO_QUERY); // Blue, lighter. CPPUNIT_ASSERT_EQUAL(Color(0xb4c7e7), GetShapeFillColor(xShape5)); // The theme index, and effects (lum mod, lum off) are set by the PPTX import: { uno::Reference xThemeColor; CPPUNIT_ASSERT(xShape5->getPropertyValue("FillColorThemeReference") >>= xThemeColor); CPPUNIT_ASSERT(xThemeColor.is()); model::ThemeColor aThemeColor; model::theme::setFromXThemeColor(aThemeColor, xThemeColor); CPPUNIT_ASSERT_EQUAL(model::ThemeColorType::Accent1, aThemeColor.getType()); CPPUNIT_ASSERT_EQUAL(model::TransformationType::LumMod, aThemeColor.getTransformations()[0].meType); CPPUNIT_ASSERT_EQUAL(sal_Int16(4000), aThemeColor.getTransformations()[0].mnValue); CPPUNIT_ASSERT_EQUAL(model::TransformationType::LumOff, aThemeColor.getTransformations()[1].meType); CPPUNIT_ASSERT_EQUAL(sal_Int16(6000), aThemeColor.getTransformations()[1].mnValue); } // When changing the master slide of slide 1 to use the theme of the second master slide: uno::Reference xDrawPage2( xDrawPagesSupplier->getDrawPages()->getByIndex(1), uno::UNO_QUERY); uno::Reference xMasterPage2(xDrawPage2->getMasterPage(), uno::UNO_QUERY); uno::Any aTheme = xMasterPage2->getPropertyValue("Theme"); uno::Reference xMasterPage(xDrawPage->getMasterPage(), uno::UNO_QUERY); xMasterPage->setPropertyValue("Theme", aTheme); // Then make sure the shape text color is now green: // 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(Color(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(Color(0xd5eda2), GetShapeTextColor(xShape2)); // Green, darker. CPPUNIT_ASSERT_EQUAL(Color(0x6c911d), GetShapeTextColor(xShape3)); // Shape fill: // Without the accompanying fix in place, this test would have failed with: // - Expected: 9486886 (#90c226, green) // - Actual : 4485828 (#4472c4, blue) CPPUNIT_ASSERT_EQUAL(Color(0x90c226), GetShapeFillColor(xShape4)); // Green, lighter: // Without the accompanying fix in place, this test would have failed with: // - Expected: 14020002 (#d5eda2, light green) // - Actual : 9486886 (#90c226, green) // i.e. the "light" effect on green was not applied. CPPUNIT_ASSERT_EQUAL(Color(0xd5eda2), GetShapeFillColor(xShape5)); } } CPPUNIT_PLUGIN_IMPLEMENT(); /* vim:set shiftwidth=4 softtabstop=4 expandtab: */