/* -*- 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 "sdmodeltestbase.hxx" #include #include #include #include #include #include #include #include #include #include #include #include #include using namespace css; class ThemeTest : public SdModelTestBase { public: ThemeTest() : SdModelTestBase("/sd/qa/unit/data/") { } }; namespace { /// 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; } } // end anonymous namespace CPPUNIT_TEST_FIXTURE(ThemeTest, testThemeChange) { // Given a document, with a first slide and blue shape text from theme: loadFromFile(u"theme.pptx"); SdXImpressDocument* pXImpressDocument = dynamic_cast(mxComponent.get()); CPPUNIT_ASSERT(pXImpressDocument); auto* pDocShell = pXImpressDocument->GetDocShell(); 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 xComplexColor; CPPUNIT_ASSERT(xShape4->getPropertyValue("FillComplexColor") >>= xComplexColor); CPPUNIT_ASSERT(xComplexColor.is()); auto aComplexColor = model::color::getFromXComplexColor(xComplexColor); CPPUNIT_ASSERT_EQUAL(model::ThemeColorType::Accent1, aComplexColor.getThemeColorType()); } 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 xComplexColor; CPPUNIT_ASSERT(xShape5->getPropertyValue("FillComplexColor") >>= xComplexColor); CPPUNIT_ASSERT(xComplexColor.is()); auto aComplexColor = model::color::getFromXComplexColor(xComplexColor); CPPUNIT_ASSERT_EQUAL(model::ThemeColorType::Accent1, aComplexColor.getThemeColorType()); CPPUNIT_ASSERT_EQUAL(model::TransformationType::LumMod, aComplexColor.getTransformations()[0].meType); CPPUNIT_ASSERT_EQUAL(sal_Int16(4000), aComplexColor.getTransformations()[0].mnValue); CPPUNIT_ASSERT_EQUAL(model::TransformationType::LumOff, aComplexColor.getTransformations()[1].meType); CPPUNIT_ASSERT_EQUAL(sal_Int16(6000), aComplexColor.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); css::uno::Reference xDrawPageMaster(xMasterPage, uno::UNO_QUERY); CPPUNIT_ASSERT(xDrawPageMaster.is()); auto* pMasterPage = GetSdrPageFromXDrawPage(xDrawPageMaster); auto pTheme = pMasterPage->getSdrPageProperties().getTheme(); sd::ThemeColorChanger aChanger(pMasterPage, pDocShell); aChanger.apply(pTheme->getColorSet()); // Then make sure the shape text color is now green: CPPUNIT_ASSERT_EQUAL(Color(0x90c226), GetShapeTextColor(xShape)); // Green, lighter: CPPUNIT_ASSERT_EQUAL(Color(0xd5eda2), GetShapeTextColor(xShape2)); // Green, darker. CPPUNIT_ASSERT_EQUAL(Color(0x6c911d), GetShapeTextColor(xShape3)); // Shape fill: CPPUNIT_ASSERT_EQUAL(Color(0x90c226), GetShapeFillColor(xShape4)); // Green, lighter: CPPUNIT_ASSERT_EQUAL(Color(0xd5eda2), GetShapeFillColor(xShape5)); } CPPUNIT_PLUGIN_IMPLEMENT(); /* vim:set shiftwidth=4 softtabstop=4 expandtab: */