oox/qa/unit/data/tdf152840_WordArt_non_accent_color.docx |binary
 oox/qa/unit/data/tdf152840_theme_color_non_accent.docx   |binary
 oox/qa/unit/shape.cxx                                    |   59 +++++++++++++++
 oox/source/drawingml/clrscheme.cxx                       |   10 ++
 oox/source/drawingml/color.cxx                           |    6 +
 5 files changed, 74 insertions(+), 1 deletion(-)

New commits:
commit f4a568fc0553603fbf05477e0942af4e8466fba0
Author:     Regina Henschel <rb.hensc...@t-online.de>
AuthorDate: Tue Jan 3 20:13:12 2023 +0100
Commit:     Regina Henschel <rb.hensc...@t-online.de>
CommitDate: Thu Jan 5 09:13:37 2023 +0000

    tdf#152840 add ST_ThemeColor values to ClrScheme::getColor
    
    ... and Color::getSchemeColorIndex().
    
    Without the fix it was not in all cases detected, that a theme color
    was used, so the FillColorTheme or the CharColorTheme property had got
    value '-1'. In case of WordArt in docx import, the color could not be
    determined and the text was black.
    
    Change-Id: I81cdb22d6b3c30bf9923b9069ba2e384ac5b3a1c
    Reviewed-on: https://gerrit.libreoffice.org/c/core/+/145021
    Tested-by: Jenkins
    Reviewed-by: Regina Henschel <rb.hensc...@t-online.de>

diff --git a/oox/qa/unit/data/tdf152840_WordArt_non_accent_color.docx 
b/oox/qa/unit/data/tdf152840_WordArt_non_accent_color.docx
new file mode 100644
index 000000000000..877722037206
Binary files /dev/null and 
b/oox/qa/unit/data/tdf152840_WordArt_non_accent_color.docx differ
diff --git a/oox/qa/unit/data/tdf152840_theme_color_non_accent.docx 
b/oox/qa/unit/data/tdf152840_theme_color_non_accent.docx
new file mode 100644
index 000000000000..2bb4e1340e51
Binary files /dev/null and 
b/oox/qa/unit/data/tdf152840_theme_color_non_accent.docx differ
diff --git a/oox/qa/unit/shape.cxx b/oox/qa/unit/shape.cxx
index 094687ffe1df..3997494eb21c 100644
--- a/oox/qa/unit/shape.cxx
+++ b/oox/qa/unit/shape.cxx
@@ -500,6 +500,65 @@ CPPUNIT_TEST_FIXTURE(OoxShapeTest, testWriterFontwork3)
     }
 }
 
+CPPUNIT_TEST_FIXTURE(OoxShapeTest, testWriterFontworkNonAccentColor)
+{
+    loadFromURL(u"tdf152840_WordArt_non_accent_color.docx");
+    // The file contains WordArt which uses the theme colors "Background 1", 
"Text 1", "Background 2"
+    // and "Text 2".
+
+    uno::Reference<drawing::XDrawPagesSupplier> 
xDrawPagesSupplier(mxComponent, uno::UNO_QUERY);
+    uno::Reference<drawing::XDrawPage> 
xDrawPage(xDrawPagesSupplier->getDrawPages()->getByIndex(0),
+                                                 uno::UNO_QUERY);
+
+    // The ID for the theme colors is not yet in API, but definied in enum 
PredefinedClrSchemeID
+    // in drawingml/clrscheme.hxx. Without fix the ID was -1 meaning no theme 
is used, and the color
+    // was Black (=0).
+
+    // background 1 = lt1 = ID 1
+    uno::Reference<beans::XPropertySet> xShape0Props(xDrawPage->getByIndex(0), 
uno::UNO_QUERY);
+    CPPUNIT_ASSERT_EQUAL(uno::Any(sal_Int16(1)), 
xShape0Props->getPropertyValue(u"FillColorTheme"));
+    CPPUNIT_ASSERT_EQUAL(uno::Any(Color(255, 204, 153)),
+                         xShape0Props->getPropertyValue(u"FillColor"));
+
+    // text 1 = dk1 = ID 0
+    uno::Reference<beans::XPropertySet> xShape1Props(xDrawPage->getByIndex(1), 
uno::UNO_QUERY);
+    CPPUNIT_ASSERT_EQUAL(uno::Any(sal_Int16(0)), 
xShape1Props->getPropertyValue(u"FillColorTheme"));
+    CPPUNIT_ASSERT_EQUAL(uno::Any(Color(255, 0, 0)), 
xShape1Props->getPropertyValue(u"FillColor"));
+
+    // background 2 = lt2 = ID 3
+    uno::Reference<beans::XPropertySet> xShape2Props(xDrawPage->getByIndex(2), 
uno::UNO_QUERY);
+    CPPUNIT_ASSERT_EQUAL(uno::Any(sal_Int16(3)), 
xShape2Props->getPropertyValue(u"FillColorTheme"));
+    CPPUNIT_ASSERT_EQUAL(uno::Any(Color(235, 221, 195)),
+                         xShape2Props->getPropertyValue(u"FillColor"));
+
+    // text 2 = dk2 = ID 2
+    uno::Reference<beans::XPropertySet> xShape3Props(xDrawPage->getByIndex(3), 
uno::UNO_QUERY);
+    CPPUNIT_ASSERT_EQUAL(uno::Any(sal_Int16(2)), 
xShape3Props->getPropertyValue(u"FillColorTheme"));
+    CPPUNIT_ASSERT_EQUAL(uno::Any(Color(119, 95, 85)),
+                         xShape3Props->getPropertyValue(u"FillColor"));
+}
+
+CPPUNIT_TEST_FIXTURE(OoxShapeTest, testWriterShapeFillNonAccentColor)
+{
+    loadFromURL(u"tdf152840_theme_color_non_accent.docx");
+    // The file contains shapes which uses the theme colors "bg2", "bg1", 
"tx1" and "tx2" in this
+    // order as fill color.
+
+    uno::Reference<drawing::XDrawPagesSupplier> 
xDrawPagesSupplier(mxComponent, uno::UNO_QUERY);
+    uno::Reference<drawing::XDrawPage> 
xDrawPage(xDrawPagesSupplier->getDrawPages()->getByIndex(0),
+                                                 uno::UNO_QUERY);
+
+    // The ID for the theme colors is not yet in API, but definied in enum 
PredefinedClrSchemeID
+    // in drawingml/clrscheme.hxx. Without fix the ID was -1 meaning no theme 
is used.
+    uno::Reference<beans::XPropertySet> xShape0Props(xDrawPage->getByIndex(0), 
uno::UNO_QUERY);
+    CPPUNIT_ASSERT_EQUAL(uno::Any(sal_Int16(3)), 
xShape0Props->getPropertyValue(u"FillColorTheme"));
+    uno::Reference<beans::XPropertySet> xShape1Props(xDrawPage->getByIndex(1), 
uno::UNO_QUERY);
+    CPPUNIT_ASSERT_EQUAL(uno::Any(sal_Int16(1)), 
xShape1Props->getPropertyValue(u"FillColorTheme"));
+    uno::Reference<beans::XPropertySet> xShape2Props(xDrawPage->getByIndex(2), 
uno::UNO_QUERY);
+    CPPUNIT_ASSERT_EQUAL(uno::Any(sal_Int16(0)), 
xShape2Props->getPropertyValue(u"FillColorTheme"));
+    uno::Reference<beans::XPropertySet> xShape3Props(xDrawPage->getByIndex(3), 
uno::UNO_QUERY);
+    CPPUNIT_ASSERT_EQUAL(uno::Any(sal_Int16(2)), 
xShape3Props->getPropertyValue(u"FillColorTheme"));
+}
 CPPUNIT_PLUGIN_IMPLEMENT();
 
 /* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/oox/source/drawingml/clrscheme.cxx 
b/oox/source/drawingml/clrscheme.cxx
index 225faf81eecf..5360ae423478 100644
--- a/oox/source/drawingml/clrscheme.cxx
+++ b/oox/source/drawingml/clrscheme.cxx
@@ -80,6 +80,16 @@ bool ClrScheme::getColor( sal_Int32 nSchemeClrToken, 
::Color& rColor ) const
         case XML_bg2 : nSchemeClrToken = XML_lt2; break;
         case XML_tx1 : nSchemeClrToken = XML_dk1; break;
         case XML_tx2 : nSchemeClrToken = XML_dk2; break;
+        case XML_background1 : nSchemeClrToken = XML_lt1; break;
+        case XML_background2 : nSchemeClrToken = XML_lt2; break;
+        case XML_text1 : nSchemeClrToken = XML_dk1; break;
+        case XML_text2 : nSchemeClrToken = XML_dk2; break;
+        case XML_light1 : nSchemeClrToken = XML_lt1; break;
+        case XML_light2 : nSchemeClrToken = XML_lt2; break;
+        case XML_dark1 : nSchemeClrToken = XML_dk1; break;
+        case XML_dark2 : nSchemeClrToken = XML_dk2; break;
+        case XML_hyperlink : nSchemeClrToken = XML_hlink; break;
+        case XML_followedHyperlink: nSchemeClrToken = XML_folHlink; break;
     }
 
     auto aIter = std::find_if(maClrScheme.begin(), maClrScheme.end(), 
find_by_token(nSchemeClrToken) );
diff --git a/oox/source/drawingml/color.cxx b/oox/source/drawingml/color.cxx
index f810deecf2bf..9e9218f285e8 100644
--- a/oox/source/drawingml/color.cxx
+++ b/oox/source/drawingml/color.cxx
@@ -715,7 +715,11 @@ sal_Int16 Color::getSchemeColorIndex() const
     static std::map<OUString, sal_Int32> const aSchemeColorNameToIndex{
         { "dk1", 0 },     { "lt1", 1 },     { "dk2", 2 },     { "lt2", 3 },
         { "accent1", 4 }, { "accent2", 5 }, { "accent3", 6 }, { "accent4", 7 },
-        { "accent5", 8 }, { "accent6", 9 }, { "hlink", 10 },  { "folHlink", 11 
}
+        { "accent5", 8 }, { "accent6", 9 }, { "hlink", 10 },  { "folHlink", 11 
},
+        { "tx1", 0 },     { "bg1", 1 },     { "tx2", 2 },     { "bg2", 3 },
+        { "dark1", 0},    { "light1", 1},   { "dark2", 2 },   { "light2", 3 },
+        { "text1", 0 }, { "background1", 1 }, { "text2", 2 }, { "background2", 
3 },
+        { "hyperlink", 10 }, { "followedHyperlink", 11}
     };
 
     auto aIt = aSchemeColorNameToIndex.find(msSchemeName);

Reply via email to