oox/inc/drawingml/chart/chartspacemodel.hxx       |    4 ++
 oox/source/drawingml/chart/chartspacefragment.cxx |   19 +++++++++++++
 oox/source/drawingml/shape.cxx                    |   26 ++++++++++++++----
 sd/qa/unit/data/pptx/chart_pt_color_bg1.pptx      |binary
 sd/qa/unit/import-tests2.cxx                      |   31 ++++++++++++++++++++++
 5 files changed, 75 insertions(+), 5 deletions(-)

New commits:
commit 953e586dbce1c3195ecb07b2491b6e1a20a2cd7f
Author:     Mike Kaganski <mike.kagan...@collabora.com>
AuthorDate: Wed Aug 16 22:06:23 2023 +0300
Commit:     Mike Kaganski <mike.kagan...@collabora.com>
CommitDate: Wed Aug 16 23:31:06 2023 +0200

    tdf#153012: import chart's c:clrMapOvr element
    
    Otherwise, a wrong mapping could be used, e.g. from slide.
    
    Change-Id: I8b0fcebcd21ac2bab8b7f58d0c24753d2eca02c7
    Reviewed-on: https://gerrit.libreoffice.org/c/core/+/155748
    Tested-by: Jenkins
    Reviewed-by: Mike Kaganski <mike.kagan...@collabora.com>

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
Binary files /dev/null and b/sd/qa/unit/data/pptx/chart_pt_color_bg1.pptx 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: */

Reply via email to