diff options
-rw-r--r-- | oox/inc/drawingml/chart/chartspacemodel.hxx | 4 | ||||
-rw-r--r-- | oox/source/drawingml/chart/chartspacefragment.cxx | 19 | ||||
-rw-r--r-- | oox/source/drawingml/shape.cxx | 26 | ||||
-rw-r--r-- | sd/qa/unit/data/pptx/chart_pt_color_bg1.pptx | bin | 0 -> 31934 bytes | |||
-rw-r--r-- | sd/qa/unit/import-tests2.cxx | 31 |
5 files changed, 75 insertions, 5 deletions
diff --git a/oox/inc/drawingml/chart/chartspacemodel.hxx b/oox/inc/drawingml/chart/chartspacemodel.hxx index 0aa564fefd7e..dda0f577ae32 100644 --- a/oox/inc/drawingml/chart/chartspacemodel.hxx +++ b/oox/inc/drawingml/chart/chartspacemodel.hxx @@ -20,6 +20,9 @@ #ifndef INCLUDED_OOX_DRAWINGML_CHART_CHARTSPACEMODEL_HXX #define INCLUDED_OOX_DRAWINGML_CHART_CHARTSPACEMODEL_HXX +#include <sal/config.h> + +#include <oox/drawingml/clrscheme.hxx> #include <oox/drawingml/shape.hxx> #include <drawingml/chart/plotareamodel.hxx> #include <drawingml/chart/titlemodel.hxx> @@ -46,6 +49,7 @@ struct ChartSpaceModel View3DRef mxView3D; /// 3D settings. TitleRef mxTitle; /// Chart main title. LegendRef mxLegend; /// Chart legend. + ClrMapPtr mpClrMap; /// Optionally passed color map to update OUString maDrawingPath; /// Path to drawing fragment with embedded shapes. OUString maSheetPath; /// Path to embedded charts. sal_Int32 mnDispBlanksAs; /// Mode how to display blank values. diff --git a/oox/source/drawingml/chart/chartspacefragment.cxx b/oox/source/drawingml/chart/chartspacefragment.cxx index 7f0a6cd549f9..f43908d65cb5 100644 --- a/oox/source/drawingml/chart/chartspacefragment.cxx +++ b/oox/source/drawingml/chart/chartspacefragment.cxx @@ -75,6 +75,25 @@ ContextHandlerRef ChartSpaceFragment::onCreateContext( sal_Int32 nElement, const case C_TOKEN (externalData): mrModel.maSheetPath = getFragmentPathFromRelId(rAttribs.getStringDefaulted(R_TOKEN(id))); return nullptr; + case C_TOKEN(clrMapOvr): + if (mrModel.mpClrMap) + for (auto nClrToken : { + XML_bg1, + XML_tx1, + XML_bg2, + XML_tx2, + XML_accent1, + XML_accent2, + XML_accent3, + XML_accent4, + XML_accent5, + XML_accent6, + XML_hlink, + XML_folHlink, + }) + if (auto oMappedToken = rAttribs.getToken(nClrToken)) + mrModel.mpClrMap->setColorMap(nClrToken, *oMappedToken); + return nullptr; } break; diff --git a/oox/source/drawingml/shape.cxx b/oox/source/drawingml/shape.cxx index 78a20b46861b..4f600528b56a 100644 --- a/oox/source/drawingml/shape.cxx +++ b/oox/source/drawingml/shape.cxx @@ -2190,13 +2190,24 @@ void Shape::finalizeXShape( XmlFilterBase& rFilter, const Reference< XShapes >& // in the imported chart data bool bMSO2007Doc = rFilter.isMSO2007Document(); chart::ChartSpaceModel aModel(bMSO2007Doc); + oox::ppt::PowerPointImport* pPowerPointImport + = dynamic_cast<oox::ppt::PowerPointImport*>(&rFilter); + + ClrMapPtr pClrMap; // The original color map + if (pPowerPointImport) + { + // Use a copy of current color map, which the fragment may override locally + pClrMap = pPowerPointImport->getActualSlidePersist()->getClrMap(); + aModel.mpClrMap = pClrMap ? std::make_shared<ClrMap>(*pClrMap) + : std::make_shared<ClrMap>(); + pPowerPointImport->getActualSlidePersist()->setClrMap(aModel.mpClrMap); + } + rtl::Reference<chart::ChartSpaceFragment> pChartSpaceFragment = new chart::ChartSpaceFragment( rFilter, mxChartShapeInfo->maFragmentPath, aModel ); const OUString aThemeOverrideFragmentPath( pChartSpaceFragment-> getFragmentPathFromFirstTypeFromOfficeDoc(u"themeOverride") ); rFilter.importFragment( pChartSpaceFragment ); - ::oox::ppt::PowerPointImport *pPowerPointImport = - dynamic_cast< ::oox::ppt::PowerPointImport* >(&rFilter); // The original theme. ThemePtr pTheme; @@ -2236,10 +2247,15 @@ void Shape::finalizeXShape( XmlFilterBase& rFilter, const Reference< XShapes >& } - if (!aThemeOverrideFragmentPath.isEmpty() && pPowerPointImport) + if (pPowerPointImport) { - // Restore the original theme. - pPowerPointImport->getActualSlidePersist()->setTheme(pTheme); + if (!aThemeOverrideFragmentPath.isEmpty()) + { + // Restore the original theme. + pPowerPointImport->getActualSlidePersist()->setTheme(pTheme); + } + // Restore the original color map + pPowerPointImport->getActualSlidePersist()->setClrMap(pClrMap); } #endif } diff --git a/sd/qa/unit/data/pptx/chart_pt_color_bg1.pptx b/sd/qa/unit/data/pptx/chart_pt_color_bg1.pptx Binary files differnew file mode 100644 index 000000000000..66a0f8cc6d0f --- /dev/null +++ b/sd/qa/unit/data/pptx/chart_pt_color_bg1.pptx diff --git a/sd/qa/unit/import-tests2.cxx b/sd/qa/unit/import-tests2.cxx index 4e535c7749c7..fcb3d656c4ac 100644 --- a/sd/qa/unit/import-tests2.cxx +++ b/sd/qa/unit/import-tests2.cxx @@ -1937,6 +1937,37 @@ CPPUNIT_TEST_FIXTURE(SdImportTest2, test_srcRect_smallNegBound) CPPUNIT_ASSERT(aBitmap.GetPixelColor(0, 0).IsBright()); } +CPPUNIT_TEST_FIXTURE(SdImportTest2, testTdf153012) +{ + // Given a chart with a data point with solid fill of "Background 1, Darker 15%" color, + // where the 'bg1' is mapped in the slide to "dk1", but in the chart to "lt1": + createSdImpressDoc("pptx/chart_pt_color_bg1.pptx"); + + uno::Reference<chart2::XChartDocument> xChart2Doc( + getShapeFromPage(0, 0)->getPropertyValue("Model"), uno::UNO_QUERY_THROW); + + uno::Reference<chart2::XCoordinateSystemContainer> xCooSysCnt(xChart2Doc->getFirstDiagram(), + uno::UNO_QUERY_THROW); + + uno::Reference<chart2::XChartTypeContainer> xCTCnt(xCooSysCnt->getCoordinateSystems()[0], + uno::UNO_QUERY_THROW); + + uno::Reference<chart2::XDataSeriesContainer> xDSCnt(xCTCnt->getChartTypes()[0], + uno::UNO_QUERY_THROW); + + uno::Sequence<uno::Reference<chart2::XDataSeries>> aSeriesSeq(xDSCnt->getDataSeries()); + CPPUNIT_ASSERT_EQUAL(sal_Int32(1), aSeriesSeq.getLength()); + + css::uno::Reference<css::beans::XPropertySet> xPropSet1(aSeriesSeq[0]->getDataPointByIndex(1), + uno::UNO_SET_THROW); + Color aFillColor; + xPropSet1->getPropertyValue("FillColor") >>= aFillColor; + // The color must arrive correctly. Without the fix, it would fail: + // - Expected: rgba[d9d9d9ff] + // - Actual : rgba[000000ff] + CPPUNIT_ASSERT_EQUAL(Color(0xd9d9d9), aFillColor); +} + CPPUNIT_PLUGIN_IMPLEMENT(); /* vim:set shiftwidth=4 softtabstop=4 expandtab: */ |