summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--oox/inc/drawingml/chart/chartspacemodel.hxx4
-rw-r--r--oox/source/drawingml/chart/chartspacefragment.cxx19
-rw-r--r--oox/source/drawingml/shape.cxx26
-rw-r--r--sd/qa/unit/data/pptx/chart_pt_color_bg1.pptxbin0 -> 31934 bytes
-rw-r--r--sd/qa/unit/import-tests2.cxx31
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
new file mode 100644
index 000000000000..66a0f8cc6d0f
--- /dev/null
+++ b/sd/qa/unit/data/pptx/chart_pt_color_bg1.pptx
Binary files differ
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: */