diff options
author | Noel Grandin <noel.grandin@collabora.co.uk> | 2024-09-19 13:03:39 +0200 |
---|---|---|
committer | Noel Grandin <noel.grandin@collabora.co.uk> | 2024-09-23 14:34:07 +0200 |
commit | 9ceb4141ec291129dfbf0c1a220c9c498bc50585 (patch) | |
tree | 9a369c5d03ce6622200b8b4e2d2ec6c6ea5127b5 /sw/source | |
parent | 1acd37a671b9d3633a7d31a0b60478815fbc685f (diff) |
dont use GetItemSurrogates for gathering SvxFontItem
which is very expensive these days
Change-Id: I43e19c77eee024fd4875aa57d9c28d5c9e0ad465
Reviewed-on: https://gerrit.libreoffice.org/c/core/+/173650
Tested-by: Jenkins
Reviewed-by: Noel Grandin <noel.grandin@collabora.co.uk>
Diffstat (limited to 'sw/source')
-rw-r--r-- | sw/source/core/bastyp/init.cxx | 6 | ||||
-rw-r--r-- | sw/source/core/doc/doc.cxx | 45 | ||||
-rw-r--r-- | sw/source/filter/writer/writer.cxx | 27 | ||||
-rw-r--r-- | sw/source/filter/ww8/wrtw8sty.cxx | 19 | ||||
-rw-r--r-- | sw/source/filter/xml/xmlfonte.cxx | 23 |
5 files changed, 89 insertions, 31 deletions
diff --git a/sw/source/core/bastyp/init.cxx b/sw/source/core/bastyp/init.cxx index 487484512141..9dbf4043d88f 100644 --- a/sw/source/core/bastyp/init.cxx +++ b/sw/source/core/bastyp/init.cxx @@ -283,7 +283,7 @@ ItemInfoPackage& getItemInfoPackageSwAttributes() { RES_CHRATR_CONTOUR, new SvxContourItem( false, RES_CHRATR_CONTOUR ), SID_ATTR_CHAR_CONTOUR, SFX_ITEMINFOFLAG_NONE }, { RES_CHRATR_CROSSEDOUT, new SvxCrossedOutItem( STRIKEOUT_NONE, RES_CHRATR_CROSSEDOUT ), SID_ATTR_CHAR_STRIKEOUT, SFX_ITEMINFOFLAG_NONE }, { RES_CHRATR_ESCAPEMENT, new SvxEscapementItem( RES_CHRATR_ESCAPEMENT ), SID_ATTR_CHAR_ESCAPEMENT, SFX_ITEMINFOFLAG_NONE }, - { RES_CHRATR_FONT, nullptr, SID_ATTR_CHAR_FONT, SFX_ITEMINFOFLAG_SUPPORT_SURROGATE }, + { RES_CHRATR_FONT, nullptr, SID_ATTR_CHAR_FONT, SFX_ITEMINFOFLAG_NONE }, { RES_CHRATR_FONTSIZE, new SvxFontHeightItem( 240, 100, RES_CHRATR_FONTSIZE ), SID_ATTR_CHAR_FONTHEIGHT, SFX_ITEMINFOFLAG_NONE }, { RES_CHRATR_KERNING, new SvxKerningItem( 0, RES_CHRATR_KERNING ), SID_ATTR_CHAR_KERNING, SFX_ITEMINFOFLAG_NONE }, { RES_CHRATR_LANGUAGE, new SvxLanguageItem(LANGUAGE_DONTKNOW, RES_CHRATR_LANGUAGE ), SID_ATTR_CHAR_LANGUAGE, SFX_ITEMINFOFLAG_NONE }, @@ -300,14 +300,14 @@ ItemInfoPackage& getItemInfoPackageSwAttributes() { RES_CHRATR_BACKGROUND, new SvxBrushItem( RES_CHRATR_BACKGROUND ), SID_ATTR_BRUSH_CHAR, SFX_ITEMINFOFLAG_NONE }, // CJK-Attributes - { RES_CHRATR_CJK_FONT, nullptr, SID_ATTR_CHAR_CJK_FONT, SFX_ITEMINFOFLAG_SUPPORT_SURROGATE }, + { RES_CHRATR_CJK_FONT, nullptr, SID_ATTR_CHAR_CJK_FONT, SFX_ITEMINFOFLAG_NONE }, { RES_CHRATR_CJK_FONTSIZE, new SvxFontHeightItem( 240, 100, RES_CHRATR_CJK_FONTSIZE ), SID_ATTR_CHAR_CJK_FONTHEIGHT, SFX_ITEMINFOFLAG_NONE }, { RES_CHRATR_CJK_LANGUAGE, new SvxLanguageItem(LANGUAGE_DONTKNOW, RES_CHRATR_CJK_LANGUAGE), SID_ATTR_CHAR_CJK_LANGUAGE, SFX_ITEMINFOFLAG_NONE }, { RES_CHRATR_CJK_POSTURE, new SvxPostureItem(ITALIC_NONE, RES_CHRATR_CJK_POSTURE ), SID_ATTR_CHAR_CJK_POSTURE, SFX_ITEMINFOFLAG_NONE }, { RES_CHRATR_CJK_WEIGHT, new SvxWeightItem( WEIGHT_NORMAL, RES_CHRATR_CJK_WEIGHT ), SID_ATTR_CHAR_CJK_WEIGHT, SFX_ITEMINFOFLAG_NONE }, // CTL-Attributes - { RES_CHRATR_CTL_FONT, nullptr, SID_ATTR_CHAR_CTL_FONT, SFX_ITEMINFOFLAG_SUPPORT_SURROGATE }, + { RES_CHRATR_CTL_FONT, nullptr, SID_ATTR_CHAR_CTL_FONT, SFX_ITEMINFOFLAG_NONE }, { RES_CHRATR_CTL_FONTSIZE, new SvxFontHeightItem( 240, 100, RES_CHRATR_CTL_FONTSIZE ), SID_ATTR_CHAR_CTL_FONTHEIGHT, SFX_ITEMINFOFLAG_NONE }, { RES_CHRATR_CTL_LANGUAGE, new SvxLanguageItem(LANGUAGE_DONTKNOW, RES_CHRATR_CTL_LANGUAGE), SID_ATTR_CHAR_CTL_LANGUAGE, SFX_ITEMINFOFLAG_NONE }, { RES_CHRATR_CTL_POSTURE, new SvxPostureItem(ITALIC_NONE, RES_CHRATR_CTL_POSTURE ), SID_ATTR_CHAR_CTL_POSTURE, SFX_ITEMINFOFLAG_NONE }, diff --git a/sw/source/core/doc/doc.cxx b/sw/source/core/doc/doc.cxx index 15e6a1bf29fe..f9ab83b6522f 100644 --- a/sw/source/core/doc/doc.cxx +++ b/sw/source/core/doc/doc.cxx @@ -54,6 +54,7 @@ #include <editeng/udlnitem.hxx> #include <editeng/colritem.hxx> #include <editeng/xmlcnitm.hxx> +#include <editeng/fontitem.hxx> #include <unotools/localedatawrapper.hxx> #include <officecfg/Office/Writer.hxx> @@ -1521,6 +1522,50 @@ void SwDoc::ForEachTxtAtrContainerItem(const std::function<bool(const SvXMLAttrC } } +/// Iterate over all RES_CHRATR_FONT/RES_CHRATR_CJK_FONT/RES_CHRATR_CTL_FONT SvxFontItem, if the function returns false, iteration is stopped +void SwDoc::ForEachCharacterFontItem(TypedWhichId<SvxFontItem> nWhich, bool bIgnoreAutoStyles, const std::function<bool(const SvxFontItem&)>& rFunc ) +{ + assert(nWhich == RES_CHRATR_FONT || nWhich == RES_CHRATR_CJK_FONT || nWhich == RES_CHRATR_CTL_FONT); + for(const SwCharFormat* pFormat : *GetCharFormats()) + { + const SwAttrSet& rAttrSet = pFormat->GetAttrSet(); + if (const SvxFontItem* pItem = rAttrSet.GetItemIfSet(nWhich)) + if (!rFunc(*pItem)) + return; + } + for(const SwTextFormatColl* pFormat : *GetTextFormatColls()) + { + const SwAttrSet& rAttrSet = pFormat->GetAttrSet(); + if (const SvxFontItem* pItem = rAttrSet.GetItemIfSet(nWhich)) + if (!rFunc(*pItem)) + return; + } + SwNodeOffset nCount = GetNodes().Count(); + for (SwNodeOffset i(0); i < nCount; ++i) + { + const SwNode* pNode = GetNodes()[i]; + if (pNode->IsContentNode()) + { + const SwContentNode* pTextNode = pNode->GetContentNode(); + if (pTextNode->HasSwAttrSet()) + if (const SvxFontItem* pItem = pTextNode->GetSwAttrSet().GetItemIfSet(nWhich)) + if (!rFunc(*pItem)) + return; + } + } + // ignore auto styles when called from the code that is constructing the auto style pool + if (!bIgnoreAutoStyles) + { + // auto styles + std::vector<std::shared_ptr<SfxItemSet>> aStyles; + GetIStyleAccess().getAllStyles(aStyles, IStyleAccess::AUTO_STYLE_CHAR); + for (const auto & rxItemSet : aStyles) + if (const SvxFontItem* pItem = rxItemSet->GetItemIfSet(nWhich)) + if (!rFunc(*pItem)) + return; + } +} + /// Iterate over all RES_PARATR_TABSTOP SvXMLAttrContainerItem, if the function returns false, iteration is stopped void SwDoc::ForEachParaAtrTabStopItem(const std::function<bool(const SvxTabStopItem&)>& rFunc ) const { diff --git a/sw/source/filter/writer/writer.cxx b/sw/source/filter/writer/writer.cxx index 9febf054e0d7..0576663965c9 100644 --- a/sw/source/filter/writer/writer.cxx +++ b/sw/source/filter/writer/writer.cxx @@ -360,19 +360,32 @@ void Writer::PutEditEngFontsInAttrPool() } } -void Writer::AddFontItems_( SfxItemPool& rPool, sal_uInt16 nW ) +void Writer::AddFontItems_( SfxItemPool& rPool, TypedWhichId<SvxFontItem> nWhich ) { - const SvxFontItem* pFont = static_cast<const SvxFontItem*>(&rPool.GetUserOrPoolDefaultItem( nW )); + const SvxFontItem* pFont = &rPool.GetUserOrPoolDefaultItem( nWhich ); AddFontItem( rPool, *pFont ); - pFont = static_cast<const SvxFontItem*>(rPool.GetUserDefaultItem( nW )); + pFont = rPool.GetUserDefaultItem( nWhich ); if( nullptr != pFont ) AddFontItem( rPool, *pFont ); - ItemSurrogates aSurrogates; - rPool.GetItemSurrogates(aSurrogates, nW); - for (const SfxPoolItem* pItem : aSurrogates) - AddFontItem( rPool, *static_cast<const SvxFontItem*>(pItem) ); + if (nWhich == RES_CHRATR_FONT || nWhich == RES_CHRATR_CJK_FONT || nWhich == RES_CHRATR_CTL_FONT) + { + m_pDoc->ForEachCharacterFontItem(nWhich, /*bIgnoreAutoStyles*/false, + [this, &rPool] (const SvxFontItem& rFontItem) -> bool + { + AddFontItem( rPool, rFontItem ); + return true; + }); + } + else + { + // nWhich is one of EE_CHAR_FONTINFO / EE_CHAR_FONTINFO_CJK / rPool, EE_CHAR_FONTINFO_CTL + ItemSurrogates aSurrogates; + rPool.GetItemSurrogates(aSurrogates, nWhich); + for (const SfxPoolItem* pItem : aSurrogates) + AddFontItem( rPool, *static_cast<const SvxFontItem*>(pItem) ); + } } void Writer::AddFontItem( SfxItemPool& rPool, const SvxFontItem& rFont ) diff --git a/sw/source/filter/ww8/wrtw8sty.cxx b/sw/source/filter/ww8/wrtw8sty.cxx index 39ab72c1fbc3..ff7d30bd84dc 100644 --- a/sw/source/filter/ww8/wrtw8sty.cxx +++ b/sw/source/filter/ww8/wrtw8sty.cxx @@ -944,17 +944,16 @@ void wwFontHelper::InitFontTable(const SwDoc& rDoc) if (!m_bLoadAllFonts) return; - const sal_uInt16 aTypes[] = { RES_CHRATR_FONT, RES_CHRATR_CJK_FONT, RES_CHRATR_CTL_FONT, 0 }; - for (const sal_uInt16* pId = aTypes; *pId; ++pId) + const TypedWhichId<SvxFontItem> aTypes[] { RES_CHRATR_FONT, RES_CHRATR_CJK_FONT, RES_CHRATR_CTL_FONT }; + for (const TypedWhichId<SvxFontItem> & pId : aTypes) { - ItemSurrogates aSurrogates; - rPool.GetItemSurrogates(aSurrogates, *pId); - for (const SfxPoolItem* pItem : aSurrogates) - { - pFont = static_cast<const SvxFontItem*>(pItem); - GetId(wwFont(pFont->GetFamilyName(), pFont->GetPitch(), - pFont->GetFamily(), pFont->GetCharSet())); - } + const_cast<SwDoc&>(rDoc).ForEachCharacterFontItem(pId, /*bIgnoreAutoStyles*/false, + [this] (const SvxFontItem& rFontItem) -> bool + { + GetId(wwFont(rFontItem.GetFamilyName(), rFontItem.GetPitch(), + rFontItem.GetFamily(), rFontItem.GetCharSet())); + return true; + }); } } diff --git a/sw/source/filter/xml/xmlfonte.cxx b/sw/source/filter/xml/xmlfonte.cxx index 8566a1a69497..d634bbbd5d8b 100644 --- a/sw/source/filter/xml/xmlfonte.cxx +++ b/sw/source/filter/xml/xmlfonte.cxx @@ -21,6 +21,9 @@ #include <xmloff/XMLFontAutoStylePool.hxx> #include <editeng/fontitem.hxx> #include <doc.hxx> +#include <docsh.hxx> +#include <ndtxt.hxx> +#include <txatbase.hxx> #include "xmlexp.hxx" #include "xmlimp.hxx" #include <IDocumentSettingAccess.hxx> @@ -56,23 +59,21 @@ sal_Int32 CompareTo(sal_Int32 nA, sal_Int32 nB) SwXMLFontAutoStylePool_Impl::SwXMLFontAutoStylePool_Impl(SwXMLExport& _rExport, bool bFontEmbedding) : XMLFontAutoStylePool(_rExport, bFontEmbedding) { - sal_uInt16 const aWhichIds[3] = { RES_CHRATR_FONT, RES_CHRATR_CJK_FONT, + TypedWhichId<SvxFontItem> const aWhichIds[3] = { RES_CHRATR_FONT, RES_CHRATR_CJK_FONT, RES_CHRATR_CTL_FONT }; const SfxItemPool& rPool = _rExport.getDoc()->GetAttrPool(); std::vector<const SvxFontItem *> aFonts; - for(sal_uInt16 nWhichId : aWhichIds) + for(const TypedWhichId<SvxFontItem> & nWhichId : aWhichIds) { - const SvxFontItem& rFont = - static_cast<const SvxFontItem&>(rPool.GetUserOrPoolDefaultItem( nWhichId )); + const SvxFontItem& rFont = rPool.GetUserOrPoolDefaultItem( nWhichId ); aFonts.push_back(&rFont); - ItemSurrogates aSurrogates; - rPool.GetItemSurrogates(aSurrogates, nWhichId); - for (const SfxPoolItem* pItem : aSurrogates) - { - auto pFont = static_cast<const SvxFontItem *>(pItem); - aFonts.push_back(pFont); - } + _rExport.getDoc()->ForEachCharacterFontItem(nWhichId, /*bIgnoreAutoStyles*/true, + [&aFonts] (const SvxFontItem& rFontItem) -> bool + { + aFonts.push_back(&rFontItem); + return true; + }); } std::sort(aFonts.begin(), aFonts.end(), |