include/oox/shape/ShapeContextHandler.hxx | 5 + oox/qa/unit/data/tdf54095_SmartArtThemeTextColor.docx |binary oox/qa/unit/shape.cxx | 54 ++++++++++++++++++ oox/source/shape/ShapeContextHandler.cxx | 13 ++++ 4 files changed, 71 insertions(+), 1 deletion(-)
New commits: commit 2406ba67c8c03b0d6a4adb81f1efc1609c8dfe8c Author: Regina Henschel <rb.hensc...@t-online.de> AuthorDate: Fri Oct 28 15:39:38 2022 +0200 Commit: Regina Henschel <rb.hensc...@t-online.de> CommitDate: Fri Oct 28 19:49:00 2022 +0200 tdf#54095 docx SmartArt import, apply theme text color PPTShapeGroupContext uses method applyFontRefColor in importExtDrawings to bring the theme text color to the shape text. The patch copies this way to ShapeContextHandler, which is used for SmartArt in docx. Change-Id: Ie0c0453d6a1fd73fbd4b65246aed9570646dc6f0 Reviewed-on: https://gerrit.libreoffice.org/c/core/+/141992 Tested-by: Jenkins Reviewed-by: Regina Henschel <rb.hensc...@t-online.de> diff --git a/include/oox/shape/ShapeContextHandler.hxx b/include/oox/shape/ShapeContextHandler.hxx index 239ff8ec63b8..42e884f27daa 100644 --- a/include/oox/shape/ShapeContextHandler.hxx +++ b/include/oox/shape/ShapeContextHandler.hxx @@ -21,6 +21,7 @@ #include <memory> #include <stack> #include <cppuhelper/implbase.hxx> +#include <oox/drawingml/color.hxx> #include <oox/drawingml/graphicshapecontext.hxx> #include <oox/core/fragmenthandler2.hxx> #include <oox/core/xmlfilterbase.hxx> @@ -151,8 +152,10 @@ private: css::uno::Reference<XFastContextHandler> const & getWpsContext(sal_Int32 nStartElement, sal_Int32 nElement); css::uno::Reference<XFastContextHandler> const & getWpgContext(sal_Int32 nElement); css::uno::Reference<XFastContextHandler> getContextHandler(sal_Int32 nElement = 0); -}; + void applyFontRefColor(const oox::drawingml::ShapePtr& pShape, + const oox::drawingml::Color& rFontRefColor); +}; } /* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/oox/qa/unit/data/tdf54095_SmartArtThemeTextColor.docx b/oox/qa/unit/data/tdf54095_SmartArtThemeTextColor.docx new file mode 100644 index 000000000000..8aff8469bb41 Binary files /dev/null and b/oox/qa/unit/data/tdf54095_SmartArtThemeTextColor.docx differ diff --git a/oox/qa/unit/shape.cxx b/oox/qa/unit/shape.cxx index 06d7eba9dffd..9a85db9f3894 100644 --- a/oox/qa/unit/shape.cxx +++ b/oox/qa/unit/shape.cxx @@ -19,6 +19,7 @@ #include <com/sun/star/drawing/XDrawPagesSupplier.hpp> #include <com/sun/star/frame/Desktop.hpp> #include <com/sun/star/beans/XPropertySet.hpp> +#include <com/sun/star/text/XTextRange.hpp> #include <officecfg/Office/Common.hxx> #include <rtl/math.hxx> @@ -260,6 +261,59 @@ CPPUNIT_TEST_FIXTURE(OoxShapeTest, testTdf151518VertAnchor) } } +CPPUNIT_TEST_FIXTURE(OoxShapeTest, testTdf54095_SmartArtThemeTextColor) +{ + // The document contains a SmartArt where the color for the texts in the shapes is given by + // the theme. + // Error was, that the theme was not considered and therefore the text was white. + + // Make sure it is not loaded as metafile but with single shapes. + bool bUseGroup = officecfg::Office::Common::Filter::Microsoft::Import::SmartArtToShapes::get(); + if (!bUseGroup) + { + std::shared_ptr<comphelper::ConfigurationChanges> pChange( + comphelper::ConfigurationChanges::create()); + officecfg::Office::Common::Filter::Microsoft::Import::SmartArtToShapes::set(true, pChange); + pChange->commit(); + } + + // get SmartArt + loadFromURL(u"tdf54095_SmartArtThemeTextColor.docx"); + uno::Reference<drawing::XDrawPagesSupplier> xDrawPagesSupplier(mxComponent, uno::UNO_QUERY); + uno::Reference<drawing::XDrawPage> xDrawPage(xDrawPagesSupplier->getDrawPages()->getByIndex(0), + uno::UNO_QUERY); + uno::Reference<drawing::XShapes> xSmartArt(xDrawPage->getByIndex(0), uno::UNO_QUERY); + // shape 0 is the background shape without text + uno::Reference<text::XTextRange> xShape(xSmartArt->getByIndex(1), uno::UNO_QUERY); + + // text color + 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 nActualColor{ 0 }; + xPortion->getPropertyValue("CharColor") >>= nActualColor; + // Without fix the test would have failed with: + // - Expected: 2050429 (0x1F497D) + // - Actual : 16777215 (0xFFFFFF), that is text was white + CPPUNIT_ASSERT_EQUAL(sal_Int32(0x1F497D), nActualColor); + + // clrScheme. For map between name in docx and index from CharColorTheme see + // oox::drawingml::Color::getSchemeColorIndex() + // Without fix the color scheme was "lt1" (1) but should be "dk2" (2). + CPPUNIT_ASSERT_EQUAL(sal_Int16(2), + xPortion->getPropertyValue("CharColorTheme").get<sal_Int16>()); + + if (!bUseGroup) + { + std::shared_ptr<comphelper::ConfigurationChanges> pChange( + comphelper::ConfigurationChanges::create()); + officecfg::Office::Common::Filter::Microsoft::Import::SmartArtToShapes::set(false, pChange); + pChange->commit(); + } +} + CPPUNIT_PLUGIN_IMPLEMENT(); /* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/oox/source/shape/ShapeContextHandler.cxx b/oox/source/shape/ShapeContextHandler.cxx index 4e8329c1417d..91201fea45f4 100644 --- a/oox/source/shape/ShapeContextHandler.cxx +++ b/oox/source/shape/ShapeContextHandler.cxx @@ -429,6 +429,9 @@ ShapeContextHandler::getShape() pShapePtr->setDiagramDoms(mpShape->getDiagramDoms()); pShapePtr->keepDiagramDrawing(*mxShapeFilterBase, aFragmentPath); + if (mpShape->getFontRefColorForNodes().isUsed()) + applyFontRefColor(pShapePtr, mpShape->getFontRefColorForNodes()); + // migrate IDiagramHelper to new oox::Shape (from mpShape which was loaded // to pShapePtr where the geometry is now constructed) mpShape->migrateDiagramHelperToNewShape(pShapePtr); @@ -586,6 +589,16 @@ void ShapeContextHandler::setGraphicMapper(css::uno::Reference<css::graphic::XGr mxShapeFilterBase->setGraphicMapper(rxGraphicMapper); } +void ShapeContextHandler::applyFontRefColor(const oox::drawingml::ShapePtr& pShape, + const oox::drawingml::Color& rFontRefColor) +{ + pShape->getShapeStyleRefs()[XML_fontRef].maPhClr = rFontRefColor; + std::vector<oox::drawingml::ShapePtr>& vChildren = pShape->getChildren(); + for (auto const& child : vChildren) + { + applyFontRefColor(child, rFontRefColor); + } +} } /* vim:set shiftwidth=4 softtabstop=4 expandtab: */