include/svx/DocumentColorHelper.hxx |   43 ++++++++++++++++++++++++++++++++++++
 sc/source/core/data/document10.cxx  |   19 ++++-----------
 sw/source/core/doc/docfmt.cxx       |   20 +++++-----------
 3 files changed, 54 insertions(+), 28 deletions(-)

New commits:
commit b804dc3c61ab595d3971e1b1a0e9a09ea498a7e4
Author:     Szymon Kłos <[email protected]>
AuthorDate: Mon Jan 15 09:49:18 2024 +0100
Commit:     Szymon Kłos <[email protected]>
CommitDate: Tue Jan 16 12:23:49 2024 +0100

    Use correct type when getting document colors
    
    After commit 0460be8848b0ce02c07183e41dd7137ac3b94164
    Send document colors with lok callback
    
    There was issue detected by CI:
    /sc/source/core/data/document10.cxx:198:46: runtime error: downcast of 
address 0x6100000efa40 which does not point to an object of type 'const 
SvxColorItem'
      0x6100000efa40: note: object is of type 'SvxBrushItem'
       00 00 00 00  b0 79 19 48 ce 7f 00 00  01 00 00 00 94 00 be be  4c 17 00 
00 a0 be be be  cc cc ff 00
                    ^~~~~~~~~~~~~~~~~~~~~~~
                    vptr for 'SvxBrushItem'
          #0 0x7fce1fbed369 in ScDocument::GetDocColors() 
/sc/source/core/data/document10.cxx:198:46
    
    Change-Id: I41f28b6bb54d7720d58c16d75b9d116a53f106cc
    Reviewed-on: https://gerrit.libreoffice.org/c/core/+/162077
    Tested-by: Jenkins
    Reviewed-by: Szymon Kłos <[email protected]>

diff --git a/include/svx/DocumentColorHelper.hxx 
b/include/svx/DocumentColorHelper.hxx
new file mode 100644
index 000000000000..4e12733391a5
--- /dev/null
+++ b/include/svx/DocumentColorHelper.hxx
@@ -0,0 +1,43 @@
+/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
+/*
+ * This file is part of the LibreOffice project.
+ *
+ * This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/.
+ *
+ */
+
+#pragma once
+
+#include <editeng/brushitem.hxx>
+#include <editeng/colritem.hxx>
+#include <set>
+#include <svl/itempool.hxx>
+
+namespace svx
+{
+namespace DocumentColorHelper
+{
+static inline Color getColorFromItem(const SvxColorItem* pItem) { return 
pItem->GetValue(); }
+
+static inline Color getColorFromItem(const SvxBrushItem* pItem) { return 
pItem->GetColor(); }
+
+template <class T>
+void queryColors(const sal_uInt16 nAttrib, const SfxItemPool* pPool, 
std::set<Color>& rOutput)
+{
+    ItemSurrogates aSurrogates;
+    pPool->GetItemSurrogates(aSurrogates, nAttrib);
+    for (const SfxPoolItem* pItem : aSurrogates)
+    {
+        auto pColorItem = static_cast<const T*>(pItem);
+        Color aColor(getColorFromItem(pColorItem));
+        if (COL_AUTO != aColor)
+            rOutput.insert(aColor);
+    }
+}
+}
+
+} // end of namespace svx
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/sc/source/core/data/document10.cxx 
b/sc/source/core/data/document10.cxx
index 61c75b5e2cc5..a2d1ae67b919 100644
--- a/sc/source/core/data/document10.cxx
+++ b/sc/source/core/data/document10.cxx
@@ -22,7 +22,7 @@
 
 #include <refupdatecontext.hxx>
 #include <sal/log.hxx>
-#include <editeng/colritem.hxx>
+#include <svx/DocumentColorHelper.hxx>
 #include <scitems.hxx>
 #include <datamapper.hxx>
 #include <docsh.hxx>
@@ -188,19 +188,10 @@ std::set<Color> ScDocument::GetDocColors()
 {
     std::set<Color> aDocColors;
     ScDocumentPool *pPool = GetPool();
-    const sal_uInt16 pAttribs[] = {ATTR_BACKGROUND, ATTR_FONT_COLOR};
-    for (sal_uInt16 nAttrib : pAttribs)
-    {
-        ItemSurrogates aSurrogates;
-        pPool->GetItemSurrogates(aSurrogates, nAttrib);
-        for (const SfxPoolItem* pItem : aSurrogates)
-        {
-            const SvxColorItem *pColorItem = static_cast<const 
SvxColorItem*>(pItem);
-            Color aColor( pColorItem->GetValue() );
-            if (COL_AUTO != aColor)
-                aDocColors.insert(aColor);
-        }
-    }
+
+    svx::DocumentColorHelper::queryColors<SvxBrushItem>(ATTR_BACKGROUND, 
pPool, aDocColors);
+    svx::DocumentColorHelper::queryColors<SvxColorItem>(ATTR_FONT_COLOR, 
pPool, aDocColors);
+
     return aDocColors;
 }
 
diff --git a/sw/source/core/doc/docfmt.cxx b/sw/source/core/doc/docfmt.cxx
index dc0f72031b3a..139f1fd205b6 100644
--- a/sw/source/core/doc/docfmt.cxx
+++ b/sw/source/core/doc/docfmt.cxx
@@ -25,10 +25,10 @@
 #include <editeng/lrspitem.hxx>
 #include <editeng/formatbreakitem.hxx>
 #include <editeng/rsiditem.hxx>
-#include <editeng/colritem.hxx>
 #include <officecfg/Office/Common.hxx>
 #include <osl/diagnose.h>
 #include <svl/zforlist.hxx>
+#include <svx/DocumentColorHelper.hxx>
 #include <comphelper/processfactory.hxx>
 #include <unotools/configmgr.hxx>
 #include <sal/log.hxx>
@@ -2038,19 +2038,11 @@ std::set<Color> SwDoc::GetDocColors()
 {
     std::set<Color> aDocColors;
     SwAttrPool& rPool = GetAttrPool();
-    const sal_uInt16 pAttribs[] = {RES_CHRATR_COLOR, RES_CHRATR_HIGHLIGHT, 
RES_BACKGROUND};
-    for (sal_uInt16 nAttrib : pAttribs)
-    {
-        ItemSurrogates aSurrogates;
-        rPool.GetItemSurrogates(aSurrogates, nAttrib);
-        for (const SfxPoolItem* pItem : aSurrogates)
-        {
-            auto pColorItem = static_cast<const SvxColorItem*>(pItem);
-            Color aColor( pColorItem->GetValue() );
-            if (COL_AUTO != aColor)
-                aDocColors.insert(aColor);
-        }
-    }
+
+    svx::DocumentColorHelper::queryColors<SvxColorItem>(RES_CHRATR_COLOR, 
&rPool, aDocColors);
+    svx::DocumentColorHelper::queryColors<SvxBrushItem>(RES_CHRATR_HIGHLIGHT, 
&rPool, aDocColors);
+    svx::DocumentColorHelper::queryColors<SvxBrushItem>(RES_CHRATR_BACKGROUND, 
&rPool, aDocColors);
+
     return aDocColors;
 }
 

Reply via email to