include/svx/DocumentColorHelper.hxx | 41 ++++++++++++++++++++++++++++++++++++ sc/source/core/data/document10.cxx | 17 ++++---------- sw/source/core/doc/docfmt.cxx | 18 +++++---------- 3 files changed, 52 insertions(+), 24 deletions(-)
New commits: commit 1243928be479a75c5095d8d442e613c5f196b665 Author: Szymon Kłos <[email protected]> AuthorDate: Mon Jan 15 09:49:18 2024 +0100 Commit: Tomaž Vajngerl <[email protected]> CommitDate: Tue Jan 16 13:01:44 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/+/162076 Tested-by: Jenkins CollaboraOffice <[email protected]> Reviewed-by: Tomaž Vajngerl <[email protected]> diff --git a/include/svx/DocumentColorHelper.hxx b/include/svx/DocumentColorHelper.hxx new file mode 100644 index 000000000000..71eccde99582 --- /dev/null +++ b/include/svx/DocumentColorHelper.hxx @@ -0,0 +1,41 @@ +/* -*- 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) +{ + for (const SfxPoolItem* pItem : pPool->GetItemSurrogates(nAttrib)) + { + 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 e0eb8d46bd28..c9aa5d936a92 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> @@ -186,17 +186,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) - { - for (const SfxPoolItem* pItem : pPool->GetItemSurrogates(nAttrib)) - { - 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 a7641c9d06fd..00dbe4a44b3f 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> @@ -2018,17 +2018,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) - { - for (const SfxPoolItem* pItem : rPool.GetItemSurrogates(nAttrib)) - { - 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; }
